@alfadocs/ui-kit 0.69.0 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/dist/_chunks/address-fields-CPbFJ8e8.js +246 -0
  2. package/dist/_chunks/{agenda-card-BxSFkqgY.js → agenda-card-BQ-IKAru.js} +2 -2
  3. package/dist/_chunks/{agenda-tray-g0kg7HwB.js → agenda-tray-CGXRk58j.js} +2 -2
  4. package/dist/_chunks/{ai-consent-banner-CXlsNX1c.js → ai-consent-banner-Be-h9mRI.js} +3 -3
  5. package/dist/_chunks/{ai-prompt-input-CuhTo9mh.js → ai-prompt-input-V4DdOeqv.js} +2 -2
  6. package/dist/_chunks/{alert-_mUKLmwA.js → alert-CHYZ96tR.js} +150 -96
  7. package/dist/_chunks/{alia-sidebar-B47qRQb5.js → alia-sidebar-DvIUzIX9.js} +107 -106
  8. package/dist/_chunks/{anamnesis-card-DRmE24OQ.js → anamnesis-card-DvYCa16e.js} +2 -2
  9. package/dist/_chunks/anatomy-scheme-CXSk11UJ.js +2445 -0
  10. package/dist/_chunks/annotation-marker-qt5R9WZX.js +120 -0
  11. package/dist/_chunks/{antenatal-schedule-timeline-35ebkcZT.js → antenatal-schedule-timeline-CwXrQRm1.js} +2 -2
  12. package/dist/_chunks/{app-frame-BYx1gcV7.js → app-frame-DIEMIC5V.js} +67 -56
  13. package/dist/_chunks/appointment-card-DVaeJNVB.js +294 -0
  14. package/dist/_chunks/appointment-timeline-PJgnrjFb.js +388 -0
  15. package/dist/_chunks/appointment-tray-B16QPGbm.js +193 -0
  16. package/dist/_chunks/{audio-recorder-DYXXnGug.js → audio-recorder-DNDsOLqO.js} +3 -3
  17. package/dist/_chunks/{autocomplete-DOeGouCL.js → autocomplete-BrONKN8l.js} +168 -146
  18. package/dist/_chunks/{badge-CqGsX32l.js → badge-DCOqV9mI.js} +32 -27
  19. package/dist/_chunks/{bishop-score-PJI3AXzA.js → bishop-score-Cym_TeQY.js} +3 -3
  20. package/dist/_chunks/{bmi-calculator-BZtIJ53x.js → bmi-calculator-zjeY4E7J.js} +2 -2
  21. package/dist/_chunks/{booking-C3VqFReX.js → booking-C7do4vaR.js} +7 -7
  22. package/dist/_chunks/{button-group-Ciq6J4IW.js → button-group-CvEnVzY7.js} +32 -35
  23. package/dist/_chunks/{care-plan-card-CvFGXa2z.js → care-plan-card-DzPDYgtK.js} +5 -5
  24. package/dist/_chunks/{care-plan-entry-card-C3E_gClk.js → care-plan-entry-card-CEnQy7YP.js} +5 -5
  25. package/dist/_chunks/care-plan-header-DcXFXWit.js +198 -0
  26. package/dist/_chunks/{chat-message-3V54YipB.js → chat-message-DzpcJR-q.js} +25 -23
  27. package/dist/_chunks/city-input-Dkgaak7I.js +169 -0
  28. package/dist/_chunks/clinical-note-card-BUvNMNGL.js +436 -0
  29. package/dist/_chunks/clipboard-list-S7s-MXQq.js +25 -0
  30. package/dist/_chunks/{combobox-Clum7gJ1.js → combobox-DnqSF0IH.js} +131 -114
  31. package/dist/_chunks/connection-status-CY1HV8Wg.js +108 -0
  32. package/dist/_chunks/{contact-profile-card-Dramqa9C.js → contact-profile-card-DDPwRFiP.js} +2 -2
  33. package/dist/_chunks/control-room-rail-FAQZrGVL.js +333 -0
  34. package/dist/_chunks/country-select-BwUZQvTa.js +709 -0
  35. package/dist/_chunks/{cycle-calculator-DmRGJNaT.js → cycle-calculator-CCmPwcBl.js} +2 -2
  36. package/dist/_chunks/{dependent-selector-CG_FOHya.js → dependent-selector-DUV4thxX.js} +2 -2
  37. package/dist/_chunks/{document-scanner-CTubA0-N.js → document-scanner-C_AxLooF.js} +3 -3
  38. package/dist/_chunks/{due-date-calculator-BTmsIQqD.js → due-date-calculator-Brdj-euS.js} +3 -3
  39. package/dist/_chunks/editable-currency-cell-renderer-CGELrkIj.js +410 -0
  40. package/dist/_chunks/email-input-DJ7EXklP.js +397 -0
  41. package/dist/_chunks/{entity-card-COhmqHly.js → entity-card-DmrgYSEX.js} +38 -20
  42. package/dist/_chunks/entity-summary-CaM1Y-xE.js +291 -0
  43. package/dist/_chunks/{fetal-weight-CRz7KE2D.js → fetal-weight-DNCkyeVo.js} +2 -2
  44. package/dist/_chunks/field-array-siUZzfYe.js +146 -0
  45. package/dist/_chunks/field-value-3jMM0uDx.js +415 -0
  46. package/dist/_chunks/{file-upload-5ScQd4fE.js → file-upload-DwZcAK8D.js} +2 -1
  47. package/dist/_chunks/{freemium-paywall-DZ2mBS3w.js → freemium-paywall-WYlNO7yT.js} +2 -2
  48. package/dist/_chunks/{gestational-age-calculator-BleUdhbI.js → gestational-age-calculator-DKzEV5Qi.js} +4 -4
  49. package/dist/_chunks/hash-CysBBS_N.js +17 -0
  50. package/dist/_chunks/{hcg-doubling-CnjDXX6U.js → hcg-doubling-C7bmuaU3.js} +2 -2
  51. package/dist/_chunks/iban-input-B0TWzR1R.js +436 -0
  52. package/dist/_chunks/icon-picker-0B7KhrF1.js +272 -0
  53. package/dist/_chunks/image-cropper-D9jqJy19.js +367 -0
  54. package/dist/_chunks/{actions-cell-renderer-DrcaxB0w.js → link-cell-renderer-De_SLjSq.js} +792 -668
  55. package/dist/_chunks/list-checks-BUs75d_o.js +18 -0
  56. package/dist/_chunks/lock-CKOIn0IK.js +15 -0
  57. package/dist/_chunks/{marketplace-app-shell-6T9W4Knl.js → marketplace-app-shell-BGqkywsi.js} +5 -5
  58. package/dist/_chunks/message-card-DsHFFiL1.js +319 -0
  59. package/dist/_chunks/{message-tray-DwrBLJlf.js → message-tray-C0a6CL1_.js} +172 -135
  60. package/dist/_chunks/{multi-select-BdHHDrRN.js → multi-select-WE4S9FIF.js} +75 -63
  61. package/dist/_chunks/nav-grid-9xphY3FM.js +169 -0
  62. package/dist/_chunks/notes-panel-DXiMfuvp.js +320 -0
  63. package/dist/_chunks/notification-card-BMqNzCIt.js +290 -0
  64. package/dist/_chunks/{notification-tray-Btb9oQeZ.js → notification-tray-BmUlCx3g.js} +201 -166
  65. package/dist/_chunks/{operator-hero-CP2Nhupm.js → operator-hero-BO8TqzX2.js} +3 -3
  66. package/dist/_chunks/panel-header-D313n_9-.js +105 -0
  67. package/dist/_chunks/patient-details-DgfTJimE.js +759 -0
  68. package/dist/_chunks/{patient-search-CBC_ySF6.js → patient-search-CSWQKOSP.js} +3 -3
  69. package/dist/_chunks/{patient-shell-DV3XEtIB.js → patient-shell-BMwsIKlW.js} +3 -3
  70. package/dist/_chunks/patient-summary-card-D4NdgYJB.js +452 -0
  71. package/dist/_chunks/patient-table-CERknpd8.js +1110 -0
  72. package/dist/_chunks/{payment-form-DvjwYVIT.js → payment-form-CxqIXqw7.js} +2 -2
  73. package/dist/_chunks/{payment-request-card-DioWKBUq.js → payment-request-card-Blf-MFNY.js} +125 -136
  74. package/dist/_chunks/{pdf-viewer-D6BPfW2D.js → pdf-viewer-QfebdLOd.js} +192 -214
  75. package/dist/_chunks/{periodontal-chart-card-BuDEMbHE.js → periodontal-chart-card-hRRJY1NN.js} +2 -2
  76. package/dist/_chunks/permission-matrix-Bw5oexUt.js +174 -0
  77. package/dist/_chunks/position-grid-CcvqHaKN.js +169 -0
  78. package/dist/_chunks/postal-code-input-UCOYuRY2.js +192 -0
  79. package/dist/_chunks/{practice-results-KrTHqZua.js → practice-results-El5Z-oVp.js} +4 -4
  80. package/dist/_chunks/{pregnancy-dating-DORUAOHB.js → pregnancy-dating-CunHrOpO.js} +4 -4
  81. package/dist/_chunks/{pregnancy-weight-gain-DVz4rr7-.js → pregnancy-weight-gain-BUNpTsH-.js} +2 -2
  82. package/dist/_chunks/{product-hub-panel-e6pW220e.js → product-hub-panel-DtU7KXxm.js} +257 -217
  83. package/dist/_chunks/province-select-D_TZvix3.js +261 -0
  84. package/dist/_chunks/{public-header.agent-DqkqA-ca.js → public-header.agent-TxmC_x1I.js} +2 -2
  85. package/dist/_chunks/radiograph-panel.agent-tWjN2nHX.js +553 -0
  86. package/dist/_chunks/reviews-panel-DxkSrgMl.js +559 -0
  87. package/dist/_chunks/rich-text-editor-C8tyGjfb.js +2621 -0
  88. package/dist/_chunks/{scroll-area-5wNK0Cyz.js → scroll-area-BZOvUhwQ.js} +2 -2
  89. package/dist/_chunks/{select-DMLG44F5.js → select-KsyRr8WH.js} +114 -102
  90. package/dist/_chunks/{sheet-BxsE7eQm.js → sheet-umkfZjF6.js} +53 -42
  91. package/dist/_chunks/{sidebar-DY9jGjgt.js → sidebar-QCp9wHNP.js} +125 -113
  92. package/dist/_chunks/{sign-document-B4DeRhTe.js → sign-document-By6hMOra.js} +2 -2
  93. package/dist/_chunks/{stepper-accordion-Dki6r9ZE.js → stepper-accordion-DC-H-8v4.js} +38 -48
  94. package/dist/_chunks/tab-bar-Bv9nGNdO.js +262 -0
  95. package/dist/_chunks/{tabs-BxcOziCo.js → tabs-CYZVKKDl.js} +2 -2
  96. package/dist/_chunks/task-card-DCdsI0ZT.js +189 -0
  97. package/dist/_chunks/{task-tray-qOEQflu4.js → task-tray-DNVejijD.js} +2 -2
  98. package/dist/_chunks/tasks-panel-C9odmawT.js +757 -0
  99. package/dist/_chunks/token-insert-menu-CFQqTe_n.js +147 -0
  100. package/dist/_chunks/tool-rail-BZx0-yIr.js +524 -0
  101. package/dist/_chunks/tooth-scheme-DJZtzfeY.js +2133 -0
  102. package/dist/_chunks/{transaction-chip-DK84XCBU.js → transaction-chip-CscoQbxF.js} +88 -61
  103. package/dist/_chunks/{transcript-panel-3THQX6nJ.js → transcript-panel-CHGHHHdT.js} +95 -83
  104. package/dist/_chunks/{unit-converter-YEpD9evj.js → unit-converter-CwlZbfdn.js} +2 -2
  105. package/dist/_chunks/use-clamp-overflow-DQE2kwZ9.js +20 -0
  106. package/dist/_chunks/use-overflow-collapse-BIOzKbni.js +32 -0
  107. package/dist/_chunks/use-persistent-state-nZwZAnE9.js +24 -0
  108. package/dist/_chunks/{warning-stack-BsgaEbL8.js → warning-stack--sTrrBDA.js} +86 -101
  109. package/dist/_chunks/{workflow-map-Bdam9pGp.js → workflow-map-M8MBBHQm.js} +107 -119
  110. package/dist/_chunks/zoom-out-CgVtf2Wx.js +29 -0
  111. package/dist/agent/index.js +5 -4
  112. package/dist/agent/types.d.ts +19 -2
  113. package/dist/agent-catalog.json +3325 -322
  114. package/dist/agent-i18n/en.json +314 -14
  115. package/dist/components/_shared/entity-card/entity-card.d.ts +6 -0
  116. package/dist/components/_shared/entity-card/index.d.ts +1 -1
  117. package/dist/components/_shared/field-value.d.ts +21 -0
  118. package/dist/components/_shared/field-visibility-cog.d.ts +20 -0
  119. package/dist/components/_shared/field-visibility.d.ts +36 -0
  120. package/dist/components/_shared/option.d.ts +2 -0
  121. package/dist/components/_shared/patient-fields.d.ts +119 -0
  122. package/dist/components/address-fields/address-fields.agent.d.ts +9 -0
  123. package/dist/components/address-fields/address-fields.d.ts +29 -0
  124. package/dist/components/address-fields/index.d.ts +5 -0
  125. package/dist/components/address-fields/index.js +6 -0
  126. package/dist/components/agenda-card/index.js +1 -1
  127. package/dist/components/agenda-tray/index.js +1 -1
  128. package/dist/components/ai-consent-banner/index.js +1 -1
  129. package/dist/components/ai-prompt-input/index.js +1 -1
  130. package/dist/components/alert/alert.d.ts +5 -0
  131. package/dist/components/alert/index.js +1 -1
  132. package/dist/components/anamnesis-card/index.js +1 -1
  133. package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts +15 -0
  134. package/dist/components/anatomy-scheme/anatomy-muscle-paths.d.ts +20 -0
  135. package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts +121 -0
  136. package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts +6 -0
  137. package/dist/components/anatomy-scheme/anatomy-scheme.d.ts +69 -0
  138. package/dist/components/anatomy-scheme/index.d.ts +6 -0
  139. package/dist/components/anatomy-scheme/index.js +17 -0
  140. package/dist/components/annotation-marker/annotation-marker.d.ts +33 -0
  141. package/dist/components/annotation-marker/index.d.ts +3 -0
  142. package/dist/components/annotation-marker/index.js +7 -0
  143. package/dist/components/app-frame/app-frame.d.ts +2 -2
  144. package/dist/components/app-frame/index.js +1 -1
  145. package/dist/components/appointment-card/appointment-card.d.ts +25 -1
  146. package/dist/components/appointment-card/index.js +6 -5
  147. package/dist/components/appointment-timeline/appointment-timeline.agent.d.ts +4 -0
  148. package/dist/components/appointment-timeline/appointment-timeline.d.ts +66 -0
  149. package/dist/components/appointment-timeline/index.d.ts +4 -0
  150. package/dist/components/appointment-timeline/index.js +6 -0
  151. package/dist/components/audio-recorder/index.js +1 -1
  152. package/dist/components/autocomplete/autocomplete.d.ts +10 -0
  153. package/dist/components/autocomplete/index.js +1 -1
  154. package/dist/components/badge/badge.d.ts +6 -2
  155. package/dist/components/badge/index.js +1 -1
  156. package/dist/components/bishop-score/index.js +1 -1
  157. package/dist/components/bmi-calculator/index.js +1 -1
  158. package/dist/components/booking/index.js +1 -1
  159. package/dist/components/button-group/index.js +1 -1
  160. package/dist/components/care-plan-card/index.js +1 -1
  161. package/dist/components/care-plan-entry-card/index.js +1 -1
  162. package/dist/components/care-plan-header/care-plan-header.agent.d.ts +4 -0
  163. package/dist/components/care-plan-header/care-plan-header.d.ts +111 -0
  164. package/dist/components/care-plan-header/index.d.ts +4 -0
  165. package/dist/components/care-plan-header/index.js +6 -0
  166. package/dist/components/chat-message/index.js +1 -1
  167. package/dist/components/city-input/city-input.agent.d.ts +8 -0
  168. package/dist/components/city-input/city-input.d.ts +57 -0
  169. package/dist/components/city-input/index.d.ts +5 -0
  170. package/dist/components/city-input/index.js +6 -0
  171. package/dist/components/clinical-note-card/clinical-note-card.d.ts +21 -1
  172. package/dist/components/clinical-note-card/index.js +1 -1
  173. package/dist/components/combobox/combobox.d.ts +17 -0
  174. package/dist/components/combobox/index.js +1 -1
  175. package/dist/components/connection-status/connection-status.agent.d.ts +4 -0
  176. package/dist/components/connection-status/connection-status.d.ts +36 -0
  177. package/dist/components/connection-status/index.d.ts +4 -0
  178. package/dist/components/connection-status/index.js +6 -0
  179. package/dist/components/contact-profile-card/index.js +1 -1
  180. package/dist/components/control-room-rail/control-room-context.d.ts +53 -0
  181. package/dist/components/control-room-rail/control-room-rail.agent.d.ts +4 -0
  182. package/dist/components/control-room-rail/control-room-rail.d.ts +35 -0
  183. package/dist/components/control-room-rail/index.d.ts +6 -0
  184. package/dist/components/control-room-rail/index.js +10 -0
  185. package/dist/components/counter/counter.d.ts +1 -1
  186. package/dist/components/country-select/country-select.agent.d.ts +8 -0
  187. package/dist/components/country-select/country-select.d.ts +51 -0
  188. package/dist/components/country-select/index.d.ts +6 -0
  189. package/dist/components/country-select/index.js +9 -0
  190. package/dist/components/country-select/iso-3166.d.ts +15 -0
  191. package/dist/components/cycle-calculator/index.js +1 -1
  192. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts +18 -0
  193. package/dist/components/data-table/cell-renderers/reorder-cell-renderer.d.ts +34 -0
  194. package/dist/components/data-table/index.d.ts +3 -1
  195. package/dist/components/data-table/index.js +35 -32
  196. package/dist/components/dependent-selector/index.js +1 -1
  197. package/dist/components/document-scanner/index.js +1 -1
  198. package/dist/components/due-date-calculator/index.js +2 -2
  199. package/dist/components/email-input/index.js +1 -1
  200. package/dist/components/entity-summary/entity-summary.agent.d.ts +4 -0
  201. package/dist/components/entity-summary/entity-summary.d.ts +92 -0
  202. package/dist/components/entity-summary/index.d.ts +3 -0
  203. package/dist/components/entity-summary/index.js +5 -0
  204. package/dist/components/fetal-weight/index.js +1 -1
  205. package/dist/components/field-array/field-array.agent.d.ts +4 -0
  206. package/dist/components/field-array/field-array.d.ts +45 -0
  207. package/dist/components/field-array/index.d.ts +4 -0
  208. package/dist/components/field-array/index.js +6 -0
  209. package/dist/components/file-upload/index.js +1 -1
  210. package/dist/components/freemium-paywall/freemium-paywall.d.ts +1 -1
  211. package/dist/components/freemium-paywall/index.js +1 -1
  212. package/dist/components/gestational-age-calculator/index.js +1 -1
  213. package/dist/components/hcg-doubling/index.js +1 -1
  214. package/dist/components/iban-input/iban-input.agent.d.ts +4 -0
  215. package/dist/components/iban-input/iban-input.d.ts +51 -0
  216. package/dist/components/iban-input/index.d.ts +5 -0
  217. package/dist/components/iban-input/index.js +13 -0
  218. package/dist/components/iban-input/is-valid-iban.d.ts +31 -0
  219. package/dist/components/icon-picker/icon-picker.agent.d.ts +4 -0
  220. package/dist/components/icon-picker/icon-picker.d.ts +41 -0
  221. package/dist/components/icon-picker/index.d.ts +4 -0
  222. package/dist/components/icon-picker/index.js +6 -0
  223. package/dist/components/image-cropper/crop-geometry.d.ts +30 -0
  224. package/dist/components/image-cropper/image-cropper.agent.d.ts +4 -0
  225. package/dist/components/image-cropper/image-cropper.d.ts +32 -0
  226. package/dist/components/image-cropper/index.d.ts +5 -0
  227. package/dist/components/image-cropper/index.js +11 -0
  228. package/dist/components/index.d.ts +25 -1
  229. package/dist/components/message-card/index.js +1 -1
  230. package/dist/components/message-card/message-card.d.ts +14 -0
  231. package/dist/components/message-tray/index.js +1 -1
  232. package/dist/components/message-tray/message-tray.d.ts +4 -0
  233. package/dist/components/multi-select/index.js +1 -1
  234. package/dist/components/nav-grid/index.d.ts +4 -0
  235. package/dist/components/nav-grid/index.js +7 -0
  236. package/dist/components/nav-grid/nav-grid.agent.d.ts +4 -0
  237. package/dist/components/nav-grid/nav-grid.d.ts +41 -0
  238. package/dist/components/notes-panel/index.d.ts +3 -0
  239. package/dist/components/notes-panel/index.js +5 -0
  240. package/dist/components/notes-panel/notes-panel.agent.d.ts +4 -0
  241. package/dist/components/notes-panel/notes-panel.d.ts +94 -0
  242. package/dist/components/notification-card/index.js +1 -1
  243. package/dist/components/notification-card/notification-card.d.ts +15 -0
  244. package/dist/components/notification-tray/index.js +1 -1
  245. package/dist/components/notification-tray/notification-tray.d.ts +4 -0
  246. package/dist/components/operator-hero/index.js +1 -1
  247. package/dist/components/panel-header/index.d.ts +3 -0
  248. package/dist/components/panel-header/index.js +7 -0
  249. package/dist/components/panel-header/panel-header.d.ts +41 -0
  250. package/dist/components/patient-details/index.d.ts +5 -0
  251. package/dist/components/patient-details/index.js +6 -0
  252. package/dist/components/patient-details/patient-details.agent.d.ts +4 -0
  253. package/dist/components/patient-details/patient-details.d.ts +96 -0
  254. package/dist/components/patient-search/index.js +1 -1
  255. package/dist/components/patient-summary-card/index.js +1 -1
  256. package/dist/components/patient-summary-card/patient-summary-card.d.ts +40 -1
  257. package/dist/components/patient-table/columns.d.ts +69 -40
  258. package/dist/components/patient-table/index.d.ts +2 -6
  259. package/dist/components/patient-table/index.js +8 -9
  260. package/dist/components/patient-table/patient-table.d.ts +38 -4
  261. package/dist/components/patient-table/types.d.ts +52 -2
  262. package/dist/components/patient-table/use-responsive-columns.d.ts +8 -6
  263. package/dist/components/payment-card/index.js +1 -1
  264. package/dist/components/payment-form/index.js +1 -1
  265. package/dist/components/pdf-viewer/index.js +1 -1
  266. package/dist/components/periodontal-chart-card/index.js +1 -1
  267. package/dist/components/permission-matrix/index.d.ts +4 -0
  268. package/dist/components/permission-matrix/index.js +7 -0
  269. package/dist/components/permission-matrix/permission-matrix.agent.d.ts +4 -0
  270. package/dist/components/permission-matrix/permission-matrix.d.ts +47 -0
  271. package/dist/components/position-grid/index.d.ts +4 -0
  272. package/dist/components/position-grid/index.js +7 -0
  273. package/dist/components/position-grid/position-grid.agent.d.ts +4 -0
  274. package/dist/components/position-grid/position-grid.d.ts +39 -0
  275. package/dist/components/postal-code-input/index.d.ts +5 -0
  276. package/dist/components/postal-code-input/index.js +6 -0
  277. package/dist/components/postal-code-input/postal-code-input.agent.d.ts +8 -0
  278. package/dist/components/postal-code-input/postal-code-input.d.ts +27 -0
  279. package/dist/components/practice-results/index.js +1 -1
  280. package/dist/components/pregnancy-dating/index.js +1 -1
  281. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  282. package/dist/components/product-hub-tray/index.js +1 -1
  283. package/dist/components/product-hub-tray/product-hub-tray.d.ts +13 -1
  284. package/dist/components/province-select/index.d.ts +6 -0
  285. package/dist/components/province-select/index.js +7 -0
  286. package/dist/components/province-select/it-provinces.d.ts +8 -0
  287. package/dist/components/province-select/province-select.agent.d.ts +8 -0
  288. package/dist/components/province-select/province-select.d.ts +38 -0
  289. package/dist/components/public-footer/public-footer.d.ts +1 -1
  290. package/dist/components/public-header/index.js +1 -1
  291. package/dist/components/radiograph-panel/index.d.ts +4 -0
  292. package/dist/components/radiograph-panel/index.js +7 -0
  293. package/dist/components/radiograph-panel/radiograph-panel.agent.d.ts +13 -0
  294. package/dist/components/radiograph-panel/radiograph-panel.d.ts +36 -0
  295. package/dist/components/reviews-panel/index.js +1 -1
  296. package/dist/components/rich-text-editor/editor-toolbar.d.ts +17 -0
  297. package/dist/components/rich-text-editor/index.js +1 -1
  298. package/dist/components/scroll-area/index.js +1 -1
  299. package/dist/components/select/index.js +1 -1
  300. package/dist/components/select/select.d.ts +8 -2
  301. package/dist/components/sheet/index.js +1 -1
  302. package/dist/components/sidebar/index.js +2 -2
  303. package/dist/components/sign-document/index.js +1 -1
  304. package/dist/components/skeleton/skeleton.d.ts +1 -1
  305. package/dist/components/stepper-accordion/index.js +1 -1
  306. package/dist/components/tab-bar/index.js +1 -1
  307. package/dist/components/tab-bar/tab-bar.d.ts +18 -1
  308. package/dist/components/tabs/index.js +1 -1
  309. package/dist/components/task-card/index.js +1 -1
  310. package/dist/components/task-card/task-card.d.ts +14 -6
  311. package/dist/components/task-tray/index.js +1 -1
  312. package/dist/components/tasks-panel/index.d.ts +4 -0
  313. package/dist/components/tasks-panel/index.js +6 -0
  314. package/dist/components/tasks-panel/tasks-panel.agent.d.ts +4 -0
  315. package/dist/components/tasks-panel/tasks-panel.d.ts +152 -0
  316. package/dist/components/token-insert-menu/index.d.ts +4 -0
  317. package/dist/components/token-insert-menu/index.js +6 -0
  318. package/dist/components/token-insert-menu/token-insert-menu.agent.d.ts +4 -0
  319. package/dist/components/token-insert-menu/token-insert-menu.d.ts +33 -0
  320. package/dist/components/tool-rail/index.d.ts +4 -0
  321. package/dist/components/tool-rail/index.js +6 -0
  322. package/dist/components/tool-rail/tool-rail.agent.d.ts +4 -0
  323. package/dist/components/tool-rail/tool-rail.d.ts +160 -0
  324. package/dist/components/tooth-scheme/index.d.ts +2 -2
  325. package/dist/components/tooth-scheme/index.js +30 -23
  326. package/dist/components/tooth-scheme/tooth-data.d.ts +112 -1
  327. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -2
  328. package/dist/components/tooth-scheme/tooth-scheme.d.ts +84 -11
  329. package/dist/components/transaction-chip/index.js +1 -1
  330. package/dist/components/transaction-chip/transaction-chip.d.ts +2 -2
  331. package/dist/components/transcript-panel/index.js +1 -1
  332. package/dist/components/transcript-panel/transcript-panel.d.ts +2 -2
  333. package/dist/components/unit-converter/index.js +1 -1
  334. package/dist/components/warning-stack/index.js +1 -1
  335. package/dist/components/warning-stack/warning-stack.d.ts +10 -7
  336. package/dist/components/workflow/index.js +1 -1
  337. package/dist/hooks/index.d.ts +1 -0
  338. package/dist/hooks/index.js +24 -22
  339. package/dist/hooks/use-clamp-overflow.d.ts +19 -0
  340. package/dist/hooks/use-edge-resize.d.ts +2 -2
  341. package/dist/hooks/use-overflow-collapse.d.ts +46 -0
  342. package/dist/hooks/use-persistent-state.d.ts +7 -1
  343. package/dist/hooks/use-scroll-overflow.d.ts +36 -0
  344. package/dist/i18n/locales/ar.d.ts +475 -26
  345. package/dist/i18n/locales/ar.js +478 -31
  346. package/dist/i18n/locales/de.d.ts +475 -26
  347. package/dist/i18n/locales/de.js +480 -31
  348. package/dist/i18n/locales/el.d.ts +475 -26
  349. package/dist/i18n/locales/el.js +485 -31
  350. package/dist/i18n/locales/en.d.ts +476 -34
  351. package/dist/i18n/locales/en.js +492 -39
  352. package/dist/i18n/locales/es.d.ts +475 -26
  353. package/dist/i18n/locales/es.js +477 -31
  354. package/dist/i18n/locales/fr.d.ts +475 -26
  355. package/dist/i18n/locales/fr.js +480 -31
  356. package/dist/i18n/locales/hi.d.ts +475 -26
  357. package/dist/i18n/locales/hi.js +476 -31
  358. package/dist/i18n/locales/it.d.ts +475 -26
  359. package/dist/i18n/locales/it.js +480 -31
  360. package/dist/i18n/locales/ja.d.ts +475 -26
  361. package/dist/i18n/locales/ja.js +481 -31
  362. package/dist/i18n/locales/nl.d.ts +475 -26
  363. package/dist/i18n/locales/nl.js +473 -31
  364. package/dist/i18n/locales/pl.d.ts +475 -26
  365. package/dist/i18n/locales/pl.js +481 -31
  366. package/dist/i18n/locales/pt.d.ts +475 -26
  367. package/dist/i18n/locales/pt.js +485 -31
  368. package/dist/i18n/locales/ro.d.ts +475 -26
  369. package/dist/i18n/locales/ro.js +485 -31
  370. package/dist/i18n/locales/ru.d.ts +475 -26
  371. package/dist/i18n/locales/ru.js +478 -31
  372. package/dist/i18n/locales/sq.d.ts +475 -26
  373. package/dist/i18n/locales/sq.js +482 -31
  374. package/dist/i18n/locales/sv.d.ts +475 -26
  375. package/dist/i18n/locales/sv.js +480 -31
  376. package/dist/i18n/locales/tr.d.ts +475 -26
  377. package/dist/i18n/locales/tr.js +478 -31
  378. package/dist/i18n/locales/zh.d.ts +475 -26
  379. package/dist/i18n/locales/zh.js +473 -31
  380. package/dist/index.js +826 -709
  381. package/dist/locales/ar.json +480 -31
  382. package/dist/locales/de.json +480 -31
  383. package/dist/locales/el.json +480 -31
  384. package/dist/locales/en.json +480 -31
  385. package/dist/locales/es.json +480 -31
  386. package/dist/locales/fr.json +480 -31
  387. package/dist/locales/hi.json +480 -31
  388. package/dist/locales/it.json +480 -31
  389. package/dist/locales/ja.json +480 -31
  390. package/dist/locales/nl.json +480 -31
  391. package/dist/locales/pl.json +480 -31
  392. package/dist/locales/pt.json +480 -31
  393. package/dist/locales/ro.json +480 -31
  394. package/dist/locales/ru.json +480 -31
  395. package/dist/locales/sq.json +480 -31
  396. package/dist/locales/sv.json +480 -31
  397. package/dist/locales/tr.json +480 -31
  398. package/dist/locales/zh.json +480 -31
  399. package/dist/patterns/alia-assistant/alia-types.d.ts +9 -0
  400. package/dist/patterns/alia-assistant/index.js +1 -1
  401. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  402. package/dist/patterns/patient-shell/index.js +1 -1
  403. package/dist/tokens.css +9 -1
  404. package/package.json +101 -5
  405. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js +0 -373
  406. package/dist/_chunks/appointment-tray-CZtvtaH-.js +0 -431
  407. package/dist/_chunks/clinical-note-card-DqQYf_D4.js +0 -333
  408. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js +0 -448
  409. package/dist/_chunks/email-input-B_Y55f5G.js +0 -396
  410. package/dist/_chunks/message-card-Bx4GmLvf.js +0 -277
  411. package/dist/_chunks/notification-card-BiESdm8q.js +0 -255
  412. package/dist/_chunks/patient-summary-card-B836_fDB.js +0 -435
  413. package/dist/_chunks/patient-table-CDuosVru.js +0 -889
  414. package/dist/_chunks/reviews-panel-Dq7LMDcH.js +0 -555
  415. package/dist/_chunks/rich-text-editor-BsV7zUdg.js +0 -2142
  416. package/dist/_chunks/tab-bar-B1ovILzh.js +0 -105
  417. package/dist/_chunks/task-card-BwY9jaV1.js +0 -124
  418. package/dist/_chunks/tooth-scheme-yBr53cvv.js +0 -1330
  419. package/dist/_chunks/use-persistent-state-i23OWy6G.js +0 -24
  420. package/dist/components/ai-tools-rail/ai-tools-rail.agent.d.ts +0 -4
  421. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +0 -68
  422. package/dist/components/ai-tools-rail/index.d.ts +0 -4
  423. package/dist/components/ai-tools-rail/index.js +0 -6
  424. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts +0 -45
  425. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts +0 -26
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.69.0",
3
+ "packageVersion": "0.71.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -204,6 +204,114 @@
204
204
  }
205
205
  }
206
206
  },
207
+ {
208
+ "kind": "component",
209
+ "id": "address-fields",
210
+ "capabilities": [
211
+ "set_value"
212
+ ],
213
+ "state": [
214
+ {
215
+ "name": "value",
216
+ "type": "object",
217
+ "description": "The current structured address: { street, city, postcode, province, country, formatted }.",
218
+ "descriptionKey": "ui.agent.addressFields.state.value"
219
+ }
220
+ ],
221
+ "actions": [
222
+ {
223
+ "name": "set_value",
224
+ "safety": "write",
225
+ "argsType": "{ value: StructuredAddress }",
226
+ "argsSchema": {
227
+ "type": "object",
228
+ "properties": {
229
+ "value": {
230
+ "type": "object",
231
+ "properties": {
232
+ "street": {
233
+ "type": "string"
234
+ },
235
+ "city": {
236
+ "type": "string"
237
+ },
238
+ "postcode": {
239
+ "type": "string"
240
+ },
241
+ "province": {
242
+ "type": "string",
243
+ "description": "UPPERCASED province code."
244
+ },
245
+ "country": {
246
+ "type": "string",
247
+ "description": "ISO alpha-2, lowercased."
248
+ },
249
+ "formatted": {
250
+ "type": "string"
251
+ }
252
+ }
253
+ }
254
+ },
255
+ "required": [
256
+ "value"
257
+ ]
258
+ },
259
+ "idempotent": true,
260
+ "description": "Replace the entire address.",
261
+ "descriptionKey": "ui.agent.addressFields.actions.setValue"
262
+ },
263
+ {
264
+ "name": "set_field",
265
+ "safety": "write",
266
+ "argsType": "{ field: 'street' | 'city' | 'postcode' | 'province' | 'country'; value: string }",
267
+ "argsSchema": {
268
+ "type": "object",
269
+ "properties": {
270
+ "field": {
271
+ "type": "string",
272
+ "enum": [
273
+ "street",
274
+ "city",
275
+ "postcode",
276
+ "province",
277
+ "country"
278
+ ]
279
+ },
280
+ "value": {
281
+ "type": "string"
282
+ }
283
+ },
284
+ "required": [
285
+ "field",
286
+ "value"
287
+ ]
288
+ },
289
+ "idempotent": true,
290
+ "examples": [
291
+ {
292
+ "args": {
293
+ "field": "country",
294
+ "value": "it"
295
+ },
296
+ "note": "Set the country to Italy."
297
+ }
298
+ ],
299
+ "description": "Set a single address field. Setting `country` also clears the now-stale province.",
300
+ "descriptionKey": "ui.agent.addressFields.actions.setField"
301
+ }
302
+ ],
303
+ "domHooks": {
304
+ "root": {
305
+ "attr": "data-component",
306
+ "value": "address-fields"
307
+ },
308
+ "instanceId": {
309
+ "attr": "data-component-id",
310
+ "sourceProp": "id",
311
+ "description": "Sourced from the id prop."
312
+ }
313
+ }
314
+ },
207
315
  {
208
316
  "kind": "component",
209
317
  "id": "agenda-card",
@@ -408,162 +516,372 @@
408
516
  },
409
517
  {
410
518
  "kind": "component",
411
- "id": "ai-tools-rail",
519
+ "id": "alert",
412
520
  "capabilities": [
413
- "open",
414
- "close",
415
- "select_single"
521
+ "dismiss"
522
+ ],
523
+ "state": [],
524
+ "actions": [],
525
+ "domHooks": {
526
+ "root": {
527
+ "attr": "data-component",
528
+ "value": "alert",
529
+ "description": "Marks the element as a kit Alert. The root also emits `data-state=\"open\" | \"closing\"` while the dismiss animation runs. Alerts inherit native `id` from props, which is what agents address them by."
530
+ }
531
+ }
532
+ },
533
+ {
534
+ "kind": "component",
535
+ "id": "anamnesis-card",
536
+ "capabilities": [],
537
+ "state": [],
538
+ "actions": [],
539
+ "domHooks": {
540
+ "root": {
541
+ "attr": "data-component",
542
+ "value": "anamnesis-card",
543
+ "description": "Marks the element as a kit AnamnesisCard. The root also emits data-has-flags when at least one answer is a clinical red-flag — a structural boolean only, never the underlying answer."
544
+ },
545
+ "instanceId": {
546
+ "attr": "data-component-id",
547
+ "sourceProp": "id",
548
+ "description": "Sourced from the id prop — the stable questionnaire identifier."
549
+ }
550
+ }
551
+ },
552
+ {
553
+ "kind": "component",
554
+ "id": "anatomy-scheme",
555
+ "capabilities": [
556
+ "pick",
557
+ "set_value",
558
+ "edit_inline",
559
+ "view_change"
416
560
  ],
417
561
  "state": [
418
562
  {
419
- "name": "activeToolId",
420
- "type": "string | null",
421
- "description": "Id of the tool whose panel is currently open, or null when the rail is collapsed to its strip. No panel content is ever exposed.",
422
- "descriptionKey": "ui.aiToolsRail.agent.state.activeToolId"
563
+ "name": "chart",
564
+ "type": "object",
565
+ "description": "Current anatomy chart findings keyed by region id. Notes are PHI and omitted from this snapshot; read them per-region via get_region.",
566
+ "descriptionKey": "ui.agent.anatomyScheme.state.chart"
567
+ },
568
+ {
569
+ "name": "activeView",
570
+ "type": "string",
571
+ "description": "Id of the currently displayed anatomy view.",
572
+ "descriptionKey": "ui.agent.anatomyScheme.state.activeView"
423
573
  }
424
574
  ],
425
575
  "actions": [
426
576
  {
427
- "name": "open",
577
+ "name": "focus_region",
428
578
  "safety": "read",
429
- "argsType": "{ id: string }",
579
+ "argsType": "{ regionId: string }",
430
580
  "argsSchema": {
431
581
  "type": "object",
432
582
  "properties": {
433
- "id": {
434
- "type": "string"
583
+ "regionId": {
584
+ "type": "string",
585
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
435
586
  }
436
587
  },
437
588
  "required": [
438
- "id"
589
+ "regionId"
439
590
  ]
440
591
  },
441
592
  "idempotent": true,
442
- "examples": [
443
- {
444
- "args": {
445
- "id": "inbox"
593
+ "description": "Move focus to a specific region in the active view.",
594
+ "descriptionKey": "ui.agent.anatomyScheme.actions.focusRegion"
595
+ },
596
+ {
597
+ "name": "get_region",
598
+ "safety": "phi",
599
+ "argsType": "{ regionId: string }",
600
+ "argsSchema": {
601
+ "type": "object",
602
+ "properties": {
603
+ "regionId": {
604
+ "type": "string",
605
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
606
+ }
607
+ },
608
+ "required": [
609
+ "regionId"
610
+ ]
611
+ },
612
+ "returns": "AnatomyFinding[]",
613
+ "returnsSchema": {
614
+ "type": "array",
615
+ "items": {
616
+ "type": "object",
617
+ "properties": {
618
+ "type": {
619
+ "enum": [
620
+ "observation",
621
+ "lesion",
622
+ "pain",
623
+ "treatment",
624
+ "note"
625
+ ]
626
+ },
627
+ "note": {
628
+ "type": "string"
629
+ }
446
630
  },
447
- "note": "Open the inbox tool panel."
631
+ "required": [
632
+ "type"
633
+ ]
448
634
  }
449
- ],
450
- "description": "Open the given tool's panel.",
451
- "descriptionKey": "ui.aiToolsRail.agent.actions.open"
635
+ },
636
+ "idempotent": true,
637
+ "description": "Read the findings (incl. notes) recorded on one region.",
638
+ "descriptionKey": "ui.agent.anatomyScheme.actions.getRegion"
452
639
  },
453
640
  {
454
- "name": "close",
641
+ "name": "regions_with",
455
642
  "safety": "read",
643
+ "argsType": "{ type: FindingType }",
644
+ "argsSchema": {
645
+ "type": "object",
646
+ "properties": {
647
+ "type": {
648
+ "enum": [
649
+ "observation",
650
+ "lesion",
651
+ "pain",
652
+ "treatment",
653
+ "note"
654
+ ]
655
+ }
656
+ },
657
+ "required": [
658
+ "type"
659
+ ]
660
+ },
661
+ "returns": "string[]",
662
+ "returnsSchema": {
663
+ "type": "array",
664
+ "items": {
665
+ "type": "string",
666
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
667
+ }
668
+ },
456
669
  "idempotent": true,
457
- "description": "Collapse the rail to its strip (no active tool).",
458
- "descriptionKey": "ui.aiToolsRail.agent.actions.close"
670
+ "description": "List the region ids carrying a given finding type.",
671
+ "descriptionKey": "ui.agent.anatomyScheme.actions.regionsWith"
459
672
  },
460
673
  {
461
- "name": "select_tool",
462
- "safety": "read",
463
- "argsType": "{ id: string | null }",
674
+ "name": "set_finding",
675
+ "safety": "write",
676
+ "argsType": "{ regionId: string; type: FindingType; note?: string }",
464
677
  "argsSchema": {
465
678
  "type": "object",
466
679
  "properties": {
467
- "id": {
468
- "type": [
469
- "string",
470
- "null"
680
+ "regionId": {
681
+ "type": "string",
682
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
683
+ },
684
+ "type": {
685
+ "enum": [
686
+ "observation",
687
+ "lesion",
688
+ "pain",
689
+ "treatment",
690
+ "note"
471
691
  ]
692
+ },
693
+ "note": {
694
+ "type": "string"
472
695
  }
473
696
  },
474
697
  "required": [
475
- "id"
698
+ "regionId",
699
+ "type"
476
700
  ]
477
701
  },
478
702
  "idempotent": true,
479
- "description": "Set the active tool by id (opens its panel), or pass null to collapse.",
480
- "descriptionKey": "ui.aiToolsRail.agent.actions.selectTool"
703
+ "description": "Record a finding (observation / lesion / pain / treatment / note) on a region.",
704
+ "descriptionKey": "ui.agent.anatomyScheme.actions.setFinding"
705
+ },
706
+ {
707
+ "name": "remove_finding",
708
+ "safety": "write",
709
+ "argsType": "{ regionId: string; type: FindingType }",
710
+ "argsSchema": {
711
+ "type": "object",
712
+ "properties": {
713
+ "regionId": {
714
+ "type": "string",
715
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
716
+ },
717
+ "type": {
718
+ "enum": [
719
+ "observation",
720
+ "lesion",
721
+ "pain",
722
+ "treatment",
723
+ "note"
724
+ ]
725
+ }
726
+ },
727
+ "required": [
728
+ "regionId",
729
+ "type"
730
+ ]
731
+ },
732
+ "idempotent": true,
733
+ "description": "Remove a single finding type from a region.",
734
+ "descriptionKey": "ui.agent.anatomyScheme.actions.removeFinding"
735
+ },
736
+ {
737
+ "name": "clear_region",
738
+ "safety": "destructive",
739
+ "argsType": "{ regionId: string }",
740
+ "argsSchema": {
741
+ "type": "object",
742
+ "properties": {
743
+ "regionId": {
744
+ "type": "string",
745
+ "description": "Region id within the active view, e.g. 'ovary-l', 'prostate', 'quadriceps-r', 'kidney-r'."
746
+ }
747
+ },
748
+ "required": [
749
+ "regionId"
750
+ ]
751
+ },
752
+ "idempotent": true,
753
+ "description": "Clear every finding from a region.",
754
+ "descriptionKey": "ui.agent.anatomyScheme.actions.clearRegion"
755
+ },
756
+ {
757
+ "name": "set_view",
758
+ "safety": "write",
759
+ "argsType": "{ viewId: string }",
760
+ "argsSchema": {
761
+ "type": "object",
762
+ "properties": {
763
+ "viewId": {
764
+ "type": "string",
765
+ "description": "View id, e.g. 'body-front', 'face-front', 'female-reproductive', 'male-reproductive', 'urinary', 'muscular-front', 'skeletal-front'."
766
+ }
767
+ },
768
+ "required": [
769
+ "viewId"
770
+ ]
771
+ },
772
+ "idempotent": true,
773
+ "description": "Switch the active anatomy view.",
774
+ "descriptionKey": "ui.agent.anatomyScheme.actions.setView"
481
775
  }
482
776
  ],
483
777
  "domHooks": {
484
778
  "root": {
485
779
  "attr": "data-component",
486
- "value": "ai-tools-rail",
487
- "description": "Marks the AiToolsRail wrapper."
780
+ "value": "anatomy-scheme"
488
781
  },
489
782
  "instanceId": {
490
783
  "attr": "data-component-id",
491
784
  "sourceProp": "id",
492
- "description": "Sourced from the id prop. Required to address a specific rail from the agent."
785
+ "description": "Sourced from the id prop."
493
786
  },
494
787
  "item": {
495
- "attr": "data-tool-id",
496
- "description": "Stable tool id emitted on each strip IconButton. The active icon also carries data-active set to its id."
788
+ "attr": "data-region",
789
+ "description": "Each rendered region `<g>` carries its region id as `data-region` and its anatomical side (`left` / `right` / `midline`) as `data-side`, so bilateral regions can be disambiguated by side. The root `data-system` / `data-view` attributes expose the active anatomy system and view."
497
790
  }
498
791
  }
499
792
  },
500
793
  {
501
794
  "kind": "component",
502
- "id": "alert",
503
- "capabilities": [
504
- "dismiss"
505
- ],
795
+ "id": "app-frame",
796
+ "capabilities": [],
506
797
  "state": [],
507
798
  "actions": [],
508
799
  "domHooks": {
509
800
  "root": {
510
801
  "attr": "data-component",
511
- "value": "alert",
512
- "description": "Marks the element as a kit Alert. The root also emits `data-state=\"open\" | \"closing\"` while the dismiss animation runs. Alerts inherit native `id` from props, which is what agents address them by."
802
+ "value": "app-frame",
803
+ "description": "Marks the AppFrame layout wrapper. Inner landmarks (Header, Sidebar, main) carry their own component hooks."
513
804
  }
514
805
  }
515
806
  },
516
807
  {
517
808
  "kind": "component",
518
- "id": "anamnesis-card",
519
- "capabilities": [],
809
+ "id": "appointment-card",
810
+ "capabilities": [
811
+ "pick"
812
+ ],
520
813
  "state": [],
521
814
  "actions": [],
522
815
  "domHooks": {
523
816
  "root": {
524
817
  "attr": "data-component",
525
- "value": "anamnesis-card",
526
- "description": "Marks the element as a kit AnamnesisCard. The root also emits data-has-flags when at least one answer is a clinical red-flag a structural boolean only, never the underlying answer."
818
+ "value": "appointment-card",
819
+ "description": "Marks the element as a kit AppointmentCard. The root also emits data-component-id sourced from item.id, data-state with the appointment lifecycle, and data-type with the delivery channel."
527
820
  },
528
821
  "instanceId": {
529
822
  "attr": "data-component-id",
530
- "sourceProp": "id",
531
- "description": "Sourced from the id prop — the stable questionnaire identifier."
532
- }
533
- }
534
- },
535
- {
536
- "kind": "component",
537
- "id": "app-frame",
538
- "capabilities": [],
539
- "state": [],
540
- "actions": [],
541
- "domHooks": {
542
- "root": {
543
- "attr": "data-component",
544
- "value": "app-frame",
545
- "description": "Marks the AppFrame layout wrapper. Inner landmarks (Header, Sidebar, main) carry their own component hooks."
823
+ "sourceProp": "item.id",
824
+ "description": "Sourced from item.id — the stable appointment identifier."
546
825
  }
547
826
  }
548
827
  },
549
828
  {
550
829
  "kind": "component",
551
- "id": "appointment-card",
830
+ "id": "appointment-timeline",
552
831
  "capabilities": [
832
+ "scroll",
553
833
  "pick"
554
834
  ],
555
- "state": [],
556
- "actions": [],
835
+ "state": [
836
+ {
837
+ "name": "items",
838
+ "type": "Array<{ id: string; state: string }>",
839
+ "description": "Currently-rendered appointments. Ids + lifecycle state only — never patient identity.",
840
+ "descriptionKey": "ui.agent.appointmentTimeline.state.items"
841
+ }
842
+ ],
843
+ "actions": [
844
+ {
845
+ "name": "select_item",
846
+ "safety": "read",
847
+ "argsType": "{ id: string }",
848
+ "argsSchema": {
849
+ "type": "object",
850
+ "properties": {
851
+ "id": {
852
+ "type": "string"
853
+ }
854
+ },
855
+ "required": [
856
+ "id"
857
+ ]
858
+ },
859
+ "idempotent": true,
860
+ "description": "Activate the appointment with the given id.",
861
+ "descriptionKey": "ui.agent.appointmentTimeline.actions.selectItem"
862
+ },
863
+ {
864
+ "name": "jump_to_today",
865
+ "safety": "read",
866
+ "idempotent": true,
867
+ "description": "Re-anchor the timeline scroll on today's appointments.",
868
+ "descriptionKey": "ui.agent.appointmentTimeline.actions.jumpToToday"
869
+ }
870
+ ],
557
871
  "domHooks": {
558
872
  "root": {
559
873
  "attr": "data-component",
560
- "value": "appointment-card",
561
- "description": "Marks the element as a kit AppointmentCard. The root also emits data-component-id sourced from item.id, data-state with the appointment lifecycle, and data-type with the delivery channel."
874
+ "value": "appointment-timeline",
875
+ "description": "Marks the AppointmentTimeline wrapper."
562
876
  },
563
877
  "instanceId": {
564
878
  "attr": "data-component-id",
565
- "sourceProp": "item.id",
566
- "description": "Sourced from item.id the stable appointment identifier."
879
+ "sourceProp": "id",
880
+ "description": "Sourced from the id prop. Required to address a specific timeline from the agent."
881
+ },
882
+ "item": {
883
+ "attr": "data-appointment-id",
884
+ "description": "Stable appointment id emitted on each rendered AppointmentCard inside the timeline."
567
885
  }
568
886
  }
569
887
  },
@@ -1565,6 +1883,38 @@
1565
1883
  }
1566
1884
  }
1567
1885
  },
1886
+ {
1887
+ "kind": "component",
1888
+ "id": "care-plan-header",
1889
+ "capabilities": [],
1890
+ "state": [
1891
+ {
1892
+ "name": "state",
1893
+ "type": "'estimate' | 'accepted' | 'discarded' | 'closed'",
1894
+ "description": "The plan lifecycle state. Enum value only — never the localised label or any PHI.",
1895
+ "descriptionKey": "ui.agent.carePlanHeader.state.state"
1896
+ },
1897
+ {
1898
+ "name": "alertCount",
1899
+ "type": "number",
1900
+ "description": "How many attention alerts (e.g. missing signature) are showing. Count only — never the alert labels.",
1901
+ "descriptionKey": "ui.agent.carePlanHeader.state.alertCount"
1902
+ }
1903
+ ],
1904
+ "actions": [],
1905
+ "domHooks": {
1906
+ "root": {
1907
+ "attr": "data-component",
1908
+ "value": "care-plan-header",
1909
+ "description": "Marks the CarePlanHeader root region."
1910
+ },
1911
+ "instanceId": {
1912
+ "attr": "data-component-id",
1913
+ "sourceProp": "id",
1914
+ "description": "Sourced from the id prop. Addresses a specific plan header."
1915
+ }
1916
+ }
1917
+ },
1568
1918
  {
1569
1919
  "kind": "component",
1570
1920
  "id": "carousel",
@@ -1848,7 +2198,7 @@
1848
2198
  "root": {
1849
2199
  "attr": "data-component",
1850
2200
  "value": "chat-message",
1851
- "description": "Marks the ChatMessage article element. Agents address an individual message by its native `id` and read role / status from the DOM."
2201
+ "description": "Marks the ChatMessage article element. Agents address an individual message by its native `id` and read role / status from the `data-role` and `data-status` attributes emitted on this element (`data-status` is omitted when the message has no status)."
1852
2202
  }
1853
2203
  }
1854
2204
  },
@@ -1945,26 +2295,94 @@
1945
2295
  "descriptionKey": "ui.agent.checkboxGroup.actions.setSelection"
1946
2296
  },
1947
2297
  {
1948
- "name": "clear_selection",
2298
+ "name": "clear_selection",
2299
+ "safety": "destructive",
2300
+ "description": "Uncheck every option in the group.",
2301
+ "descriptionKey": "ui.agent.checkboxGroup.actions.clearSelection"
2302
+ }
2303
+ ],
2304
+ "domHooks": {
2305
+ "root": {
2306
+ "attr": "data-component",
2307
+ "value": "checkbox-group",
2308
+ "description": "Marks the CheckboxGroup fieldset."
2309
+ },
2310
+ "instanceId": {
2311
+ "attr": "data-component-id",
2312
+ "sourceProp": "id",
2313
+ "description": "Sourced from the id prop."
2314
+ },
2315
+ "item": {
2316
+ "attr": "data-option-id",
2317
+ "description": "Stable opaque value emitted on each rendered Checkbox child within the group."
2318
+ }
2319
+ }
2320
+ },
2321
+ {
2322
+ "kind": "component",
2323
+ "id": "city-input",
2324
+ "capabilities": [
2325
+ "set_value"
2326
+ ],
2327
+ "state": [
2328
+ {
2329
+ "name": "value",
2330
+ "type": "string",
2331
+ "description": "Current city / town value.",
2332
+ "descriptionKey": "ui.agent.cityInput.state.value"
2333
+ },
2334
+ {
2335
+ "name": "isEmpty",
2336
+ "type": "boolean",
2337
+ "description": "Whether the field has no value.",
2338
+ "descriptionKey": "ui.agent.cityInput.state.isEmpty"
2339
+ }
2340
+ ],
2341
+ "actions": [
2342
+ {
2343
+ "name": "set_value",
2344
+ "safety": "write",
2345
+ "argsType": "{ value: string }",
2346
+ "argsSchema": {
2347
+ "type": "object",
2348
+ "properties": {
2349
+ "value": {
2350
+ "type": "string"
2351
+ }
2352
+ },
2353
+ "required": [
2354
+ "value"
2355
+ ]
2356
+ },
2357
+ "idempotent": true,
2358
+ "examples": [
2359
+ {
2360
+ "args": {
2361
+ "value": "Milano"
2362
+ },
2363
+ "note": "Set the city to Milano."
2364
+ }
2365
+ ],
2366
+ "description": "Replace the city value.",
2367
+ "descriptionKey": "ui.agent.cityInput.actions.setValue"
2368
+ },
2369
+ {
2370
+ "name": "clear",
1949
2371
  "safety": "destructive",
1950
- "description": "Uncheck every option in the group.",
1951
- "descriptionKey": "ui.agent.checkboxGroup.actions.clearSelection"
2372
+ "idempotent": true,
2373
+ "description": "Empty the field. Loses any typed value.",
2374
+ "descriptionKey": "ui.agent.cityInput.actions.clear"
1952
2375
  }
1953
2376
  ],
1954
2377
  "domHooks": {
1955
2378
  "root": {
1956
2379
  "attr": "data-component",
1957
- "value": "checkbox-group",
1958
- "description": "Marks the CheckboxGroup fieldset."
2380
+ "value": "city-input"
1959
2381
  },
1960
2382
  "instanceId": {
1961
2383
  "attr": "data-component-id",
1962
2384
  "sourceProp": "id",
1963
2385
  "description": "Sourced from the id prop."
1964
- },
1965
- "item": {
1966
- "attr": "data-option-id",
1967
- "description": "Stable opaque value emitted on each rendered Checkbox child within the group."
1968
2386
  }
1969
2387
  }
1970
2388
  },
@@ -2312,6 +2730,50 @@
2312
2730
  }
2313
2731
  }
2314
2732
  },
2733
+ {
2734
+ "kind": "component",
2735
+ "id": "connection-status",
2736
+ "capabilities": [
2737
+ "submit",
2738
+ "dismiss"
2739
+ ],
2740
+ "state": [
2741
+ {
2742
+ "name": "status",
2743
+ "type": "string",
2744
+ "description": "Connection state of the external service: 'connected', 'disconnected', 'pending', or 'error'.",
2745
+ "descriptionKey": "ui.agent.connectionStatus.state.status"
2746
+ }
2747
+ ],
2748
+ "actions": [
2749
+ {
2750
+ "name": "connect",
2751
+ "safety": "write",
2752
+ "openWorld": true,
2753
+ "description": "Begin connecting the external service — invokes the consumer-supplied onConnect handler.",
2754
+ "descriptionKey": "ui.agent.connectionStatus.actions.connect"
2755
+ },
2756
+ {
2757
+ "name": "disconnect",
2758
+ "safety": "destructive",
2759
+ "openWorld": true,
2760
+ "description": "Disconnect the external service — invokes the consumer-supplied onDisconnect handler.",
2761
+ "descriptionKey": "ui.agent.connectionStatus.actions.disconnect"
2762
+ }
2763
+ ],
2764
+ "domHooks": {
2765
+ "root": {
2766
+ "attr": "data-component",
2767
+ "value": "connection-status",
2768
+ "description": "Marks the ConnectionStatus wrapper."
2769
+ },
2770
+ "instanceId": {
2771
+ "attr": "data-component-id",
2772
+ "sourceProp": "id",
2773
+ "description": "Sourced from the id prop."
2774
+ }
2775
+ }
2776
+ },
2315
2777
  {
2316
2778
  "kind": "component",
2317
2779
  "id": "contact-card",
@@ -2352,6 +2814,97 @@
2352
2814
  }
2353
2815
  }
2354
2816
  },
2817
+ {
2818
+ "kind": "component",
2819
+ "id": "control-room-rail",
2820
+ "capabilities": [
2821
+ "open",
2822
+ "close",
2823
+ "select_single"
2824
+ ],
2825
+ "state": [
2826
+ {
2827
+ "name": "activeToolId",
2828
+ "type": "string | null",
2829
+ "description": "Id of the tool whose panel is currently open, or null when the rail is collapsed to its strip. No panel content is ever exposed.",
2830
+ "descriptionKey": "ui.toolRail.agent.state.activeToolId"
2831
+ }
2832
+ ],
2833
+ "actions": [
2834
+ {
2835
+ "name": "open",
2836
+ "safety": "read",
2837
+ "argsType": "{ id: string }",
2838
+ "argsSchema": {
2839
+ "type": "object",
2840
+ "properties": {
2841
+ "id": {
2842
+ "type": "string"
2843
+ }
2844
+ },
2845
+ "required": [
2846
+ "id"
2847
+ ]
2848
+ },
2849
+ "idempotent": true,
2850
+ "examples": [
2851
+ {
2852
+ "args": {
2853
+ "id": "inbox"
2854
+ },
2855
+ "note": "Open the inbox tool panel."
2856
+ }
2857
+ ],
2858
+ "description": "Open the given tool's panel.",
2859
+ "descriptionKey": "ui.toolRail.agent.actions.open"
2860
+ },
2861
+ {
2862
+ "name": "close",
2863
+ "safety": "read",
2864
+ "idempotent": true,
2865
+ "description": "Collapse the rail to its strip (no active tool).",
2866
+ "descriptionKey": "ui.toolRail.agent.actions.close"
2867
+ },
2868
+ {
2869
+ "name": "select_tool",
2870
+ "safety": "read",
2871
+ "argsType": "{ id: string | null }",
2872
+ "argsSchema": {
2873
+ "type": "object",
2874
+ "properties": {
2875
+ "id": {
2876
+ "type": [
2877
+ "string",
2878
+ "null"
2879
+ ]
2880
+ }
2881
+ },
2882
+ "required": [
2883
+ "id"
2884
+ ]
2885
+ },
2886
+ "idempotent": true,
2887
+ "description": "Set the active tool by id (opens its panel), or pass null to collapse.",
2888
+ "descriptionKey": "ui.toolRail.agent.actions.selectTool"
2889
+ }
2890
+ ],
2891
+ "domHooks": {
2892
+ "root": {
2893
+ "attr": "data-component",
2894
+ "value": "control-room-rail",
2895
+ "description": "Marks the ControlRoomRail wrapper."
2896
+ },
2897
+ "instanceId": {
2898
+ "attr": "data-component-id",
2899
+ "sourceProp": "id",
2900
+ "description": "Sourced from the id prop. Required to address a specific rail from the agent."
2901
+ },
2902
+ "item": {
2903
+ "attr": "data-tool-id",
2904
+ "description": "Stable tool id emitted on each strip IconButton. The active icon also carries data-active set to its id."
2905
+ }
2906
+ }
2907
+ },
2355
2908
  {
2356
2909
  "kind": "component",
2357
2910
  "id": "copy-field",
@@ -2413,6 +2966,77 @@
2413
2966
  }
2414
2967
  }
2415
2968
  },
2969
+ {
2970
+ "kind": "component",
2971
+ "id": "country-select",
2972
+ "capabilities": [
2973
+ "select_single",
2974
+ "set_value"
2975
+ ],
2976
+ "state": [
2977
+ {
2978
+ "name": "value",
2979
+ "type": "string | null",
2980
+ "description": "Selected ISO 3166-1 alpha-2 country code (lowercased), or null when nothing is selected.",
2981
+ "descriptionKey": "ui.agent.countrySelect.state.value"
2982
+ }
2983
+ ],
2984
+ "actions": [
2985
+ {
2986
+ "name": "set_value",
2987
+ "safety": "write",
2988
+ "argsType": "{ value: string | null }",
2989
+ "argsSchema": {
2990
+ "type": "object",
2991
+ "properties": {
2992
+ "value": {
2993
+ "type": [
2994
+ "string",
2995
+ "null"
2996
+ ],
2997
+ "description": "ISO 3166-1 alpha-2 country code (lowercased) to select, or null to clear."
2998
+ }
2999
+ },
3000
+ "required": [
3001
+ "value"
3002
+ ]
3003
+ },
3004
+ "idempotent": true,
3005
+ "examples": [
3006
+ {
3007
+ "args": {
3008
+ "value": "it"
3009
+ },
3010
+ "note": "Select Italy."
3011
+ }
3012
+ ],
3013
+ "description": "Set the selected country by ISO alpha-2 code.",
3014
+ "descriptionKey": "ui.agent.countrySelect.actions.setValue"
3015
+ },
3016
+ {
3017
+ "name": "clear_selection",
3018
+ "safety": "destructive",
3019
+ "idempotent": true,
3020
+ "description": "Clear the selected country.",
3021
+ "descriptionKey": "ui.agent.countrySelect.actions.clearSelection"
3022
+ }
3023
+ ],
3024
+ "domHooks": {
3025
+ "root": {
3026
+ "attr": "data-component",
3027
+ "value": "country-select"
3028
+ },
3029
+ "instanceId": {
3030
+ "attr": "data-component-id",
3031
+ "sourceProp": "id",
3032
+ "description": "Sourced from the id prop."
3033
+ },
3034
+ "item": {
3035
+ "attr": "data-option-id",
3036
+ "description": "Each country option emits its alpha-2 code as data-option-id."
3037
+ }
3038
+ }
3039
+ },
2416
3040
  {
2417
3041
  "kind": "component",
2418
3042
  "id": "cycle-calculator",
@@ -3224,58 +3848,160 @@
3224
3848
  "descriptionKey": "ui.agent.emailInput.state.value"
3225
3849
  },
3226
3850
  {
3227
- "name": "isValid",
3228
- "type": "boolean",
3229
- "description": "True when the value is non-empty AND parses as a valid email per RFC 5322.",
3230
- "descriptionKey": "ui.agent.emailInput.state.isValid"
3851
+ "name": "isValid",
3852
+ "type": "boolean",
3853
+ "description": "True when the value is non-empty AND parses as a valid email per RFC 5322.",
3854
+ "descriptionKey": "ui.agent.emailInput.state.isValid"
3855
+ }
3856
+ ],
3857
+ "actions": [],
3858
+ "domHooks": {
3859
+ "root": {
3860
+ "attr": "data-component",
3861
+ "value": "email-input",
3862
+ "description": "Marks the EmailInput wrapper. The inline error element carries `role=\"alert\"` when validation fails."
3863
+ },
3864
+ "instanceId": {
3865
+ "attr": "data-component-id",
3866
+ "sourceProp": "id",
3867
+ "description": "Sourced from the id prop, when provided."
3868
+ }
3869
+ }
3870
+ },
3871
+ {
3872
+ "kind": "component",
3873
+ "id": "empty-state",
3874
+ "capabilities": [],
3875
+ "state": [],
3876
+ "actions": [],
3877
+ "domHooks": {
3878
+ "root": {
3879
+ "attr": "data-component",
3880
+ "value": "empty-state",
3881
+ "description": "Marks the EmptyState wrapper. CTAs inside are kit Buttons / Links and carry their own DOM hooks."
3882
+ }
3883
+ }
3884
+ },
3885
+ {
3886
+ "kind": "component",
3887
+ "id": "entity-summary",
3888
+ "capabilities": [
3889
+ "close"
3890
+ ],
3891
+ "state": [
3892
+ {
3893
+ "name": "sections",
3894
+ "type": "Array<{ id: string; heading: string; tone: \"default\" | \"attention\"; itemCount: number }>",
3895
+ "description": "Structural section list — ids, fixed category headings, tone and item counts. Never the entity name or the bullet items (both PHI).",
3896
+ "descriptionKey": "ui.agent.entitySummary.state.sections"
3897
+ },
3898
+ {
3899
+ "name": "generatedAtIso",
3900
+ "type": "string | undefined",
3901
+ "description": "ISO-8601 instant the brief was generated, when known.",
3902
+ "descriptionKey": "ui.agent.entitySummary.state.generatedAtIso"
3903
+ }
3904
+ ],
3905
+ "actions": [
3906
+ {
3907
+ "name": "regenerate",
3908
+ "safety": "write",
3909
+ "openWorld": true,
3910
+ "description": "Request the host to regenerate the AI brief. No-op when the regenerate affordance is not available.",
3911
+ "descriptionKey": "ui.agent.entitySummary.actions.regenerate"
3912
+ },
3913
+ {
3914
+ "name": "close",
3915
+ "safety": "read",
3916
+ "idempotent": true,
3917
+ "description": "Dismiss the summary panel. No-op when the close affordance is not available (e.g. docked in the rail).",
3918
+ "descriptionKey": "ui.agent.entitySummary.actions.close"
3231
3919
  }
3232
3920
  ],
3233
- "actions": [],
3234
3921
  "domHooks": {
3235
3922
  "root": {
3236
3923
  "attr": "data-component",
3237
- "value": "email-input",
3238
- "description": "Marks the EmailInput wrapper. The inline error element carries `role=\"alert\"` when validation fails."
3924
+ "value": "entity-summary",
3925
+ "description": "Marks the EntitySummary panel region."
3239
3926
  },
3240
3927
  "instanceId": {
3241
3928
  "attr": "data-component-id",
3242
3929
  "sourceProp": "id",
3243
- "description": "Sourced from the id prop, when provided."
3930
+ "description": "Sourced from the id prop. Required to address a specific summary panel from the agent."
3244
3931
  }
3245
3932
  }
3246
3933
  },
3247
3934
  {
3248
3935
  "kind": "component",
3249
- "id": "empty-state",
3250
- "capabilities": [],
3936
+ "id": "fetal-weight",
3937
+ "capabilities": [
3938
+ "set_value"
3939
+ ],
3251
3940
  "state": [],
3252
3941
  "actions": [],
3253
3942
  "domHooks": {
3254
3943
  "root": {
3255
3944
  "attr": "data-component",
3256
- "value": "empty-state",
3257
- "description": "Marks the EmptyState wrapper. CTAs inside are kit Buttons / Links and carry their own DOM hooks."
3945
+ "value": "fetal-weight",
3946
+ "description": "Marks the FetalWeight calculator (estimated fetal weight from ultrasound biometry)."
3947
+ },
3948
+ "instanceId": {
3949
+ "attr": "data-component-id",
3950
+ "sourceProp": "id",
3951
+ "description": "Sourced from the id prop. Required to address a specific calculator instance from the agent."
3258
3952
  }
3259
3953
  }
3260
3954
  },
3261
3955
  {
3262
3956
  "kind": "component",
3263
- "id": "fetal-weight",
3957
+ "id": "field-array",
3264
3958
  "capabilities": [
3265
- "set_value"
3959
+ "edit_inline"
3960
+ ],
3961
+ "state": [
3962
+ {
3963
+ "name": "count",
3964
+ "type": "number",
3965
+ "description": "Number of rows currently rendered.",
3966
+ "descriptionKey": "ui.agent.fieldArray.state.count"
3967
+ }
3968
+ ],
3969
+ "actions": [
3970
+ {
3971
+ "name": "add",
3972
+ "safety": "write",
3973
+ "description": "Append a new row.",
3974
+ "descriptionKey": "ui.agent.fieldArray.actions.add"
3975
+ },
3976
+ {
3977
+ "name": "remove",
3978
+ "safety": "destructive",
3979
+ "argsType": "{ index: number }",
3980
+ "argsSchema": {
3981
+ "type": "object",
3982
+ "properties": {
3983
+ "index": {
3984
+ "type": "number"
3985
+ }
3986
+ },
3987
+ "required": [
3988
+ "index"
3989
+ ]
3990
+ },
3991
+ "description": "Remove the row at the given index.",
3992
+ "descriptionKey": "ui.agent.fieldArray.actions.remove"
3993
+ }
3266
3994
  ],
3267
- "state": [],
3268
- "actions": [],
3269
3995
  "domHooks": {
3270
3996
  "root": {
3271
3997
  "attr": "data-component",
3272
- "value": "fetal-weight",
3273
- "description": "Marks the FetalWeight calculator (estimated fetal weight from ultrasound biometry)."
3998
+ "value": "field-array",
3999
+ "description": "Marks the FieldArray fieldset."
3274
4000
  },
3275
4001
  "instanceId": {
3276
4002
  "attr": "data-component-id",
3277
4003
  "sourceProp": "id",
3278
- "description": "Sourced from the id prop. Required to address a specific calculator instance from the agent."
4004
+ "description": "Sourced from the id prop."
3279
4005
  }
3280
4006
  }
3281
4007
  },
@@ -3696,6 +4422,81 @@
3696
4422
  }
3697
4423
  }
3698
4424
  },
4425
+ {
4426
+ "kind": "component",
4427
+ "id": "iban-input",
4428
+ "capabilities": [
4429
+ "set_value"
4430
+ ],
4431
+ "state": [
4432
+ {
4433
+ "name": "value",
4434
+ "type": "string",
4435
+ "description": "Current IBAN, normalised (uppercased, [A-Z0-9], no spaces, ≤34 characters).",
4436
+ "descriptionKey": "ui.agent.ibanInput.state.value"
4437
+ },
4438
+ {
4439
+ "name": "isValid",
4440
+ "type": "boolean",
4441
+ "description": "Whether the value is a structurally complete IBAN with a passing mod-97-10 checksum.",
4442
+ "descriptionKey": "ui.agent.ibanInput.state.isValid"
4443
+ }
4444
+ ],
4445
+ "actions": [
4446
+ {
4447
+ "name": "set_value",
4448
+ "safety": "write",
4449
+ "argsType": "{ value: string }",
4450
+ "argsSchema": {
4451
+ "type": "object",
4452
+ "properties": {
4453
+ "value": {
4454
+ "type": "string"
4455
+ }
4456
+ },
4457
+ "required": [
4458
+ "value"
4459
+ ]
4460
+ },
4461
+ "idempotent": true,
4462
+ "examples": [
4463
+ {
4464
+ "args": {
4465
+ "value": "DE89370400440532013000"
4466
+ },
4467
+ "note": "A complete, checksum-valid German IBAN."
4468
+ }
4469
+ ],
4470
+ "description": "Replace the IBAN. The value is uppercased and stripped to [A-Z0-9], capped at 34 characters.",
4471
+ "descriptionKey": "ui.agent.ibanInput.actions.setValue"
4472
+ },
4473
+ {
4474
+ "name": "clear",
4475
+ "safety": "destructive",
4476
+ "idempotent": true,
4477
+ "description": "Empty the input. Loses any typed value.",
4478
+ "descriptionKey": "ui.agent.ibanInput.actions.clear"
4479
+ },
4480
+ {
4481
+ "name": "focus",
4482
+ "safety": "read",
4483
+ "description": "Move keyboard focus to the IBAN input.",
4484
+ "descriptionKey": "ui.agent.ibanInput.actions.focus"
4485
+ }
4486
+ ],
4487
+ "domHooks": {
4488
+ "root": {
4489
+ "attr": "data-component",
4490
+ "value": "iban-input",
4491
+ "description": "Marks the IbanInput wrapper."
4492
+ },
4493
+ "instanceId": {
4494
+ "attr": "data-component-id",
4495
+ "sourceProp": "id",
4496
+ "description": "Sourced from the id prop."
4497
+ }
4498
+ }
4499
+ },
3699
4500
  {
3700
4501
  "kind": "component",
3701
4502
  "id": "icon-button",
@@ -3708,19 +4509,208 @@
3708
4509
  "value": "icon-button",
3709
4510
  "description": "Marks the element as a kit IconButton. Safety is declared by the host pattern, not the button. IconButtons inherit native `id` from props, which is what agents address them by."
3710
4511
  }
3711
- }
3712
- },
3713
- {
3714
- "kind": "component",
3715
- "id": "icon-button-group",
3716
- "capabilities": [],
3717
- "state": [],
3718
- "actions": [],
4512
+ }
4513
+ },
4514
+ {
4515
+ "kind": "component",
4516
+ "id": "icon-button-group",
4517
+ "capabilities": [],
4518
+ "state": [],
4519
+ "actions": [],
4520
+ "domHooks": {
4521
+ "root": {
4522
+ "attr": "data-component",
4523
+ "value": "icon-button-group",
4524
+ "description": "Marks the IconButtonGroup wrapper. Agents target individual IconButtons inside the group via their native `id`."
4525
+ }
4526
+ }
4527
+ },
4528
+ {
4529
+ "kind": "component",
4530
+ "id": "icon-picker",
4531
+ "capabilities": [
4532
+ "pick",
4533
+ "filter",
4534
+ "open",
4535
+ "close"
4536
+ ],
4537
+ "state": [
4538
+ {
4539
+ "name": "value",
4540
+ "type": "string",
4541
+ "description": "Id of the currently selected icon, or an empty string when nothing is picked.",
4542
+ "descriptionKey": "ui.agent.iconPicker.state.value"
4543
+ },
4544
+ {
4545
+ "name": "isOpen",
4546
+ "type": "boolean",
4547
+ "description": "True when the picker popover is currently open.",
4548
+ "descriptionKey": "ui.agent.iconPicker.state.isOpen"
4549
+ },
4550
+ {
4551
+ "name": "query",
4552
+ "type": "string",
4553
+ "description": "Current search query filtering the icon grid by label.",
4554
+ "descriptionKey": "ui.agent.iconPicker.state.query"
4555
+ }
4556
+ ],
4557
+ "actions": [
4558
+ {
4559
+ "name": "set_value",
4560
+ "safety": "write",
4561
+ "argsType": "{ id: string }",
4562
+ "argsSchema": {
4563
+ "type": "object",
4564
+ "properties": {
4565
+ "id": {
4566
+ "type": "string",
4567
+ "description": "Id of an icon in the supplied `icons` set."
4568
+ }
4569
+ },
4570
+ "required": [
4571
+ "id"
4572
+ ]
4573
+ },
4574
+ "idempotent": true,
4575
+ "examples": [
4576
+ {
4577
+ "args": {
4578
+ "id": "star"
4579
+ },
4580
+ "note": "Pick the \"star\" icon."
4581
+ }
4582
+ ],
4583
+ "description": "Select the icon with the given id.",
4584
+ "descriptionKey": "ui.agent.iconPicker.actions.setValue"
4585
+ },
4586
+ {
4587
+ "name": "open",
4588
+ "safety": "read",
4589
+ "idempotent": true,
4590
+ "description": "Open the picker popover.",
4591
+ "descriptionKey": "ui.agent.iconPicker.actions.open"
4592
+ },
4593
+ {
4594
+ "name": "close",
4595
+ "safety": "read",
4596
+ "idempotent": true,
4597
+ "description": "Close the picker popover.",
4598
+ "descriptionKey": "ui.agent.iconPicker.actions.close"
4599
+ },
4600
+ {
4601
+ "name": "filter",
4602
+ "safety": "write",
4603
+ "argsType": "{ query: string }",
4604
+ "argsSchema": {
4605
+ "type": "object",
4606
+ "properties": {
4607
+ "query": {
4608
+ "type": "string",
4609
+ "description": "Case-insensitive substring matched against icon labels."
4610
+ }
4611
+ },
4612
+ "required": [
4613
+ "query"
4614
+ ]
4615
+ },
4616
+ "idempotent": true,
4617
+ "examples": [
4618
+ {
4619
+ "args": {
4620
+ "query": "star"
4621
+ },
4622
+ "note": "Show icons whose label contains \"star\"."
4623
+ }
4624
+ ],
4625
+ "description": "Filter the icon grid to labels containing the query.",
4626
+ "descriptionKey": "ui.agent.iconPicker.actions.filter"
4627
+ }
4628
+ ],
4629
+ "domHooks": {
4630
+ "root": {
4631
+ "attr": "data-component",
4632
+ "value": "icon-picker",
4633
+ "description": "Marks the IconPicker trigger button."
4634
+ },
4635
+ "instanceId": {
4636
+ "attr": "data-component-id",
4637
+ "sourceProp": "id",
4638
+ "description": "Sourced from the id prop."
4639
+ }
4640
+ }
4641
+ },
4642
+ {
4643
+ "kind": "component",
4644
+ "id": "image-cropper",
4645
+ "capabilities": [
4646
+ "range_pick"
4647
+ ],
4648
+ "state": [
4649
+ {
4650
+ "name": "crop",
4651
+ "type": "object",
4652
+ "description": "Current crop rectangle in normalised [0,1] coordinates: { x, y, width, height }.",
4653
+ "descriptionKey": "ui.agent.imageCropper.state.crop"
4654
+ }
4655
+ ],
4656
+ "actions": [
4657
+ {
4658
+ "name": "set_crop",
4659
+ "safety": "write",
4660
+ "argsType": "{ x: number; y: number; width: number; height: number }",
4661
+ "argsSchema": {
4662
+ "type": "object",
4663
+ "properties": {
4664
+ "x": {
4665
+ "type": "number",
4666
+ "minimum": 0,
4667
+ "maximum": 1
4668
+ },
4669
+ "y": {
4670
+ "type": "number",
4671
+ "minimum": 0,
4672
+ "maximum": 1
4673
+ },
4674
+ "width": {
4675
+ "type": "number",
4676
+ "minimum": 0,
4677
+ "maximum": 1
4678
+ },
4679
+ "height": {
4680
+ "type": "number",
4681
+ "minimum": 0,
4682
+ "maximum": 1
4683
+ }
4684
+ },
4685
+ "required": [
4686
+ "x",
4687
+ "y",
4688
+ "width",
4689
+ "height"
4690
+ ]
4691
+ },
4692
+ "idempotent": true,
4693
+ "description": "Set the crop rectangle (normalised [0,1]). Values are clamped to the image bounds and the minimum crop size.",
4694
+ "descriptionKey": "ui.agent.imageCropper.actions.setCrop"
4695
+ },
4696
+ {
4697
+ "name": "reset",
4698
+ "safety": "write",
4699
+ "idempotent": true,
4700
+ "description": "Reset the crop to the centred default for the current aspect.",
4701
+ "descriptionKey": "ui.agent.imageCropper.actions.reset"
4702
+ }
4703
+ ],
3719
4704
  "domHooks": {
3720
4705
  "root": {
3721
4706
  "attr": "data-component",
3722
- "value": "icon-button-group",
3723
- "description": "Marks the IconButtonGroup wrapper. Agents target individual IconButtons inside the group via their native `id`."
4707
+ "value": "image-cropper",
4708
+ "description": "Marks the ImageCropper wrapper."
4709
+ },
4710
+ "instanceId": {
4711
+ "attr": "data-component-id",
4712
+ "sourceProp": "id",
4713
+ "description": "Sourced from the id prop."
3724
4714
  }
3725
4715
  }
3726
4716
  },
@@ -4039,7 +5029,8 @@
4039
5029
  "open",
4040
5030
  "close",
4041
5031
  "select_single",
4042
- "dismiss"
5032
+ "dismiss",
5033
+ "navigate"
4043
5034
  ],
4044
5035
  "state": [
4045
5036
  {
@@ -4142,6 +5133,20 @@
4142
5133
  "idempotent": true,
4143
5134
  "description": "Request the host to dismiss / archive the message with the given id.",
4144
5135
  "descriptionKey": "ui.agent.messageTray.actions.dismiss"
5136
+ },
5137
+ {
5138
+ "name": "mark_all_read",
5139
+ "safety": "write",
5140
+ "idempotent": true,
5141
+ "description": "Request the host to mark every message as read.",
5142
+ "descriptionKey": "ui.agent.messageTray.actions.markAllRead"
5143
+ },
5144
+ {
5145
+ "name": "view_all",
5146
+ "safety": "read",
5147
+ "idempotent": true,
5148
+ "description": "Navigate to the full inbox / message list.",
5149
+ "descriptionKey": "ui.agent.messageTray.actions.viewAll"
4145
5150
  }
4146
5151
  ],
4147
5152
  "domHooks": {
@@ -4283,6 +5288,68 @@
4283
5288
  }
4284
5289
  }
4285
5290
  },
5291
+ {
5292
+ "kind": "component",
5293
+ "id": "nav-grid",
5294
+ "capabilities": [
5295
+ "navigate"
5296
+ ],
5297
+ "state": [
5298
+ {
5299
+ "name": "itemCount",
5300
+ "type": "number",
5301
+ "description": "Number of navigable tiles currently rendered in the grid.",
5302
+ "descriptionKey": "ui.agent.navGrid.state.itemCount"
5303
+ }
5304
+ ],
5305
+ "actions": [
5306
+ {
5307
+ "name": "open_item",
5308
+ "safety": "write",
5309
+ "argsType": "{ id: string }",
5310
+ "argsSchema": {
5311
+ "type": "object",
5312
+ "properties": {
5313
+ "id": {
5314
+ "type": "string",
5315
+ "description": "Stable opaque tile id (emitted as data-nav-item-id on each tile)."
5316
+ }
5317
+ },
5318
+ "required": [
5319
+ "id"
5320
+ ]
5321
+ },
5322
+ "openWorld": false,
5323
+ "examples": [
5324
+ {
5325
+ "args": {
5326
+ "id": "billing"
5327
+ },
5328
+ "note": "Open the \"billing\" settings section."
5329
+ }
5330
+ ],
5331
+ "description": "Activate the tile with the given id (navigates or fires its select handler).",
5332
+ "descriptionKey": "ui.agent.navGrid.actions.openItem"
5333
+ }
5334
+ ],
5335
+ "domHooks": {
5336
+ "root": {
5337
+ "attr": "data-component",
5338
+ "value": "nav-grid",
5339
+ "description": "Marks the NavGrid nav landmark."
5340
+ },
5341
+ "instanceId": {
5342
+ "attr": "data-component-id",
5343
+ "sourceProp": "id",
5344
+ "description": "Sourced from the id prop. Required to address a specific grid from the agent."
5345
+ },
5346
+ "item": {
5347
+ "attr": "data-nav-item-id",
5348
+ "sourceProp": "item id",
5349
+ "description": "Stable opaque id of a tile, sourced from each item.id. open_item targets this attribute."
5350
+ }
5351
+ }
5352
+ },
4286
5353
  {
4287
5354
  "kind": "component",
4288
5355
  "id": "navigation-menu",
@@ -4380,6 +5447,113 @@
4380
5447
  }
4381
5448
  }
4382
5449
  },
5450
+ {
5451
+ "kind": "component",
5452
+ "id": "notes-panel",
5453
+ "capabilities": [
5454
+ "submit"
5455
+ ],
5456
+ "state": [
5457
+ {
5458
+ "name": "notes",
5459
+ "type": "Array<{ id?: string; pinned: boolean; flagged: boolean; clinical: boolean }>",
5460
+ "description": "Timeline note ids + pinned / flagged / clinical flags. Never the note body or author (both PHI).",
5461
+ "descriptionKey": "ui.agent.notesPanel.state.notes"
5462
+ },
5463
+ {
5464
+ "name": "canAddClinical",
5465
+ "type": "boolean",
5466
+ "description": "Whether the current user may write clinical notes (the practice_add_clinical_note permission gate).",
5467
+ "descriptionKey": "ui.agent.notesPanel.state.canAddClinical"
5468
+ }
5469
+ ],
5470
+ "actions": [
5471
+ {
5472
+ "name": "add_note",
5473
+ "safety": "phi",
5474
+ "argsType": "{ content: string; clinical: boolean }",
5475
+ "argsSchema": {
5476
+ "type": "object",
5477
+ "properties": {
5478
+ "content": {
5479
+ "type": "string",
5480
+ "description": "Note body. Rich HTML for the rich composer, else plain text."
5481
+ },
5482
+ "clinical": {
5483
+ "type": "boolean",
5484
+ "description": "Whether the note is clinical. Requires the clinical-note permission; the submission is dropped when the gate is closed."
5485
+ }
5486
+ },
5487
+ "required": [
5488
+ "content",
5489
+ "clinical"
5490
+ ]
5491
+ },
5492
+ "openWorld": true,
5493
+ "examples": [
5494
+ {
5495
+ "args": {
5496
+ "content": "Patient reported improvement.",
5497
+ "clinical": true
5498
+ },
5499
+ "note": "Add a clinical note."
5500
+ }
5501
+ ],
5502
+ "description": "Compose and commit a new note. A clinical note requires the clinical-note permission (read canAddClinical first).",
5503
+ "descriptionKey": "ui.agent.notesPanel.actions.addNote"
5504
+ },
5505
+ {
5506
+ "name": "toggle_pin",
5507
+ "safety": "write",
5508
+ "argsType": "{ id: string }",
5509
+ "argsSchema": {
5510
+ "type": "object",
5511
+ "properties": {
5512
+ "id": {
5513
+ "type": "string"
5514
+ }
5515
+ },
5516
+ "required": [
5517
+ "id"
5518
+ ]
5519
+ },
5520
+ "idempotent": false,
5521
+ "description": "Toggle the pinned state of the note with the given id.",
5522
+ "descriptionKey": "ui.agent.notesPanel.actions.togglePin"
5523
+ },
5524
+ {
5525
+ "name": "toggle_flag",
5526
+ "safety": "write",
5527
+ "argsType": "{ id: string }",
5528
+ "argsSchema": {
5529
+ "type": "object",
5530
+ "properties": {
5531
+ "id": {
5532
+ "type": "string"
5533
+ }
5534
+ },
5535
+ "required": [
5536
+ "id"
5537
+ ]
5538
+ },
5539
+ "idempotent": false,
5540
+ "description": "Toggle the flagged state of the note with the given id.",
5541
+ "descriptionKey": "ui.agent.notesPanel.actions.toggleFlag"
5542
+ }
5543
+ ],
5544
+ "domHooks": {
5545
+ "root": {
5546
+ "attr": "data-component",
5547
+ "value": "notes-panel",
5548
+ "description": "Marks the NotesPanel region."
5549
+ },
5550
+ "instanceId": {
5551
+ "attr": "data-component-id",
5552
+ "sourceProp": "id",
5553
+ "description": "Sourced from the id prop. Required to address a specific notes panel from the agent."
5554
+ }
5555
+ }
5556
+ },
4383
5557
  {
4384
5558
  "kind": "component",
4385
5559
  "id": "notification-card",
@@ -4408,7 +5582,8 @@
4408
5582
  "open",
4409
5583
  "close",
4410
5584
  "select_single",
4411
- "dismiss"
5585
+ "dismiss",
5586
+ "navigate"
4412
5587
  ],
4413
5588
  "state": [
4414
5589
  {
@@ -4531,6 +5706,20 @@
4531
5706
  ],
4532
5707
  "description": "Request the host to dismiss the notification with the given id.",
4533
5708
  "descriptionKey": "ui.agent.notificationTray.actions.dismiss"
5709
+ },
5710
+ {
5711
+ "name": "mark_all_read",
5712
+ "safety": "write",
5713
+ "idempotent": true,
5714
+ "description": "Request the host to mark every notification as read.",
5715
+ "descriptionKey": "ui.agent.notificationTray.actions.markAllRead"
5716
+ },
5717
+ {
5718
+ "name": "view_all",
5719
+ "safety": "read",
5720
+ "idempotent": true,
5721
+ "description": "Navigate to the full notification list.",
5722
+ "descriptionKey": "ui.agent.notificationTray.actions.viewAll"
4534
5723
  }
4535
5724
  ],
4536
5725
  "domHooks": {
@@ -4819,6 +6008,20 @@
4819
6008
  }
4820
6009
  }
4821
6010
  },
6011
+ {
6012
+ "kind": "component",
6013
+ "id": "panel-header",
6014
+ "capabilities": [],
6015
+ "state": [],
6016
+ "actions": [],
6017
+ "domHooks": {
6018
+ "root": {
6019
+ "attr": "data-component",
6020
+ "value": "panel-header",
6021
+ "description": "Marks the element as a kit PanelHeader."
6022
+ }
6023
+ }
6024
+ },
4822
6025
  {
4823
6026
  "kind": "component",
4824
6027
  "id": "password-input",
@@ -4877,26 +6080,159 @@
4877
6080
  "name": "focus",
4878
6081
  "safety": "read",
4879
6082
  "idempotent": true,
4880
- "description": "Move keyboard focus to the input.",
4881
- "descriptionKey": "ui.agent.passwordInput.actions.focus"
6083
+ "description": "Move keyboard focus to the input.",
6084
+ "descriptionKey": "ui.agent.passwordInput.actions.focus"
6085
+ },
6086
+ {
6087
+ "name": "toggle_visibility",
6088
+ "safety": "read",
6089
+ "description": "Toggle between masked and plain-text display.",
6090
+ "descriptionKey": "ui.agent.passwordInput.actions.toggleVisibility"
6091
+ }
6092
+ ],
6093
+ "domHooks": {
6094
+ "root": {
6095
+ "attr": "data-component",
6096
+ "value": "password-input",
6097
+ "description": "Marks the PasswordInput wrapper."
6098
+ },
6099
+ "instanceId": {
6100
+ "attr": "data-component-id",
6101
+ "sourceProp": "id",
6102
+ "description": "Sourced from the id prop."
6103
+ }
6104
+ }
6105
+ },
6106
+ {
6107
+ "kind": "component",
6108
+ "id": "patient-details",
6109
+ "capabilities": [
6110
+ "view_change",
6111
+ "set_value"
6112
+ ],
6113
+ "state": [
6114
+ {
6115
+ "name": "visibleFieldOrder",
6116
+ "type": "string[]",
6117
+ "description": "Ordered list of visible field KEYS (e.g. \"fiscalCode\"). Never a field value.",
6118
+ "descriptionKey": "ui.agent.patientDetails.state.visibleFieldOrder"
6119
+ },
6120
+ {
6121
+ "name": "patientId",
6122
+ "type": "string | undefined",
6123
+ "description": "Opaque patient id the panel is bound to. No patient-identifiable data.",
6124
+ "descriptionKey": "ui.agent.patientDetails.state.patientId"
6125
+ }
6126
+ ],
6127
+ "actions": [
6128
+ {
6129
+ "name": "set_visible_fields",
6130
+ "safety": "write",
6131
+ "argsType": "{ fieldIds: string[] }",
6132
+ "argsSchema": {
6133
+ "type": "object",
6134
+ "properties": {
6135
+ "fieldIds": {
6136
+ "type": "array",
6137
+ "items": {
6138
+ "type": "string"
6139
+ }
6140
+ }
6141
+ },
6142
+ "required": [
6143
+ "fieldIds"
6144
+ ]
6145
+ },
6146
+ "idempotent": true,
6147
+ "examples": [
6148
+ {
6149
+ "args": {
6150
+ "fieldIds": [
6151
+ "lastName",
6152
+ "firstName",
6153
+ "phone",
6154
+ "email"
6155
+ ]
6156
+ },
6157
+ "note": "Show only name + contact fields."
6158
+ }
6159
+ ],
6160
+ "description": "Set which fields are visible (and their order). Unknown ids are ignored.",
6161
+ "descriptionKey": "ui.agent.patientDetails.actions.setVisibleFields"
6162
+ },
6163
+ {
6164
+ "name": "set_field_order",
6165
+ "safety": "write",
6166
+ "argsType": "{ orderedIds: string[] }",
6167
+ "argsSchema": {
6168
+ "type": "object",
6169
+ "properties": {
6170
+ "orderedIds": {
6171
+ "type": "array",
6172
+ "items": {
6173
+ "type": "string"
6174
+ }
6175
+ }
6176
+ },
6177
+ "required": [
6178
+ "orderedIds"
6179
+ ]
6180
+ },
6181
+ "idempotent": true,
6182
+ "description": "Reorder the visible fields. Order within a section is honoured; sections stay fixed.",
6183
+ "descriptionKey": "ui.agent.patientDetails.actions.setFieldOrder"
4882
6184
  },
4883
6185
  {
4884
- "name": "toggle_visibility",
4885
- "safety": "read",
4886
- "description": "Toggle between masked and plain-text display.",
4887
- "descriptionKey": "ui.agent.passwordInput.actions.toggleVisibility"
6186
+ "name": "update_field",
6187
+ "safety": "phi",
6188
+ "argsType": "{ fieldId: string; value: unknown }",
6189
+ "argsSchema": {
6190
+ "type": "object",
6191
+ "properties": {
6192
+ "fieldId": {
6193
+ "type": "string"
6194
+ },
6195
+ "value": {}
6196
+ },
6197
+ "required": [
6198
+ "fieldId",
6199
+ "value"
6200
+ ]
6201
+ },
6202
+ "idempotent": true,
6203
+ "openWorld": true,
6204
+ "errors": [
6205
+ "no-save-handler",
6206
+ "validation-failed",
6207
+ "permission-denied"
6208
+ ],
6209
+ "examples": [
6210
+ {
6211
+ "args": {
6212
+ "fieldId": "job",
6213
+ "value": "Architect"
6214
+ },
6215
+ "note": "Update the patient’s occupation."
6216
+ }
6217
+ ],
6218
+ "description": "Write a patient field value via the consumer's audited save path. Subject to the same permissions and validation as a human edit.",
6219
+ "descriptionKey": "ui.agent.patientDetails.actions.updateField"
4888
6220
  }
4889
6221
  ],
4890
6222
  "domHooks": {
4891
6223
  "root": {
4892
6224
  "attr": "data-component",
4893
- "value": "password-input",
4894
- "description": "Marks the PasswordInput wrapper."
6225
+ "value": "patient-details",
6226
+ "description": "Marks the PatientDetails root region."
4895
6227
  },
4896
6228
  "instanceId": {
4897
6229
  "attr": "data-component-id",
4898
6230
  "sourceProp": "id",
4899
- "description": "Sourced from the id prop."
6231
+ "description": "Sourced from the id prop. Addresses a specific panel."
6232
+ },
6233
+ "item": {
6234
+ "attr": "data-field-id",
6235
+ "description": "Stable field KEY on each row. Never the field value (no PHI in the DOM hook)."
4900
6236
  }
4901
6237
  }
4902
6238
  },
@@ -5237,6 +6573,75 @@
5237
6573
  }
5238
6574
  }
5239
6575
  },
6576
+ {
6577
+ "kind": "component",
6578
+ "id": "permission-matrix",
6579
+ "capabilities": [
6580
+ "select_multiple"
6581
+ ],
6582
+ "state": [
6583
+ {
6584
+ "name": "selection",
6585
+ "type": "string[]",
6586
+ "description": "Ids of currently-granted editable permissions. Locked owner permissions are excluded.",
6587
+ "descriptionKey": "ui.agent.permissionMatrix.state.selection"
6588
+ }
6589
+ ],
6590
+ "actions": [
6591
+ {
6592
+ "name": "set_selection",
6593
+ "safety": "write",
6594
+ "argsType": "{ values: string[] }",
6595
+ "argsSchema": {
6596
+ "type": "object",
6597
+ "properties": {
6598
+ "values": {
6599
+ "type": "array",
6600
+ "items": {
6601
+ "type": "string"
6602
+ }
6603
+ }
6604
+ },
6605
+ "required": [
6606
+ "values"
6607
+ ]
6608
+ },
6609
+ "idempotent": true,
6610
+ "examples": [
6611
+ {
6612
+ "args": {
6613
+ "values": [
6614
+ "patients.view",
6615
+ "billing.view"
6616
+ ]
6617
+ },
6618
+ "note": "Grant exactly the view permissions for patients and billing."
6619
+ }
6620
+ ],
6621
+ "description": "Replace the granted permissions with the given ids. Locked and unknown ids are ignored.",
6622
+ "descriptionKey": "ui.agent.permissionMatrix.actions.setSelection"
6623
+ },
6624
+ {
6625
+ "name": "clear",
6626
+ "safety": "destructive",
6627
+ "idempotent": true,
6628
+ "description": "Revoke every editable permission. Locked owner permissions are unaffected.",
6629
+ "descriptionKey": "ui.agent.permissionMatrix.actions.clear"
6630
+ }
6631
+ ],
6632
+ "domHooks": {
6633
+ "root": {
6634
+ "attr": "data-component",
6635
+ "value": "permission-matrix",
6636
+ "description": "Marks the PermissionMatrix root group."
6637
+ },
6638
+ "instanceId": {
6639
+ "attr": "data-component-id",
6640
+ "sourceProp": "id",
6641
+ "description": "Sourced from the id prop."
6642
+ }
6643
+ }
6644
+ },
5240
6645
  {
5241
6646
  "kind": "component",
5242
6647
  "id": "phone-input",
@@ -5253,8 +6658,187 @@
5253
6658
  {
5254
6659
  "name": "isEmpty",
5255
6660
  "type": "boolean",
5256
- "description": "Whether the input has no value.",
5257
- "descriptionKey": "ui.agent.phoneInput.state.isEmpty"
6661
+ "description": "Whether the input has no value.",
6662
+ "descriptionKey": "ui.agent.phoneInput.state.isEmpty"
6663
+ }
6664
+ ],
6665
+ "actions": [
6666
+ {
6667
+ "name": "set_value",
6668
+ "safety": "write",
6669
+ "argsType": "{ value: string }",
6670
+ "argsSchema": {
6671
+ "type": "object",
6672
+ "properties": {
6673
+ "value": {
6674
+ "type": "string",
6675
+ "description": "Phone number in E.164 or national format; the parser infers the country."
6676
+ }
6677
+ },
6678
+ "required": [
6679
+ "value"
6680
+ ]
6681
+ },
6682
+ "idempotent": true,
6683
+ "examples": [
6684
+ {
6685
+ "args": {
6686
+ "value": "+393331234567"
6687
+ },
6688
+ "note": "Set an Italian mobile."
6689
+ }
6690
+ ],
6691
+ "description": "Replace the phone number (E.164 or national format; parser will infer country).",
6692
+ "descriptionKey": "ui.agent.phoneInput.actions.setValue"
6693
+ },
6694
+ {
6695
+ "name": "clear",
6696
+ "safety": "destructive",
6697
+ "idempotent": true,
6698
+ "description": "Empty the input. Loses any typed value.",
6699
+ "descriptionKey": "ui.agent.phoneInput.actions.clear"
6700
+ },
6701
+ {
6702
+ "name": "focus",
6703
+ "safety": "read",
6704
+ "description": "Move keyboard focus to the phone-number input.",
6705
+ "descriptionKey": "ui.agent.phoneInput.actions.focus"
6706
+ }
6707
+ ],
6708
+ "domHooks": {
6709
+ "root": {
6710
+ "attr": "data-component",
6711
+ "value": "phone-input",
6712
+ "description": "Marks the PhoneInput wrapper."
6713
+ },
6714
+ "instanceId": {
6715
+ "attr": "data-component-id",
6716
+ "sourceProp": "id",
6717
+ "description": "Sourced from the id prop."
6718
+ }
6719
+ }
6720
+ },
6721
+ {
6722
+ "kind": "component",
6723
+ "id": "popover",
6724
+ "capabilities": [
6725
+ "open",
6726
+ "close"
6727
+ ],
6728
+ "state": [
6729
+ {
6730
+ "name": "isOpen",
6731
+ "type": "boolean",
6732
+ "description": "True when the popover is currently open.",
6733
+ "descriptionKey": "ui.agent.popover.state.isOpen"
6734
+ }
6735
+ ],
6736
+ "actions": [
6737
+ {
6738
+ "name": "open",
6739
+ "safety": "read",
6740
+ "idempotent": true,
6741
+ "description": "Open the popover.",
6742
+ "descriptionKey": "ui.agent.popover.actions.open"
6743
+ },
6744
+ {
6745
+ "name": "close",
6746
+ "safety": "read",
6747
+ "idempotent": true,
6748
+ "description": "Close the popover.",
6749
+ "descriptionKey": "ui.agent.popover.actions.close"
6750
+ }
6751
+ ],
6752
+ "domHooks": {
6753
+ "root": {
6754
+ "attr": "data-component",
6755
+ "value": "popover"
6756
+ },
6757
+ "instanceId": {
6758
+ "attr": "data-component-id",
6759
+ "sourceProp": "id",
6760
+ "description": "Sourced from the id prop on Popover.Root."
6761
+ }
6762
+ }
6763
+ },
6764
+ {
6765
+ "kind": "component",
6766
+ "id": "position-grid",
6767
+ "capabilities": [
6768
+ "select_single"
6769
+ ],
6770
+ "state": [
6771
+ {
6772
+ "name": "value",
6773
+ "type": "string",
6774
+ "description": "Currently selected position value (e.g. \"top-start\"), or empty string when none.",
6775
+ "descriptionKey": "ui.agent.positionGrid.state.value"
6776
+ }
6777
+ ],
6778
+ "actions": [
6779
+ {
6780
+ "name": "set_value",
6781
+ "safety": "write",
6782
+ "argsType": "{ value: string }",
6783
+ "argsSchema": {
6784
+ "type": "object",
6785
+ "properties": {
6786
+ "value": {
6787
+ "type": "string"
6788
+ }
6789
+ },
6790
+ "required": [
6791
+ "value"
6792
+ ]
6793
+ },
6794
+ "idempotent": true,
6795
+ "examples": [
6796
+ {
6797
+ "args": {
6798
+ "value": "center"
6799
+ },
6800
+ "note": "Selects the centre cell of the default 3×3 grid."
6801
+ }
6802
+ ],
6803
+ "description": "Select the cell with the given position value.",
6804
+ "descriptionKey": "ui.agent.positionGrid.actions.setValue"
6805
+ }
6806
+ ],
6807
+ "domHooks": {
6808
+ "root": {
6809
+ "attr": "data-component",
6810
+ "value": "position-grid",
6811
+ "description": "Marks the PositionGrid root."
6812
+ },
6813
+ "instanceId": {
6814
+ "attr": "data-component-id",
6815
+ "sourceProp": "id",
6816
+ "description": "Sourced from the id prop."
6817
+ },
6818
+ "item": {
6819
+ "attr": "data-option-id",
6820
+ "description": "Position value emitted on each rendered cell."
6821
+ }
6822
+ }
6823
+ },
6824
+ {
6825
+ "kind": "component",
6826
+ "id": "postal-code-input",
6827
+ "capabilities": [
6828
+ "set_value"
6829
+ ],
6830
+ "state": [
6831
+ {
6832
+ "name": "value",
6833
+ "type": "string",
6834
+ "description": "Current postal code value.",
6835
+ "descriptionKey": "ui.agent.postalCodeInput.state.value"
6836
+ },
6837
+ {
6838
+ "name": "isEmpty",
6839
+ "type": "boolean",
6840
+ "description": "Whether the field has no value.",
6841
+ "descriptionKey": "ui.agent.postalCodeInput.state.isEmpty"
5258
6842
  }
5259
6843
  ],
5260
6844
  "actions": [
@@ -5266,8 +6850,7 @@
5266
6850
  "type": "object",
5267
6851
  "properties": {
5268
6852
  "value": {
5269
- "type": "string",
5270
- "description": "Phone number in E.164 or national format; the parser infers the country."
6853
+ "type": "string"
5271
6854
  }
5272
6855
  },
5273
6856
  "required": [
@@ -5278,33 +6861,26 @@
5278
6861
  "examples": [
5279
6862
  {
5280
6863
  "args": {
5281
- "value": "+393331234567"
6864
+ "value": "20121"
5282
6865
  },
5283
- "note": "Set an Italian mobile."
6866
+ "note": "An Italian CAP."
5284
6867
  }
5285
6868
  ],
5286
- "description": "Replace the phone number (E.164 or national format; parser will infer country).",
5287
- "descriptionKey": "ui.agent.phoneInput.actions.setValue"
6869
+ "description": "Replace the postal code value.",
6870
+ "descriptionKey": "ui.agent.postalCodeInput.actions.setValue"
5288
6871
  },
5289
6872
  {
5290
6873
  "name": "clear",
5291
6874
  "safety": "destructive",
5292
6875
  "idempotent": true,
5293
- "description": "Empty the input. Loses any typed value.",
5294
- "descriptionKey": "ui.agent.phoneInput.actions.clear"
5295
- },
5296
- {
5297
- "name": "focus",
5298
- "safety": "read",
5299
- "description": "Move keyboard focus to the phone-number input.",
5300
- "descriptionKey": "ui.agent.phoneInput.actions.focus"
6876
+ "description": "Empty the field. Loses any typed value.",
6877
+ "descriptionKey": "ui.agent.postalCodeInput.actions.clear"
5301
6878
  }
5302
6879
  ],
5303
6880
  "domHooks": {
5304
6881
  "root": {
5305
6882
  "attr": "data-component",
5306
- "value": "phone-input",
5307
- "description": "Marks the PhoneInput wrapper."
6883
+ "value": "postal-code-input"
5308
6884
  },
5309
6885
  "instanceId": {
5310
6886
  "attr": "data-component-id",
@@ -5313,49 +6889,6 @@
5313
6889
  }
5314
6890
  }
5315
6891
  },
5316
- {
5317
- "kind": "component",
5318
- "id": "popover",
5319
- "capabilities": [
5320
- "open",
5321
- "close"
5322
- ],
5323
- "state": [
5324
- {
5325
- "name": "isOpen",
5326
- "type": "boolean",
5327
- "description": "True when the popover is currently open.",
5328
- "descriptionKey": "ui.agent.popover.state.isOpen"
5329
- }
5330
- ],
5331
- "actions": [
5332
- {
5333
- "name": "open",
5334
- "safety": "read",
5335
- "idempotent": true,
5336
- "description": "Open the popover.",
5337
- "descriptionKey": "ui.agent.popover.actions.open"
5338
- },
5339
- {
5340
- "name": "close",
5341
- "safety": "read",
5342
- "idempotent": true,
5343
- "description": "Close the popover.",
5344
- "descriptionKey": "ui.agent.popover.actions.close"
5345
- }
5346
- ],
5347
- "domHooks": {
5348
- "root": {
5349
- "attr": "data-component",
5350
- "value": "popover"
5351
- },
5352
- "instanceId": {
5353
- "attr": "data-component-id",
5354
- "sourceProp": "id",
5355
- "description": "Sourced from the id prop on Popover.Root."
5356
- }
5357
- }
5358
- },
5359
6892
  {
5360
6893
  "kind": "component",
5361
6894
  "id": "practice-results",
@@ -5672,6 +7205,77 @@
5672
7205
  }
5673
7206
  }
5674
7207
  },
7208
+ {
7209
+ "kind": "component",
7210
+ "id": "province-select",
7211
+ "capabilities": [
7212
+ "select_single",
7213
+ "set_value"
7214
+ ],
7215
+ "state": [
7216
+ {
7217
+ "name": "value",
7218
+ "type": "string | null",
7219
+ "description": "Selected province code (UPPERCASED sigla for Italy), or null when nothing is selected.",
7220
+ "descriptionKey": "ui.agent.provinceSelect.state.value"
7221
+ }
7222
+ ],
7223
+ "actions": [
7224
+ {
7225
+ "name": "set_value",
7226
+ "safety": "write",
7227
+ "argsType": "{ value: string | null }",
7228
+ "argsSchema": {
7229
+ "type": "object",
7230
+ "properties": {
7231
+ "value": {
7232
+ "type": [
7233
+ "string",
7234
+ "null"
7235
+ ],
7236
+ "description": "Province code to select (UPPERCASED), or null to clear."
7237
+ }
7238
+ },
7239
+ "required": [
7240
+ "value"
7241
+ ]
7242
+ },
7243
+ "idempotent": true,
7244
+ "examples": [
7245
+ {
7246
+ "args": {
7247
+ "value": "MI"
7248
+ },
7249
+ "note": "Select Milano."
7250
+ }
7251
+ ],
7252
+ "description": "Set the selected province by code.",
7253
+ "descriptionKey": "ui.agent.provinceSelect.actions.setValue"
7254
+ },
7255
+ {
7256
+ "name": "clear_selection",
7257
+ "safety": "destructive",
7258
+ "idempotent": true,
7259
+ "description": "Clear the selected province.",
7260
+ "descriptionKey": "ui.agent.provinceSelect.actions.clearSelection"
7261
+ }
7262
+ ],
7263
+ "domHooks": {
7264
+ "root": {
7265
+ "attr": "data-component",
7266
+ "value": "province-select"
7267
+ },
7268
+ "instanceId": {
7269
+ "attr": "data-component-id",
7270
+ "sourceProp": "id",
7271
+ "description": "Sourced from the id prop."
7272
+ },
7273
+ "item": {
7274
+ "attr": "data-option-id",
7275
+ "description": "Each province option emits its code as data-option-id."
7276
+ }
7277
+ }
7278
+ },
5675
7279
  {
5676
7280
  "kind": "component",
5677
7281
  "id": "public-footer",
@@ -5827,6 +7431,65 @@
5827
7431
  }
5828
7432
  }
5829
7433
  },
7434
+ {
7435
+ "kind": "component",
7436
+ "id": "radiograph-panel",
7437
+ "capabilities": [
7438
+ "pick",
7439
+ "view_change"
7440
+ ],
7441
+ "state": [
7442
+ {
7443
+ "name": "radiographs",
7444
+ "type": "Array<{ id: string; kind?: string }>",
7445
+ "description": "Structural references (id + kind) to the films shown for the selected tooth.",
7446
+ "descriptionKey": "ui.agent.radiographPanel.state.radiographs"
7447
+ }
7448
+ ],
7449
+ "actions": [
7450
+ {
7451
+ "name": "view_radiograph",
7452
+ "safety": "read",
7453
+ "argsType": "{ id: string }",
7454
+ "argsSchema": {
7455
+ "type": "object",
7456
+ "properties": {
7457
+ "id": {
7458
+ "type": "string"
7459
+ }
7460
+ },
7461
+ "required": [
7462
+ "id"
7463
+ ]
7464
+ },
7465
+ "idempotent": true,
7466
+ "description": "Open a film in the fullscreen viewer by id.",
7467
+ "descriptionKey": "ui.agent.radiographPanel.actions.viewRadiograph"
7468
+ },
7469
+ {
7470
+ "name": "close_viewer",
7471
+ "safety": "read",
7472
+ "idempotent": true,
7473
+ "description": "Close the fullscreen radiograph viewer.",
7474
+ "descriptionKey": "ui.agent.radiographPanel.actions.closeViewer"
7475
+ }
7476
+ ],
7477
+ "domHooks": {
7478
+ "root": {
7479
+ "attr": "data-component",
7480
+ "value": "radiograph-panel"
7481
+ },
7482
+ "instanceId": {
7483
+ "attr": "data-component-id",
7484
+ "sourceProp": "id",
7485
+ "description": "Sourced from the id prop."
7486
+ },
7487
+ "item": {
7488
+ "attr": "data-radiograph-id",
7489
+ "description": "Each film row (`<li>`) carries its radiograph id as `data-radiograph-id`. The panel root additionally carries the selected tooth's FDI id as `data-tooth`."
7490
+ }
7491
+ }
7492
+ },
5830
7493
  {
5831
7494
  "kind": "component",
5832
7495
  "id": "rating",
@@ -7352,8 +9015,102 @@
7352
9015
  {
7353
9016
  "name": "items",
7354
9017
  "type": "Array<{ id: string; status: string }>",
7355
- "description": "Currently-displayed tasks. Ids + status only — never task title / patient.",
7356
- "descriptionKey": "ui.agent.taskTray.state.items"
9018
+ "description": "Currently-displayed tasks. Ids + status only — never task title / patient.",
9019
+ "descriptionKey": "ui.agent.taskTray.state.items"
9020
+ }
9021
+ ],
9022
+ "actions": [
9023
+ {
9024
+ "name": "select_item",
9025
+ "safety": "read",
9026
+ "argsType": "{ id: string }",
9027
+ "argsSchema": {
9028
+ "type": "object",
9029
+ "properties": {
9030
+ "id": {
9031
+ "type": "string"
9032
+ }
9033
+ },
9034
+ "required": [
9035
+ "id"
9036
+ ]
9037
+ },
9038
+ "idempotent": true,
9039
+ "description": "Activate the task with the given id.",
9040
+ "descriptionKey": "ui.agent.taskTray.actions.selectItem"
9041
+ },
9042
+ {
9043
+ "name": "toggle_done",
9044
+ "safety": "write",
9045
+ "argsType": "{ id: string }",
9046
+ "argsSchema": {
9047
+ "type": "object",
9048
+ "properties": {
9049
+ "id": {
9050
+ "type": "string"
9051
+ }
9052
+ },
9053
+ "required": [
9054
+ "id"
9055
+ ]
9056
+ },
9057
+ "description": "Request the host to toggle the done state of a task.",
9058
+ "descriptionKey": "ui.agent.taskTray.actions.toggleDone"
9059
+ },
9060
+ {
9061
+ "name": "dismiss",
9062
+ "safety": "destructive",
9063
+ "argsType": "{ id: string }",
9064
+ "argsSchema": {
9065
+ "type": "object",
9066
+ "properties": {
9067
+ "id": {
9068
+ "type": "string"
9069
+ }
9070
+ },
9071
+ "required": [
9072
+ "id"
9073
+ ]
9074
+ },
9075
+ "idempotent": true,
9076
+ "description": "Request the host to dismiss / remove the task with the given id.",
9077
+ "descriptionKey": "ui.agent.taskTray.actions.dismiss"
9078
+ }
9079
+ ],
9080
+ "domHooks": {
9081
+ "root": {
9082
+ "attr": "data-component",
9083
+ "value": "task-tray",
9084
+ "description": "Marks the TaskTray wrapper."
9085
+ },
9086
+ "instanceId": {
9087
+ "attr": "data-component-id",
9088
+ "sourceProp": "id",
9089
+ "description": "Sourced from the id prop. Required to address a specific tray from the agent."
9090
+ },
9091
+ "item": {
9092
+ "attr": "data-task-id",
9093
+ "description": "Stable task id emitted on each rendered TaskCard inside the tray."
9094
+ }
9095
+ }
9096
+ },
9097
+ {
9098
+ "kind": "component",
9099
+ "id": "tasks-panel",
9100
+ "capabilities": [
9101
+ "pick",
9102
+ "dismiss",
9103
+ "scroll",
9104
+ "filter",
9105
+ "view_change",
9106
+ "paginate"
9107
+ ],
9108
+ "state": [
9109
+ {
9110
+ "name": "items",
9111
+ "type": "Array<{ id: string; status: string }>",
9112
+ "description": "Currently-rendered tasks. Ids + status only — never task note / patient.",
9113
+ "descriptionKey": "ui.agent.tasksPanel.state.items"
7357
9114
  }
7358
9115
  ],
7359
9116
  "actions": [
@@ -7374,7 +9131,7 @@
7374
9131
  },
7375
9132
  "idempotent": true,
7376
9133
  "description": "Activate the task with the given id.",
7377
- "descriptionKey": "ui.agent.taskTray.actions.selectItem"
9134
+ "descriptionKey": "ui.agent.tasksPanel.actions.selectItem"
7378
9135
  },
7379
9136
  {
7380
9137
  "name": "toggle_done",
@@ -7392,7 +9149,7 @@
7392
9149
  ]
7393
9150
  },
7394
9151
  "description": "Request the host to toggle the done state of a task.",
7395
- "descriptionKey": "ui.agent.taskTray.actions.toggleDone"
9152
+ "descriptionKey": "ui.agent.tasksPanel.actions.toggleDone"
7396
9153
  },
7397
9154
  {
7398
9155
  "name": "dismiss",
@@ -7411,23 +9168,96 @@
7411
9168
  },
7412
9169
  "idempotent": true,
7413
9170
  "description": "Request the host to dismiss / remove the task with the given id.",
7414
- "descriptionKey": "ui.agent.taskTray.actions.dismiss"
9171
+ "descriptionKey": "ui.agent.tasksPanel.actions.dismiss"
9172
+ },
9173
+ {
9174
+ "name": "jump_to_overdue",
9175
+ "safety": "read",
9176
+ "idempotent": true,
9177
+ "description": "Re-anchor the panel scroll on the overdue tasks.",
9178
+ "descriptionKey": "ui.agent.tasksPanel.actions.jumpToOverdue"
9179
+ },
9180
+ {
9181
+ "name": "set_filter",
9182
+ "safety": "read",
9183
+ "argsType": "{ status?: 'todo' | 'done' | 'all'; type?: string | null; assignee?: string | null; overdueOnly?: boolean }",
9184
+ "argsSchema": {
9185
+ "type": "object",
9186
+ "properties": {
9187
+ "status": {
9188
+ "type": "string",
9189
+ "enum": [
9190
+ "todo",
9191
+ "done",
9192
+ "all"
9193
+ ]
9194
+ },
9195
+ "type": {
9196
+ "type": [
9197
+ "string",
9198
+ "null"
9199
+ ]
9200
+ },
9201
+ "assignee": {
9202
+ "type": [
9203
+ "string",
9204
+ "null"
9205
+ ]
9206
+ },
9207
+ "overdueOnly": {
9208
+ "type": "boolean"
9209
+ }
9210
+ }
9211
+ },
9212
+ "idempotent": true,
9213
+ "description": "Set the task filters (status segment, type, assignee, overdue-only). Omitted keys are left unchanged.",
9214
+ "descriptionKey": "ui.agent.tasksPanel.actions.setFilter"
9215
+ },
9216
+ {
9217
+ "name": "change_scope",
9218
+ "safety": "read",
9219
+ "argsType": "{ scope: 'patient' | 'mine' }",
9220
+ "argsSchema": {
9221
+ "type": "object",
9222
+ "properties": {
9223
+ "scope": {
9224
+ "type": "string",
9225
+ "enum": [
9226
+ "patient",
9227
+ "mine"
9228
+ ]
9229
+ }
9230
+ },
9231
+ "required": [
9232
+ "scope"
9233
+ ]
9234
+ },
9235
+ "idempotent": true,
9236
+ "description": "Switch the task scope segment between this patient ('patient') and the operator's own tasks ('mine'). The host re-feeds the items.",
9237
+ "descriptionKey": "ui.agent.tasksPanel.actions.changeScope"
9238
+ },
9239
+ {
9240
+ "name": "load_more",
9241
+ "safety": "read",
9242
+ "openWorld": true,
9243
+ "description": "Request the host to append the next page of tasks.",
9244
+ "descriptionKey": "ui.agent.tasksPanel.actions.loadMore"
7415
9245
  }
7416
9246
  ],
7417
9247
  "domHooks": {
7418
9248
  "root": {
7419
9249
  "attr": "data-component",
7420
- "value": "task-tray",
7421
- "description": "Marks the TaskTray wrapper."
9250
+ "value": "tasks-panel",
9251
+ "description": "Marks the TasksPanel wrapper."
7422
9252
  },
7423
9253
  "instanceId": {
7424
9254
  "attr": "data-component-id",
7425
9255
  "sourceProp": "id",
7426
- "description": "Sourced from the id prop. Required to address a specific tray from the agent."
9256
+ "description": "Sourced from the id prop. Required to address a specific panel from the agent."
7427
9257
  },
7428
9258
  "item": {
7429
9259
  "attr": "data-task-id",
7430
- "description": "Stable task id emitted on each rendered TaskCard inside the tray."
9260
+ "description": "Stable task id emitted on each rendered TaskCard inside the panel."
7431
9261
  }
7432
9262
  }
7433
9263
  },
@@ -7865,6 +9695,167 @@
7865
9695
  }
7866
9696
  }
7867
9697
  },
9698
+ {
9699
+ "kind": "component",
9700
+ "id": "token-insert-menu",
9701
+ "capabilities": [
9702
+ "open",
9703
+ "close"
9704
+ ],
9705
+ "state": [
9706
+ {
9707
+ "name": "isOpen",
9708
+ "type": "boolean",
9709
+ "description": "True when the token menu is currently open.",
9710
+ "descriptionKey": "ui.agent.tokenInsertMenu.state.isOpen"
9711
+ }
9712
+ ],
9713
+ "actions": [
9714
+ {
9715
+ "name": "open",
9716
+ "safety": "read",
9717
+ "idempotent": true,
9718
+ "description": "Open the token menu.",
9719
+ "descriptionKey": "ui.agent.tokenInsertMenu.actions.open"
9720
+ },
9721
+ {
9722
+ "name": "close",
9723
+ "safety": "read",
9724
+ "idempotent": true,
9725
+ "description": "Close the token menu.",
9726
+ "descriptionKey": "ui.agent.tokenInsertMenu.actions.close"
9727
+ },
9728
+ {
9729
+ "name": "insert",
9730
+ "safety": "write",
9731
+ "argsType": "{ token: string }",
9732
+ "argsSchema": {
9733
+ "type": "object",
9734
+ "properties": {
9735
+ "token": {
9736
+ "type": "string"
9737
+ }
9738
+ },
9739
+ "required": [
9740
+ "token"
9741
+ ]
9742
+ },
9743
+ "examples": [
9744
+ {
9745
+ "args": {
9746
+ "token": "{{patient.name}}"
9747
+ },
9748
+ "note": "Emit the patient-name placeholder for cursor insertion."
9749
+ }
9750
+ ],
9751
+ "description": "Emit a merge-token to the consumer for cursor insertion.",
9752
+ "descriptionKey": "ui.agent.tokenInsertMenu.actions.insert"
9753
+ }
9754
+ ],
9755
+ "domHooks": {
9756
+ "root": {
9757
+ "attr": "data-component",
9758
+ "value": "token-insert-menu",
9759
+ "description": "Marks the TokenInsertMenu wrapper."
9760
+ },
9761
+ "instanceId": {
9762
+ "attr": "data-component-id",
9763
+ "sourceProp": "id",
9764
+ "description": "Sourced from the id prop."
9765
+ }
9766
+ }
9767
+ },
9768
+ {
9769
+ "kind": "component",
9770
+ "id": "tool-rail",
9771
+ "capabilities": [
9772
+ "open",
9773
+ "close",
9774
+ "select_single"
9775
+ ],
9776
+ "state": [
9777
+ {
9778
+ "name": "activeToolId",
9779
+ "type": "string | null",
9780
+ "description": "Id of the tool whose panel is currently open, or null when the rail is collapsed to its strip. No panel content is ever exposed.",
9781
+ "descriptionKey": "ui.toolRail.agent.state.activeToolId"
9782
+ }
9783
+ ],
9784
+ "actions": [
9785
+ {
9786
+ "name": "open",
9787
+ "safety": "read",
9788
+ "argsType": "{ id: string }",
9789
+ "argsSchema": {
9790
+ "type": "object",
9791
+ "properties": {
9792
+ "id": {
9793
+ "type": "string"
9794
+ }
9795
+ },
9796
+ "required": [
9797
+ "id"
9798
+ ]
9799
+ },
9800
+ "idempotent": true,
9801
+ "examples": [
9802
+ {
9803
+ "args": {
9804
+ "id": "inbox"
9805
+ },
9806
+ "note": "Open the inbox tool panel."
9807
+ }
9808
+ ],
9809
+ "description": "Open the given tool's panel.",
9810
+ "descriptionKey": "ui.toolRail.agent.actions.open"
9811
+ },
9812
+ {
9813
+ "name": "close",
9814
+ "safety": "read",
9815
+ "idempotent": true,
9816
+ "description": "Collapse the rail to its strip (no active tool).",
9817
+ "descriptionKey": "ui.toolRail.agent.actions.close"
9818
+ },
9819
+ {
9820
+ "name": "select_tool",
9821
+ "safety": "read",
9822
+ "argsType": "{ id: string | null }",
9823
+ "argsSchema": {
9824
+ "type": "object",
9825
+ "properties": {
9826
+ "id": {
9827
+ "type": [
9828
+ "string",
9829
+ "null"
9830
+ ]
9831
+ }
9832
+ },
9833
+ "required": [
9834
+ "id"
9835
+ ]
9836
+ },
9837
+ "idempotent": true,
9838
+ "description": "Set the active tool by id (opens its panel), or pass null to collapse.",
9839
+ "descriptionKey": "ui.toolRail.agent.actions.selectTool"
9840
+ }
9841
+ ],
9842
+ "domHooks": {
9843
+ "root": {
9844
+ "attr": "data-component",
9845
+ "value": "tool-rail",
9846
+ "description": "Marks the ToolRail wrapper."
9847
+ },
9848
+ "instanceId": {
9849
+ "attr": "data-component-id",
9850
+ "sourceProp": "id",
9851
+ "description": "Sourced from the id prop. Required to address a specific rail from the agent."
9852
+ },
9853
+ "item": {
9854
+ "attr": "data-tool-id",
9855
+ "description": "Stable tool id emitted on each strip IconButton. The active icon also carries data-active set to its id."
9856
+ }
9857
+ }
9858
+ },
7868
9859
  {
7869
9860
  "kind": "component",
7870
9861
  "id": "tooltip",
@@ -7892,14 +9883,26 @@
7892
9883
  {
7893
9884
  "name": "chart",
7894
9885
  "type": "object",
7895
- "description": "Current dental chart — findings (and marked surfaces) keyed by FDI id.",
9886
+ "description": "Current dental chart — findings (and marked surfaces) keyed by FDI id, or by a special-element id (quadrant / sextant / arch / general) for region-spanning findings.",
7896
9887
  "descriptionKey": "ui.agent.toothScheme.state.chart"
7897
9888
  },
7898
9889
  {
7899
9890
  "name": "chartedTeeth",
7900
9891
  "type": "string[]",
7901
- "description": "FDI ids of every tooth carrying at least one finding.",
9892
+ "description": "Ids carrying at least one finding — FDI tooth ids and/or special-element ids (quadrant / sextant / arch / general).",
7902
9893
  "descriptionKey": "ui.agent.toothScheme.state.chartedTeeth"
9894
+ },
9895
+ {
9896
+ "name": "radiographs",
9897
+ "type": "Record<string, { id: string; kind?: string }[]>",
9898
+ "description": "Structural references (id + kind) to the radiographs on each tooth, keyed by FDI id. Notes, dates and image URLs are not exposed here — fetch them on demand via get_radiographs.",
9899
+ "descriptionKey": "ui.agent.toothScheme.state.radiographs"
9900
+ },
9901
+ {
9902
+ "name": "teethWithRadiographs",
9903
+ "type": "string[]",
9904
+ "description": "FDI ids of every tooth carrying at least one radiograph.",
9905
+ "descriptionKey": "ui.agent.toothScheme.state.teethWithRadiographs"
7903
9906
  }
7904
9907
  ],
7905
9908
  "actions": [
@@ -7912,7 +9915,7 @@
7912
9915
  "properties": {
7913
9916
  "id": {
7914
9917
  "type": "string",
7915
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
9918
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
7916
9919
  }
7917
9920
  },
7918
9921
  "required": [
@@ -7932,7 +9935,7 @@
7932
9935
  "properties": {
7933
9936
  "id": {
7934
9937
  "type": "string",
7935
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
9938
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
7936
9939
  }
7937
9940
  },
7938
9941
  "required": [
@@ -7994,12 +9997,92 @@
7994
9997
  "type": "array",
7995
9998
  "items": {
7996
9999
  "type": "string",
7997
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
10000
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
10001
+ }
10002
+ },
10003
+ "idempotent": true,
10004
+ "description": "List the ids carrying a given finding — FDI tooth ids and/or special-element ids (e.g. all teeth with caries).",
10005
+ "descriptionKey": "ui.agent.toothScheme.actions.teethWith"
10006
+ },
10007
+ {
10008
+ "name": "get_radiographs",
10009
+ "safety": "read",
10010
+ "argsType": "{ id: FdiId }",
10011
+ "argsSchema": {
10012
+ "type": "object",
10013
+ "properties": {
10014
+ "id": {
10015
+ "type": "string",
10016
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
10017
+ }
10018
+ },
10019
+ "required": [
10020
+ "id"
10021
+ ]
10022
+ },
10023
+ "returns": "Radiograph[]",
10024
+ "returnsSchema": {
10025
+ "type": "array",
10026
+ "items": {
10027
+ "type": "object",
10028
+ "properties": {
10029
+ "id": {
10030
+ "type": "string"
10031
+ },
10032
+ "url": {
10033
+ "type": "string"
10034
+ },
10035
+ "thumbnailUrl": {
10036
+ "type": "string"
10037
+ },
10038
+ "date": {
10039
+ "type": "string",
10040
+ "description": "ISO acquisition date (YYYY-MM-DD)."
10041
+ },
10042
+ "note": {
10043
+ "type": "string"
10044
+ },
10045
+ "kind": {
10046
+ "enum": [
10047
+ "periapical",
10048
+ "bitewing",
10049
+ "panoramic",
10050
+ "other"
10051
+ ]
10052
+ },
10053
+ "alt": {
10054
+ "type": "string"
10055
+ }
10056
+ },
10057
+ "required": [
10058
+ "id",
10059
+ "url"
10060
+ ]
7998
10061
  }
7999
10062
  },
8000
10063
  "idempotent": true,
8001
- "description": "List the FDI ids of every tooth carrying a given finding (e.g. all teeth with caries).",
8002
- "descriptionKey": "ui.agent.toothScheme.actions.teethWith"
10064
+ "description": "Read the radiographs (x-rays) attached to one tooth.",
10065
+ "descriptionKey": "ui.agent.toothScheme.actions.getRadiographs"
10066
+ },
10067
+ {
10068
+ "name": "open_radiographs",
10069
+ "safety": "read",
10070
+ "argsType": "{ id: FdiId }",
10071
+ "argsSchema": {
10072
+ "type": "object",
10073
+ "properties": {
10074
+ "id": {
10075
+ "type": "string",
10076
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
10077
+ }
10078
+ },
10079
+ "required": [
10080
+ "id"
10081
+ ]
10082
+ },
10083
+ "idempotent": true,
10084
+ "description": "Focus a tooth and open its radiograph archive (fires the host's onOpenRadiographs).",
10085
+ "descriptionKey": "ui.agent.toothScheme.actions.openRadiographs"
8003
10086
  },
8004
10087
  {
8005
10088
  "name": "set_finding",
@@ -8010,7 +10093,7 @@
8010
10093
  "properties": {
8011
10094
  "id": {
8012
10095
  "type": "string",
8013
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
10096
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
8014
10097
  },
8015
10098
  "condition": {
8016
10099
  "enum": [
@@ -8046,7 +10129,7 @@
8046
10129
  ]
8047
10130
  },
8048
10131
  "idempotent": true,
8049
- "description": "Record a finding on a tooth (crown, implant, root canal, caries, …). Optionally mark the affected surfaces for a surface finding.",
10132
+ "description": "Record a finding on a tooth or region element (crown, implant, root canal, caries, …). Optionally mark the affected surfaces for a surface finding.",
8050
10133
  "descriptionKey": "ui.agent.toothScheme.actions.setFinding"
8051
10134
  },
8052
10135
  {
@@ -8058,7 +10141,7 @@
8058
10141
  "properties": {
8059
10142
  "id": {
8060
10143
  "type": "string",
8061
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
10144
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
8062
10145
  },
8063
10146
  "condition": {
8064
10147
  "enum": [
@@ -8094,7 +10177,7 @@
8094
10177
  "properties": {
8095
10178
  "id": {
8096
10179
  "type": "string",
8097
- "description": "FDI tooth id, e.g. '11'–'48' permanent, '51'–'85' primary."
10180
+ "description": "FDI tooth id ('11'–'48' permanent, '51'–'85' primary) or a special-element id ('Q1'–'Q4' quadrants, 'S1'–'S6' sextants, 'AS'/'AI' arches, 'general'; primary mirrors with an 'm' prefix)."
8098
10181
  }
8099
10182
  },
8100
10183
  "required": [
@@ -8118,7 +10201,7 @@
8118
10201
  },
8119
10202
  "item": {
8120
10203
  "attr": "data-fdi",
8121
- "description": "Each rendered tooth `<g>` carries its FDI id as `data-fdi`. The `data-projection` attribute on the root exposes the side/plan view."
10204
+ "description": "Each rendered tooth `<g>` carries its FDI id as `data-fdi`; selectable special-element slots carry their id there too (plus `data-special` naming the kind). The `data-projection` / `data-view-mode` attributes on the root expose the side/plan/both view."
8122
10205
  }
8123
10206
  }
8124
10207
  },
@@ -8740,6 +10823,16 @@
8740
10823
  "alia.cancelGeneration"
8741
10824
  ]
8742
10825
  },
10826
+ {
10827
+ "name": "retry_message",
10828
+ "safety": "write",
10829
+ "description": "Re-send a message that failed to send. The failed message is located by its `data-status=\"error\"` ChatMessage (addressed via `data-component-id`); activating that message's built-in retry control re-submits it. No adapter action — the retry control is a DOM-click affordance on the errored message.",
10830
+ "descriptionKey": "ui.agent.aliaAssistant.workflows.retryMessage",
10831
+ "uiActions": [],
10832
+ "apiActions": [
10833
+ "alia.sendMessage"
10834
+ ]
10835
+ },
8743
10836
  {
8744
10837
  "name": "toggle_popout",
8745
10838
  "safety": "read",
@@ -9028,6 +11121,184 @@
9028
11121
  }
9029
11122
  ]
9030
11123
  },
11124
+ {
11125
+ "kind": "pattern",
11126
+ "id": "care-plan-editor",
11127
+ "composes": [
11128
+ {
11129
+ "component": "care-plan-header",
11130
+ "as": "planHeader"
11131
+ },
11132
+ {
11133
+ "component": "tooth-scheme",
11134
+ "as": "odontogram",
11135
+ "entity": "tooth"
11136
+ },
11137
+ {
11138
+ "component": "data-table",
11139
+ "as": "treatmentsGrid",
11140
+ "entity": "treatment"
11141
+ },
11142
+ {
11143
+ "component": "radiograph-panel",
11144
+ "as": "radiographs",
11145
+ "entity": "radiograph"
11146
+ },
11147
+ {
11148
+ "component": "control-room-rail",
11149
+ "as": "toolRail"
11150
+ },
11151
+ {
11152
+ "component": "notes-panel",
11153
+ "as": "planNotes",
11154
+ "entity": "note"
11155
+ },
11156
+ {
11157
+ "component": "tasks-panel",
11158
+ "as": "planTasks",
11159
+ "entity": "task"
11160
+ },
11161
+ {
11162
+ "component": "entity-summary",
11163
+ "as": "planSummary"
11164
+ }
11165
+ ],
11166
+ "workflows": [
11167
+ {
11168
+ "name": "select_plan",
11169
+ "safety": "read",
11170
+ "description": "Open one of the patient's care plans from the plan list. Activation is a native click on the plan row; the host loads the plan into the editor.",
11171
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.selectPlan",
11172
+ "uiActions": [],
11173
+ "apiActions": [
11174
+ "carePlan.get"
11175
+ ]
11176
+ },
11177
+ {
11178
+ "name": "add_plan",
11179
+ "safety": "write",
11180
+ "description": "Create a new care plan for the patient.",
11181
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.addPlan",
11182
+ "uiActions": [],
11183
+ "apiActions": [
11184
+ "carePlan.create"
11185
+ ]
11186
+ },
11187
+ {
11188
+ "name": "inspect_tooth",
11189
+ "safety": "read",
11190
+ "description": "Focus a tooth on the odontogram and read its charted dental status.",
11191
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.inspectTooth",
11192
+ "uiActions": [
11193
+ "tooth-scheme.focus_tooth"
11194
+ ],
11195
+ "stateReads": [
11196
+ "tooth-scheme.chart"
11197
+ ],
11198
+ "apiActions": []
11199
+ },
11200
+ {
11201
+ "name": "open_tooth_radiographs",
11202
+ "safety": "read",
11203
+ "description": "Open the radiograph drawer for a tooth that carries imaging (the docked Control Room radiographs tool).",
11204
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.openToothRadiographs",
11205
+ "uiActions": [
11206
+ "tooth-scheme.open_radiographs",
11207
+ "control-room-rail.select_tool"
11208
+ ],
11209
+ "stateReads": [
11210
+ "tooth-scheme.teethWithRadiographs"
11211
+ ],
11212
+ "apiActions": []
11213
+ },
11214
+ {
11215
+ "name": "mark_treatment_done",
11216
+ "safety": "write",
11217
+ "description": "Mark a planned treatment as executed from its row action in the treatments grid.",
11218
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.markTreatmentDone",
11219
+ "uiActions": [],
11220
+ "stateReads": [
11221
+ "data-table.selection"
11222
+ ],
11223
+ "apiActions": [
11224
+ "carePlanTreatment.update"
11225
+ ]
11226
+ },
11227
+ {
11228
+ "name": "add_treatment",
11229
+ "safety": "write",
11230
+ "description": "Add a planned treatment row to the current plan.",
11231
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.addTreatment",
11232
+ "uiActions": [],
11233
+ "apiActions": [
11234
+ "carePlanTreatment.create"
11235
+ ]
11236
+ },
11237
+ {
11238
+ "name": "remove_treatment",
11239
+ "safety": "destructive",
11240
+ "description": "Remove the selected planned treatment(s) from the plan (read data-table.selection for the targets).",
11241
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.removeTreatment",
11242
+ "uiActions": [],
11243
+ "stateReads": [
11244
+ "data-table.selection"
11245
+ ],
11246
+ "apiActions": [
11247
+ "carePlanTreatment.delete"
11248
+ ]
11249
+ },
11250
+ {
11251
+ "name": "save_plan",
11252
+ "safety": "write",
11253
+ "description": "Persist the current edits to the care plan.",
11254
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.savePlan",
11255
+ "uiActions": [],
11256
+ "apiActions": [
11257
+ "carePlan.update"
11258
+ ]
11259
+ },
11260
+ {
11261
+ "name": "add_plan_note",
11262
+ "safety": "phi",
11263
+ "description": "Add a note to the plan via the docked Notes tool. A clinical note requires the clinical-note permission.",
11264
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.addPlanNote",
11265
+ "uiActions": [
11266
+ "notes-panel.add_note"
11267
+ ],
11268
+ "apiActions": [
11269
+ "note.create"
11270
+ ]
11271
+ },
11272
+ {
11273
+ "name": "triage_plan_tasks",
11274
+ "safety": "write",
11275
+ "description": "Open or complete a follow-up task from the docked Tasks tool.",
11276
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.triagePlanTasks",
11277
+ "uiActions": [
11278
+ "tasks-panel.select_item",
11279
+ "tasks-panel.toggle_done"
11280
+ ],
11281
+ "stateReads": [
11282
+ "tasks-panel.items"
11283
+ ],
11284
+ "apiActions": [
11285
+ "task.update"
11286
+ ]
11287
+ },
11288
+ {
11289
+ "name": "regenerate_summary",
11290
+ "safety": "write",
11291
+ "description": "Regenerate the AI plan summary in the docked AI summary tool.",
11292
+ "descriptionKey": "ui.agent.carePlanEditor.workflows.regenerateSummary",
11293
+ "uiActions": [
11294
+ "entity-summary.regenerate"
11295
+ ],
11296
+ "apiActions": [
11297
+ "alia.summarise"
11298
+ ]
11299
+ }
11300
+ ]
11301
+ },
9031
11302
  {
9032
11303
  "kind": "pattern",
9033
11304
  "id": "care-plans",
@@ -9037,10 +11308,6 @@
9037
11308
  "as": "register",
9038
11309
  "entity": "carePlan"
9039
11310
  },
9040
- {
9041
- "component": "select",
9042
- "as": "periodFilter"
9043
- },
9044
11311
  {
9045
11312
  "component": "button",
9046
11313
  "as": "newPlan"
@@ -9053,10 +11320,6 @@
9053
11320
  "component": "icon-button-group",
9054
11321
  "as": "rowActions"
9055
11322
  },
9056
- {
9057
- "component": "tag",
9058
- "as": "planStatus"
9059
- },
9060
11323
  {
9061
11324
  "component": "transaction-chip",
9062
11325
  "as": "invoiceChip"
@@ -9067,27 +11330,15 @@
9067
11330
  },
9068
11331
  {
9069
11332
  "component": "counter",
9070
- "as": "totalsFooter"
11333
+ "as": "planRollupCount"
9071
11334
  },
9072
11335
  {
9073
11336
  "component": "card",
9074
- "as": "planDetail"
9075
- },
9076
- {
9077
- "component": "description-list",
9078
- "as": "planSummary"
9079
- },
9080
- {
9081
- "component": "tooth-scheme",
9082
- "as": "odontogram"
11337
+ "as": "gridCard"
9083
11338
  },
9084
11339
  {
9085
11340
  "component": "warning-stack",
9086
11341
  "as": "planWarnings"
9087
- },
9088
- {
9089
- "component": "badge",
9090
- "as": "rollupCount"
9091
11342
  }
9092
11343
  ],
9093
11344
  "workflows": [
@@ -9108,14 +11359,12 @@
9108
11359
  {
9109
11360
  "name": "filter_by_period",
9110
11361
  "safety": "read",
9111
- "description": "Choose a period preset (e.g. this month, this year) and filter the register to it.",
11362
+ "description": "Filter the register to a created/scheduled date range via the per-column date filters.",
9112
11363
  "descriptionKey": "ui.agent.carePlans.workflows.filterByPeriod",
9113
11364
  "uiActions": [
9114
- "select.set_value",
9115
11365
  "data-table.apply_filter"
9116
11366
  ],
9117
11367
  "stateReads": [
9118
- "select.value",
9119
11368
  "data-table.filter"
9120
11369
  ],
9121
11370
  "apiActions": []
@@ -9285,7 +11534,7 @@
9285
11534
  "as": "topbar"
9286
11535
  },
9287
11536
  {
9288
- "component": "ai-tools-rail",
11537
+ "component": "tool-rail",
9289
11538
  "as": "rail"
9290
11539
  },
9291
11540
  {
@@ -9332,11 +11581,11 @@
9332
11581
  "description": "Open the inline-end AI tools rail to the Inbox tool to read the merged notifications / messages / product-update feed.",
9333
11582
  "descriptionKey": "ui.agent.dashboard.workflows.openInbox",
9334
11583
  "uiActions": [
9335
- "ai-tools-rail.open",
9336
- "ai-tools-rail.select_tool"
11584
+ "tool-rail.open",
11585
+ "tool-rail.select_tool"
9337
11586
  ],
9338
11587
  "stateReads": [
9339
- "ai-tools-rail.activeToolId"
11588
+ "tool-rail.activeToolId"
9340
11589
  ],
9341
11590
  "apiActions": [
9342
11591
  "inbox.list"
@@ -9661,26 +11910,167 @@
9661
11910
  ]
9662
11911
  },
9663
11912
  {
9664
- "name": "delete_selected",
11913
+ "name": "delete_selected",
11914
+ "safety": "destructive",
11915
+ "description": "Delete every selected row. Irreversible.",
11916
+ "descriptionKey": "ui.agent.entityIndexTable.workflows.deleteSelected",
11917
+ "uiActions": [
11918
+ "data-table.get_selection",
11919
+ "data-table.clear_selection"
11920
+ ],
11921
+ "apiActions": [
11922
+ "entity.delete"
11923
+ ]
11924
+ },
11925
+ {
11926
+ "name": "export_csv",
11927
+ "safety": "read",
11928
+ "description": "Trigger the CSV export of the current filtered set.",
11929
+ "descriptionKey": "ui.agent.entityIndexTable.workflows.exportCsv",
11930
+ "uiActions": [],
11931
+ "apiActions": [
11932
+ "entity.export"
11933
+ ]
11934
+ }
11935
+ ]
11936
+ },
11937
+ {
11938
+ "kind": "pattern",
11939
+ "id": "invoices",
11940
+ "composes": [
11941
+ {
11942
+ "component": "data-table",
11943
+ "as": "ledger",
11944
+ "entity": "invoice"
11945
+ },
11946
+ {
11947
+ "component": "icon-button-group",
11948
+ "as": "tableActions"
11949
+ },
11950
+ {
11951
+ "component": "icon-button",
11952
+ "as": "tableAction"
11953
+ },
11954
+ {
11955
+ "component": "badge",
11956
+ "as": "statusBadge"
11957
+ },
11958
+ {
11959
+ "component": "button",
11960
+ "as": "rowAction"
11961
+ }
11962
+ ],
11963
+ "workflows": [
11964
+ {
11965
+ "name": "filter_invoices",
11966
+ "safety": "read",
11967
+ "description": "Narrow the ledger by number, relation, status, date range or amount using the per-column filters.",
11968
+ "descriptionKey": "ui.agent.invoices.workflows.filterInvoices",
11969
+ "uiActions": [
11970
+ "data-table.apply_filter"
11971
+ ],
11972
+ "stateReads": [
11973
+ "data-table.filter"
11974
+ ],
11975
+ "apiActions": [
11976
+ "invoice.list"
11977
+ ]
11978
+ },
11979
+ {
11980
+ "name": "sort_ledger",
11981
+ "safety": "read",
11982
+ "description": "Re-sort the ledger by any column (e.g. issue date, total, balance).",
11983
+ "descriptionKey": "ui.agent.invoices.workflows.sortLedger",
11984
+ "uiActions": [
11985
+ "data-table.sort_by"
11986
+ ],
11987
+ "stateReads": [
11988
+ "data-table.sort"
11989
+ ],
11990
+ "apiActions": []
11991
+ },
11992
+ {
11993
+ "name": "paginate",
11994
+ "safety": "read",
11995
+ "description": "Move to another page of the ledger.",
11996
+ "descriptionKey": "ui.agent.invoices.workflows.paginate",
11997
+ "uiActions": [
11998
+ "data-table.go_to_page"
11999
+ ],
12000
+ "stateReads": [
12001
+ "data-table.currentPage"
12002
+ ],
12003
+ "apiActions": []
12004
+ },
12005
+ {
12006
+ "name": "export_ledger",
12007
+ "safety": "read",
12008
+ "description": "Export the current (optionally filtered) ledger from the page-header table-tools cluster — CSV / Excel / PDF.",
12009
+ "descriptionKey": "ui.agent.invoices.workflows.exportLedger",
12010
+ "uiActions": [],
12011
+ "apiActions": [
12012
+ "invoice.export"
12013
+ ]
12014
+ },
12015
+ {
12016
+ "name": "view_invoice",
12017
+ "safety": "read",
12018
+ "description": "Open a single invoice from its row action to inspect line items and payment history.",
12019
+ "descriptionKey": "ui.agent.invoices.workflows.viewInvoice",
12020
+ "uiActions": [
12021
+ "data-table.get_selection"
12022
+ ],
12023
+ "stateReads": [
12024
+ "data-table.selection"
12025
+ ],
12026
+ "apiActions": [
12027
+ "invoice.get"
12028
+ ]
12029
+ },
12030
+ {
12031
+ "name": "download_pdf",
12032
+ "safety": "read",
12033
+ "description": "Download the selected invoice as a PDF from its row action.",
12034
+ "descriptionKey": "ui.agent.invoices.workflows.downloadPdf",
12035
+ "uiActions": [
12036
+ "data-table.get_selection"
12037
+ ],
12038
+ "stateReads": [
12039
+ "data-table.selection"
12040
+ ],
12041
+ "apiActions": [
12042
+ "invoice.downloadPdf"
12043
+ ]
12044
+ },
12045
+ {
12046
+ "name": "send_reminder",
12047
+ "safety": "write",
12048
+ "description": "Send a payment reminder for the selected invoice through its eligible channel (email or SMS).",
12049
+ "descriptionKey": "ui.agent.invoices.workflows.sendReminder",
12050
+ "uiActions": [
12051
+ "data-table.get_selection"
12052
+ ],
12053
+ "stateReads": [
12054
+ "data-table.selection"
12055
+ ],
12056
+ "apiActions": [
12057
+ "invoice.sendReminder"
12058
+ ]
12059
+ },
12060
+ {
12061
+ "name": "delete_invoice",
9665
12062
  "safety": "destructive",
9666
- "description": "Delete every selected row. Irreversible.",
9667
- "descriptionKey": "ui.agent.entityIndexTable.workflows.deleteSelected",
12063
+ "description": "Delete the selected invoice from its row action. Paid invoices cannot be deleted. Irreversible.",
12064
+ "descriptionKey": "ui.agent.invoices.workflows.deleteInvoice",
9668
12065
  "uiActions": [
9669
12066
  "data-table.get_selection",
9670
12067
  "data-table.clear_selection"
9671
12068
  ],
12069
+ "stateReads": [
12070
+ "data-table.selection"
12071
+ ],
9672
12072
  "apiActions": [
9673
- "entity.delete"
9674
- ]
9675
- },
9676
- {
9677
- "name": "export_csv",
9678
- "safety": "read",
9679
- "description": "Trigger the CSV export of the current filtered set.",
9680
- "descriptionKey": "ui.agent.entityIndexTable.workflows.exportCsv",
9681
- "uiActions": [],
9682
- "apiActions": [
9683
- "entity.export"
12073
+ "invoice.delete"
9684
12074
  ]
9685
12075
  }
9686
12076
  ]
@@ -9941,7 +12331,7 @@
9941
12331
  "id": "patient-ai-summary",
9942
12332
  "composes": [
9943
12333
  {
9944
- "component": "ai-tools-rail",
12334
+ "component": "tool-rail",
9945
12335
  "as": "toolRail"
9946
12336
  },
9947
12337
  {
@@ -9991,11 +12381,11 @@
9991
12381
  "description": "Open one of the rail tools — the Patient Summary brief or the Ask Alia chat — making its panel the active complementary landmark.",
9992
12382
  "descriptionKey": "ui.agent.patientAiSummary.workflows.openTool",
9993
12383
  "uiActions": [
9994
- "ai-tools-rail.open",
9995
- "ai-tools-rail.select_tool"
12384
+ "tool-rail.open",
12385
+ "tool-rail.select_tool"
9996
12386
  ],
9997
12387
  "stateReads": [
9998
- "ai-tools-rail.activeToolId"
12388
+ "tool-rail.activeToolId"
9999
12389
  ],
10000
12390
  "apiActions": []
10001
12391
  },
@@ -10049,10 +12439,10 @@
10049
12439
  "description": "Open the Ask Alia tool and send a question about this patient; Alia can answer with an in-conversation entity card.",
10050
12440
  "descriptionKey": "ui.agent.patientAiSummary.workflows.askAlia",
10051
12441
  "uiActions": [
10052
- "ai-tools-rail.select_tool"
12442
+ "tool-rail.select_tool"
10053
12443
  ],
10054
12444
  "stateReads": [
10055
- "ai-tools-rail.activeToolId"
12445
+ "tool-rail.activeToolId"
10056
12446
  ],
10057
12447
  "apiActions": [
10058
12448
  "alia.sendMessage"
@@ -10547,8 +12937,8 @@
10547
12937
  "as": "bulkAction"
10548
12938
  },
10549
12939
  {
10550
- "component": "select",
10551
- "as": "viewSwitcher"
12940
+ "component": "icon-button-group",
12941
+ "as": "tableActions"
10552
12942
  }
10553
12943
  ],
10554
12944
  "workflows": [
@@ -10626,21 +13016,14 @@
10626
13016
  ]
10627
13017
  },
10628
13018
  {
10629
- "name": "apply_view",
13019
+ "name": "export_roster",
10630
13020
  "safety": "read",
10631
- "description": "Choose a saved view from the switcher to apply its filter and sort (and saved column layout) to the roster.",
10632
- "descriptionKey": "ui.agent.patients.workflows.applyView",
10633
- "uiActions": [
10634
- "select.set_value",
10635
- "data-table.apply_filter",
10636
- "data-table.sort_by"
10637
- ],
10638
- "stateReads": [
10639
- "select.value",
10640
- "data-table.filter",
10641
- "data-table.sort"
10642
- ],
10643
- "apiActions": []
13021
+ "description": "Export the current (optionally filtered) patient roster from the page-header table-tools cluster CSV / Excel / PDF.",
13022
+ "descriptionKey": "ui.agent.patients.workflows.exportRoster",
13023
+ "uiActions": [],
13024
+ "apiActions": [
13025
+ "patient.export"
13026
+ ]
10644
13027
  }
10645
13028
  ]
10646
13029
  },
@@ -10940,7 +13323,7 @@
10940
13323
  "as": "mainNav"
10941
13324
  },
10942
13325
  {
10943
- "component": "ai-tools-rail",
13326
+ "component": "tool-rail",
10944
13327
  "as": "inboxRail",
10945
13328
  "entity": "notification"
10946
13329
  },
@@ -11033,10 +13416,10 @@
11033
13416
  "description": "Open the inbox rail's notifications/messages tool and read which tool is active.",
11034
13417
  "descriptionKey": "ui.agent.roiDashboard.workflows.openInbox",
11035
13418
  "uiActions": [
11036
- "ai-tools-rail.open"
13419
+ "tool-rail.open"
11037
13420
  ],
11038
13421
  "stateReads": [
11039
- "ai-tools-rail.activeToolId"
13422
+ "tool-rail.activeToolId"
11040
13423
  ],
11041
13424
  "apiActions": []
11042
13425
  },
@@ -11065,6 +13448,147 @@
11065
13448
  }
11066
13449
  ]
11067
13450
  },
13451
+ {
13452
+ "kind": "pattern",
13453
+ "id": "services",
13454
+ "composes": [
13455
+ {
13456
+ "component": "data-table",
13457
+ "as": "catalogue",
13458
+ "entity": "service"
13459
+ },
13460
+ {
13461
+ "component": "card",
13462
+ "as": "gridShell"
13463
+ },
13464
+ {
13465
+ "component": "icon-button-group",
13466
+ "as": "tableActions"
13467
+ },
13468
+ {
13469
+ "component": "icon-button",
13470
+ "as": "tableAction"
13471
+ },
13472
+ {
13473
+ "component": "switch",
13474
+ "as": "compactActionsToggle"
13475
+ }
13476
+ ],
13477
+ "workflows": [
13478
+ {
13479
+ "name": "filter_services",
13480
+ "safety": "read",
13481
+ "description": "Narrow the catalogue by name, code, category, VAT rate or active status using the per-column filters.",
13482
+ "descriptionKey": "ui.agent.services.workflows.filterServices",
13483
+ "uiActions": [
13484
+ "data-table.apply_filter"
13485
+ ],
13486
+ "stateReads": [
13487
+ "data-table.filter"
13488
+ ],
13489
+ "apiActions": [
13490
+ "service.list"
13491
+ ]
13492
+ },
13493
+ {
13494
+ "name": "sort_catalogue",
13495
+ "safety": "read",
13496
+ "description": "Re-sort the catalogue by any column (e.g. price, duration, active).",
13497
+ "descriptionKey": "ui.agent.services.workflows.sortCatalogue",
13498
+ "uiActions": [
13499
+ "data-table.sort_by"
13500
+ ],
13501
+ "stateReads": [
13502
+ "data-table.sort"
13503
+ ],
13504
+ "apiActions": []
13505
+ },
13506
+ {
13507
+ "name": "compact_actions",
13508
+ "safety": "read",
13509
+ "description": "Toggle the ColumnToggle settings-footer switch to compact the per-row action column.",
13510
+ "descriptionKey": "ui.agent.services.workflows.compactActions",
13511
+ "uiActions": [
13512
+ "switch.set_checked"
13513
+ ],
13514
+ "stateReads": [
13515
+ "switch.checked"
13516
+ ],
13517
+ "apiActions": []
13518
+ },
13519
+ {
13520
+ "name": "toggle_active",
13521
+ "safety": "write",
13522
+ "description": "Flip a service’s availability via its per-row Active toggle so it is offered (or withdrawn) on new plans.",
13523
+ "descriptionKey": "ui.agent.services.workflows.toggleActive",
13524
+ "uiActions": [
13525
+ "data-table.get_selection"
13526
+ ],
13527
+ "stateReads": [
13528
+ "data-table.selection"
13529
+ ],
13530
+ "apiActions": [
13531
+ "service.setActive"
13532
+ ]
13533
+ },
13534
+ {
13535
+ "name": "export_catalogue",
13536
+ "safety": "read",
13537
+ "description": "Export the current (optionally filtered) catalogue from the page-header table-tools cluster — CSV / Excel / PDF.",
13538
+ "descriptionKey": "ui.agent.services.workflows.exportCatalogue",
13539
+ "uiActions": [],
13540
+ "apiActions": [
13541
+ "service.export"
13542
+ ]
13543
+ },
13544
+ {
13545
+ "name": "edit_service",
13546
+ "safety": "write",
13547
+ "description": "Edit the selected service (e.g. price, duration, VAT) from its row action.",
13548
+ "descriptionKey": "ui.agent.services.workflows.editService",
13549
+ "uiActions": [
13550
+ "data-table.get_selection"
13551
+ ],
13552
+ "stateReads": [
13553
+ "data-table.selection"
13554
+ ],
13555
+ "apiActions": [
13556
+ "service.update"
13557
+ ]
13558
+ },
13559
+ {
13560
+ "name": "duplicate_service",
13561
+ "safety": "write",
13562
+ "description": "Duplicate the selected service into a new editable copy from its row action.",
13563
+ "descriptionKey": "ui.agent.services.workflows.duplicateService",
13564
+ "uiActions": [
13565
+ "data-table.get_selection"
13566
+ ],
13567
+ "stateReads": [
13568
+ "data-table.selection"
13569
+ ],
13570
+ "apiActions": [
13571
+ "service.duplicate"
13572
+ ]
13573
+ },
13574
+ {
13575
+ "name": "delete_service",
13576
+ "safety": "destructive",
13577
+ "description": "Delete the selected service from its row action. A service in use on a plan cannot be deleted. Irreversible.",
13578
+ "descriptionKey": "ui.agent.services.workflows.deleteService",
13579
+ "uiActions": [
13580
+ "data-table.get_selection",
13581
+ "data-table.clear_selection"
13582
+ ],
13583
+ "stateReads": [
13584
+ "data-table.selection"
13585
+ ],
13586
+ "apiActions": [
13587
+ "service.delete"
13588
+ ]
13589
+ }
13590
+ ]
13591
+ },
11068
13592
  {
11069
13593
  "kind": "pattern",
11070
13594
  "id": "settings",
@@ -11082,33 +13606,69 @@
11082
13606
  "as": "primaryNav"
11083
13607
  },
11084
13608
  {
11085
- "component": "ai-tools-rail",
13609
+ "component": "control-room-rail",
11086
13610
  "as": "toolRail"
11087
13611
  },
11088
13612
  {
11089
- "component": "tabs",
11090
- "as": "sectionNav",
11091
- "entity": "settingsSection"
13613
+ "component": "data-table",
13614
+ "as": "sectionList",
13615
+ "entity": "settingsRecord"
13616
+ },
13617
+ {
13618
+ "component": "dialog",
13619
+ "as": "recordDialog"
11092
13620
  },
11093
13621
  {
11094
13622
  "component": "form-field",
11095
- "as": "displayNameField"
13623
+ "as": "field"
11096
13624
  },
11097
13625
  {
11098
13626
  "component": "text-input",
11099
- "as": "displayName"
13627
+ "as": "textField"
13628
+ },
13629
+ {
13630
+ "component": "iban-input",
13631
+ "as": "ibanField"
13632
+ },
13633
+ {
13634
+ "component": "permission-matrix",
13635
+ "as": "permissions"
13636
+ },
13637
+ {
13638
+ "component": "connection-status",
13639
+ "as": "paymentConnection"
13640
+ },
13641
+ {
13642
+ "component": "image-cropper",
13643
+ "as": "photoCropper"
11100
13644
  },
11101
13645
  {
11102
13646
  "component": "switch",
11103
- "as": "emailDigest"
13647
+ "as": "toggle"
11104
13648
  },
11105
13649
  {
11106
13650
  "component": "select",
11107
- "as": "language"
13651
+ "as": "choice"
11108
13652
  },
11109
13653
  {
11110
- "component": "button",
11111
- "as": "cancel"
13654
+ "component": "radio-group",
13655
+ "as": "optionGroup"
13656
+ },
13657
+ {
13658
+ "component": "checkbox-group",
13659
+ "as": "multiChoice"
13660
+ },
13661
+ {
13662
+ "component": "color-picker",
13663
+ "as": "colour"
13664
+ },
13665
+ {
13666
+ "component": "file-upload",
13667
+ "as": "imageUpload"
13668
+ },
13669
+ {
13670
+ "component": "copy-field",
13671
+ "as": "secret"
11112
13672
  },
11113
13673
  {
11114
13674
  "component": "button",
@@ -11117,78 +13677,227 @@
11117
13677
  ],
11118
13678
  "workflows": [
11119
13679
  {
11120
- "name": "switch_section",
13680
+ "name": "open_section",
11121
13681
  "safety": "read",
11122
- "description": "Switch the active settings section (Profile / Notifications / Billing / Security) via the vertical tab strip.",
11123
- "descriptionKey": "ui.agent.settings.workflows.switchSection",
13682
+ "description": "Open a settings section from the Hub or the grouped section nav. Read-only navigation.",
13683
+ "descriptionKey": "ui.agent.settings.workflows.openSection",
13684
+ "uiActions": [],
13685
+ "apiActions": []
13686
+ },
13687
+ {
13688
+ "name": "edit_text_setting",
13689
+ "safety": "write",
13690
+ "description": "Set a text field in the active section (e.g. practice name, booking address, bank IBAN); marks the form dirty and enables Save.",
13691
+ "descriptionKey": "ui.agent.settings.workflows.editTextSetting",
11124
13692
  "uiActions": [
11125
- "tabs.select_tab"
13693
+ "text-input.set_value",
13694
+ "text-input.clear",
13695
+ "iban-input.set_value"
11126
13696
  ],
11127
13697
  "stateReads": [
11128
- "tabs.activeTab"
13698
+ "text-input.value",
13699
+ "iban-input.value"
13700
+ ],
13701
+ "apiActions": []
13702
+ },
13703
+ {
13704
+ "name": "toggle_setting",
13705
+ "safety": "write",
13706
+ "description": "Turn a boolean setting on or off (e.g. yearly numbering, group services).",
13707
+ "descriptionKey": "ui.agent.settings.workflows.toggleSetting",
13708
+ "uiActions": [
13709
+ "switch.set_checked",
13710
+ "switch.toggle"
13711
+ ],
13712
+ "stateReads": [
13713
+ "switch.checked"
13714
+ ],
13715
+ "apiActions": []
13716
+ },
13717
+ {
13718
+ "name": "choose_option",
13719
+ "safety": "write",
13720
+ "description": "Pick a single option from a select or radio group (e.g. tax regime, document type, stamp method).",
13721
+ "descriptionKey": "ui.agent.settings.workflows.chooseOption",
13722
+ "uiActions": [
13723
+ "select.set_value",
13724
+ "select.open",
13725
+ "select.close",
13726
+ "radio-group.set_value"
13727
+ ],
13728
+ "stateReads": [
13729
+ "select.value",
13730
+ "radio-group.value"
13731
+ ],
13732
+ "apiActions": []
13733
+ },
13734
+ {
13735
+ "name": "set_multi_choice",
13736
+ "safety": "write",
13737
+ "description": "Select or clear members of a multi-choice group (e.g. accepted insurers, active branches, per-area permissions).",
13738
+ "descriptionKey": "ui.agent.settings.workflows.setMultiChoice",
13739
+ "uiActions": [
13740
+ "checkbox-group.set_selection",
13741
+ "checkbox-group.clear_selection",
13742
+ "permission-matrix.set_selection",
13743
+ "permission-matrix.clear"
13744
+ ],
13745
+ "stateReads": [
13746
+ "checkbox-group.selection",
13747
+ "permission-matrix.selection"
13748
+ ],
13749
+ "apiActions": []
13750
+ },
13751
+ {
13752
+ "name": "pick_colour",
13753
+ "safety": "write",
13754
+ "description": "Choose a colour from the practice palette (e.g. booking page accent).",
13755
+ "descriptionKey": "ui.agent.settings.workflows.pickColour",
13756
+ "uiActions": [
13757
+ "color-picker.set_value"
13758
+ ],
13759
+ "stateReads": [
13760
+ "color-picker.value"
11129
13761
  ],
11130
13762
  "apiActions": []
11131
13763
  },
11132
13764
  {
11133
- "name": "edit_display_name",
13765
+ "name": "save_section",
13766
+ "safety": "write",
13767
+ "description": "Persist the dirty section form. Save is disabled until a field changes.",
13768
+ "descriptionKey": "ui.agent.settings.workflows.saveSection",
13769
+ "uiActions": [],
13770
+ "apiActions": [
13771
+ "settings.updateSection"
13772
+ ]
13773
+ },
13774
+ {
13775
+ "name": "add_record",
11134
13776
  "safety": "write",
11135
- "description": "Set the display-name text field; changing it marks the form dirty and enables Save.",
11136
- "descriptionKey": "ui.agent.settings.workflows.editDisplayName",
13777
+ "description": "Open the create dialog for a list section (cash & banks, chairs, payment types…) and persist a new record.",
13778
+ "descriptionKey": "ui.agent.settings.workflows.addRecord",
11137
13779
  "uiActions": [
13780
+ "dialog.open",
11138
13781
  "text-input.set_value",
11139
- "text-input.clear"
13782
+ "dialog.close"
13783
+ ],
13784
+ "apiActions": [
13785
+ "settings.createRecord"
13786
+ ]
13787
+ },
13788
+ {
13789
+ "name": "delete_record",
13790
+ "safety": "destructive",
13791
+ "description": "Remove a record from a list section after confirmation. Irreversible.",
13792
+ "descriptionKey": "ui.agent.settings.workflows.deleteRecord",
13793
+ "uiActions": [
13794
+ "data-table.clear_selection"
11140
13795
  ],
11141
13796
  "stateReads": [
11142
- "text-input.value",
11143
- "text-input.isEmpty"
13797
+ "data-table.selection"
13798
+ ],
13799
+ "apiActions": [
13800
+ "settings.deleteRecord"
13801
+ ]
13802
+ },
13803
+ {
13804
+ "name": "filter_records",
13805
+ "safety": "read",
13806
+ "description": "Filter the rows of a list section by a column value.",
13807
+ "descriptionKey": "ui.agent.settings.workflows.filterRecords",
13808
+ "uiActions": [
13809
+ "data-table.apply_filter"
13810
+ ],
13811
+ "stateReads": [
13812
+ "data-table.filter"
11144
13813
  ],
11145
13814
  "apiActions": []
11146
13815
  },
11147
13816
  {
11148
- "name": "toggle_email_digest",
13817
+ "name": "upload_practice_photo",
11149
13818
  "safety": "write",
11150
- "description": "Turn the weekly email digest preference on or off.",
11151
- "descriptionKey": "ui.agent.settings.workflows.toggleEmailDigest",
13819
+ "description": "Upload, crop, or remove the practice / profile photo.",
13820
+ "descriptionKey": "ui.agent.settings.workflows.uploadPracticePhoto",
11152
13821
  "uiActions": [
11153
- "switch.set_checked",
11154
- "switch.toggle"
13822
+ "file-upload.remove_file",
13823
+ "file-upload.clear",
13824
+ "image-cropper.set_crop"
13825
+ ],
13826
+ "stateReads": [
13827
+ "file-upload.files",
13828
+ "image-cropper.crop"
13829
+ ],
13830
+ "apiActions": [
13831
+ "settings.uploadImage"
13832
+ ]
13833
+ },
13834
+ {
13835
+ "name": "copy_secret",
13836
+ "safety": "read",
13837
+ "description": "Copy a read-only secret to the clipboard (API key, data-import key, support PIN, iCal feed URL).",
13838
+ "descriptionKey": "ui.agent.settings.workflows.copySecret",
13839
+ "uiActions": [
13840
+ "copy-field.copy"
11155
13841
  ],
11156
13842
  "stateReads": [
11157
- "switch.checked"
13843
+ "copy-field.value"
13844
+ ],
13845
+ "apiActions": []
13846
+ },
13847
+ {
13848
+ "name": "revoke_api_key",
13849
+ "safety": "destructive",
13850
+ "description": "Revoke or regenerate an API key. Apps using the old key lose access immediately.",
13851
+ "descriptionKey": "ui.agent.settings.workflows.revokeApiKey",
13852
+ "uiActions": [],
13853
+ "stateReads": [
13854
+ "data-table.selection"
11158
13855
  ],
11159
- "apiActions": []
13856
+ "apiActions": [
13857
+ "apiKey.revoke",
13858
+ "apiKey.regenerate"
13859
+ ]
11160
13860
  },
11161
13861
  {
11162
- "name": "set_language",
13862
+ "name": "connect_online_payments",
11163
13863
  "safety": "write",
11164
- "description": "Choose the display language from the language select.",
11165
- "descriptionKey": "ui.agent.settings.workflows.setLanguage",
13864
+ "description": "Connect or disconnect the Stripe account used for online payments.",
13865
+ "descriptionKey": "ui.agent.settings.workflows.connectOnlinePayments",
11166
13866
  "uiActions": [
11167
- "select.set_value",
11168
- "select.open",
11169
- "select.close"
13867
+ "connection-status.connect",
13868
+ "connection-status.disconnect"
11170
13869
  ],
11171
13870
  "stateReads": [
11172
- "select.value"
13871
+ "connection-status.status"
11173
13872
  ],
11174
- "apiActions": []
13873
+ "apiActions": [
13874
+ "onlinePayment.connectStripe",
13875
+ "onlinePayment.disconnectStripe"
13876
+ ]
11175
13877
  },
11176
13878
  {
11177
- "name": "save_settings",
11178
- "safety": "write",
11179
- "description": "Persist the dirty profile form. Save is disabled until a field changes.",
11180
- "descriptionKey": "ui.agent.settings.workflows.saveSettings",
11181
- "uiActions": [],
13879
+ "name": "delete_archive",
13880
+ "safety": "destructive",
13881
+ "description": "Delete the current archive after a password-gated confirmation. Permanently removes all of its data. Irreversible.",
13882
+ "descriptionKey": "ui.agent.settings.workflows.deleteArchive",
13883
+ "uiActions": [
13884
+ "dialog.open",
13885
+ "text-input.set_value"
13886
+ ],
11182
13887
  "apiActions": [
11183
- "settings.updateProfile"
13888
+ "archive.delete"
11184
13889
  ]
11185
13890
  },
11186
13891
  {
11187
- "name": "discard_changes",
13892
+ "name": "open_tool",
11188
13893
  "safety": "read",
11189
- "description": "Cancel and reset the form to its last-saved baseline, re-disabling Save.",
11190
- "descriptionKey": "ui.agent.settings.workflows.discardChanges",
11191
- "uiActions": [],
13894
+ "description": "Open or switch a Control-Room rail tool (inbox, Alia) without leaving Settings.",
13895
+ "descriptionKey": "ui.agent.settings.workflows.openTool",
13896
+ "uiActions": [
13897
+ "control-room-rail.open",
13898
+ "control-room-rail.select_tool",
13899
+ "control-room-rail.close"
13900
+ ],
11192
13901
  "apiActions": []
11193
13902
  },
11194
13903
  {
@@ -11199,9 +13908,6 @@
11199
13908
  "uiActions": [
11200
13909
  "sidebar.toggle_collapsed"
11201
13910
  ],
11202
- "stateReads": [
11203
- "sidebar.isCollapsed"
11204
- ],
11205
13911
  "apiActions": []
11206
13912
  }
11207
13913
  ]
@@ -11466,6 +14172,153 @@
11466
14172
  }
11467
14173
  ]
11468
14174
  },
14175
+ {
14176
+ "kind": "pattern",
14177
+ "id": "tasks",
14178
+ "composes": [
14179
+ {
14180
+ "component": "data-table",
14181
+ "as": "roster",
14182
+ "entity": "task"
14183
+ },
14184
+ {
14185
+ "component": "warning-stack",
14186
+ "as": "notices"
14187
+ },
14188
+ {
14189
+ "component": "switch",
14190
+ "as": "doneToggle"
14191
+ },
14192
+ {
14193
+ "component": "button",
14194
+ "as": "noticeAction"
14195
+ },
14196
+ {
14197
+ "component": "icon-button-group",
14198
+ "as": "tableActions"
14199
+ },
14200
+ {
14201
+ "component": "icon-button",
14202
+ "as": "tableAction"
14203
+ },
14204
+ {
14205
+ "component": "smart-date",
14206
+ "as": "dueDate"
14207
+ }
14208
+ ],
14209
+ "workflows": [
14210
+ {
14211
+ "name": "filter_tasks",
14212
+ "safety": "read",
14213
+ "description": "Narrow the roster by title, type, assignee, due range or status using the per-column filters.",
14214
+ "descriptionKey": "ui.agent.tasks.workflows.filterTasks",
14215
+ "uiActions": [
14216
+ "data-table.apply_filter"
14217
+ ],
14218
+ "stateReads": [
14219
+ "data-table.filter"
14220
+ ],
14221
+ "apiActions": [
14222
+ "task.list"
14223
+ ]
14224
+ },
14225
+ {
14226
+ "name": "filter_from_notice",
14227
+ "safety": "read",
14228
+ "description": "Apply a WarningStack notice’s \"View\" action (e.g. \"View overdue\", \"View collections\") to narrow the roster to the flagged tasks.",
14229
+ "descriptionKey": "ui.agent.tasks.workflows.filterFromNotice",
14230
+ "uiActions": [
14231
+ "data-table.apply_filter"
14232
+ ],
14233
+ "stateReads": [
14234
+ "data-table.filter"
14235
+ ],
14236
+ "apiActions": []
14237
+ },
14238
+ {
14239
+ "name": "sort_roster",
14240
+ "safety": "read",
14241
+ "description": "Re-sort the roster by any column (e.g. soonest due first, created date).",
14242
+ "descriptionKey": "ui.agent.tasks.workflows.sortRoster",
14243
+ "uiActions": [
14244
+ "data-table.sort_by"
14245
+ ],
14246
+ "stateReads": [
14247
+ "data-table.sort"
14248
+ ],
14249
+ "apiActions": []
14250
+ },
14251
+ {
14252
+ "name": "toggle_done",
14253
+ "safety": "write",
14254
+ "description": "Mark a task as done (or reopen it) via its per-row done toggle.",
14255
+ "descriptionKey": "ui.agent.tasks.workflows.toggleDone",
14256
+ "uiActions": [
14257
+ "switch.set_checked"
14258
+ ],
14259
+ "stateReads": [
14260
+ "switch.checked"
14261
+ ],
14262
+ "apiActions": [
14263
+ "task.setDone"
14264
+ ]
14265
+ },
14266
+ {
14267
+ "name": "compact_actions",
14268
+ "safety": "read",
14269
+ "description": "Toggle the ColumnToggle settings-footer switch to compact the per-row action column.",
14270
+ "descriptionKey": "ui.agent.tasks.workflows.compactActions",
14271
+ "uiActions": [
14272
+ "switch.set_checked"
14273
+ ],
14274
+ "stateReads": [
14275
+ "switch.checked"
14276
+ ],
14277
+ "apiActions": []
14278
+ },
14279
+ {
14280
+ "name": "export_roster",
14281
+ "safety": "read",
14282
+ "description": "Export the current (optionally filtered) roster from the page-header table-tools cluster — CSV / Excel / PDF.",
14283
+ "descriptionKey": "ui.agent.tasks.workflows.exportRoster",
14284
+ "uiActions": [],
14285
+ "apiActions": [
14286
+ "task.export"
14287
+ ]
14288
+ },
14289
+ {
14290
+ "name": "edit_task",
14291
+ "safety": "write",
14292
+ "description": "Edit the selected task from its row action.",
14293
+ "descriptionKey": "ui.agent.tasks.workflows.editTask",
14294
+ "uiActions": [
14295
+ "data-table.get_selection"
14296
+ ],
14297
+ "stateReads": [
14298
+ "data-table.selection"
14299
+ ],
14300
+ "apiActions": [
14301
+ "task.update"
14302
+ ]
14303
+ },
14304
+ {
14305
+ "name": "delete_task",
14306
+ "safety": "destructive",
14307
+ "description": "Delete the selected task from its row action. Completed tasks cannot be deleted. Irreversible.",
14308
+ "descriptionKey": "ui.agent.tasks.workflows.deleteTask",
14309
+ "uiActions": [
14310
+ "data-table.get_selection",
14311
+ "data-table.clear_selection"
14312
+ ],
14313
+ "stateReads": [
14314
+ "data-table.selection"
14315
+ ],
14316
+ "apiActions": [
14317
+ "task.delete"
14318
+ ]
14319
+ }
14320
+ ]
14321
+ },
11469
14322
  {
11470
14323
  "kind": "pattern",
11471
14324
  "id": "two-factor-login",
@@ -11636,6 +14489,156 @@
11636
14489
  ]
11637
14490
  }
11638
14491
  ]
14492
+ },
14493
+ {
14494
+ "kind": "pattern",
14495
+ "id": "warehouse",
14496
+ "composes": [
14497
+ {
14498
+ "component": "data-table",
14499
+ "as": "inventory",
14500
+ "entity": "inventoryItem"
14501
+ },
14502
+ {
14503
+ "component": "icon-button-group",
14504
+ "as": "tableActions"
14505
+ },
14506
+ {
14507
+ "component": "icon-button",
14508
+ "as": "tableAction"
14509
+ },
14510
+ {
14511
+ "component": "badge",
14512
+ "as": "statusBadge"
14513
+ },
14514
+ {
14515
+ "component": "switch",
14516
+ "as": "compactActionsToggle"
14517
+ },
14518
+ {
14519
+ "component": "dialog",
14520
+ "as": "importDialog"
14521
+ },
14522
+ {
14523
+ "component": "file-upload",
14524
+ "as": "xmlUpload"
14525
+ }
14526
+ ],
14527
+ "workflows": [
14528
+ {
14529
+ "name": "filter_inventory",
14530
+ "safety": "read",
14531
+ "description": "Narrow the inventory by product, SKU, category, supplier or stock status using the per-column filters.",
14532
+ "descriptionKey": "ui.agent.warehouse.workflows.filterInventory",
14533
+ "uiActions": [
14534
+ "data-table.apply_filter"
14535
+ ],
14536
+ "stateReads": [
14537
+ "data-table.filter"
14538
+ ],
14539
+ "apiActions": [
14540
+ "inventory.list"
14541
+ ]
14542
+ },
14543
+ {
14544
+ "name": "sort_inventory",
14545
+ "safety": "read",
14546
+ "description": "Re-sort the inventory by any column (e.g. in-stock, total value, last restocked).",
14547
+ "descriptionKey": "ui.agent.warehouse.workflows.sortInventory",
14548
+ "uiActions": [
14549
+ "data-table.sort_by"
14550
+ ],
14551
+ "stateReads": [
14552
+ "data-table.sort"
14553
+ ],
14554
+ "apiActions": []
14555
+ },
14556
+ {
14557
+ "name": "compact_actions",
14558
+ "safety": "read",
14559
+ "description": "Toggle the ColumnToggle settings-footer switch to compact the per-row action column.",
14560
+ "descriptionKey": "ui.agent.warehouse.workflows.compactActions",
14561
+ "uiActions": [
14562
+ "switch.set_checked"
14563
+ ],
14564
+ "stateReads": [
14565
+ "switch.checked"
14566
+ ],
14567
+ "apiActions": []
14568
+ },
14569
+ {
14570
+ "name": "export_inventory",
14571
+ "safety": "read",
14572
+ "description": "Export the current (optionally filtered) inventory from the page-header table-tools cluster — CSV / Excel / PDF.",
14573
+ "descriptionKey": "ui.agent.warehouse.workflows.exportInventory",
14574
+ "uiActions": [],
14575
+ "apiActions": [
14576
+ "inventory.export"
14577
+ ]
14578
+ },
14579
+ {
14580
+ "name": "stock_in",
14581
+ "safety": "write",
14582
+ "description": "Record incoming stock for the selected item from its row action.",
14583
+ "descriptionKey": "ui.agent.warehouse.workflows.stockIn",
14584
+ "uiActions": [
14585
+ "data-table.get_selection"
14586
+ ],
14587
+ "stateReads": [
14588
+ "data-table.selection"
14589
+ ],
14590
+ "apiActions": [
14591
+ "inventory.stockIn"
14592
+ ]
14593
+ },
14594
+ {
14595
+ "name": "stock_out",
14596
+ "safety": "write",
14597
+ "description": "Record outgoing stock for the selected item from its row action.",
14598
+ "descriptionKey": "ui.agent.warehouse.workflows.stockOut",
14599
+ "uiActions": [
14600
+ "data-table.get_selection"
14601
+ ],
14602
+ "stateReads": [
14603
+ "data-table.selection"
14604
+ ],
14605
+ "apiActions": [
14606
+ "inventory.stockOut"
14607
+ ]
14608
+ },
14609
+ {
14610
+ "name": "edit_item",
14611
+ "safety": "write",
14612
+ "description": "Edit the selected inventory item (e.g. min-stock threshold, supplier) from its row action.",
14613
+ "descriptionKey": "ui.agent.warehouse.workflows.editItem",
14614
+ "uiActions": [
14615
+ "data-table.get_selection"
14616
+ ],
14617
+ "stateReads": [
14618
+ "data-table.selection"
14619
+ ],
14620
+ "apiActions": [
14621
+ "inventory.update"
14622
+ ]
14623
+ },
14624
+ {
14625
+ "name": "import_fatturapa",
14626
+ "safety": "write",
14627
+ "description": "Open the FatturaPA XML import dialog, upload supplier e-invoice XML files, review the classified line preview, deselect any unwanted lines, and confirm to create articles and stock movements.",
14628
+ "descriptionKey": "ui.agent.warehouse.workflows.importFatturapa",
14629
+ "uiActions": [
14630
+ "dialog.open",
14631
+ "file-upload.clear"
14632
+ ],
14633
+ "stateReads": [
14634
+ "dialog.isOpen",
14635
+ "file-upload.files"
14636
+ ],
14637
+ "apiActions": [
14638
+ "inventory.importFatturapa"
14639
+ ]
14640
+ }
14641
+ ]
11639
14642
  }
11640
14643
  ]
11641
14644
  }