cabloy 5.1.136 → 5.1.138

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 (617) hide show
  1. package/.cabloy-version +1 -1
  2. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +13 -0
  3. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +11 -0
  4. package/.claude/skills/cabloy-contract-loop/SKILL.md +17 -0
  5. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +35 -0
  6. package/.claude/skills/cabloy-frontend-scaffold/evals/evals.json +1 -1
  7. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +4 -0
  8. package/.claude/skills/cabloy-zova-source-reading/SKILL.md +21 -0
  9. package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +26 -0
  10. package/CHANGELOG.md +31 -0
  11. package/CLAUDE.md +5 -1
  12. package/cabloy-docs/.vitepress/config.mjs +1 -0
  13. package/cabloy-docs/.vitepress/theme/custom.css +124 -0
  14. package/cabloy-docs/backend/auth-guide.md +8 -0
  15. package/cabloy-docs/backend/config-guide.md +2 -0
  16. package/cabloy-docs/backend/controller-aop-guide.md +8 -0
  17. package/cabloy-docs/backend/controller-guide.md +33 -0
  18. package/cabloy-docs/backend/event-guide.md +3 -3
  19. package/cabloy-docs/backend/mail-guide.md +1 -1
  20. package/cabloy-docs/backend/markdown-guide.md +1 -1
  21. package/cabloy-docs/backend/runtime-and-flavors.md +29 -0
  22. package/cabloy-docs/backend/user-access-guide.md +2 -2
  23. package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/cover-en-v1.png +0 -0
  24. package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/index.md +177 -0
  25. package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/cover-en-v1.png +0 -0
  26. package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/index.md +430 -0
  27. package/cabloy-docs/blogs/index.md +69 -0
  28. package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/cover-en-v1.png +0 -0
  29. package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/index.md +195 -0
  30. package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/cover-en-v1.png +0 -0
  31. package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/index.md +483 -0
  32. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +13 -0
  33. package/cabloy-docs/frontend/api-schema-guide.md +79 -0
  34. package/cabloy-docs/frontend/environment-config-guide.md +2 -0
  35. package/cabloy-docs/frontend/form-guide.md +37 -0
  36. package/cabloy-docs/frontend/markdown-guide.md +3 -0
  37. package/cabloy-docs/frontend/model-resource-owner-pattern.md +26 -1
  38. package/cabloy-docs/frontend/module-scope.md +24 -0
  39. package/cabloy-docs/frontend/modules-and-suites.md +23 -1
  40. package/cabloy-docs/frontend/navigation-guards-guide.md +2 -0
  41. package/cabloy-docs/frontend/page-params-guide.md +2 -0
  42. package/cabloy-docs/frontend/page-route-guide.md +10 -3
  43. package/cabloy-docs/frontend/route-alias-guide.md +12 -6
  44. package/cabloy-docs/frontend/ssr-env.md +15 -6
  45. package/cabloy-docs/frontend/ssr-overview.md +10 -0
  46. package/cabloy-docs/frontend/ssr-review-checklist.md +1 -0
  47. package/cabloy-docs/frontend/zova-form-under-the-hood.md +6 -0
  48. package/cabloy-docs/frontend/zova-router-under-the-hood.md +4 -5
  49. package/cabloy-docs/fullstack/a-pay-payment-suite.md +1 -1
  50. package/cabloy-docs/fullstack/deploy-cloudflare-docker.md +14 -8
  51. package/e2e/specs/a-commerce/commerce.spec.ts +17 -2
  52. package/e2e/specs/cabloy-basic/account.spec.ts +519 -0
  53. package/e2e/specs/cabloy-basic/basic.spec.ts +15 -3
  54. package/package.json +1 -1
  55. package/vona/env/.env +2 -0
  56. package/vona/packages-cli/cli/package.json +1 -1
  57. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/boilerplate/src/controller/{{resourceName}}.ts_ +14 -11
  58. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/3-en-us.ts +11 -1
  59. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/4-zh-cn.ts +11 -1
  60. package/vona/packages-cli/cli-set-api/package.json +1 -1
  61. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.metadata.ts +1 -0
  62. package/vona/packages-cli/cli-set-api/src/lib/bean/toolsMetadata/generateOnions.ts +4 -3
  63. package/vona/packages-vona/vona/package.json +1 -1
  64. package/vona/pnpm-lock.yaml +237 -66
  65. package/vona/pnpm-workspace.yaml +1 -1
  66. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +33 -37
  67. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +3 -0
  68. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +3 -0
  69. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +17 -2
  70. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +12 -2
  71. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +52 -4
  72. package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +34 -36
  73. package/vona/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +29 -33
  74. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +34 -37
  75. package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/index.ts +8 -9
  76. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +33 -35
  77. package/vona/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +11 -11
  78. package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +45 -42
  79. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +4 -0
  80. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +6 -1
  81. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +4 -0
  82. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +6 -1
  83. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockSkuRef.tsx +16 -0
  84. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockAudit.tsx +17 -2
  85. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockBalance.tsx +17 -2
  86. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +31 -2
  87. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +31 -2
  88. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockPresentation.test.ts +116 -4
  89. package/vona/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -11
  90. package/vona/src/suite/a-home/modules/home-base/src/.metadata/index.ts +0 -3
  91. package/vona/src/suite/a-home/modules/home-index/src/.metadata/index.ts +12 -13
  92. package/vona/src/suite/a-home/modules/home-user/package.json +9 -1
  93. package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +333 -78
  94. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activation.ts +21 -0
  95. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activationCurrent.ts +15 -0
  96. package/vona/src/{suite-vendor/a-vona/modules/a-mailconfirm → suite/a-home/modules/home-user}/src/bean/cacheRedis.passwordReset.ts +6 -2
  97. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetCurrent.ts +15 -0
  98. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetRecipient.ts +13 -0
  99. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSet.ts +22 -0
  100. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSetCurrent.ts +15 -0
  101. package/vona/src/suite/a-home/modules/home-user/src/bean/imageScene.homeUserAvatar.ts +18 -0
  102. package/vona/src/suite/a-home/modules/home-user/src/bean/meta.redlock.ts +18 -0
  103. package/vona/src/suite/a-home/modules/home-user/src/bean/meta.version.ts +0 -1
  104. package/vona/src/suite/a-home/modules/home-user/src/bean/zodRefine.passwordConfirm.ts +8 -4
  105. package/vona/src/suite/a-home/modules/home-user/src/config/config.ts +10 -1
  106. package/vona/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +35 -3
  107. package/vona/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +35 -3
  108. package/vona/src/suite/a-home/modules/home-user/src/controller/account.ts +147 -0
  109. package/vona/src/suite/a-home/modules/home-user/src/controller/passport.ts +27 -7
  110. package/vona/src/suite/a-home/modules/home-user/src/dto/accountActivation.ts +12 -0
  111. package/vona/src/suite/a-home/modules/home-user/src/dto/accountCurrent.ts +31 -0
  112. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordChange.ts +41 -0
  113. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordReset.ts +35 -0
  114. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequest.ts +20 -0
  115. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequestResult.ts +13 -0
  116. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSet.ts +35 -0
  117. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSetIssue.ts +15 -0
  118. package/vona/src/suite/a-home/modules/home-user/src/dto/accountProfileUpdate.ts +53 -0
  119. package/vona/src/suite/a-home/modules/home-user/src/dto/accountRelogin.ts +12 -0
  120. package/vona/src/suite/a-home/modules/home-user/src/dto/passport.ts +2 -2
  121. package/vona/src/suite/a-home/modules/home-user/src/dto/passportUser.ts +43 -0
  122. package/vona/src/suite/a-home/modules/home-user/src/dto/register.ts +40 -5
  123. package/vona/src/suite/a-home/modules/home-user/src/service/account.ts +693 -0
  124. package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +249 -0
  125. package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +344 -0
  126. package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +158 -0
  127. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +724 -0
  128. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +799 -0
  129. package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +73 -65
  130. package/vona/src/suite/a-training/modules/training-recordsubject/src/.metadata/index.ts +26 -17
  131. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +47 -39
  132. package/vona/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +22 -23
  133. package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/.metadata/index.ts +15 -15
  134. package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/.metadata/index.ts +11 -11
  135. package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
  136. package/vona/src/suite-vendor/a-auth/modules/a-auth/src/.metadata/index.ts +55 -41
  137. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/package.json +1 -1
  138. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/src/.metadata/index.ts +8 -8
  139. package/vona/src/suite-vendor/a-auth/modules/auth-simple/package.json +4 -2
  140. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/.metadata/index.ts +51 -27
  141. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/bean/meta.redlock.ts +11 -0
  142. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/service/authSimple.ts +53 -2
  143. package/vona/src/suite-vendor/a-auth/modules/auth-simple/test/authSimple.test.ts +56 -0
  144. package/vona/src/suite-vendor/a-auth/package.json +2 -2
  145. package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/package.json +1 -1
  146. package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/src/.metadata/index.ts +4 -4
  147. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
  148. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/.metadata/index.ts +23 -24
  149. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/package.json +1 -1
  150. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/src/.metadata/index.ts +31 -22
  151. package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/package.json +13 -5
  152. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +147 -0
  153. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
  154. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacCatalog.ts +95 -0
  155. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacScope.ts +218 -0
  156. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.policyInvalidated.ts +17 -0
  157. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.resolvePolicy.ts +13 -0
  158. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/guard.rbac.ts +102 -0
  159. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/index.ts +5 -0
  160. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/config/config.ts +10 -0
  161. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +3 -0
  162. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/index.ts +1 -0
  163. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/rbac.ts +46 -0
  164. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/index.ts +2 -0
  165. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/rbac.ts +46 -0
  166. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/scope.ts +27 -0
  167. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +445 -0
  168. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacScopeCurrent.test.ts +172 -0
  169. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/package.json +1 -1
  170. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/src/.metadata/index.ts +27 -31
  171. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  172. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +37 -45
  173. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/package.json +1 -1
  174. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/src/.metadata/index.ts +12 -12
  175. package/vona/src/suite-vendor/a-cabloy/modules/a-status/package.json +1 -1
  176. package/vona/src/suite-vendor/a-cabloy/modules/a-status/src/.metadata/index.ts +27 -19
  177. package/vona/src/suite-vendor/a-cabloy/package.json +2 -1
  178. package/vona/src/suite-vendor/a-cabloy/tsconfig.json +3 -0
  179. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
  180. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/.metadata/index.ts +27 -29
  181. package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/package.json +1 -1
  182. package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/src/.metadata/index.ts +16 -17
  183. package/vona/src/suite-vendor/a-captcha/package.json +1 -1
  184. package/vona/src/suite-vendor/a-file/modules/a-file/package.json +1 -1
  185. package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +56 -38
  186. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/package.json +1 -1
  187. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/src/.metadata/index.ts +12 -13
  188. package/vona/src/suite-vendor/a-file/modules/file-native/package.json +1 -1
  189. package/vona/src/suite-vendor/a-file/modules/file-native/src/.metadata/index.ts +11 -12
  190. package/vona/src/suite-vendor/a-file/package.json +4 -4
  191. package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
  192. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +56 -38
  193. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
  194. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +12 -13
  195. package/vona/src/suite-vendor/a-image/modules/image-native/package.json +1 -1
  196. package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/index.ts +11 -12
  197. package/vona/src/suite-vendor/a-image/package.json +1 -1
  198. package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  199. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +0 -8
  200. package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  201. package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +21 -22
  202. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  203. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +8 -8
  204. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  205. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +8 -8
  206. package/vona/src/suite-vendor/a-pay/package.json +5 -5
  207. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/package.json +1 -1
  208. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/src/.metadata/index.ts +46 -40
  209. package/vona/src/suite-vendor/a-paypal/package.json +1 -1
  210. package/vona/src/suite-vendor/a-vona/modules/a-aspect/cli/guard/boilerplate/{{sceneName}}.{{beanName}}.ts_ +6 -8
  211. package/vona/src/suite-vendor/a-vona/modules/a-aspect/package.json +1 -1
  212. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/.metadata/index.ts +8 -16
  213. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/guardBase.ts +22 -0
  214. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/index.ts +1 -0
  215. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/types/guard.ts +4 -1
  216. package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/package.json +1 -1
  217. package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/src/.metadata/index.ts +8 -10
  218. package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
  219. package/vona/src/suite-vendor/a-vona/modules/a-bean/src/.metadata/index.ts +4 -4
  220. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/package.json +1 -1
  221. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/src/.metadata/index.ts +17 -19
  222. package/vona/src/suite-vendor/a-vona/modules/a-body/package.json +1 -1
  223. package/vona/src/suite-vendor/a-vona/modules/a-body/src/.metadata/index.ts +12 -12
  224. package/vona/src/suite-vendor/a-vona/modules/a-body/src/bean/interceptor.bodyReq.ts +1 -1
  225. package/vona/src/suite-vendor/a-vona/modules/a-body/src/types/bodyParser.ts +1 -1
  226. package/vona/src/suite-vendor/a-vona/modules/a-broadcast/package.json +1 -1
  227. package/vona/src/suite-vendor/a-vona/modules/a-broadcast/src/.metadata/index.ts +8 -9
  228. package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
  229. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +14 -14
  230. package/vona/src/suite-vendor/a-vona/modules/a-caching/package.json +1 -1
  231. package/vona/src/suite-vendor/a-vona/modules/a-caching/src/.metadata/index.ts +8 -8
  232. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  233. package/vona/src/suite-vendor/a-vona/modules/a-core/src/.metadata/index.ts +20 -22
  234. package/vona/src/suite-vendor/a-vona/modules/a-election/package.json +1 -1
  235. package/vona/src/suite-vendor/a-vona/modules/a-election/src/.metadata/index.ts +15 -16
  236. package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
  237. package/vona/src/suite-vendor/a-vona/modules/a-error/src/.metadata/index.ts +19 -21
  238. package/vona/src/suite-vendor/a-vona/modules/a-event/package.json +1 -1
  239. package/vona/src/suite-vendor/a-vona/modules/a-event/src/.metadata/index.ts +16 -18
  240. package/vona/src/suite-vendor/a-vona/modules/a-executor/package.json +1 -1
  241. package/vona/src/suite-vendor/a-vona/modules/a-executor/src/.metadata/index.ts +12 -13
  242. package/vona/src/suite-vendor/a-vona/modules/a-hmr/package.json +1 -1
  243. package/vona/src/suite-vendor/a-vona/modules/a-hmr/src/.metadata/index.ts +24 -28
  244. package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/package.json +1 -1
  245. package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/src/.metadata/index.ts +4 -4
  246. package/vona/src/suite-vendor/a-vona/modules/a-index/package.json +1 -1
  247. package/vona/src/suite-vendor/a-vona/modules/a-index/src/.metadata/index.ts +11 -13
  248. package/vona/src/suite-vendor/a-vona/modules/a-instance/package.json +1 -1
  249. package/vona/src/suite-vendor/a-vona/modules/a-instance/src/.metadata/index.ts +42 -35
  250. package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
  251. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/.metadata/index.ts +15 -17
  252. package/vona/src/suite-vendor/a-vona/modules/a-locale/package.json +1 -1
  253. package/vona/src/suite-vendor/a-vona/modules/a-locale/src/.metadata/index.ts +3 -3
  254. package/vona/src/suite-vendor/a-vona/modules/a-locale/src/main.ts +4 -1
  255. package/vona/src/suite-vendor/a-vona/modules/a-logger/package.json +1 -1
  256. package/vona/src/suite-vendor/a-vona/modules/a-logger/src/.metadata/index.ts +20 -20
  257. package/vona/src/suite-vendor/a-vona/modules/a-mail/package.json +3 -3
  258. package/vona/src/suite-vendor/a-vona/modules/a-mail/src/.metadata/index.ts +38 -30
  259. package/vona/src/suite-vendor/a-vona/modules/a-mail/src/types/config.ts +1 -0
  260. package/vona/src/suite-vendor/a-vona/modules/a-menu/package.json +1 -1
  261. package/vona/src/suite-vendor/a-vona/modules/a-menu/src/.metadata/index.ts +8 -8
  262. package/vona/src/suite-vendor/a-vona/modules/a-meta/package.json +1 -1
  263. package/vona/src/suite-vendor/a-vona/modules/a-meta/src/.metadata/index.ts +4 -4
  264. package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
  265. package/vona/src/suite-vendor/a-vona/modules/a-metrics/src/.metadata/index.ts +15 -18
  266. package/vona/src/suite-vendor/a-vona/modules/a-onion/package.json +1 -1
  267. package/vona/src/suite-vendor/a-vona/modules/a-onion/src/.metadata/index.ts +11 -11
  268. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  269. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/.metadata/index.ts +15 -16
  270. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/decorator.ts +2 -1
  271. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +24 -1
  272. package/vona/src/suite-vendor/a-vona/modules/a-openapischema/package.json +1 -1
  273. package/vona/src/suite-vendor/a-vona/modules/a-openapischema/src/.metadata/index.ts +17 -17
  274. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
  275. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/.metadata/index.ts +3 -3
  276. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  277. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/.metadata/index.ts +34 -39
  278. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_view.ts +10 -6
  279. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/columns_.ts +1 -2
  280. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/databaseDialectBase_.ts +37 -1
  281. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +8 -2
  282. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +5 -8
  283. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/columns.ts +1 -0
  284. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +1 -1
  285. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/.metadata/index.ts +8 -8
  286. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +28 -0
  287. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
  288. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/.metadata/index.ts +4 -4
  289. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +4 -1
  290. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/.metadata/index.ts +35 -22
  291. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +61 -8
  292. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/event.retrievePermissionAction.ts +2 -2
  293. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permissionActionByUser.ts +24 -0
  294. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/dto/permissions.tsx +18 -1
  295. package/vona/src/suite-vendor/a-vona/modules/a-permission/test/permission.test.ts +340 -0
  296. package/vona/src/suite-vendor/a-vona/modules/a-play/package.json +1 -1
  297. package/vona/src/suite-vendor/a-vona/modules/a-play/src/.metadata/index.ts +13 -13
  298. package/vona/src/suite-vendor/a-vona/modules/a-printtip/package.json +1 -1
  299. package/vona/src/suite-vendor/a-vona/modules/a-printtip/src/.metadata/index.ts +11 -12
  300. package/vona/src/suite-vendor/a-vona/modules/a-queue/package.json +1 -1
  301. package/vona/src/suite-vendor/a-vona/modules/a-queue/src/.metadata/index.ts +15 -17
  302. package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/package.json +1 -1
  303. package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/src/.metadata/index.ts +0 -1
  304. package/vona/src/suite-vendor/a-vona/modules/a-redis/package.json +1 -1
  305. package/vona/src/suite-vendor/a-vona/modules/a-redis/src/.metadata/index.ts +12 -13
  306. package/vona/src/suite-vendor/a-vona/modules/a-redlock/package.json +1 -1
  307. package/vona/src/suite-vendor/a-vona/modules/a-redlock/src/.metadata/index.ts +7 -8
  308. package/vona/src/suite-vendor/a-vona/modules/a-retryable/package.json +1 -1
  309. package/vona/src/suite-vendor/a-vona/modules/a-retryable/src/.metadata/index.ts +8 -8
  310. package/vona/src/suite-vendor/a-vona/modules/a-runtime/package.json +1 -1
  311. package/vona/src/suite-vendor/a-vona/modules/a-runtime/src/.metadata/index.ts +12 -13
  312. package/vona/src/suite-vendor/a-vona/modules/a-schedule/package.json +1 -1
  313. package/vona/src/suite-vendor/a-vona/modules/a-schedule/src/.metadata/index.ts +23 -26
  314. package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
  315. package/vona/src/suite-vendor/a-vona/modules/a-security/src/.metadata/index.ts +12 -12
  316. package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/bean.security.ts +78 -0
  317. package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/middlewareSystem.cors.ts +4 -2
  318. package/vona/src/suite-vendor/a-vona/modules/a-security/src/index.ts +1 -0
  319. package/vona/src/suite-vendor/a-vona/modules/a-security/src/types/index.ts +7 -0
  320. package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +178 -0
  321. package/vona/src/suite-vendor/a-vona/modules/a-serialization/package.json +1 -1
  322. package/vona/src/suite-vendor/a-vona/modules/a-serialization/src/.metadata/index.ts +16 -16
  323. package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
  324. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/.metadata/index.ts +19 -22
  325. package/vona/src/suite-vendor/a-vona/modules/a-static/package.json +1 -1
  326. package/vona/src/suite-vendor/a-vona/modules/a-static/src/.metadata/index.ts +13 -14
  327. package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
  328. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +10 -10
  329. package/vona/src/suite-vendor/a-vona/modules/a-swagger/package.json +1 -1
  330. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/.metadata/index.ts +16 -17
  331. package/vona/src/suite-vendor/a-vona/modules/a-telemetry/package.json +1 -1
  332. package/vona/src/suite-vendor/a-vona/modules/a-telemetry/src/.metadata/index.ts +15 -16
  333. package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +1 -1
  334. package/vona/src/suite-vendor/a-vona/modules/a-upload/src/.metadata/index.ts +8 -8
  335. package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
  336. package/vona/src/suite-vendor/a-vona/modules/a-user/src/.metadata/index.ts +26 -35
  337. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.passport.ts +4 -2
  338. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.roleName.ts +5 -23
  339. package/vona/src/suite-vendor/a-vona/modules/a-user/src/lib/passport.ts +17 -2
  340. package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
  341. package/vona/src/suite-vendor/a-vona/modules/a-validation/src/.metadata/index.ts +7 -7
  342. package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
  343. package/vona/src/suite-vendor/a-vona/modules/a-version/src/.metadata/index.ts +62 -37
  344. package/vona/src/suite-vendor/a-vona/modules/a-vona/package.json +1 -2
  345. package/vona/src/suite-vendor/a-vona/modules/a-vona/src/.metadata/index.ts +4 -4
  346. package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
  347. package/vona/src/suite-vendor/a-vona/modules/a-web/src/.metadata/index.ts +27 -30
  348. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/arguments.ts +5 -0
  349. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/pipesArgument.ts +3 -1
  350. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/middleware/extractValue.ts +5 -0
  351. package/vona/src/suite-vendor/a-vona/modules/a-web/src/types/controller.ts +3 -0
  352. package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
  353. package/vona/src/suite-vendor/a-vona/modules/a-worker/src/.metadata/index.ts +15 -15
  354. package/vona/src/suite-vendor/a-vona/modules/a-zod/package.json +1 -1
  355. package/vona/src/suite-vendor/a-vona/modules/a-zod/src/.metadata/index.ts +4 -4
  356. package/vona/src/suite-vendor/a-vona/package.json +2 -3
  357. package/vona/src/suite-vendor/a-vona/tsconfig.json +0 -3
  358. package/zova/env/.env.admin +1 -0
  359. package/zova/env/.env.ssr.web +0 -1
  360. package/zova/env/.env.web +1 -0
  361. package/zova/package.original.json +1 -1
  362. package/zova/packages-cli/cli/package.json +2 -2
  363. package/zova/packages-cli/cli-set-front/package.json +1 -1
  364. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +15 -4
  365. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.tools.metadata.ts +1 -0
  366. package/zova/packages-utils/zova-jsx/package.json +2 -2
  367. package/zova/packages-zova/zova/package.json +3 -3
  368. package/zova/packages-zova/zova-core/package.json +1 -1
  369. package/zova/packages-zova/zova-core/src/core/component/locale.ts +10 -3
  370. package/zova/packages-zova/zova-core/src/core/sys/util.ts +6 -0
  371. package/zova/pnpm-lock.yaml +94 -25
  372. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +21 -21
  373. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/schemas.ts +92 -46
  374. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/types.ts +834 -499
  375. package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +22 -22
  376. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +104 -50
  377. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +1202 -667
  378. package/zova/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +5 -5
  379. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +18 -18
  380. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +136 -62
  381. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +1564 -874
  382. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +24 -24
  383. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/schemas.ts +413 -59
  384. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/types.ts +6290 -1946
  385. package/zova/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +5 -5
  386. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +29 -29
  387. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +112 -58
  388. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +980 -721
  389. package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionRefund.tsx +1 -1
  390. package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionShip.tsx +1 -1
  391. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +1 -3
  392. package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +23 -23
  393. package/zova/src/suite/a-demo/modules/demo-todo/src/.metadata/index.ts +17 -17
  394. package/zova/src/suite/a-devui/modules/devui-adapter/src/.metadata/index.ts +10 -10
  395. package/zova/src/suite/a-home/modules/home-api/cli/openapi.config.ts +1 -0
  396. package/zova/src/suite/a-home/modules/home-api/mock/passport.fake.ts +1 -1
  397. package/zova/src/suite/a-home/modules/home-api/src/.metadata/index.ts +61 -31
  398. package/zova/src/suite/a-home/modules/home-api/src/api/homeUserAccount.ts +171 -0
  399. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/schemas.ts +96 -50
  400. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/types.ts +857 -504
  401. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeUserAccount.ts +62 -0
  402. package/zova/src/suite/a-home/modules/home-base/assets/img/avatar_user.png +0 -0
  403. package/zova/src/suite/a-home/modules/home-base/src/.metadata/index.ts +16 -16
  404. package/zova/src/suite/a-home/modules/home-base/src/config/config.ts +5 -0
  405. package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -8
  406. package/zova/src/suite/a-home/modules/home-icon/src/.metadata/index.ts +5 -5
  407. package/zova/src/suite/a-home/modules/home-indexadmin/src/.metadata/index.ts +11 -11
  408. package/zova/src/suite/a-home/modules/home-indexweb/src/.metadata/index.ts +9 -9
  409. package/zova/src/suite/a-home/modules/home-layoutadmin/src/.metadata/index.ts +19 -19
  410. package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.user.tsx +19 -2
  411. package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/en-us.ts +1 -0
  412. package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/zh-cn.ts +1 -0
  413. package/zova/src/suite/a-home/modules/home-layoutempty/src/.metadata/index.ts +7 -7
  414. package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/component/layoutWeb.ts +1 -0
  415. package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/index.ts +23 -15
  416. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -0
  417. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tsx +4 -0
  418. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.user.tsx +68 -0
  419. package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/en-us.ts +11 -8
  420. package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/zh-cn.ts +11 -8
  421. package/zova/src/suite/a-home/modules/home-login/src/.metadata/index.ts +38 -18
  422. package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/passwordResetRequest.ts +9 -0
  423. package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/register.ts +5 -0
  424. package/zova/src/suite/a-home/modules/home-login/src/config/locale/en-us.ts +14 -0
  425. package/zova/src/suite/a-home/modules/home-login/src/config/locale/zh-cn.ts +12 -0
  426. package/zova/src/suite/a-home/modules/home-login/src/page/login/controller.tsx +10 -0
  427. package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +14 -0
  428. package/zova/src/suite/a-home/modules/home-login/src/page/passwordResetRequest/controller.tsx +130 -0
  429. package/zova/src/suite/a-home/modules/home-login/src/page/register/controller.tsx +124 -0
  430. package/zova/src/suite/a-home/modules/home-login/src/routes.ts +20 -0
  431. package/zova/src/suite/a-home/modules/home-passport/src/.metadata/index.ts +8 -8
  432. package/zova/src/suite/a-home/modules/home-passport/src/lib/permissionActionMatcher.ts +37 -0
  433. package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +32 -12
  434. package/zova/src/suite/a-home/modules/home-passport/test/lib/permissionActionMatcher.test.ts +80 -0
  435. package/zova/src/suite/a-home/modules/home-theme/src/.metadata/index.ts +13 -13
  436. package/zova/src/suite/a-home/modules/home-user/package.json +60 -0
  437. package/zova/src/suite/a-home/modules/home-user/src/.metadata/index.ts +168 -0
  438. package/zova/src/suite/a-home/modules/home-user/src/.metadata/locales.ts +7 -0
  439. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/account.ts +5 -0
  440. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/activation.ts +16 -0
  441. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordReset.ts +16 -0
  442. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordSet.ts +16 -0
  443. package/zova/src/suite/a-home/modules/home-user/src/.metadata/this.ts +2 -0
  444. package/zova/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +52 -0
  445. package/zova/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +49 -0
  446. package/zova/src/suite/a-home/modules/home-user/src/index.ts +2 -0
  447. package/zova/src/suite/a-home/modules/home-user/src/model/account.ts +126 -0
  448. package/zova/src/suite/a-home/modules/home-user/src/page/account/controller.tsx +357 -0
  449. package/zova/src/suite/a-home/modules/home-user/src/page/activation/controller.tsx +83 -0
  450. package/zova/src/suite/a-home/modules/home-user/src/page/passwordReset/controller.tsx +138 -0
  451. package/zova/src/suite/a-home/modules/home-user/src/page/passwordSet/controller.tsx +138 -0
  452. package/zova/src/suite/a-home/modules/home-user/src/routes.ts +44 -0
  453. package/zova/src/suite/a-home/modules/home-user/tsconfig.build.json +13 -0
  454. package/zova/src/suite/a-home/modules/home-user/tsconfig.json +5 -0
  455. package/zova/src/suite/a-home/package.json +2 -1
  456. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +25 -25
  457. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +136 -62
  458. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +1601 -884
  459. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +1 -1
  460. package/zova/src/suite/cabloy-basic/modules/basic-adapter/src/.metadata/index.ts +4 -4
  461. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +12 -12
  462. package/zova/src/suite/cabloy-basic/modules/basic-captcha/src/.metadata/index.ts +8 -8
  463. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +9 -9
  464. package/zova/src/suite/cabloy-basic/modules/basic-commandssync/src/.metadata/index.ts +9 -9
  465. package/zova/src/suite/cabloy-basic/modules/basic-currency/src/.metadata/index.ts +13 -13
  466. package/zova/src/suite/cabloy-basic/modules/basic-date/src/.metadata/index.ts +13 -13
  467. package/zova/src/suite/cabloy-basic/modules/basic-details/src/.metadata/index.ts +21 -21
  468. package/zova/src/suite/cabloy-basic/modules/basic-file/src/.metadata/index.ts +26 -26
  469. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/schemas.ts +417 -59
  470. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/types.ts +6316 -1926
  471. package/zova/src/suite/cabloy-basic/modules/basic-form/src/.metadata/index.ts +12 -12
  472. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/component/imageUploader.ts +31 -0
  473. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/index.ts +39 -26
  474. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/schemas.ts +417 -59
  475. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/types.ts +6316 -1926
  476. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/formFieldImage/controller.tsx +194 -514
  477. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/imageUploader/controller.tsx +386 -0
  478. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/en-us.ts +1 -0
  479. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/zh-cn.ts +1 -0
  480. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/imageTransform.tsx +296 -0
  481. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/index.ts +1 -0
  482. package/zova/src/suite/cabloy-basic/modules/basic-input/src/.metadata/index.ts +9 -9
  483. package/zova/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +19 -19
  484. package/zova/src/suite/cabloy-basic/modules/basic-page/src/.metadata/index.ts +8 -8
  485. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts +8 -8
  486. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx +9 -2
  487. package/zova/src/suite/cabloy-basic/modules/basic-resource/src/.metadata/index.ts +13 -13
  488. package/zova/src/suite/cabloy-basic/modules/basic-select/src/.metadata/index.ts +13 -13
  489. package/zova/src/suite/cabloy-basic/modules/basic-select/src/bean/tableCell.select.tsx +2 -3
  490. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +2 -3
  491. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +7 -7
  492. package/zova/src/suite/cabloy-basic/modules/basic-select/src/lib/utils.ts +5 -0
  493. package/zova/src/suite/cabloy-basic/modules/basic-select/test/lib/utils.test.ts +28 -0
  494. package/zova/src/suite/cabloy-basic/modules/basic-table/src/.metadata/index.ts +16 -16
  495. package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx +3 -1
  496. package/zova/src/suite/cabloy-basic/modules/basic-text/src/.metadata/index.ts +13 -13
  497. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +52 -0
  498. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +26 -0
  499. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
  500. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +1 -0
  501. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.build.json +13 -0
  502. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.json +5 -0
  503. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
  504. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts +15 -15
  505. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/lib/deleteRequest.ts +12 -0
  506. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +12 -6
  507. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/lib/deleteRequest.test.ts +37 -0
  508. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/model/resource.types.ts +24 -0
  509. package/zova/src/suite-vendor/a-cabloy/package.json +3 -2
  510. package/zova/src/suite-vendor/a-pay/modules/a-pay/cli/openapi.config.ts +1 -1
  511. package/zova/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  512. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +43 -43
  513. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/schemas.ts +120 -58
  514. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/types.ts +1408 -938
  515. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/payPaymentSession.ts +74 -0
  516. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/payPaymentSession.ts +25 -0
  517. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/model/paymentSession.ts +3 -3
  518. package/zova/src/suite-vendor/a-pay/modules/pay-mock/cli/openapi.config.ts +1 -1
  519. package/zova/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  520. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +34 -34
  521. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/schemas.ts +140 -66
  522. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/types.ts +1621 -891
  523. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockMockPayment.ts +34 -0
  524. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockMockPayment.ts +13 -0
  525. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/model/payMockPayment.ts +3 -3
  526. package/zova/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  527. package/zova/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +4 -4
  528. package/zova/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  529. package/zova/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +4 -4
  530. package/zova/src/suite-vendor/a-pay/package.json +5 -5
  531. package/zova/src/suite-vendor/a-zova/modules/a-api/package.json +1 -1
  532. package/zova/src/suite-vendor/a-zova/modules/a-api/src/.metadata/index.ts +7 -7
  533. package/zova/src/suite-vendor/a-zova/modules/a-app/package.json +1 -1
  534. package/zova/src/suite-vendor/a-zova/modules/a-app/src/.metadata/index.ts +8 -8
  535. package/zova/src/suite-vendor/a-zova/modules/a-bean/package.json +1 -1
  536. package/zova/src/suite-vendor/a-zova/modules/a-bean/src/.metadata/index.ts +15 -15
  537. package/zova/src/suite-vendor/a-zova/modules/a-behavior/package.json +1 -1
  538. package/zova/src/suite-vendor/a-zova/modules/a-behavior/src/.metadata/index.ts +25 -25
  539. package/zova/src/suite-vendor/a-zova/modules/a-behaviors/package.json +1 -1
  540. package/zova/src/suite-vendor/a-zova/modules/a-behaviors/src/.metadata/index.ts +9 -9
  541. package/zova/src/suite-vendor/a-zova/modules/a-boundary/package.json +1 -1
  542. package/zova/src/suite-vendor/a-zova/modules/a-boundary/src/.metadata/index.ts +5 -5
  543. package/zova/src/suite-vendor/a-zova/modules/a-command/package.json +1 -1
  544. package/zova/src/suite-vendor/a-zova/modules/a-command/src/.metadata/index.ts +5 -5
  545. package/zova/src/suite-vendor/a-zova/modules/a-fetch/package.json +1 -1
  546. package/zova/src/suite-vendor/a-zova/modules/a-fetch/src/.metadata/index.ts +14 -14
  547. package/zova/src/suite-vendor/a-zova/modules/a-form/package.json +1 -1
  548. package/zova/src/suite-vendor/a-zova/modules/a-form/src/.metadata/index.ts +12 -12
  549. package/zova/src/suite-vendor/a-zova/modules/a-icon/package.json +1 -1
  550. package/zova/src/suite-vendor/a-zova/modules/a-icon/src/.metadata/index.ts +18 -18
  551. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
  552. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/.metadata/index.ts +8 -8
  553. package/zova/src/suite-vendor/a-zova/modules/a-logger/package.json +1 -1
  554. package/zova/src/suite-vendor/a-zova/modules/a-logger/src/.metadata/index.ts +9 -9
  555. package/zova/src/suite-vendor/a-zova/modules/a-meta/package.json +1 -1
  556. package/zova/src/suite-vendor/a-zova/modules/a-meta/src/.metadata/index.ts +5 -5
  557. package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
  558. package/zova/src/suite-vendor/a-zova/modules/a-model/src/.metadata/index.ts +12 -12
  559. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +3 -2
  560. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/.metadata/index.ts +13 -13
  561. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +16 -27
  562. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts +18 -1
  563. package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
  564. package/zova/src/suite-vendor/a-zova/modules/a-router/src/.metadata/index.ts +27 -27
  565. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkey.ts +9 -6
  566. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +15 -5
  567. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +2 -2
  568. package/zova/src/suite-vendor/a-zova/modules/a-routerstack/package.json +1 -1
  569. package/zova/src/suite-vendor/a-zova/modules/a-routerstack/src/.metadata/index.ts +13 -13
  570. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
  571. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/.metadata/index.ts +13 -13
  572. package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
  573. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/.metadata/index.ts +9 -9
  574. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +15 -4
  575. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrNavigation.ts +40 -0
  576. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrProfile.ts +6 -1
  577. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +20 -6
  578. package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrNavigation.test.ts +69 -0
  579. package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrProfile.test.ts +25 -6
  580. package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/package.json +1 -1
  581. package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/src/.metadata/index.ts +4 -4
  582. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
  583. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/.metadata/index.ts +10 -10
  584. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +1 -2
  585. package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
  586. package/zova/src/suite-vendor/a-zova/modules/a-style/src/.metadata/index.ts +9 -9
  587. package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +2 -2
  588. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  589. package/zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/index.ts +12 -12
  590. package/zova/src/suite-vendor/a-zova/modules/a-zod/package.json +1 -1
  591. package/zova/src/suite-vendor/a-zova/modules/a-zod/src/.metadata/index.ts +9 -9
  592. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  593. package/zova/src/suite-vendor/a-zova/modules/a-zova/src/.metadata/index.ts +5 -5
  594. package/zova/src/suite-vendor/a-zova/package.json +26 -26
  595. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.emailConfirmCallback.ts +0 -32
  596. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.passwordResetCallback.ts +0 -30
  597. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.register.ts +0 -27
  598. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/index.ts +0 -207
  599. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/locales.ts +0 -18
  600. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/this.ts +0 -2
  601. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/bean.mailConfirm.ts +0 -63
  602. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +0 -17
  603. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.emailConfirmCallback.ts +0 -13
  604. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.passwordResetCallback.ts +0 -13
  605. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/en-us.ts +0 -13
  606. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/en-us.ts +0 -29
  607. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/zh-cn.ts +0 -29
  608. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/zh-cn.ts +0 -13
  609. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/controller/mail.ts +0 -34
  610. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/index.ts +0 -2
  611. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/paymentSession.ts +0 -74
  612. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/paymentSession.ts +0 -25
  613. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockPayment.ts +0 -34
  614. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockPayment.ts +0 -13
  615. /package/vona/patches/{zova-core@5.1.84.patch → zova-core@5.1.85.patch} +0 -0
  616. /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.build.json +0 -0
  617. /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.json +0 -0
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.136
1
+ 5.1.138
@@ -141,6 +141,19 @@ Check whether the feature needs:
141
141
  - OpenAPI metadata
142
142
  - inferred DTO generation
143
143
 
144
+ ### Conditional RBAC metadata
145
+
146
+ When the active edition and installed modules provide `@Passport.rbac(...)` and the task adds or changes a decorated action:
147
+
148
+ - verify the decorator, RBAC catalog, and any policy-catalog/editor consumer in the active source before making availability claims
149
+ - provide locale-aware `summary` metadata at both the controller and action levels; these scopes are independent and must be authored explicitly
150
+ - add locale-aware `description` metadata only when the business or administrative experience needs explanatory text
151
+ - keep action keys, controller bean names, action names, routes, and other authorization/integration identifiers stable and nonlocalized
152
+ - treat summary/description as presentation metadata, not authorization identity or enforcement
153
+ - verify the explicit server-side catalog/editor projection; do not assume OpenAPI metadata is automatically displayed by a policy editor
154
+
155
+ For the authoring example and metadata boundary, read [Controller Guide](../../../cabloy-docs/backend/controller-guide.md#rbac-presentation-metadata) and [Controller AOP Guide](../../../cabloy-docs/backend/controller-aop-guide.md#rbac-presentation-metadata).
156
+
144
157
  ### Persistence and schema lifecycle
145
158
 
146
159
  Check whether the feature needs:
@@ -26,6 +26,17 @@ After generating or extending a backend thread, check which follow-up layers app
26
26
  - treat `v.object(...)`, `v.array(...)`, `v.optional()`, `v.nullable()`, `v.default(...)`, and preprocess/transform wrappers as structure-shaping rather than metadata-only
27
27
  - after touching structure-shaping schemaLike, verify the emitted schema/OpenAPI result explicitly
28
28
 
29
+ ### Conditional RBAC metadata follow-up
30
+
31
+ When the active edition and installed modules provide `@Passport.rbac(...)` and a task adds or changes a decorated action:
32
+
33
+ - verify the decorator, RBAC catalog, and any policy-catalog/editor consumer in the active source before making availability claims
34
+ - provide locale-aware `summary` metadata at both the controller and action levels; these scopes are independent and must be authored explicitly
35
+ - add locale-aware `description` metadata only when the business or administrative experience needs explanatory text
36
+ - keep action keys, controller bean names, action names, routes, and other authorization/integration identifiers stable and nonlocalized
37
+ - treat summary/description as presentation metadata, not authorization identity or enforcement
38
+ - verify the explicit server-side catalog/editor projection; do not assume OpenAPI metadata is automatically displayed by a policy editor
39
+
29
40
  ## Persistence follow-up
30
41
 
31
42
  - migration/version changes
@@ -226,6 +226,23 @@ Important Cabloy Basic reverse-sync rule:
226
226
 
227
227
  For Cabloy Start, verify the exact Start-specific flavor names, paths, SSR site baselines, and project assets in the licensed Start repo.
228
228
 
229
+ ### Schema-driven UI decision branch
230
+
231
+ When the regenerated contract feeds a form or another metadata-driven UI, decide the ownership path before adding frontend field definitions:
232
+
233
+ 1. Put reusable field meaning, validation, titles, ordering, and renderer metadata on the backend entity or inferred contract when those semantics are shared; put operation-specific projection or composition in the DTO.
234
+ 2. Identify the frontend consumer surface:
235
+ - generated `$api` for executing an operation;
236
+ - generated `$apiSchema` for a named schema facade;
237
+ - `$sdk` or `ModelResource` for dynamic schema/resource access;
238
+ - a direct page form for a local, non-resource workflow.
239
+ 3. Prefer automatic `ZForm` rendering when the resolved schema already carries the field metadata. A `ZForm` with `schema` and no default body slot iterates schema properties automatically; use `slotFooter` or other structural slots for page-specific actions without replacing the automatic body. A default body slot is an intentional manual/mixed-composition boundary and must render the required fields deliberately.
240
+ 4. Treat localized schemas as locale-scoped runtime state. Do not retain a `createApiSchemas(...)` facade, its `requestBody`, or an `omit`/`pick`/other transformed snapshot across a locale change. Reacquire the current schema through a getter, `$computed`, or the owning `ModelResource`; perform page-specific schema transformations inside that reactive derivation and ensure the current facade's SDK query is ready. `staleTime: Infinity` is cache behavior within a selected runtime, not cross-locale schema validity.
241
+ 5. Keep reusable query, cache, mutation, invalidation, and resource state in `ModelResource` or a model. A page-specific action may call generated `$api` directly when it has no shared state or cache ownership; do not add an infrequently used operation to a shared model only for API indirection.
242
+ 6. If the page needs a custom renderer, layout, or behavior, determine whether that resource is frontend-owned and referenced by backend metadata. If so, follow the reverse-chain flavor build and `deps:vona` handoff rather than treating the change as frontend-only.
243
+
244
+ Read the [API Schema Guide](../../../cabloy-docs/frontend/api-schema-guide.md), [Form Guide](../../../cabloy-docs/frontend/form-guide.md), [A-OpenAPI Under the Hood](../../../cabloy-docs/frontend/a-openapi-under-the-hood.md), and [Model Resource Owner Pattern](../../../cabloy-docs/frontend/model-resource-owner-pattern.md) for the ownership and runtime details. Use `references/contract-loop-map.md` and `references/verification-checklist.md` for the contract-loop proof steps.
245
+
229
246
  ### Path C: Downstream frontend alignment
230
247
 
231
248
  After generation, inspect whether the frontend still needs follow-up in:
@@ -122,16 +122,50 @@ Typical frontend thread pieces may include:
122
122
 
123
123
  Do not throw away the generated structure and rewrite it from scratch unless the generator clearly does not match the task.
124
124
 
125
+ ### Relative import suffix follow-up
126
+
127
+ For Zova application modules under `zova/src/module/**`, `zova/src/module-vendor/**`,
128
+ `zova/src/suite/**/modules/**`, and `zova/src/suite-vendor/**/modules/**`, relative
129
+ imports and exports name the emitted ESM file:
130
+
131
+ - a `.ts` target uses `.js`
132
+ - a `.tsx` target uses `.jsx`
133
+
134
+ Apply this to ordinary and type-only imports, relative re-exports, and module tests.
135
+ Keep the generated `.js`/`.jsx` specifiers as the baseline after CLI generation or
136
+ metadata refresh; manual follow-up imports must use the same emitted suffix.
137
+
138
+ Do not apply this rule globally. Preserve deliberate `.ts`/`.tsx` imports in
139
+ `zova/packages-utils/**` and `zova/packages-zova/**`; do not normalize Vona, CLI or
140
+ template source, dependencies, generated output, or build artifacts. Never use a
141
+ repository-wide suffix replacement: inspect only the affected module thread.
142
+
125
143
  ## Step 5: Apply frontend follow-up logic deliberately
126
144
 
127
145
  Frontend scaffolding is rarely complete after generation alone. Treat this follow-up review as mandatory.
128
146
 
129
147
  ### Route and metadata follow-up
130
148
 
149
+ Before finalizing every new or changed route, resolve the effective route defaults rather than relying on an unexamined omission:
150
+
151
+ - **layout** — omitted `meta.layout` inherits the logical default layout;
152
+ - **authentication** — omitted `requiresAuth` remains protected by the current guard, and only `requiresAuth: false` opts out;
153
+ - **SSR profile** — omitted `meta.ssrProfile` inherits the active flavor's `SSR_PROFILE`, while route metadata overrides it.
154
+
155
+ For Zova page routes, also apply these authoring defaults:
156
+
157
+ - routes with dynamic params require `route.name`; static routes should omit `route.name` unless a documented named-route requirement exists;
158
+ - ordinary business routes without `locale` params should omit app-config aliases unless a documented system, compatibility, or user-facing URL exception requires one;
159
+ - choose `ssrProfile` from the route's rendering contract: Web remains `public` by default, while `session` is explicit for cookie-backed state, protected admission, personalized first paint, or private SSR data; a missing `locale` parameter alone does not determine the profile; anonymous admission remains an explicit `requiresAuth: false` decision.
160
+
161
+ Verify the active edition and flavor before applying concrete SSR defaults, and do not add all three fields redundantly when intentional inheritance is the desired behavior.
162
+
131
163
  Check whether the feature needs:
132
164
 
133
165
  - page route review
134
166
  - params/query schema alignment
167
+ - effective layout, authentication, and SSR-profile default resolution
168
+ - static-name and ordinary-alias exception review
135
169
  - alias or guard review
136
170
  - metadata regeneration
137
171
 
@@ -175,6 +209,7 @@ Check whether the feature needs:
175
209
  - typecheck
176
210
  - build
177
211
  - metadata regeneration verification
212
+ - scoped relative-import verification: check the affected Zova module tree for accidental `.ts`/`.tsx` relative specifiers, while excluding intentional package source under `zova/packages-utils/**` and `zova/packages-zova/**`
178
213
  - SSR or route-path verification
179
214
  - hydration-time initial-render equivalence when SSR, private state, browser-only state, or async model state changes
180
215
  - edition-specific flavor, SSR site baseline, and project-asset verification
@@ -16,7 +16,7 @@
16
16
  {
17
17
  "id": 3,
18
18
  "prompt": "I changed a route and component structure in Cabloy Basic and now I am not sure what else I should update. What should Claude check before saying the frontend work is done?",
19
- "expected_output": "Identifies likely frontend follow-up such as metadata regeneration, page/component/API/model or SSR impact, and verification commands.",
19
+ "expected_output": "Resolves the effective layout, authentication, and SSR-profile choices for each changed route; confirms static-name and ordinary-alias decisions, params/name implications, metadata regeneration, page/component/API/model or SSR impact, and route/SSR verification commands.",
20
20
  "files": []
21
21
  },
22
22
  {
@@ -8,6 +8,9 @@ After generating or extending a frontend thread, check which follow-up layers ap
8
8
  - component wrapper usage
9
9
  - route record implications
10
10
  - params/query schema alignment
11
+ - [ ] resolve the route-default triad: effective `layout`, `requiresAuth`, and `ssrProfile`; confirm every omitted field intentionally inherits the active default
12
+ - [ ] static routes omit `route.name` unless a documented named-route requirement exists; ordinary business routes without `locale` params omit app-config aliases unless an explicit exception applies
13
+ - [ ] choose `ssrProfile` from the route's rendering contract (Web remains `public` by default; `session` is explicit for cookie-backed state, protected admission, personalized first paint, or private SSR data); a missing `locale` parameter alone does not determine it, and anonymous access is chosen independently with explicit `requiresAuth: false`
11
14
 
12
15
  ## Data and contract follow-up
13
16
 
@@ -35,6 +38,7 @@ After generating or extending a frontend thread, check which follow-up layers ap
35
38
  - `:tools:metadata`
36
39
  - route/component/icon regeneration-sensitive changes
37
40
  - edition-specific generated output review
41
+ - for a `this.scope.locale` missing-key or type error: inspect `src/config/locale/`; if it is absent, run `npm run zova :init:locale <module>` (which refreshes metadata in its normal path), add the key to all required locale files, and run `npm run zova :tools:metadata <module>` if generated typing remains stale; do not cast around the error or add a local locale compatibility helper
38
42
 
39
43
  ## Verification follow-up
40
44
 
@@ -91,6 +91,13 @@ For compact procedural summaries inside the skill bundle, also use:
91
91
  - `references/analysis-modes.md`
92
92
  - `references/core-reading-paths.md`
93
93
 
94
+ For locale-sensitive schema/form questions, also read:
95
+
96
+ - `cabloy-docs/frontend/api-schema-guide.md`
97
+ - `cabloy-docs/frontend/a-openapi-under-the-hood.md`
98
+ - `cabloy-docs/frontend/form-guide.md`
99
+ - `cabloy-docs/frontend/zova-form-under-the-hood.md`
100
+
94
101
  ### Core architecture surfaces
95
102
 
96
103
  Use these when the question needs broader architectural context:
@@ -117,6 +124,20 @@ Use these bundled references to keep the workflow compact:
117
124
 
118
125
  Use the public `cabloy-docs/frontend/zova-source-reading-map.md` as the fuller explanation layer, but use the bundled references first when they are enough for the current task.
119
126
 
127
+ ### Locale-sensitive schema and form path
128
+
129
+ When a translated schema title, renderer, or validation surface remains stale after a locale change, read in this order:
130
+
131
+ 1. the public API Schema Guide and A-OpenAPI Under the Hood guide;
132
+ 2. the public Form Guide and Zova Form Under the Hood guide when a `ZForm` consumes the schema;
133
+ 3. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts` to verify that the active locale replaces the selected `ModelSdk`;
134
+ 4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts` to inspect selector-scoped schema queries and `createApiSchemas(...)` facade lifetime;
135
+ 5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/bean/sys.sdk.ts` to verify locale headers and schema caches;
136
+ 6. the generated API-schema bean and the actual page/model consumer that stores or derives the facade;
137
+ 7. `zova/src/suite-vendor/a-zova/modules/a-form/` only after confirming which schema the form owner supplies, and whether automatic body iteration was replaced by a default body slot.
138
+
139
+ The key distinction is between a genuinely stale generated contract and a valid schema facade captured from an earlier locale. `$computed` is only locale-safe when its dependency path reacquires the current schema source; wrapping an old facade or transformed snapshot does not make it current.
140
+
120
141
  ## Step 5: Explain Zova-native meaning first
121
142
 
122
143
  When answering, explain the Zova role first, then add Vue analogies only if they help.
@@ -99,6 +99,32 @@ Use when the question is about:
99
99
  - layout shell implications
100
100
  - route-aware controller state
101
101
 
102
+ ## Locale-sensitive OpenAPI schema and ZForm path
103
+
104
+ Read in this order:
105
+
106
+ 1. `cabloy-docs/frontend/api-schema-guide.md`
107
+ 2. `cabloy-docs/frontend/a-openapi-under-the-hood.md`
108
+ 3. `cabloy-docs/frontend/form-guide.md` and `cabloy-docs/frontend/zova-form-under-the-hood.md` when a form consumes the schema
109
+ 4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts`
110
+ 5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/model/sdk.ts`
111
+ 6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/bean/sys.sdk.ts`
112
+ 7. the generated API-schema bean for the operation
113
+ 8. the consumer controller/model and, only then, `a-form` controller/render sources
114
+
115
+ Use when the question is about:
116
+
117
+ - translated form titles, descriptions, validation, or renderer metadata that remain stale after a locale switch
118
+ - whether an `$apiSchema` facade, `requestBody`, or transformed schema may be stored across locale changes
119
+ - whether a stale result is generated-contract drift or consumer-side capture
120
+ - whether automatic `ZForm` rendering remains active or a default body slot intentionally replaced it
121
+
122
+ Expected conclusion:
123
+
124
+ - `a-openapi` selects a locale-scoped runtime, so `createApiSchemas(...)` facades created before a locale change can retain an earlier schema query
125
+ - the consumer must reacquire the schema through a live getter/computed owner and apply schema transforms in that same derivation
126
+ - `ZForm` resolves properties from the supplied schema; it does not refresh a stale caller-owned facade
127
+
102
128
  ## Model/state ownership path
103
129
 
104
130
  Read in this order:
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.138
4
+
5
+ ### Features
6
+
7
+ - Add a role-based access control (RBAC) system with permission and scope support.
8
+ - Add user home pages, avatar support, and activation handling.
9
+ - Add return-to redirect support for login flows.
10
+ - Add mail capabilities and a base authentication guard.
11
+ - Add basic image and select field support, including boolean field values.
12
+ - Add SKU product and identifier support.
13
+ - Add API and model resource deletion capabilities.
14
+ - Add SSR profile metadata localization, public session handling, and local loading support.
15
+
16
+ ### Bug Fixes
17
+
18
+ - Fix transaction handling.
19
+ - Fix locale handling.
20
+ - Fix internal SSR disposal method casting.
21
+
22
+ ### Improvements
23
+
24
+ - Enhance deletion behavior.
25
+ - Update database dialect, controller, authentication guard, locale, and application initialization components.
26
+
27
+ ## 5.1.137
28
+
29
+ ### Improvements
30
+
31
+ - Refresh the Zova lockfile after compensation rerun preparation.
32
+ - Refresh the Vona Zova Core patch for v5.1.85.
33
+
3
34
  ## 5.1.136
4
35
 
5
36
  ### Features
package/CLAUDE.md CHANGED
@@ -46,6 +46,9 @@ Before inventing a custom implementation path:
46
46
  - Treat contract-loop work as one of four branches: forward chain, reverse chain, consumer drift, or local dependency drift.
47
47
  - For the forward chain, change backend contract truth first and regenerate frontend consumers rather than hand-patching them.
48
48
  - After forward regeneration, keep frontend follow-up thin: prefer semantic model facades and reuse the existing resource-owner when the custom API still belongs to the same resource.
49
+ - For schema-driven UI, treat backend entity/DTO/OpenAPI metadata as contract truth; prefer `$apiSchema` or the owning `ModelResource` with automatic `ZForm` rendering, regenerate generated consumers, and never duplicate schema metadata or hand-edit generated consumers.
50
+ - Treat localized `$apiSchema` and `ModelResource` schemas as locale-scoped reactive state: do not retain a schema facade or derived snapshot created before a locale change; reacquire it through the current runtime and reactive owner.
51
+ - Keep reusable query, cache, mutation, and resource state in models or `ModelResource`; a page-specific, low-reuse action may call the generated `$api` directly when no shared state or cache ownership is required.
49
52
  - When one persisted business resource serves both Admin Resource and Web self-service consumers, keep one domain and persistence boundary; where audience authority or experience differs, split API/DTO contracts, server-side scope, frontend state ownership, and page architecture—reuse the generic Resource owner for Admin and use dedicated state/pages for a genuinely distinct Web self-service contract.
50
53
  - For the reverse chain, always run the relevant Zova build first, then run `npm run deps:vona`: use `npm run build:zova:admin` for Admin changes, and also run `npm run build:zova:web` when the Web flavor is affected. Do not treat `build:rest:*` alone as sufficient, because the SSR bundle and rest output must move together.
51
54
  - If the generated `.zova-rest` artifacts already contain the expected changes but Vona consumers still see stale types after `npm run deps:vona`, treat it as local dependency drift: delete `vona/node_modules` and reinstall dependencies before further debugging or hand-patching dependency links.
@@ -54,7 +57,8 @@ Before inventing a custom implementation path:
54
57
  - For frontend work, assume Cabloy Basic and Cabloy Start share a frontend engineering layer but may diverge in UI layer, frontend flavors, suite/module availability, SSR site baselines, project assets, and generated outputs.
55
58
  - For Zova frontend analysis, do not default to generic Vue reinterpretation first. Read the code through Zova’s controller / bean / IoC architecture before mapping it to Vue concepts.
56
59
  - For Zova source-reading or Vue-vs-Zova explanation tasks, start from the frontend reading guides and source-reading map in `cabloy-docs/frontend/` before doing framework-neutral reinterpretation.
57
- - In Zova page routes, any route with dynamic `params` must define `route.name`; do not rely on unnamed path-keyed routes for typed `$params`, and regenerate page metadata after route changes.
60
+ - In Zova application modules under `zova/src/module/**`, `zova/src/module-vendor/**`, `zova/src/suite/**/modules/**`, and `zova/src/suite-vendor/**/modules/**`, use emitted runtime suffixes for relative imports and exports: `.js` for `.ts` targets and `.jsx` for `.tsx` targets, including type-only imports and module tests. Preserve the deliberate `.ts`/`.tsx` convention in `zova/packages-utils/**` and `zova/packages-zova/**`; do not generalize this rule to Vona, CLI/templates, dependencies, generated output, or build artifacts.
61
+ - In Zova page routes, any route with dynamic `params` must define `route.name`; do not rely on unnamed path-keyed routes for typed `$params`. Static routes should omit `route.name` unless a documented named-route requirement exists; use `$router.getPagePath(...)` for canonical static URL generation rather than adding a name or alias for convenience. Ordinary business routes without `locale` params should omit app-config aliases unless a documented system, compatibility, or user-facing URL exception requires one. Choose `ssrProfile` from the page's rendering contract: Web remains `public` by default, while `session` is an explicit choice for cookie-backed state, protected admission, personalized first paint, or private SSR data; the absence of a locale parameter alone does not select a profile. `requiresAuth` is independent, so anonymous routes must explicitly use `requiresAuth: false`. Regenerate page metadata after route changes.
58
62
  - For frontend async state that affects rendering or interaction across consumers, prefer model-owned `$useStateData(...)` over controller-managed fetch/cache state.
59
63
  - Default to establishing such query state during render. Use `disableSuspenseOnInit: true` only for relatively stable query-backed state when you want to skip the init-time `query.suspense()` kick; it does not prevent query creation, fetches, or hydration-time rendering. If strict readiness is needed later, wait explicitly at the interaction boundary.
60
64
  - In SSR, keep server HTML and the client's hydration-time initial render equivalent. When server rendering intentionally omits private, cookie-unavailable, or browser-only state, keep the same neutral shell or placeholder through hydration and defer its query/load/render branch to an explicit post-hydration, admission, mounted, or interaction boundary.
@@ -188,6 +188,7 @@ export default defineConfig({
188
188
  themeConfig: {
189
189
  nav: [
190
190
  { text: 'Home', link: '/' },
191
+ { text: 'Blogs', link: '/blogs/', activeMatch: '^/blogs/' },
191
192
  { text: 'Fullstack', link: '/fullstack/introduction', activeMatch: '^/fullstack/' },
192
193
  { text: 'Backend (Vona)', link: '/backend/introduction', activeMatch: '^/backend/' },
193
194
  { text: 'Frontend (Zova)', link: '/frontend/introduction', activeMatch: '^/frontend/' },
@@ -62,3 +62,127 @@
62
62
  background: #431407;
63
63
  color: #fdba74;
64
64
  }
65
+
66
+ .cabloy-blog-grid {
67
+ display: grid;
68
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
69
+ gap: 1.5rem;
70
+ margin-top: 2rem;
71
+ }
72
+
73
+ .cabloy-blog-card {
74
+ display: flex;
75
+ flex-direction: column;
76
+ overflow: hidden;
77
+ border: 1px solid var(--vp-c-divider);
78
+ border-radius: 12px;
79
+ background: var(--vp-c-bg-soft);
80
+ transition:
81
+ border-color 0.2s ease,
82
+ box-shadow 0.2s ease,
83
+ transform 0.2s ease;
84
+ }
85
+
86
+ .cabloy-blog-card:hover {
87
+ border-color: var(--vp-c-brand-1);
88
+ box-shadow: 0 12px 28px color-mix(in srgb, var(--vp-c-text-1) 12%, transparent);
89
+ transform: translateY(-2px);
90
+ }
91
+
92
+ .cabloy-blog-card__cover {
93
+ display: block;
94
+ aspect-ratio: 16 / 9;
95
+ overflow: hidden;
96
+ background: var(--vp-c-bg-alt);
97
+ }
98
+
99
+ .cabloy-blog-card__cover:focus-visible,
100
+ .cabloy-blog-card h2 a:focus-visible,
101
+ .cabloy-blog-card__read:focus-visible {
102
+ outline: 2px solid var(--vp-c-brand-1);
103
+ outline-offset: 3px;
104
+ }
105
+
106
+ .cabloy-blog-card__cover img {
107
+ width: 100%;
108
+ height: 100%;
109
+ object-fit: cover;
110
+ transition: transform 0.2s ease;
111
+ }
112
+
113
+ .cabloy-blog-card:hover .cabloy-blog-card__cover img {
114
+ transform: scale(1.025);
115
+ }
116
+
117
+ .cabloy-blog-card__content {
118
+ display: flex;
119
+ flex: 1;
120
+ flex-direction: column;
121
+ padding: 1.25rem;
122
+ }
123
+
124
+ .cabloy-blog-card__date {
125
+ margin: 0;
126
+ color: var(--vp-c-text-2);
127
+ font-size: 0.875rem;
128
+ font-weight: 600;
129
+ }
130
+
131
+ .cabloy-blog-card h2 {
132
+ margin: 0.5rem 0 0;
133
+ border: 0;
134
+ font-size: 1.25rem;
135
+ line-height: 1.4;
136
+ }
137
+
138
+ .cabloy-blog-card h2 a {
139
+ color: var(--vp-c-text-1);
140
+ text-decoration: none;
141
+ }
142
+
143
+ .cabloy-blog-card h2 a:hover {
144
+ color: var(--vp-c-brand-1);
145
+ }
146
+
147
+ .cabloy-blog-card__content > p:not(.cabloy-blog-card__date) {
148
+ margin: 0.75rem 0;
149
+ color: var(--vp-c-text-2);
150
+ font-size: 0.9375rem;
151
+ line-height: 1.6;
152
+ }
153
+
154
+ .cabloy-blog-card__tags {
155
+ display: flex;
156
+ flex-wrap: wrap;
157
+ gap: 0.375rem;
158
+ margin-top: auto;
159
+ }
160
+
161
+ .cabloy-blog-card__tags span {
162
+ border-radius: 999px;
163
+ padding: 0.1875rem 0.625rem;
164
+ background: color-mix(in srgb, var(--vp-c-brand-1) 12%, var(--vp-c-bg));
165
+ color: var(--vp-c-brand-3);
166
+ font-size: 0.75rem;
167
+ font-weight: 600;
168
+ line-height: 1.25rem;
169
+ }
170
+
171
+ .cabloy-blog-card__read {
172
+ align-self: flex-start;
173
+ margin-top: 1rem;
174
+ color: var(--vp-c-brand-1);
175
+ font-size: 0.9375rem;
176
+ font-weight: 600;
177
+ text-decoration: none;
178
+ }
179
+
180
+ .cabloy-blog-card__read:hover {
181
+ color: var(--vp-c-brand-2);
182
+ text-decoration: underline;
183
+ }
184
+
185
+ .dark .cabloy-blog-card__tags span {
186
+ background: color-mix(in srgb, var(--vp-c-brand-1) 22%, var(--vp-c-bg));
187
+ color: #bfdbfe;
188
+ }
@@ -131,6 +131,14 @@ The `home-user` module exposes out-of-the-box Passport APIs for common account f
131
131
 
132
132
  In the current repo implementation, these flows live in `home-user/src/controller/passport.ts`, where register/login call `bean.auth.authenticate(...)`, OAuth login uses provider/module path parameters, and token-oriented follow-up endpoints stay concentrated in one controller surface.
133
133
 
134
+ ## Registration and password recovery in Cabloy Basic
135
+
136
+ The Home Login experience uses the Passport registration flow for new users. Registration collects the standard username, email, password, confirmation, and CAPTCHA fields, then continues through the ordinary signed-in navigation flow after it succeeds.
137
+
138
+ If a user has lost an existing local password, the Login page also provides **Forgot password?**. The request form asks for an email address and CAPTCHA. After valid CAPTCHA verification, it always shows the same generic confirmation, whether or not a reset email can be sent. This protects account privacy and avoids exposing account eligibility through the interface.
139
+
140
+ When a reset email is available, its link opens a public page where the user chooses a new local password. Completing the reset signs the user out of existing server-side sessions, so they must sign in again with the new password. Password reset replaces an existing local password; it is not a way for an OAuth-only account to add its first local password. That journey remains the authenticated **Set password** account-security action.
141
+
134
142
  This guide focuses on the framework-level auth model. For the user/passport side, see [User Access Guide](/backend/user-access-guide).
135
143
 
136
144
  ## Relationship to controller AOP
@@ -218,6 +218,8 @@ A useful backend mental model is:
218
218
 
219
219
  This layered model is the safest way to reason about config changes in Cabloy.
220
220
 
221
+ `CORS_WHITE_LIST` is an example of a deployable environment value consumed directly by a framework middleware default. Configure deployment-specific browser origins in the active env layer; it is not a `config.modules[...]` field or instance-specific config. Use explicit `a-security:cors` configuration only when the application needs middleware behavior beyond the environment-provided origin list. See [Runtime and Flavors](/backend/runtime-and-flavors#configure-browser-cors-origins) for its format, browser-origin behavior, and env-file precedence.
222
+
221
223
  ## Relationship to startup, model, and datasource behavior
222
224
 
223
225
  Config does not live in isolation. In many backend tasks, config interacts directly with:
@@ -125,6 +125,14 @@ The CRUD generator applies `@Passport.systemAdmin()` to each generated CRUD acti
125
125
 
126
126
  For the underlying auth, passport, and user-access model, see [Auth Guide](/backend/auth-guide) and [User Access Guide](/backend/user-access-guide).
127
127
 
128
+ ### RBAC presentation metadata
129
+
130
+ Some Cabloy editions or module sets provide `@Passport.rbac(...)` for dynamic RBAC actions. Verify the active edition and installed modules first; this decorator is not a Basic baseline assumption.
131
+
132
+ When an action uses `@Passport.rbac(...)`, provide a locale-aware `summary` on both the controller metadata and the action's `@Web.*` metadata. These scopes are independent, so the controller summary does not supply the action summary. Add locale-aware `description` values only when the business or administrative experience needs explanatory text.
133
+
134
+ These fields are for human-facing documentation and optional policy-catalog or policy-editor presentation. They are not authorization identity or enforcement inputs. Keep action keys and other machine identifiers stable and nonlocalized, and verify that the active server explicitly projects summary/description into a policy catalog before expecting an editor to display them. See [Controller Guide](/backend/controller-guide#rbac-presentation-metadata) for the authoring example.
135
+
128
136
  ## Interceptor
129
137
 
130
138
  Interceptors provide onion-style around-execution behavior for controller actions.
@@ -341,6 +341,8 @@ Representative pattern:
341
341
 
342
342
  ```typescript
343
343
  @Controller('student', {
344
+ description: 'Student controller',
345
+ summary: 'Student API',
344
346
  exclude: false,
345
347
  tags: ['Student'],
346
348
  })
@@ -349,14 +351,45 @@ class ControllerStudent {}
349
351
 
350
352
  Representative controller-option areas include:
351
353
 
354
+ - `description`
355
+ - `summary`
352
356
  - `exclude`
353
357
  - `tags`
354
358
  - `actions`
355
359
  - `enable`
356
360
  - `meta`
357
361
 
362
+ `description` and `summary` at the controller level are controller metadata. They are independent from the operation metadata supplied to `@Web.*`: controller values do not become defaults for an action's OpenAPI `description` or `summary`. Set those fields on the action when documenting a specific operation.
363
+
358
364
  This is especially important because the controller surface can also be tuned from app config through onion/config override patterns.
359
365
 
366
+ ## RBAC presentation metadata
367
+
368
+ Some Cabloy editions or module sets provide `@Passport.rbac(...)` for dynamic RBAC actions. Verify that the active edition and installed modules provide this decorator before applying the following convention.
369
+
370
+ For every action decorated with `@Passport.rbac(...)`, provide a locale-aware `summary` at both the controller and action levels:
371
+
372
+ ```typescript
373
+ @Controller('student', {
374
+ summary: $locale('StudentControllerSummary'),
375
+ })
376
+ class ControllerStudent extends BeanBase {
377
+ @Web.get(':id', {
378
+ summary: $locale('StudentViewSummary'),
379
+ })
380
+ @Passport.rbac({ dataScope: true })
381
+ async view(@Arg.param('id') id: number) {
382
+ // ...
383
+ }
384
+ }
385
+ ```
386
+
387
+ Controller and action `summary` values are independent metadata. A controller summary does not automatically become the action's OpenAPI summary, so define both explicitly. Add locale-aware `description` metadata at either level when the business or administrative experience needs additional explanation; descriptions are optional.
388
+
389
+ A policy catalog or editor may project these fields as localized display labels, but only through an explicit server-side projection. `summary` and `description` are presentation metadata: they do not define the RBAC action key, select a policy, change a route or `operationId`, or grant authorization. Keep action keys, controller bean names, action names, routes, and other integration identifiers stable and nonlocalized. Do not assume that OpenAPI metadata is automatically included in a policy catalog; inspect the active implementation.
390
+
391
+ See [Controller AOP Guide](/backend/controller-aop-guide) for the guard boundary and edition-aware RBAC notes.
392
+
360
393
  ## Relationship to the backend contract loop
361
394
 
362
395
  Read this guide together with:
@@ -150,10 +150,10 @@ Representative examples include:
150
150
 
151
151
  - registration events
152
152
  - activation events
153
- - post-registration follow-up such as email confirmation
153
+ - post-registration follow-up such as account activation-link issuance
154
154
  - role-assignment follow-up logic
155
155
 
156
- Mail delivery is a common downstream effect in these flows; see [Mail Guide](/backend/mail-guide).
156
+ Mail delivery is a common downstream effect in these flows; see [Mail Guide](/backend/mail-guide). Account activation-link issuance may be owned by the account service rather than an event listener.
157
157
 
158
158
  Read this together with [User Access Guide](/backend/user-access-guide) when the event flow is tied to identity lifecycle behavior.
159
159
 
@@ -169,7 +169,7 @@ Use direct calls when:
169
169
 
170
170
  - the behavior is tightly bound to the core logic and should not be extensible as a chain
171
171
 
172
- A practical example from the user-access layer is registration and activation: the core user flow can stay small, while follow-up concerns such as mail confirmation or role assignment move into listeners.
172
+ A practical example from the user-access layer is activation: the core user flow can stay small, while follow-up concerns such as role assignment move into listeners. Account-specific activation-link issuance remains owned by the home-user account service.
173
173
 
174
174
  ## Implementation checks for event-driven backend changes
175
175
 
@@ -165,7 +165,7 @@ Read this guide together with:
165
165
 
166
166
  Those guides explain the flows where mail often becomes a downstream effect rather than the initiating business action.
167
167
 
168
- In the current repo, the `a-mailconfirm` flow is a representative example: user-access events can trigger mail-confirm behavior, and that bean ultimately delegates delivery through `bean.mail.send(...)` instead of embedding transport details directly into the user workflow.
168
+ In the current repo, the `home-user` activation flow is a representative example: its account service issues a purpose-bound activation link and delegates delivery through `bean.mail.send(...)`, keeping transport details out of the user workflow.
169
169
 
170
170
  ## When to use a dedicated mail client
171
171
 
@@ -181,7 +181,7 @@ Use this checklist when adding Markdown-backed content:
181
181
  3. Call `this.bean.markdown.renderHtml(...)` on every authoritative write path.
182
182
  4. Define a business policy for blank Markdown; do not assume `renderHtml('')` deletes records.
183
183
  5. Expose the source and projection separately according to the consumer's authority.
184
- 6. Use `basic-markdown:formFieldMarkdown` for the Markdown form field.
184
+ 6. Use the edition-specific Markdown form field: `basic-markdown:formFieldMarkdown` in Cabloy Basic or `start-markdown:formFieldMarkdown` in Cabloy Start.
185
185
  7. Use `ZMarkdownHtml` only for HTML produced by the trusted server rendering path.
186
186
  8. Add tests for blank values, invalid URL schemes, task-list output, derived HTML consistency, and forged output fields.
187
187
  9. Treat external-image policy, CSP, authorization, and content lifecycle cleanup as application concerns beyond this renderer.
@@ -120,12 +120,41 @@ The current repo uses many env variables, but these are the most important ones
120
120
  | Runtime meta | `META_MODE`, `META_FLAVOR`, `NODE_ENV` | chooses the active runtime and flavor shape |
121
121
  | Worker/runtime process | `SERVER_WORKERS` | controls worker count and is normalized by the CLI/bootstrap path |
122
122
  | HTTP server | `SERVER_LISTEN_HOSTNAME`, `SERVER_LISTEN_PORT`, `SERVER_LISTEN_DISABLE`, `SERVER_SERVE_PROTOCOL`, `SERVER_SERVE_HOST`, `SERVER_GLOBALPREFIX` | controls listen/serve behavior and URL shaping |
123
+ | CORS | `CORS_WHITE_LIST` | supplies the default allowed-origin whitelist for the `a-security:cors` middleware |
123
124
  | Database | `DATABASE_DEFAULT_CLIENT`, `DATABASE_CLIENT_SQLITE3_FILENAME`, `DATABASE_CLIENT_PG_*`, `DATABASE_CLIENT_MYSQL_*` | controls datasource defaults and concrete client connection settings |
124
125
  | Redis | `REDIS_DEFAULT_HOST`, `REDIS_DEFAULT_PORT`, `REDIS_DEFAULT_DB` | controls the backend Redis baseline used by queue, cache, broadcast, and related capabilities |
125
126
  | Logger | `LOGGER_DIR`, `LOGGER_ROTATE_*` | controls log path and rotation behavior |
126
127
 
127
128
  Use this page as the runtime-facing overview, then inspect the current app config when you need to see how those values are translated into backend config.
128
129
 
130
+ ## Public server origin
131
+
132
+ `SERVER_LISTEN_HOSTNAME` and `SERVER_LISTEN_PORT` control where the Vona process binds. They do not define the public URL that Vona emits.
133
+
134
+ When configured, `SERVER_SERVE_PROTOCOL` and `SERVER_SERVE_HOST` define Vona's canonical public origin for backend APIs and backend-hosted SSR sites. If either serve value is not configured, Vona resolves the effective protocol and host from the current proxy-aware request context; background work that needs a stable backend public origin should configure both serve values explicitly.
135
+
136
+ A browser consumer can be deployed on a different origin and pathname. Account password-set and password-reset delivery therefore does not derive its destination from `SERVER_SERVE_*`, SSR Site metadata, `publicPath`, `siteId`, `Referer`, or browser-selected mount data: Zova supplies the complete token-free absolute public page URL, and Vona validates only HTTP(S), absence of userinfo/query/fragment, and an exact trusted origin. `checkOriginExact` permits the exact current origin when protocol, host, and effective port all match; request or proxy Host values are not a general cross-origin allowlist and cannot authorize lookalike, suffix, alternate-scheme, or alternate-port destinations. Other production consumer origins must exactly match an explicit `a-security:cors` `whiteList` entry. In `dev/test`, exact credential-link authorization additionally accepts different ports only when both API and consumer hostnames are loopback (`localhost`, `127.0.0.1`, or `::1`). Vona preserves the frontend pathname and alone adds the raw token as the `token` URL query parameter. Query transport reaches the initial request; Referrer-Policy and Vona, edge, or APM query-log redaction are intentionally outside this flow's current scope. Normal CORS defaults to an empty `whiteList`; configure `CORS_WHITE_LIST` with the permitted browser origins, or explicitly configure `a-security:cors`. In `dev/test`, loopback requests may cross ports; elsewhere, cross-origin CORS requires an allowed entry. Normal CORS wildcard and suffix matching remain available when configured but are not credential-link authorization.
137
+
138
+ ## Configure browser CORS origins
139
+
140
+ `CORS_WHITE_LIST` supplies the default `whiteList` for the app-wide `a-security:cors` middleware. It controls normal HTTP CORS and the built-in WebSocket origin check; it does not authenticate or authorize requests.
141
+
142
+ Set it to a comma-separated list of allowed browser origins. Use complete origins, including the scheme and a non-default port when applicable:
143
+
144
+ ```dotenv
145
+ CORS_WHITE_LIST=https://app.example.com,https://admin.example.com
146
+ ```
147
+
148
+ ```dotenv
149
+ CORS_WHITE_LIST=https://app.example.com,http://localhost:5173
150
+ ```
151
+
152
+ When `CORS_WHITE_LIST` is absent or empty, Vona retains the closed empty-whitelist default. The existing `dev/test` loopback exception remains available for local development, so ordinary loopback clients on different ports do not require this setting.
153
+
154
+ Set deployment-specific origins in the active `vona/env/.env*` layer or inject them through the deployment environment. See [Env-file resolution and precedence](#env-file-resolution-and-precedence) for the active-file chain and precedence rules. Applications that need middleware behavior beyond this default origin list can configure `a-security:cors` explicitly.
155
+
156
+ Normal CORS may use its configured wildcard or suffix matching behavior. Do not use that behavior to authorize account credential links: `checkOriginExact(...)` accepts only an exact normalized HTTP(S) origin and rejects wildcard and suffix entries.
157
+
129
158
  ## How to determine runtime metadata in code
130
159
 
131
160
  ### Via environment variables
@@ -123,7 +123,7 @@ Representative flows include:
123
123
  - registration
124
124
  - activation
125
125
  - assigning default roles
126
- - sending email confirmation or similar follow-up logic
126
+ - issuing account activation links or other follow-up logic
127
127
 
128
128
  Those follow-up email behaviors often connect directly to queue-backed mail delivery; see [Mail Guide](/backend/mail-guide).
129
129
 
@@ -131,7 +131,7 @@ The framework-level user APIs stay stable while project-specific modules can cus
131
131
 
132
132
  The legacy user docs showed this especially clearly:
133
133
 
134
- - registration can trigger follow-up mail-confirm flows
134
+ - registration can issue an account activation link through the account service
135
135
  - activation can assign default roles such as `admin`
136
136
  - `autoActivate` can suppress the extra activation step when the business flow allows it
137
137