@mistriwork/mistri 1.0.0-rc.12 → 1.0.0-rc.13

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 (221) hide show
  1. package/README.md +4 -3
  2. package/dist/client/assets/LayoutBuilder-MPzkVU2e.js.map +1 -1
  3. package/dist/client/assets/index-D2dHI6hR.js.map +1 -1
  4. package/dist/client/assets/shell-TreN_uLs.js.map +1 -1
  5. package/dist/docs/access-model.md +1 -1
  6. package/dist/docs/build-and-deploy.md +0 -1
  7. package/dist/docs/cli.md +1 -1
  8. package/dist/docs/glossary.md +3 -3
  9. package/dist/docs/query.md +9 -21
  10. package/dist/docs/status.md +3 -3
  11. package/dist/embed/react/chunks/LayoutBuilder-Cbxa_wve.js.map +1 -1
  12. package/dist/embed/react/chunks/app-0UZ1Re1k.js.map +1 -1
  13. package/dist/embed/react/chunks/page-Bx4o1kpQ.js.map +1 -1
  14. package/dist/embed/react/chunks/palette-Bb7Lf6eo.js.map +1 -1
  15. package/dist/embed/react/chunks/shell-DZRACiB9.js.map +1 -1
  16. package/dist/embed/react/chunks/write-BQO4CFc9.js.map +1 -1
  17. package/dist/embed/react/index.js +1 -1
  18. package/dist/server/build/dockerfile.js +1 -1
  19. package/dist/server/cli/usage.js +2 -2
  20. package/dist/ui/index.js +2 -2
  21. package/dist/ui/page.js +2 -2
  22. package/dist/ui/{shared-N4Ej8yRD.js → shared-1PD7TOTJ.js} +5 -5
  23. package/dist/ui/{shared-N4Ej8yRD.js.map → shared-1PD7TOTJ.js.map} +1 -1
  24. package/dist/ui/{shared-D5m86-4o.js → shared-1gMnOu9J.js} +6 -6
  25. package/dist/ui/{shared-D5m86-4o.js.map → shared-1gMnOu9J.js.map} +1 -1
  26. package/dist/ui/{shared-Ctaj8mR2.js → shared-5RQMi4BR.js} +3 -3
  27. package/dist/ui/{shared-Ctaj8mR2.js.map → shared-5RQMi4BR.js.map} +1 -1
  28. package/dist/ui/{shared-DpLeIATZ.js → shared-B-BUF9fx.js} +2 -2
  29. package/dist/ui/{shared-DpLeIATZ.js.map → shared-B-BUF9fx.js.map} +1 -1
  30. package/dist/ui/{shared-DWYnjItP.js → shared-B-MhiPIN.js} +9 -9
  31. package/dist/ui/{shared-DWYnjItP.js.map → shared-B-MhiPIN.js.map} +1 -1
  32. package/dist/ui/{shared-0fNuhSbG.js → shared-B07qIMlE.js} +5 -5
  33. package/dist/ui/{shared-0fNuhSbG.js.map → shared-B07qIMlE.js.map} +1 -1
  34. package/dist/ui/{shared-lYtMadRU.js → shared-B1SAS_J-.js} +3 -3
  35. package/dist/ui/{shared-lYtMadRU.js.map → shared-B1SAS_J-.js.map} +1 -1
  36. package/dist/ui/{shared-CpI0Y8M5.js → shared-B4jgU8h9.js} +6 -6
  37. package/dist/ui/{shared-CpI0Y8M5.js.map → shared-B4jgU8h9.js.map} +1 -1
  38. package/dist/ui/{shared-Cxu1c35l.js → shared-B5aBCUi7.js} +30 -30
  39. package/dist/ui/{shared-Cxu1c35l.js.map → shared-B5aBCUi7.js.map} +1 -1
  40. package/dist/ui/{shared-CAe-US1q.js → shared-B9H7_Pji.js} +5 -5
  41. package/dist/ui/{shared-CAe-US1q.js.map → shared-B9H7_Pji.js.map} +1 -1
  42. package/dist/ui/{shared-Q2bgBaYo.js → shared-BAXr20S-.js} +4 -4
  43. package/dist/ui/{shared-Q2bgBaYo.js.map → shared-BAXr20S-.js.map} +1 -1
  44. package/dist/ui/{shared-CyEefFFb.js → shared-BDDUzH-f.js} +19 -19
  45. package/dist/ui/{shared-CyEefFFb.js.map → shared-BDDUzH-f.js.map} +1 -1
  46. package/dist/ui/{shared-BdhPI6dq.js → shared-BGmkeDeW.js} +3 -3
  47. package/dist/ui/{shared-BdhPI6dq.js.map → shared-BGmkeDeW.js.map} +1 -1
  48. package/dist/ui/{shared-DONIpq2q.js → shared-BHCQ60yN.js} +2 -2
  49. package/dist/ui/{shared-DONIpq2q.js.map → shared-BHCQ60yN.js.map} +1 -1
  50. package/dist/ui/{shared-CNmaAv64.js → shared-BHsjawAG.js} +8 -8
  51. package/dist/ui/{shared-CNmaAv64.js.map → shared-BHsjawAG.js.map} +1 -1
  52. package/dist/ui/{shared-DgjU9kOy.js → shared-BIQuK_nq.js} +4 -4
  53. package/dist/ui/{shared-DgjU9kOy.js.map → shared-BIQuK_nq.js.map} +1 -1
  54. package/dist/ui/{shared-icSQAj21.js → shared-BOe4W2FI.js} +3 -3
  55. package/dist/ui/{shared-icSQAj21.js.map → shared-BOe4W2FI.js.map} +1 -1
  56. package/dist/ui/{shared-BlxoOJSk.js → shared-BPpC08ip.js} +3 -3
  57. package/dist/ui/{shared-BlxoOJSk.js.map → shared-BPpC08ip.js.map} +1 -1
  58. package/dist/ui/{shared-BtiFL37J.js → shared-BdA3LPCB.js} +2 -2
  59. package/dist/ui/{shared-BtiFL37J.js.map → shared-BdA3LPCB.js.map} +1 -1
  60. package/dist/ui/{shared-CvR94vn4.js → shared-Be3nbWsd.js} +11 -11
  61. package/dist/ui/{shared-CvR94vn4.js.map → shared-Be3nbWsd.js.map} +1 -1
  62. package/dist/ui/{shared-Bl_nF_IH.js → shared-Bf30ZLoS.js} +8 -4
  63. package/dist/ui/shared-Bf30ZLoS.js.map +1 -0
  64. package/dist/ui/{shared-DijrJ_V-.js → shared-BguP_BaR.js} +7 -7
  65. package/dist/ui/{shared-DijrJ_V-.js.map → shared-BguP_BaR.js.map} +1 -1
  66. package/dist/ui/{shared-DPAVoWY0.js → shared-BoLbc2WD.js} +17 -2
  67. package/dist/ui/{shared-DPAVoWY0.js.map → shared-BoLbc2WD.js.map} +1 -1
  68. package/dist/ui/{shared-BkdBTYwx.js → shared-BttyOW4W.js} +3 -3
  69. package/dist/ui/{shared-BkdBTYwx.js.map → shared-BttyOW4W.js.map} +1 -1
  70. package/dist/ui/{shared-CQWLz8uT.js → shared-BumxsBlA.js} +10 -10
  71. package/dist/ui/{shared-CQWLz8uT.js.map → shared-BumxsBlA.js.map} +1 -1
  72. package/dist/ui/{shared-Dzu7tFiC.js → shared-Bw73ktBk.js} +3 -3
  73. package/dist/ui/{shared-Dzu7tFiC.js.map → shared-Bw73ktBk.js.map} +1 -1
  74. package/dist/ui/{shared-BhAYErSx.js → shared-C1B0GH0e.js} +4 -4
  75. package/dist/ui/{shared-BhAYErSx.js.map → shared-C1B0GH0e.js.map} +1 -1
  76. package/dist/ui/{shared-BQJQcGgj.js → shared-C2FsyYr7.js} +4 -4
  77. package/dist/ui/{shared-BQJQcGgj.js.map → shared-C2FsyYr7.js.map} +1 -1
  78. package/dist/ui/{shared-B9lw2Ryh.js → shared-C2RU1qjv.js} +4 -4
  79. package/dist/ui/{shared-B9lw2Ryh.js.map → shared-C2RU1qjv.js.map} +1 -1
  80. package/dist/ui/{shared-DQYNI9wO.js → shared-C42f07hJ.js} +5 -5
  81. package/dist/ui/{shared-DQYNI9wO.js.map → shared-C42f07hJ.js.map} +1 -1
  82. package/dist/ui/{shared-CqCZ8wMY.js → shared-C4LkPCU4.js} +3 -3
  83. package/dist/ui/{shared-CqCZ8wMY.js.map → shared-C4LkPCU4.js.map} +1 -1
  84. package/dist/ui/{shared-BhtpgOpa.js → shared-C4wSfz6k.js} +9 -9
  85. package/dist/ui/{shared-BhtpgOpa.js.map → shared-C4wSfz6k.js.map} +1 -1
  86. package/dist/ui/{shared-BHc2Izkj.js → shared-C9DZtSFH.js} +2 -2
  87. package/dist/ui/{shared-BHc2Izkj.js.map → shared-C9DZtSFH.js.map} +1 -1
  88. package/dist/ui/{shared-DW1YuiNS.js → shared-CA52ClGo.js} +2 -2
  89. package/dist/ui/{shared-DW1YuiNS.js.map → shared-CA52ClGo.js.map} +1 -1
  90. package/dist/ui/{shared-BbSbilkh.js → shared-CBciTwm6.js} +9 -9
  91. package/dist/ui/{shared-BbSbilkh.js.map → shared-CBciTwm6.js.map} +1 -1
  92. package/dist/ui/{shared-C-J32eBn.js → shared-CL3RLKDA.js} +16 -16
  93. package/dist/ui/{shared-C-J32eBn.js.map → shared-CL3RLKDA.js.map} +1 -1
  94. package/dist/ui/{shared-Ck8S4OxW.js → shared-CLq3-_hW.js} +3 -3
  95. package/dist/ui/{shared-Ck8S4OxW.js.map → shared-CLq3-_hW.js.map} +1 -1
  96. package/dist/ui/{shared-Q5WefT7G.js → shared-CMjK-Ucd.js} +3 -3
  97. package/dist/ui/{shared-Q5WefT7G.js.map → shared-CMjK-Ucd.js.map} +1 -1
  98. package/dist/ui/{shared-D3MAuEA3.js → shared-CPjpSFGh.js} +2 -2
  99. package/dist/ui/{shared-D3MAuEA3.js.map → shared-CPjpSFGh.js.map} +1 -1
  100. package/dist/ui/{shared-VshXGwXP.js → shared-CSPhENq3.js} +2 -2
  101. package/dist/ui/{shared-VshXGwXP.js.map → shared-CSPhENq3.js.map} +1 -1
  102. package/dist/ui/{shared-DJrJaE73.js → shared-CZJE4Bmp.js} +3 -3
  103. package/dist/ui/{shared-DJrJaE73.js.map → shared-CZJE4Bmp.js.map} +1 -1
  104. package/dist/ui/{shared-D7ONOwI7.js → shared-C_BhUL2I.js} +7 -7
  105. package/dist/ui/{shared-D7ONOwI7.js.map → shared-C_BhUL2I.js.map} +1 -1
  106. package/dist/ui/{shared-j-2peBIB.js → shared-CbeujwdU.js} +4 -4
  107. package/dist/ui/{shared-j-2peBIB.js.map → shared-CbeujwdU.js.map} +1 -1
  108. package/dist/ui/{shared-D5GrOEa2.js → shared-Cbf-o4Dt.js} +4 -4
  109. package/dist/ui/{shared-D5GrOEa2.js.map → shared-Cbf-o4Dt.js.map} +1 -1
  110. package/dist/ui/{shared-HwiPIajr.js → shared-CdNmeNHh.js} +3 -3
  111. package/dist/ui/{shared-HwiPIajr.js.map → shared-CdNmeNHh.js.map} +1 -1
  112. package/dist/ui/{shared-ZCFt-CPb.js → shared-CdQOMD8J.js} +3 -3
  113. package/dist/ui/{shared-ZCFt-CPb.js.map → shared-CdQOMD8J.js.map} +1 -1
  114. package/dist/ui/{shared-ClhXSGGK.js → shared-CdiPYlTh.js} +2 -2
  115. package/dist/ui/{shared-ClhXSGGK.js.map → shared-CdiPYlTh.js.map} +1 -1
  116. package/dist/ui/{shared-DA8_pVRZ.js → shared-CepLAhwm.js} +2 -2
  117. package/dist/ui/{shared-DA8_pVRZ.js.map → shared-CepLAhwm.js.map} +1 -1
  118. package/dist/ui/{shared-BrYKjrnM.js → shared-Ch82h_Fu.js} +6 -6
  119. package/dist/ui/{shared-BrYKjrnM.js.map → shared-Ch82h_Fu.js.map} +1 -1
  120. package/dist/ui/{shared-C4UrE8Fb.js → shared-Chp88all.js} +3 -3
  121. package/dist/ui/{shared-C4UrE8Fb.js.map → shared-Chp88all.js.map} +1 -1
  122. package/dist/ui/{shared-CWa80DTO.js → shared-Ci16s2rN.js} +9 -9
  123. package/dist/ui/{shared-CWa80DTO.js.map → shared-Ci16s2rN.js.map} +1 -1
  124. package/dist/ui/{shared-tksTLD6Q.js → shared-CiqNkoE1.js} +5 -5
  125. package/dist/ui/{shared-tksTLD6Q.js.map → shared-CiqNkoE1.js.map} +1 -1
  126. package/dist/ui/{shared-yt7DjSrq.js → shared-CpMhOq8F.js} +2 -2
  127. package/dist/ui/{shared-yt7DjSrq.js.map → shared-CpMhOq8F.js.map} +1 -1
  128. package/dist/ui/{shared-Dm0z5WUl.js → shared-CrWv5JKH.js} +6 -6
  129. package/dist/ui/{shared-Dm0z5WUl.js.map → shared-CrWv5JKH.js.map} +1 -1
  130. package/dist/ui/{shared-CQL3FGHc.js → shared-Csfi3Pti.js} +2 -2
  131. package/dist/ui/{shared-CQL3FGHc.js.map → shared-Csfi3Pti.js.map} +1 -1
  132. package/dist/ui/{shared-BKNRbm-V.js → shared-CuZt26rm.js} +2 -2
  133. package/dist/ui/{shared-BKNRbm-V.js.map → shared-CuZt26rm.js.map} +1 -1
  134. package/dist/ui/{shared-Guq3upiR.js → shared-Cws_z-TS.js} +2 -2
  135. package/dist/ui/{shared-Guq3upiR.js.map → shared-Cws_z-TS.js.map} +1 -1
  136. package/dist/ui/{shared-Bw_qZeIj.js → shared-D1KWuCg6.js} +2 -2
  137. package/dist/ui/{shared-Bw_qZeIj.js.map → shared-D1KWuCg6.js.map} +1 -1
  138. package/dist/ui/{shared-CuCZKwXW.js → shared-D66ju_Cb.js} +23 -23
  139. package/dist/ui/{shared-CuCZKwXW.js.map → shared-D66ju_Cb.js.map} +1 -1
  140. package/dist/ui/{shared-DYfX7NSM.js → shared-DGaQZXnw.js} +2 -2
  141. package/dist/ui/{shared-DYfX7NSM.js.map → shared-DGaQZXnw.js.map} +1 -1
  142. package/dist/ui/{shared-B3Hp8tOv.js → shared-DHy41sET.js} +6 -6
  143. package/dist/ui/{shared-B3Hp8tOv.js.map → shared-DHy41sET.js.map} +1 -1
  144. package/dist/ui/{shared-CXyd7IKi.js → shared-DKEOMQ6l.js} +2 -2
  145. package/dist/ui/{shared-CXyd7IKi.js.map → shared-DKEOMQ6l.js.map} +1 -1
  146. package/dist/ui/{shared-Ccmc8YO0.js → shared-DSUICuaJ.js} +33 -33
  147. package/dist/ui/{shared-Ccmc8YO0.js.map → shared-DSUICuaJ.js.map} +1 -1
  148. package/dist/ui/{shared-CL2iw_js.js → shared-DUPMRoO0.js} +13 -13
  149. package/dist/ui/{shared-CL2iw_js.js.map → shared-DUPMRoO0.js.map} +1 -1
  150. package/dist/ui/{shared-Dtp4eRul.js → shared-DVfdm6ah.js} +2 -2
  151. package/dist/ui/{shared-Dtp4eRul.js.map → shared-DVfdm6ah.js.map} +1 -1
  152. package/dist/ui/{shared-BJ5Ex32G.js → shared-DXM7d7lJ.js} +3 -3
  153. package/dist/ui/{shared-BJ5Ex32G.js.map → shared-DXM7d7lJ.js.map} +1 -1
  154. package/dist/ui/{shared-BFr6ld0e.js → shared-DXbMlcev.js} +2 -2
  155. package/dist/ui/{shared-BFr6ld0e.js.map → shared-DXbMlcev.js.map} +1 -1
  156. package/dist/ui/{shared-BUp3jv-N.js → shared-D_SkPtJ9.js} +6 -6
  157. package/dist/ui/{shared-BUp3jv-N.js.map → shared-D_SkPtJ9.js.map} +1 -1
  158. package/dist/ui/{shared-CdNomVzH.js → shared-Dd21k2ic.js} +4 -4
  159. package/dist/ui/{shared-CdNomVzH.js.map → shared-Dd21k2ic.js.map} +1 -1
  160. package/dist/ui/{shared-gRMbxmpu.js → shared-Dh0nHtLZ.js} +8 -8
  161. package/dist/ui/{shared-gRMbxmpu.js.map → shared-Dh0nHtLZ.js.map} +1 -1
  162. package/dist/ui/{shared-BKGJgjog.js → shared-DkOdSpSK.js} +3 -3
  163. package/dist/ui/{shared-BKGJgjog.js.map → shared-DkOdSpSK.js.map} +1 -1
  164. package/dist/ui/{shared-BMsh72Uq.js → shared-Dkph5ckT.js} +2 -2
  165. package/dist/ui/{shared-BMsh72Uq.js.map → shared-Dkph5ckT.js.map} +1 -1
  166. package/dist/ui/{shared-Be1HpDOB.js → shared-Dl1_Nx--.js} +3 -3
  167. package/dist/ui/{shared-Be1HpDOB.js.map → shared-Dl1_Nx--.js.map} +1 -1
  168. package/dist/ui/{shared-BQIZWOoJ.js → shared-Dm0IGbAf.js} +2 -2
  169. package/dist/ui/{shared-BQIZWOoJ.js.map → shared-Dm0IGbAf.js.map} +1 -1
  170. package/dist/ui/{shared-DSUtcU5S.js → shared-DnIkTpPr.js} +5 -5
  171. package/dist/ui/{shared-DSUtcU5S.js.map → shared-DnIkTpPr.js.map} +1 -1
  172. package/dist/ui/{shared-DsxGbYlV.js → shared-Docl_0tq.js} +3 -3
  173. package/dist/ui/{shared-DsxGbYlV.js.map → shared-Docl_0tq.js.map} +1 -1
  174. package/dist/ui/{shared-DZskrV26.js → shared-DprrHC72.js} +2 -2
  175. package/dist/ui/{shared-DZskrV26.js.map → shared-DprrHC72.js.map} +1 -1
  176. package/dist/ui/{shared-Bmw43Hwf.js → shared-DyKsJTZs.js} +2 -2
  177. package/dist/ui/{shared-Bmw43Hwf.js.map → shared-DyKsJTZs.js.map} +1 -1
  178. package/dist/ui/{shared-BLG88Pya.js → shared-FO7vfI3F.js} +4 -4
  179. package/dist/ui/{shared-BLG88Pya.js.map → shared-FO7vfI3F.js.map} +1 -1
  180. package/dist/ui/{shared-DLSd80D1.js → shared-HalAVHjv.js} +3 -3
  181. package/dist/ui/{shared-DLSd80D1.js.map → shared-HalAVHjv.js.map} +1 -1
  182. package/dist/ui/{shared-D1mMBLdj.js → shared-JvcI-LWp.js} +15 -15
  183. package/dist/ui/{shared-D1mMBLdj.js.map → shared-JvcI-LWp.js.map} +1 -1
  184. package/dist/ui/{shared-C6Hv_4O0.js → shared-K7Ym27yg.js} +2 -2
  185. package/dist/ui/{shared-C6Hv_4O0.js.map → shared-K7Ym27yg.js.map} +1 -1
  186. package/dist/ui/{shared-B39ln7oi.js → shared-SzlnwfJO.js} +3 -3
  187. package/dist/ui/{shared-B39ln7oi.js.map → shared-SzlnwfJO.js.map} +1 -1
  188. package/dist/ui/{shared-DgPn_Jll.js → shared-TrGbd1FY.js} +3 -3
  189. package/dist/ui/{shared-DgPn_Jll.js.map → shared-TrGbd1FY.js.map} +1 -1
  190. package/dist/ui/{shared-DrFb-XtA.js → shared-WhbuObEW.js} +2 -2
  191. package/dist/ui/{shared-DrFb-XtA.js.map → shared-WhbuObEW.js.map} +1 -1
  192. package/dist/ui/{shared-DiFQljcq.js → shared-XcSKDp6N.js} +11 -11
  193. package/dist/ui/{shared-DiFQljcq.js.map → shared-XcSKDp6N.js.map} +1 -1
  194. package/dist/ui/{shared-CMAg58rY.js → shared-Z4uBJU6I.js} +7 -6
  195. package/dist/ui/shared-Z4uBJU6I.js.map +1 -0
  196. package/dist/ui/{shared-BnUptuUp.js → shared-bAgeiRa5.js} +2 -2
  197. package/dist/ui/{shared-BnUptuUp.js.map → shared-bAgeiRa5.js.map} +1 -1
  198. package/dist/ui/{shared-BxMvSjey.js → shared-cgXG7OgZ.js} +5 -5
  199. package/dist/ui/{shared-BxMvSjey.js.map → shared-cgXG7OgZ.js.map} +1 -1
  200. package/dist/ui/{shared-u4CG2kQJ.js → shared-eZ0SB_zm.js} +2 -2
  201. package/dist/ui/{shared-u4CG2kQJ.js.map → shared-eZ0SB_zm.js.map} +1 -1
  202. package/dist/ui/{shared-L90bWW8e.js → shared-frKFb79C.js} +2 -2
  203. package/dist/ui/{shared-L90bWW8e.js.map → shared-frKFb79C.js.map} +1 -1
  204. package/dist/ui/{shared-Dd34nhkw.js → shared-hAayNSRA.js} +3 -3
  205. package/dist/ui/{shared-Dd34nhkw.js.map → shared-hAayNSRA.js.map} +1 -1
  206. package/dist/ui/{shared-DzC64cpp.js → shared-j_J16p2B.js} +2 -2
  207. package/dist/ui/{shared-DzC64cpp.js.map → shared-j_J16p2B.js.map} +1 -1
  208. package/dist/ui/{shared-DX7HRIV-.js → shared-tqpl5N3g.js} +6 -6
  209. package/dist/ui/{shared-DX7HRIV-.js.map → shared-tqpl5N3g.js.map} +1 -1
  210. package/dist/ui/{shared-BS5dBMpA.js → shared-y-6_ZDts.js} +2 -2
  211. package/dist/ui/{shared-BS5dBMpA.js.map → shared-y-6_ZDts.js.map} +1 -1
  212. package/dist/ui/{shared-Cv5v_MP1.js → shared-zG6e1Rhz.js} +13 -13
  213. package/dist/ui/{shared-Cv5v_MP1.js.map → shared-zG6e1Rhz.js.map} +1 -1
  214. package/dist/ui/testing.js +1 -1
  215. package/package.json +4 -4
  216. package/dist/docs/cli-browser.md +0 -232
  217. package/dist/docs/database-browser.md +0 -115
  218. package/dist/docs/keyboard.md +0 -63
  219. package/dist/docs/mcp.md +0 -86
  220. package/dist/ui/shared-Bl_nF_IH.js.map +0 -1
  221. package/dist/ui/shared-CMAg58rY.js.map +0 -1
package/README.md CHANGED
@@ -27,7 +27,7 @@ App build to run on the supported Node 24 runtime; TypeScript examples also
27
27
  have an explicit typecheck (TypeScript 7 or later, the native compiler), and `mistri build` is the optional production
28
28
  step that runs it, validates the App and bundles it — see
29
29
  [Build and deploy an App](https://mistriwork.dev/docs/build-and-deploy/).
30
- These App features ship in mistri 1.0.0-rc.12; the
30
+ These App features ship in mistri 1.0.0-rc.13; the
31
31
  [status page](https://mistriwork.dev/docs/status/) says what is stable
32
32
  and what comes next. Start with the sample catalog (`examples/apps/README.md`),
33
33
  written for people and coding agents, then the [App DSL reference](https://mistriwork.dev/docs/app-dsl/) (the same pages read offline with `npx @mistriwork/mistri docs`).
@@ -375,8 +375,9 @@ mistri mail-dns [<config>] the SPF, DKIM and DMARC records tenant mail is sen
375
375
  --dev serve the dev observer at /_mistri/observe
376
376
  (loopback only, in memory, credentials masked)
377
377
  and, with an App, the theme bench at /_theme
378
- --mcp speak MCP on stdio instead of serving HTTP
379
- (the database browser's tools; no App)
378
+ --mcp the database browser's MCP server: refused,
379
+ naming npx tablewalk --mcp (an App's MCP is
380
+ --app-mcp)
380
381
  --export <fmt> print the schema as md, mermaid, json, brief or types
381
382
  (a .d.ts of this connection's names for the app
382
383
  DSL), then exit; openapi exports one App's API
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutBuilder-MPzkVU2e.js","names":["say","say","useRef","useState","useState","_Fragment","__toESM","require_react","findTable","tableAtPrefix","defineMessages","state","require_jsx_runtime","promptFor","import_react","say$1","import_jsx_runtime","FieldArranger","n","list","dragging","setDragging","sending","setSending","focusAt","setFocusAt","chosen","move","to","from","next","item","onChange","remove","at","i","handOver","other","name","onSend","sendTo","others","rest","all","heading","columns","e","label","typeOf","k","say","childOf","fk","f","section","LayoutBuilder","bump","applied","onApplied","preview","onPreview","canEdit","index","delta","draft","saving","hasRecovery","table","recoverySourceChanged","onRecover","recoveryStatus","error","onReset","onCancel","onSave","SectionCard","isList","child","rename","onMove","count","ListChoices","FieldChoices","prefix","source","qualify","types","c","s","path"],"sources":["../../../../kit/src/client/copy/record/components/FieldArranger.ts","../../../../kit/src/client/components/FieldArranger.tsx","../../../../kit/src/client/copy/record/components/LayoutBuilder.ts","../../../../kit/src/client/components/LayoutBuilder.tsx"],"sourcesContent":["/** What FieldArranger says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n fields: 'Fields',\n ofDragToArrange: '{chosenCount} of {allCount} · drag to arrange',\n everyFieldInTheTables: 'Every field, in the table’s own order',\n none: 'None',\n position: '{name} — position {i} of {chosenCount}',\n moveThisFieldToAnother: 'Move this field to another group',\n moveToAnotherGroup: 'Move {name} to another group',\n takeThisFieldOff: 'Take this field off the {noun}',\n remove: 'Remove {name}',\n noFieldsInThisGroup: 'No fields in this group yet.',\n everyField: 'Every field is on the {noun}',\n addToThisGroup: 'Add {name} to this group',\n add: 'Add {name}',\n});\n","/**\n * Arranging a group of fields: which ones, and in what order. Drag to\n * reorder, Alt+arrows for the keyboard, × to take one off, a pool of the\n * rest to add from, and — when there are other groups — a way to send a\n * field to one of them. Controlled: the parent owns the list and hears\n * every change. The vanilla twin in `arrange.js` serves the page builder\n * until that room crosses over.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { say } from '../copy/record/components/FieldArranger.js';\n\ninterface OtherGroup {\n title: string;\n receive: (name: string) => void;\n}\ninterface FieldArrangerProps {\n all: string[];\n chosen: string[];\n columns?: number;\n /** What a field is taken off — \"page\", \"layout\". */\n noun?: string;\n /** The panel's own label, or null where whatever it sits in already says what these are. */\n heading?: string | null;\n label?: (name: string) => string;\n typeOf?: (name: string) => string;\n onChange: (next: string[]) => void;\n /** Identity of this group, for cross-group drags. */\n owner?: unknown;\n others?: OtherGroup[];\n /** Redraw everything after a hand-over: two groups change and the other one may be open. */\n onSend?: () => void;\n}\n\n/** The field being dragged between groups, or null. */\nlet carried: { name: string; owner: unknown; take: () => void } | null = null;\nexport const carriedField = () => carried;\n\nexport function FieldArranger({\n all,\n chosen,\n columns = 1,\n noun = 'layout',\n heading = say('fields'),\n label = (n) => n,\n typeOf = () => '',\n onChange,\n owner,\n others = [],\n onSend,\n}: FieldArrangerProps) {\n const list = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState<number | null>(null);\n const [sending, setSending] = useState<number | null>(null);\n const [focusAt, setFocusAt] = useState(-1);\n useEffect(() => {\n if (focusAt < 0) return;\n (list.current?.children[focusAt] as HTMLElement | undefined)?.focus();\n setFocusAt(-1);\n }, [focusAt, chosen]);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= chosen.length || from === to) return;\n const next = [...chosen];\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n onChange(next);\n setFocusAt(to);\n };\n const remove = (i: number) => onChange(chosen.filter((_, at) => at !== i));\n const handOver = (name: string, i: number, other: OtherGroup) => {\n onChange(chosen.filter((_, at) => at !== i));\n other.receive(name);\n setSending(null);\n onSend?.();\n };\n const sendTo = (name: string, i: number) => {\n if (others.length === 1) {\n handOver(name, i, others[0]);\n return;\n }\n /* More than one candidate, so it is a choice — made in the row rather than in a dialog, which would cover the thing being arranged. */\n setSending(i);\n };\n const rest = all.filter((n) => !chosen.includes(n));\n return (\n <div className=\"pb-panel\">\n <div className=\"pb-panel-head\">\n {heading ? <span className=\"pb-label\">{heading}</span> : null}\n <span className=\"pb-field-count\">{say('ofDragToArrange', { chosenCount: chosen.length, allCount: all.length })}</span>\n <span className=\"pb-spacer\" />\n <button type=\"button\" className=\"ghost\" title={say('everyFieldInTheTables')} onClick={() => onChange([...all])}>\n {say('common.all')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onChange([])}>\n {say('none')}\n </button>\n </div>\n <div ref={list} className=\"pb-arrange\" style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}>\n {chosen.length ? (\n chosen.map((name, i) => (\n <div\n key={name}\n className={`pb-arrange-row${dragging === i ? ' dragging' : ''}`}\n draggable\n tabIndex={0}\n role=\"listitem\"\n aria-label={say('position', { name, i: i + 1, chosenCount: chosen.length })}\n onDragStart={(e) => {\n setDragging(i);\n /* Also offered to every other group's row: reordering inside this list and carrying to another group are the same grip. */\n carried = { name, owner, take: () => onChange(chosen.filter((n) => n !== name)) };\n e.dataTransfer.effectAllowed = 'move';\n /* Firefox will not start a drag without something on the transfer; the payload is never read. */\n e.dataTransfer.setData('text/plain', name);\n }}\n onDragEnd={() => {\n setDragging(null);\n carried = null;\n }}\n onDragOver={(e) => {\n if (dragging === null || dragging === i) return;\n e.preventDefault();\n const next = [...chosen];\n const [item] = next.splice(dragging, 1);\n next.splice(i, 0, item);\n setDragging(i);\n onChange(next);\n }}\n onDrop={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (!e.altKey) return;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n move(i, i - 1);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n move(i, i + 1);\n }\n }}\n >\n <span className=\"pb-grip\" aria-hidden=\"true\">\n ∷\n </span>\n <span className=\"pb-field-name\" title={name}>\n {label(name)}\n </span>\n <span className=\"pb-field-type\">{typeOf(name)}</span>\n {others.length ? (\n <button\n type=\"button\"\n className=\"ghost pb-send\"\n title={say('moveThisFieldToAnother')}\n aria-label={say('moveToAnotherGroup', { name })}\n onClick={() => sendTo(name, i)}\n >\n →\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"ghost pb-remove\"\n title={say('takeThisFieldOff', { noun })}\n aria-label={say('remove', { name })}\n onClick={() => remove(i)}\n >\n ×\n </button>\n {sending === i ? (\n <div className=\"pb-send-menu\">\n {others.map((other, k) => (\n <button key={other.title} type=\"button\" className=\"ghost\" autoFocus={k === 0} onClick={() => handOver(name, i, other)}>\n {other.title}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))\n ) : (\n <p className=\"note\">{say('noFieldsInThisGroup')}</p>\n )}\n </div>\n <div className=\"pb-pool\">\n <span className=\"pb-label\">{rest.length ? say('common.add') : say('everyField', { noun })}</span>\n {rest.map((name) => (\n /* Named for what pressing it does: the visible text is the field's own name, which reads as a label to anyone hearing the page one element at a time. */\n <button\n key={name}\n type=\"button\"\n className=\"ghost pb-add-field\"\n title={say('addToThisGroup', { name })}\n aria-label={say('add', { name })}\n onClick={() => onChange([...chosen, name])}\n >\n {label(name)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","/** What LayoutBuilder says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n fields: 'Fields',\n discardDraft: 'Discard draft',\n recordLayout: 'Record layout',\n layoutName: 'Layout name',\n defaultLayout: 'Default layout',\n anUnsavedDraftIsAvailable: 'An unsaved draft is available. The saved layout has changed since it was started.',\n anUnsavedLayoutDraft: 'An unsaved layout draft is available.',\n restoreDraft: 'Restore draft',\n anotherEditorChangedTheRecovery: 'Another editor changed the recovery copy. This draft is kept in this tab only.',\n browserRecoveryIsUnavailable: 'Browser recovery is unavailable. Keep this tab open until the layout is saved.',\n resetToDefault: 'Reset to default',\n saveLayout: 'Save layout',\n renameSection: 'Rename section',\n heading: 'Heading',\n tableNamed: 'table · {table}',\n thatReferenceIsNoLonger: 'That reference is no longer in the schema.',\n thatRelationshipIsNoLonger: 'That relationship is no longer in the schema.',\n rowsOnThePage: 'Rows on the page',\n for: 'for {name}',\n block: 'block {i}',\n fieldsKind: 'fields',\n});\n","/**\n * The record layout editor: the sections of a record, each on or off,\n * reordered, renamed, and its fields arranged — with the record beside it\n * updating as you change it. The draft is one mutable object the record\n * view also reads (`template.js` holds it), so a change here is a mutation\n * and a redraw, not a copy.\n */\nimport { useState } from 'react';\nimport { findTable, state, tableAtPrefix } from '../core.js';\nimport { promptFor } from '../prompt.js';\nimport { DEFAULT_LIST_LIMIT } from '@mistriwork/engine/shared/recordview.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { FieldArranger } from './FieldArranger.js';\nimport type { RecoveryStatus } from '../draftRecovery.js';\nimport { say } from '../copy/record/components/LayoutBuilder.js';\n\nexport interface Section {\n kind: 'fields' | 'list';\n title?: string;\n off?: boolean;\n paths: string[];\n via?: string;\n columns: string[];\n limit?: number;\n}\nexport interface Template {\n id: string;\n name?: string;\n base: string;\n sections: Section[];\n}\nexport interface LayoutBuilderProps {\n draft: Template;\n table: TableMeta;\n /** The record beside the builder redraws, a beat later. */\n onPreview: () => void;\n /** Both redraw now. */\n onApplied: () => void;\n onReset: () => void;\n onCancel: () => void;\n onSave: () => void;\n saving?: boolean;\n error?: string;\n recoveryStatus?: RecoveryStatus;\n hasRecovery?: boolean;\n recoverySourceChanged?: boolean;\n onRecover?: (restore: boolean) => void;\n canEdit?: () => boolean;\n}\n\nfunction childOf(section: Section): TableMeta | null {\n const fk = (state as { schema: { foreignKeys: Array<{ name: string; from: { table: string } }> } }).schema.foreignKeys.find(\n (f) => f.name === section.via,\n );\n return fk ? ((findTable(fk.from.table) as TableMeta | undefined) ?? null) : null;\n}\n\nexport function LayoutBuilder({\n draft,\n table,\n onPreview,\n onApplied,\n onReset,\n onCancel,\n onSave,\n saving = false,\n error,\n recoveryStatus,\n hasRecovery = false,\n recoverySourceChanged,\n onRecover,\n canEdit = () => true,\n}: LayoutBuilderProps) {\n const [, bump] = useState(0);\n const applied = () => {\n bump((n) => n + 1);\n onApplied();\n };\n const preview = () => {\n bump((n) => n + 1);\n onPreview();\n };\n const move = (index: number, delta: number) => {\n if (!canEdit()) return;\n const next = index + delta;\n if (next < 0 || next >= draft.sections.length) return;\n const [section] = draft.sections.splice(index, 1);\n draft.sections.splice(next, 0, section);\n applied();\n };\n return (\n <>\n <div className=\"tpl-head\">\n <div className=\"tpl-title\">\n <span className=\"tpl-eyebrow\">{say('recordLayout')}</span>\n <input\n type=\"text\"\n className=\"tpl-name\"\n value={draft.name ?? ''}\n disabled={saving || hasRecovery}\n aria-label={say('layoutName')}\n placeholder={say('defaultLayout')}\n spellCheck={false}\n onChange={(e) => {\n if (canEdit()) {\n draft.name = e.currentTarget.value;\n preview();\n }\n }}\n />\n <span className=\"tpl-for\">{say('for', { name: table.name })}</span>\n </div>\n {hasRecovery ? (\n <div className=\"tpl-recovery\" role=\"status\">\n <p>{recoverySourceChanged ? say('anUnsavedDraftIsAvailable') : say('anUnsavedLayoutDraft')}</p>\n <div className=\"tpl-head-actions\">\n <button type=\"button\" onClick={() => onRecover?.(true)}>\n {say('restoreDraft')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onRecover?.(false)}>\n {say('discardDraft')}\n </button>\n </div>\n </div>\n ) : null}\n {recoveryStatus === 'unavailable' || recoveryStatus === 'conflict' ? (\n <p className=\"tpl-error\" role=\"alert\">\n {recoveryStatus === 'conflict' ? say('anotherEditorChangedTheRecovery') : say('browserRecoveryIsUnavailable')}\n </p>\n ) : null}\n {error ? (\n <p className=\"tpl-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className=\"tpl-head-actions\">\n <button type=\"button\" className=\"ghost\" disabled={saving || hasRecovery} onClick={onReset}>\n {say('resetToDefault')}\n </button>\n <button type=\"button\" className=\"ghost\" disabled={saving} onClick={onCancel}>\n {say('common.cancel')}\n </button>\n <button type=\"button\" disabled={saving || hasRecovery} onClick={onSave}>\n {saving ? 'Saving...' : say('saveLayout')}\n </button>\n </div>\n </div>\n <div className=\"tpl-body\" inert={saving || hasRecovery} aria-busy={saving}>\n {draft.sections.map((section, index) => (\n <SectionCard\n key={`${section.kind}:${section.via ?? ''}:${index}`}\n section={section}\n index={index}\n count={draft.sections.length}\n draft={draft}\n table={table}\n onMove={(delta) => move(index, delta)}\n applied={applied}\n preview={preview}\n canEdit={canEdit}\n />\n ))}\n </div>\n </>\n );\n}\n\nfunction SectionCard({\n section,\n index,\n count,\n draft,\n table,\n onMove,\n applied,\n preview,\n canEdit,\n}: {\n section: Section;\n index: number;\n count: number;\n draft: Template;\n table: TableMeta;\n onMove: (delta: number) => void;\n applied: () => void;\n preview: () => void;\n canEdit: () => boolean;\n}) {\n const isList = section.kind === 'list';\n const child = isList ? childOf(section) : null;\n const rename = async () => {\n const name = await promptFor({\n title: say('renameSection'),\n label: say('heading'),\n value: section.title ?? '',\n confirmLabel: say('common.rename'),\n hint: undefined,\n placeholder: undefined,\n });\n if (name === null || !canEdit()) return;\n section.title = name.trim() || undefined;\n applied();\n };\n return (\n <section className={`tpl-section${section.off ? ' off' : ''}`}>\n <div className=\"tpl-section-head\">\n <label className=\"tpl-toggle\">\n <input\n type=\"checkbox\"\n checked={!section.off}\n onChange={(e) => {\n section.off = !e.currentTarget.checked;\n applied();\n }}\n />\n <span className=\"tpl-section-name\">{section.title ?? say('fields')}</span>\n </label>\n <span className=\"tpl-section-kind\">\n {isList ? say('tableNamed', { table: (child ? child.name : section.via) ?? '' }) : say('fieldsKind')}\n </span>\n <div className=\"tpl-section-actions\">\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveUp')}\n aria-label={say('common.moveUp')}\n disabled={index === 0}\n onClick={() => onMove(-1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveDown')}\n aria-label={say('common.moveDown')}\n disabled={index === count - 1}\n onClick={() => onMove(1)}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.rename')}\n aria-label={say('renameSection')}\n onClick={() => void rename()}\n >\n ✎\n </button>\n </div>\n </div>\n {section.off ? null : isList ? (\n <ListChoices section={section} child={child} applied={applied} preview={preview} />\n ) : (\n <FieldChoices section={section} draft={draft} table={table} applied={applied} preview={preview} />\n )}\n </section>\n );\n}\n\nfunction FieldChoices({\n section,\n draft,\n table,\n applied,\n preview,\n}: {\n section: Section;\n draft: Template;\n table: TableMeta;\n applied: () => void;\n preview: () => void;\n}) {\n /* The candidates are the columns of whichever table the section's paths point into. */\n const prefix = section.paths[0]?.includes('.') ? section.paths[0].slice(0, section.paths[0].lastIndexOf('.')) : '';\n const source = (prefix ? tableAtPrefix(table.id, prefix) : table) as TableMeta | null | undefined;\n if (!source) return <p className=\"note\">{say('thatReferenceIsNoLonger')}</p>;\n const qualify = (name: string) => (prefix ? `${prefix}.${name}` : name);\n const types = new Map(source.columns.map((c) => [qualify(c.name), c.type.toLowerCase()]));\n const others = draft.sections\n .map((s, i) => ({ s, i }))\n .filter(({ s }) => s.kind === 'fields' && s !== section && !s.off)\n .map(({ s, i }) => ({\n title: s.title || say('block', { i: i + 1 }),\n receive: (name: string) => {\n if (!s.paths.includes(name)) s.paths = [...s.paths, name];\n },\n }));\n return (\n <FieldArranger\n all={source.columns.map((c) => qualify(c.name))}\n chosen={section.paths}\n /* No label of its own: the card this sits in is headed with the block's name. */\n heading={null}\n label={(path) => (prefix && path.startsWith(`${prefix}.`) ? path.slice(prefix.length + 1) : path)}\n typeOf={(path) => types.get(path) ?? ''}\n owner={section}\n onChange={(next) => {\n section.paths = next;\n preview();\n }}\n others={others}\n onSend={applied}\n />\n );\n}\n\nfunction ListChoices({\n section,\n child,\n applied,\n preview,\n}: {\n section: Section;\n child: TableMeta | null;\n applied: () => void;\n preview: () => void;\n}) {\n if (!child) return <p className=\"note\">{say('thatRelationshipIsNoLonger')}</p>;\n const types = new Map(child.columns.map((c) => [c.name, c.type.toLowerCase()]));\n return (\n <div>\n {/* The same arranger as a field block, because a list's columns are the same kind of choice. */}\n <FieldArranger\n heading={say('common.columns')}\n all={child.columns.map((c) => c.name)}\n chosen={section.columns}\n typeOf={(name) => types.get(name) ?? ''}\n owner={section}\n onChange={(next) => {\n section.columns = next;\n preview();\n }}\n />\n <label className=\"tpl-rows\">\n <span>{say('rowsOnThePage')}</span>\n <input\n type=\"number\"\n min={1}\n max={50}\n defaultValue={String(section.limit ?? (DEFAULT_LIST_LIMIT as number))}\n onChange={(e) => {\n section.limit = Math.max(1, Math.min(50, Number(e.currentTarget.value) || 8));\n applied();\n }}\n />\n </label>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LayoutBuilder-MPzkVU2e.js","names":["say","say","useRef","useState","useState","_Fragment","__toESM","require_react","findTable","tableAtPrefix","defineMessages","state","require_jsx_runtime","promptFor","import_react","say$1","import_jsx_runtime","FieldArranger","n","list","dragging","setDragging","sending","setSending","focusAt","setFocusAt","chosen","move","to","from","next","item","onChange","remove","at","i","handOver","other","name","onSend","sendTo","others","rest","all","heading","columns","e","label","typeOf","k","say","childOf","fk","f","section","LayoutBuilder","bump","applied","onApplied","preview","onPreview","canEdit","index","delta","draft","saving","hasRecovery","table","recoverySourceChanged","onRecover","recoveryStatus","error","onReset","onCancel","onSave","SectionCard","isList","child","rename","onMove","count","ListChoices","FieldChoices","prefix","source","qualify","types","c","s","path"],"sources":["../../../../kit/src/client/copy/record/components/FieldArranger.ts","../../../../kit/src/client/components/FieldArranger.tsx","../../../../kit/src/client/copy/record/components/LayoutBuilder.ts","../../../../kit/src/client/components/LayoutBuilder.tsx"],"sourcesContent":["/** What FieldArranger says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n fields: 'Fields',\n ofDragToArrange: '{chosenCount} of {allCount} · drag to arrange',\n everyFieldInTheTables: 'Every field, in the table’s own order',\n none: 'None',\n position: '{name} — position {i} of {chosenCount}',\n moveThisFieldToAnother: 'Move this field to another group',\n moveToAnotherGroup: 'Move {name} to another group',\n takeThisFieldOff: 'Take this field off the {noun}',\n remove: 'Remove {name}',\n noFieldsInThisGroup: 'No fields in this group yet.',\n everyField: 'Every field is on the {noun}',\n addToThisGroup: 'Add {name} to this group',\n add: 'Add {name}',\n});\n","/**\n * Arranging a group of fields: which ones, and in what order. Drag to\n * reorder, Alt+arrows for the keyboard, × to take one off, a pool of the\n * rest to add from, and — when there are other groups — a way to send a\n * field to one of them. Controlled: the parent owns the list and hears\n * every change. The vanilla twin in `arrange.js` serves the page builder\n * until that room crosses over.\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { say } from '../copy/record/components/FieldArranger.js';\n\ninterface OtherGroup {\n title: string;\n receive: (name: string) => void;\n}\ninterface FieldArrangerProps {\n all: string[];\n chosen: string[];\n columns?: number;\n /** What a field is taken off — \"page\", \"layout\". */\n noun?: string;\n /** The panel's own label, or null where whatever it sits in already says what these are. */\n heading?: string | null;\n label?: (name: string) => string;\n typeOf?: (name: string) => string;\n onChange: (next: string[]) => void;\n /** Identity of this group, for cross-group drags. */\n owner?: unknown;\n others?: OtherGroup[];\n /** Redraw everything after a hand-over: two groups change and the other one may be open. */\n onSend?: () => void;\n}\n\n/** The field being dragged between groups, or null. */\nlet carried: { name: string; owner: unknown; take: () => void } | null = null;\n/** @public the database browser's (scripts/boundary/entries.json, \"host\") */\nexport const carriedField = () => carried;\n\nexport function FieldArranger({\n all,\n chosen,\n columns = 1,\n noun = 'layout',\n heading = say('fields'),\n label = (n) => n,\n typeOf = () => '',\n onChange,\n owner,\n others = [],\n onSend,\n}: FieldArrangerProps) {\n const list = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState<number | null>(null);\n const [sending, setSending] = useState<number | null>(null);\n const [focusAt, setFocusAt] = useState(-1);\n useEffect(() => {\n if (focusAt < 0) return;\n (list.current?.children[focusAt] as HTMLElement | undefined)?.focus();\n setFocusAt(-1);\n }, [focusAt, chosen]);\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= chosen.length || from === to) return;\n const next = [...chosen];\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n onChange(next);\n setFocusAt(to);\n };\n const remove = (i: number) => onChange(chosen.filter((_, at) => at !== i));\n const handOver = (name: string, i: number, other: OtherGroup) => {\n onChange(chosen.filter((_, at) => at !== i));\n other.receive(name);\n setSending(null);\n onSend?.();\n };\n const sendTo = (name: string, i: number) => {\n if (others.length === 1) {\n handOver(name, i, others[0]);\n return;\n }\n /* More than one candidate, so it is a choice — made in the row rather than in a dialog, which would cover the thing being arranged. */\n setSending(i);\n };\n const rest = all.filter((n) => !chosen.includes(n));\n return (\n <div className=\"pb-panel\">\n <div className=\"pb-panel-head\">\n {heading ? <span className=\"pb-label\">{heading}</span> : null}\n <span className=\"pb-field-count\">{say('ofDragToArrange', { chosenCount: chosen.length, allCount: all.length })}</span>\n <span className=\"pb-spacer\" />\n <button type=\"button\" className=\"ghost\" title={say('everyFieldInTheTables')} onClick={() => onChange([...all])}>\n {say('common.all')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onChange([])}>\n {say('none')}\n </button>\n </div>\n <div ref={list} className=\"pb-arrange\" style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}>\n {chosen.length ? (\n chosen.map((name, i) => (\n <div\n key={name}\n className={`pb-arrange-row${dragging === i ? ' dragging' : ''}`}\n draggable\n tabIndex={0}\n role=\"listitem\"\n aria-label={say('position', { name, i: i + 1, chosenCount: chosen.length })}\n onDragStart={(e) => {\n setDragging(i);\n /* Also offered to every other group's row: reordering inside this list and carrying to another group are the same grip. */\n carried = { name, owner, take: () => onChange(chosen.filter((n) => n !== name)) };\n e.dataTransfer.effectAllowed = 'move';\n /* Firefox will not start a drag without something on the transfer; the payload is never read. */\n e.dataTransfer.setData('text/plain', name);\n }}\n onDragEnd={() => {\n setDragging(null);\n carried = null;\n }}\n onDragOver={(e) => {\n if (dragging === null || dragging === i) return;\n e.preventDefault();\n const next = [...chosen];\n const [item] = next.splice(dragging, 1);\n next.splice(i, 0, item);\n setDragging(i);\n onChange(next);\n }}\n onDrop={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (!e.altKey) return;\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n move(i, i - 1);\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n move(i, i + 1);\n }\n }}\n >\n <span className=\"pb-grip\" aria-hidden=\"true\">\n ∷\n </span>\n <span className=\"pb-field-name\" title={name}>\n {label(name)}\n </span>\n <span className=\"pb-field-type\">{typeOf(name)}</span>\n {others.length ? (\n <button\n type=\"button\"\n className=\"ghost pb-send\"\n title={say('moveThisFieldToAnother')}\n aria-label={say('moveToAnotherGroup', { name })}\n onClick={() => sendTo(name, i)}\n >\n →\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"ghost pb-remove\"\n title={say('takeThisFieldOff', { noun })}\n aria-label={say('remove', { name })}\n onClick={() => remove(i)}\n >\n ×\n </button>\n {sending === i ? (\n <div className=\"pb-send-menu\">\n {others.map((other, k) => (\n <button key={other.title} type=\"button\" className=\"ghost\" autoFocus={k === 0} onClick={() => handOver(name, i, other)}>\n {other.title}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ))\n ) : (\n <p className=\"note\">{say('noFieldsInThisGroup')}</p>\n )}\n </div>\n <div className=\"pb-pool\">\n <span className=\"pb-label\">{rest.length ? say('common.add') : say('everyField', { noun })}</span>\n {rest.map((name) => (\n /* Named for what pressing it does: the visible text is the field's own name, which reads as a label to anyone hearing the page one element at a time. */\n <button\n key={name}\n type=\"button\"\n className=\"ghost pb-add-field\"\n title={say('addToThisGroup', { name })}\n aria-label={say('add', { name })}\n onClick={() => onChange([...chosen, name])}\n >\n {label(name)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","/** What LayoutBuilder says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n fields: 'Fields',\n discardDraft: 'Discard draft',\n recordLayout: 'Record layout',\n layoutName: 'Layout name',\n defaultLayout: 'Default layout',\n anUnsavedDraftIsAvailable: 'An unsaved draft is available. The saved layout has changed since it was started.',\n anUnsavedLayoutDraft: 'An unsaved layout draft is available.',\n restoreDraft: 'Restore draft',\n anotherEditorChangedTheRecovery: 'Another editor changed the recovery copy. This draft is kept in this tab only.',\n browserRecoveryIsUnavailable: 'Browser recovery is unavailable. Keep this tab open until the layout is saved.',\n resetToDefault: 'Reset to default',\n saveLayout: 'Save layout',\n renameSection: 'Rename section',\n heading: 'Heading',\n tableNamed: 'table · {table}',\n thatReferenceIsNoLonger: 'That reference is no longer in the schema.',\n thatRelationshipIsNoLonger: 'That relationship is no longer in the schema.',\n rowsOnThePage: 'Rows on the page',\n for: 'for {name}',\n block: 'block {i}',\n fieldsKind: 'fields',\n});\n","/**\n * The record layout editor: the sections of a record, each on or off,\n * reordered, renamed, and its fields arranged — with the record beside it\n * updating as you change it. The draft is one mutable object the record\n * view also reads (`template.js` holds it), so a change here is a mutation\n * and a redraw, not a copy.\n */\nimport { useState } from 'react';\nimport { findTable, state, tableAtPrefix } from '../core.js';\nimport { promptFor } from '../prompt.js';\nimport { DEFAULT_LIST_LIMIT } from '@mistriwork/engine/shared/recordview.js';\nimport type { TableMeta } from '@mistriwork/engine/shared/schema.js';\nimport { FieldArranger } from './FieldArranger.js';\nimport type { RecoveryStatus } from '../draftRecovery.js';\nimport { say } from '../copy/record/components/LayoutBuilder.js';\n\nexport interface Section {\n kind: 'fields' | 'list';\n title?: string;\n off?: boolean;\n paths: string[];\n via?: string;\n columns: string[];\n limit?: number;\n}\nexport interface Template {\n id: string;\n name?: string;\n base: string;\n sections: Section[];\n}\nexport interface LayoutBuilderProps {\n draft: Template;\n table: TableMeta;\n /** The record beside the builder redraws, a beat later. */\n onPreview: () => void;\n /** Both redraw now. */\n onApplied: () => void;\n onReset: () => void;\n onCancel: () => void;\n onSave: () => void;\n saving?: boolean;\n error?: string;\n recoveryStatus?: RecoveryStatus;\n hasRecovery?: boolean;\n recoverySourceChanged?: boolean;\n onRecover?: (restore: boolean) => void;\n canEdit?: () => boolean;\n}\n\nfunction childOf(section: Section): TableMeta | null {\n const fk = (state as { schema: { foreignKeys: Array<{ name: string; from: { table: string } }> } }).schema.foreignKeys.find(\n (f) => f.name === section.via,\n );\n return fk ? ((findTable(fk.from.table) as TableMeta | undefined) ?? null) : null;\n}\n\nexport function LayoutBuilder({\n draft,\n table,\n onPreview,\n onApplied,\n onReset,\n onCancel,\n onSave,\n saving = false,\n error,\n recoveryStatus,\n hasRecovery = false,\n recoverySourceChanged,\n onRecover,\n canEdit = () => true,\n}: LayoutBuilderProps) {\n const [, bump] = useState(0);\n const applied = () => {\n bump((n) => n + 1);\n onApplied();\n };\n const preview = () => {\n bump((n) => n + 1);\n onPreview();\n };\n const move = (index: number, delta: number) => {\n if (!canEdit()) return;\n const next = index + delta;\n if (next < 0 || next >= draft.sections.length) return;\n const [section] = draft.sections.splice(index, 1);\n draft.sections.splice(next, 0, section);\n applied();\n };\n return (\n <>\n <div className=\"tpl-head\">\n <div className=\"tpl-title\">\n <span className=\"tpl-eyebrow\">{say('recordLayout')}</span>\n <input\n type=\"text\"\n className=\"tpl-name\"\n value={draft.name ?? ''}\n disabled={saving || hasRecovery}\n aria-label={say('layoutName')}\n placeholder={say('defaultLayout')}\n spellCheck={false}\n onChange={(e) => {\n if (canEdit()) {\n draft.name = e.currentTarget.value;\n preview();\n }\n }}\n />\n <span className=\"tpl-for\">{say('for', { name: table.name })}</span>\n </div>\n {hasRecovery ? (\n <div className=\"tpl-recovery\" role=\"status\">\n <p>{recoverySourceChanged ? say('anUnsavedDraftIsAvailable') : say('anUnsavedLayoutDraft')}</p>\n <div className=\"tpl-head-actions\">\n <button type=\"button\" onClick={() => onRecover?.(true)}>\n {say('restoreDraft')}\n </button>\n <button type=\"button\" className=\"ghost\" onClick={() => onRecover?.(false)}>\n {say('discardDraft')}\n </button>\n </div>\n </div>\n ) : null}\n {recoveryStatus === 'unavailable' || recoveryStatus === 'conflict' ? (\n <p className=\"tpl-error\" role=\"alert\">\n {recoveryStatus === 'conflict' ? say('anotherEditorChangedTheRecovery') : say('browserRecoveryIsUnavailable')}\n </p>\n ) : null}\n {error ? (\n <p className=\"tpl-error\" role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className=\"tpl-head-actions\">\n <button type=\"button\" className=\"ghost\" disabled={saving || hasRecovery} onClick={onReset}>\n {say('resetToDefault')}\n </button>\n <button type=\"button\" className=\"ghost\" disabled={saving} onClick={onCancel}>\n {say('common.cancel')}\n </button>\n <button type=\"button\" disabled={saving || hasRecovery} onClick={onSave}>\n {saving ? 'Saving...' : say('saveLayout')}\n </button>\n </div>\n </div>\n <div className=\"tpl-body\" inert={saving || hasRecovery} aria-busy={saving}>\n {draft.sections.map((section, index) => (\n <SectionCard\n key={`${section.kind}:${section.via ?? ''}:${index}`}\n section={section}\n index={index}\n count={draft.sections.length}\n draft={draft}\n table={table}\n onMove={(delta) => move(index, delta)}\n applied={applied}\n preview={preview}\n canEdit={canEdit}\n />\n ))}\n </div>\n </>\n );\n}\n\nfunction SectionCard({\n section,\n index,\n count,\n draft,\n table,\n onMove,\n applied,\n preview,\n canEdit,\n}: {\n section: Section;\n index: number;\n count: number;\n draft: Template;\n table: TableMeta;\n onMove: (delta: number) => void;\n applied: () => void;\n preview: () => void;\n canEdit: () => boolean;\n}) {\n const isList = section.kind === 'list';\n const child = isList ? childOf(section) : null;\n const rename = async () => {\n const name = await promptFor({\n title: say('renameSection'),\n label: say('heading'),\n value: section.title ?? '',\n confirmLabel: say('common.rename'),\n hint: undefined,\n placeholder: undefined,\n });\n if (name === null || !canEdit()) return;\n section.title = name.trim() || undefined;\n applied();\n };\n return (\n <section className={`tpl-section${section.off ? ' off' : ''}`}>\n <div className=\"tpl-section-head\">\n <label className=\"tpl-toggle\">\n <input\n type=\"checkbox\"\n checked={!section.off}\n onChange={(e) => {\n section.off = !e.currentTarget.checked;\n applied();\n }}\n />\n <span className=\"tpl-section-name\">{section.title ?? say('fields')}</span>\n </label>\n <span className=\"tpl-section-kind\">\n {isList ? say('tableNamed', { table: (child ? child.name : section.via) ?? '' }) : say('fieldsKind')}\n </span>\n <div className=\"tpl-section-actions\">\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveUp')}\n aria-label={say('common.moveUp')}\n disabled={index === 0}\n onClick={() => onMove(-1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.moveDown')}\n aria-label={say('common.moveDown')}\n disabled={index === count - 1}\n onClick={() => onMove(1)}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"tpl-move\"\n title={say('common.rename')}\n aria-label={say('renameSection')}\n onClick={() => void rename()}\n >\n ✎\n </button>\n </div>\n </div>\n {section.off ? null : isList ? (\n <ListChoices section={section} child={child} applied={applied} preview={preview} />\n ) : (\n <FieldChoices section={section} draft={draft} table={table} applied={applied} preview={preview} />\n )}\n </section>\n );\n}\n\nfunction FieldChoices({\n section,\n draft,\n table,\n applied,\n preview,\n}: {\n section: Section;\n draft: Template;\n table: TableMeta;\n applied: () => void;\n preview: () => void;\n}) {\n /* The candidates are the columns of whichever table the section's paths point into. */\n const prefix = section.paths[0]?.includes('.') ? section.paths[0].slice(0, section.paths[0].lastIndexOf('.')) : '';\n const source = (prefix ? tableAtPrefix(table.id, prefix) : table) as TableMeta | null | undefined;\n if (!source) return <p className=\"note\">{say('thatReferenceIsNoLonger')}</p>;\n const qualify = (name: string) => (prefix ? `${prefix}.${name}` : name);\n const types = new Map(source.columns.map((c) => [qualify(c.name), c.type.toLowerCase()]));\n const others = draft.sections\n .map((s, i) => ({ s, i }))\n .filter(({ s }) => s.kind === 'fields' && s !== section && !s.off)\n .map(({ s, i }) => ({\n title: s.title || say('block', { i: i + 1 }),\n receive: (name: string) => {\n if (!s.paths.includes(name)) s.paths = [...s.paths, name];\n },\n }));\n return (\n <FieldArranger\n all={source.columns.map((c) => qualify(c.name))}\n chosen={section.paths}\n /* No label of its own: the card this sits in is headed with the block's name. */\n heading={null}\n label={(path) => (prefix && path.startsWith(`${prefix}.`) ? path.slice(prefix.length + 1) : path)}\n typeOf={(path) => types.get(path) ?? ''}\n owner={section}\n onChange={(next) => {\n section.paths = next;\n preview();\n }}\n others={others}\n onSend={applied}\n />\n );\n}\n\nfunction ListChoices({\n section,\n child,\n applied,\n preview,\n}: {\n section: Section;\n child: TableMeta | null;\n applied: () => void;\n preview: () => void;\n}) {\n if (!child) return <p className=\"note\">{say('thatRelationshipIsNoLonger')}</p>;\n const types = new Map(child.columns.map((c) => [c.name, c.type.toLowerCase()]));\n return (\n <div>\n {/* The same arranger as a field block, because a list's columns are the same kind of choice. */}\n <FieldArranger\n heading={say('common.columns')}\n all={child.columns.map((c) => c.name)}\n chosen={section.columns}\n typeOf={(name) => types.get(name) ?? ''}\n owner={section}\n onChange={(next) => {\n section.columns = next;\n preview();\n }}\n />\n <label className=\"tpl-rows\">\n <span>{say('rowsOnThePage')}</span>\n <input\n type=\"number\"\n min={1}\n max={50}\n defaultValue={String(section.limit ?? (DEFAULT_LIST_LIMIT as number))}\n onChange={(e) => {\n section.limit = Math.max(1, Math.min(50, Number(e.currentTarget.value) || 8));\n applied();\n }}\n />\n </label>\n </div>\n );\n}\n"],"mappings":"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"}