@wildo-ai/presets-components 1.1.4 → 1.1.6

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 (780) hide show
  1. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  2. package/dist/esm/components/actions/action-bar.js +65 -8
  3. package/dist/esm/components/actions/action-bar.js.map +1 -1
  4. package/dist/esm/components/actions/action-bar.labels.d.ts.map +1 -1
  5. package/dist/esm/components/actions/action-button.d.ts.map +1 -1
  6. package/dist/esm/components/actions/action-button.js +3 -3
  7. package/dist/esm/components/actions/action-button.js.map +1 -1
  8. package/dist/esm/components/actions/action-button.labels.d.ts.map +1 -1
  9. package/dist/esm/components/actions/button-group.d.ts.map +1 -1
  10. package/dist/esm/components/actions/button.d.ts.map +1 -1
  11. package/dist/esm/components/actions/button.js +62 -3
  12. package/dist/esm/components/actions/button.js.map +1 -1
  13. package/dist/esm/components/actions/button.labels.d.ts.map +1 -1
  14. package/dist/esm/components/ai-elements/artifacts/artifact-browser.d.ts.map +1 -1
  15. package/dist/esm/components/ai-elements/artifacts/artifact.d.ts.map +1 -1
  16. package/dist/esm/components/ai-elements/artifacts/artifact.labels.d.ts.map +1 -1
  17. package/dist/esm/components/ai-elements/artifacts/code-block.d.ts.map +1 -1
  18. package/dist/esm/components/ai-elements/artifacts/code-block.js +1 -1
  19. package/dist/esm/components/ai-elements/artifacts/code-block.js.map +1 -1
  20. package/dist/esm/components/ai-elements/artifacts/code-block.labels.d.ts.map +1 -1
  21. package/dist/esm/components/ai-elements/artifacts/diff-block.d.ts +4 -0
  22. package/dist/esm/components/ai-elements/artifacts/diff-block.d.ts.map +1 -0
  23. package/dist/esm/components/ai-elements/artifacts/diff-block.js +165 -0
  24. package/dist/esm/components/ai-elements/artifacts/diff-block.js.map +1 -0
  25. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.d.ts +3 -0
  26. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.d.ts.map +1 -0
  27. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.js +63 -0
  28. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.js.map +1 -0
  29. package/dist/esm/components/ai-elements/artifacts/image.d.ts.map +1 -1
  30. package/dist/esm/components/ai-elements/artifacts/image.labels.d.ts.map +1 -1
  31. package/dist/esm/components/ai-elements/artifacts/shiki-highlighter-runtime.d.ts.map +1 -1
  32. package/dist/esm/components/ai-elements/artifacts/shiki-highlighter.lazy.d.ts.map +1 -1
  33. package/dist/esm/components/ai-elements/artifacts/web-preview.d.ts.map +1 -1
  34. package/dist/esm/components/ai-elements/artifacts/web-preview.labels.d.ts.map +1 -1
  35. package/dist/esm/components/ai-elements/chat/conversation.d.ts.map +1 -1
  36. package/dist/esm/components/ai-elements/chat/conversation.labels.d.ts.map +1 -1
  37. package/dist/esm/components/ai-elements/chat/message.d.ts.map +1 -1
  38. package/dist/esm/components/ai-elements/chat/message.labels.d.ts.map +1 -1
  39. package/dist/esm/components/ai-elements/chat/prompt-input.d.ts.map +1 -1
  40. package/dist/esm/components/ai-elements/chat/prompt-input.labels.d.ts.map +1 -1
  41. package/dist/esm/components/ai-elements/chat/sources.d.ts.map +1 -1
  42. package/dist/esm/components/ai-elements/chat/sources.labels.d.ts.map +1 -1
  43. package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
  44. package/dist/esm/components/ai-elements/chat/suggestion.js +8 -1
  45. package/dist/esm/components/ai-elements/chat/suggestion.js.map +1 -1
  46. package/dist/esm/components/ai-elements/chat/suggestion.labels.d.ts.map +1 -1
  47. package/dist/esm/components/ai-elements/decision/approval-argument-fields.d.ts +68 -0
  48. package/dist/esm/components/ai-elements/decision/approval-argument-fields.d.ts.map +1 -0
  49. package/dist/esm/components/ai-elements/decision/approval-argument-fields.js +208 -0
  50. package/dist/esm/components/ai-elements/decision/approval-argument-fields.js.map +1 -0
  51. package/dist/esm/components/ai-elements/decision/approval.d.ts +124 -17
  52. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  53. package/dist/esm/components/ai-elements/decision/approval.js +105 -13
  54. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  55. package/dist/esm/components/ai-elements/decision/decision-request.d.ts.map +1 -1
  56. package/dist/esm/components/ai-elements/decision/decision-request.labels.d.ts.map +1 -1
  57. package/dist/esm/components/ai-elements/execution/confirmation.d.ts.map +1 -1
  58. package/dist/esm/components/ai-elements/execution/confirmation.labels.d.ts.map +1 -1
  59. package/dist/esm/components/ai-elements/execution/queue.d.ts.map +1 -1
  60. package/dist/esm/components/ai-elements/execution/queue.labels.d.ts.map +1 -1
  61. package/dist/esm/components/ai-elements/execution/task.d.ts.map +1 -1
  62. package/dist/esm/components/ai-elements/execution/task.js +1 -1
  63. package/dist/esm/components/ai-elements/execution/task.js.map +1 -1
  64. package/dist/esm/components/ai-elements/execution/task.labels.d.ts.map +1 -1
  65. package/dist/esm/components/ai-elements/execution/tool.d.ts.map +1 -1
  66. package/dist/esm/components/ai-elements/execution/tool.js +8 -1
  67. package/dist/esm/components/ai-elements/execution/tool.js.map +1 -1
  68. package/dist/esm/components/ai-elements/execution/tool.labels.d.ts.map +1 -1
  69. package/dist/esm/components/ai-elements/graph/canvas.d.ts.map +1 -1
  70. package/dist/esm/components/ai-elements/graph/canvas.labels.d.ts.map +1 -1
  71. package/dist/esm/components/ai-elements/graph/connection.d.ts.map +1 -1
  72. package/dist/esm/components/ai-elements/graph/connection.labels.d.ts.map +1 -1
  73. package/dist/esm/components/ai-elements/graph/controls.d.ts.map +1 -1
  74. package/dist/esm/components/ai-elements/graph/controls.labels.d.ts.map +1 -1
  75. package/dist/esm/components/ai-elements/graph/edge.d.ts.map +1 -1
  76. package/dist/esm/components/ai-elements/graph/edge.labels.d.ts.map +1 -1
  77. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts +3 -1
  78. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
  79. package/dist/esm/components/ai-elements/graph/graph-runtime.js +3 -1
  80. package/dist/esm/components/ai-elements/graph/graph-runtime.js.map +1 -1
  81. package/dist/esm/components/ai-elements/graph/graph.lazy.d.ts.map +1 -1
  82. package/dist/esm/components/ai-elements/graph/graph.lazy.js +15 -15
  83. package/dist/esm/components/ai-elements/graph/graph.lazy.js.map +1 -1
  84. package/dist/esm/components/ai-elements/graph/node.d.ts.map +1 -1
  85. package/dist/esm/components/ai-elements/graph/node.labels.d.ts.map +1 -1
  86. package/dist/esm/components/ai-elements/graph/panel.d.ts.map +1 -1
  87. package/dist/esm/components/ai-elements/graph/panel.labels.d.ts.map +1 -1
  88. package/dist/esm/components/ai-elements/graph/toolbar.d.ts.map +1 -1
  89. package/dist/esm/components/ai-elements/graph/toolbar.labels.d.ts.map +1 -1
  90. package/dist/esm/components/ai-elements/meta/agent.d.ts +0 -1
  91. package/dist/esm/components/ai-elements/meta/agent.d.ts.map +1 -1
  92. package/dist/esm/components/ai-elements/meta/agent.js +23 -18
  93. package/dist/esm/components/ai-elements/meta/agent.js.map +1 -1
  94. package/dist/esm/components/ai-elements/meta/context.d.ts.map +1 -1
  95. package/dist/esm/components/ai-elements/meta/context.labels.d.ts.map +1 -1
  96. package/dist/esm/components/ai-elements/meta/context.lazy.d.ts.map +1 -1
  97. package/dist/esm/components/ai-elements/meta/context.lazy.js +13 -11
  98. package/dist/esm/components/ai-elements/meta/context.lazy.js.map +1 -1
  99. package/dist/esm/components/ai-elements/meta/model-selector.d.ts.map +1 -1
  100. package/dist/esm/components/ai-elements/meta/model-selector.labels.d.ts.map +1 -1
  101. package/dist/esm/components/ai-elements/meta/open-in-chat.d.ts.map +1 -1
  102. package/dist/esm/components/ai-elements/meta/open-in-chat.labels.d.ts.map +1 -1
  103. package/dist/esm/components/ai-elements/shared/loader.d.ts.map +1 -1
  104. package/dist/esm/components/ai-elements/shared/loader.labels.d.ts.map +1 -1
  105. package/dist/esm/components/ai-elements/shared/shimmer.d.ts.map +1 -1
  106. package/dist/esm/components/ai-elements/shared/shimmer.labels.d.ts.map +1 -1
  107. package/dist/esm/components/ai-elements/stream/execution-stream.d.ts.map +1 -1
  108. package/dist/esm/components/ai-elements/stream/execution-stream.labels.d.ts.map +1 -1
  109. package/dist/esm/components/ai-elements/trace/chain-of-thought.d.ts +6 -0
  110. package/dist/esm/components/ai-elements/trace/chain-of-thought.d.ts.map +1 -1
  111. package/dist/esm/components/ai-elements/trace/chain-of-thought.js +13 -1
  112. package/dist/esm/components/ai-elements/trace/chain-of-thought.js.map +1 -1
  113. package/dist/esm/components/ai-elements/trace/chain-of-thought.labels.d.ts.map +1 -1
  114. package/dist/esm/components/ai-elements/trace/checkpoint.d.ts.map +1 -1
  115. package/dist/esm/components/ai-elements/trace/checkpoint.labels.d.ts.map +1 -1
  116. package/dist/esm/components/ai-elements/trace/inline-citation.d.ts.map +1 -1
  117. package/dist/esm/components/ai-elements/trace/inline-citation.labels.d.ts.map +1 -1
  118. package/dist/esm/components/ai-elements/trace/plan.d.ts.map +1 -1
  119. package/dist/esm/components/ai-elements/trace/plan.labels.d.ts.map +1 -1
  120. package/dist/esm/components/ai-elements/trace/reasoning.d.ts.map +1 -1
  121. package/dist/esm/components/ai-elements/trace/reasoning.labels.d.ts.map +1 -1
  122. package/dist/esm/components/app/app-layout-consent-gate.d.ts +23 -0
  123. package/dist/esm/components/app/app-layout-consent-gate.d.ts.map +1 -0
  124. package/dist/esm/components/app/app-layout-consent-gate.js +133 -0
  125. package/dist/esm/components/app/app-layout-consent-gate.js.map +1 -0
  126. package/dist/esm/components/app/app-layout-document-acceptance-gate.d.ts +19 -0
  127. package/dist/esm/components/app/app-layout-document-acceptance-gate.d.ts.map +1 -0
  128. package/dist/esm/components/app/app-layout-document-acceptance-gate.js +56 -0
  129. package/dist/esm/components/app/app-layout-document-acceptance-gate.js.map +1 -0
  130. package/dist/esm/components/app/app-layout-main-container.d.ts +9 -0
  131. package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
  132. package/dist/esm/components/app/app-layout-main-container.js +17 -23
  133. package/dist/esm/components/app/app-layout-main-container.js.map +1 -1
  134. package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
  135. package/dist/esm/components/app/app-layout-main-container.labels.js +48 -0
  136. package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
  137. package/dist/esm/components/app/public-layout-main-container.d.ts +1 -1
  138. package/dist/esm/components/app/public-layout-main-container.d.ts.map +1 -1
  139. package/dist/esm/components/app/public-layout-main-container.js +9 -8
  140. package/dist/esm/components/app/public-layout-main-container.js.map +1 -1
  141. package/dist/esm/components/app/public-layout-main-container.labels.d.ts.map +1 -1
  142. package/dist/esm/components/app/public-layout-terms.d.ts +46 -0
  143. package/dist/esm/components/app/public-layout-terms.d.ts.map +1 -0
  144. package/dist/esm/components/app/public-layout-terms.js +137 -0
  145. package/dist/esm/components/app/public-layout-terms.js.map +1 -0
  146. package/dist/esm/components/billing/billing-format.utils.d.ts.map +1 -1
  147. package/dist/esm/components/billing/billing-invoice-history.d.ts +1 -1
  148. package/dist/esm/components/billing/billing-invoice-history.d.ts.map +1 -1
  149. package/dist/esm/components/billing/billing-invoice-history.js +3 -1
  150. package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
  151. package/dist/esm/components/billing/billing-invoice-history.labels.d.ts.map +1 -1
  152. package/dist/esm/components/billing/billing-invoice-history.labels.js +1 -0
  153. package/dist/esm/components/billing/billing-invoice-history.labels.js.map +1 -1
  154. package/dist/esm/components/billing/billing-plan-change-preview.d.ts +5 -0
  155. package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -0
  156. package/dist/esm/components/billing/billing-plan-change-preview.js +25 -0
  157. package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -0
  158. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts +3 -0
  159. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -0
  160. package/dist/esm/components/billing/billing-plan-change-preview.labels.js +22 -0
  161. package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -0
  162. package/dist/esm/components/billing/billing-portal-link.d.ts +1 -1
  163. package/dist/esm/components/billing/billing-portal-link.d.ts.map +1 -1
  164. package/dist/esm/components/billing/billing-portal-link.js +3 -1
  165. package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
  166. package/dist/esm/components/billing/billing-portal-link.labels.d.ts.map +1 -1
  167. package/dist/esm/components/billing/billing-portal-link.labels.js +1 -0
  168. package/dist/esm/components/billing/billing-portal-link.labels.js.map +1 -1
  169. package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
  170. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  171. package/dist/esm/components/billing/billing-pricing-table.js +10 -4
  172. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  173. package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
  174. package/dist/esm/components/billing/billing-pricing-table.labels.js +8 -1
  175. package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
  176. package/dist/esm/components/billing/billing-subscription-status.d.ts +1 -1
  177. package/dist/esm/components/billing/billing-subscription-status.d.ts.map +1 -1
  178. package/dist/esm/components/billing/billing-subscription-status.js +3 -1
  179. package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
  180. package/dist/esm/components/billing/billing-subscription-status.labels.d.ts.map +1 -1
  181. package/dist/esm/components/billing/billing-subscription-status.labels.js +1 -0
  182. package/dist/esm/components/billing/billing-subscription-status.labels.js.map +1 -1
  183. package/dist/esm/components/billing/billing-usage-dashboard.d.ts +1 -1
  184. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  185. package/dist/esm/components/billing/billing-usage-dashboard.js +10 -7
  186. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  187. package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
  188. package/dist/esm/components/billing/billing-usage-dashboard.labels.js +4 -1
  189. package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
  190. package/dist/esm/components/data-display/avatar.d.ts.map +1 -1
  191. package/dist/esm/components/data-display/avatar.labels.d.ts.map +1 -1
  192. package/dist/esm/components/data-display/badge.d.ts.map +1 -1
  193. package/dist/esm/components/data-display/badge.js +16 -15
  194. package/dist/esm/components/data-display/badge.js.map +1 -1
  195. package/dist/esm/components/data-display/badge.labels.d.ts.map +1 -1
  196. package/dist/esm/components/data-display/description-list.d.ts +2 -1
  197. package/dist/esm/components/data-display/description-list.d.ts.map +1 -1
  198. package/dist/esm/components/data-display/description-list.js +24 -8
  199. package/dist/esm/components/data-display/description-list.js.map +1 -1
  200. package/dist/esm/components/data-display/description-list.labels.d.ts.map +1 -1
  201. package/dist/esm/components/data-display/duration.d.ts +15 -0
  202. package/dist/esm/components/data-display/duration.d.ts.map +1 -0
  203. package/dist/esm/components/data-display/duration.js +50 -0
  204. package/dist/esm/components/data-display/duration.js.map +1 -0
  205. package/dist/esm/components/data-display/duration.labels.d.ts +15 -0
  206. package/dist/esm/components/data-display/duration.labels.d.ts.map +1 -0
  207. package/dist/esm/components/data-display/duration.labels.js +35 -0
  208. package/dist/esm/components/data-display/duration.labels.js.map +1 -0
  209. package/dist/esm/components/data-display/formatters/display-field-address.d.ts +21 -0
  210. package/dist/esm/components/data-display/formatters/display-field-address.d.ts.map +1 -0
  211. package/dist/esm/components/data-display/formatters/display-field-address.js +75 -0
  212. package/dist/esm/components/data-display/formatters/display-field-address.js.map +1 -0
  213. package/dist/esm/components/data-display/formatters/display-field-address.labels.d.ts +3 -0
  214. package/dist/esm/components/data-display/formatters/display-field-address.labels.d.ts.map +1 -0
  215. package/dist/esm/components/data-display/formatters/display-field-address.labels.js +13 -0
  216. package/dist/esm/components/data-display/formatters/display-field-address.labels.js.map +1 -0
  217. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.d.ts.map +1 -1
  218. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.js +6 -2
  219. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.js.map +1 -1
  220. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.labels.d.ts.map +1 -1
  221. package/dist/esm/components/data-display/formatters/display-field-boolean.d.ts.map +1 -1
  222. package/dist/esm/components/data-display/formatters/display-field-boolean.js +2 -2
  223. package/dist/esm/components/data-display/formatters/display-field-boolean.js.map +1 -1
  224. package/dist/esm/components/data-display/formatters/display-field-boolean.labels.d.ts.map +1 -1
  225. package/dist/esm/components/data-display/formatters/display-field-code.d.ts.map +1 -1
  226. package/dist/esm/components/data-display/formatters/display-field-code.js +2 -2
  227. package/dist/esm/components/data-display/formatters/display-field-code.js.map +1 -1
  228. package/dist/esm/components/data-display/formatters/display-field-code.labels.d.ts.map +1 -1
  229. package/dist/esm/components/data-display/formatters/display-field-date.d.ts +3 -3
  230. package/dist/esm/components/data-display/formatters/display-field-date.d.ts.map +1 -1
  231. package/dist/esm/components/data-display/formatters/display-field-date.js +17 -4
  232. package/dist/esm/components/data-display/formatters/display-field-date.js.map +1 -1
  233. package/dist/esm/components/data-display/formatters/display-field-date.labels.d.ts.map +1 -1
  234. package/dist/esm/components/data-display/formatters/display-field-datetime.d.ts +3 -3
  235. package/dist/esm/components/data-display/formatters/display-field-datetime.d.ts.map +1 -1
  236. package/dist/esm/components/data-display/formatters/display-field-datetime.js +17 -4
  237. package/dist/esm/components/data-display/formatters/display-field-datetime.js.map +1 -1
  238. package/dist/esm/components/data-display/formatters/display-field-datetime.labels.d.ts.map +1 -1
  239. package/dist/esm/components/data-display/formatters/display-field-duration.d.ts.map +1 -1
  240. package/dist/esm/components/data-display/formatters/display-field-duration.labels.d.ts.map +1 -1
  241. package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
  242. package/dist/esm/components/data-display/formatters/display-field-enum.js +29 -11
  243. package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
  244. package/dist/esm/components/data-display/formatters/display-field-enum.labels.d.ts.map +1 -1
  245. package/dist/esm/components/data-display/formatters/display-field-file-audio.d.ts.map +1 -1
  246. package/dist/esm/components/data-display/formatters/display-field-file-audio.js +2 -1
  247. package/dist/esm/components/data-display/formatters/display-field-file-audio.js.map +1 -1
  248. package/dist/esm/components/data-display/formatters/display-field-file-audio.labels.d.ts.map +1 -1
  249. package/dist/esm/components/data-display/formatters/display-field-file-document.d.ts +4 -1
  250. package/dist/esm/components/data-display/formatters/display-field-file-document.d.ts.map +1 -1
  251. package/dist/esm/components/data-display/formatters/display-field-file-document.js +18 -5
  252. package/dist/esm/components/data-display/formatters/display-field-file-document.js.map +1 -1
  253. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.d.ts.map +1 -1
  254. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.js +20 -0
  255. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.js.map +1 -1
  256. package/dist/esm/components/data-display/formatters/display-field-file-gallery.d.ts.map +1 -1
  257. package/dist/esm/components/data-display/formatters/display-field-file-gallery.labels.d.ts.map +1 -1
  258. package/dist/esm/components/data-display/formatters/display-field-file-image.d.ts.map +1 -1
  259. package/dist/esm/components/data-display/formatters/display-field-file-image.js +3 -1
  260. package/dist/esm/components/data-display/formatters/display-field-file-image.js.map +1 -1
  261. package/dist/esm/components/data-display/formatters/display-field-file-image.labels.d.ts.map +1 -1
  262. package/dist/esm/components/data-display/formatters/display-field-file-video.d.ts.map +1 -1
  263. package/dist/esm/components/data-display/formatters/display-field-file-video.labels.d.ts.map +1 -1
  264. package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
  265. package/dist/esm/components/data-display/formatters/display-field-file.js +14 -15
  266. package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
  267. package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
  268. package/dist/esm/components/data-display/formatters/display-field-file.labels.js +2 -0
  269. package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
  270. package/dist/esm/components/data-display/formatters/display-field-format.utils.d.ts.map +1 -1
  271. package/dist/esm/components/data-display/formatters/display-field-i18n.utils.d.ts.map +1 -1
  272. package/dist/esm/components/data-display/formatters/display-field-money.d.ts.map +1 -1
  273. package/dist/esm/components/data-display/formatters/display-field-money.labels.d.ts.map +1 -1
  274. package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
  275. package/dist/esm/components/data-display/formatters/display-field-number.js +8 -3
  276. package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
  277. package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
  278. package/dist/esm/components/data-display/formatters/display-field-number.labels.js +5 -2
  279. package/dist/esm/components/data-display/formatters/display-field-number.labels.js.map +1 -1
  280. package/dist/esm/components/data-display/formatters/display-field-phone.d.ts.map +1 -1
  281. package/dist/esm/components/data-display/formatters/display-field-phone.labels.d.ts.map +1 -1
  282. package/dist/esm/components/data-display/formatters/display-field-range-bigdecimal.d.ts.map +1 -1
  283. package/dist/esm/components/data-display/formatters/display-field-range-bigdecimal.labels.d.ts.map +1 -1
  284. package/dist/esm/components/data-display/formatters/display-field-range-date.d.ts.map +1 -1
  285. package/dist/esm/components/data-display/formatters/display-field-range-date.labels.d.ts.map +1 -1
  286. package/dist/esm/components/data-display/formatters/display-field-range-datetime.d.ts.map +1 -1
  287. package/dist/esm/components/data-display/formatters/display-field-range-datetime.labels.d.ts.map +1 -1
  288. package/dist/esm/components/data-display/formatters/display-field-range-money.d.ts.map +1 -1
  289. package/dist/esm/components/data-display/formatters/display-field-range-money.labels.d.ts.map +1 -1
  290. package/dist/esm/components/data-display/formatters/display-field-range-number.d.ts.map +1 -1
  291. package/dist/esm/components/data-display/formatters/display-field-range-number.labels.d.ts.map +1 -1
  292. package/dist/esm/components/data-display/formatters/display-field-range-time.d.ts.map +1 -1
  293. package/dist/esm/components/data-display/formatters/display-field-range-time.labels.d.ts.map +1 -1
  294. package/dist/esm/components/data-display/formatters/display-field-string.d.ts +1 -1
  295. package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
  296. package/dist/esm/components/data-display/formatters/display-field-string.js +129 -15
  297. package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
  298. package/dist/esm/components/data-display/formatters/display-field-string.labels.d.ts.map +1 -1
  299. package/dist/esm/components/data-display/formatters/display-field-time.d.ts.map +1 -1
  300. package/dist/esm/components/data-display/formatters/display-field-time.labels.d.ts.map +1 -1
  301. package/dist/esm/components/data-display/identifier.d.ts +19 -0
  302. package/dist/esm/components/data-display/identifier.d.ts.map +1 -0
  303. package/dist/esm/components/data-display/identifier.js +21 -0
  304. package/dist/esm/components/data-display/identifier.js.map +1 -0
  305. package/dist/esm/components/data-display/kbd.d.ts +17 -0
  306. package/dist/esm/components/data-display/kbd.d.ts.map +1 -0
  307. package/dist/esm/components/data-display/kbd.js +18 -0
  308. package/dist/esm/components/data-display/kbd.js.map +1 -0
  309. package/dist/esm/components/data-display/markdown-content.d.ts.map +1 -1
  310. package/dist/esm/components/data-display/markdown-stream-runtime.d.ts.map +1 -1
  311. package/dist/esm/components/data-display/markdown-stream.lazy.d.ts.map +1 -1
  312. package/dist/esm/components/data-display/markdown-stream.lazy.js +13 -2
  313. package/dist/esm/components/data-display/markdown-stream.lazy.js.map +1 -1
  314. package/dist/esm/components/data-display/notification-indicator.d.ts.map +1 -1
  315. package/dist/esm/components/data-display/notification-indicator.js +3 -11
  316. package/dist/esm/components/data-display/notification-indicator.js.map +1 -1
  317. package/dist/esm/components/data-display/notification-indicator.labels.d.ts.map +1 -1
  318. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.d.ts +63 -0
  319. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.d.ts.map +1 -0
  320. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.js +75 -0
  321. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.js.map +1 -0
  322. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.d.ts +32 -0
  323. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.d.ts.map +1 -0
  324. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.js +36 -0
  325. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.js.map +1 -0
  326. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.d.ts +46 -6
  327. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  328. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.js +70 -46
  329. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.js.map +1 -1
  330. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.d.ts +12 -2
  331. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.d.ts.map +1 -1
  332. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.js +3 -2
  333. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.js.map +1 -1
  334. package/dist/esm/components/data-display/timeline.d.ts +3 -0
  335. package/dist/esm/components/data-display/timeline.d.ts.map +1 -0
  336. package/dist/esm/components/data-display/timeline.js +92 -0
  337. package/dist/esm/components/data-display/timeline.js.map +1 -0
  338. package/dist/esm/components/data-display/untrusted-html-content.d.ts +55 -0
  339. package/dist/esm/components/data-display/untrusted-html-content.d.ts.map +1 -0
  340. package/dist/esm/components/data-display/untrusted-html-content.js +67 -0
  341. package/dist/esm/components/data-display/untrusted-html-content.js.map +1 -0
  342. package/dist/esm/components/feedback/celebration-overlay.d.ts +13 -4
  343. package/dist/esm/components/feedback/celebration-overlay.d.ts.map +1 -1
  344. package/dist/esm/components/feedback/celebration-overlay.js +146 -22
  345. package/dist/esm/components/feedback/celebration-overlay.js.map +1 -1
  346. package/dist/esm/components/feedback/celebration-overlay.labels.d.ts.map +1 -1
  347. package/dist/esm/components/feedback/danger-zone.d.ts.map +1 -1
  348. package/dist/esm/components/feedback/danger-zone.labels.d.ts.map +1 -1
  349. package/dist/esm/components/feedback/empty-state.d.ts.map +1 -1
  350. package/dist/esm/components/feedback/empty-state.js.map +1 -1
  351. package/dist/esm/components/feedback/empty-state.labels.d.ts.map +1 -1
  352. package/dist/esm/components/feedback/error-display.d.ts.map +1 -1
  353. package/dist/esm/components/feedback/error-display.labels.d.ts.map +1 -1
  354. package/dist/esm/components/feedback/features/feature-limit-indicator.d.ts.map +1 -1
  355. package/dist/esm/components/feedback/features/feature-limit-indicator.labels.d.ts.map +1 -1
  356. package/dist/esm/components/feedback/features/feature-lock-badge.d.ts.map +1 -1
  357. package/dist/esm/components/feedback/features/feature-lock-badge.labels.d.ts.map +1 -1
  358. package/dist/esm/components/feedback/features/feature-unavailable-dialog.d.ts.map +1 -1
  359. package/dist/esm/components/feedback/features/feature-unavailable-dialog.labels.d.ts.map +1 -1
  360. package/dist/esm/components/feedback/features/feature-unavailable-prompt.d.ts.map +1 -1
  361. package/dist/esm/components/feedback/features/feature-unavailable-prompt.js.map +1 -1
  362. package/dist/esm/components/feedback/features/feature-unavailable-prompt.labels.d.ts.map +1 -1
  363. package/dist/esm/components/feedback/loading-overlay.d.ts.map +1 -1
  364. package/dist/esm/components/feedback/loading-overlay.labels.d.ts.map +1 -1
  365. package/dist/esm/components/feedback/loading-spinner.d.ts.map +1 -1
  366. package/dist/esm/components/feedback/loading-spinner.labels.d.ts.map +1 -1
  367. package/dist/esm/components/feedback/notification-center.d.ts.map +1 -1
  368. package/dist/esm/components/feedback/notification-center.js +5 -5
  369. package/dist/esm/components/feedback/notification-center.js.map +1 -1
  370. package/dist/esm/components/feedback/operations-confirm-critical.d.ts +1 -1
  371. package/dist/esm/components/feedback/operations-confirm-critical.d.ts.map +1 -1
  372. package/dist/esm/components/feedback/operations-confirm-critical.js +9 -7
  373. package/dist/esm/components/feedback/operations-confirm-critical.js.map +1 -1
  374. package/dist/esm/components/feedback/operations-confirm-critical.labels.d.ts.map +1 -1
  375. package/dist/esm/components/feedback/progress.d.ts.map +1 -1
  376. package/dist/esm/components/feedback/progress.labels.d.ts.map +1 -1
  377. package/dist/esm/components/feedback/skeleton.d.ts.map +1 -1
  378. package/dist/esm/components/feedback/skeleton.labels.d.ts.map +1 -1
  379. package/dist/esm/components/feedback/toast.d.ts.map +1 -1
  380. package/dist/esm/components/feedback/toast.labels.d.ts.map +1 -1
  381. package/dist/esm/components/form/autosave-indicator.d.ts.map +1 -1
  382. package/dist/esm/components/form/autosave-indicator.labels.d.ts.map +1 -1
  383. package/dist/esm/components/form/chromes/field.d.ts.map +1 -1
  384. package/dist/esm/components/form/chromes/field.js +11 -3
  385. package/dist/esm/components/form/chromes/field.js.map +1 -1
  386. package/dist/esm/components/form/chromes/field.labels.d.ts.map +1 -1
  387. package/dist/esm/components/form/chromes/form-primitive.d.ts.map +1 -1
  388. package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
  389. package/dist/esm/components/form/chromes/form-primitive.labels.js +37 -0
  390. package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
  391. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  392. package/dist/esm/components/form/combobox.js +14 -13
  393. package/dist/esm/components/form/combobox.js.map +1 -1
  394. package/dist/esm/components/form/combobox.labels.d.ts.map +1 -1
  395. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts +42 -0
  396. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.d.ts.map +1 -0
  397. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js +120 -0
  398. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.adapter.js.map +1 -0
  399. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts +16 -0
  400. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.d.ts.map +1 -0
  401. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js +8 -0
  402. package/dist/esm/components/form/controls/address/providers/google-places-address-lookup.js.map +1 -0
  403. package/dist/esm/components/form/controls/boolean/checkbox.d.ts.map +1 -1
  404. package/dist/esm/components/form/controls/boolean/checkbox.js +2 -2
  405. package/dist/esm/components/form/controls/boolean/checkbox.js.map +1 -1
  406. package/dist/esm/components/form/controls/boolean/checkbox.labels.d.ts.map +1 -1
  407. package/dist/esm/components/form/controls/boolean/switch.d.ts.map +1 -1
  408. package/dist/esm/components/form/controls/boolean/switch.labels.d.ts.map +1 -1
  409. package/dist/esm/components/form/controls/boolean/toggle-group-boolean.d.ts.map +1 -1
  410. package/dist/esm/components/form/controls/boolean/toggle-group-boolean.labels.d.ts.map +1 -1
  411. package/dist/esm/components/form/controls/boolean/toggle.d.ts.map +1 -1
  412. package/dist/esm/components/form/controls/boolean/toggle.labels.d.ts.map +1 -1
  413. package/dist/esm/components/form/controls/code-editor/cm6-editor-appearance.d.ts.map +1 -1
  414. package/dist/esm/components/form/controls/code-editor/cm6-editor.d.ts.map +1 -1
  415. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.d.ts.map +1 -1
  416. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.js +11 -2
  417. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.js.map +1 -1
  418. package/dist/esm/components/form/controls/code-editor/form-field-code.d.ts.map +1 -1
  419. package/dist/esm/components/form/controls/code-editor/markdown-editor.d.ts.map +1 -1
  420. package/dist/esm/components/form/controls/date-time/calendar.d.ts.map +1 -1
  421. package/dist/esm/components/form/controls/date-time/calendar.labels.d.ts.map +1 -1
  422. package/dist/esm/components/form/controls/date-time/date-range-picker.d.ts.map +1 -1
  423. package/dist/esm/components/form/controls/date-time/date-range-picker.labels.d.ts.map +1 -1
  424. package/dist/esm/components/form/controls/date-time/datepicker.d.ts.map +1 -1
  425. package/dist/esm/components/form/controls/date-time/datepicker.labels.d.ts.map +1 -1
  426. package/dist/esm/components/form/controls/date-time/datetime-picker.d.ts.map +1 -1
  427. package/dist/esm/components/form/controls/date-time/datetime-picker.labels.d.ts.map +1 -1
  428. package/dist/esm/components/form/controls/date-time/datetime-range-picker.d.ts.map +1 -1
  429. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.d.ts.map +1 -1
  430. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.js +11 -2
  431. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.js.map +1 -1
  432. package/dist/esm/components/form/controls/date-time/time-picker.d.ts.map +1 -1
  433. package/dist/esm/components/form/controls/date-time/time-picker.labels.d.ts.map +1 -1
  434. package/dist/esm/components/form/controls/date-time/time-range-picker.d.ts.map +1 -1
  435. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.d.ts.map +1 -1
  436. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.js +11 -2
  437. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.js.map +1 -1
  438. package/dist/esm/components/form/controls/enum/radio.d.ts +1 -1
  439. package/dist/esm/components/form/controls/enum/radio.d.ts.map +1 -1
  440. package/dist/esm/components/form/controls/enum/radio.js +13 -12
  441. package/dist/esm/components/form/controls/enum/radio.js.map +1 -1
  442. package/dist/esm/components/form/controls/enum/radio.labels.d.ts.map +1 -1
  443. package/dist/esm/components/form/controls/enum/select-multiple.d.ts.map +1 -1
  444. package/dist/esm/components/form/controls/enum/select-multiple.js +5 -3
  445. package/dist/esm/components/form/controls/enum/select-multiple.js.map +1 -1
  446. package/dist/esm/components/form/controls/enum/select-multiple.labels.d.ts.map +1 -1
  447. package/dist/esm/components/form/controls/enum/select.d.ts.map +1 -1
  448. package/dist/esm/components/form/controls/enum/select.labels.d.ts.map +1 -1
  449. package/dist/esm/components/form/controls/enum/toggle-group.d.ts.map +1 -1
  450. package/dist/esm/components/form/controls/enum/toggle-group.js +96 -5
  451. package/dist/esm/components/form/controls/enum/toggle-group.js.map +1 -1
  452. package/dist/esm/components/form/controls/enum/toggle-group.labels.d.ts.map +1 -1
  453. package/dist/esm/components/form/controls/file/file-upload.d.ts.map +1 -1
  454. package/dist/esm/components/form/controls/file/file-upload.labels.d.ts.map +1 -1
  455. package/dist/esm/components/form/controls/file/image-crop.d.ts.map +1 -1
  456. package/dist/esm/components/form/controls/file/image-crop.labels.d.ts.map +1 -1
  457. package/dist/esm/components/form/controls/file/providers/dropbox-picker.d.ts +44 -0
  458. package/dist/esm/components/form/controls/file/providers/dropbox-picker.d.ts.map +1 -0
  459. package/dist/esm/components/form/controls/file/providers/dropbox-picker.js +137 -0
  460. package/dist/esm/components/form/controls/file/providers/dropbox-picker.js.map +1 -0
  461. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.d.ts +22 -0
  462. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.d.ts.map +1 -0
  463. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.js +27 -0
  464. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.js.map +1 -0
  465. package/dist/esm/components/form/controls/file/providers/google-drive-picker.d.ts +3 -1
  466. package/dist/esm/components/form/controls/file/providers/google-drive-picker.d.ts.map +1 -1
  467. package/dist/esm/components/form/controls/file/providers/google-drive-picker.js +3 -1
  468. package/dist/esm/components/form/controls/file/providers/google-drive-picker.js.map +1 -1
  469. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.d.ts +6 -0
  470. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.d.ts.map +1 -1
  471. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.js +8 -1
  472. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.js.map +1 -1
  473. package/dist/esm/components/form/controls/file/providers/onedrive-picker.d.ts +6 -2
  474. package/dist/esm/components/form/controls/file/providers/onedrive-picker.d.ts.map +1 -1
  475. package/dist/esm/components/form/controls/file/providers/onedrive-picker.js +6 -2
  476. package/dist/esm/components/form/controls/file/providers/onedrive-picker.js.map +1 -1
  477. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.d.ts +6 -0
  478. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.d.ts.map +1 -1
  479. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.js +8 -1
  480. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.js.map +1 -1
  481. package/dist/esm/components/form/controls/input-group.d.ts.map +1 -1
  482. package/dist/esm/components/form/controls/input-group.labels.d.ts.map +1 -1
  483. package/dist/esm/components/form/controls/input.d.ts.map +1 -1
  484. package/dist/esm/components/form/controls/input.labels.d.ts.map +1 -1
  485. package/dist/esm/components/form/controls/number/slider.d.ts.map +1 -1
  486. package/dist/esm/components/form/controls/number/slider.labels.d.ts.map +1 -1
  487. package/dist/esm/components/form/controls/number/slider.labels.js +9 -2
  488. package/dist/esm/components/form/controls/number/slider.labels.js.map +1 -1
  489. package/dist/esm/components/form/controls/string/color-input.d.ts.map +1 -1
  490. package/dist/esm/components/form/controls/string/color-input.labels.d.ts.map +1 -1
  491. package/dist/esm/components/form/controls/string/color-picker-surface.d.ts.map +1 -1
  492. package/dist/esm/components/form/controls/string/color-picker-surface.js.map +1 -1
  493. package/dist/esm/components/form/controls/string/inline-edit-text.d.ts.map +1 -1
  494. package/dist/esm/components/form/controls/string/input-otp.d.ts.map +1 -1
  495. package/dist/esm/components/form/controls/string/input-otp.labels.d.ts.map +1 -1
  496. package/dist/esm/components/form/controls/string/password-input.d.ts.map +1 -1
  497. package/dist/esm/components/form/controls/string/password-input.labels.d.ts.map +1 -1
  498. package/dist/esm/components/form/controls/string/password-input.labels.js +9 -2
  499. package/dist/esm/components/form/controls/string/password-input.labels.js.map +1 -1
  500. package/dist/esm/components/form/controls/string/textarea.d.ts.map +1 -1
  501. package/dist/esm/components/form/controls/string/textarea.labels.d.ts.map +1 -1
  502. package/dist/esm/components/layout/aspect-ratio.d.ts.map +1 -1
  503. package/dist/esm/components/layout/aspect-ratio.labels.d.ts.map +1 -1
  504. package/dist/esm/components/layout/carousel.d.ts.map +1 -1
  505. package/dist/esm/components/layout/carousel.labels.d.ts.map +1 -1
  506. package/dist/esm/components/layout/divider.d.ts.map +1 -1
  507. package/dist/esm/components/layout/divider.labels.d.ts.map +1 -1
  508. package/dist/esm/components/layout/resizable.d.ts.map +1 -1
  509. package/dist/esm/components/layout/resizable.labels.d.ts.map +1 -1
  510. package/dist/esm/components/layout/scroll-area.d.ts.map +1 -1
  511. package/dist/esm/components/layout/scroll-area.labels.d.ts.map +1 -1
  512. package/dist/esm/components/layout/separator.d.ts.map +1 -1
  513. package/dist/esm/components/layout/separator.labels.d.ts.map +1 -1
  514. package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
  515. package/dist/esm/components/navigation/app-level/activity-bar.js +2 -2
  516. package/dist/esm/components/navigation/app-level/activity-bar.js.map +1 -1
  517. package/dist/esm/components/navigation/app-level/activity-bar.labels.d.ts.map +1 -1
  518. package/dist/esm/components/navigation/app-level/command-menu.d.ts.map +1 -1
  519. package/dist/esm/components/navigation/app-level/command-menu.js +2 -2
  520. package/dist/esm/components/navigation/app-level/command-menu.js.map +1 -1
  521. package/dist/esm/components/navigation/app-level/command-menu.labels.d.ts.map +1 -1
  522. package/dist/esm/components/navigation/app-level/control-panel.d.ts.map +1 -1
  523. package/dist/esm/components/navigation/app-level/control-panel.labels.d.ts.map +1 -1
  524. package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
  525. package/dist/esm/components/navigation/app-level/menu-user-org.js +10 -4
  526. package/dist/esm/components/navigation/app-level/menu-user-org.js.map +1 -1
  527. package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
  528. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js +7 -0
  529. package/dist/esm/components/navigation/app-level/menu-user-org.labels.js.map +1 -1
  530. package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
  531. package/dist/esm/components/navigation/app-level/menubar.js +36 -14
  532. package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
  533. package/dist/esm/components/navigation/app-level/menubar.labels.d.ts.map +1 -1
  534. package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
  535. package/dist/esm/components/navigation/app-level/navigation-back.js +31 -5
  536. package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
  537. package/dist/esm/components/navigation/app-level/navigation-back.labels.d.ts.map +1 -1
  538. package/dist/esm/components/navigation/app-level/notification-center.d.ts.map +1 -1
  539. package/dist/esm/components/navigation/app-level/notification-center.js.map +1 -1
  540. package/dist/esm/components/navigation/app-level/notification-center.labels.d.ts.map +1 -1
  541. package/dist/esm/components/navigation/app-level/notification-center.labels.js +15 -0
  542. package/dist/esm/components/navigation/app-level/notification-center.labels.js.map +1 -1
  543. package/dist/esm/components/navigation/app-level/quick-action-button.d.ts.map +1 -1
  544. package/dist/esm/components/navigation/app-level/quick-action-button.labels.d.ts.map +1 -1
  545. package/dist/esm/components/navigation/app-level/quick-action-button.labels.js +4 -0
  546. package/dist/esm/components/navigation/app-level/quick-action-button.labels.js.map +1 -1
  547. package/dist/esm/components/navigation/app-level/quick-switcher.d.ts.map +1 -1
  548. package/dist/esm/components/navigation/app-level/quick-switcher.labels.d.ts.map +1 -1
  549. package/dist/esm/components/navigation/app-level/sidebar.d.ts.map +1 -1
  550. package/dist/esm/components/navigation/app-level/sidebar.js +41 -25
  551. package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
  552. package/dist/esm/components/navigation/app-level/sidebar.labels.d.ts.map +1 -1
  553. package/dist/esm/components/navigation/app-level/sidebar.labels.js +1 -0
  554. package/dist/esm/components/navigation/app-level/sidebar.labels.js.map +1 -1
  555. package/dist/esm/components/navigation/app-level/status-bar.d.ts.map +1 -1
  556. package/dist/esm/components/navigation/app-level/status-bar.js +2 -2
  557. package/dist/esm/components/navigation/app-level/status-bar.js.map +1 -1
  558. package/dist/esm/components/navigation/app-level/status-bar.labels.d.ts.map +1 -1
  559. package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
  560. package/dist/esm/components/navigation/app-level/toolbar.js +2 -2
  561. package/dist/esm/components/navigation/app-level/toolbar.js.map +1 -1
  562. package/dist/esm/components/navigation/app-level/toolbar.labels.d.ts.map +1 -1
  563. package/dist/esm/components/navigation/app-level/utility-panel.d.ts.map +1 -1
  564. package/dist/esm/components/navigation/app-level/utility-panel.js +24 -6
  565. package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
  566. package/dist/esm/components/navigation/app-level/utility-panel.labels.d.ts.map +1 -1
  567. package/dist/esm/components/navigation/app-level/utility-panel.labels.js.map +1 -1
  568. package/dist/esm/components/navigation/breadcrumb.d.ts.map +1 -1
  569. package/dist/esm/components/navigation/breadcrumb.js +1 -1
  570. package/dist/esm/components/navigation/breadcrumb.js.map +1 -1
  571. package/dist/esm/components/navigation/breadcrumb.labels.d.ts.map +1 -1
  572. package/dist/esm/components/navigation/command.d.ts.map +1 -1
  573. package/dist/esm/components/navigation/command.js +2 -2
  574. package/dist/esm/components/navigation/command.js.map +1 -1
  575. package/dist/esm/components/navigation/command.labels.d.ts.map +1 -1
  576. package/dist/esm/components/navigation/menu-bar.d.ts.map +1 -1
  577. package/dist/esm/components/navigation/menu-bar.labels.d.ts.map +1 -1
  578. package/dist/esm/components/navigation/navbar.d.ts.map +1 -1
  579. package/dist/esm/components/navigation/navbar.labels.d.ts.map +1 -1
  580. package/dist/esm/components/navigation/sidebar.d.ts.map +1 -1
  581. package/dist/esm/components/navigation/sidebar.labels.d.ts.map +1 -1
  582. package/dist/esm/components/overlays/containers/alert-dialog.d.ts.map +1 -1
  583. package/dist/esm/components/overlays/containers/alert-dialog.js +11 -1
  584. package/dist/esm/components/overlays/containers/alert-dialog.js.map +1 -1
  585. package/dist/esm/components/overlays/containers/alert-dialog.labels.d.ts.map +1 -1
  586. package/dist/esm/components/overlays/containers/alert.d.ts.map +1 -1
  587. package/dist/esm/components/overlays/containers/alert.labels.d.ts.map +1 -1
  588. package/dist/esm/components/overlays/containers/dialog.d.ts.map +1 -1
  589. package/dist/esm/components/overlays/containers/dialog.js +11 -1
  590. package/dist/esm/components/overlays/containers/dialog.js.map +1 -1
  591. package/dist/esm/components/overlays/containers/dialog.labels.d.ts.map +1 -1
  592. package/dist/esm/components/overlays/containers/drawer.d.ts.map +1 -1
  593. package/dist/esm/components/overlays/containers/drawer.labels.d.ts.map +1 -1
  594. package/dist/esm/components/overlays/containers/sheet.d.ts.map +1 -1
  595. package/dist/esm/components/overlays/containers/sheet.labels.d.ts.map +1 -1
  596. package/dist/esm/components/overlays/floating/context-menu.d.ts.map +1 -1
  597. package/dist/esm/components/overlays/floating/context-menu.labels.d.ts.map +1 -1
  598. package/dist/esm/components/overlays/floating/dropdown-menu.d.ts.map +1 -1
  599. package/dist/esm/components/overlays/floating/dropdown-menu.labels.d.ts.map +1 -1
  600. package/dist/esm/components/overlays/floating/hover-card.d.ts.map +1 -1
  601. package/dist/esm/components/overlays/floating/hover-card.labels.d.ts.map +1 -1
  602. package/dist/esm/components/overlays/floating/popover.d.ts.map +1 -1
  603. package/dist/esm/components/overlays/floating/popover.labels.d.ts.map +1 -1
  604. package/dist/esm/components/overlays/floating/tooltip.d.ts.map +1 -1
  605. package/dist/esm/components/overlays/floating/tooltip.labels.d.ts.map +1 -1
  606. package/dist/esm/components/sections/accordion.d.ts.map +1 -1
  607. package/dist/esm/components/sections/accordion.labels.d.ts.map +1 -1
  608. package/dist/esm/components/sections/card.d.ts.map +1 -1
  609. package/dist/esm/components/sections/card.js +71 -6
  610. package/dist/esm/components/sections/card.js.map +1 -1
  611. package/dist/esm/components/sections/card.labels.d.ts.map +1 -1
  612. package/dist/esm/components/sections/collapsible.d.ts.map +1 -1
  613. package/dist/esm/components/sections/collapsible.labels.d.ts.map +1 -1
  614. package/dist/esm/components/sections/content-section.d.ts.map +1 -1
  615. package/dist/esm/components/sections/content-section.js +36 -6
  616. package/dist/esm/components/sections/content-section.js.map +1 -1
  617. package/dist/esm/components/sections/disclosure-nesting.d.ts.map +1 -1
  618. package/dist/esm/components/sections/option-gesture.d.ts +15 -0
  619. package/dist/esm/components/sections/option-gesture.d.ts.map +1 -0
  620. package/dist/esm/components/sections/option-gesture.js +66 -0
  621. package/dist/esm/components/sections/option-gesture.js.map +1 -0
  622. package/dist/esm/components/sections/pagination.d.ts.map +1 -1
  623. package/dist/esm/components/sections/pagination.labels.d.ts.map +1 -1
  624. package/dist/esm/components/sections/stacked-layout.d.ts.map +1 -1
  625. package/dist/esm/components/sections/stacked-layout.labels.d.ts.map +1 -1
  626. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  627. package/dist/esm/components/sections/stepper.js +5 -3
  628. package/dist/esm/components/sections/stepper.js.map +1 -1
  629. package/dist/esm/components/sections/stepper.labels.d.ts.map +1 -1
  630. package/dist/esm/components/sections/table.d.ts.map +1 -1
  631. package/dist/esm/components/sections/table.labels.d.ts.map +1 -1
  632. package/dist/esm/components/sections/tabs.d.ts.map +1 -1
  633. package/dist/esm/components/sections/tabs.js +60 -15
  634. package/dist/esm/components/sections/tabs.js.map +1 -1
  635. package/dist/esm/components/sections/tabs.labels.d.ts.map +1 -1
  636. package/dist/esm/components/typography/heading.d.ts.map +1 -1
  637. package/dist/esm/components/typography/heading.labels.d.ts.map +1 -1
  638. package/dist/esm/components/typography/label.d.ts.map +1 -1
  639. package/dist/esm/components/typography/label.labels.d.ts.map +1 -1
  640. package/dist/esm/components/typography/link.d.ts.map +1 -1
  641. package/dist/esm/components/typography/link.js +9 -3
  642. package/dist/esm/components/typography/link.js.map +1 -1
  643. package/dist/esm/components/typography/link.labels.d.ts.map +1 -1
  644. package/dist/esm/components/typography/text.d.ts +1 -1
  645. package/dist/esm/components/typography/text.d.ts.map +1 -1
  646. package/dist/esm/components/typography/text.js +3 -2
  647. package/dist/esm/components/typography/text.js.map +1 -1
  648. package/dist/esm/components/typography/text.labels.d.ts.map +1 -1
  649. package/dist/esm/components/typography/truncated-text.d.ts.map +1 -1
  650. package/dist/esm/config/billing-shell.presets.d.ts.map +1 -1
  651. package/dist/esm/config/index.d.ts.map +1 -1
  652. package/dist/esm/config/preset-design-system.d.ts.map +1 -1
  653. package/dist/esm/config/preset-design-system.js +37 -60
  654. package/dist/esm/config/preset-design-system.js.map +1 -1
  655. package/dist/esm/config/preset-error-pages.d.ts.map +1 -1
  656. package/dist/esm/config/preset-kits.d.ts.map +1 -1
  657. package/dist/esm/config/preset-navigation.d.ts.map +1 -1
  658. package/dist/esm/config/preset-navigation.js +23 -7
  659. package/dist/esm/config/preset-navigation.js.map +1 -1
  660. package/dist/esm/config/preset-resources.d.ts.map +1 -1
  661. package/dist/esm/config/preset-shell.d.ts.map +1 -1
  662. package/dist/esm/config/preset-utils.d.ts.map +1 -1
  663. package/dist/esm/config/presets.d.ts.map +1 -1
  664. package/dist/esm/config/resources/agent-work.resource-presets.d.ts +4 -0
  665. package/dist/esm/config/resources/agent-work.resource-presets.d.ts.map +1 -0
  666. package/dist/esm/config/resources/agent-work.resource-presets.js +115 -0
  667. package/dist/esm/config/resources/agent-work.resource-presets.js.map +1 -0
  668. package/dist/esm/config/resources/api-key-rotation-window.d.ts +22 -0
  669. package/dist/esm/config/resources/api-key-rotation-window.d.ts.map +1 -0
  670. package/dist/esm/config/resources/api-key-rotation-window.js +45 -0
  671. package/dist/esm/config/resources/api-key-rotation-window.js.map +1 -0
  672. package/dist/esm/config/resources/application.resource-presets.d.ts +2 -0
  673. package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
  674. package/dist/esm/config/resources/application.resource-presets.js +268 -26
  675. package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
  676. package/dist/esm/config/resources/billing.resource-presets.d.ts +4 -3
  677. package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
  678. package/dist/esm/config/resources/billing.resource-presets.js +241 -111
  679. package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
  680. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts +4 -0
  681. package/dist/esm/config/resources/conversation-threads.resource-presets.d.ts.map +1 -0
  682. package/dist/esm/config/resources/conversation-threads.resource-presets.js +105 -0
  683. package/dist/esm/config/resources/conversation-threads.resource-presets.js.map +1 -0
  684. package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
  685. package/dist/esm/config/resources/guidance.resource-presets.js +39 -16
  686. package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
  687. package/dist/esm/config/resources/identity.resource-presets.d.ts +0 -13
  688. package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
  689. package/dist/esm/config/resources/identity.resource-presets.js +71 -17
  690. package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
  691. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts +6 -0
  692. package/dist/esm/config/resources/inbound-deliveries.resource-presets.d.ts.map +1 -0
  693. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js +112 -0
  694. package/dist/esm/config/resources/inbound-deliveries.resource-presets.js.map +1 -0
  695. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts +4 -0
  696. package/dist/esm/config/resources/inbound-email.resource-presets.d.ts.map +1 -0
  697. package/dist/esm/config/resources/inbound-email.resource-presets.js +182 -0
  698. package/dist/esm/config/resources/inbound-email.resource-presets.js.map +1 -0
  699. package/dist/esm/config/resources/index.d.ts.map +1 -1
  700. package/dist/esm/config/resources/index.js +9 -2
  701. package/dist/esm/config/resources/index.js.map +1 -1
  702. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts +4 -0
  703. package/dist/esm/config/resources/legal-holds.resource-presets.d.ts.map +1 -0
  704. package/dist/esm/config/resources/legal-holds.resource-presets.js +76 -0
  705. package/dist/esm/config/resources/legal-holds.resource-presets.js.map +1 -0
  706. package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
  707. package/dist/esm/config/resources/organizations.resource-presets.js +216 -35
  708. package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
  709. package/dist/esm/config/resources/resource.config.utils.d.ts +20 -0
  710. package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
  711. package/dist/esm/config/resources/resource.config.utils.js +20 -0
  712. package/dist/esm/config/resources/resource.config.utils.js.map +1 -1
  713. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts +5 -0
  714. package/dist/esm/config/resources/retention-enforcement.resource-presets.d.ts.map +1 -0
  715. package/dist/esm/config/resources/retention-enforcement.resource-presets.js +74 -0
  716. package/dist/esm/config/resources/retention-enforcement.resource-presets.js.map +1 -0
  717. package/dist/esm/config/resources/security.resource-presets.d.ts +11 -3
  718. package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
  719. package/dist/esm/config/resources/security.resource-presets.js +685 -99
  720. package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
  721. package/dist/esm/config/resources/service-providers.resource-presets.d.ts +4 -0
  722. package/dist/esm/config/resources/service-providers.resource-presets.d.ts.map +1 -0
  723. package/dist/esm/config/resources/service-providers.resource-presets.js +321 -0
  724. package/dist/esm/config/resources/service-providers.resource-presets.js.map +1 -0
  725. package/dist/esm/config/resources/webhooks.resource-presets.d.ts +4 -3
  726. package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
  727. package/dist/esm/config/resources/webhooks.resource-presets.js +102 -26
  728. package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
  729. package/dist/esm/index.d.ts +7 -1
  730. package/dist/esm/index.d.ts.map +1 -1
  731. package/dist/esm/index.js +7 -1
  732. package/dist/esm/index.js.map +1 -1
  733. package/dist/esm/lottie/lottie.content.definitions.d.ts.map +1 -1
  734. package/dist/esm/lottie/lottie.definitions.d.ts.map +1 -1
  735. package/dist/esm/mermaid-stub.d.ts.map +1 -1
  736. package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
  737. package/dist/esm/registration/register-common-enums.js +63 -34
  738. package/dist/esm/registration/register-common-enums.js.map +1 -1
  739. package/dist/esm/registration/register-default-animations.d.ts.map +1 -1
  740. package/dist/esm/registration/register-default-icons.d.ts.map +1 -1
  741. package/dist/esm/registration/register-default-icons.js +3 -1
  742. package/dist/esm/registration/register-default-icons.js.map +1 -1
  743. package/dist/esm/registration/register-default-presets.d.ts.map +1 -1
  744. package/dist/esm/registration/register-default-presets.js +32 -4
  745. package/dist/esm/registration/register-default-presets.js.map +1 -1
  746. package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
  747. package/dist/esm/registration/register-provider-components.js +11 -0
  748. package/dist/esm/registration/register-provider-components.js.map +1 -1
  749. package/dist/esm/shiki-subset.d.ts +11 -3
  750. package/dist/esm/shiki-subset.d.ts.map +1 -1
  751. package/dist/esm/shiki-subset.js +10 -2
  752. package/dist/esm/shiki-subset.js.map +1 -1
  753. package/dist/esm/theme-exports.d.ts.map +1 -1
  754. package/dist/esm/themes/cozy.theme.d.ts.map +1 -1
  755. package/dist/esm/themes/cozy.theme.js +19 -5
  756. package/dist/esm/themes/cozy.theme.js.map +1 -1
  757. package/dist/esm/themes/dense.theme.d.ts.map +1 -1
  758. package/dist/esm/themes/dense.theme.js +76 -10
  759. package/dist/esm/themes/dense.theme.js.map +1 -1
  760. package/dist/esm/themes/editorial.theme.d.ts.map +1 -1
  761. package/dist/esm/themes/editorial.theme.js +19 -5
  762. package/dist/esm/themes/editorial.theme.js.map +1 -1
  763. package/dist/esm/themes/glass.theme.d.ts.map +1 -1
  764. package/dist/esm/themes/glass.theme.js +5 -1
  765. package/dist/esm/themes/glass.theme.js.map +1 -1
  766. package/dist/esm/themes/neo-brutalist.theme.d.ts.map +1 -1
  767. package/dist/esm/themes/neo-brutalist.theme.js +9 -2
  768. package/dist/esm/themes/neo-brutalist.theme.js.map +1 -1
  769. package/dist/esm/themes/terminal.theme.d.ts.map +1 -1
  770. package/dist/esm/themes/terminal.theme.js +19 -5
  771. package/dist/esm/themes/terminal.theme.js.map +1 -1
  772. package/dist/esm/themes/trading.theme.d.ts.map +1 -1
  773. package/dist/esm/themes/trading.theme.js +22 -6
  774. package/dist/esm/themes/trading.theme.js.map +1 -1
  775. package/dist/tsconfig.build.tsbuildinfo +1 -1
  776. package/package.json +31 -45
  777. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts +0 -16
  778. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +0 -1
  779. package/dist/esm/components/form/controls/form-field-checkbox-group.js +0 -143
  780. package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +0 -1
@@ -1,39 +1,67 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { resourceUIBehavior, resourceUIBehaviorFrom, polymorphicResourceUIBehavior, polymorphicResourceUIBehaviorFrom, StandardIconReference, ResourceOperationActionScope, } from '@wildo-ai/saas-frontend-lib';
3
- import { DisplayField, DisplayLayout, FormField, FormLayout, ObjectScope, Section, SummaryLayout, useFormTemplateContext, useDisplayTemplateContext, ResourceLayoutPreset_Create_SamlWizard, ResourceLayoutPreset_Read_SsoSaml, SummaryFlow, SummaryMeta, SummaryTitle, } from '@wildo-ai/saas-frontend-lib';
4
- import { BadgeSemanticVariant, BooleanDisplayMode, BooleanEditMode, BooleanLabellingValue, SectionMode, DisplayChromeMode, EditChromeMode, EnumDisplayMode, ShowWhenOperator, StringDisplayMode, } from '@wildo-ai/zod-decorators';
5
- import { Key, ShieldCheck, Globe, Unlink, Fingerprint, UserCog, KeyRound, Radio, AlertTriangle, RotateCw, RefreshCw, PowerOff, Power, CalendarPlus, ChartColumn, Download, Trash2, PlugZap, Search, ShieldX, } from 'lucide-react';
6
- import { CoreResourceType as R, CoreResourceOperation as Op, ApiKeyStatus, OrgApiKeys_Operations, AuditLogs_Operations, SiemDeliveryDlq_Operations, SsoConnection_Operations, ScimTokens_Operations, orgApiKeysResourceConfiguration_InitializationFactory as orgApiKeysFactory, orgProviderCredentialsResourceConfiguration_InitializationFactory as orgProviderCredentialsFactory, OrganizationProviderCredentialSchema, userProviderCredentialsResourceConfiguration_InitializationFactory as userProviderCredentialsFactory, UserProviderCredentialSchema, ProviderCredentialValidationState, auditLogsResourceConfiguration_InitializationFactory as auditLogsFactory, siemExportConfigPolymorphicFactories, siemDeliveryDlqPolymorphicFactories, ssoConfigPolymorphicFactories, SsoConfig_Operations, ssoConnectionPolymorphicFactories, scimProvisioningConfigPolymorphicFactories, scimTokensPolymorphicFactories, ApiKeyOrganizationSchema, AuditableEvent_BaseSchema, SiemExportConfigBaseSchema, SiemDeliveryDlqBaseSchema, SiemDeliveryDlqStatus, SsoConfigBaseSchema, SsoConnectionBaseSchema, ScimProvisioningConfigBaseSchema, ScimTokenBaseSchema, SsoProtocol, SIEMAuthMethod, } from '@wildo-ai/saas-models';
7
- import { addressable, notAddressable } from './resource.config.utils.js';
2
+ /**
3
+ * Security & Compliance — Resource frontend presets
4
+ *
5
+ * Domain: ORG_API_KEYS, OAUTH_CLIENTS_ORGANIZATION, AUDIT_LOGS, SIEM (polymorphic),
6
+ * SSO_CONFIG (poly), SSO_CONNECTIONS (poly), SCIM_PROVISIONING (poly), SCIM_TOKENS (poly)
7
+ *
8
+ * SIEM layout JSX lives in this file next to `layout.refs` + `fields` so section chrome
9
+ * and primitive UI params stay co-located with the preset. Edit/display templates are
10
+ * inlined as arrow functions so `useFormTemplateContext` / `useDisplayTemplateContext`
11
+ * are immediately available for future conditional rendering. The scope-level CONFIGURATION records
12
+ * here — SIEM export, SSO config, SCIM provisioning — declare the full settings chrome
13
+ * (`display` + `summary` + `edit`), because each is reached as a READ inside the Settings Hub and is
14
+ * opened to confirm a value far more often than to change one; only sections that differ (e.g. the
15
+ * status toggle) set `chromeMode` explicitly. The COLLECTIONS beside them (SSO connections, the SIEM
16
+ * dead-letter queue, SCIM tokens) declare none on purpose: a list has no label/value rows for the
17
+ * treatment to apply to.
18
+ * Other resources here use field-level UI only until they need custom sections; enum badges use
19
+ * `showDescription: true` like billing.
20
+ */
21
+ import React from 'react';
22
+ import { resolveVocabularyWordKey } from '@wildo-ai/presets-components-models';
23
+ import { resourceUIBehavior, resourceUIBehaviorFrom, polymorphicResourceUIBehavior, polymorphicResourceUIBehaviorFrom, StandardIconReference, ResourceOperationActionScope, ActionVisibility, ResourceLayoutInlineEditDefault, CollectionDisplayMode, useFlowsActorsSafe, unresolvedLabel, } from '@wildo-ai/saas-frontend-lib';
24
+ import { DisplayField, DisplayLayout, FormField, FormLayout, ObjectScope, Section, SummaryLayout, useFormTemplateContext, useDisplayTemplateContext, ResourceLayoutPreset_Create_SamlWizard, ResourceLayoutPreset_Read_SsoSaml, SummaryFlow, SummaryMeta, SummaryTitle, ResourceHeaderTitle, } from '@wildo-ai/saas-frontend-lib';
25
+ import { BadgeSemanticVariant, BooleanDisplayMode, BooleanEditMode, BooleanLabellingValue, SectionMode, DisplayChromeMode, EditChromeMode, EnumDisplayMode, ShowWhenOperator, StringDisplayMode, StringEditMode, } from '@wildo-ai/zod-decorators';
26
+ import { Key, ShieldCheck, Globe, Unlink, Fingerprint, UserCog, KeyRound, Radio, AlertTriangle, RotateCw, RefreshCw, PowerOff, Power, CalendarPlus, ChartColumn, Download, Trash2, PlugZap, Search, ShieldX, Bot, } from 'lucide-react';
27
+ import { CoreResourceType as R, CoreResourceOperation as Op, ApiKeyStatus, OrgApiKeys_Operations, AuditLogs_Operations, SiemDeliveryDlq_Operations, SsoConnection_Operations, ScimTokens_Operations, orgApiKeysResourceConfiguration_InitializationFactory as orgApiKeysFactory, orgOAuthClientsResourceConfiguration_InitializationFactory as orgOAuthClientsFactory, OAuthClientOrganizationSchema, OAuthClientStatus, OrgOAuthClients_Operations, orgProviderCredentialsResourceConfiguration_InitializationFactory as orgProviderCredentialsFactory, OrganizationProviderCredentialSchema, userProviderCredentialsResourceConfiguration_InitializationFactory as userProviderCredentialsFactory, UserProviderCredentialSchema, ProviderCredentialValidationState, auditLogsResourceConfiguration_InitializationFactory as auditLogsFactory, applicationAuditLogsResourceConfiguration_InitializationFactory as applicationAuditLogsFactory, siemExportConfigPolymorphicFactories, siemDeliveryDlqPolymorphicFactories, ssoConfigPolymorphicFactories, SsoConfig_Operations, ssoConnectionPolymorphicFactories, scimProvisioningConfigPolymorphicFactories, scimTokensPolymorphicFactories, ApiKeyOrganizationSchema, AuditableEvent_BaseSchema, AuditEventSeverity, SiemExportConfigBaseSchema, SiemDeliveryDlqBaseSchema, SiemDeliveryDlqStatus, SsoConfigBaseSchema, SsoConnectionBaseSchema, ScimProvisioningConfigBaseSchema, ScimTokenBaseSchema, SsoProtocol, SIEMAuthMethod, EngineOpenVocabulary, } from '@wildo-ai/saas-models';
28
+ import { ApiKeyRotationWindowRows } from './api-key-rotation-window.js';
29
+ import { addressable, notAddressable, ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE } from './resource.config.utils.js';
30
+ /*
31
+ * A registry — keys, connections, tokens — is comparable rows, so it renders as a TABLE with the headers written
32
+ * once, and cards stay one click away for a narrow screen. Named once because the admin lane restates each
33
+ * registry's LIST view and must not lose it.
34
+ */
35
+ const REGISTRY_TABLE = {
36
+ displayMode: CollectionDisplayMode.TABLE,
37
+ userSwitchableDisplayMode: true,
38
+ };
8
39
  // ── SIEM export config — field overrides (shared across polymorphic variants) ─
9
40
  const siemExportFieldOverrides = {
41
+ // Field descriptions are an EDIT aid — they say what to type. On the read pane, which an operator opens to
42
+ // confirm a value, they were a sentence under every row ("Controls whether event deliveries are sent." under
43
+ // "Enabled"), so `display` no longer asks for them; the form keeps them.
44
+ //
45
+ // On the card the value reads bare, and a bare checkmark says nothing about WHAT is true — so the summary
46
+ // renders the word ("Enabled" / "Disabled") instead of a label and a tick.
10
47
  enabled: (schema) => schema.shape.enabled.booleanUI({
11
48
  labellingValue: BooleanLabellingValue.ENABLED_DISABLED,
12
- display: { displayMode: BooleanDisplayMode.CHECKMARK, showDescription: true },
49
+ display: { displayMode: BooleanDisplayMode.CHECKMARK },
50
+ summaryOverride: { displayMode: BooleanDisplayMode.RAW },
13
51
  edit: { editMode: BooleanEditMode.SWITCH, showDescription: true },
14
52
  }),
15
53
  webhookUrl: (schema) => schema.shape.webhookUrl.stringUI({
16
- display: { displayMode: StringDisplayMode.COPY, showDescription: true },
54
+ display: { displayMode: StringDisplayMode.COPY },
17
55
  edit: { showDescription: true },
18
56
  }),
19
57
  authMethod: (schema) => schema.shape.authMethod.enumUI({
20
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
58
+ display: { displayMode: EnumDisplayMode.BADGE },
21
59
  edit: { showDescription: true, tooltip: true },
22
60
  }),
23
61
  eventFormat: (schema) => schema.shape.eventFormat.enumUI({
24
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
62
+ display: { displayMode: EnumDisplayMode.BADGE },
25
63
  edit: { showDescription: true },
26
64
  }),
27
- includeRawEventData: (schema) => schema.shape.includeRawEventData.booleanUI({
28
- labellingValue: BooleanLabellingValue.YES_NO,
29
- display: { displayMode: BooleanDisplayMode.CHECKMARK, showDescription: true },
30
- edit: { editMode: BooleanEditMode.SWITCH, showDescription: true },
31
- }),
32
- includeDeviceContext: (schema) => schema.shape.includeDeviceContext.booleanUI({
33
- labellingValue: BooleanLabellingValue.YES_NO,
34
- display: { displayMode: BooleanDisplayMode.CHECKMARK, showDescription: true },
35
- edit: { editMode: BooleanEditMode.SWITCH, showDescription: true },
36
- }),
37
65
  authCredential: (schema) => schema.shape.authCredential.showWhen({
38
66
  conditions: { field: 'authMethod', value: SIEMAuthMethod.NONE, operator: ShowWhenOperator.NOT_EQUALS },
39
67
  }),
@@ -41,71 +69,341 @@ const siemExportFieldOverrides = {
41
69
  conditions: { field: 'authMethod', value: SIEMAuthMethod.API_KEY_HEADER },
42
70
  }),
43
71
  };
72
+ /*
73
+ * An API key is read to decide whether to rotate, extend or retire it. The header is its NAME and its STATUS
74
+ * badge, so neither is a row below it. `scope` is not rendered anywhere: the organization schema fixes it to one
75
+ * literal, so on this screen it can only ever say "organization" — it rendered as an empty "Scope: —" on every
76
+ * card. The first card has no heading (it would restate the header) and no read section carries a description.
77
+ *
78
+ * `access` is gone as a section: it held the roles and the description, and a heading over the one row that
79
+ * matters ("Access" above "Roles") was a heading per field. Both now sit in the first card, beside the prefix.
80
+ */
81
+ function OrgApiKeyHeader() {
82
+ return (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] }));
83
+ }
44
84
  function OrgApiKeyDisplayTemplate() {
45
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "name" }), _jsx(DisplayField, { name: "scope" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "keyPrefix" })] }), _jsxs(Section, { name: "access", children: [_jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "description" })] }), _jsxs(Section, { name: "lifecycle", children: [_jsx(DisplayField, { name: "expiresAt" }), _jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "createdAt" })] })] }));
85
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "keyPrefix" }), _jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "description" })] }), _jsxs(Section, { name: "lifecycle", hideDescription: true, children: [_jsx(DisplayField, { name: "expiresAt" }), _jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "createdAt" }), _jsx(ApiKeyRotationWindowRows, {})] })] }));
46
86
  }
87
+ /*
88
+ * The CREATE form (this resource has no UPDATE: a key changes through its own verbs — rotate, deactivate,
89
+ * extend). One column, no headings: five fields do not need grouping, and a heading over two of them named
90
+ * the page. The name first and focused; the description is prose, so a textarea; status last, since a new key
91
+ * is active unless somebody deliberately says otherwise.
92
+ */
47
93
  function OrgApiKeyEditTemplate() {
48
- return (_jsxs(FormLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(FormField, { name: "name" }), _jsx(FormField, { name: "status" }), _jsx(FormField, { name: "expiresAt" })] }), _jsxs(Section, { name: "access", children: [_jsx(FormField, { name: "roles" }), _jsx(FormField, { name: "description" })] })] }));
94
+ return (_jsxs(FormLayout, { children: [_jsx(FormField, { name: "name", autoFocus: true }), _jsx(FormField, { name: "description" }), _jsx(FormField, { name: "roles" }), _jsx(FormField, { name: "expiresAt" }), _jsx(FormField, { name: "status" })] }));
95
+ }
96
+ /*
97
+ * The autonomous agents a client may run as are the ones the APPLICATION declares (#1611), and the backend refuses
98
+ * any other ref — so the binding field offers exactly those, read from `/flows-actors/frontend-info`, instead of a
99
+ * free-text list an administrator fills from memory (#1812). Until the declaration arrives, or where the flows-actors
100
+ * plane is absent, the choice is empty rather than free text: there is nothing it would be honest to accept.
101
+ *
102
+ * Values are the refs themselves. They are identifiers the application names, not a closed engine vocabulary with
103
+ * words in the label tree, so a ref is what an administrator sees — and what every audit row records.
104
+ */
105
+ function DeclaredAutonomousAgentsFormField() {
106
+ const flowsActors = useFlowsActorsSafe();
107
+ // Asked for explicitly: the provider bootstraps the declaration only when the application configures a chat view,
108
+ // and an application with none (the scaffold, Wonder CRM) would otherwise offer an empty choice (#1812 review).
109
+ const requestAutonomousAgents = flowsActors?.requestAutonomousAgents;
110
+ React.useEffect(() => {
111
+ requestAutonomousAgents?.();
112
+ }, [requestAutonomousAgents]);
113
+ const declaredAutonomousAgentRefs = (flowsActors?.autonomousAgents ?? []).map((agent) => agent.ref);
114
+ return _jsx(FormField, { name: "autonomousAgentRefs", allowedValues: declaredAutonomousAgentRefs });
49
115
  }
116
+ /*
117
+ * ONE flat form for every operation of an organization OAuth client, like an API key's. A field the operation does
118
+ * not accept hides itself, so CREATE shows the registration fields and `setAutonomousAgents` shows only the agent
119
+ * list (`autonomousAgentRefs` is excluded from CREATE: a client is registered first, then bound). Sections were
120
+ * rejected here: a section renders its heading whether or not anything under it survives, so the binding form would
121
+ * have carried "Access" and "Redirects" headings over nothing.
122
+ */
123
+ function OrgOAuthClientEditTemplate() {
124
+ return (_jsxs(FormLayout, { children: [_jsx(FormField, { name: "name", autoFocus: true }), _jsx(FormField, { name: "description" }), _jsx(FormField, { name: "expiresAt" }), _jsx(FormField, { name: "allowedGrants" }), _jsx(FormField, { name: "allowedScopes" }), _jsx(FormField, { name: "roles" }), _jsx(FormField, { name: "tokenEndpointAuthMethod" }), _jsx(FormField, { name: "requiresConsent" }), _jsx(FormField, { name: "redirectUris" }), _jsx(FormField, { name: "postLogoutRedirectUris" }), _jsx(DeclaredAutonomousAgentsFormField, {})] }));
125
+ }
126
+ /*
127
+ * A card: the name, then the status as a badge and the key's visible prefix. The prefix keeps its label — a
128
+ * bare "wkprobeB" beside a badge reads as a second name, not as the first characters of the secret.
129
+ */
50
130
  function OrgApiKeySummaryTemplate() {
51
- return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "scope" }), _jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "keyPrefix" })] })] }));
131
+ return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "keyPrefix" })] })] }));
52
132
  }
133
+ /*
134
+ * An audit event, read once for what happened and once for who did it. The header is its NAME — the event type
135
+ * and the instant, in the viewer's date-time format — so neither is a row below it, and the overview card has no
136
+ * heading of its own (it would restate the header). No read section carries a description: "Review all
137
+ * application activity" and "See who performed each action" were prompts, on a page that already shows it.
138
+ * Every actor row hides when empty — most events have one actor, and a column of dashes said nothing.
139
+ */
53
140
  function AuditLogDisplayTemplate() {
54
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "eventType" }), _jsx(DisplayField, { name: "eventCategory" }), _jsx(DisplayField, { name: "severity" }), _jsx(DisplayField, { name: "riskLevel" })] }), _jsxs(Section, { name: "actors", children: [_jsx(DisplayField, { name: "userId" }), _jsx(DisplayField, { name: "organizationId" })] }), _jsxs(Section, { name: "payload", children: [_jsx(DisplayField, { name: "eventData" }), _jsx(DisplayField, { name: "createdAt" })] })] }));
141
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "eventCategory" }), _jsx(DisplayField, { name: "severity" }), _jsx(DisplayField, { name: "riskLevel" })] }), _jsxs(Section, { name: "actors", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(DisplayField, { name: "actorKind" }), _jsx(DisplayField, { name: "userId" }), _jsx(DisplayField, { name: "agentActor" }), _jsx(DisplayField, { name: "delegatingClientId" }), _jsx(DisplayField, { name: "principalCredentialId" }), _jsx(DisplayField, { name: "actingViaServiceProviderRelationshipId" }), _jsx(DisplayField, { name: "providerOrganizationId" }), _jsx(DisplayField, { name: "organizationId" })] }), _jsx(Section, { name: "payload", appearance: SectionMode.CARD, chromeMode: DisplayChromeMode.HIDDEN, hideDescription: true, children: _jsx(DisplayField, { name: "eventData" }) })] }));
55
142
  }
143
+ /*
144
+ * A card in a list grouped by DAY: the event type, then its severity as a badge and who acted, bare. The date is
145
+ * the group heading above it, so the card does not repeat it; the exact instant is the read page's name.
146
+ */
56
147
  function AuditLogSummaryTemplate() {
57
- return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "eventType" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "eventCategory" }), _jsx(DisplayField, { name: "severity" }), _jsx(DisplayField, { name: "createdAt" })] })] }));
148
+ return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "eventType" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "severity" }), _jsx(DisplayField, { name: "eventCategory" }), _jsx(DisplayField, { name: "actorKind" })] })] }));
149
+ }
150
+ /**
151
+ * An audit event's name, shared by both audit doors: the WORD for its type (`system_enums.CoreAuditableEventType.<type>`,
152
+ * #1791) and the instant it happened, in the viewer's date-time format — many events share a day, so the time is part
153
+ * of the name. `eventType` used to be printed raw (`user_login`); an event type with no word still shows its value,
154
+ * which is a missing label looking missing. `eventType` is required on every event.
155
+ */
156
+ function auditEventName({ currentObject, t, formatDateTime }) {
157
+ const wordKey = resolveVocabularyWordKey(EngineOpenVocabulary.CORE_AUDITABLE_EVENT_TYPE, currentObject.eventType);
158
+ const word = t(wordKey);
159
+ const type = word === wordKey ? unresolvedLabel(currentObject.eventType) : word;
160
+ return currentObject.createdAt ? `${type} — ${formatDateTime(currentObject.createdAt)}` : type;
161
+ }
162
+ /**
163
+ * Chrome and field decorators shared by both audit doors (tenant and application-wide): one object, one reading.
164
+ * Settings rows on the read page, bare values on a card, empty actor rows hidden, severity as a coloured badge.
165
+ */
166
+ function auditLogPresentation(schemaShape) {
167
+ const hideWhenEmpty = { display: { hideWhenEmpty: true } };
168
+ return {
169
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
170
+ fields: {
171
+ severity: schemaShape.severity.enumUI({
172
+ display: { displayMode: EnumDisplayMode.BADGE },
173
+ values: {
174
+ [AuditEventSeverity.INFO]: { color: BadgeSemanticVariant.SECONDARY },
175
+ [AuditEventSeverity.WARNING]: { color: BadgeSemanticVariant.WARNING },
176
+ [AuditEventSeverity.CRITICAL]: { color: BadgeSemanticVariant.DESTRUCTIVE },
177
+ },
178
+ }),
179
+ userId: schemaShape.userId.stringUI(hideWhenEmpty),
180
+ agentActor: schemaShape.agentActor.objectUI(hideWhenEmpty),
181
+ delegatingClientId: schemaShape.delegatingClientId.stringUI(hideWhenEmpty),
182
+ principalCredentialId: schemaShape.principalCredentialId.stringUI(hideWhenEmpty),
183
+ actingViaServiceProviderRelationshipId: schemaShape.actingViaServiceProviderRelationshipId.stringUI(hideWhenEmpty),
184
+ providerOrganizationId: schemaShape.providerOrganizationId.stringUI(hideWhenEmpty),
185
+ organizationId: schemaShape.organizationId.stringUI(hideWhenEmpty),
186
+ },
187
+ };
58
188
  }
59
189
  function SiemExportSummaryTemplate() {
60
190
  return (_jsx(SummaryLayout, { flow: SummaryFlow.ROW, children: _jsx(DisplayField, { name: "enabled" }) }));
61
191
  }
192
+ /*
193
+ * A failed delivery is named by its failure reason and carries its status badge beside it, so the old
194
+ * `overview` card — which held exactly those two — is gone rather than repeating the header. What is left is
195
+ * the attempt record and the payload. The payload card's heading names the data, so the data itself carries no
196
+ * label (the audit trail's `payload` card, for the same reason).
197
+ */
198
+ function SiemDlqHeader() {
199
+ return (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] }));
200
+ }
62
201
  function SiemDlqDisplayTemplate() {
63
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "failureReason" })] }), _jsxs(Section, { name: "delivery", children: [_jsx(DisplayField, { name: "eventId" }), _jsx(DisplayField, { name: "failureCount" }), _jsx(DisplayField, { name: "lastAttemptAt" }), _jsx(DisplayField, { name: "nextRetryAt" })] }), _jsx(Section, { name: "payload", children: _jsx(DisplayField, { name: "eventPayload" }) })] }));
202
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "delivery", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(DisplayField, { name: "eventId" }), _jsx(DisplayField, { name: "failureCount" }), _jsx(DisplayField, { name: "lastAttemptAt" }), _jsx(DisplayField, { name: "nextRetryAt" })] }), _jsx(Section, { name: "payload", appearance: SectionMode.CARD, chromeMode: DisplayChromeMode.HIDDEN, hideDescription: true, children: _jsx(DisplayField, { name: "eventPayload" }) })] }));
64
203
  }
65
204
  function SiemDlqSummaryTemplate() {
66
205
  return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "failureReason" }), _jsx(SummaryMeta, { children: _jsx(DisplayField, { name: "status" }) })] }));
67
206
  }
68
207
  function SsoConfigDisplayTemplate() {
69
- return (_jsxs(DisplayLayout, { children: [_jsx(Section, { name: "enforcement", appearance: SectionMode.CARD, children: _jsxs(ObjectScope, { name: "enforcement", children: [_jsx(DisplayField, { name: "requireSSO" }), _jsx(DisplayField, { name: "allowPasswordFallback" }), _jsx(DisplayField, { name: "graceLoginAttempts" })] }) }), _jsx(Section, { name: "domains", children: _jsxs(ObjectScope, { name: "domains", children: [_jsx(DisplayField, { name: "verifiedDomains" }), _jsx(DisplayField, { name: "ssoEnabledDomains" }), _jsx(DisplayField, { name: "domainHinting" }), _jsx(DisplayField, { name: "allowExternalDomains" }), _jsx(DisplayField, { name: "domainVerificationStatus" })] }) }), _jsx(Section, { name: "provisioning", children: _jsxs(ObjectScope, { name: "provisioning", children: [_jsx(DisplayField, { name: "autoCreateUsers" }), _jsx(DisplayField, { name: "autoUpdateUsers" }), _jsx(DisplayField, { name: "autoDeactivateUsers" }), _jsx(DisplayField, { name: "defaultRole" }), _jsx(DisplayField, { name: "requiredAttributes" }), _jsx(DisplayField, { name: "syncFrequencyHours" })] }) }), _jsx(Section, { name: "session", children: _jsxs(ObjectScope, { name: "sessionSettings", children: [_jsx(DisplayField, { name: "ssoSessionDurationMinutes" }), _jsx(DisplayField, { name: "requireReauthForSensitive" }), _jsx(DisplayField, { name: "singleLogoutEnabled" }), _jsx(DisplayField, { name: "maxConcurrentSessions" })] }) }), _jsx(Section, { name: "audit", children: _jsxs(ObjectScope, { name: "auditConfig", children: [_jsx(DisplayField, { name: "logAllSSOEvents" }), _jsx(DisplayField, { name: "logProviderSwitching" }), _jsx(DisplayField, { name: "logRoleMapping" }), _jsx(DisplayField, { name: "complianceReporting" }), _jsx(DisplayField, { name: "retentionDays" })] }) }), _jsx(Section, { name: "emergency", children: _jsxs(ObjectScope, { name: "emergencyAccess", children: [_jsx(DisplayField, { name: "enabled" }), _jsx(DisplayField, { name: "breakGlassAccounts" })] }) }), _jsxs(Section, { name: "oauth", children: [_jsxs(ObjectScope, { name: "oauth2ProviderRestrictions", children: [_jsx(DisplayField, { name: "allowedProviders" }), _jsx(DisplayField, { name: "blockedProviders" }), _jsx(DisplayField, { name: "requireEnterpriseSSOOnly" })] }), _jsx(DisplayField, { name: "socialCredentialOverrides" })] })] }));
208
+ return (_jsxs(DisplayLayout, { children: [_jsx(Section, { name: "enforcement", children: _jsxs(ObjectScope, { name: "enforcement", children: [_jsx(DisplayField, { name: "requireSSO" }), _jsx(DisplayField, { name: "allowPasswordFallback" }), _jsx(DisplayField, { name: "graceLoginAttempts" })] }) }), _jsx(Section, { name: "domains", children: _jsxs(ObjectScope, { name: "domains", children: [_jsx(DisplayField, { name: "verifiedDomains" }), _jsx(DisplayField, { name: "ssoEnabledDomains" }), _jsx(DisplayField, { name: "domainVerificationStatus" })] }) }), _jsx(Section, { name: "session", children: _jsx(ObjectScope, { name: "sessionSettings", children: _jsx(DisplayField, { name: "singleLogoutEnabled" }) }) }), _jsx(Section, { name: "emergency", children: _jsxs(ObjectScope, { name: "emergencyAccess", children: [_jsx(DisplayField, { name: "enabled" }), _jsx(DisplayField, { name: "breakGlassAccounts" })] }) }), _jsxs(Section, { name: "oauth", children: [_jsxs(ObjectScope, { name: "oauth2ProviderRestrictions", children: [_jsx(DisplayField, { name: "allowedProviders" }), _jsx(DisplayField, { name: "blockedProviders" }), _jsx(DisplayField, { name: "requireEnterpriseSSOOnly" })] }), _jsx(DisplayField, { name: "socialCredentialOverrides" })] })] }));
70
209
  }
71
210
  function SsoConfigSummaryTemplate() {
72
211
  return (_jsx(SummaryLayout, { flow: SummaryFlow.ROW, children: _jsx(ObjectScope, { name: "enforcement", children: _jsx(DisplayField, { name: "requireSSO" }) }) }));
73
212
  }
213
+ /*
214
+ * A connection is named by its display name and carries its protocol badge beside it, so neither is a row; the
215
+ * first card, which held both, keeps only what the header does not say and loses its heading. Only the section
216
+ * of the connection's OWN protocol renders: an OIDC connection showed a whole SAML section of empty rows (and
217
+ * the reverse), which read as unfinished configuration rather than as not applicable. No read section carries a
218
+ * description.
219
+ */
220
+ function SsoConnectionHeader() {
221
+ return (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "protocol", hideLabel: true, hideDescription: true, className: "w-auto" })] }));
222
+ }
74
223
  function SsoConnectionDisplayTemplate() {
75
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "displayName" }), _jsx(DisplayField, { name: "protocol" }), _jsx(DisplayField, { name: "enabled" }), _jsx(DisplayField, { name: "isDefault" }), _jsx(DisplayField, { name: "externalProviderId" })] }), _jsx(Section, { name: "oidc", children: _jsxs(ObjectScope, { name: "oidc", children: [_jsx(DisplayField, { name: "templateMode" }), _jsx(DisplayField, { name: "discoveryUrl" }), _jsx(DisplayField, { name: "issuer" }), _jsx(DisplayField, { name: "authorizationEndpoint" }), _jsx(DisplayField, { name: "tokenEndpoint" }), _jsx(DisplayField, { name: "userInfoEndpoint" }), _jsx(DisplayField, { name: "jwksUri" }), _jsx(DisplayField, { name: "endSessionEndpoint" }), _jsx(DisplayField, { name: "clientId" }), _jsx(DisplayField, { name: "scopes" }), _jsx(DisplayField, { name: "responseType" }), _jsx(DisplayField, { name: "responseMode" }), _jsx(DisplayField, { name: "pkceEnabled" }), _jsx(DisplayField, { name: "pkceMethod" }), _jsx(DisplayField, { name: "prompt" }), _jsx(DisplayField, { name: "acrValues" }), _jsx(DisplayField, { name: "maxAge" }), _jsx(DisplayField, { name: "claimsMapping" }), _jsx(DisplayField, { name: "auditSettings" })] }) }), _jsx(Section, { name: "saml", children: _jsxs(ObjectScope, { name: "saml", children: [_jsx(DisplayField, { name: "entityId" }), _jsx(DisplayField, { name: "ssoUrl" }), _jsx(DisplayField, { name: "sloUrl" }), _jsx(DisplayField, { name: "x509CertificatePem" }), _jsx(DisplayField, { name: "attributeMapping" }), _jsx(DisplayField, { name: "signRequests" }), _jsx(DisplayField, { name: "wantAssertionsSigned" }), _jsx(DisplayField, { name: "allowedClockDrift" }), _jsx(DisplayField, { name: "forceAuthn" }), _jsx(DisplayField, { name: "maxAuthAge" }), _jsx(DisplayField, { name: "nameIdFormat" }), _jsx(DisplayField, { name: "allowIdpInitiated" }), _jsx(DisplayField, { name: "auditSettings" })] }) }), _jsxs(Section, { name: "provisioning", children: [_jsx(DisplayField, { name: "autoCreateUsers" }), _jsx(DisplayField, { name: "autoVerifyEmail" }), _jsx(DisplayField, { name: "bypassAppMFA" }), _jsx(DisplayField, { name: "defaultRole" }), _jsx(DisplayField, { name: "allowedDomains" }), _jsx(DisplayField, { name: "roleMapping" }), _jsx(DisplayField, { name: "groupMapping" })] })] }));
224
+ const { data } = useDisplayTemplateContext();
225
+ const protocol = data?.protocol;
226
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "enabled" }), _jsx(DisplayField, { name: "isDefault" }), _jsx(DisplayField, { name: "externalProviderId" })] }), protocol !== SsoProtocol.SAML && (_jsx(Section, { name: "oidc", hideDescription: true, children: _jsxs(ObjectScope, { name: "oidc", children: [_jsx(DisplayField, { name: "templateMode" }), _jsx(DisplayField, { name: "discoveryUrl" }), _jsx(DisplayField, { name: "issuer" }), _jsx(DisplayField, { name: "authorizationEndpoint" }), _jsx(DisplayField, { name: "tokenEndpoint" }), _jsx(DisplayField, { name: "userInfoEndpoint" }), _jsx(DisplayField, { name: "jwksUri" }), _jsx(DisplayField, { name: "endSessionEndpoint" }), _jsx(DisplayField, { name: "clientId" }), _jsx(DisplayField, { name: "scopes" }), _jsx(DisplayField, { name: "responseType" }), _jsx(DisplayField, { name: "responseMode" }), _jsx(DisplayField, { name: "pkceEnabled" }), _jsx(DisplayField, { name: "pkceMethod" }), _jsx(DisplayField, { name: "prompt" }), _jsx(DisplayField, { name: "acrValues" }), _jsx(DisplayField, { name: "maxAge" }), _jsx(DisplayField, { name: "claimsMapping" })] }) })), protocol !== SsoProtocol.OIDC && (_jsx(Section, { name: "saml", hideDescription: true, children: _jsxs(ObjectScope, { name: "saml", children: [_jsx(DisplayField, { name: "entityId" }), _jsx(DisplayField, { name: "ssoUrl" }), _jsx(DisplayField, { name: "sloUrl" }), _jsx(DisplayField, { name: "x509CertificatePem" }), _jsx(DisplayField, { name: "attributeMapping" }), _jsx(DisplayField, { name: "signRequests" }), _jsx(DisplayField, { name: "wantAssertionsSigned" }), _jsx(DisplayField, { name: "allowedClockDrift" }), _jsx(DisplayField, { name: "forceAuthn" }), _jsx(DisplayField, { name: "maxAuthAge" }), _jsx(DisplayField, { name: "nameIdFormat" }), _jsx(DisplayField, { name: "allowIdpInitiated" })] }) })), _jsxs(Section, { name: "provisioning", hideDescription: true, children: [_jsx(DisplayField, { name: "autoCreateUsers" }), _jsx(DisplayField, { name: "defaultRole" }), _jsx(DisplayField, { name: "allowedDomains" }), _jsx(DisplayField, { name: "roleMapping" }), _jsx(DisplayField, { name: "groupMapping" })] })] }));
76
227
  }
228
+ /* A card: the name, then the protocol badge and whether the connection is on — the latter as the word, see `enabled`. */
77
229
  function SsoConnectionSummaryTemplate() {
78
230
  return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "displayName" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "protocol" }), _jsx(DisplayField, { name: "enabled" })] })] }));
79
231
  }
232
+ /*
233
+ * The pane's header already names it ("SCIM provisioning"), so its groups carry no headings: the first card's
234
+ * was "Overview" — a name for the page, not for a part of it — the second's put "Attribute mapping" over a single
235
+ * row labelled "Attribute mapping", and the third's called two record timestamps "User lifecycle", which is what
236
+ * the FIRST card governs. No section carries a description on read.
237
+ */
80
238
  function ScimProvisioningDisplayTemplate() {
81
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "autoCreateUsers" }), _jsx(DisplayField, { name: "autoVerifyEmail" }), _jsx(DisplayField, { name: "autoDeactivateUsers" }), _jsx(DisplayField, { name: "defaultRole" })] }), _jsx(Section, { name: "mapping", children: _jsx(DisplayField, { name: "attributeMapping" }) }), _jsxs(Section, { name: "lifecycle", children: [_jsx(DisplayField, { name: "createdAt" }), _jsx(DisplayField, { name: "updatedAt" })] })] }));
239
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "autoCreateUsers" }), _jsx(DisplayField, { name: "autoVerifyEmail" }), _jsx(DisplayField, { name: "autoDeactivateUsers" }), _jsx(DisplayField, { name: "defaultRole" })] }), _jsx(Section, { name: "mapping", hideTitle: true, hideDescription: true, children: _jsx(DisplayField, { name: "attributeMapping" }) }), _jsxs(Section, { name: "lifecycle", hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "createdAt" }), _jsx(DisplayField, { name: "updatedAt" })] })] }));
82
240
  }
83
241
  function ScimProvisioningSummaryTemplate() {
84
242
  return (_jsx(SummaryLayout, { flow: SummaryFlow.ROW, children: _jsx(DisplayField, { name: "autoCreateUsers" }) }));
85
243
  }
244
+ /*
245
+ * A token is named by its display name (the header), so the first card keeps whether it is active and who
246
+ * created it, without a heading of its own. No section carries a description on read.
247
+ */
86
248
  function ScimTokenDisplayTemplate() {
87
- return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, children: [_jsx(DisplayField, { name: "displayName" }), _jsx(DisplayField, { name: "isActive" }), _jsx(DisplayField, { name: "createdByUserId" })] }), _jsxs(Section, { name: "lifecycle", children: [_jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "expiresAt" }), _jsx(DisplayField, { name: "createdAt" })] })] }));
249
+ return (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "isActive" }), _jsx(DisplayField, { name: "createdByUserId" })] }), _jsxs(Section, { name: "lifecycle", hideDescription: true, children: [_jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "expiresAt" }), _jsx(DisplayField, { name: "createdAt" })] })] }));
88
250
  }
89
251
  function ScimTokenSummaryTemplate() {
90
252
  return (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "displayName" }), _jsx(SummaryMeta, { children: _jsx(DisplayField, { name: "isActive" }) })] }));
91
253
  }
254
+ /*
255
+ * A stored third-party credential, at either owner scope (the tenant's, or a person's own). Its NAME is
256
+ * `provider · slot` and its validation state is the badge beside it, so neither the provider, the slot nor the
257
+ * state is a row: the card showed "asana · ASANA_API_KEY", then "Provider: asana", then "Secret key:
258
+ * ASANA_API_KEY" — the title, twice more.
259
+ *
260
+ * No `<Section>` anywhere, so no `layout.refs`: a section is a contract the specification has to document slot
261
+ * for slot, and a credential is a handful of facts that no heading would group better than the rows do. Every
262
+ * optional fact hides when empty — a credential nobody has validated or used yet is the ordinary case, and a
263
+ * column of dashes under it said nothing.
264
+ */
265
+ function ProviderCredentialHeader() {
266
+ return (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "validationState", hideLabel: true, hideDescription: true, className: "w-auto" })] }));
267
+ }
268
+ /** `setByUserId` exists on the tenant's credential only: a person's own is, by construction, set by them. */
269
+ function providerCredentialDisplayTemplate(includeSetBy) {
270
+ return function ProviderCredentialDisplayTemplate() {
271
+ return (_jsxs(DisplayLayout, { children: [_jsx(DisplayField, { name: "enabled" }), _jsx(DisplayField, { name: "description" }), _jsx(DisplayField, { name: "validationError" }), _jsx(DisplayField, { name: "lastValidatedAt" }), _jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "secretSetAt" }), includeSetBy && _jsx(DisplayField, { name: "setByUserId" }), _jsx(DisplayField, { name: "connectionFacts" }), _jsx(DisplayField, { name: "createdAt" })] }));
272
+ };
273
+ }
274
+ /*
275
+ * The form a person reaches from a credential's Edit action: replace the secret, switch it off, or note what
276
+ * it is for. The secret first and focused, since replacing it is why the form is usually opened. The provider
277
+ * and slot are not offered — they are the credential's identity and cannot change — except on the API's CREATE,
278
+ * which these screens hide (#1040) and which would otherwise have no way to name them.
279
+ */
280
+ function ProviderCredentialEditTemplate() {
281
+ const { isExisting } = useFormTemplateContext();
282
+ return (_jsxs(FormLayout, { children: [!isExisting && _jsx(FormField, { name: "providerRef" }), !isExisting && _jsx(FormField, { name: "secretSlug" }), _jsx(FormField, { name: "secretValue", autoFocus: true }), _jsx(FormField, { name: "enabled" }), _jsx(FormField, { name: "description" })] }));
283
+ }
284
+ /* A card: the name (`provider · slot`), then the validation badge and whether the credential is on, as the word. */
285
+ function ProviderCredentialSummaryTemplate() {
286
+ return (_jsx(SummaryLayout, { children: _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "validationState" }), _jsx(DisplayField, { name: "enabled" })] }) }));
287
+ }
288
+ /**
289
+ * Chrome and field decorators shared by both provider-credential scopes. Settings rows on read (a credential is
290
+ * inspected one fact at a time), bare values on a card, a stacked form. `enabled` reads as the word on a card —
291
+ * a bare checkmark there says nothing about WHAT is true.
292
+ */
293
+ function providerCredentialPresentation(schemaShape) {
294
+ const hideWhenEmpty = { display: { hideWhenEmpty: true } };
295
+ return {
296
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.STACKED },
297
+ fields: {
298
+ enabled: schemaShape.enabled.booleanUI({
299
+ labellingValue: BooleanLabellingValue.ENABLED_DISABLED,
300
+ summaryOverride: { displayMode: BooleanDisplayMode.RAW },
301
+ }),
302
+ description: schemaShape.description.stringUI({
303
+ ...hideWhenEmpty,
304
+ edit: { editMode: StringEditMode.TEXTAREA },
305
+ }),
306
+ validationError: schemaShape.validationError.stringUI(hideWhenEmpty),
307
+ lastValidatedAt: schemaShape.lastValidatedAt.dateUI(hideWhenEmpty),
308
+ lastUsedAt: schemaShape.lastUsedAt.dateUI(hideWhenEmpty),
309
+ secretSetAt: schemaShape.secretSetAt.dateUI(hideWhenEmpty),
310
+ connectionFacts: schemaShape.connectionFacts.objectUI(hideWhenEmpty),
311
+ },
312
+ };
313
+ }
92
314
  export function buildSecurityMainPresets() {
93
315
  return {
316
+ /**
317
+ * An organization's OAuth clients — the machine credentials it registers for itself, and the ones an autonomous
318
+ * agent runs as (#1611). Until #1812 they had no screen, so creating, rotating or ending a client — and binding an
319
+ * agent to one — was REST only.
320
+ *
321
+ * The application-scope preset (`application.resource-presets.tsx`) is the model, section for section, because the
322
+ * two are one credential type at two scopes. Two differences, each for the resource's own reason:
323
+ * - an `autonomousAgents` section: which agents this client runs is a grant of standing authority to act
324
+ * unattended, so it is on the page rather than behind the action that changes it;
325
+ * - the Settings Hub chrome of an API key (stacked form, table registry), because this is where it sits — beside
326
+ * API keys, in the organization's settings — rather than on the application's administration page.
327
+ *
328
+ * `EXPIRE` is the expiry sweep's (INTERNAL_CALL) and carries no view. The secret is never laid out: the hashes
329
+ * are backend-only, and `secretPrefix` is the part a person uses to tell which credential a log line names.
330
+ */
331
+ [R.OAUTH_CLIENTS_ORGANIZATION]: resourceUIBehavior(orgOAuthClientsFactory, OAuthClientOrganizationSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
332
+ icon: KeyRound,
333
+ layout: {
334
+ refs: {
335
+ sections: ['overview', 'access', 'redirects', 'autonomousAgents', 'lifecycle'],
336
+ },
337
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.STACKED },
338
+ // The identity line: the client's name (the page title) and its status beside it. Neither is repeated below.
339
+ header: () => (_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-field", children: [_jsx(ResourceHeaderTitle, {}), _jsx(DisplayField, { name: "status", hideLabel: true, hideDescription: true, className: "w-auto" })] })),
340
+ display: () => (_jsxs(DisplayLayout, { children: [_jsxs(Section, { name: "overview", appearance: SectionMode.CARD, hideTitle: true, hideDescription: true, children: [_jsx(DisplayField, { name: "_id" }), _jsx(DisplayField, { name: "secretPrefix" }), _jsx(DisplayField, { name: "description" })] }), _jsxs(Section, { name: "access", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(DisplayField, { name: "allowedGrants" }), _jsx(DisplayField, { name: "allowedScopes" }), _jsx(DisplayField, { name: "roles" }), _jsx(DisplayField, { name: "tokenEndpointAuthMethod" }), _jsx(DisplayField, { name: "requiresConsent" })] }), _jsxs(Section, { name: "redirects", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(DisplayField, { name: "redirectUris" }), _jsx(DisplayField, { name: "postLogoutRedirectUris" })] }), _jsx(Section, { name: "autonomousAgents", appearance: SectionMode.CARD, children: _jsx(DisplayField, { name: "autonomousAgentRefs" }) }), _jsxs(Section, { name: "lifecycle", appearance: SectionMode.CARD, hideDescription: true, children: [_jsx(DisplayField, { name: "expiresAt" }), _jsx(DisplayField, { name: "lastUsedAt" }), _jsx(DisplayField, { name: "previousSecretPrefix" }), _jsx(DisplayField, { name: "previousSecretInvalidationDate" }), _jsx(DisplayField, { name: "createdAt" })] })] })),
341
+ summary: () => (_jsxs(SummaryLayout, { children: [_jsx(SummaryTitle, { name: "name" }), _jsxs(SummaryMeta, { children: [_jsx(DisplayField, { name: "status" }), _jsx(DisplayField, { name: "secretPrefix" }), _jsx(DisplayField, { name: "autonomousAgentRefs" })] })] })),
342
+ edit: OrgOAuthClientEditTemplate,
343
+ },
344
+ fields: {
345
+ // The application client's states and colours, because they mean the same things.
346
+ status: schemaShape.status.enumUI({
347
+ display: { displayMode: EnumDisplayMode.BADGE },
348
+ edit: { showDescription: true },
349
+ values: {
350
+ [OAuthClientStatus.ACTIVE]: { color: BadgeSemanticVariant.SUCCESS },
351
+ [OAuthClientStatus.INACTIVE]: { color: BadgeSemanticVariant.SECONDARY },
352
+ [OAuthClientStatus.EXPIRED]: { color: BadgeSemanticVariant.WARNING },
353
+ },
354
+ }),
355
+ // The prefix keeps its label on a card — bare, it reads as a second name.
356
+ secretPrefix: schemaShape.secretPrefix.stringUI({ summaryOverride: { chromeMode: DisplayChromeMode.INLINE } }),
357
+ description: schemaShape.description.stringUI({
358
+ display: { hideWhenEmpty: true },
359
+ edit: { editMode: StringEditMode.TEXTAREA },
360
+ }),
361
+ postLogoutRedirectUris: schemaShape.postLogoutRedirectUris.arrayUI({ display: { hideWhenEmpty: true } }),
362
+ // On a card only when the client runs an agent: most clients run none, and "Autonomous agents: —" on every
363
+ // card said nothing.
364
+ autonomousAgentRefs: schemaShape.autonomousAgentRefs.arrayUI({
365
+ summaryOverride: { chromeMode: DisplayChromeMode.INLINE, hideWhenEmpty: true },
366
+ }),
367
+ expiresAt: schemaShape.expiresAt.dateUI({ display: { hideWhenEmpty: true } }),
368
+ lastUsedAt: schemaShape.lastUsedAt.dateUI({ display: { hideWhenEmpty: true } }),
369
+ // The rotation window, shown only while the previous secret still authenticates.
370
+ previousSecretPrefix: schemaShape.previousSecretPrefix.stringUI({ display: { hideWhenEmpty: true, showDescription: true } }),
371
+ previousSecretInvalidationDate: schemaShape.previousSecretInvalidationDate.dateUI({ display: { hideWhenEmpty: true } }),
372
+ },
373
+ getFrontendResourceLabel: ({ currentObject }) => currentObject.name,
374
+ views: [
375
+ [Op.READ, notAddressable()],
376
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
377
+ // Creating a client returns its one-time `plainSecret` (`.isEphemeral()`), shown once by the reveal dialog.
378
+ [Op.CREATE, notAddressable()],
379
+ [Op.SEARCH, notAddressable()],
380
+ [Op.DELETE, notAddressable()],
381
+ [OrgOAuthClients_Operations.ROTATE, notAddressable({ iconOverride: RotateCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
382
+ [OrgOAuthClients_Operations.REGENERATE, notAddressable({ iconOverride: RefreshCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
383
+ [OrgOAuthClients_Operations.DEACTIVATE, notAddressable({ iconOverride: PowerOff, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
384
+ [OrgOAuthClients_Operations.REACTIVATE, notAddressable({ iconOverride: Power, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
385
+ [OrgOAuthClients_Operations.SET_AUTONOMOUS_AGENTS, notAddressable({ iconOverride: Bot, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
386
+ ],
387
+ })),
94
388
  [R.ORG_API_KEYS]: resourceUIBehavior(orgApiKeysFactory, ApiKeyOrganizationSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
95
389
  icon: Key,
96
390
  layout: {
97
391
  refs: {
98
- sections: ['overview', 'access', 'lifecycle'],
392
+ sections: ['overview', 'lifecycle'],
99
393
  },
100
- // Settings-page chrome (Settings Hub → API keys): label-left / value-right rows.
101
- defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.INLINE, edit: EditChromeMode.SETTINGS_ROW },
394
+ // Settings rows on the read page (Settings Hub → API keys), bare values on a card, and a stacked
395
+ // create form: a key is authored once — a name, what it is for, what it may do — not tuned row by row.
396
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.STACKED },
397
+ header: OrgApiKeyHeader,
102
398
  display: OrgApiKeyDisplayTemplate,
103
399
  summary: OrgApiKeySummaryTemplate,
104
400
  edit: OrgApiKeyEditTemplate,
105
401
  },
106
402
  fields: {
403
+ // A badge with no sentence under it. "Determines whether the key can authenticate traffic." printed
404
+ // under every card's status is the field's EDIT help — the form keeps it.
107
405
  status: schemaShape.status.enumUI({
108
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
406
+ display: { displayMode: EnumDisplayMode.BADGE },
109
407
  edit: { showDescription: true },
110
408
  values: {
111
409
  [ApiKeyStatus.ACTIVE]: { color: BadgeSemanticVariant.SUCCESS },
@@ -113,16 +411,35 @@ export function buildSecurityMainPresets() {
113
411
  [ApiKeyStatus.EXPIRED]: { color: BadgeSemanticVariant.WARNING },
114
412
  },
115
413
  }),
414
+ // The one card value that keeps its label: bare, a prefix reads as a second name — see the summary.
415
+ keyPrefix: schemaShape.keyPrefix.stringUI({ summaryOverride: { chromeMode: DisplayChromeMode.INLINE } }),
416
+ description: schemaShape.description.stringUI({
417
+ display: { hideWhenEmpty: true },
418
+ edit: { editMode: StringEditMode.TEXTAREA },
419
+ }),
420
+ // A key with no expiry, or one never used, is ordinary — a dash on those rows said nothing.
421
+ expiresAt: schemaShape.expiresAt.dateUI({ display: { hideWhenEmpty: true } }),
422
+ lastUsedAt: schemaShape.lastUsedAt.dateUI({ display: { hideWhenEmpty: true } }),
423
+ // The rotation window, rendered only while the previous secret still authenticates (`ApiKeyRotationWindowRows`).
424
+ // The prefix row says what an empty end date means — after a regenerate the old secret has none and keeps
425
+ // working — so it carries its description; the end-date row hides itself when there is no date.
426
+ previousKeyPrefix: schemaShape.previousKeyPrefix.stringUI({ display: { hideWhenEmpty: true, showDescription: true } }),
427
+ previousKeyInvalidationDate: schemaShape.previousKeyInvalidationDate.dateUI({ display: { hideWhenEmpty: true } }),
116
428
  },
117
429
  getFrontendResourceLabel: ({ currentObject }) => currentObject.name,
118
430
  // The empty state's primary action is Create — surfaced because CREATE
119
431
  // declares a (non-addressable, overlay) view below. Creating a key returns
120
432
  // its one-time `plainKey` (`.isEphemeral()` on the CREATE response DTO) →
121
433
  // the ephemeral reveal dialog shows the secret exactly once.
122
- emptyState: { primaryAction: Op.CREATE },
123
434
  views: [
124
435
  [Op.READ, notAddressable()],
125
- [Op.LIST, addressable()],
436
+ // A key registry: name, status, prefix, expiry, last use. Comparable rows.
437
+ // CARDS is the framework default and nothing had ever declared otherwise, so every
438
+ // collection in the product rendered as stacked cards — ~150px per row, four people to a
439
+ // viewport, with each field's help text and label repeated on every card. TABLE writes the
440
+ // headers once. `userSwitchableDisplayMode` keeps cards one click away rather than removing
441
+ // a rendering somebody may prefer on a narrow screen.
442
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
126
443
  // CREATE has a view but is NOT URL-addressable — surface EMBEDDED; the create
127
444
  // form opens as a drill-in within the Settings Hub panel, not a routed page.
128
445
  // Its Create button still shows: action visibility is governed by the op
@@ -130,11 +447,11 @@ export function buildSecurityMainPresets() {
130
447
  [Op.CREATE, notAddressable()],
131
448
  [Op.SEARCH, notAddressable()],
132
449
  [Op.DELETE, notAddressable()],
133
- [OrgApiKeys_Operations.ROTATE, notAddressable({ iconOverride: RotateCw })],
134
- [OrgApiKeys_Operations.REGENERATE, notAddressable({ iconOverride: RefreshCw })],
135
- [OrgApiKeys_Operations.DEACTIVATE, notAddressable({ iconOverride: PowerOff })],
136
- [OrgApiKeys_Operations.REACTIVATE, notAddressable({ iconOverride: Power })],
137
- [OrgApiKeys_Operations.EXTEND_EXPIRY, notAddressable({ iconOverride: CalendarPlus })],
450
+ [OrgApiKeys_Operations.ROTATE, notAddressable({ iconOverride: RotateCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
451
+ [OrgApiKeys_Operations.REGENERATE, notAddressable({ iconOverride: RefreshCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
452
+ [OrgApiKeys_Operations.DEACTIVATE, notAddressable({ iconOverride: PowerOff, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
453
+ [OrgApiKeys_Operations.REACTIVATE, notAddressable({ iconOverride: Power, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
454
+ [OrgApiKeys_Operations.EXTEND_EXPIRY, notAddressable({ iconOverride: CalendarPlus, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
138
455
  [OrgApiKeys_Operations.USAGE_STATS, notAddressable({ iconOverride: ChartColumn })],
139
456
  ],
140
457
  })),
@@ -149,8 +466,8 @@ export function buildSecurityMainPresets() {
149
466
  * ## No layout refs, deliberately
150
467
  *
151
468
  * Declaring `layout.refs.sections` creates a contract the resource SPECIFICATION has to document
152
- * slot for slot, validated at load; this resource has eight visible fields and no section would
153
- * earn that coupling. Field-level UI is the whole surface until it needs one.
469
+ * slot for slot, validated at load; this resource has a handful of visible facts and no section would
470
+ * earn that coupling. Its templates, shared with the person-scope sibling, are flat rows under a header.
154
471
  *
155
472
  * ## What the administrator can see, and what they cannot
156
473
  *
@@ -160,9 +477,19 @@ export function buildSecurityMainPresets() {
160
477
  */
161
478
  [R.ORG_PROVIDER_CREDENTIALS]: resourceUIBehavior(orgProviderCredentialsFactory, OrganizationProviderCredentialSchema, ({ schemaShape }) => ({
162
479
  icon: KeyRound,
480
+ layout: {
481
+ defaultChromeMode: providerCredentialPresentation(schemaShape).defaultChromeMode,
482
+ header: ProviderCredentialHeader,
483
+ display: providerCredentialDisplayTemplate(true),
484
+ summary: ProviderCredentialSummaryTemplate,
485
+ edit: ProviderCredentialEditTemplate,
486
+ },
163
487
  fields: {
488
+ ...providerCredentialPresentation(schemaShape).fields,
489
+ // Absent for a credential the system stored rather than a person — a dash there said nothing.
490
+ setByUserId: schemaShape.setByUserId.stringUI({ display: { hideWhenEmpty: true } }),
164
491
  validationState: schemaShape.validationState.enumUI({
165
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
492
+ display: { displayMode: EnumDisplayMode.BADGE },
166
493
  edit: { showDescription: true },
167
494
  values: {
168
495
  // UNVALIDATED is the honest default and is not a warning: storing a credential proves
@@ -176,24 +503,36 @@ export function buildSecurityMainPresets() {
176
503
  }),
177
504
  },
178
505
  getFrontendResourceLabel: ({ currentObject }) => `${currentObject.providerRef} · ${currentObject.secretSlug}`,
179
- emptyState: { primaryAction: Op.CREATE },
506
+ // No Create call to action, and no Create on the list either (#1040). A credential is pasted through the Connect
507
+ // tab beside this list, which offers only declared providers and each provider's declared slots. This list's
508
+ // CREATE form took both as free text, so a value could be stored in a slot nothing reads, and the refusal naming
509
+ // the valid slots never reached the person. The API's CREATE stays for callers that are not these screens.
510
+ emptyState: { primaryAction: false },
180
511
  views: [
181
512
  [Op.READ, notAddressable()],
182
513
  [Op.LIST, addressable()],
183
- [Op.CREATE, notAddressable()],
514
+ [Op.CREATE, notAddressable({ actionVisibility: ActionVisibility.HIDDEN })],
184
515
  [Op.UPDATE, notAddressable()],
185
516
  [Op.DELETE, notAddressable()],
186
517
  ],
187
518
  })),
188
519
  [R.USER_PROVIDER_CREDENTIALS]: resourceUIBehavior(userProviderCredentialsFactory, UserProviderCredentialSchema, ({ schemaShape }) => ({
189
520
  icon: KeyRound,
521
+ layout: {
522
+ defaultChromeMode: providerCredentialPresentation(schemaShape).defaultChromeMode,
523
+ header: ProviderCredentialHeader,
524
+ display: providerCredentialDisplayTemplate(false),
525
+ summary: ProviderCredentialSummaryTemplate,
526
+ edit: ProviderCredentialEditTemplate,
527
+ },
190
528
  fields: {
529
+ ...providerCredentialPresentation(schemaShape).fields,
191
530
  // The same three states as the tenant's, coloured identically on purpose: a person reading
192
531
  // their own connections and an administrator reading the tenant's are answering the same
193
532
  // question, and two colour languages for one vocabulary is how a reader learns to distrust
194
533
  // both. The WORDS come from the enum's i18n entry, authored once for every surface.
195
534
  validationState: schemaShape.validationState.enumUI({
196
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
535
+ display: { displayMode: EnumDisplayMode.BADGE },
197
536
  edit: { showDescription: true },
198
537
  values: {
199
538
  // UNVALIDATED is the honest default and is not a warning: storing a credential proves
@@ -208,28 +547,35 @@ export function buildSecurityMainPresets() {
208
547
  }),
209
548
  },
210
549
  getFrontendResourceLabel: ({ currentObject }) => `${currentObject.providerRef} · ${currentObject.secretSlug}`,
211
- emptyState: { primaryAction: Op.CREATE },
212
- // No `layout.refs`, matching the tenant sibling: this resource declares no layout sections in
213
- // its specification, and a preset naming refs the layout does not declare fails the
214
- // structural-slot validator at import time and crash-loops the companion.
550
+ // No Create call to action, and no Create on the list either (#1040). A credential is pasted through the Connect
551
+ // tab beside this list, which offers only declared providers and each provider's declared slots. This list's
552
+ // CREATE form took both as free text, so a value could be stored in a slot nothing reads, and the refusal naming
553
+ // the valid slots never reached the person. The API's CREATE stays for callers that are not these screens.
554
+ emptyState: { primaryAction: false },
555
+ // No `layout.refs`, matching the tenant sibling: the templates use no `<Section>`, this resource
556
+ // declares no layout sections in its specification, and a preset naming refs the specification does
557
+ // not document fails the structural-slot validator at import time and crash-loops the companion.
215
558
  views: [
216
559
  [Op.READ, notAddressable()],
217
560
  [Op.LIST, addressable()],
218
- [Op.CREATE, notAddressable()],
561
+ [Op.CREATE, notAddressable({ actionVisibility: ActionVisibility.HIDDEN })],
219
562
  [Op.UPDATE, notAddressable()],
220
563
  [Op.DELETE, notAddressable()],
221
564
  ],
222
565
  })),
223
566
  [R.AUDIT_LOGS]: resourceUIBehavior(auditLogsFactory, AuditableEvent_BaseSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
224
567
  icon: ShieldCheck,
225
- getFrontendResourceLabel: ({ currentObject }) => `${currentObject.eventType ?? 'Audit Event'} — ${currentObject.createdAt?.toISOString?.() ?? ''}`,
568
+ // An audit event is named by its type's word and the instant it happened — see `auditEventName`.
569
+ getFrontendResourceLabel: auditEventName,
226
570
  layout: {
227
571
  refs: {
228
572
  sections: ['overview', 'actors', 'payload'],
229
573
  },
574
+ defaultChromeMode: auditLogPresentation(schemaShape).defaultChromeMode,
230
575
  display: AuditLogDisplayTemplate,
231
576
  summary: AuditLogSummaryTemplate,
232
577
  },
578
+ fields: auditLogPresentation(schemaShape).fields,
233
579
  views: [
234
580
  [Op.READ, notAddressable()],
235
581
  // Audit-trail review dashboard: severity quick tabs (All/Info/Warning/…)
@@ -257,16 +603,28 @@ export function buildSecurityMainPresets() {
257
603
  refs: {
258
604
  sections: ['status', 'destination', 'authentication', 'format', 'advanced'],
259
605
  },
260
- defaultChromeMode: {
261
- edit: EditChromeMode.SETTINGS_ROW,
262
- },
606
+ // `display` and `summary` joined `edit` on 2026-09-18. Only the form carried the settings
607
+ // treatment, so the READ an operator actually opens rendered with the stacked default while
608
+ // its own edit form used rows — the same record, two shapes, depending on which verb you
609
+ // reached it by. The card is bare: its one value reads as the word ("Enabled"), see `enabled`.
610
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
611
+ // SIEM export configuration — a scope-level configuration record. A settings pane is a list of decisions an operator came to TAKE, so its
612
+ // writable fields are offered in place rather than behind a whole-pane edit mode. The set is
613
+ // DERIVED (not primary key, not excludeFromUpdate, not hidden, not opted out), so a field
614
+ // added to this schema tomorrow is covered without anyone remembering to decorate it.
615
+ defaultInlineEdit: ResourceLayoutInlineEditDefault.WRITABLE_FIELDS,
616
+ // And its empty rows say WHICH emptiness they are — "None yet" for a list with no members,
617
+ // "Not available" for a computed value, "No value" for a field awaiting input — instead of one
618
+ // em dash standing for all three. The surface policy's dash is right where a reader is scanning;
619
+ // on a settings row, which is read one at a time to decide something, it is an answer that
620
+ // refuses to answer.
621
+ defaultEmptyValue: 'placeholder',
263
622
  edit: () => {
264
- const { isExisting, operationType } = useFormTemplateContext();
265
- return (_jsxs(FormLayout, { children: [_jsx(Section, { name: "status", appearance: SectionMode.CARD, chromeMode: EditChromeMode.INLINE, children: _jsx(FormField, { name: "enabled" }) }), _jsx(Section, { name: "destination", appearance: SectionMode.CARD, children: _jsx(FormField, { name: "webhookUrl" }) }), _jsxs(Section, { name: "authentication", children: [_jsx(FormField, { name: "authMethod" }), _jsx(FormField, { name: "authCredential" }), _jsx(FormField, { name: "authHeaderName" })] }), _jsxs(Section, { name: "format", children: [_jsx(FormField, { name: "eventFormat" }), _jsxs(ObjectScope, { name: "eventFilter", children: [_jsx(FormField, { name: "categories" }), _jsx(FormField, { name: "severityMinimum" }), _jsx(FormField, { name: "specificEventTypes" })] })] }), _jsxs(Section, { name: "advanced", appearance: SectionMode.COLLAPSIBLE, defaultFocus: false, children: [_jsxs(ObjectScope, { name: "delivery", children: [_jsx(FormField, { name: "batchSize" }), _jsx(FormField, { name: "batchWindowSeconds" }), _jsx(FormField, { name: "retryAttempts" }), _jsx(FormField, { name: "retryBackoffSeconds" }), _jsx(FormField, { name: "timeoutSeconds" })] }), _jsx(FormField, { name: "customHeaders" }), _jsx(FormField, { name: "includeRawEventData" }), _jsx(FormField, { name: "includeDeviceContext" })] })] }));
623
+ return (_jsxs(FormLayout, { children: [_jsx(Section, { name: "status", appearance: SectionMode.CARD, chromeMode: EditChromeMode.INLINE, hideTitle: true, children: _jsx(FormField, { name: "enabled" }) }), _jsx(Section, { name: "destination", appearance: SectionMode.CARD, hideTitle: true, children: _jsx(FormField, { name: "webhookUrl" }) }), _jsxs(Section, { name: "authentication", children: [_jsx(FormField, { name: "authMethod" }), _jsx(FormField, { name: "authCredential" }), _jsx(FormField, { name: "authHeaderName" })] }), _jsxs(Section, { name: "format", children: [_jsx(FormField, { name: "eventFormat" }), _jsxs(ObjectScope, { name: "eventFilter", children: [_jsx(FormField, { name: "categories" }), _jsx(FormField, { name: "severityMinimum" }), _jsx(FormField, { name: "specificEventTypes" })] }), _jsxs(ObjectScope, { name: "exportProjection", children: [_jsx(FormField, { name: "disclosedTiers" }), _jsx(FormField, { name: "disclosedEventDataClasses" })] })] }), _jsxs(Section, { name: "advanced", appearance: SectionMode.COLLAPSIBLE, defaultFocus: false, children: [_jsxs(ObjectScope, { name: "delivery", children: [_jsx(FormField, { name: "retryAttempts" }), _jsx(FormField, { name: "retryBackoffSeconds" }), _jsx(FormField, { name: "timeoutSeconds" })] }), _jsx(FormField, { name: "customHeaders" })] })] }));
266
624
  },
267
625
  display: () => {
268
626
  const { data, isLoading } = useDisplayTemplateContext();
269
- return (_jsxs(DisplayLayout, { children: [_jsx(Section, { name: "status", appearance: SectionMode.CARD, children: _jsx(DisplayField, { name: "enabled" }) }), _jsx(Section, { name: "destination", appearance: SectionMode.CARD, children: _jsx(DisplayField, { name: "webhookUrl" }) }), _jsxs(Section, { name: "authentication", children: [_jsx(DisplayField, { name: "authMethod" }), _jsx(DisplayField, { name: "authCredential" }), _jsx(DisplayField, { name: "authHeaderName" })] }), _jsxs(Section, { name: "format", children: [_jsx(DisplayField, { name: "eventFormat" }), _jsxs(ObjectScope, { name: "eventFilter", children: [_jsx(DisplayField, { name: "categories" }), _jsx(DisplayField, { name: "severityMinimum" }), _jsx(DisplayField, { name: "specificEventTypes" })] })] }), _jsxs(Section, { name: "advanced", appearance: SectionMode.COLLAPSIBLE, defaultFocus: false, children: [_jsxs(ObjectScope, { name: "delivery", children: [_jsx(DisplayField, { name: "batchSize" }), _jsx(DisplayField, { name: "batchWindowSeconds" }), _jsx(DisplayField, { name: "retryAttempts" }), _jsx(DisplayField, { name: "retryBackoffSeconds" }), _jsx(DisplayField, { name: "timeoutSeconds" })] }), _jsx(DisplayField, { name: "customHeaders" }), _jsx(DisplayField, { name: "includeRawEventData" }), _jsx(DisplayField, { name: "includeDeviceContext" })] })] }));
627
+ return (_jsxs(DisplayLayout, { children: [_jsx(Section, { name: "status", appearance: SectionMode.CARD, hideTitle: true, children: _jsx(DisplayField, { name: "enabled" }) }), _jsx(Section, { name: "destination", appearance: SectionMode.CARD, hideTitle: true, children: _jsx(DisplayField, { name: "webhookUrl" }) }), _jsxs(Section, { name: "authentication", hideDescription: true, children: [_jsx(DisplayField, { name: "authMethod" }), _jsx(DisplayField, { name: "authCredential" }), _jsx(DisplayField, { name: "authHeaderName" })] }), _jsxs(Section, { name: "format", hideDescription: true, children: [_jsx(DisplayField, { name: "eventFormat" }), _jsxs(ObjectScope, { name: "eventFilter", children: [_jsx(DisplayField, { name: "categories" }), _jsx(DisplayField, { name: "severityMinimum" }), _jsx(DisplayField, { name: "specificEventTypes" })] }), _jsxs(ObjectScope, { name: "exportProjection", children: [_jsx(DisplayField, { name: "disclosedTiers" }), _jsx(DisplayField, { name: "disclosedEventDataClasses" })] })] }), _jsxs(Section, { name: "advanced", appearance: SectionMode.COLLAPSIBLE, defaultFocus: false, hideDescription: true, children: [_jsxs(ObjectScope, { name: "delivery", children: [_jsx(DisplayField, { name: "retryAttempts" }), _jsx(DisplayField, { name: "retryBackoffSeconds" }), _jsx(DisplayField, { name: "timeoutSeconds" })] }), _jsx(DisplayField, { name: "customHeaders" })] })] }));
270
628
  },
271
629
  summary: SiemExportSummaryTemplate,
272
630
  },
@@ -275,13 +633,14 @@ export function buildSecurityMainPresets() {
275
633
  webhookUrl: siemExportFieldOverrides.webhookUrl(schema),
276
634
  authMethod: siemExportFieldOverrides.authMethod(schema),
277
635
  eventFormat: siemExportFieldOverrides.eventFormat(schema),
278
- includeRawEventData: siemExportFieldOverrides.includeRawEventData(schema),
279
- includeDeviceContext: siemExportFieldOverrides.includeDeviceContext(schema),
280
636
  authCredential: siemExportFieldOverrides.authCredential(schema),
281
637
  authHeaderName: siemExportFieldOverrides.authHeaderName(schema),
282
638
  },
283
639
  views: [
284
640
  [Op.READ, addressable()],
641
+ // The edit this preset's form was always rendering, and nothing could save (#953): UPDATE became
642
+ // the administrator's API_CALL door. Not addressable — it opens from the READ view.
643
+ [Op.UPDATE, notAddressable()],
285
644
  ],
286
645
  variantOverrides: {
287
646
  [R.APPLICATION]: { views: [] },
@@ -296,15 +655,18 @@ export function buildSecurityMainPresets() {
296
655
  icon: AlertTriangle,
297
656
  layout: {
298
657
  refs: {
299
- sections: ['overview', 'delivery', 'payload'],
658
+ sections: ['delivery', 'payload'],
300
659
  },
660
+ // Settings rows on read, bare values on a card: the card is the failure reason and its status badge.
661
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
662
+ header: SiemDlqHeader,
301
663
  display: SiemDlqDisplayTemplate,
302
664
  summary: SiemDlqSummaryTemplate,
303
665
  },
304
666
  fields: {
305
- // Same billing-style visibility as ORG_API_KEYS / SSO protocol — list rows stay compact; descriptions come from schema metadata when present.
667
+ // A badge with no sentence under it on read; the enum's description is edit help.
306
668
  status: schema.shape.status.enumUI({
307
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
669
+ display: { displayMode: EnumDisplayMode.BADGE },
308
670
  edit: { showDescription: true },
309
671
  values: {
310
672
  [SiemDeliveryDlqStatus.PENDING_RETRY]: { color: BadgeSemanticVariant.WARNING },
@@ -312,6 +674,8 @@ export function buildSecurityMainPresets() {
312
674
  [SiemDeliveryDlqStatus.DELIVERED]: { color: BadgeSemanticVariant.SUCCESS },
313
675
  },
314
676
  }),
677
+ // Empty once the row is terminal (exhausted or delivered) — a dash there said nothing.
678
+ nextRetryAt: schema.shape.nextRetryAt.dateUI({ display: { hideWhenEmpty: true } }),
315
679
  },
316
680
  getFrontendResourceLabel: ({ currentObject }) => currentObject.failureReason,
317
681
  views: [
@@ -342,28 +706,84 @@ export function buildSecurityMainPresets() {
342
706
  { parentResourceType: R.ORGANIZATIONS, resourceType: R.ORGANIZATION_SSO_CONFIG },
343
707
  { parentResourceType: R.APPLICATION, resourceType: R.APPLICATION_SSO_CONFIG },
344
708
  ],
345
- }, ssoConfigPolymorphicFactories[R.ORGANIZATION_SSO_CONFIG], SsoConfigBaseSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
346
- icon: StandardIconReference.LOCK,
347
- layout: {
348
- refs: {
349
- sections: ['enforcement', 'domains', 'provisioning', 'session', 'audit', 'emergency', 'oauth'],
709
+ }, ssoConfigPolymorphicFactories[R.ORGANIZATION_SSO_CONFIG], SsoConfigBaseSchema, ({ schema, schemaShape, opsVariantResolver }) => {
710
+ /*
711
+ * The one sentence on this pane that is a warning rather than a restatement: each break-glass address is a
712
+ * standing way in with a password alone, so the list is kept short and reviewed. It belongs to the field it
713
+ * warns about, on the row an administrator edits in place and in the form — the pane's vertical tabs render
714
+ * no section description. Its words are the `whyItMatters` the SSO policy specification declares on this
715
+ * nested leaf (the labeller reads a nested field's spec under its dotted path). Without that declaration the
716
+ * generated description restated the label ("Break-glass accounts" under "Break-glass accounts").
717
+ * spec-cite: N/A — the quoted words are this application's own generated label, and "specification" is our
718
+ * SSO policy resource specification, not an external standard.
719
+ *
720
+ * Decorated here rather than through `fields`, whose keys are top-level: a decorator writes the nested
721
+ * declaration's own metadata in place, which is what `fields` relies on for top-level fields too.
722
+ */
723
+ schema.shape.emergencyAccess.shape.breakGlassAccounts.arrayUI({
724
+ display: { showDescription: true },
725
+ edit: { showDescription: true },
726
+ });
727
+ return {
728
+ icon: StandardIconReference.LOCK,
729
+ layout: {
730
+ // Settings-page chrome (Settings Hub): label-left / value-right rows. A scope-level
731
+ // configuration record is READ far more often than it is edited — an operator opens it to
732
+ // confirm a value — so the DISPLAY side needs the row treatment at least as much as the form.
733
+ // The card stays INLINE on purpose: it is ONE boolean (`enforcement.requireSSO`), and a bare checkmark
734
+ // says nothing about what is required. The value is nested, so a field-level `summaryOverride` cannot
735
+ // reach it — the layout default is the only place to keep its label.
736
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.INLINE, edit: EditChromeMode.SETTINGS_ROW },
737
+ // SSO policy — a scope-level configuration record; every field here is a decision. A settings pane is a list of decisions an operator came to TAKE, so its
738
+ // writable fields are offered in place rather than behind a whole-pane edit mode. The set is
739
+ // DERIVED (not primary key, not excludeFromUpdate, not hidden, not opted out), so a field
740
+ // added to this schema tomorrow is covered without anyone remembering to decorate it.
741
+ defaultInlineEdit: ResourceLayoutInlineEditDefault.WRITABLE_FIELDS,
742
+ // And its empty rows say WHICH emptiness they are — "None yet" for a list with no members,
743
+ // "Not available" for a computed value, "No value" for a field awaiting input — instead of one
744
+ // em dash standing for all three. The surface policy's dash is right where a reader is scanning;
745
+ // on a settings row, which is read one at a time to decide something, it is an answer that
746
+ // refuses to answer.
747
+ defaultEmptyValue: 'placeholder',
748
+ // Seven groups of decisions — enforcement, domains, provisioning, session, audit,
749
+ // emergency access, OAuth restrictions — and thirty fields between them. Stacked, the pane
750
+ // is a scroll in which the thing you came to change is below the fold and the six you did
751
+ // not is what you read on the way. Vertical tabs is what a settings surface of this size
752
+ // does: one group at a time, all of them named and reachable in one click, and the rail
753
+ // doubles as the answer to "what else does SSO decide here".
754
+ //
755
+ // Declared on the LAYOUT rather than on the seven sections: the section grouping keys on
756
+ // `(mode, its mode-specific props)` over consecutive siblings, so per-section it is an
757
+ // agreement N authors must keep, and a member that slips renders a second rail rather than
758
+ // failing. It is also what lets the Settings Hub know the pane carries a rail of its own
759
+ // and give it the wider frame — a prop inside a React template cannot be read by anything
760
+ // that has to size the surface around it.
761
+ defaultDisplaySectionAppearance: SectionMode.VERTICAL_TABS,
762
+ refs: {
763
+ sections: ['enforcement', 'domains', 'session', 'emergency', 'oauth'],
764
+ },
765
+ display: SsoConfigDisplayTemplate,
766
+ summary: SsoConfigSummaryTemplate,
350
767
  },
351
- display: SsoConfigDisplayTemplate,
352
- summary: SsoConfigSummaryTemplate,
353
- },
354
- views: [
355
- [Op.READ, addressable()],
356
- // Domain ownership is the one publicly mutable part of this policy row (#424). The three
357
- // actions live beside the `domains` section: claim returns a DNS record to copy, verify
358
- // resolves it, revoke releases the domain for another scope to verify.
359
- [SsoConfig_Operations.CLAIM_DOMAIN, notAddressable({ iconOverride: Globe })],
360
- [SsoConfig_Operations.VERIFY_DOMAIN, notAddressable({ iconOverride: ShieldCheck })],
361
- [SsoConfig_Operations.REVOKE_DOMAIN, notAddressable({ iconOverride: Unlink })],
362
- ],
363
- variantOverrides: {
364
- [R.APPLICATION]: { views: [] },
365
- },
366
- })),
768
+ views: [
769
+ [Op.READ, addressable()],
770
+ // The edit an administrator opens this pane to make, which until now nothing could save: the
771
+ // literal UPDATE was INTERNAL_CALL, so no route existed and the frontend's update resolution
772
+ // fell through to whichever custom verb below borrowed UPDATE semantics. Not addressable — it
773
+ // opens from the READ view, like SIEM export config's (#953).
774
+ [Op.UPDATE, notAddressable()],
775
+ // Domain ownership is the one publicly mutable part of this policy row (#424). The three
776
+ // actions live beside the `domains` section: claim returns a DNS record to copy, verify
777
+ // resolves it, revoke releases the domain for another scope to verify.
778
+ [SsoConfig_Operations.CLAIM_DOMAIN, notAddressable({ iconOverride: Globe })],
779
+ [SsoConfig_Operations.VERIFY_DOMAIN, notAddressable({ iconOverride: ShieldCheck })],
780
+ [SsoConfig_Operations.REVOKE_DOMAIN, notAddressable({ iconOverride: Unlink })],
781
+ ],
782
+ variantOverrides: {
783
+ [R.APPLICATION]: { views: [] },
784
+ },
785
+ };
786
+ }),
367
787
  ...polymorphicResourceUIBehavior({
368
788
  variants: [
369
789
  { parentResourceType: R.ORGANIZATIONS, resourceType: R.ORGANIZATION_SSO_CONNECTIONS },
@@ -375,22 +795,40 @@ export function buildSecurityMainPresets() {
375
795
  refs: {
376
796
  sections: ['overview', 'oidc', 'saml', 'provisioning'],
377
797
  },
798
+ // Settings rows on read, bare values on a card (the name, the protocol badge, on/off as the word).
799
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
800
+ header: SsoConnectionHeader,
378
801
  display: SsoConnectionDisplayTemplate,
379
802
  summary: SsoConnectionSummaryTemplate,
380
803
  },
381
804
  fields: {
805
+ // A badge with no sentence under it on read ("Selects the authentication protocol…" sat under every
806
+ // card); the enum's description is edit help.
382
807
  protocol: schema.shape.protocol.enumUI({
383
- display: { displayMode: EnumDisplayMode.BADGE, showDescription: true },
808
+ display: { displayMode: EnumDisplayMode.BADGE },
384
809
  edit: { showDescription: true },
385
810
  values: {
386
811
  [SsoProtocol.OIDC]: { color: BadgeSemanticVariant.INFO },
387
812
  [SsoProtocol.SAML]: { color: BadgeSemanticVariant.SECONDARY },
388
813
  },
389
814
  }),
815
+ // On a card the value reads bare, and a bare checkmark says nothing about WHAT is true — so the card
816
+ // says the word ("Enabled" / "Disabled"); the read page keeps the labelled row and its checkmark.
817
+ enabled: schema.shape.enabled.booleanUI({
818
+ labellingValue: BooleanLabellingValue.ENABLED_DISABLED,
819
+ summaryOverride: { displayMode: BooleanDisplayMode.RAW },
820
+ }),
821
+ externalProviderId: schema.shape.externalProviderId.stringUI({ display: { hideWhenEmpty: true } }),
390
822
  },
391
823
  getFrontendResourceLabel: ({ currentObject }) => currentObject.displayName,
392
824
  views: [
393
- [Op.LIST, addressable()],
825
+ // A connection registry: provider, protocol, status. Comparable rows.
826
+ // CARDS is the framework default and nothing had ever declared otherwise, so every
827
+ // collection in the product rendered as stacked cards — ~150px per row, four people to a
828
+ // viewport, with each field's help text and label repeated on every card. TABLE writes the
829
+ // headers once. `userSwitchableDisplayMode` keeps cards one click away rather than removing
830
+ // a rendering somebody may prefer on a narrow screen.
831
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
394
832
  [SsoConnection_Operations.TEST_CONNECTION, addressable({
395
833
  iconOverride: PlugZap,
396
834
  customView: ResourceLayoutPreset_Read_SsoSaml,
@@ -412,14 +850,38 @@ export function buildSecurityMainPresets() {
412
850
  }, scimProvisioningConfigPolymorphicFactories[R.ORGANIZATION_SCIM_PROVISIONING_CONFIG], ScimProvisioningConfigBaseSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
413
851
  icon: UserCog,
414
852
  layout: {
853
+ // Settings-page chrome (Settings Hub): label-left / value-right rows. A scope-level
854
+ // configuration record is READ far more often than it is edited — an operator opens it to
855
+ // confirm a value — so the DISPLAY side needs the row treatment at least as much as the form.
856
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
857
+ // SCIM provisioning policy — a scope-level configuration record. A settings pane is a list of decisions an operator came to TAKE, so its
858
+ // writable fields are offered in place rather than behind a whole-pane edit mode. The set is
859
+ // DERIVED (not primary key, not excludeFromUpdate, not hidden, not opted out), so a field
860
+ // added to this schema tomorrow is covered without anyone remembering to decorate it.
861
+ defaultInlineEdit: ResourceLayoutInlineEditDefault.WRITABLE_FIELDS,
862
+ // And its empty rows say WHICH emptiness they are — "None yet" for a list with no members,
863
+ // "Not available" for a computed value, "No value" for a field awaiting input — instead of one
864
+ // em dash standing for all three. The surface policy's dash is right where a reader is scanning;
865
+ // on a settings row, which is read one at a time to decide something, it is an answer that
866
+ // refuses to answer.
867
+ defaultEmptyValue: 'placeholder',
415
868
  refs: {
416
869
  sections: ['overview', 'mapping', 'lifecycle'],
417
870
  },
418
871
  display: ScimProvisioningDisplayTemplate,
419
872
  summary: ScimProvisioningSummaryTemplate,
420
873
  },
874
+ fields: {
875
+ // The card's one value keeps its label: a bare checkmark says nothing about WHAT is switched on.
876
+ autoCreateUsers: schema.shape.autoCreateUsers.booleanUI({ summaryOverride: { chromeMode: DisplayChromeMode.INLINE } }),
877
+ },
421
878
  views: [
422
879
  [Op.READ, addressable()],
880
+ // The four decisions on this row — create users, verify their email, deactivate on
881
+ // deprovision, and the role they land with — are what an operator opens SCIM settings to set,
882
+ // and none of them was settable: the literal UPDATE was INTERNAL_CALL. Not addressable — it
883
+ // opens from the READ view, like SIEM export config's (#953).
884
+ [Op.UPDATE, notAddressable()],
423
885
  ],
424
886
  variantOverrides: {
425
887
  [R.APPLICATION]: { views: [] },
@@ -436,11 +898,29 @@ export function buildSecurityMainPresets() {
436
898
  refs: {
437
899
  sections: ['overview', 'lifecycle'],
438
900
  },
901
+ // Settings rows on read, bare values on a card (the name, then active or not as the word).
902
+ defaultChromeMode: { display: DisplayChromeMode.SETTINGS_ROW, summary: DisplayChromeMode.HIDDEN, edit: EditChromeMode.SETTINGS_ROW },
439
903
  display: ScimTokenDisplayTemplate,
440
904
  summary: ScimTokenSummaryTemplate,
441
905
  },
906
+ fields: {
907
+ // "Active: ✓" on the card becomes the word: a bare checkmark says nothing about what is true.
908
+ isActive: schema.shape.isActive.booleanUI({
909
+ labellingValue: BooleanLabellingValue.ACTIVE_INACTIVE,
910
+ summaryOverride: { displayMode: BooleanDisplayMode.RAW },
911
+ }),
912
+ // A token never used, or with no expiry, is ordinary — a dash on those rows said nothing.
913
+ lastUsedAt: schema.shape.lastUsedAt.dateUI({ display: { hideWhenEmpty: true } }),
914
+ expiresAt: schema.shape.expiresAt.dateUI({ display: { hideWhenEmpty: true } }),
915
+ },
442
916
  views: [
443
- [Op.LIST, addressable()],
917
+ // A token registry: name, status, last used, expiry. Comparable rows.
918
+ // CARDS is the framework default and nothing had ever declared otherwise, so every
919
+ // collection in the product rendered as stacked cards — ~150px per row, four people to a
920
+ // viewport, with each field's help text and label repeated on every card. TABLE writes the
921
+ // headers once. `userSwitchableDisplayMode` keeps cards one click away rather than removing
922
+ // a rendering somebody may prefer on a narrow screen.
923
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
444
924
  [ScimTokens_Operations.GENERATE_TOKEN, notAddressable({ iconOverride: KeyRound })],
445
925
  [ScimTokens_Operations.REVOKE_TOKEN, notAddressable({ iconOverride: ShieldX })],
446
926
  [ScimTokens_Operations.ROTATE_TOKEN, notAddressable({ iconOverride: RotateCw })],
@@ -450,6 +930,50 @@ export function buildSecurityMainPresets() {
450
930
  }
451
931
  export function buildSecurityAdminPresets(main) {
452
932
  return {
933
+ /**
934
+ * The APPLICATION-wide audit trail — the same rows the organization door serves, read across
935
+ * every tenant instead of inside one.
936
+ *
937
+ * A separate resource rather than a polymorphic variant of `AUDIT_LOGS`, which is why this is a
938
+ * second entry and not a `variantOverrides` block: the two doors differ in what a read MEANS, not
939
+ * only in scope. Every read here is a declared crossing (`admitsCrossTenantPlatformAdministration`)
940
+ * and emits one crossing event per tenant reached, and under an `INDEPENDENT_APPROVAL` audit
941
+ * policy it additionally needs a two-person `applicationAccessGrants` window. None of that is true
942
+ * of the tenant door.
943
+ *
944
+ * It shares `AuditableEvent_BaseSchema` and therefore both templates verbatim: an audit event is
945
+ * the same object whichever door served it, and giving the operator a differently-shaped row would
946
+ * be a difference with no meaning behind it.
947
+ *
948
+ * NO `EXPORT_AUDIT_LOGS`: the application factory declares READ, LIST and SEARCH and no custom
949
+ * operation, so naming the export here would name an operation that does not exist.
950
+ */
951
+ [R.APPLICATION_AUDIT_LOGS]: resourceUIBehavior(applicationAuditLogsFactory, AuditableEvent_BaseSchema, ({ schema, schemaShape, opsVariantResolver }) => ({
952
+ icon: ShieldCheck,
953
+ // An audit event is named by its type's word and the instant it happened — see `auditEventName`.
954
+ getFrontendResourceLabel: auditEventName,
955
+ layout: {
956
+ refs: {
957
+ sections: ['overview', 'actors', 'payload'],
958
+ },
959
+ defaultChromeMode: auditLogPresentation(schemaShape).defaultChromeMode,
960
+ display: AuditLogDisplayTemplate,
961
+ summary: AuditLogSummaryTemplate,
962
+ },
963
+ fields: auditLogPresentation(schemaShape).fields,
964
+ views: [
965
+ [Op.READ, notAddressable()],
966
+ // Same dashboard capabilities as the tenant door — `severity` is in this operation's own
967
+ // declared `filterFields` and `createdAt` is a summary field, so both cues resolve here too.
968
+ [Op.LIST, addressable({
969
+ collectionDisplayConfig: {
970
+ quickFilterField: 'severity',
971
+ temporalGroupField: 'createdAt',
972
+ },
973
+ })],
974
+ [Op.SEARCH, addressable()],
975
+ ],
976
+ })),
453
977
  ...polymorphicResourceUIBehaviorFrom({
454
978
  variants: [
455
979
  { parentResourceType: R.ORGANIZATIONS, resourceType: R.ORGANIZATION_SIEM_EXPORT_CONFIG },
@@ -461,6 +985,11 @@ export function buildSecurityAdminPresets(main) {
461
985
  fields: base.fields,
462
986
  views: [
463
987
  [Op.READ, addressable()],
988
+ // The admin app's own edit door for the APP-scope row. The `main` preset above declares
989
+ // the same view for the ORG-scope pane; this block is the SECOND lane, and the two carry
990
+ // the same operation set for a reason — an app super-administrator reading a
991
+ // configuration record here is reading it to change it.
992
+ [Op.UPDATE, notAddressable()],
464
993
  ],
465
994
  variantOverrides: {
466
995
  [R.ORGANIZATIONS]: {
@@ -519,6 +1048,11 @@ export function buildSecurityAdminPresets(main) {
519
1048
  layout: base.layout,
520
1049
  views: [
521
1050
  [Op.READ, addressable()],
1051
+ // The admin app's own edit door for the APP-scope row. The `main` preset above declares
1052
+ // the same view for the ORG-scope pane; this block is the SECOND lane, and the two carry
1053
+ // the same operation set for a reason — an app super-administrator reading a
1054
+ // configuration record here is reading it to change it.
1055
+ [Op.UPDATE, notAddressable()],
522
1056
  [SsoConfig_Operations.CLAIM_DOMAIN, notAddressable({ iconOverride: Globe })],
523
1057
  [SsoConfig_Operations.VERIFY_DOMAIN, notAddressable({ iconOverride: ShieldCheck })],
524
1058
  [SsoConfig_Operations.REVOKE_DOMAIN, notAddressable({ iconOverride: Unlink })],
@@ -539,8 +1073,9 @@ export function buildSecurityAdminPresets(main) {
539
1073
  layout: base.layout,
540
1074
  fields: base.fields,
541
1075
  getFrontendResourceLabel: base.getFrontendResourceLabel,
1076
+ // The main lane's registry TABLE, for the reason given on SCIM tokens below.
542
1077
  views: [
543
- [Op.LIST, addressable()],
1078
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
544
1079
  [SsoConnection_Operations.TEST_CONNECTION, addressable({
545
1080
  iconOverride: PlugZap,
546
1081
  customView: ResourceLayoutPreset_Read_SsoSaml,
@@ -554,7 +1089,7 @@ export function buildSecurityAdminPresets(main) {
554
1089
  [R.ORGANIZATIONS]: {
555
1090
  views: [
556
1091
  [Op.READ, notAddressable()],
557
- [Op.LIST, notAddressable()],
1092
+ [Op.LIST, notAddressable({ collectionDisplayConfig: REGISTRY_TABLE })],
558
1093
  ],
559
1094
  },
560
1095
  },
@@ -567,8 +1102,14 @@ export function buildSecurityAdminPresets(main) {
567
1102
  }, scimProvisioningConfigPolymorphicFactories[R.ORGANIZATION_SCIM_PROVISIONING_CONFIG], main, ({ base }) => ({
568
1103
  icon: base.icon,
569
1104
  layout: base.layout,
1105
+ fields: base.fields,
570
1106
  views: [
571
1107
  [Op.READ, addressable()],
1108
+ // The admin app's own edit door for the APP-scope row. The `main` preset above declares
1109
+ // the same view for the ORG-scope pane; this block is the SECOND lane, and the two carry
1110
+ // the same operation set for a reason — an app super-administrator reading a
1111
+ // configuration record here is reading it to change it.
1112
+ [Op.UPDATE, notAddressable()],
572
1113
  ],
573
1114
  variantOverrides: {
574
1115
  [R.ORGANIZATIONS]: {
@@ -583,9 +1124,12 @@ export function buildSecurityAdminPresets(main) {
583
1124
  }, scimTokensPolymorphicFactories[R.ORGANIZATION_SCIM_TOKENS], main, ({ base }) => ({
584
1125
  icon: base.icon,
585
1126
  layout: base.layout,
1127
+ fields: base.fields,
586
1128
  getFrontendResourceLabel: base.getFrontendResourceLabel,
1129
+ // The same registry TABLE the main lane declares: this lane REPLACES the main entry in an application
1130
+ // that composes both scopes, so leaving it out rendered the inventory as stacked cards there.
587
1131
  views: [
588
- [Op.LIST, addressable()],
1132
+ [Op.LIST, addressable({ collectionDisplayConfig: REGISTRY_TABLE })],
589
1133
  [ScimTokens_Operations.GENERATE_TOKEN, notAddressable({ iconOverride: KeyRound })],
590
1134
  [ScimTokens_Operations.REVOKE_TOKEN, notAddressable({ iconOverride: ShieldX })],
591
1135
  [ScimTokens_Operations.ROTATE_TOKEN, notAddressable({ iconOverride: RotateCw })],
@@ -594,28 +1138,67 @@ export function buildSecurityAdminPresets(main) {
594
1138
  [R.ORGANIZATIONS]: {
595
1139
  views: [
596
1140
  [Op.READ, notAddressable()],
597
- [Op.LIST, notAddressable()],
1141
+ [Op.LIST, notAddressable({ collectionDisplayConfig: REGISTRY_TABLE })],
598
1142
  ],
599
1143
  },
600
1144
  },
601
1145
  })),
1146
+ /**
1147
+ * The application operator's lane onto an organization's OAuth clients: every verb the main lane has, on its
1148
+ * `admin` variant — except `setAutonomousAgents`, which has none. Binding an agent grants a credential standing
1149
+ * authority to act unattended INSIDE a tenant, so only that tenant's own administrator may do it (#1611); the
1150
+ * operator can still see what a client runs, and end the client.
1151
+ *
1152
+ * It ALSO carries the main lane's views. An application that serves tenants and operators from one frontend
1153
+ * composes both lanes, and this entry REPLACES the main one there — so without the default-variant views the
1154
+ * tenant administrator's own Settings pane (which runs the DEFAULT variants) would have no Create and no binding
1155
+ * action at all. In a split operator-only deployment they are role-gated like everywhere else (the tenant
1156
+ * lane's operations admit tenant roles only), but note the main LIST view is ADDRESSABLE: such a frontend
1157
+ * registers an organization-scoped list route that an operator who is also a member of an organization can
1158
+ * reach. No operator-only deployment exists yet; if one is built, mark the spread LIST not addressable here.
1159
+ */
1160
+ [R.OAUTH_CLIENTS_ORGANIZATION]: resourceUIBehaviorFrom(orgOAuthClientsFactory, main[R.OAUTH_CLIENTS_ORGANIZATION], ({ base, opsVariantResolver }) => ({
1161
+ icon: base.icon,
1162
+ layout: base.layout,
1163
+ getFrontendResourceLabel: base.getFrontendResourceLabel,
1164
+ fields: base.fields,
1165
+ views: [
1166
+ ...(base.views ?? []),
1167
+ [opsVariantResolver(Op.READ, 'admin'), notAddressable()],
1168
+ [opsVariantResolver(Op.LIST, 'admin'), notAddressable({ collectionDisplayConfig: REGISTRY_TABLE })],
1169
+ [opsVariantResolver(Op.SEARCH, 'admin'), notAddressable()],
1170
+ [opsVariantResolver(Op.CREATE, 'admin'), notAddressable()],
1171
+ [opsVariantResolver(Op.DELETE, 'admin'), notAddressable()],
1172
+ [opsVariantResolver(OrgOAuthClients_Operations.ROTATE, 'admin'), notAddressable({ iconOverride: RotateCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1173
+ [opsVariantResolver(OrgOAuthClients_Operations.REGENERATE, 'admin'), notAddressable({ iconOverride: RefreshCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1174
+ [opsVariantResolver(OrgOAuthClients_Operations.DEACTIVATE, 'admin'), notAddressable({ iconOverride: PowerOff, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1175
+ [opsVariantResolver(OrgOAuthClients_Operations.REACTIVATE, 'admin'), notAddressable({ iconOverride: Power, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1176
+ ],
1177
+ })),
602
1178
  [R.ORG_API_KEYS]: resourceUIBehaviorFrom(orgApiKeysFactory, main[R.ORG_API_KEYS], ({ base, opsVariantResolver }) => ({
603
1179
  icon: base.icon,
604
1180
  layout: base.layout,
605
1181
  getFrontendResourceLabel: base.getFrontendResourceLabel,
606
1182
  fields: base.fields,
607
1183
  views: [
1184
+ // The tenant administrator's own views, kept. In an application composing both lanes this entry replaces the
1185
+ // main one, and the Settings pane runs the DEFAULT variants: with only the `admin` keys below, the organization's
1186
+ // API keys rendered with no Create and no declared list shape (#1812 measured it beside the OAuth clients).
1187
+ ...(base.views ?? []),
608
1188
  [opsVariantResolver(Op.READ, 'admin'), notAddressable()],
609
- [opsVariantResolver(Op.LIST, 'admin'), notAddressable()],
1189
+ // The registry TABLE and the action icons the main lane declares. This lane REPLACES the main entry in an
1190
+ // application that composes both scopes, so without them the list rendered as stacked cards and every
1191
+ // row action showed the missing-icon placeholder.
1192
+ [opsVariantResolver(Op.LIST, 'admin'), notAddressable({ collectionDisplayConfig: REGISTRY_TABLE })],
610
1193
  [opsVariantResolver(Op.SEARCH, 'admin'), notAddressable()],
611
1194
  [opsVariantResolver(Op.CREATE, 'admin'), notAddressable()],
612
1195
  [opsVariantResolver(Op.DELETE, 'admin'), notAddressable()],
613
- [opsVariantResolver(OrgApiKeys_Operations.ROTATE, 'admin'), notAddressable()],
614
- [opsVariantResolver(OrgApiKeys_Operations.REGENERATE, 'admin'), notAddressable()],
615
- [opsVariantResolver(OrgApiKeys_Operations.DEACTIVATE, 'admin'), notAddressable()],
616
- [opsVariantResolver(OrgApiKeys_Operations.REACTIVATE, 'admin'), notAddressable()],
617
- [opsVariantResolver(OrgApiKeys_Operations.EXTEND_EXPIRY, 'admin'), notAddressable()],
618
- [opsVariantResolver(OrgApiKeys_Operations.USAGE_STATS, 'admin'), notAddressable()],
1196
+ [opsVariantResolver(OrgApiKeys_Operations.ROTATE, 'admin'), notAddressable({ iconOverride: RotateCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1197
+ [opsVariantResolver(OrgApiKeys_Operations.REGENERATE, 'admin'), notAddressable({ iconOverride: RefreshCw, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1198
+ [opsVariantResolver(OrgApiKeys_Operations.DEACTIVATE, 'admin'), notAddressable({ iconOverride: PowerOff, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1199
+ [opsVariantResolver(OrgApiKeys_Operations.REACTIVATE, 'admin'), notAddressable({ iconOverride: Power, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1200
+ [opsVariantResolver(OrgApiKeys_Operations.EXTEND_EXPIRY, 'admin'), notAddressable({ iconOverride: CalendarPlus, ...ROW_VERB_ON_RESOURCE_WITHOUT_UPDATE })],
1201
+ [opsVariantResolver(OrgApiKeys_Operations.USAGE_STATS, 'admin'), notAddressable({ iconOverride: ChartColumn })],
619
1202
  ],
620
1203
  })),
621
1204
  };
@@ -624,5 +1207,8 @@ export const securityMainPresets = buildSecurityMainPresets();
624
1207
  export const securityAdminPresets = buildSecurityAdminPresets(securityMainPresets);
625
1208
  export const orgApiKeysMainResourceUIBehavior = securityMainPresets[R.ORG_API_KEYS];
626
1209
  export const orgApiKeysAdminResourceUIBehavior = securityAdminPresets[R.ORG_API_KEYS];
1210
+ export const orgOAuthClientsMainResourceUIBehavior = securityMainPresets[R.OAUTH_CLIENTS_ORGANIZATION];
1211
+ export const orgOAuthClientsAdminResourceUIBehavior = securityAdminPresets[R.OAUTH_CLIENTS_ORGANIZATION];
627
1212
  export const auditLogsMainResourceUIBehavior = securityMainPresets[R.AUDIT_LOGS];
1213
+ export const applicationAuditLogsAdminResourceUIBehavior = securityAdminPresets[R.APPLICATION_AUDIT_LOGS];
628
1214
  //# sourceMappingURL=security.resource-presets.js.map