@objectstack/console 17.5.0 → 17.6.0

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 (271) hide show
  1. package/CHANGELOG.md +378 -0
  2. package/dist/.objectstack-injection.json +2 -2
  3. package/dist/.objectui-sha +1 -1
  4. package/dist/assets/{ActionResultDialog-CLdIyOW6.js → ActionResultDialog-4kHDGnT3.js} +3 -3
  5. package/dist/assets/{AiPendingActionsPage-OKYz66yR.js → AiPendingActionsPage-JjOddm0h.js} +1 -1
  6. package/dist/assets/{ApiConsolePage-CcrKovu8.js → ApiConsolePage-BgS26lbp.js} +1 -1
  7. package/dist/assets/AppDocsIndex-BDoH5ECM.js +1 -0
  8. package/dist/assets/{AppManagementPage-D_xz8cTZ.js → AppManagementPage-CCgKmNTj.js} +1 -1
  9. package/dist/assets/ApprovalsInboxPage-C6S1vk0X.js +1 -0
  10. package/dist/assets/AuditLogPage-v2dKXMuk.js +1 -0
  11. package/dist/assets/BookPage-DwFMcTSN.js +1 -0
  12. package/dist/assets/{ComponentNavView-BxsixSU9.js → ComponentNavView-B5g9c6fx.js} +1 -1
  13. package/dist/assets/{CreateViewDialog-xyKlpLEW.js → CreateViewDialog-D3l-tYHM.js} +1 -1
  14. package/dist/assets/DashboardView-BOcovpPd.js +1 -0
  15. package/dist/assets/DocPage-B6AkH5WI.js +1 -0
  16. package/dist/assets/{DocsIndex-B2zw_HAp.js → DocsIndex-DwW2QsYY.js} +1 -1
  17. package/dist/assets/{DocsLayout-DezZ8x7_.js → DocsLayout-D63StSgd.js} +1 -1
  18. package/dist/assets/DocsSlug-CP9fcabi.js +1 -0
  19. package/dist/assets/ExpressionProvider-CrL6jhVq.js +1 -0
  20. package/dist/assets/{FlowRunsPage-CvY3nJMF.js → FlowRunsPage-CxdaiUyk.js} +1 -1
  21. package/dist/assets/{IntegrationsPage-2leVkVDH.js → IntegrationsPage-DvG0x0Nb.js} +2 -2
  22. package/dist/assets/{InterfaceListPage-BdECC_i3.js → InterfaceListPage-C4wPYohR.js} +1 -1
  23. package/dist/assets/{MarketplaceInstalledPage-EPPHSitW.js → MarketplaceInstalledPage-B7KETQG2.js} +1 -1
  24. package/dist/assets/MarketplacePackagePage-CfgKDpNH.js +4 -0
  25. package/dist/assets/{MarketplacePage-BnQKykgv.js → MarketplacePage-DNEyU5AE.js} +1 -1
  26. package/dist/assets/{MetadataInspector-BWxLkr0O.js → MetadataInspector-EP0I3-Kq.js} +1 -1
  27. package/dist/assets/{ObjectDataPage-BIzp65Mo.js → ObjectDataPage-CykEm9MD.js} +1 -1
  28. package/dist/assets/PageView-C6u86tni.js +1 -0
  29. package/dist/assets/{ProfilePage-D2qGgxPK.js → ProfilePage-C3SjXMzi.js} +1 -1
  30. package/dist/assets/{PublicFormsPage-DlE6tck_.js → PublicFormsPage-D3uCTR-8.js} +1 -1
  31. package/dist/assets/RecordDetailView-DgR_zhP4.js +3 -0
  32. package/dist/assets/RecordFormPage-kiJI-ieF.js +1 -0
  33. package/dist/assets/ReportDefaultInspector-BIinF0EQ.js +1 -0
  34. package/dist/assets/{ReportView-GIdKJdOt.js → ReportView-BREO-ADE.js} +1 -1
  35. package/dist/assets/{RuntimeDraftBar-BbMdi3Kp.js → RuntimeDraftBar-BCWfd2yS.js} +1 -1
  36. package/dist/assets/SchemaForm-C4uMMZ13.js +3 -0
  37. package/dist/assets/SearchResultsPage-C6Hw_Lpn.js +1 -0
  38. package/dist/assets/{SettingsHub-BGKIj-Zq.js → SettingsHub-DP1mrzEN.js} +1 -1
  39. package/dist/assets/SettingsView-u7mc6pcc.js +1 -0
  40. package/dist/assets/{SkeletonDetail-C8fMI-Mu.js → SkeletonDetail-DIwlbHTr.js} +1 -1
  41. package/dist/assets/{af-BfSmLD34.js → af-DPUgkQl0.js} +1 -1
  42. package/dist/assets/ai-DPBykF2N.js +3 -0
  43. package/dist/assets/{app-shell-eager-leaves-CDVclng4.js → app-shell-eager-leaves-Cf2bM6uT.js} +1 -1
  44. package/dist/assets/{ar-B9ttrM75.js → ar-B-6GTIRU.js} +1 -1
  45. package/dist/assets/{ar-DZ-C1rn-cyl.js → ar-DZ-wEl298ti.js} +1 -1
  46. package/dist/assets/{ar-EG-BaDxKP_o.js → ar-EG-YBT90_S0.js} +1 -1
  47. package/dist/assets/{ar-MA-DbxNEcmd.js → ar-MA-3uT-EYh6.js} +1 -1
  48. package/dist/assets/{ar-SA-DeC5LXcX.js → ar-SA-SiQsjhhc.js} +1 -1
  49. package/dist/assets/{ar-TN-C9KpTFJz.js → ar-TN-CfzXjKzS.js} +1 -1
  50. package/dist/assets/{az-cMerDwRO.js → az-BqAfcNza.js} +1 -1
  51. package/dist/assets/{be-ZTSbszQh.js → be-CQgWXa9_.js} +1 -1
  52. package/dist/assets/{be-tarask-BXZEUrgX.js → be-tarask-BmNg0Sir.js} +1 -1
  53. package/dist/assets/{bg-BDogpmn5.js → bg-D3evgRuS.js} +1 -1
  54. package/dist/assets/{bn-Cz04uxmh.js → bn-uItkARwm.js} +1 -1
  55. package/dist/assets/{bs-CpFnCl-j.js → bs-DueReOpO.js} +1 -1
  56. package/dist/assets/{ca-CHC4M52Z.js → ca-Cr3AHktR.js} +1 -1
  57. package/dist/assets/{ckb-Dxw-RNm8.js → ckb-CTi5BET7.js} +1 -1
  58. package/dist/assets/contracts-DieHW666.js +1 -0
  59. package/dist/assets/{createDerive-DvA_JGNq.js → createDerive-CjN1i5vn.js} +1 -1
  60. package/dist/assets/{cs-DsFaJ5Z7.js → cs-43mFX9jr.js} +1 -1
  61. package/dist/assets/{cy-FH4JFDTs.js → cy-BBSkg3F8.js} +1 -1
  62. package/dist/assets/{da-D1pVjaAq.js → da-C5oA5qcs.js} +1 -1
  63. package/dist/assets/data-adapter-Cymvlczj.js +1 -0
  64. package/dist/assets/{de-AT-DUMQCisj.js → de-AT-CApxwJzu.js} +1 -1
  65. package/dist/assets/{de-DKrxSvnP.js → de-CPtbLlAf.js} +1 -1
  66. package/dist/assets/default-inspector-registry-Bs6GBn00.js +1 -0
  67. package/dist/assets/dist-BF-ssUpn.js +14 -0
  68. package/dist/assets/{el-l3-bHySV.js → el-Dto2xBQU.js} +1 -1
  69. package/dist/assets/en-AU-FVwCiDJO.js +1 -0
  70. package/dist/assets/{en-CA-DGH5NF0a.js → en-CA-DKuJPN1U.js} +1 -1
  71. package/dist/assets/en-GB-DQ_y5VbJ.js +1 -0
  72. package/dist/assets/en-IE-DaXOhsZW.js +1 -0
  73. package/dist/assets/en-IN-CnRZnAom.js +1 -0
  74. package/dist/assets/en-NZ-CBZLEToK.js +1 -0
  75. package/dist/assets/en-ZA-BE59v0wZ.js +1 -0
  76. package/dist/assets/{eo-CL6CXHZx.js → eo-BL8JXIWd.js} +1 -1
  77. package/dist/assets/{es-BIJ0rksI.js → es-BnoaNxsu.js} +1 -1
  78. package/dist/assets/{et-BGgMzjm1.js → et-tPYLNenO.js} +1 -1
  79. package/dist/assets/{eu-CqvAoRrX.js → eu-CUBG6bT0.js} +1 -1
  80. package/dist/assets/{fa-IR-DNz3oA1-.js → fa-IR-Rr2d9xSs.js} +1 -1
  81. package/dist/assets/{fi-DNSfKWuW.js → fi-B0NVIZsV.js} +1 -1
  82. package/dist/assets/{formatLong-CHb9WA3O.js → formatLong-1-gt9bpo.js} +1 -1
  83. package/dist/assets/{fr-DYRJCirJ.js → fr-BbhHek8e.js} +1 -1
  84. package/dist/assets/{fr-CA-CotiswPx.js → fr-CA-CBDvLXFg.js} +1 -1
  85. package/dist/assets/{fr-CH-CpiEYWpc.js → fr-CH-WPNmwPn7.js} +1 -1
  86. package/dist/assets/framework-DFR4HNtj.js +35 -0
  87. package/dist/assets/{fy-B69yM3FE.js → fy-DvOBbvEF.js} +1 -1
  88. package/dist/assets/{gd-BAy8AsX6.js → gd-BQPiTPX5.js} +1 -1
  89. package/dist/assets/getIcon-Cfwf-Egt.js +1 -0
  90. package/dist/assets/{gl-soLn_weL.js → gl-BJCXK8uO.js} +1 -1
  91. package/dist/assets/{gu-B19Yo9yC.js → gu-CctPRz3V.js} +1 -1
  92. package/dist/assets/{he-DYTPo33p.js → he-CVFMk6p2.js} +1 -1
  93. package/dist/assets/{hi-D2dIK7Oy.js → hi-Ba30-RwS.js} +1 -1
  94. package/dist/assets/{highlighted-body-OFNGDK62-CExufvVt.js → highlighted-body-OFNGDK62-BQ57IrBV.js} +1 -1
  95. package/dist/assets/{hr-BV-VOPMu.js → hr-BZUqTbZs.js} +1 -1
  96. package/dist/assets/{ht-C7MM4qkS.js → ht-BLe05tPx.js} +1 -1
  97. package/dist/assets/{hu-Rha1m2Ym.js → hu-2CQ_Mkww.js} +1 -1
  98. package/dist/assets/{hy-CiTNgbdV.js → hy-CclcPG4H.js} +1 -1
  99. package/dist/assets/i18n-BnUsCaSC.js +17 -0
  100. package/dist/assets/i18n-locale-ar-92O_xtDZ.js +4 -0
  101. package/dist/assets/i18n-locale-de-T5ic3yH9.js +4 -0
  102. package/dist/assets/i18n-locale-en-rxr7WJYl.js +4 -0
  103. package/dist/assets/i18n-locale-es-D_WOifJ_.js +4 -0
  104. package/dist/assets/i18n-locale-fr-3cvyjMkp.js +4 -0
  105. package/dist/assets/i18n-locale-ja-DXlIkB8I.js +4 -0
  106. package/dist/assets/i18n-locale-ko-DngRpS45.js +4 -0
  107. package/dist/assets/i18n-locale-pt-BkPaFCqZ.js +4 -0
  108. package/dist/assets/i18n-locale-ru-E5wLh-y6.js +4 -0
  109. package/dist/assets/i18n-locale-zh-BL4_Yand.js +4 -0
  110. package/dist/assets/{i18n-runtime-CTgAQF4N.js → i18n-runtime-97_bDVjP.js} +1 -1
  111. package/dist/assets/{id-Cijsfjt-.js → id-6JLB8s-f.js} +1 -1
  112. package/dist/assets/index-Cadlh4t_.css +2 -0
  113. package/dist/assets/index-D98sa5GF.js +20 -0
  114. package/dist/assets/{infrastructure-BHSync5f.js → infrastructure-Cc34lEqb.js} +2 -2
  115. package/dist/assets/integration-CeAF4JFT.js +1 -0
  116. package/dist/assets/{is-xS1WTyeC.js → is-to0CWzm1.js} +1 -1
  117. package/dist/assets/isSameWeek-DBXaA1Gd.js +1 -0
  118. package/dist/assets/{it-CH-l516ZNXj.js → it-CH-DhdfjP5Z.js} +1 -1
  119. package/dist/assets/{it-C2i_c9sd.js → it-ea0B8Ujp.js} +1 -1
  120. package/dist/assets/{ja-D9_ewLny.js → ja-B1bzkgDW.js} +1 -1
  121. package/dist/assets/{ja-Hira-D_6ExgHw.js → ja-Hira-CMrY5hXO.js} +1 -1
  122. package/dist/assets/{ka-BYHGyees.js → ka-DKSXLnXP.js} +1 -1
  123. package/dist/assets/{kk-CbTFtuqb.js → kk-DHwMv8Dn.js} +1 -1
  124. package/dist/assets/{km-Dr2gwhIn.js → km-tpLG1xNr.js} +1 -1
  125. package/dist/assets/{kn-CprH8JD7.js → kn-MLreVnHA.js} +1 -1
  126. package/dist/assets/{ko-CsFS2u5i.js → ko-CI0DBazn.js} +1 -1
  127. package/dist/assets/{lb-CbFKN7Ob.js → lb-CmL572Xe.js} +1 -1
  128. package/dist/assets/{lt-Bq0xkLp0.js → lt-DRtUOLdw.js} +1 -1
  129. package/dist/assets/{lv-Cj6vg6Qo.js → lv-COSHgkOP.js} +1 -1
  130. package/dist/assets/{match-C_jFGO9e.js → match-B-ergJQb.js} +1 -1
  131. package/dist/assets/{match-CiPp9BME.js → match-BQoOW8Cj.js} +1 -1
  132. package/dist/assets/{match-Co4ivumx.js → match-dfBS0YSQ.js} +1 -1
  133. package/dist/assets/mermaid-GHXKKRXX-Bb17TtNP.js +1 -0
  134. package/dist/assets/metadata-admin-CABUxbJl.js +9 -0
  135. package/dist/assets/{mk-MXFM99YL.js → mk-B0IH_YL_.js} +1 -1
  136. package/dist/assets/{mn-D5Q9B6Jt.js → mn-P-QdQ2n3.js} +1 -1
  137. package/dist/assets/{ms-CCzPRldx.js → ms-CtyEOINy.js} +1 -1
  138. package/dist/assets/{mt-mjJpN6xW.js → mt-DfuZ2HRm.js} +1 -1
  139. package/dist/assets/{nb-BIlNqdEb.js → nb-2Hp-5Tnt.js} +1 -1
  140. package/dist/assets/{nl-BE-FwXjQsmV.js → nl-BE-mmxbfNoR.js} +1 -1
  141. package/dist/assets/{nl-D2uBtIxG.js → nl-CZ_nLREz.js} +1 -1
  142. package/dist/assets/{nn-B0loJ7SV.js → nn-ccWhYsNa.js} +1 -1
  143. package/dist/assets/{oc-U7-yH1sO.js → oc-z504BFRV.js} +1 -1
  144. package/dist/assets/{pl-mTy0JYgi.js → pl-DeQ7ASt-.js} +1 -1
  145. package/dist/assets/plugin-calendar-Cn5HaZU8.js +1 -0
  146. package/dist/assets/plugin-charts-B6RcFWbo.js +7 -0
  147. package/dist/assets/plugin-chatbot-Ck47EhDX.js +122 -0
  148. package/dist/assets/plugin-dashboard-DjEx8e5Y.js +6 -0
  149. package/dist/assets/plugin-form-CLDvL0up.js +1 -0
  150. package/dist/assets/plugin-gantt-CrVrxVdi.js +63 -0
  151. package/dist/assets/plugin-grid-D2rmQEW_.js +11 -0
  152. package/dist/assets/plugin-kanban-BUNHFfIC.js +1 -0
  153. package/dist/assets/plugin-map-y-7RQQC5.js +1 -0
  154. package/dist/assets/{plugin-markdown-D1nTQc1T.js → plugin-markdown-BOkHcir_.js} +1 -1
  155. package/dist/assets/plugin-report-mT3jpna0.js +59 -0
  156. package/dist/assets/plugin-timeline-B1EF83D3.js +1 -0
  157. package/dist/assets/plugin-tree-MTHUt3_S.js +1 -0
  158. package/dist/assets/plugin-view-DHJI-ahf.js +1 -0
  159. package/dist/assets/plugins-views-CfkgqD30.js +3 -0
  160. package/dist/assets/{pt-BR-2KtO5Js1.js → pt-BR-D80_lPYF.js} +1 -1
  161. package/dist/assets/{pt-Bet5OOQf.js → pt-CJJ1RmXd.js} +1 -1
  162. package/dist/assets/{ro-37U6sgzi.js → ro-EuFb2TCj.js} +1 -1
  163. package/dist/assets/{ru-CyuAY-5E.js → ru-CMaVQScp.js} +1 -1
  164. package/dist/assets/{runtime-metadata-persistence-afAW-MeD.js → runtime-metadata-persistence-ClOTznqa.js} +1 -1
  165. package/dist/assets/{se-DeJabuC6.js → se-DsfdKLdF.js} +1 -1
  166. package/dist/assets/{sk-DWEpjfkR.js → sk-BNV9omI8.js} +1 -1
  167. package/dist/assets/{sl-4oSvNhIR.js → sl-DJS_nINU.js} +1 -1
  168. package/dist/assets/{sq-BjkBCaXW.js → sq-HEgjcbHe.js} +1 -1
  169. package/dist/assets/{sr-Dxm1DsRS.js → sr-CO0CFu4X.js} +1 -1
  170. package/dist/assets/{sr-Latn-Dawg6oP2.js → sr-Latn-eE1Idzey.js} +1 -1
  171. package/dist/assets/{src-C8NYjdVm.js → src-BU7L2v4J.js} +1 -1
  172. package/dist/assets/src-BUtIBFDA.js +1 -0
  173. package/dist/assets/src-C0eXlKtx.js +16 -0
  174. package/dist/assets/{studioEntry-nXQP3iL0.js → studioEntry-WeMfaSGn.js} +1 -1
  175. package/dist/assets/{submitRedirect-jK-cEIbP.js → submitRedirect-C2lfZSHt.js} +1 -1
  176. package/dist/assets/{sv-CROOGJGz.js → sv-5uTzgQT3.js} +1 -1
  177. package/dist/assets/{ta-BZnTmFI_.js → ta-BzgdkBZG.js} +1 -1
  178. package/dist/assets/{te-BN0v0x5t.js → te-Ct_pl7ZJ.js} +1 -1
  179. package/dist/assets/{th-CBjKhp_U.js → th-DouAlk0-.js} +1 -1
  180. package/dist/assets/{tr-x0Ne4N4H.js → tr-3XNBsI40.js} +1 -1
  181. package/dist/assets/types-zod-DXpXw10W.js +1 -0
  182. package/dist/assets/{ug-sgzNhsKo.js → ug-B9n24h9G.js} +1 -1
  183. package/dist/assets/ui-components-D6cEVg0T.js +37 -0
  184. package/dist/assets/ui-layout-DgVDuPEM.js +1 -0
  185. package/dist/assets/{uk-o_DQ5VHJ.js → uk-DCAenByf.js} +1 -1
  186. package/dist/assets/use-book-data-CwRldFxP.js +1 -0
  187. package/dist/assets/{useActionModal-CSvbHkQ7.js → useActionModal-Blp4rhOk.js} +1 -1
  188. package/dist/assets/useCanAuthorMetadata-BxCMgFRf.js +1 -0
  189. package/dist/assets/useNavSelDeepLink-67Y4qCNO.js +1 -0
  190. package/dist/assets/useNavTargetLabel-BOJncjIb.js +1 -0
  191. package/dist/assets/{useOpenRecordList-B5-qaFUx.js → useOpenRecordList-BrwJFojQ.js} +1 -1
  192. package/dist/assets/{usePackageL10n-CMx66am-.js → usePackageL10n-Ci9uVkRZ.js} +1 -1
  193. package/dist/assets/{useSettingsLabel-Kkr2q0Oo.js → useSettingsLabel-CeMnMWsh.js} +1 -1
  194. package/dist/assets/{uz-Cyrl-DbtkQtz_.js → uz-Cyrl-JSeHEqu-.js} +1 -1
  195. package/dist/assets/{uz-Be41d4jl.js → uz-DT3s9bZS.js} +1 -1
  196. package/dist/assets/vendor-objectstack-DFqu45yM.js +138 -0
  197. package/dist/assets/{vi-84mZmklk.js → vi-D2p-h6bY.js} +1 -1
  198. package/dist/assets/{zh-CN-DD1reegJ.js → zh-CN-DHOKqAit.js} +1 -1
  199. package/dist/assets/{zh-HK-B05u30WI.js → zh-HK-D4iIPY7I.js} +1 -1
  200. package/dist/assets/{zh-TW-Bb-WimPD.js → zh-TW-gORQ_tZh.js} +1 -1
  201. package/dist/chunk-membership.json +100 -90
  202. package/dist/eager-closure.json +110 -110
  203. package/dist/index.html +4 -4
  204. package/dist/sdui.manifest.json +520 -60
  205. package/package.json +1 -1
  206. package/dist/assets/AppDocsIndex-F4zDq2zz.js +0 -1
  207. package/dist/assets/ApprovalsInboxPage-DrEUmaDb.js +0 -1
  208. package/dist/assets/AuditLogPage-CoghqsZb.js +0 -1
  209. package/dist/assets/DashboardView-CGC-_Om8.js +0 -1
  210. package/dist/assets/DocPage-CIZE5kdj.js +0 -1
  211. package/dist/assets/DocsSlug-DXdFdwlS.js +0 -1
  212. package/dist/assets/ExpressionProvider-DZfMwyMs.js +0 -1
  213. package/dist/assets/MarketplacePackagePage-C7NOu2Ir.js +0 -4
  214. package/dist/assets/PageView-CVLgCRSF.js +0 -1
  215. package/dist/assets/RecordDetailView-DQKydU7X.js +0 -3
  216. package/dist/assets/RecordFormPage-BTjwxJIA.js +0 -1
  217. package/dist/assets/ReportDefaultInspector-DdsQAkd7.js +0 -1
  218. package/dist/assets/SchemaForm-C8X1ve4p.js +0 -3
  219. package/dist/assets/SearchResultsPage-Jwhqsdyo.js +0 -1
  220. package/dist/assets/SettingsView-D8SMKdrc.js +0 -1
  221. package/dist/assets/appRoute-DbnWDEa1.js +0 -1
  222. package/dist/assets/data-adapter-DMbe6Njk.js +0 -1
  223. package/dist/assets/default-inspector-registry-CpL3fFhl.js +0 -1
  224. package/dist/assets/dist-BXrEV1ag.js +0 -13
  225. package/dist/assets/en-AU-C6x7mDhH.js +0 -1
  226. package/dist/assets/en-GB-0-nho2eK.js +0 -1
  227. package/dist/assets/en-IE-2fC3BkfV.js +0 -1
  228. package/dist/assets/en-IN-C1QcFhxn.js +0 -1
  229. package/dist/assets/en-NZ-C80ptZT7.js +0 -1
  230. package/dist/assets/en-ZA-ByZDrjeb.js +0 -1
  231. package/dist/assets/framework-DcWkeiND.js +0 -35
  232. package/dist/assets/getIcon-BEVyC4y3.js +0 -1
  233. package/dist/assets/i18n-CEKxYdmD.js +0 -9
  234. package/dist/assets/i18n-locale-ar-DN7sl3GF.js +0 -4
  235. package/dist/assets/i18n-locale-de-C40JErvb.js +0 -4
  236. package/dist/assets/i18n-locale-en-CITPDIHy.js +0 -4
  237. package/dist/assets/i18n-locale-es-C8DdWN6c.js +0 -4
  238. package/dist/assets/i18n-locale-fr-COIdEZZl.js +0 -4
  239. package/dist/assets/i18n-locale-ja-DYF_rU_s.js +0 -4
  240. package/dist/assets/i18n-locale-ko-B-ODYAtX.js +0 -4
  241. package/dist/assets/i18n-locale-pt-CK1SyBIm.js +0 -4
  242. package/dist/assets/i18n-locale-ru-jLzvShMO.js +0 -4
  243. package/dist/assets/i18n-locale-zh-Bf9Gbbvl.js +0 -4
  244. package/dist/assets/index-CLyvpiGc.css +0 -2
  245. package/dist/assets/index-CfnfGw5W.js +0 -20
  246. package/dist/assets/isSameWeek-DWYeNyh8.js +0 -1
  247. package/dist/assets/mermaid-GHXKKRXX-DVLc_uym.js +0 -1
  248. package/dist/assets/metadata-admin-CybaOCdO.js +0 -9
  249. package/dist/assets/nav-selection-Dzm_mA3C.js +0 -1
  250. package/dist/assets/plugin-calendar-CKRBcML7.js +0 -1
  251. package/dist/assets/plugin-charts-DGTJxXCB.js +0 -7
  252. package/dist/assets/plugin-chatbot-DwtwNA-y.js +0 -122
  253. package/dist/assets/plugin-dashboard-C1AYKmGX.js +0 -6
  254. package/dist/assets/plugin-form-CV8ZY04-.js +0 -1
  255. package/dist/assets/plugin-gantt-BRIb2_8G.js +0 -63
  256. package/dist/assets/plugin-grid-C9h7mRVv.js +0 -11
  257. package/dist/assets/plugin-kanban-BcJ0Dhys.js +0 -1
  258. package/dist/assets/plugin-map-D24ZUOUj.js +0 -1
  259. package/dist/assets/plugin-report-BfGintAq.js +0 -59
  260. package/dist/assets/plugin-timeline-CbBRq_qt.js +0 -1
  261. package/dist/assets/plugin-tree-BNX2A5J5.js +0 -1
  262. package/dist/assets/plugin-view-DzWQWYyH.js +0 -1
  263. package/dist/assets/plugins-views-DraK4xz0.js +0 -3
  264. package/dist/assets/src-B8lv0plz.js +0 -18
  265. package/dist/assets/src-DoDvT77T.js +0 -1
  266. package/dist/assets/types-zod-Y2RwUUeJ.js +0 -1
  267. package/dist/assets/ui-components-BTB1NkUW.js +0 -37
  268. package/dist/assets/ui-layout-bZfafwJa.js +0 -1
  269. package/dist/assets/use-book-data-C3eyZJSG.js +0 -1
  270. package/dist/assets/vendor-objectstack-XuWC71M9.js +0 -266
  271. package/dist/assets/vendor-zod-CHLW1iCr.js +0 -64
@@ -21,8 +21,11 @@
21
21
  },
22
22
  {
23
23
  "name": "label",
24
- "type": "string",
25
- "description": "Grid label, used as the table caption and as the export file title. The canonical spelling — the deprecated `title` is only read when this is absent."
24
+ "type": [
25
+ "string",
26
+ "object"
27
+ ],
28
+ "description": "Grid label, used as the table caption, as the export file title and in the record-detail overlay heading. The canonical spelling — the deprecated `title` is only read when this is absent. Accepts either a plain string or an inline per-locale map (`{ en: \"Accounts\", \"zh-CN\": \"客户\" }`) — the `I18nLabel` union the contract admits on this key — and the grid resolves the map against the display locale (the workspace's regional default when one is configured, otherwise the active UI language), falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry."
26
29
  },
27
30
  {
28
31
  "name": "sort",
@@ -271,21 +274,28 @@
271
274
  },
272
275
  {
273
276
  "name": "title",
274
- "type": "string"
277
+ "type": [
278
+ "string",
279
+ "object"
280
+ ],
281
+ "description": "Heading of the drawer and modal presentations (`formType: \"drawer\"` / `\"modal\"`). Accepts either a plain string or an inline per-locale map (`{ en: \"New order\", \"zh-CN\": \"新建订单\" }`) — the `I18nLabel` union the contract admits on this key — and the form resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry."
275
282
  },
276
283
  {
277
284
  "name": "description",
278
- "type": "string"
285
+ "type": [
286
+ "string",
287
+ "object"
288
+ ],
289
+ "description": "Subtitle under the drawer and modal heading. Accepts either a plain string or an inline per-locale map (`{ en: \"Enter the order details\", \"zh-CN\": \"填写订单信息\" }`), resolved against the active UI language with the same fallback chain as `title`."
279
290
  },
280
291
  {
281
292
  "name": "layout",
282
293
  "type": "enum",
283
294
  "enum": [
284
295
  "vertical",
285
- "horizontal",
286
- "inline",
287
- "grid"
288
- ]
296
+ "horizontal"
297
+ ],
298
+ "description": "Label placement: `vertical` puts each label above its field (the default), `horizontal` beside it."
289
299
  },
290
300
  {
291
301
  "name": "columns",
@@ -357,7 +367,7 @@
357
367
  {
358
368
  "name": "modalCloseButton",
359
369
  "type": "boolean",
360
- "description": "Show the modal presentation’s close button. Read at ObjectForm.tsx:361 and honoured by ModalForm."
370
+ "description": "Show the modal presentation’s close (X) button. Default `true`; `false` hides it. Forwarded by `ObjectForm`’s modal route and honoured by `ModalForm` on both of its dialog arms. With the button hidden the modal still closes on Escape, and on the Cancel action when that is shown."
361
371
  },
362
372
  {
363
373
  "name": "contentLayout",
@@ -366,7 +376,7 @@
366
376
  "simple",
367
377
  "tabbed"
368
378
  ],
369
- "description": "How the modal presentation lays out sections. `tabbed` needs more than one section to differ from `simple` (ModalForm.tsx:638)."
379
+ "description": "How the modal presentation lays out sections. `tabbed` differs from `simple` only when more than one section has a field to show (`ModalForm` tests `schema.contentLayout === \"tabbed\" && groups.length > 1`)."
370
380
  },
371
381
  {
372
382
  "name": "confirmOnDiscard",
@@ -400,21 +410,35 @@
400
410
  },
401
411
  {
402
412
  "name": "submitText",
403
- "type": "string"
413
+ "type": [
414
+ "string",
415
+ "object"
416
+ ],
417
+ "description": "Label of the Save button. A map no locale limb resolves shows the default label. Accepts either a plain string or an inline per-locale map (`{ en: \"Save order\", \"zh-CN\": \"保存订单\" }`), resolved against the active UI language with the same fallback chain as `title`."
404
418
  },
405
419
  {
406
420
  "name": "cancelText",
407
- "type": "string"
421
+ "type": [
422
+ "string",
423
+ "object"
424
+ ],
425
+ "description": "Label of the Cancel button. Accepts either a plain string or an inline per-locale map (`{ en: \"Back\", \"zh-CN\": \"返回\" }`), resolved against the active UI language with the same fallback chain as `title`."
408
426
  },
409
427
  {
410
428
  "name": "nextText",
411
- "type": "string",
412
- "description": "Label of the next-step button (wizard)."
429
+ "type": [
430
+ "string",
431
+ "object"
432
+ ],
433
+ "description": "Label of the next-step button (wizard). Accepts either a plain string or an inline per-locale map (`{ en: \"Continue\", \"zh-CN\": \"继续\" }`), resolved against the active UI language with the same fallback chain as `title`."
413
434
  },
414
435
  {
415
436
  "name": "prevText",
416
- "type": "string",
417
- "description": "Label of the previous-step button (wizard)."
437
+ "type": [
438
+ "string",
439
+ "object"
440
+ ],
441
+ "description": "Label of the previous-step button (wizard). Accepts either a plain string or an inline per-locale map (`{ en: \"Previous\", \"zh-CN\": \"上一步\" }`), resolved against the active UI language with the same fallback chain as `title`."
418
442
  },
419
443
  {
420
444
  "name": "showSubmit",
@@ -435,8 +459,11 @@
435
459
  },
436
460
  {
437
461
  "name": "successMessage",
438
- "type": "string",
439
- "description": "Toast shown after a successful submit. Ignored when `submitBehavior` or `navigateOnSuccess` is set."
462
+ "type": [
463
+ "string",
464
+ "object"
465
+ ],
466
+ "description": "Toast shown after a successful submit. Ignored when `submitBehavior` or `navigateOnSuccess` is set. Accepts either a plain string or an inline per-locale map (`{ en: \"Order saved\", \"zh-CN\": \"订单已保存\" }`), resolved against the active UI language with the same fallback chain as `title`."
440
467
  },
441
468
  {
442
469
  "name": "navigateOnSuccess",
@@ -543,20 +570,31 @@
543
570
  {
544
571
  "name": "fields",
545
572
  "type": "array",
546
- "description": "Which parent fields to show, in order — and it is NOT ignored when `sections` is given: the two INTERSECT. The parent field pool is built from this key first and every section then resolves its own members against that pool, so a section member this key does not list is dropped from the rendered form, and a section that loses EVERY member that way disappears with its heading. Each such drop is reported once via `console.warn` (objectui#9884); it is not repaired, because this key is also the parent pool for values, create defaults and the submitted set. Author one or the other, or list every section member here too. Members are bare field names (`{ name }` tolerated); NOT the spec `FormFieldSchema` object `sections[].fields` accepts (identity key `field`) — that shape resolves to no name here and is silently skipped (the parent form renders through the same `ObjectForm` / `SimpleObjectForm` as `object-form` — see its `fields` description)."
573
+ "description": "Which parent fields to show, in order — and it is NOT ignored when `sections` is given: the two INTERSECT. The parent field pool is built from this key first and every section then resolves its own members against that pool, so a section member this key does not list is dropped from the rendered form, and a section that loses EVERY member that way disappears with its heading. Each such drop is reported once via `console.warn` (objectui#9884); it is not repaired, because this key bounds what the form DRAWS and edits, not what Save writes: on a create, the submitted set is the drawn fields plus any parent value seeded through `initialValues` (or its alternate spelling `initialData`), drawn or not. A seed for an undeclared, server-owned, computed or read-only field is still stripped, as on any save. Author one or the other, or list every section member here too. Members are bare field names (`{ name }` tolerated); NOT the spec `FormFieldSchema` object `sections[].fields` accepts (identity key `field`) — that shape resolves to no name here and is silently skipped (the parent form renders through the same `ObjectForm` / `SimpleObjectForm` as `object-form` — see its `fields` description)."
547
574
  },
548
575
  {
549
576
  "name": "title",
550
- "type": "string"
577
+ "type": [
578
+ "string",
579
+ "object"
580
+ ],
581
+ "description": "Names the record in the built-in \"… saved\" toast after an edit save, which shows only when the host supplies no `onSuccess`. Accepts either a plain string or an inline per-locale map (`{ en: \"Purchase order\", \"zh-CN\": \"采购单\" }`) — the `I18nLabel` union the contract admits on this key — and the renderer resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry."
551
582
  },
552
583
  {
553
584
  "name": "submitText",
554
- "type": "string",
555
- "description": "Label of the button that saves the parent and every detail row in one batch."
585
+ "type": [
586
+ "string",
587
+ "object"
588
+ ],
589
+ "description": "Label of the button that saves the parent and every detail row in one batch. Defaults to \"Save\" when editing a record (`mode: \"edit\"` with a `recordId`) and to \"Create\" otherwise, in the active UI language; an empty string, or a map no locale limb resolves, shows the default too. Accepts either a plain string or an inline per-locale map (`{ en: \"Save order\", \"zh-CN\": \"保存订单\" }`), resolved against the active UI language with the same fallback chain as `title`."
556
590
  },
557
591
  {
558
592
  "name": "cancelText",
559
- "type": "string"
593
+ "type": [
594
+ "string",
595
+ "object"
596
+ ],
597
+ "description": "Label of the Cancel button, which renders only when the host supplies an `onCancel` callback (a runtime slot, not authorable in a JSON document). Defaults to \"Cancel\", in the active UI language; an empty string, or a map no locale limb resolves, shows the default too. Accepts either a plain string or an inline per-locale map (`{ en: \"Back\", \"zh-CN\": \"返回\" }`), resolved against the active UI language with the same fallback chain as `title`."
560
598
  },
561
599
  {
562
600
  "name": "showSubmit",
@@ -653,6 +691,11 @@
653
691
  "type": "array",
654
692
  "description": "Per-card style rules, each evaluated against that card’s own record. Two member dialects are accepted: the native `{ field, operator, value, backgroundColor?, borderColor? }` and the spec CEL `{ condition, backgroundColor?, borderColor? }`. A matching rule colours that card alone. A rule comparing a relation field sees the stored foreign key rather than the expanded record."
655
693
  },
694
+ {
695
+ "name": "navigation",
696
+ "type": "object",
697
+ "description": "What a card click opens — the `{ mode, size, openNewTab, preventNavigation }` block a list view declares. With the key ABSENT a click opens the record in a drawer. `mode` is an overlay (`drawer`, `modal`, `split`, `popover`), `new_window`, `page` or `none`; write it whenever the block is written, because a block without `mode` takes the spec’s `page` default and `page` opens nothing on a board no parent view navigates for. `openNewTab: true` opens the record page in a new tab and outranks the mode, `preventNavigation: true` opens nothing, and `size` sets the overlay width. A click handler from a parent view outranks the whole key."
698
+ },
656
699
  {
657
700
  "name": "dataSource",
658
701
  "type": "object",
@@ -668,7 +711,7 @@
668
711
  {
669
712
  "name": "objectName",
670
713
  "type": "string",
671
- "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`; the `object-calendar` schema refuses a block that declares none of them."
714
+ "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`; the `object-calendar` schema refuses a block that declares none of them, unless the node's `dataSource.object` names the object, which then lands on this key."
672
715
  },
673
716
  {
674
717
  "name": "calendar",
@@ -715,6 +758,11 @@
715
758
  "type": "boolean",
716
759
  "description": "External loading state, honoured ONLY alongside an array `data`: it then replaces the calendar with its loading placeholder. On a calendar fed by `staticData` or by `objectName` it is dropped, because that calendar owns its own loading state."
717
760
  },
761
+ {
762
+ "name": "navigation",
763
+ "type": "object",
764
+ "description": "What an event click opens — the `{ mode, size, openNewTab, preventNavigation }` block a list view declares. With the key ABSENT a click opens the record in a drawer. `mode` is an overlay (`drawer`, `modal`, `split`, `popover`), `new_window`, `page` or `none`; write it whenever the block is written, because a block without `mode` takes the spec’s `page` default and `page` opens nothing on a calendar no parent view navigates for. `openNewTab: true` opens the record page in a new tab and outranks the mode, `preventNavigation: true` opens nothing, and `size` sets the overlay width. An overlay mode wins over a parent view’s click handler; any other mode hands the click to it."
765
+ },
718
766
  {
719
767
  "name": "dataSource",
720
768
  "type": "object",
@@ -730,7 +778,7 @@
730
778
  {
731
779
  "name": "objectName",
732
780
  "type": "string",
733
- "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`; the `object-gantt` schema refuses a block that declares none of them."
781
+ "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`; the `object-gantt` schema refuses a block that declares none of them, unless the node's `dataSource.object` names the object, which then lands on this key."
734
782
  },
735
783
  {
736
784
  "name": "gantt",
@@ -747,6 +795,16 @@
747
795
  "type": "array",
748
796
  "description": "Inline records, read SECOND on the record-source ladder: a `data` configuration wins and this key is then never reached, while `objectName` is read AFTER it, so a gantt carrying both charts these rows and never queries that object. `filter` and `sort` narrow and order these rows exactly as they do fetched ones."
749
797
  },
798
+ {
799
+ "name": "filter",
800
+ "type": "array",
801
+ "description": "Base query filter in the rule-array form `[{ field, operator, value }, ...]`, narrowing the tasks the gantt charts — from every record source it reads: the object, an `api` request, or inline rows. Context tokens such as `{current_user_id}` are resolved first, then the filter is lowered to `$filter` on the query. The MongoDB-style record form is not this key’s shape."
802
+ },
803
+ {
804
+ "name": "sort",
805
+ "type": "array",
806
+ "description": "Task order in `[{ field, order }]` form, ordering the rows the gantt charts. Lowered to `$orderby` on the same query."
807
+ },
750
808
  {
751
809
  "name": "dataSource",
752
810
  "type": "object",
@@ -773,6 +831,21 @@
773
831
  "gantt"
774
832
  ]
775
833
  },
834
+ {
835
+ "name": "filter",
836
+ "type": "array",
837
+ "description": "Base query filter in the rule-array form `[{ field, operator, value }, ...]`, narrowing the records the timeline fetches. Context tokens such as `{current_user_id}` are resolved first, then the filter is lowered to `$filter` on the query. Authored `items` or `data` suppress that query, so the key then narrows nothing. The MongoDB-style record form is not this key’s shape."
838
+ },
839
+ {
840
+ "name": "sort",
841
+ "type": "array",
842
+ "description": "Entry order in `[{ field, order }]` form, ordering the records the timeline fetches. Lowered to `$orderby` on the same query."
843
+ },
844
+ {
845
+ "name": "navigation",
846
+ "type": "object",
847
+ "description": "What an entry click opens — the `{ mode, size, openNewTab, preventNavigation }` block a list view declares. Write it with `mode`: with the key ABSENT, or with a block that omits `mode` (it takes the spec’s `page` default), a click opens nothing on a timeline no parent view navigates for. `drawer`, `modal` and `popover` open the entry’s record in that overlay; `new_window` opens the record page in a new tab; `page`, `none` and `split` open nothing here, because the timeline hands the split shell no main panel. `openNewTab: true` opens the record page in a new tab and outranks the mode, `preventNavigation: true` opens nothing, and `size` sets the overlay width. A click handler from a parent view outranks the whole key."
848
+ },
776
849
  {
777
850
  "name": "dataSource",
778
851
  "type": "object",
@@ -788,7 +861,7 @@
788
861
  {
789
862
  "name": "objectName",
790
863
  "type": "string",
791
- "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`; the `object-map` schema refuses a block that declares none of them."
864
+ "description": "ObjectQL object name. The record source is one of `data`, `staticData` and `objectName`, or the node’s `dataSource` binding; the `object-map` schema refuses a block that declares none of them."
792
865
  },
793
866
  {
794
867
  "name": "map",
@@ -805,6 +878,16 @@
805
878
  "type": "array",
806
879
  "description": "Inline records, read SECOND on the record-source ladder: a `data` configuration wins and this key is then never reached, while `objectName` is read AFTER it, so a map carrying both plots these rows and never queries that object. `filter` and `sort` narrow and order these rows exactly as they do fetched ones."
807
880
  },
881
+ {
882
+ "name": "filter",
883
+ "type": "array",
884
+ "description": "Base query filter in the rule-array form `[{ field, operator, value }, ...]`, narrowing the markers the map plots — fetched rows and inline (`staticData`, `{ provider: 'value' }`) rows alike. Context tokens such as `{current_user_id}` are resolved first, then the filter is lowered to `$filter` on the query. The MongoDB-style record form is not this key’s shape."
885
+ },
886
+ {
887
+ "name": "sort",
888
+ "type": "array",
889
+ "description": "Marker order in `[{ field, order }]` form, ordering the rows the map plots. Lowered to `$orderby` on the same query."
890
+ },
808
891
  {
809
892
  "name": "dataSource",
810
893
  "type": "object",
@@ -840,7 +923,11 @@
840
923
  },
841
924
  {
842
925
  "name": "label",
843
- "type": "string"
926
+ "type": [
927
+ "string",
928
+ "object"
929
+ ],
930
+ "description": "Heading of the tile, and of the drill-down panel when `title` is not set. Accepts either a plain string or an inline per-locale map (`{ en: \"Pipeline\", \"zh-CN\": \"销售管道\" }`) — the `I18nLabel` union the contract admits on this key — and the tile resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry."
844
931
  },
845
932
  {
846
933
  "name": "aggregate",
@@ -853,13 +940,19 @@
853
940
  },
854
941
  {
855
942
  "name": "description",
856
- "type": "string",
857
- "description": "Helper text rendered under the value."
943
+ "type": [
944
+ "string",
945
+ "object"
946
+ ],
947
+ "description": "Helper text rendered under the value. Accepts either a plain string or an inline per-locale map (`{ en: \"This quarter\", \"zh-CN\": \"本季度\" }`), resolved against the active UI language with the same fallback chain as `label`."
858
948
  },
859
949
  {
860
950
  "name": "title",
861
- "type": "string",
862
- "description": "Heading of the drill-down panel. Defaults to `label` — set it only when the records list wants a different name from the tile."
951
+ "type": [
952
+ "string",
953
+ "object"
954
+ ],
955
+ "description": "Heading of the drill-down panel. Defaults to `label` — set it only when the records list wants a different name from the tile. Accepts either a plain string or an inline per-locale map (`{ en: \"Open deals\", \"zh-CN\": \"进行中的商机\" }`), resolved against the active UI language with the same fallback chain as `label`."
863
956
  },
864
957
  {
865
958
  "name": "filter",
@@ -1158,6 +1251,23 @@
1158
1251
  "name": "showHeader",
1159
1252
  "type": "boolean",
1160
1253
  "description": "Render the detail body's own title / follow-star / copy-id chip above the fields. Off by default because this block is normally composed under a `page:header` that already draws that chrome, and turning it on there shows the record title twice. Set it true only when this block is the whole page."
1254
+ },
1255
+ {
1256
+ "name": "enforceFieldSecurity",
1257
+ "type": "boolean",
1258
+ "description": "Fold this block's field list through the caller's FIELD-read permissions before rendering, so a field the permission set denies leaves no empty row behind (renderer default: off). Presentation only: it re-applies the same field-read answer the server already enforced (ADR-0066 D3) and never widens access — with it off a denied field still arrives masked or stripped, and with it on the server still decides every value."
1259
+ },
1260
+ {
1261
+ "name": "redactFields",
1262
+ "type": "array",
1263
+ "of": "string",
1264
+ "description": "Field names this block never renders, whatever the permission answer (renderer default: render everything authored). Presentation only, evaluated in the browser after the record is fetched — the values are still in the page, so this is NOT a data-access control and NOT the object's `publicSharing.redactFields`, which removes them server-side. To keep a value from the caller, gate the field itself (`requiredPermissions` / `maskingRule`, ADR-0066 D3) or the permission set. Neighbours `hideFields`, which is the dedupe channel the renderer also writes to."
1265
+ },
1266
+ {
1267
+ "name": "requiredPermissions",
1268
+ "type": "array",
1269
+ "of": "string",
1270
+ "description": "[ADR-0066] Capabilities the user must ALL hold — names that permission sets grant through `systemPermissions`, not object actions: `read` or `update` here is an ordinary capability name, not the object's read or edit permission. When the client has resolved the user's capabilities and any of these is missing, this block does not render its content; wherever it would otherwise render, an insufficient-permissions notice takes its place. Presentation only: it authorises nothing, and the data API still serves the same data to the same user. A client that cannot resolve the user's capabilities (no permission provider, or one that does not report `systemPermissions`) renders this block as if they were held — it fails open."
1161
1271
  }
1162
1272
  ]
1163
1273
  },
@@ -1179,6 +1289,23 @@
1179
1289
  "vertical"
1180
1290
  ],
1181
1291
  "description": "Layout orientation for highlight fields"
1292
+ },
1293
+ {
1294
+ "name": "enforceFieldSecurity",
1295
+ "type": "boolean",
1296
+ "description": "Fold this block's highlight chips through the caller's FIELD-read permissions before rendering, so a field the permission set denies leaves no empty chip behind (renderer default: off). Presentation only: it re-applies the same field-read answer the server already enforced (ADR-0066 D3) and never widens access — the record is fetched either way and the server still decides every value."
1297
+ },
1298
+ {
1299
+ "name": "redactFields",
1300
+ "type": "array",
1301
+ "of": "string",
1302
+ "description": "Field names this block never renders as a chip, whatever the permission answer (renderer default: render every field authored). Presentation only, evaluated in the browser after the record is fetched — the values are still in the page, so this is NOT a data-access control and NOT the object's `publicSharing.redactFields`, which removes them server-side. To keep a value from the caller, gate the field itself (`requiredPermissions` / `maskingRule`, ADR-0066 D3) or the permission set."
1303
+ },
1304
+ {
1305
+ "name": "requiredPermissions",
1306
+ "type": "array",
1307
+ "of": "string",
1308
+ "description": "[ADR-0066] Capabilities the user must ALL hold — names that permission sets grant through `systemPermissions`, not object actions: `read` or `update` here is an ordinary capability name, not the object's read or edit permission. When the client has resolved the user's capabilities and any of these is missing, this block does not render its content; wherever it would otherwise render, an insufficient-permissions notice takes its place. Presentation only: it authorises nothing, and the data API still serves the same data to the same user. A client that cannot resolve the user's capabilities (no permission provider, or one that does not report `systemPermissions`) renders this block as if they were held — it fails open."
1182
1309
  }
1183
1310
  ]
1184
1311
  },
@@ -1227,7 +1354,11 @@
1227
1354
  },
1228
1355
  {
1229
1356
  "name": "title",
1230
- "type": "string"
1357
+ "type": [
1358
+ "string",
1359
+ "object"
1360
+ ],
1361
+ "description": "Heading of the list. Defaults to the related object's label (its translation when one is loaded, otherwise the humanized object name). Accepts either a plain string or an inline per-locale map (`{ en: \"Open tasks\", \"zh-CN\": \"未完成任务\" }`) — the `I18nLabel` union the contract admits on this key — and the list resolves the map against the active UI language, falling back through base language, a region-qualified sibling, `default`, then `en`, and finally to any remaining entry."
1231
1362
  },
1232
1363
  {
1233
1364
  "name": "showViewAll",
@@ -1244,6 +1375,23 @@
1244
1375
  "type": "object",
1245
1376
  "description": "Adds an \"Add\" button that assigns EXISTING records instead of creating one — the m2m/junction case. Shape: `{ picker: { object, valueField?, labelField?, filter? }, linkField?, label? }`. `picker.object` (required) is the object whose records the dialog offers. `picker.valueField` is the field of the picked record used as the link value (default \"id\"); `picker.labelField` is the column shown in the picker rows (default \"name\", and the other columns are derived from that object's schema). With `linkField` set, selecting records CREATES rows in this list's own object as `{ [relationshipField]: parentValue, [linkField]: pickedId }` — the junction case; omit `linkField` and the picked child is RE-PARENTED instead, by setting its own `relationshipField` to this parent. `label` is the button text (default \"Add\", localizable inline). Setting `add` also enables generic link removal on rows when no host delete handler is wired. `picker.filter` restricts which records the dialog offers — a list of `{ field, operator, value }` rules in the same vocabulary as this list's own `filter`, applied as a hard constraint the user cannot widen (it never appears as an editable filter row)."
1246
1377
  },
1378
+ {
1379
+ "name": "enforceFieldSecurity",
1380
+ "type": "boolean",
1381
+ "description": "Fold this list's `columns` through the caller's FIELD-read permissions on the RELATED object before rendering (renderer default: off). Presentation only: it re-applies the same field-read answer the server already enforced (ADR-0066 D3) and never widens access — the rows are fetched either way and the server still decides every value."
1382
+ },
1383
+ {
1384
+ "name": "redactFields",
1385
+ "type": "array",
1386
+ "of": "string",
1387
+ "description": "Field names this list never renders, whatever the permission answer (renderer default: render every column authored or derived). Applies to the authored `columns` AND to the columns the list derives for itself when none are authored. Presentation only, evaluated in the browser after the rows are fetched — the values are still in the page, so this is NOT a data-access control and NOT the object's `publicSharing.redactFields`, which removes them server-side. To keep a value from the caller, gate the field itself (`requiredPermissions` / `maskingRule`, ADR-0066 D3) or the permission set."
1388
+ },
1389
+ {
1390
+ "name": "requiredPermissions",
1391
+ "type": "array",
1392
+ "of": "string",
1393
+ "description": "[ADR-0066] Capabilities the user must ALL hold — names that permission sets grant through `systemPermissions`, not object actions: `read` or `update` here is an ordinary capability name, not the object's read or edit permission. When the client has resolved the user's capabilities and any of these is missing, this block does not render its content; wherever it would otherwise render, an insufficient-permissions notice takes its place. Presentation only: it authorises nothing, and the data API still serves the same data to the same user. A client that cannot resolve the user's capabilities (no permission provider, or one that does not report `systemPermissions`) renders this block as if they were held — it fails open."
1394
+ },
1247
1395
  {
1248
1396
  "name": "dataSource",
1249
1397
  "type": "object",
@@ -1442,7 +1590,7 @@
1442
1590
  "name": "requiredPermissions",
1443
1591
  "type": "array",
1444
1592
  "of": "string",
1445
- "description": "Hide the whole bar unless the user holds these permissions"
1593
+ "description": "[ADR-0066] Capabilities the user must ALL hold — names that permission sets grant through `systemPermissions`, not object actions: `read` or `update` here is an ordinary capability name, not the object's read or edit permission. When the client has resolved the user's capabilities and any of these is missing, this block does not render its content; wherever it would otherwise render, an insufficient-permissions notice takes its place. Presentation only: it authorises nothing, and the data API still serves the same data to the same user. A client that cannot resolve the user's capabilities (no permission provider, or one that does not report `systemPermissions`) renders this block as if they were held — it fails open."
1446
1594
  },
1447
1595
  {
1448
1596
  "name": "location",
@@ -1697,11 +1845,19 @@
1697
1845
  "name": "variant",
1698
1846
  "type": "enum",
1699
1847
  "enum": [
1700
- "heading",
1701
- "subheading",
1848
+ "h1",
1849
+ "h2",
1850
+ "h3",
1851
+ "h4",
1852
+ "h5",
1853
+ "h6",
1702
1854
  "body",
1703
- "caption"
1704
- ]
1855
+ "caption",
1856
+ "overline",
1857
+ "heading",
1858
+ "subheading"
1859
+ ],
1860
+ "description": "One of the nine text styles ui:text uses: h1-h6 (rendered as that heading level), body, caption or overline. heading and subheading are earlier spellings the contract still accepts and renders as h2 and h3; write h2 or h3 instead."
1705
1861
  },
1706
1862
  {
1707
1863
  "name": "align",
@@ -1721,8 +1877,7 @@
1721
1877
  {
1722
1878
  "name": "object",
1723
1879
  "type": "string",
1724
- "required": true,
1725
- "description": "Object the aggregate runs over"
1880
+ "description": "Object the aggregate runs over. Required unless a node-level `dataSource` binding names one; when both are set, `dataSource.object` wins."
1726
1881
  },
1727
1882
  {
1728
1883
  "name": "aggregate",
@@ -1743,7 +1898,8 @@
1743
1898
  },
1744
1899
  {
1745
1900
  "name": "filter",
1746
- "type": "array"
1901
+ "type": "array",
1902
+ "description": "Criteria the aggregate is scoped by. When a node-level `dataSource` binding also supplies a filter (its own, or the saved view its `view` names), the two are AND-combined: neither is dropped."
1747
1903
  },
1748
1904
  {
1749
1905
  "name": "format",
@@ -1761,6 +1917,12 @@
1761
1917
  {
1762
1918
  "name": "suffix",
1763
1919
  "type": "string"
1920
+ },
1921
+ {
1922
+ "name": "dataSource",
1923
+ "type": "object",
1924
+ "binding": "object",
1925
+ "description": "Per-element data binding: { object, view, filter, sort, limit }. Overrides the page-level object context for this block; `view` names a saved view of `object`, and `filter` is ANDed with the view’s own rather than replacing it."
1764
1926
  }
1765
1927
  ]
1766
1928
  },
@@ -1828,16 +1990,23 @@
1828
1990
  {
1829
1991
  "name": "items",
1830
1992
  "type": "array",
1831
- "required": true,
1832
- "description": "Term/description pairs [{ term, description }]"
1993
+ "of": "object",
1994
+ "description": "Term/description pairs [{ term, description }], in order: `term` is the row label, `description` is shown as-is (an object as JSON, an omitted one as an em dash). Omitted or empty renders the \"No details\" state"
1833
1995
  },
1834
1996
  {
1835
1997
  "name": "columns",
1836
1998
  "type": "enum",
1837
1999
  "enum": [
1838
- "1",
1839
- "2"
1840
- ]
2000
+ {
2001
+ "label": "1",
2002
+ "value": 1
2003
+ },
2004
+ {
2005
+ "label": "2",
2006
+ "value": 2
2007
+ }
2008
+ ],
2009
+ "description": "Grid columns from the small breakpoint up: the NUMBER 1 or 2 (default 1)"
1841
2010
  },
1842
2011
  {
1843
2012
  "name": "inline",
@@ -1863,15 +2032,19 @@
1863
2032
  {
1864
2033
  "name": "fields",
1865
2034
  "type": "array",
1866
- "description": "Columns per row — bare names or { field, label? }"
2035
+ "description": "Fields shown after the title on each line, in order: a bare field name, or `{ field }`"
1867
2036
  },
1868
2037
  {
1869
2038
  "name": "filter",
1870
- "type": "array"
2039
+ "type": "array",
2040
+ "of": "object",
2041
+ "description": "Filter rules `[{ field, operator, value }]`. A string `value` may be a context token such as `{current_user_id}`, resolved before the query"
1871
2042
  },
1872
2043
  {
1873
2044
  "name": "sort",
1874
- "type": "array"
2045
+ "type": "array",
2046
+ "of": "object",
2047
+ "description": "Sort order `[{ field, order }]`, applied in list order"
1875
2048
  },
1876
2049
  {
1877
2050
  "name": "limit",
@@ -1935,14 +2108,139 @@
1935
2108
  "name": "size",
1936
2109
  "type": "enum",
1937
2110
  "enum": [
2111
+ "default",
1938
2112
  "sm",
1939
2113
  "md",
1940
- "lg"
1941
- ]
2114
+ "lg",
2115
+ "icon"
2116
+ ],
2117
+ "description": "Button size: the Button primitive's `default`, `sm`, `lg` or `icon`, plus `md`, which renders as `default` (default: `default`)"
1942
2118
  },
1943
2119
  {
1944
2120
  "name": "className",
1945
2121
  "type": "string"
2122
+ },
2123
+ {
2124
+ "name": "visible",
2125
+ "type": [
2126
+ "boolean",
2127
+ "string",
2128
+ "object"
2129
+ ],
2130
+ "description": "Visibility predicate: `true`/`false`, a bare CEL expression, or the `{ dialect: 'cel', source }` envelope, evaluated against the row the host binds; the button is not rendered when it is false, nor when the predicate fails to evaluate. Omit for always-visible"
2131
+ },
2132
+ {
2133
+ "name": "disabled",
2134
+ "type": [
2135
+ "boolean",
2136
+ "string",
2137
+ "object"
2138
+ ],
2139
+ "description": "Disabled predicate, in the same three shapes as `visible`: the button is shown but cannot be pressed while it holds. Omit for never-disabled"
2140
+ },
2141
+ {
2142
+ "name": "params",
2143
+ "type": "array",
2144
+ "description": "The parameters to collect from the user before the action runs (`ActionParam` objects: `name`, `type`, `label`, …); each collected value reaches the executor under its parameter `name`. Static execution values ride `properties.params` instead"
2145
+ },
2146
+ {
2147
+ "name": "description",
2148
+ "type": "string",
2149
+ "description": "Action description — the parameter dialog shows it under its title"
2150
+ },
2151
+ {
2152
+ "name": "openIn",
2153
+ "type": "enum",
2154
+ "enum": [
2155
+ "self",
2156
+ "new-tab"
2157
+ ],
2158
+ "description": "For a `url` action: `self` navigates in place, `new-tab` opens a new browser tab"
2159
+ },
2160
+ {
2161
+ "name": "method",
2162
+ "type": "string",
2163
+ "description": "HTTP method of an `api` action (`POST` when omitted)"
2164
+ },
2165
+ {
2166
+ "name": "bodyExtra",
2167
+ "type": "object",
2168
+ "description": "Static request-body fields of an `api` action, merged last, so a constant here overrides a collected value of the same name"
2169
+ },
2170
+ {
2171
+ "name": "bodyShape",
2172
+ "type": [
2173
+ "enum",
2174
+ "object"
2175
+ ],
2176
+ "enum": [
2177
+ "flat"
2178
+ ],
2179
+ "description": "How an `api` action shapes its request body: `flat` (the default) or `{ wrap: KEY }` to nest the collected values under that key, with `bodyExtra` beside it"
2180
+ },
2181
+ {
2182
+ "name": "operation",
2183
+ "type": "enum",
2184
+ "enum": [
2185
+ "update"
2186
+ ],
2187
+ "description": "`update` declares a single-record field write: the runner dispatches it to the platform action route with `patch` merged under the collected values"
2188
+ },
2189
+ {
2190
+ "name": "patch",
2191
+ "type": "object",
2192
+ "description": "For `operation: update`: the field values written, merged UNDER the values the user supplies, so a collected value of the same name wins"
2193
+ },
2194
+ {
2195
+ "name": "confirmText",
2196
+ "type": "string",
2197
+ "description": "Confirmation question asked before the action runs; the action runs only if it is confirmed"
2198
+ },
2199
+ {
2200
+ "name": "successMessage",
2201
+ "type": "string",
2202
+ "description": "Toast text when the action succeeds (a message the server returns takes precedence)"
2203
+ },
2204
+ {
2205
+ "name": "errorMessage",
2206
+ "type": "string",
2207
+ "description": "Toast text when the action fails, in place of the raw error"
2208
+ },
2209
+ {
2210
+ "name": "refreshAfter",
2211
+ "type": "boolean",
2212
+ "description": "Refresh the surrounding data after the action succeeds"
2213
+ },
2214
+ {
2215
+ "name": "locations",
2216
+ "type": "array",
2217
+ "of": "string",
2218
+ "description": "The placements the action declares (`list_toolbar`, `list_item`, `record_header`, …). A `script` or `flow` action declared record-scoped (`list_item`, `record_header`, `record_more` or `record_section`) refuses to run when no record or single selection is in scope, instead of running without one"
2219
+ },
2220
+ {
2221
+ "name": "toast",
2222
+ "type": "object",
2223
+ "description": "Toast behaviour: `{ showOnSuccess?, showOnError?, duration? }` — `false` suppresses that toast, `duration` is handed to the toast"
2224
+ },
2225
+ {
2226
+ "name": "resultDialog",
2227
+ "type": "object",
2228
+ "description": "One-shot result dialog for a value the response shows exactly once (a 2FA code, a fresh secret); it replaces the success toast"
2229
+ },
2230
+ {
2231
+ "name": "onSuccess",
2232
+ "type": "object",
2233
+ "description": "Post-success navigation `{ navigate, openIn? }`: `navigate` is a route template that can read `${result.*}`, `openIn` is `self` (the default) or `newTab`"
2234
+ },
2235
+ {
2236
+ "name": "objectName",
2237
+ "type": "string",
2238
+ "description": "Object the action acts on — dispatch goes to this object instead of the page's. Omit to act on the page's object"
2239
+ },
2240
+ {
2241
+ "name": "recordIdField",
2242
+ "type": "string",
2243
+ "description": "For a `script` action run against a single selected row: the row field whose value is sent as the record id (default `id`)"
1946
2244
  }
1947
2245
  ]
1948
2246
  },
@@ -1950,10 +2248,6 @@
1950
2248
  "type": "action:group",
1951
2249
  "namespace": "action",
1952
2250
  "inputs": [
1953
- {
1954
- "name": "name",
1955
- "type": "string"
1956
- },
1957
2251
  {
1958
2252
  "name": "label",
1959
2253
  "type": "string"
@@ -1964,7 +2258,9 @@
1964
2258
  },
1965
2259
  {
1966
2260
  "name": "actions",
1967
- "type": "object"
2261
+ "type": "array",
2262
+ "of": "object",
2263
+ "description": "The actions in this group, in order. Each member is an action object the group draws and runs itself (`name`, `label`, `icon`, `type`, `target`, `locations`, `visible`, `disabled`, …); a member's executor is its own `type`"
1968
2264
  },
1969
2265
  {
1970
2266
  "name": "display",
@@ -1974,6 +2270,19 @@
1974
2270
  "dropdown"
1975
2271
  ]
1976
2272
  },
2273
+ {
2274
+ "name": "location",
2275
+ "type": "enum",
2276
+ "enum": [
2277
+ "list_toolbar",
2278
+ "list_item",
2279
+ "record_header",
2280
+ "record_more",
2281
+ "record_related",
2282
+ "record_section"
2283
+ ],
2284
+ "description": "Render only the members whose `locations` include this location. Omit to render every member"
2285
+ },
1977
2286
  {
1978
2287
  "name": "variant",
1979
2288
  "type": "enum",
@@ -1988,10 +2297,21 @@
1988
2297
  "name": "size",
1989
2298
  "type": "enum",
1990
2299
  "enum": [
2300
+ "default",
1991
2301
  "sm",
1992
- "md",
1993
- "lg"
1994
- ]
2302
+ "lg",
2303
+ "icon"
2304
+ ],
2305
+ "description": "Button size for the dropdown trigger and for every inline member that sets none"
2306
+ },
2307
+ {
2308
+ "name": "visible",
2309
+ "type": [
2310
+ "boolean",
2311
+ "string",
2312
+ "object"
2313
+ ],
2314
+ "description": "Visibility predicate for the whole group: `true`/`false`, a bare CEL expression, or the `{ dialect: 'cel', source }` envelope, evaluated against the row the host binds. Omit for always-visible"
1995
2315
  },
1996
2316
  {
1997
2317
  "name": "className",
@@ -2013,7 +2333,9 @@
2013
2333
  },
2014
2334
  {
2015
2335
  "name": "actions",
2016
- "type": "object"
2336
+ "type": "array",
2337
+ "of": "object",
2338
+ "description": "The menu's actions, in order. Each member is an action object the menu draws and runs itself (`name`, `label`, `icon`, `type`, `target`, `visible`, `disabled`, `tags`, …); a member's executor is its own `type`"
2017
2339
  },
2018
2340
  {
2019
2341
  "name": "variant",
@@ -2025,6 +2347,26 @@
2025
2347
  "ghost"
2026
2348
  ]
2027
2349
  },
2350
+ {
2351
+ "name": "size",
2352
+ "type": "enum",
2353
+ "enum": [
2354
+ "default",
2355
+ "sm",
2356
+ "lg",
2357
+ "icon"
2358
+ ],
2359
+ "description": "Trigger button size (renderer default: `icon`)"
2360
+ },
2361
+ {
2362
+ "name": "visible",
2363
+ "type": [
2364
+ "boolean",
2365
+ "string",
2366
+ "object"
2367
+ ],
2368
+ "description": "Visibility predicate for the whole menu: `true`/`false`, a bare CEL expression, or the `{ dialect: 'cel', source }` envelope, evaluated against the row the host binds; a predicate that fails to evaluate hides it. Omit for always-visible"
2369
+ },
2028
2370
  {
2029
2371
  "name": "className",
2030
2372
  "type": "string"
@@ -2076,6 +2418,123 @@
2076
2418
  {
2077
2419
  "name": "className",
2078
2420
  "type": "string"
2421
+ },
2422
+ {
2423
+ "name": "visible",
2424
+ "type": [
2425
+ "boolean",
2426
+ "string",
2427
+ "object"
2428
+ ],
2429
+ "description": "Visibility predicate: `true`/`false`, a bare CEL expression, or the `{ dialect: 'cel', source }` envelope, evaluated against the row the host binds; the icon is not rendered when it is false. Omit for always-visible"
2430
+ },
2431
+ {
2432
+ "name": "disabled",
2433
+ "type": [
2434
+ "boolean",
2435
+ "string",
2436
+ "object"
2437
+ ],
2438
+ "description": "Disabled predicate, in the same three shapes as `visible`: the icon is shown but cannot be pressed while it holds. Omit for never-disabled"
2439
+ },
2440
+ {
2441
+ "name": "params",
2442
+ "type": "array",
2443
+ "description": "The parameters to collect from the user before the action runs (`ActionParam` objects: `name`, `type`, `label`, …); each collected value reaches the executor under its parameter `name`. Static execution values ride `properties.params` instead"
2444
+ },
2445
+ {
2446
+ "name": "description",
2447
+ "type": "string",
2448
+ "description": "Action description — the tooltip text when there is no `label`, and what the parameter dialog shows under its title"
2449
+ },
2450
+ {
2451
+ "name": "openIn",
2452
+ "type": "enum",
2453
+ "enum": [
2454
+ "self",
2455
+ "new-tab"
2456
+ ],
2457
+ "description": "For a `url` action: `self` navigates in place, `new-tab` opens a new browser tab"
2458
+ },
2459
+ {
2460
+ "name": "method",
2461
+ "type": "string",
2462
+ "description": "HTTP method of an `api` action (`POST` when omitted)"
2463
+ },
2464
+ {
2465
+ "name": "bodyExtra",
2466
+ "type": "object",
2467
+ "description": "Static request-body fields of an `api` action, merged last, so a constant here overrides a collected value of the same name"
2468
+ },
2469
+ {
2470
+ "name": "bodyShape",
2471
+ "type": [
2472
+ "enum",
2473
+ "object"
2474
+ ],
2475
+ "enum": [
2476
+ "flat"
2477
+ ],
2478
+ "description": "How an `api` action shapes its request body: `flat` (the default) or `{ wrap: KEY }` to nest the collected values under that key, with `bodyExtra` beside it"
2479
+ },
2480
+ {
2481
+ "name": "operation",
2482
+ "type": "enum",
2483
+ "enum": [
2484
+ "update"
2485
+ ],
2486
+ "description": "`update` declares a single-record field write: the runner dispatches it to the platform action route with `patch` merged under the collected values"
2487
+ },
2488
+ {
2489
+ "name": "patch",
2490
+ "type": "object",
2491
+ "description": "For `operation: update`: the field values written, merged UNDER the values the user supplies, so a collected value of the same name wins"
2492
+ },
2493
+ {
2494
+ "name": "confirmText",
2495
+ "type": "string",
2496
+ "description": "Confirmation question asked before the action runs; the action runs only if it is confirmed"
2497
+ },
2498
+ {
2499
+ "name": "successMessage",
2500
+ "type": "string",
2501
+ "description": "Toast text when the action succeeds (a message the server returns takes precedence)"
2502
+ },
2503
+ {
2504
+ "name": "errorMessage",
2505
+ "type": "string",
2506
+ "description": "Toast text when the action fails, in place of the raw error"
2507
+ },
2508
+ {
2509
+ "name": "refreshAfter",
2510
+ "type": "boolean",
2511
+ "description": "Refresh the surrounding data after the action succeeds"
2512
+ },
2513
+ {
2514
+ "name": "locations",
2515
+ "type": "array",
2516
+ "of": "string",
2517
+ "description": "The placements the action declares (`list_toolbar`, `list_item`, `record_header`, …). A `script` or `flow` action declared record-scoped (`list_item`, `record_header`, `record_more` or `record_section`) refuses to run when no record or single selection is in scope, instead of running without one"
2518
+ },
2519
+ {
2520
+ "name": "toast",
2521
+ "type": "object",
2522
+ "description": "Toast behaviour: `{ showOnSuccess?, showOnError?, duration? }` — `false` suppresses that toast, `duration` is handed to the toast"
2523
+ },
2524
+ {
2525
+ "name": "resultDialog",
2526
+ "type": "object",
2527
+ "description": "One-shot result dialog for a value the response shows exactly once (a 2FA code, a fresh secret); it replaces the success toast"
2528
+ },
2529
+ {
2530
+ "name": "onSuccess",
2531
+ "type": "object",
2532
+ "description": "Post-success navigation `{ navigate, openIn? }`: `navigate` is a route template that can read `${result.*}`, `openIn` is `self` (the default) or `newTab`"
2533
+ },
2534
+ {
2535
+ "name": "objectName",
2536
+ "type": "string",
2537
+ "description": "Object the action acts on — dispatch goes to this object instead of the page's. Omit to act on the page's object"
2079
2538
  }
2080
2539
  ]
2081
2540
  },
@@ -2428,7 +2887,8 @@
2428
2887
  },
2429
2888
  {
2430
2889
  "name": "breadcrumb",
2431
- "type": "boolean"
2890
+ "type": "boolean",
2891
+ "description": "Ignored: the header draws no breadcrumb, and the key is being retired from the contract. Leave it out."
2432
2892
  },
2433
2893
  {
2434
2894
  "name": "recordChrome",