@adminiumjs/adminium 0.1.0-rc.1

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 (875) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +94 -0
  3. package/dashboard/assets/DeltaPill-dxlsGh-1.js +2 -0
  4. package/dashboard/assets/DeltaPill-dxlsGh-1.js.map +1 -0
  5. package/dashboard/assets/DistributionCorrelationWidgets-ztVy_W_R.js +2 -0
  6. package/dashboard/assets/DistributionCorrelationWidgets-ztVy_W_R.js.map +1 -0
  7. package/dashboard/assets/PartWholeWidgets-BDn0i0jt.js +2 -0
  8. package/dashboard/assets/PartWholeWidgets-BDn0i0jt.js.map +1 -0
  9. package/dashboard/assets/RemapEditor-z3vRY12e.js +2 -0
  10. package/dashboard/assets/RemapEditor-z3vRY12e.js.map +1 -0
  11. package/dashboard/assets/ReviewScreen-COkLQ3T7.js +2 -0
  12. package/dashboard/assets/ReviewScreen-COkLQ3T7.js.map +1 -0
  13. package/dashboard/assets/Sparkline-Cvwo368J.js +2 -0
  14. package/dashboard/assets/Sparkline-Cvwo368J.js.map +1 -0
  15. package/dashboard/assets/WidgetMissingCard-D0bPJKIs.js +2 -0
  16. package/dashboard/assets/WidgetMissingCard-D0bPJKIs.js.map +1 -0
  17. package/dashboard/assets/arc-CPxb74pf.js +2 -0
  18. package/dashboard/assets/arc-CPxb74pf.js.map +1 -0
  19. package/dashboard/assets/bars-ranking-components-9Asn_0gR.js +2 -0
  20. package/dashboard/assets/bars-ranking-components-9Asn_0gR.js.map +1 -0
  21. package/dashboard/assets/blocks-track-components-BST-NjK2.js +2 -0
  22. package/dashboard/assets/blocks-track-components-BST-NjK2.js.map +1 -0
  23. package/dashboard/assets/calendar-track-components-RgNtGtZR.js +2 -0
  24. package/dashboard/assets/calendar-track-components-RgNtGtZR.js.map +1 -0
  25. package/dashboard/assets/chrome-track-components-ClNsentC.js +2 -0
  26. package/dashboard/assets/chrome-track-components-ClNsentC.js.map +1 -0
  27. package/dashboard/assets/common-BY1j__bD.js +2 -0
  28. package/dashboard/assets/common-BY1j__bD.js.map +1 -0
  29. package/dashboard/assets/common-BdlXKpcB.js +2 -0
  30. package/dashboard/assets/common-BdlXKpcB.js.map +1 -0
  31. package/dashboard/assets/common-BqqhgMgB.js +2 -0
  32. package/dashboard/assets/common-BqqhgMgB.js.map +1 -0
  33. package/dashboard/assets/common-BribWmIo.js +2 -0
  34. package/dashboard/assets/common-BribWmIo.js.map +1 -0
  35. package/dashboard/assets/common-Cmf0_lKV.js +2 -0
  36. package/dashboard/assets/common-Cmf0_lKV.js.map +1 -0
  37. package/dashboard/assets/common-i0r48qY9.js +2 -0
  38. package/dashboard/assets/common-i0r48qY9.js.map +1 -0
  39. package/dashboard/assets/common-x8cfkwpc.js +2 -0
  40. package/dashboard/assets/common-x8cfkwpc.js.map +1 -0
  41. package/dashboard/assets/communication-track-components-CNLZXOH_.js +2 -0
  42. package/dashboard/assets/communication-track-components-CNLZXOH_.js.map +1 -0
  43. package/dashboard/assets/components-Bp5cFm2d.js +2 -0
  44. package/dashboard/assets/components-Bp5cFm2d.js.map +1 -0
  45. package/dashboard/assets/components-C4-O3_gD.js +2 -0
  46. package/dashboard/assets/components-C4-O3_gD.js.map +1 -0
  47. package/dashboard/assets/domain-ops-track-components-BPa41AU7.js +2 -0
  48. package/dashboard/assets/domain-ops-track-components-BPa41AU7.js.map +1 -0
  49. package/dashboard/assets/domain-track-components-CQ1i1X1t.js +2 -0
  50. package/dashboard/assets/domain-track-components-CQ1i1X1t.js.map +1 -0
  51. package/dashboard/assets/errors-BHUWiAQ3.js +2 -0
  52. package/dashboard/assets/errors-BHUWiAQ3.js.map +1 -0
  53. package/dashboard/assets/errors-BbyKweDG.js +2 -0
  54. package/dashboard/assets/errors-BbyKweDG.js.map +1 -0
  55. package/dashboard/assets/errors-CMQ6JC31.js +2 -0
  56. package/dashboard/assets/errors-CMQ6JC31.js.map +1 -0
  57. package/dashboard/assets/errors-D3nVgTmf.js +2 -0
  58. package/dashboard/assets/errors-D3nVgTmf.js.map +1 -0
  59. package/dashboard/assets/errors-IqJSoANC.js +2 -0
  60. package/dashboard/assets/errors-IqJSoANC.js.map +1 -0
  61. package/dashboard/assets/errors-gmIkO9F6.js +2 -0
  62. package/dashboard/assets/errors-gmIkO9F6.js.map +1 -0
  63. package/dashboard/assets/errors-vFk058Vh.js +2 -0
  64. package/dashboard/assets/errors-vFk058Vh.js.map +1 -0
  65. package/dashboard/assets/feeds-track-f-components-Cl_8SkGs.js +2 -0
  66. package/dashboard/assets/feeds-track-f-components-Cl_8SkGs.js.map +1 -0
  67. package/dashboard/assets/format-Lx4cQ8k-.js +2 -0
  68. package/dashboard/assets/format-Lx4cQ8k-.js.map +1 -0
  69. package/dashboard/assets/forms-track-components-Bc2Hoxdh.js +2 -0
  70. package/dashboard/assets/forms-track-components-Bc2Hoxdh.js.map +1 -0
  71. package/dashboard/assets/generated-1EfWhCMA.js +2 -0
  72. package/dashboard/assets/generated-1EfWhCMA.js.map +1 -0
  73. package/dashboard/assets/generated-BB3ZMxvx.js +2 -0
  74. package/dashboard/assets/generated-BB3ZMxvx.js.map +1 -0
  75. package/dashboard/assets/generated-C0JVNBRX.js +2 -0
  76. package/dashboard/assets/generated-C0JVNBRX.js.map +1 -0
  77. package/dashboard/assets/generated-C1W48_-3.js +2 -0
  78. package/dashboard/assets/generated-C1W48_-3.js.map +1 -0
  79. package/dashboard/assets/generated-CluiB_xY.js +2 -0
  80. package/dashboard/assets/generated-CluiB_xY.js.map +1 -0
  81. package/dashboard/assets/generated-DDGtlf-4.js +2 -0
  82. package/dashboard/assets/generated-DDGtlf-4.js.map +1 -0
  83. package/dashboard/assets/generated-DPCHvNto.js +2 -0
  84. package/dashboard/assets/generated-DPCHvNto.js.map +1 -0
  85. package/dashboard/assets/geo-track-components-Ct4-MSRw.js +3 -0
  86. package/dashboard/assets/geo-track-components-Ct4-MSRw.js.map +1 -0
  87. package/dashboard/assets/ibm-plex-sans-arabic-arabic-400-normal-CyU-ddYS.woff2 +0 -0
  88. package/dashboard/assets/ibm-plex-sans-arabic-arabic-500-normal-C4MQITzh.woff2 +0 -0
  89. package/dashboard/assets/ibm-plex-sans-arabic-arabic-600-normal-0pRdybE_.woff2 +0 -0
  90. package/dashboard/assets/ibm-plex-sans-arabic-arabic-700-normal-DrtBj6UE.woff2 +0 -0
  91. package/dashboard/assets/index-DPi4cduu.css +1 -0
  92. package/dashboard/assets/index-PB1II0WV.js +137 -0
  93. package/dashboard/assets/index-PB1II0WV.js.map +1 -0
  94. package/dashboard/assets/jetbrains-mono-latin-ext-wght-italic-BrDczivE.woff2 +0 -0
  95. package/dashboard/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  96. package/dashboard/assets/jetbrains-mono-latin-wght-italic-B2M6KQje.woff2 +0 -0
  97. package/dashboard/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  98. package/dashboard/assets/leaflet-CIGW-MKW.css +1 -0
  99. package/dashboard/assets/leaflet-src-D12shr04.js +2 -0
  100. package/dashboard/assets/leaflet-src-D12shr04.js.map +1 -0
  101. package/dashboard/assets/manrope-latin-ext-wght-normal-Ch3YOpNY.woff2 +0 -0
  102. package/dashboard/assets/manrope-latin-wght-normal-DHIcAJRg.woff2 +0 -0
  103. package/dashboard/assets/media-track-components-CpeII-tT.js +2 -0
  104. package/dashboard/assets/media-track-components-CpeII-tT.js.map +1 -0
  105. package/dashboard/assets/scales-e0tkfEy1.js +2 -0
  106. package/dashboard/assets/scales-e0tkfEy1.js.map +1 -0
  107. package/dashboard/assets/sparkline-2JUGDrMW.js +2 -0
  108. package/dashboard/assets/sparkline-2JUGDrMW.js.map +1 -0
  109. package/dashboard/assets/stats-BNgXz5BD.js +2 -0
  110. package/dashboard/assets/stats-BNgXz5BD.js.map +1 -0
  111. package/dashboard/assets/studio-B7hMOwAF.js +2 -0
  112. package/dashboard/assets/studio-B7hMOwAF.js.map +1 -0
  113. package/dashboard/assets/studio-BN_9xHY3.js +2 -0
  114. package/dashboard/assets/studio-BN_9xHY3.js.map +1 -0
  115. package/dashboard/assets/studio-Cn2MObe8.js +2 -0
  116. package/dashboard/assets/studio-Cn2MObe8.js.map +1 -0
  117. package/dashboard/assets/studio-DZEZCCkw.js +2 -0
  118. package/dashboard/assets/studio-DZEZCCkw.js.map +1 -0
  119. package/dashboard/assets/studio-DzatTvLl.js +2 -0
  120. package/dashboard/assets/studio-DzatTvLl.js.map +1 -0
  121. package/dashboard/assets/studio-cBlD8x90.js +2 -0
  122. package/dashboard/assets/studio-cBlD8x90.js.map +1 -0
  123. package/dashboard/assets/studio-cglZPbJK.js +2 -0
  124. package/dashboard/assets/studio-cglZPbJK.js.map +1 -0
  125. package/dashboard/assets/system-track-components-GTYYpnfB.js +2 -0
  126. package/dashboard/assets/system-track-components-GTYYpnfB.js.map +1 -0
  127. package/dashboard/assets/tables-tail-components-DiA5GeHB.js +2 -0
  128. package/dashboard/assets/tables-tail-components-DiA5GeHB.js.map +1 -0
  129. package/dashboard/assets/tables-track-f-components-CVNPd7rq.js +2 -0
  130. package/dashboard/assets/tables-track-f-components-CVNPd7rq.js.map +1 -0
  131. package/dashboard/assets/time-flow-components-nKsaryry.js +2 -0
  132. package/dashboard/assets/time-flow-components-nKsaryry.js.map +1 -0
  133. package/dashboard/assets/ui-B-kZetor.js +2 -0
  134. package/dashboard/assets/ui-B-kZetor.js.map +1 -0
  135. package/dashboard/assets/ui-BEStJ5Pw.js +2 -0
  136. package/dashboard/assets/ui-BEStJ5Pw.js.map +1 -0
  137. package/dashboard/assets/ui-BS5_eDN4.js +2 -0
  138. package/dashboard/assets/ui-BS5_eDN4.js.map +1 -0
  139. package/dashboard/assets/ui-BZ0EyxRH.js +2 -0
  140. package/dashboard/assets/ui-BZ0EyxRH.js.map +1 -0
  141. package/dashboard/assets/ui-BloJDdt6.js +2 -0
  142. package/dashboard/assets/ui-BloJDdt6.js.map +1 -0
  143. package/dashboard/assets/ui-CpdrplJH.js +2 -0
  144. package/dashboard/assets/ui-CpdrplJH.js.map +1 -0
  145. package/dashboard/assets/ui-YJfT644k.js +2 -0
  146. package/dashboard/assets/ui-YJfT644k.js.map +1 -0
  147. package/dashboard/assets/widgets-uDqZWw4A.js +2 -0
  148. package/dashboard/assets/widgets-uDqZWw4A.js.map +1 -0
  149. package/dashboard/index.html +41 -0
  150. package/dist/app.d.ts +48 -0
  151. package/dist/app.d.ts.map +1 -0
  152. package/dist/app.js +250 -0
  153. package/dist/app.js.map +1 -0
  154. package/dist/auth/audit.d.ts +22 -0
  155. package/dist/auth/audit.d.ts.map +1 -0
  156. package/dist/auth/audit.js +17 -0
  157. package/dist/auth/audit.js.map +1 -0
  158. package/dist/auth/desktop-session.d.ts +53 -0
  159. package/dist/auth/desktop-session.d.ts.map +1 -0
  160. package/dist/auth/desktop-session.js +111 -0
  161. package/dist/auth/desktop-session.js.map +1 -0
  162. package/dist/auth/passwords.d.ts +17 -0
  163. package/dist/auth/passwords.d.ts.map +1 -0
  164. package/dist/auth/passwords.js +40 -0
  165. package/dist/auth/passwords.js.map +1 -0
  166. package/dist/auth/sessions.d.ts +77 -0
  167. package/dist/auth/sessions.d.ts.map +1 -0
  168. package/dist/auth/sessions.js +137 -0
  169. package/dist/auth/sessions.js.map +1 -0
  170. package/dist/auth/totp.d.ts +30 -0
  171. package/dist/auth/totp.d.ts.map +1 -0
  172. package/dist/auth/totp.js +97 -0
  173. package/dist/auth/totp.js.map +1 -0
  174. package/dist/backup/backup-service.d.ts +157 -0
  175. package/dist/backup/backup-service.d.ts.map +1 -0
  176. package/dist/backup/backup-service.js +354 -0
  177. package/dist/backup/backup-service.js.map +1 -0
  178. package/dist/backup/format.d.ts +300 -0
  179. package/dist/backup/format.d.ts.map +1 -0
  180. package/dist/backup/format.js +304 -0
  181. package/dist/backup/format.js.map +1 -0
  182. package/dist/backup/notify.d.ts +55 -0
  183. package/dist/backup/notify.d.ts.map +1 -0
  184. package/dist/backup/notify.js +60 -0
  185. package/dist/backup/notify.js.map +1 -0
  186. package/dist/backup/snapshot.d.ts +78 -0
  187. package/dist/backup/snapshot.d.ts.map +1 -0
  188. package/dist/backup/snapshot.js +142 -0
  189. package/dist/backup/snapshot.js.map +1 -0
  190. package/dist/capabilities/catalog.d.ts +33 -0
  191. package/dist/capabilities/catalog.d.ts.map +1 -0
  192. package/dist/capabilities/catalog.js +32 -0
  193. package/dist/capabilities/catalog.js.map +1 -0
  194. package/dist/capabilities/grants.d.ts +44 -0
  195. package/dist/capabilities/grants.d.ts.map +1 -0
  196. package/dist/capabilities/grants.js +65 -0
  197. package/dist/capabilities/grants.js.map +1 -0
  198. package/dist/cli/allowlist.d.ts +46 -0
  199. package/dist/cli/allowlist.d.ts.map +1 -0
  200. package/dist/cli/allowlist.js +99 -0
  201. package/dist/cli/allowlist.js.map +1 -0
  202. package/dist/cli/args.d.ts +63 -0
  203. package/dist/cli/args.d.ts.map +1 -0
  204. package/dist/cli/args.js +92 -0
  205. package/dist/cli/args.js.map +1 -0
  206. package/dist/cli/command.d.ts +32 -0
  207. package/dist/cli/command.d.ts.map +1 -0
  208. package/dist/cli/command.js +64 -0
  209. package/dist/cli/command.js.map +1 -0
  210. package/dist/cli/commands/apply-llm-response.d.ts +32 -0
  211. package/dist/cli/commands/apply-llm-response.d.ts.map +1 -0
  212. package/dist/cli/commands/apply-llm-response.js +209 -0
  213. package/dist/cli/commands/apply-llm-response.js.map +1 -0
  214. package/dist/cli/commands/export-zip.d.ts +17 -0
  215. package/dist/cli/commands/export-zip.d.ts.map +1 -0
  216. package/dist/cli/commands/export-zip.js +111 -0
  217. package/dist/cli/commands/export-zip.js.map +1 -0
  218. package/dist/cli/commands/generate-prompt.d.ts +29 -0
  219. package/dist/cli/commands/generate-prompt.d.ts.map +1 -0
  220. package/dist/cli/commands/generate-prompt.js +154 -0
  221. package/dist/cli/commands/generate-prompt.js.map +1 -0
  222. package/dist/cli/commands/import-zip.d.ts +13 -0
  223. package/dist/cli/commands/import-zip.d.ts.map +1 -0
  224. package/dist/cli/commands/import-zip.js +95 -0
  225. package/dist/cli/commands/import-zip.js.map +1 -0
  226. package/dist/cli/commands/init.d.ts +47 -0
  227. package/dist/cli/commands/init.d.ts.map +1 -0
  228. package/dist/cli/commands/init.js +372 -0
  229. package/dist/cli/commands/init.js.map +1 -0
  230. package/dist/cli/commands/introspect.d.ts +11 -0
  231. package/dist/cli/commands/introspect.d.ts.map +1 -0
  232. package/dist/cli/commands/introspect.js +100 -0
  233. package/dist/cli/commands/introspect.js.map +1 -0
  234. package/dist/cli/commands/migrate.d.ts +11 -0
  235. package/dist/cli/commands/migrate.d.ts.map +1 -0
  236. package/dist/cli/commands/migrate.js +80 -0
  237. package/dist/cli/commands/migrate.js.map +1 -0
  238. package/dist/cli/commands/start.d.ts +22 -0
  239. package/dist/cli/commands/start.d.ts.map +1 -0
  240. package/dist/cli/commands/start.js +101 -0
  241. package/dist/cli/commands/start.js.map +1 -0
  242. package/dist/cli/exit.d.ts +37 -0
  243. package/dist/cli/exit.d.ts.map +1 -0
  244. package/dist/cli/exit.js +39 -0
  245. package/dist/cli/exit.js.map +1 -0
  246. package/dist/cli/index.d.ts +10 -0
  247. package/dist/cli/index.d.ts.map +1 -0
  248. package/dist/cli/index.js +17 -0
  249. package/dist/cli/index.js.map +1 -0
  250. package/dist/cli/io.d.ts +49 -0
  251. package/dist/cli/io.d.ts.map +1 -0
  252. package/dist/cli/io.js +77 -0
  253. package/dist/cli/io.js.map +1 -0
  254. package/dist/cli/run.d.ts +35 -0
  255. package/dist/cli/run.d.ts.map +1 -0
  256. package/dist/cli/run.js +139 -0
  257. package/dist/cli/run.js.map +1 -0
  258. package/dist/cli/runtime.d.ts +116 -0
  259. package/dist/cli/runtime.d.ts.map +1 -0
  260. package/dist/cli/runtime.js +181 -0
  261. package/dist/cli/runtime.js.map +1 -0
  262. package/dist/cli/static-root.d.ts +42 -0
  263. package/dist/cli/static-root.d.ts.map +1 -0
  264. package/dist/cli/static-root.js +58 -0
  265. package/dist/cli/static-root.js.map +1 -0
  266. package/dist/compose.d.ts +135 -0
  267. package/dist/compose.d.ts.map +1 -0
  268. package/dist/compose.js +383 -0
  269. package/dist/compose.js.map +1 -0
  270. package/dist/config/bootstrap.d.ts +33 -0
  271. package/dist/config/bootstrap.d.ts.map +1 -0
  272. package/dist/config/bootstrap.js +81 -0
  273. package/dist/config/bootstrap.js.map +1 -0
  274. package/dist/config/env.d.ts +95 -0
  275. package/dist/config/env.d.ts.map +1 -0
  276. package/dist/config/env.js +236 -0
  277. package/dist/config/env.js.map +1 -0
  278. package/dist/config/secrets.d.ts +24 -0
  279. package/dist/config/secrets.d.ts.map +1 -0
  280. package/dist/config/secrets.js +74 -0
  281. package/dist/config/secrets.js.map +1 -0
  282. package/dist/connections/crypto.d.ts +9 -0
  283. package/dist/connections/crypto.d.ts.map +1 -0
  284. package/dist/connections/crypto.js +16 -0
  285. package/dist/connections/crypto.js.map +1 -0
  286. package/dist/connections/dsn.d.ts +42 -0
  287. package/dist/connections/dsn.d.ts.map +1 -0
  288. package/dist/connections/dsn.js +131 -0
  289. package/dist/connections/dsn.js.map +1 -0
  290. package/dist/connections/effective-schema.d.ts +65 -0
  291. package/dist/connections/effective-schema.d.ts.map +1 -0
  292. package/dist/connections/effective-schema.js +249 -0
  293. package/dist/connections/effective-schema.js.map +1 -0
  294. package/dist/connections/introspect.d.ts +52 -0
  295. package/dist/connections/introspect.d.ts.map +1 -0
  296. package/dist/connections/introspect.js +111 -0
  297. package/dist/connections/introspect.js.map +1 -0
  298. package/dist/connections/manager.d.ts +97 -0
  299. package/dist/connections/manager.d.ts.map +1 -0
  300. package/dist/connections/manager.js +224 -0
  301. package/dist/connections/manager.js.map +1 -0
  302. package/dist/connections/register-adapters.d.ts +42 -0
  303. package/dist/connections/register-adapters.d.ts.map +1 -0
  304. package/dist/connections/register-adapters.js +92 -0
  305. package/dist/connections/register-adapters.js.map +1 -0
  306. package/dist/crud/filters.d.ts +57 -0
  307. package/dist/crud/filters.d.ts.map +1 -0
  308. package/dist/crud/filters.js +177 -0
  309. package/dist/crud/filters.js.map +1 -0
  310. package/dist/crud/identifiers.d.ts +58 -0
  311. package/dist/crud/identifiers.d.ts.map +1 -0
  312. package/dist/crud/identifiers.js +99 -0
  313. package/dist/crud/identifiers.js.map +1 -0
  314. package/dist/crud/list.d.ts +51 -0
  315. package/dist/crud/list.d.ts.map +1 -0
  316. package/dist/crud/list.js +126 -0
  317. package/dist/crud/list.js.map +1 -0
  318. package/dist/crud/mask.d.ts +23 -0
  319. package/dist/crud/mask.d.ts.map +1 -0
  320. package/dist/crud/mask.js +41 -0
  321. package/dist/crud/mask.js.map +1 -0
  322. package/dist/crud/records.d.ts +33 -0
  323. package/dist/crud/records.d.ts.map +1 -0
  324. package/dist/crud/records.js +126 -0
  325. package/dist/crud/records.js.map +1 -0
  326. package/dist/crud/undo.d.ts +55 -0
  327. package/dist/crud/undo.d.ts.map +1 -0
  328. package/dist/crud/undo.js +74 -0
  329. package/dist/crud/undo.js.map +1 -0
  330. package/dist/data-io/coerce.d.ts +28 -0
  331. package/dist/data-io/coerce.d.ts.map +1 -0
  332. package/dist/data-io/coerce.js +123 -0
  333. package/dist/data-io/coerce.js.map +1 -0
  334. package/dist/data-io/csv.d.ts +38 -0
  335. package/dist/data-io/csv.d.ts.map +1 -0
  336. package/dist/data-io/csv.js +138 -0
  337. package/dist/data-io/csv.js.map +1 -0
  338. package/dist/data-io/snapshot-view.d.ts +10 -0
  339. package/dist/data-io/snapshot-view.d.ts.map +1 -0
  340. package/dist/data-io/snapshot-view.js +19 -0
  341. package/dist/data-io/snapshot-view.js.map +1 -0
  342. package/dist/desktop/demo-seed.d.ts +23 -0
  343. package/dist/desktop/demo-seed.d.ts.map +1 -0
  344. package/dist/desktop/demo-seed.js +28 -0
  345. package/dist/desktop/demo-seed.js.map +1 -0
  346. package/dist/desktop/lan-share.d.ts +94 -0
  347. package/dist/desktop/lan-share.d.ts.map +1 -0
  348. package/dist/desktop/lan-share.js +150 -0
  349. package/dist/desktop/lan-share.js.map +1 -0
  350. package/dist/errors.d.ts +72 -0
  351. package/dist/errors.d.ts.map +1 -0
  352. package/dist/errors.js +82 -0
  353. package/dist/errors.js.map +1 -0
  354. package/dist/export/bundle.d.ts +235 -0
  355. package/dist/export/bundle.d.ts.map +1 -0
  356. package/dist/export/bundle.js +172 -0
  357. package/dist/export/bundle.js.map +1 -0
  358. package/dist/export/import-service.d.ts +99 -0
  359. package/dist/export/import-service.d.ts.map +1 -0
  360. package/dist/export/import-service.js +515 -0
  361. package/dist/export/import-service.js.map +1 -0
  362. package/dist/export/readme.d.ts +25 -0
  363. package/dist/export/readme.d.ts.map +1 -0
  364. package/dist/export/readme.js +154 -0
  365. package/dist/export/readme.js.map +1 -0
  366. package/dist/export/redaction.d.ts +118 -0
  367. package/dist/export/redaction.d.ts.map +1 -0
  368. package/dist/export/redaction.js +233 -0
  369. package/dist/export/redaction.js.map +1 -0
  370. package/dist/export/zip-service.d.ts +66 -0
  371. package/dist/export/zip-service.d.ts.map +1 -0
  372. package/dist/export/zip-service.js +306 -0
  373. package/dist/export/zip-service.js.map +1 -0
  374. package/dist/files/storage.d.ts +50 -0
  375. package/dist/files/storage.d.ts.map +1 -0
  376. package/dist/files/storage.js +100 -0
  377. package/dist/files/storage.js.map +1 -0
  378. package/dist/generate/materialize-llm.d.ts +45 -0
  379. package/dist/generate/materialize-llm.d.ts.map +1 -0
  380. package/dist/generate/materialize-llm.js +167 -0
  381. package/dist/generate/materialize-llm.js.map +1 -0
  382. package/dist/generate/run.d.ts +48 -0
  383. package/dist/generate/run.d.ts.map +1 -0
  384. package/dist/generate/run.js +123 -0
  385. package/dist/generate/run.js.map +1 -0
  386. package/dist/index.d.ts +89 -0
  387. package/dist/index.d.ts.map +1 -0
  388. package/dist/index.js +116 -0
  389. package/dist/index.js.map +1 -0
  390. package/dist/jobs/export-run.d.ts +38 -0
  391. package/dist/jobs/export-run.d.ts.map +1 -0
  392. package/dist/jobs/export-run.js +172 -0
  393. package/dist/jobs/export-run.js.map +1 -0
  394. package/dist/jobs/import-run.d.ts +43 -0
  395. package/dist/jobs/import-run.d.ts.map +1 -0
  396. package/dist/jobs/import-run.js +290 -0
  397. package/dist/jobs/import-run.js.map +1 -0
  398. package/dist/jobs/llm-run.d.ts +73 -0
  399. package/dist/jobs/llm-run.d.ts.map +1 -0
  400. package/dist/jobs/llm-run.js +225 -0
  401. package/dist/jobs/llm-run.js.map +1 -0
  402. package/dist/jobs/register.d.ts +90 -0
  403. package/dist/jobs/register.d.ts.map +1 -0
  404. package/dist/jobs/register.js +121 -0
  405. package/dist/jobs/register.js.map +1 -0
  406. package/dist/jobs/registry.d.ts +74 -0
  407. package/dist/jobs/registry.d.ts.map +1 -0
  408. package/dist/jobs/registry.js +78 -0
  409. package/dist/jobs/registry.js.map +1 -0
  410. package/dist/jobs/report-run.d.ts +64 -0
  411. package/dist/jobs/report-run.d.ts.map +1 -0
  412. package/dist/jobs/report-run.js +221 -0
  413. package/dist/jobs/report-run.js.map +1 -0
  414. package/dist/jobs/scheduler.d.ts +72 -0
  415. package/dist/jobs/scheduler.d.ts.map +1 -0
  416. package/dist/jobs/scheduler.js +121 -0
  417. package/dist/jobs/scheduler.js.map +1 -0
  418. package/dist/jobs/worker.d.ts +110 -0
  419. package/dist/jobs/worker.d.ts.map +1 -0
  420. package/dist/jobs/worker.js +282 -0
  421. package/dist/jobs/worker.js.map +1 -0
  422. package/dist/llm/apply-service.d.ts +150 -0
  423. package/dist/llm/apply-service.d.ts.map +1 -0
  424. package/dist/llm/apply-service.js +463 -0
  425. package/dist/llm/apply-service.js.map +1 -0
  426. package/dist/llm/apply-undo-store.d.ts +50 -0
  427. package/dist/llm/apply-undo-store.d.ts.map +1 -0
  428. package/dist/llm/apply-undo-store.js +60 -0
  429. package/dist/llm/apply-undo-store.js.map +1 -0
  430. package/dist/llm/direct-runner.d.ts +146 -0
  431. package/dist/llm/direct-runner.d.ts.map +1 -0
  432. package/dist/llm/direct-runner.js +204 -0
  433. package/dist/llm/direct-runner.js.map +1 -0
  434. package/dist/llm/prompt-service.d.ts +90 -0
  435. package/dist/llm/prompt-service.d.ts.map +1 -0
  436. package/dist/llm/prompt-service.js +93 -0
  437. package/dist/llm/prompt-service.js.map +1 -0
  438. package/dist/llm/provider-resolver.d.ts +25 -0
  439. package/dist/llm/provider-resolver.d.ts.map +1 -0
  440. package/dist/llm/provider-resolver.js +81 -0
  441. package/dist/llm/provider-resolver.js.map +1 -0
  442. package/dist/llm/run-service.d.ts +215 -0
  443. package/dist/llm/run-service.d.ts.map +1 -0
  444. package/dist/llm/run-service.js +343 -0
  445. package/dist/llm/run-service.js.map +1 -0
  446. package/dist/llm/stats-collector.d.ts +40 -0
  447. package/dist/llm/stats-collector.d.ts.map +1 -0
  448. package/dist/llm/stats-collector.js +74 -0
  449. package/dist/llm/stats-collector.js.map +1 -0
  450. package/dist/log-scrub.d.ts +58 -0
  451. package/dist/log-scrub.d.ts.map +1 -0
  452. package/dist/log-scrub.js +103 -0
  453. package/dist/log-scrub.js.map +1 -0
  454. package/dist/meta/store.d.ts +96 -0
  455. package/dist/meta/store.d.ts.map +1 -0
  456. package/dist/meta/store.js +192 -0
  457. package/dist/meta/store.js.map +1 -0
  458. package/dist/notifications/notify.d.ts +43 -0
  459. package/dist/notifications/notify.d.ts.map +1 -0
  460. package/dist/notifications/notify.js +42 -0
  461. package/dist/notifications/notify.js.map +1 -0
  462. package/dist/plugins/auth.d.ts +42 -0
  463. package/dist/plugins/auth.d.ts.map +1 -0
  464. package/dist/plugins/auth.js +84 -0
  465. package/dist/plugins/auth.js.map +1 -0
  466. package/dist/plugins/core.d.ts +48 -0
  467. package/dist/plugins/core.d.ts.map +1 -0
  468. package/dist/plugins/core.js +248 -0
  469. package/dist/plugins/core.js.map +1 -0
  470. package/dist/plugins/rbac.d.ts +54 -0
  471. package/dist/plugins/rbac.d.ts.map +1 -0
  472. package/dist/plugins/rbac.js +103 -0
  473. package/dist/plugins/rbac.js.map +1 -0
  474. package/dist/plugins/static.d.ts +12 -0
  475. package/dist/plugins/static.d.ts.map +1 -0
  476. package/dist/plugins/static.js +36 -0
  477. package/dist/plugins/static.js.map +1 -0
  478. package/dist/rbac/api-keys.d.ts +30 -0
  479. package/dist/rbac/api-keys.d.ts.map +1 -0
  480. package/dist/rbac/api-keys.js +41 -0
  481. package/dist/rbac/api-keys.js.map +1 -0
  482. package/dist/rbac/index.d.ts +6 -0
  483. package/dist/rbac/index.d.ts.map +1 -0
  484. package/dist/rbac/index.js +6 -0
  485. package/dist/rbac/index.js.map +1 -0
  486. package/dist/rbac/permissions.d.ts +107 -0
  487. package/dist/rbac/permissions.d.ts.map +1 -0
  488. package/dist/rbac/permissions.js +250 -0
  489. package/dist/rbac/permissions.js.map +1 -0
  490. package/dist/rbac/principal.d.ts +33 -0
  491. package/dist/rbac/principal.d.ts.map +1 -0
  492. package/dist/rbac/principal.js +31 -0
  493. package/dist/rbac/principal.js.map +1 -0
  494. package/dist/rbac/resolver.d.ts +26 -0
  495. package/dist/rbac/resolver.d.ts.map +1 -0
  496. package/dist/rbac/resolver.js +46 -0
  497. package/dist/rbac/resolver.js.map +1 -0
  498. package/dist/realtime/hub.d.ts +90 -0
  499. package/dist/realtime/hub.d.ts.map +1 -0
  500. package/dist/realtime/hub.js +146 -0
  501. package/dist/realtime/hub.js.map +1 -0
  502. package/dist/realtime/sse.d.ts +35 -0
  503. package/dist/realtime/sse.d.ts.map +1 -0
  504. package/dist/realtime/sse.js +88 -0
  505. package/dist/realtime/sse.js.map +1 -0
  506. package/dist/realtime/ws.d.ts +38 -0
  507. package/dist/realtime/ws.d.ts.map +1 -0
  508. package/dist/realtime/ws.js +124 -0
  509. package/dist/realtime/ws.js.map +1 -0
  510. package/dist/reports/schedule.d.ts +14 -0
  511. package/dist/reports/schedule.d.ts.map +1 -0
  512. package/dist/reports/schedule.js +63 -0
  513. package/dist/reports/schedule.js.map +1 -0
  514. package/dist/routes/about/index.d.ts +39 -0
  515. package/dist/routes/about/index.d.ts.map +1 -0
  516. package/dist/routes/about/index.js +73 -0
  517. package/dist/routes/about/index.js.map +1 -0
  518. package/dist/routes/about/schema.d.ts +50 -0
  519. package/dist/routes/about/schema.d.ts.map +1 -0
  520. package/dist/routes/about/schema.js +53 -0
  521. package/dist/routes/about/schema.js.map +1 -0
  522. package/dist/routes/api-keys/index.d.ts +11 -0
  523. package/dist/routes/api-keys/index.d.ts.map +1 -0
  524. package/dist/routes/api-keys/index.js +79 -0
  525. package/dist/routes/api-keys/index.js.map +1 -0
  526. package/dist/routes/api-keys/schema.d.ts +62 -0
  527. package/dist/routes/api-keys/schema.d.ts.map +1 -0
  528. package/dist/routes/api-keys/schema.js +37 -0
  529. package/dist/routes/api-keys/schema.js.map +1 -0
  530. package/dist/routes/audit/index.d.ts +11 -0
  531. package/dist/routes/audit/index.d.ts.map +1 -0
  532. package/dist/routes/audit/index.js +107 -0
  533. package/dist/routes/audit/index.js.map +1 -0
  534. package/dist/routes/audit/schema.d.ts +129 -0
  535. package/dist/routes/audit/schema.d.ts.map +1 -0
  536. package/dist/routes/audit/schema.js +43 -0
  537. package/dist/routes/audit/schema.js.map +1 -0
  538. package/dist/routes/auth/desktop-session.d.ts +48 -0
  539. package/dist/routes/auth/desktop-session.d.ts.map +1 -0
  540. package/dist/routes/auth/desktop-session.js +132 -0
  541. package/dist/routes/auth/desktop-session.js.map +1 -0
  542. package/dist/routes/auth/handlers.d.ts +21 -0
  543. package/dist/routes/auth/handlers.d.ts.map +1 -0
  544. package/dist/routes/auth/handlers.js +256 -0
  545. package/dist/routes/auth/handlers.js.map +1 -0
  546. package/dist/routes/auth/index.d.ts +27 -0
  547. package/dist/routes/auth/index.d.ts.map +1 -0
  548. package/dist/routes/auth/index.js +67 -0
  549. package/dist/routes/auth/index.js.map +1 -0
  550. package/dist/routes/auth/schema.d.ts +129 -0
  551. package/dist/routes/auth/schema.d.ts.map +1 -0
  552. package/dist/routes/auth/schema.js +84 -0
  553. package/dist/routes/auth/schema.js.map +1 -0
  554. package/dist/routes/bootstrap/handlers.d.ts +34 -0
  555. package/dist/routes/bootstrap/handlers.d.ts.map +1 -0
  556. package/dist/routes/bootstrap/handlers.js +96 -0
  557. package/dist/routes/bootstrap/handlers.js.map +1 -0
  558. package/dist/routes/bootstrap/index.d.ts +9 -0
  559. package/dist/routes/bootstrap/index.d.ts.map +1 -0
  560. package/dist/routes/bootstrap/index.js +16 -0
  561. package/dist/routes/bootstrap/index.js.map +1 -0
  562. package/dist/routes/bootstrap/schema.d.ts +177 -0
  563. package/dist/routes/bootstrap/schema.d.ts.map +1 -0
  564. package/dist/routes/bootstrap/schema.js +55 -0
  565. package/dist/routes/bootstrap/schema.js.map +1 -0
  566. package/dist/routes/connections/index.d.ts +21 -0
  567. package/dist/routes/connections/index.d.ts.map +1 -0
  568. package/dist/routes/connections/index.js +260 -0
  569. package/dist/routes/connections/index.js.map +1 -0
  570. package/dist/routes/connections/schema.d.ts +161 -0
  571. package/dist/routes/connections/schema.d.ts.map +1 -0
  572. package/dist/routes/connections/schema.js +91 -0
  573. package/dist/routes/connections/schema.js.map +1 -0
  574. package/dist/routes/data/index.d.ts +46 -0
  575. package/dist/routes/data/index.d.ts.map +1 -0
  576. package/dist/routes/data/index.js +508 -0
  577. package/dist/routes/data/index.js.map +1 -0
  578. package/dist/routes/data/schema.d.ts +128 -0
  579. package/dist/routes/data/schema.d.ts.map +1 -0
  580. package/dist/routes/data/schema.js +83 -0
  581. package/dist/routes/data/schema.js.map +1 -0
  582. package/dist/routes/desktop/index.d.ts +61 -0
  583. package/dist/routes/desktop/index.d.ts.map +1 -0
  584. package/dist/routes/desktop/index.js +91 -0
  585. package/dist/routes/desktop/index.js.map +1 -0
  586. package/dist/routes/desktop/schema.d.ts +71 -0
  587. package/dist/routes/desktop/schema.d.ts.map +1 -0
  588. package/dist/routes/desktop/schema.js +58 -0
  589. package/dist/routes/desktop/schema.js.map +1 -0
  590. package/dist/routes/desktop-capabilities/index.d.ts +9 -0
  591. package/dist/routes/desktop-capabilities/index.d.ts.map +1 -0
  592. package/dist/routes/desktop-capabilities/index.js +62 -0
  593. package/dist/routes/desktop-capabilities/index.js.map +1 -0
  594. package/dist/routes/desktop-capabilities/schema.d.ts +46 -0
  595. package/dist/routes/desktop-capabilities/schema.d.ts.map +1 -0
  596. package/dist/routes/desktop-capabilities/schema.js +30 -0
  597. package/dist/routes/desktop-capabilities/schema.js.map +1 -0
  598. package/dist/routes/desktop-demo/handlers.d.ts +94 -0
  599. package/dist/routes/desktop-demo/handlers.d.ts.map +1 -0
  600. package/dist/routes/desktop-demo/handlers.js +182 -0
  601. package/dist/routes/desktop-demo/handlers.js.map +1 -0
  602. package/dist/routes/desktop-demo/index.d.ts +39 -0
  603. package/dist/routes/desktop-demo/index.d.ts.map +1 -0
  604. package/dist/routes/desktop-demo/index.js +73 -0
  605. package/dist/routes/desktop-demo/index.js.map +1 -0
  606. package/dist/routes/desktop-demo/schema.d.ts +17 -0
  607. package/dist/routes/desktop-demo/schema.d.ts.map +1 -0
  608. package/dist/routes/desktop-demo/schema.js +30 -0
  609. package/dist/routes/desktop-demo/schema.js.map +1 -0
  610. package/dist/routes/desktop-lan/index.d.ts +54 -0
  611. package/dist/routes/desktop-lan/index.d.ts.map +1 -0
  612. package/dist/routes/desktop-lan/index.js +33 -0
  613. package/dist/routes/desktop-lan/index.js.map +1 -0
  614. package/dist/routes/desktop-lan/schema.d.ts +24 -0
  615. package/dist/routes/desktop-lan/schema.d.ts.map +1 -0
  616. package/dist/routes/desktop-lan/schema.js +40 -0
  617. package/dist/routes/desktop-lan/schema.js.map +1 -0
  618. package/dist/routes/desktop-local-db/handlers.d.ts +92 -0
  619. package/dist/routes/desktop-local-db/handlers.d.ts.map +1 -0
  620. package/dist/routes/desktop-local-db/handlers.js +300 -0
  621. package/dist/routes/desktop-local-db/handlers.js.map +1 -0
  622. package/dist/routes/desktop-local-db/index.d.ts +39 -0
  623. package/dist/routes/desktop-local-db/index.d.ts.map +1 -0
  624. package/dist/routes/desktop-local-db/index.js +83 -0
  625. package/dist/routes/desktop-local-db/index.js.map +1 -0
  626. package/dist/routes/desktop-local-db/placeholder.d.ts +75 -0
  627. package/dist/routes/desktop-local-db/placeholder.d.ts.map +1 -0
  628. package/dist/routes/desktop-local-db/placeholder.js +420 -0
  629. package/dist/routes/desktop-local-db/placeholder.js.map +1 -0
  630. package/dist/routes/desktop-local-db/schema.d.ts +50 -0
  631. package/dist/routes/desktop-local-db/schema.d.ts.map +1 -0
  632. package/dist/routes/desktop-local-db/schema.js +71 -0
  633. package/dist/routes/desktop-local-db/schema.js.map +1 -0
  634. package/dist/routes/desktop-local-db/sqlite-ddl.d.ts +104 -0
  635. package/dist/routes/desktop-local-db/sqlite-ddl.d.ts.map +1 -0
  636. package/dist/routes/desktop-local-db/sqlite-ddl.js +419 -0
  637. package/dist/routes/desktop-local-db/sqlite-ddl.js.map +1 -0
  638. package/dist/routes/email-templates/index.d.ts +7 -0
  639. package/dist/routes/email-templates/index.d.ts.map +1 -0
  640. package/dist/routes/email-templates/index.js +70 -0
  641. package/dist/routes/email-templates/index.js.map +1 -0
  642. package/dist/routes/email-templates/schema.d.ts +54 -0
  643. package/dist/routes/email-templates/schema.d.ts.map +1 -0
  644. package/dist/routes/email-templates/schema.js +35 -0
  645. package/dist/routes/email-templates/schema.js.map +1 -0
  646. package/dist/routes/exports/index.d.ts +19 -0
  647. package/dist/routes/exports/index.d.ts.map +1 -0
  648. package/dist/routes/exports/index.js +145 -0
  649. package/dist/routes/exports/index.js.map +1 -0
  650. package/dist/routes/exports/schema.d.ts +183 -0
  651. package/dist/routes/exports/schema.d.ts.map +1 -0
  652. package/dist/routes/exports/schema.js +37 -0
  653. package/dist/routes/exports/schema.js.map +1 -0
  654. package/dist/routes/generate/index.d.ts +23 -0
  655. package/dist/routes/generate/index.d.ts.map +1 -0
  656. package/dist/routes/generate/index.js +80 -0
  657. package/dist/routes/generate/index.js.map +1 -0
  658. package/dist/routes/generate/schema.d.ts +43 -0
  659. package/dist/routes/generate/schema.d.ts.map +1 -0
  660. package/dist/routes/generate/schema.js +37 -0
  661. package/dist/routes/generate/schema.js.map +1 -0
  662. package/dist/routes/imports/index.d.ts +21 -0
  663. package/dist/routes/imports/index.d.ts.map +1 -0
  664. package/dist/routes/imports/index.js +288 -0
  665. package/dist/routes/imports/index.js.map +1 -0
  666. package/dist/routes/imports/schema.d.ts +292 -0
  667. package/dist/routes/imports/schema.d.ts.map +1 -0
  668. package/dist/routes/imports/schema.js +78 -0
  669. package/dist/routes/imports/schema.js.map +1 -0
  670. package/dist/routes/index.d.ts +11 -0
  671. package/dist/routes/index.d.ts.map +1 -0
  672. package/dist/routes/index.js +8 -0
  673. package/dist/routes/index.js.map +1 -0
  674. package/dist/routes/jobs/index.d.ts +29 -0
  675. package/dist/routes/jobs/index.d.ts.map +1 -0
  676. package/dist/routes/jobs/index.js +175 -0
  677. package/dist/routes/jobs/index.js.map +1 -0
  678. package/dist/routes/jobs/schema.d.ts +170 -0
  679. package/dist/routes/jobs/schema.d.ts.map +1 -0
  680. package/dist/routes/jobs/schema.js +57 -0
  681. package/dist/routes/jobs/schema.js.map +1 -0
  682. package/dist/routes/llm/config-service.d.ts +48 -0
  683. package/dist/routes/llm/config-service.d.ts.map +1 -0
  684. package/dist/routes/llm/config-service.js +102 -0
  685. package/dist/routes/llm/config-service.js.map +1 -0
  686. package/dist/routes/llm/index.d.ts +69 -0
  687. package/dist/routes/llm/index.d.ts.map +1 -0
  688. package/dist/routes/llm/index.js +412 -0
  689. package/dist/routes/llm/index.js.map +1 -0
  690. package/dist/routes/llm/schema.d.ts +605 -0
  691. package/dist/routes/llm/schema.d.ts.map +1 -0
  692. package/dist/routes/llm/schema.js +238 -0
  693. package/dist/routes/llm/schema.js.map +1 -0
  694. package/dist/routes/me/handlers.d.ts +14 -0
  695. package/dist/routes/me/handlers.d.ts.map +1 -0
  696. package/dist/routes/me/handlers.js +88 -0
  697. package/dist/routes/me/handlers.js.map +1 -0
  698. package/dist/routes/me/index.d.ts +8 -0
  699. package/dist/routes/me/index.d.ts.map +1 -0
  700. package/dist/routes/me/index.js +17 -0
  701. package/dist/routes/me/index.js.map +1 -0
  702. package/dist/routes/me/schema.d.ts +270 -0
  703. package/dist/routes/me/schema.d.ts.map +1 -0
  704. package/dist/routes/me/schema.js +59 -0
  705. package/dist/routes/me/schema.js.map +1 -0
  706. package/dist/routes/me-views/index.d.ts +23 -0
  707. package/dist/routes/me-views/index.d.ts.map +1 -0
  708. package/dist/routes/me-views/index.js +76 -0
  709. package/dist/routes/me-views/index.js.map +1 -0
  710. package/dist/routes/me-views/schema.d.ts +44 -0
  711. package/dist/routes/me-views/schema.d.ts.map +1 -0
  712. package/dist/routes/me-views/schema.js +13 -0
  713. package/dist/routes/me-views/schema.js.map +1 -0
  714. package/dist/routes/notifications/index.d.ts +19 -0
  715. package/dist/routes/notifications/index.d.ts.map +1 -0
  716. package/dist/routes/notifications/index.js +123 -0
  717. package/dist/routes/notifications/index.js.map +1 -0
  718. package/dist/routes/notifications/schema.d.ts +122 -0
  719. package/dist/routes/notifications/schema.d.ts.map +1 -0
  720. package/dist/routes/notifications/schema.js +83 -0
  721. package/dist/routes/notifications/schema.js.map +1 -0
  722. package/dist/routes/onboarding/derive.d.ts +41 -0
  723. package/dist/routes/onboarding/derive.d.ts.map +1 -0
  724. package/dist/routes/onboarding/derive.js +30 -0
  725. package/dist/routes/onboarding/derive.js.map +1 -0
  726. package/dist/routes/onboarding/index.d.ts +26 -0
  727. package/dist/routes/onboarding/index.d.ts.map +1 -0
  728. package/dist/routes/onboarding/index.js +95 -0
  729. package/dist/routes/onboarding/index.js.map +1 -0
  730. package/dist/routes/onboarding/schema.d.ts +22 -0
  731. package/dist/routes/onboarding/schema.d.ts.map +1 -0
  732. package/dist/routes/onboarding/schema.js +22 -0
  733. package/dist/routes/onboarding/schema.js.map +1 -0
  734. package/dist/routes/pages/index.d.ts +26 -0
  735. package/dist/routes/pages/index.d.ts.map +1 -0
  736. package/dist/routes/pages/index.js +119 -0
  737. package/dist/routes/pages/index.js.map +1 -0
  738. package/dist/routes/pages/layout-schema.d.ts +19 -0
  739. package/dist/routes/pages/layout-schema.d.ts.map +1 -0
  740. package/dist/routes/pages/layout-schema.js +19 -0
  741. package/dist/routes/pages/layout-schema.js.map +1 -0
  742. package/dist/routes/pages/schema.d.ts +52 -0
  743. package/dist/routes/pages/schema.d.ts.map +1 -0
  744. package/dist/routes/pages/schema.js +35 -0
  745. package/dist/routes/pages/schema.js.map +1 -0
  746. package/dist/routes/roles/index.d.ts +17 -0
  747. package/dist/routes/roles/index.d.ts.map +1 -0
  748. package/dist/routes/roles/index.js +255 -0
  749. package/dist/routes/roles/index.js.map +1 -0
  750. package/dist/routes/roles/schema.d.ts +94 -0
  751. package/dist/routes/roles/schema.d.ts.map +1 -0
  752. package/dist/routes/roles/schema.js +57 -0
  753. package/dist/routes/roles/schema.js.map +1 -0
  754. package/dist/routes/scheduled-reports/index.d.ts +15 -0
  755. package/dist/routes/scheduled-reports/index.d.ts.map +1 -0
  756. package/dist/routes/scheduled-reports/index.js +195 -0
  757. package/dist/routes/scheduled-reports/index.js.map +1 -0
  758. package/dist/routes/scheduled-reports/schema.d.ts +154 -0
  759. package/dist/routes/scheduled-reports/schema.d.ts.map +1 -0
  760. package/dist/routes/scheduled-reports/schema.js +49 -0
  761. package/dist/routes/scheduled-reports/schema.js.map +1 -0
  762. package/dist/routes/schema/index.d.ts +24 -0
  763. package/dist/routes/schema/index.d.ts.map +1 -0
  764. package/dist/routes/schema/index.js +224 -0
  765. package/dist/routes/schema/index.js.map +1 -0
  766. package/dist/routes/schema/schema.d.ts +92 -0
  767. package/dist/routes/schema/schema.d.ts.map +1 -0
  768. package/dist/routes/schema/schema.js +64 -0
  769. package/dist/routes/schema/schema.js.map +1 -0
  770. package/dist/routes/schema-import/fallback-parser.d.ts +35 -0
  771. package/dist/routes/schema-import/fallback-parser.d.ts.map +1 -0
  772. package/dist/routes/schema-import/fallback-parser.js +349 -0
  773. package/dist/routes/schema-import/fallback-parser.js.map +1 -0
  774. package/dist/routes/schema-import/index.d.ts +43 -0
  775. package/dist/routes/schema-import/index.d.ts.map +1 -0
  776. package/dist/routes/schema-import/index.js +167 -0
  777. package/dist/routes/schema-import/index.js.map +1 -0
  778. package/dist/routes/schema-import/schema.d.ts +65 -0
  779. package/dist/routes/schema-import/schema.d.ts.map +1 -0
  780. package/dist/routes/schema-import/schema.js +40 -0
  781. package/dist/routes/schema-import/schema.js.map +1 -0
  782. package/dist/routes/search/index.d.ts +71 -0
  783. package/dist/routes/search/index.d.ts.map +1 -0
  784. package/dist/routes/search/index.js +361 -0
  785. package/dist/routes/search/index.js.map +1 -0
  786. package/dist/routes/search/schema.d.ts +125 -0
  787. package/dist/routes/search/schema.d.ts.map +1 -0
  788. package/dist/routes/search/schema.js +70 -0
  789. package/dist/routes/search/schema.js.map +1 -0
  790. package/dist/routes/settings/index.d.ts +24 -0
  791. package/dist/routes/settings/index.d.ts.map +1 -0
  792. package/dist/routes/settings/index.js +164 -0
  793. package/dist/routes/settings/index.js.map +1 -0
  794. package/dist/routes/settings/schema.d.ts +110 -0
  795. package/dist/routes/settings/schema.d.ts.map +1 -0
  796. package/dist/routes/settings/schema.js +71 -0
  797. package/dist/routes/settings/schema.js.map +1 -0
  798. package/dist/routes/setup/index.d.ts +29 -0
  799. package/dist/routes/setup/index.d.ts.map +1 -0
  800. package/dist/routes/setup/index.js +68 -0
  801. package/dist/routes/setup/index.js.map +1 -0
  802. package/dist/routes/setup/schema.d.ts +61 -0
  803. package/dist/routes/setup/schema.d.ts.map +1 -0
  804. package/dist/routes/setup/schema.js +47 -0
  805. package/dist/routes/setup/schema.js.map +1 -0
  806. package/dist/routes/system/handlers.d.ts +63 -0
  807. package/dist/routes/system/handlers.d.ts.map +1 -0
  808. package/dist/routes/system/handlers.js +121 -0
  809. package/dist/routes/system/handlers.js.map +1 -0
  810. package/dist/routes/system/index.d.ts +34 -0
  811. package/dist/routes/system/index.d.ts.map +1 -0
  812. package/dist/routes/system/index.js +18 -0
  813. package/dist/routes/system/index.js.map +1 -0
  814. package/dist/routes/system/schema.d.ts +93 -0
  815. package/dist/routes/system/schema.d.ts.map +1 -0
  816. package/dist/routes/system/schema.js +109 -0
  817. package/dist/routes/system/schema.js.map +1 -0
  818. package/dist/routes/views/index.d.ts +21 -0
  819. package/dist/routes/views/index.d.ts.map +1 -0
  820. package/dist/routes/views/index.js +155 -0
  821. package/dist/routes/views/index.js.map +1 -0
  822. package/dist/routes/views/schema.d.ts +127 -0
  823. package/dist/routes/views/schema.d.ts.map +1 -0
  824. package/dist/routes/views/schema.js +56 -0
  825. package/dist/routes/views/schema.js.map +1 -0
  826. package/dist/routes/widget-data/index.d.ts +29 -0
  827. package/dist/routes/widget-data/index.d.ts.map +1 -0
  828. package/dist/routes/widget-data/index.js +152 -0
  829. package/dist/routes/widget-data/index.js.map +1 -0
  830. package/dist/routes/widget-data/schema.d.ts +252 -0
  831. package/dist/routes/widget-data/schema.d.ts.map +1 -0
  832. package/dist/routes/widget-data/schema.js +44 -0
  833. package/dist/routes/widget-data/schema.js.map +1 -0
  834. package/dist/setup/service.d.ts +63 -0
  835. package/dist/setup/service.d.ts.map +1 -0
  836. package/dist/setup/service.js +103 -0
  837. package/dist/setup/service.js.map +1 -0
  838. package/dist/start.d.ts +12 -0
  839. package/dist/start.d.ts.map +1 -0
  840. package/dist/start.js +28 -0
  841. package/dist/start.js.map +1 -0
  842. package/dist/telemetry/payload.d.ts +66 -0
  843. package/dist/telemetry/payload.d.ts.map +1 -0
  844. package/dist/telemetry/payload.js +69 -0
  845. package/dist/telemetry/payload.js.map +1 -0
  846. package/dist/telemetry/service.d.ts +67 -0
  847. package/dist/telemetry/service.d.ts.map +1 -0
  848. package/dist/telemetry/service.js +103 -0
  849. package/dist/telemetry/service.js.map +1 -0
  850. package/dist/telemetry/update-check.d.ts +79 -0
  851. package/dist/telemetry/update-check.d.ts.map +1 -0
  852. package/dist/telemetry/update-check.js +103 -0
  853. package/dist/telemetry/update-check.js.map +1 -0
  854. package/dist/version.d.ts +14 -0
  855. package/dist/version.d.ts.map +1 -0
  856. package/dist/version.js +21 -0
  857. package/dist/version.js.map +1 -0
  858. package/dist/widget-data/cache.d.ts +35 -0
  859. package/dist/widget-data/cache.d.ts.map +1 -0
  860. package/dist/widget-data/cache.js +67 -0
  861. package/dist/widget-data/cache.js.map +1 -0
  862. package/dist/widget-data/compiler.d.ts +107 -0
  863. package/dist/widget-data/compiler.d.ts.map +1 -0
  864. package/dist/widget-data/compiler.js +362 -0
  865. package/dist/widget-data/compiler.js.map +1 -0
  866. package/dist/widget-data/shapers.d.ts +75 -0
  867. package/dist/widget-data/shapers.d.ts.map +1 -0
  868. package/dist/widget-data/shapers.js +128 -0
  869. package/dist/widget-data/shapers.js.map +1 -0
  870. package/dist/widget-data/stream-publisher.d.ts +42 -0
  871. package/dist/widget-data/stream-publisher.d.ts.map +1 -0
  872. package/dist/widget-data/stream-publisher.js +34 -0
  873. package/dist/widget-data/stream-publisher.js.map +1 -0
  874. package/package.json +79 -0
  875. package/vocabulary/llm-allowlist.json +76 -0
@@ -0,0 +1,2 @@
1
+ import{r as y,j as e,M as R,b9 as F,S as C,eJ as l,fe as I,aw as A,ff as M,fg as fe,fh as ge,b6 as re,ai as he,aZ as be,c as D,at as K,fi as Q,dJ as ye,eM as oe,bZ as ve,b7 as je,fj as Ne,fk as J,eS as ie,fl as ce,eN as ke,eP as X,fm as Ce,fn as Te,fo as Se,fp as V,fq as Y,E as we,dT as Ee,dU as Ie,dV as ee,fr as ae,bu as Oe}from"./index-PB1II0WV.js";function $(a){return a.replace(/[_-]+/g," ").replace(/([a-z\d])([A-Z])/g,"$1 $2").trim().replace(/^\w/,s=>s.toUpperCase())}function q(a){return a.label??$(a.name)}function de(a){return a.label??$(a.name)}function ue(a,s){return a.tables.find(t=>t.id===s)}function $e(a,s){return s.logicalType!=="enum"||s.enumRef===null?[]:a.enums.find(t=>t.id===s.enumRef)?.values??[]}function Le(a,s){const t=a.relations.filter(n=>n.from.tableId===s||n.to.tableId===s);return{declared:t.filter(n=>n.kind==="declared-fk"||n.kind==="manifest"),inferred:t.filter(n=>n.kind==="inferred-name"||n.kind==="inferred-join-table"),overrides:t.filter(n=>n.kind==="override")}}const Pe=["many-to-one","one-to-one","one-to-many","many-to-many"],me=new Set(["column.label","column.semanticType","column.enumLabels","column.pii","column.hidden"]);function Re(a){return me.has(a.op)?a.columnName:a.op==="relation.add"||a.op==="relation.remove"?`${a.value.fromColumn}->${a.value.toTable}`:a.op==="relation.label"?`${a.value.fromColumn}->`:""}function T(a){return`${a.op}::${a.tableName}::${Re(a)}`}function U(a){return a===null||typeof a!="object"?JSON.stringify(a):Array.isArray(a)?`[${a.map(U).join(",")}]`:`{${Object.entries(a).filter(([,t])=>t!==void 0).sort(([t],[n])=>t<n?-1:t>n?1:0).map(([t,n])=>`${JSON.stringify(t)}:${U(n)}`).join(",")}}`}function pe(a,s){return a===null||s===null?a===s:U({...a.item,status:a.status??"active"})===U({...s.item,status:s.status??"active"})}function Ke(a){const s=new Map;for(const t of a){const n={op:t.op,tableName:t.tableName,...t.columnName===null?{}:{columnName:t.columnName},value:t.value};s.set(T(n),{item:n,...t.status==="disabled"?{status:"disabled"}:{}})}return s}function Me(a,s,t){const n=T(t.item),o=new Map(s);return pe(a.get(n)??null,t)?o.delete(n):o.set(n,t),o}function qe(a,s,t){const n=new Map(s);return a.has(t)?n.set(t,null):n.delete(t),n}function Ae(a,s){const t=new Map(a);return t.delete(s),t}function Fe(a,s,t){return s.has(t)?s.get(t)??null:a.get(t)??null}function De(a,s){const t=[];for(const[n,o]of s){const c=a.get(n)??null;pe(c,o)||c===null&&o===null||t.push({key:n,kind:c===null?"add":o===null?"remove":"edit",next:o,previous:c})}return t.sort((n,o)=>n.key<o.key?-1:1)}function Ue(a,s){const t=new Map(a);for(const[o,c]of s)c===null?t.delete(o):t.set(o,c);return{overrides:[...t.keys()].sort().map(o=>{const{item:c,status:p}=t.get(o);return{op:c.op,tableName:c.tableName,...me.has(c.op)?{columnName:c.columnName}:{},value:c.value,...p==="disabled"?{status:p}:{}}})}}function _e(a){const s=y.useMemo(()=>Ke(a??[]),[a]),[t,n]=y.useState(new Map),o=y.useCallback(i=>Fe(s,t,i),[s,t]),c=y.useCallback((i,u)=>{n(d=>Me(s,d,{item:i,...u==="disabled"?{status:u}:{}}))},[s]),p=y.useCallback(i=>n(u=>qe(s,u,i)),[s]),j=y.useCallback(i=>n(u=>Ae(u,i)),[]),f=y.useCallback(()=>n(new Map),[]),x=y.useMemo(()=>De(s,t),[s,t]),k=y.useCallback(()=>Ue(s,t),[s,t]);return{get:o,stage:c,drop:p,revert:j,revertAll:f,clear:f,changes:x,dirty:x.length>0,buildDocument:k}}const ze=["neutral","accent","pos","warn","danger","info"];function Be({model:a,table:s,column:t,buffer:n,fieldError:o}){const c={tableName:s.id,columnName:t.name},p=T({op:"column.label",...c,value:{label:""}}),j=T({op:"column.semanticType",...c,value:{semanticType:""}}),f=T({op:"column.pii",...c,value:{masked:!0}}),x=T({op:"column.enumLabels",...c,value:{labels:{}}}),k=n.get(p),i=k!==null&&k.item.op==="column.label"?k.item.value.label:null,u=n.get(j),d=u!==null&&u.item.op==="column.semanticType"?u.item.value:null,v=n.get(f),S=v!==null&&v.item.op==="column.pii"?v.item.value:null,N=n.get(x),O=N!==null&&N.item.op==="column.enumLabels"?N.item.value:null,g=t.semantics,w=g?.primary??"plain",r=g===null?null:Math.round(g.confidence*100),E=g?.flags.pii??null,L=S?.masked??t.masked??g?.flags.maskedByDefault===!0,h=$e(a,t),z=h.length>0,xe=m=>{n.stage({op:"column.pii",...c,value:{masked:m,...E===null?{}:{kind:E}}})},B=O?.labels??t.enumLabels??{},H=O?.tones??t.enumTones??{},W=(m,b)=>{if(Object.keys(m).length===0&&Object.keys(b).length===0){n.drop(x);return}n.stage({op:"column.enumLabels",...c,value:{labels:m,...Object.keys(b).length===0?{}:{tones:b}}})},Z=d?.semanticType??w;return e.jsxs("div",{className:"flex flex-col gap-5","data-testid":"column-inspector",children:[e.jsxs("header",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h3",{className:"text-section text-fg",children:i??de(t)}),e.jsxs(R,{className:"text-[11px] text-fg-subtle",children:[s.id,".",t.name]}),e.jsx(F,{mono:!0,children:t.dbType}),t.nullable?e.jsx(C,{tone:"neutral",children:l("studio.remap.column.nullable","nullable")}):null]}),e.jsx(I,{label:l("studio.remap.column.labelOverride","Display label"),helper:l("studio.remap.column.labelHelper","Inferred: {name}").replace("{name}",$(t.name)),...o===void 0?{}:{error:o},children:e.jsx(A,{value:i??t.label??"",placeholder:$(t.name),onChange:m=>{const b=m.target.value;b===""?n.drop(p):n.stage({op:"column.label",...c,value:{label:b}})}})}),e.jsx(I,{label:l("studio.remap.column.logicalType","Logical type"),helper:l("studio.remap.column.logicalTypeHelper","Inferred: {type} (from {dbType}) — mapped by the adapter; not overridable in v1.").replace("{type}",t.logicalType).replace("{dbType}",t.dbType),tag:e.jsx(F,{mono:!0,children:t.logicalType}),children:e.jsx(M,{disabled:!0,value:t.logicalType,onChange:()=>{},mono:!0,children:fe.map(m=>e.jsx("option",{value:m,children:m},m))})}),e.jsx(I,{label:l("studio.remap.column.semantic","Semantic type"),helper:g===null?l("studio.remap.column.unclassified","Not classified yet."):l("studio.remap.column.semanticHelper","Classifier: {tag} · {confidence}% confidence · source: {source}").replace("{tag}",g.primary).replace("{confidence}",String(r)).replace("{source}",g.source),children:e.jsxs(M,{value:d?.semanticType??"",onChange:m=>{const b=m.target.value;b===""?n.drop(j):n.stage({op:"column.semanticType",...c,value:{semanticType:b}})},children:[e.jsx("option",{value:"",children:l("studio.remap.column.semanticInferred","inferred: {tag}").replace("{tag}",w)}),ge.map(m=>e.jsx("option",{value:m,children:m},m))]})}),d?.semanticType==="money"?e.jsx(I,{label:l("studio.remap.column.currency","Currency"),helper:l("studio.remap.column.currencyHelper","ISO 4217 code applied to money formatting."),children:e.jsx(A,{mono:!0,value:d.currency??"",placeholder:"USD",onChange:m=>{const b=m.target.value.toUpperCase();n.stage({op:"column.semanticType",...c,value:{semanticType:"money",...b===""?{}:{currency:b}}})}})}):null,e.jsxs("label",{className:"flex items-center justify-between gap-3",children:[e.jsxs("span",{className:"flex flex-col",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-body-sm font-medium text-fg",children:[l("studio.remap.column.pii","Mask by default"),E!==null?e.jsx(C,{tone:"warn",children:E}):null]}),e.jsx("span",{className:"text-[11.5px] text-fg-muted",children:l("studio.remap.column.piiHelper","Masked values render redacted; unmasking requires the data.unmask_pii permission and is audit-logged.")})]}),e.jsx(re,{checked:L,"aria-label":l("studio.remap.column.pii","Mask by default"),onCheckedChange:xe})]}),z?e.jsxs("section",{className:"flex flex-col gap-3","data-testid":"enum-editor",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.column.enum","Enum semantics")}),e.jsx(he,{"aria-label":l("studio.remap.column.enumKind","Enum kind"),options:[{value:"status-workflow",label:l("studio.remap.column.enumWorkflow","Workflow"),dot:"accent"},{value:"category-enum",label:l("studio.remap.column.enumCategory","Category")}],value:Z==="status-workflow"?"status-workflow":"category-enum",onValueChange:m=>{m!==Z&&n.stage({op:"column.semanticType",...c,value:{semanticType:m}})}}),e.jsx("ul",{className:"flex flex-col gap-2",children:h.map(m=>e.jsxs("li",{className:"grid grid-cols-[minmax(4rem,1fr)_minmax(6rem,1.4fr)_auto] items-center gap-2",children:[e.jsx(R,{className:"truncate text-[12px]",children:m}),e.jsx(A,{"aria-label":l("studio.remap.column.enumLabelFor","Label for {value}").replace("{value}",m),value:B[m]??"",placeholder:$(m),onChange:b=>{const P={...B};b.target.value===""?delete P[m]:P[m]=b.target.value,W(P,H)}}),e.jsxs(M,{"aria-label":l("studio.remap.column.enumToneFor","Tone for {value}").replace("{value}",m),value:H[m]??"",onChange:b=>{const P={...H};b.target.value===""?delete P[m]:P[m]=b.target.value,W(B,P)},children:[e.jsx("option",{value:"",children:l("studio.remap.column.enumToneAuto","auto")}),ze.map(b=>e.jsx("option",{value:b,children:b},b))]})]},m))}),e.jsx("p",{className:"text-[11.5px] text-fg-muted",children:l("studio.remap.column.enumHelper","Workflow enums drive status pills and board columns; tones map values onto the semantic tint scale.")})]}):null]})}function te(a){const s=a.next?.item??a.previous?.item;if(s===void 0)return a.key;const t="columnName"in s&&typeof s.columnName=="string"?`.${s.columnName}`:"";return`${s.op} · ${s.tableName}${t}`}const He={add:"pos",edit:"accent",remove:"danger"};function Qe({changes:a,onRevert:s,onRevertAll:t,onSave:n,saving:o,errorKey:c,canRegenerate:p,onRegenerate:j,regenerating:f}){return a.length===0&&!p?null:e.jsxs("div",{"data-testid":"diff-bar",className:"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-surface p-3 shadow-card",children:[a.length>0?e.jsx("span",{className:"text-body-sm font-semibold text-fg",children:a.length===1?l("studio.remap.diff.one","1 change"):l("studio.remap.diff.count","{count} changes").replace("{count}",String(a.length))}):e.jsx("span",{className:"text-body-sm text-fg-muted",children:l("studio.remap.diff.saved","Overrides saved.")}),e.jsx("ul",{className:"flex min-w-0 flex-1 flex-wrap items-center gap-1.5",children:a.map(x=>e.jsx("li",{children:e.jsxs(C,{tone:c===x.key?"danger":He[x.kind],className:D("gap-1",c===x.key&&"ring-1 ring-danger"),children:[e.jsx("span",{className:"font-mono",children:te(x)}),e.jsx("button",{type:"button","aria-label":l("studio.remap.diff.revertOne","Revert {change}").replace("{change}",te(x)),className:"rounded-full hover:opacity-70",onClick:()=>s(x.key),children:e.jsx(be,{"aria-hidden":!0,className:"size-3"})})]})},x.key))}),e.jsxs("span",{className:"ms-auto flex items-center gap-2",children:[p?e.jsx(K,{variant:"soft",size:"sm",loading:f,onClick:j,children:l("studio.remap.diff.regenerate","Regenerate pages")}):null,a.length>0?e.jsxs(e.Fragment,{children:[e.jsx(K,{variant:"ghost",size:"sm",disabled:o,onClick:t,children:l("studio.remap.diff.revertAll","Revert all")}),e.jsx(K,{size:"sm",loading:o,onClick:n,children:l("studio.remap.diff.save","Save overrides")})]}):null]})]})}function G(a){const s=`${a.from.tableId}.${a.from.columns.join("+")}`,t=`${a.to.tableId}.${a.to.columns.join("+")}`;return`${s} → ${t}`}function le(a){return a.cardinality==="one-to-many"?"many-to-one":a.cardinality}function Ve({model:a,table:s,buffer:t}){const{declared:n,inferred:o,overrides:c}=Le(a,s.id),[p,j]=y.useState(null),[f,x]=y.useState(null),[k,i]=y.useState(null),[u,d]=y.useState("many-to-one"),v=r=>T({op:"relation.add",tableName:r.from.tableId,value:{fromColumn:r.from.columns[0]??"",toTable:r.to.tableId,toColumn:r.to.columns[0]??"",cardinality:le(r)}}),S=r=>T({op:"relation.remove",tableName:r.from.tableId,value:{fromColumn:r.from.columns[0]??"",toTable:r.to.tableId}}),N=r=>{t.drop(S(r)),t.stage({op:"relation.add",tableName:r.from.tableId,value:{fromColumn:r.from.columns[0]??"",toTable:r.to.tableId,toColumn:r.to.columns[0]??"",cardinality:le(r)}})},O=r=>{t.drop(v(r)),t.stage({op:"relation.remove",tableName:r.from.tableId,value:{fromColumn:r.from.columns[0]??"",toTable:r.to.tableId}})},g=f===null?void 0:ue(a,f),w=p!==null&&f!==null&&k!==null;return e.jsxs("div",{className:"flex flex-col gap-5","data-testid":"relations-tab",children:[e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.relations.declared","Declared foreign keys")}),n.length===0?e.jsx("p",{className:"text-body-sm text-fg-muted",children:l("studio.remap.relations.noneDeclared","No declared foreign keys touch this table.")}):e.jsx("ul",{className:"flex flex-col gap-1.5",children:n.map(r=>e.jsxs("li",{className:"flex items-center gap-2",children:[e.jsx(R,{className:"truncate text-[12px]",children:G(r)}),e.jsx(C,{tone:"info",children:r.cardinality})]},r.id))})]}),e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.relations.inferred","Inferred relations")}),o.length===0?e.jsx("p",{className:"text-body-sm text-fg-muted",children:l("studio.remap.relations.noneInferred","Nothing inferred for this table.")}):e.jsx("ul",{className:"flex flex-col gap-2",children:o.map(r=>{const E=t.get(v(r))!==null,L=t.get(S(r))!==null;return e.jsxs("li",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(R,{className:"truncate text-[12px]",children:G(r)}),e.jsx(C,{tone:"accent",children:l("studio.remap.relations.confidence","inferred · {pct}%").replace("{pct}",String(Math.round(r.confidence*100)))}),E?e.jsx(C,{tone:"pos",children:l("studio.remap.relations.accepted","Accepted")}):null,L?e.jsx(C,{tone:"danger",children:l("studio.remap.relations.suppressed","Suppressed")}):null,e.jsxs("span",{className:"ms-auto flex items-center gap-1",children:[e.jsx(K,{size:"sm",variant:"secondary",disabled:E,onClick:()=>N(r),children:l("studio.remap.relations.accept","Accept")}),e.jsx(K,{size:"sm",variant:"ghost",disabled:L,onClick:()=>O(r),children:l("studio.remap.relations.suppress","Suppress")})]})]},r.id)})})]}),c.length>0?e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.relations.overrides","Override relations (applied)")}),e.jsx("ul",{className:"flex flex-col gap-1.5",children:c.map(r=>e.jsxs("li",{className:"flex items-center gap-2",children:[e.jsx(R,{className:"truncate text-[12px]",children:G(r)}),e.jsx(C,{tone:"pos",children:l("studio.remap.relations.overrideBadge","override")})]},r.id))})]}):null,e.jsxs("section",{className:"flex flex-col gap-3",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.relations.add","Add virtual relation")}),e.jsx(I,{label:l("studio.remap.relations.fromColumn","From column"),children:e.jsx(Q,{mono:!0,options:s.columns.map(r=>({value:r.name,label:r.name})),value:p,onValueChange:j,emptyText:l("studio.remap.relations.noColumns","No matching column"),placeholder:l("studio.remap.relations.fromPlaceholder","customer_id")})}),e.jsx(I,{label:l("studio.remap.relations.toTable","To table"),children:e.jsx(Q,{mono:!0,options:a.tables.map(r=>({value:r.id,label:r.id,description:q(r)})),value:f,onValueChange:r=>{x(r),i(null)},emptyText:l("studio.remap.relations.noTables","No matching table"),placeholder:"public.customers"})}),e.jsx(I,{label:l("studio.remap.relations.toColumn","To column"),children:e.jsx(Q,{mono:!0,options:(g?.columns??[]).map(r=>({value:r.name,label:r.name})),value:k,onValueChange:i,disabled:g===void 0,emptyText:l("studio.remap.relations.noColumns","No matching column"),placeholder:"id"})}),e.jsx(I,{label:l("studio.remap.relations.cardinality","Cardinality"),children:e.jsx(M,{value:u,onChange:r=>d(r.target.value),children:Pe.map(r=>e.jsx("option",{value:r,children:r},r))})}),e.jsx("div",{children:e.jsx(K,{variant:"secondary",disabled:!w,onClick:()=>{w&&(t.stage({op:"relation.add",tableName:s.id,value:{fromColumn:p,toTable:f,toColumn:k,cardinality:u}}),j(null),x(null),i(null))},children:l("studio.remap.relations.addButton","Add relation")})})]})]})}function Ge({type:a}){return e.jsx(F,{mono:!0,children:a})}function Je({column:a}){const s=a.semantics?.flags.pii??null,t=a.masked??a.semantics?.flags.maskedByDefault===!0;return e.jsxs("span",{className:"inline-flex items-center gap-1",children:[a.isPrimaryKey?e.jsx(C,{tone:"accent",children:l("studio.remap.badge.pk","PK")}):null,a.references!==null?e.jsx(C,{tone:"info",children:l("studio.remap.badge.fk","FK")}):null,a.isUnique&&!a.isPrimaryKey?e.jsx(C,{tone:"neutral",children:l("studio.remap.badge.unique","UNIQUE")}):null,s!==null?e.jsx(C,{tone:"warn",children:l("studio.remap.badge.pii","PII")}):null,t?e.jsx(C,{tone:"warn",dot:!0,children:l("studio.remap.badge.masked","Masked")}):null]})}function We(a,s){const t=a.get(T({op:"table.label",tableName:s.id,value:{label:""}}));return t===null||t.item.op!=="table.label"?null:t.item.value.label}function Ze(a,s,t){const n=a.get(T({op:"column.label",tableName:s,columnName:t,value:{label:""}}));return n===null||n.item.op!=="column.label"?null:n.item.value.label}function Xe({model:a,buffer:s,selection:t,onSelect:n}){const[o,c]=y.useState(""),[p,j]=y.useState(new Set),f=o.trim().toLowerCase(),x=y.useMemo(()=>f===""?a.tables:a.tables.filter(i=>i.name.toLowerCase().includes(f)||q(i).toLowerCase().includes(f)||i.columns.some(u=>u.name.toLowerCase().includes(f))),[a.tables,f]),k=i=>{j(u=>{const d=new Set(u);return d.has(i)?d.delete(i):d.add(i),d})};return e.jsxs("nav",{"aria-label":l("studio.remap.tree.label","Schema"),className:"flex min-h-0 flex-col gap-2",children:[e.jsx(ye,{"aria-label":l("studio.remap.tree.search","Search tables and columns"),placeholder:l("studio.remap.tree.searchPlaceholder","Search tables…"),value:o,onChange:i=>c(i.target.value),onClear:()=>c(""),clearLabel:l("common.clear","Clear")}),e.jsxs("ul",{className:"min-h-0 flex-1 overflow-y-auto pe-1","data-testid":"remap-tree",children:[x.length===0?e.jsx("li",{className:"p-3 text-body-sm text-fg-muted",children:l("studio.remap.tree.noMatches","No tables match your search.")}):null,x.map(i=>{const u=p.has(i.id)||f!=="",d=We(s,i),v=d??q(i),S=t?.kind==="table"&&t.tableId===i.id,N=s.get(T({op:"table.exclude",tableName:i.id,value:{excluded:!0}}))?.item.op==="table.exclude"?(s.get(T({op:"table.exclude",tableName:i.id,value:{excluded:!0}}))?.item.value).excluded:i.excluded===!0,O=oe(i.icon??"table");return e.jsxs("li",{children:[e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx("button",{type:"button","aria-label":u?l("studio.remap.tree.collapse","Collapse table"):l("studio.remap.tree.expand","Expand table"),"aria-expanded":u,className:"rounded-sm p-1 text-fg-muted hover:text-fg",onClick:()=>k(i.id),children:u?e.jsx(ve,{className:"size-3.5"}):e.jsx(je,{className:"size-3.5 rtl:-scale-x-100"})}),e.jsxs("button",{type:"button","aria-current":S?"true":void 0,className:D("flex min-w-0 flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-start text-body-sm",S?"bg-surface-2 text-fg":"text-fg hover:bg-surface-2",N&&"opacity-60"),onClick:()=>{n({kind:"table",tableId:i.id}),j(g=>new Set(g).add(i.id))},children:[e.jsx(O,{"aria-hidden":!0,className:"size-4 shrink-0 text-fg-muted"}),e.jsx("span",{className:"truncate font-medium",children:v}),d!==null?e.jsx("span",{"aria-label":l("studio.remap.tree.unsaved","Unsaved change"),className:"size-1.5 shrink-0 rounded-full bg-accent"}):null,e.jsx(R,{className:"ms-auto truncate text-[11px] text-fg-subtle",children:i.name}),N?e.jsx(C,{tone:"neutral",children:l("studio.remap.tree.excluded","Excluded")}):null]})]}),u?e.jsx("ul",{className:"ms-5 border-s border-border ps-2",children:i.columns.map(g=>{const w=Ze(s,i.id,g.name),r=t?.kind==="column"&&t.tableId===i.id&&t.column===g.name;return e.jsx("li",{children:e.jsxs("button",{type:"button","aria-current":r?"true":void 0,className:D("flex w-full items-center gap-2 rounded-md px-2 py-1 text-start text-body-sm",r?"bg-surface-2 text-fg":"text-fg-muted hover:bg-surface-2 hover:text-fg"),onClick:()=>n({kind:"column",tableId:i.id,column:g.name}),children:[e.jsx("span",{className:"truncate",children:w??de(g)}),w!==null?e.jsx("span",{"aria-label":l("studio.remap.tree.unsaved","Unsaved change"),className:"size-1.5 shrink-0 rounded-full bg-accent"}):null,e.jsxs("span",{className:"ms-auto flex shrink-0 items-center gap-1",children:[e.jsx(Ge,{type:g.logicalType}),e.jsx(Je,{column:g})]})]})},g.name)})}):null]},i.id)})]})]})}const Ye=["table","users","user-round","building-2","shopping-cart","package","truck","credit-card","receipt","file-text","folder","calendar","clock","tag","star","heart","mail","message-square","map-pin","globe","database","layers","bar-chart-3","book-open"];function ea({value:a,onChange:s}){return e.jsx("div",{role:"group","aria-label":l("studio.remap.table.iconPicker","Table icon"),className:"grid grid-cols-8 gap-1",children:Ye.map(t=>{const n=oe(t),o=a===t;return e.jsx("button",{type:"button",title:t,"aria-label":t,"aria-pressed":o,className:D("flex items-center justify-center rounded-md border p-1.5 text-fg-muted transition-colors",o?"border-accent bg-accent-soft text-accent":"border-border hover:bg-surface-2 hover:text-fg"),onClick:()=>s(o?null:t),children:e.jsx(n,{"aria-hidden":!0,className:"size-4"})},t)})})}const aa=["workspace","library","planning","people","account"];function ta({table:a,buffer:s,fieldError:t}){const n=T({op:"table.label",tableName:a.id,value:{label:""}}),o=T({op:"table.exclude",tableName:a.id,value:{excluded:!0}}),c=s.get(n),p=c!==null&&c.item.op==="table.label"?c.item.value:null,j=p?.label??"",f=p?.icon??null,x=s.get(o),k=x!==null&&x.item.op==="table.exclude"?x.item.value.excluded:a.excluded===!0,i=(d,v)=>{if(d===""&&v===null){s.drop(n);return}s.stage({op:"table.label",tableName:a.id,value:{label:d===""?q(a):d,...v===null?{}:{icon:v}}})},u=a.semantics;return e.jsxs("div",{className:"flex flex-col gap-5","data-testid":"table-inspector",children:[e.jsxs("header",{className:"flex items-center gap-2",children:[e.jsx("h3",{className:"text-section text-fg",children:q(a)}),e.jsx(R,{className:"text-[11px] text-fg-subtle",children:a.id}),a.system?e.jsx(C,{tone:"neutral",children:l("studio.remap.table.system","System")}):null]}),e.jsx(I,{label:l("studio.remap.table.labelOverride","Display label"),helper:l("studio.remap.table.labelHelper","Inferred: {name}").replace("{name}",$(a.name)),...t===void 0?{}:{error:t},children:e.jsx(A,{value:j!==""?j:a.label??"",placeholder:$(a.name),onChange:d=>i(d.target.value,f??a.icon??null)})}),e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx("span",{className:"text-body-sm font-medium text-fg",children:l("studio.remap.table.icon","Icon")}),e.jsx(ea,{value:f??a.icon??null,onChange:d=>i(j!==""?j:a.label??"",d)})]}),e.jsx(I,{label:l("studio.remap.table.navGroup","Nav group"),helper:l("studio.remap.table.navGroupHelper","Nav placement is decided by the generator — a table.navGroup override is not in the v1 vocabulary."),children:e.jsx(M,{disabled:!0,defaultValue:"workspace",children:aa.map(d=>e.jsx("option",{value:d,children:$(d)},d))})}),e.jsxs("label",{className:"flex items-center justify-between gap-3",children:[e.jsxs("span",{className:"flex flex-col",children:[e.jsx("span",{className:"text-body-sm font-medium text-fg",children:l("studio.remap.table.include","Include in generated app")}),e.jsx("span",{className:"text-[11.5px] text-fg-muted",children:l("studio.remap.table.includeHelper","Excluded tables get no pages and disappear from nav.")})]}),e.jsx(re,{checked:!k,"aria-label":l("studio.remap.table.include","Include in generated app"),onCheckedChange:d=>{d?s.drop(o):s.stage({op:"table.exclude",tableName:a.id,value:{excluded:!0}})}})]}),e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h4",{className:"text-body-sm font-semibold text-fg",children:l("studio.remap.table.shape","Table shape (classified)")}),e.jsx(Ne,{items:[{label:l("studio.remap.table.role","Role"),value:u===null?l("studio.remap.table.unclassified","Not classified"):u.role},{label:l("studio.remap.table.kind","Kind"),value:a.kind},{label:l("studio.remap.table.hierarchy","Hierarchy"),value:u?.hierarchy==null?"—":l("studio.remap.table.selfFk","Self-reference via {column}").replace("{column}",u.hierarchy.parentColumn)},{label:l("studio.remap.table.polymorphic","Polymorphic pairs"),value:u===null||u.polymorphic.length===0?"—":u.polymorphic.map(d=>`${d.typeColumn}/${d.idColumn}`).join(", ")},{label:l("studio.remap.table.rows","Row estimate"),value:a.rowCountEstimate===null?"—":String(a.rowCountEstimate)}]}),e.jsx("p",{className:"text-[11.5px] text-fg-muted",children:l("studio.remap.table.shapeHelper","Classification is recomputed on every introspection; overrides layer on top and survive regeneration.")}),u!==null?e.jsx(F,{mono:!0,children:u.role}):null]})]})}async function la(a,s){const t=await fetch(a,{method:"PUT",credentials:"same-origin",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(s)});let n=null;try{n=await t.json()}catch{}if(!t.ok){const o=n??{};throw new ce(t.status,typeof o.error?.code=="string"?o.error.code:"INTERNAL",typeof o.error?.message=="string"?o.error.message:`Request failed with status ${t.status}.`,typeof o.error?.requestId=="string"?o.error.requestId:t.headers.get("x-request-id")??null,o.error?.details)}return n}const _=a=>`/api/v1/connections/${encodeURIComponent(a)}`;function se(a){return ie({queryKey:["studio","remap","schema",a],queryFn:()=>J.get(`${_(a)}/schema`)})}function ne(a){return ie({queryKey:["studio","remap","overrides",a],queryFn:()=>J.get(`${_(a)}/overrides`)})}function sa(a,s){return la(`${_(a)}/overrides`,s)}function na(a){return J.post(`${_(a)}/generate`)}function ra(a){const s=a.details??{},t=s.item;let n=null;return t!==void 0&&typeof t.op=="string"&&typeof t.tableName=="string"&&(n=T({op:t.op,tableName:t.tableName,...typeof t.columnName=="string"?{columnName:t.columnName}:{},value:t.value??{}})),{message:a.message,key:n,tableName:t?.tableName??s.table??null,columnName:(typeof t?.columnName=="string"?t.columnName:null)??s.column??null}}function ia({connectionId:a}){const s=ke(),t=X(se(a)),n=X(ne(a)),o=_e(n.data?.overrides),c=Ce(),[p,j]=y.useState(null),[f,x]=y.useState(!1),[k,i]=y.useState(!1),[u,d]=y.useState(!1),[v,S]=y.useState(null),N=t.data?.model,O=async()=>{x(!0),S(null);try{await sa(a,o.buildDocument()),o.clear(),d(!0),c.push({variant:"success",title:l("studio.remap.toast.saved","Schema overrides saved"),description:l("studio.remap.toast.savedDetail","The applied schema below reflects your changes.")}),await Promise.all([s.invalidateQueries({queryKey:se(a).queryKey}),s.invalidateQueries({queryKey:ne(a).queryKey})])}catch(h){h instanceof ce&&h.status===422?S(ra(h)):S({message:h instanceof Error?h.message:String(h),key:null,tableName:null,columnName:null})}finally{x(!1)}},g=async()=>{i(!0);try{const h=await na(a);c.push({variant:"success",title:l("studio.remap.toast.regenerated","{created} created · {updated} updated · {unchanged} unchanged").replace("{created}",String(h.result.created)).replace("{updated}",String(h.result.updated)).replace("{unchanged}",String(h.result.unchanged)),description:l("studio.remap.toast.regeneratedDetail","Pages you edited by hand are preserved — only pages with an untouched generated_hash were regenerated in place.")})}catch(h){c.push({variant:"error",title:l("studio.remap.toast.regenerateFailed","Regeneration failed"),description:h instanceof Error?h.message:void 0})}finally{i(!1)}},w=(h,z)=>v!==null&&v.tableName===h&&v.columnName===z?v.message:void 0,r=N!==void 0&&p!==null?ue(N,p.tableId):void 0,E=p?.kind==="column"&&r!==void 0?r.columns.find(h=>h.name===p.column):void 0,L=N===void 0?[]:Te(Se(N));return e.jsxs("div",{className:"flex h-full min-h-0 flex-col gap-3 p-4",children:[e.jsxs("header",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-section text-fg",children:l("studio.remap.title","Schema remap")}),t.data!==void 0?e.jsx("span",{className:"text-body-sm text-fg-muted",children:l("studio.remap.subtitle","{tables} tables · {applied} overrides applied").replace("{tables}",String(t.data.model.tables.length)).replace("{applied}",String(t.data.appliedOverrides))}):null]}),L.length>0?e.jsx(V,{tone:"info",children:e.jsx("span",{className:"flex flex-col gap-0.5",children:L.map(h=>e.jsx("span",{children:h},h))})}):null,v!==null?e.jsx(V,{tone:"danger",role:"alert",children:l("studio.remap.saveFailed","Save failed: {message}").replace("{message}",v.message)}):null,t.isError?e.jsx(V,{tone:"danger",role:"alert",children:l("studio.remap.loadFailed","Could not load the schema for this connection.")}):null,t.isPending||n.isPending?e.jsxs("div",{className:"flex flex-col gap-2","aria-busy":"true",children:[e.jsx(Y,{className:"h-8 w-full"}),e.jsx(Y,{className:"h-40 w-full"})]}):null,N!==void 0?e.jsxs("div",{className:"grid min-h-0 flex-1 grid-cols-1 gap-4 md:grid-cols-[minmax(16rem,22rem)_1fr]",children:[e.jsx(Xe,{model:N,buffer:o,selection:p,onSelect:j}),e.jsx("section",{"aria-label":l("studio.remap.inspector","Inspector"),className:"min-h-0 overflow-y-auto rounded-lg border border-border bg-surface p-4",children:p===null||r===void 0?e.jsx(we,{preset:"no-data",title:l("studio.remap.empty.title","Pick a table or column"),body:l("studio.remap.empty.description","Select something in the schema tree to remap its label, type, relations or masking.")}):p.kind==="column"&&E!==void 0?e.jsx(Be,{model:N,table:r,column:E,buffer:o,fieldError:w(r.id,E.name)}):e.jsxs(Ee,{defaultValue:"details",children:[e.jsxs(Ie,{children:[e.jsx(ee,{value:"details",children:l("studio.remap.tabs.details","Details")}),e.jsx(ee,{value:"relations",children:l("studio.remap.tabs.relations","Relations")})]}),e.jsx(ae,{value:"details",className:"pt-4",children:e.jsx(ta,{table:r,buffer:o,fieldError:w(r.id,null)})}),e.jsx(ae,{value:"relations",className:"pt-4",children:e.jsx(Ve,{model:N,table:r,buffer:o})})]})})]}):null,e.jsx(Qe,{changes:o.changes,onRevert:o.revert,onRevertAll:o.revertAll,onSave:()=>{O()},saving:f,errorKey:v?.key??null,canRegenerate:u,onRegenerate:()=>{g()},regenerating:k}),e.jsx(Oe,{...c.stackProps,dismissLabel:l("common.dismiss","Dismiss"),label:l("common.notifications","Notifications")})]})}export{ia as RemapEditor};
2
+ //# sourceMappingURL=RemapEditor-z3vRY12e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemapEditor-z3vRY12e.js","sources":["../../src/studio/remap/model.ts","../../src/studio/remap/overrides.ts","../../src/studio/remap/useRemapBuffer.ts","../../src/studio/remap/ColumnInspector.tsx","../../src/studio/remap/DiffBar.tsx","../../src/studio/remap/RelationsTab.tsx","../../src/studio/remap/badges.tsx","../../src/studio/remap/SchemaTree.tsx","../../src/studio/remap/IconPicker.tsx","../../src/studio/remap/TableInspector.tsx","../../src/studio/remap/api.ts","../../src/studio/remap/RemapEditor.tsx"],"sourcesContent":["/**\n * Reply/display types for the remap editor.\n *\n * `Effective*` mirrors the server's applied-overrides read shape\n * (`apps/server/src/connections/effective-schema.ts`): the engine\n * `DatabaseModel` with display-layer fields attached by\n * `GET /connections/:id/schema`. Engine types are imported (dashboard\n * legally depends on @adminium/engine); the display extensions are mirrored\n * because server code is not importable from the dashboard.\n */\nimport type { ColumnModel, DatabaseModel, Relation, TableModel } from '@adminium/engine';\n\nexport interface EffectiveColumn extends ColumnModel {\n label?: string;\n hidden?: boolean;\n /** Resolved mask state (overrides > classifier default). */\n masked?: boolean;\n enumLabels?: Record<string, string>;\n enumTones?: Record<string, string>;\n}\n\nexport interface EffectiveTable extends Omit<TableModel, 'columns'> {\n columns: EffectiveColumn[];\n /** Widened to match engine `TableModel.label` (now carries the field) under exactOptionalPropertyTypes. */\n label?: string | undefined;\n labelPlural?: string;\n icon?: string;\n excluded?: boolean;\n keyField?: string;\n}\n\nexport interface EffectiveRelation extends Relation {\n label?: string;\n}\n\nexport interface EffectiveModel extends Omit<DatabaseModel, 'tables' | 'relations'> {\n tables: EffectiveTable[];\n relations: EffectiveRelation[];\n}\n\n/** `GET /connections/:id/schema` reply (server `schemaReply`). */\nexport interface SchemaReply {\n connectionId: string;\n snapshotId: string;\n checksum: string;\n createdAt: number;\n source: string;\n model: EffectiveModel;\n appliedOverrides: number;\n}\n\n/** `POST /connections/:id/generate` reply (server `generateReply`). */\nexport interface GenerateReply {\n pages: number;\n navGroups: string[];\n snapshotId: string;\n introspected: boolean;\n intent: string;\n result: { created: number; updated: number; unchanged: number; pruned: number };\n warnings: unknown[];\n durationMs: number;\n}\n\n// --- selection ----------------------------------------------------------------\n\nexport type RemapSelection =\n | { kind: 'table'; tableId: string }\n | { kind: 'column'; tableId: string; column: string };\n\n// --- display helpers ------------------------------------------------------------\n\nexport function titleCase(name: string): string {\n return name\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .trim()\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/** Server-applied display label (override already applied) or a derived one. */\nexport function tableDisplayLabel(table: EffectiveTable): string {\n return table.label ?? titleCase(table.name);\n}\n\nexport function columnDisplayLabel(column: EffectiveColumn): string {\n return column.label ?? titleCase(column.name);\n}\n\nexport function tableById(model: EffectiveModel, tableId: string): EffectiveTable | undefined {\n return model.tables.find((table) => table.id === tableId);\n}\n\n/** Ordered values of the enum a column references ([] when not an enum). */\nexport function enumValuesFor(model: EffectiveModel, column: EffectiveColumn): string[] {\n if (column.logicalType !== 'enum' || column.enumRef === null) return [];\n return model.enums.find((def) => def.id === column.enumRef)?.values ?? [];\n}\n\nexport interface TableRelations {\n declared: EffectiveRelation[];\n inferred: EffectiveRelation[];\n overrides: EffectiveRelation[];\n}\n\n/** Relations touching a table, bucketed the way the Relations tab lists them. */\nexport function relationsForTable(model: EffectiveModel, tableId: string): TableRelations {\n const touching = model.relations.filter(\n (relation) => relation.from.tableId === tableId || relation.to.tableId === tableId,\n );\n return {\n declared: touching.filter((r) => r.kind === 'declared-fk' || r.kind === 'manifest'),\n inferred: touching.filter((r) => r.kind === 'inferred-name' || r.kind === 'inferred-join-table'),\n overrides: touching.filter((r) => r.kind === 'override'),\n };\n}\n","/**\n * Override document model + dirty-state buffer for the schema remap editor\n * (05-introspection-engine.md overrides, 07-meta-store.md §3.15).\n *\n * The op/value vocabulary below MIRRORS the server contract — the Zod shapes\n * in `apps/server/src/routes/schema/schema.ts` (`overridesPutBody`) and\n * `@adminium/meta` `overridePatchSchema` are not importable from the\n * dashboard (dep-cruiser: apps/dashboard must not depend on apps/server or\n * @adminium/meta). The contract is pinned twice: `overrides.test.ts` asserts\n * the exact document this module emits, and\n * `apps/server/test/remap-payload-contract.test.ts` re-validates the same\n * literals against the real server schemas.\n *\n * Buffer model: `baseline` (rows currently persisted, from\n * `GET /connections/:id/overrides`) + `overlay` (local edits). An overlay\n * entry of `null` deletes the baseline op; an entry deep-equal to its\n * baseline row is not a change. Save = `PUT /connections/:id/overrides` with\n * the FULL document (the route replaces the connection's override set).\n */\n\n// --- op vocabulary (§3.15 mirror) -------------------------------------------\n\nexport const RELATION_OP_CARDINALITIES = [\n 'many-to-one',\n 'one-to-one',\n 'one-to-many',\n 'many-to-many',\n] as const;\nexport type RelationOpCardinality = (typeof RELATION_OP_CARDINALITIES)[number];\n\nexport type RemapOverride =\n | { op: 'table.label'; tableName: string; value: { label: string; labelPlural?: string; icon?: string } }\n | { op: 'table.exclude'; tableName: string; value: { excluded: boolean } }\n | { op: 'table.keyField'; tableName: string; value: { column: string } }\n | { op: 'column.label'; tableName: string; columnName: string; value: { label: string } }\n | {\n op: 'column.semanticType';\n tableName: string;\n columnName: string;\n value: { semanticType: string; currency?: string };\n }\n | {\n op: 'column.enumLabels';\n tableName: string;\n columnName: string;\n value: { labels: Record<string, string>; tones?: Record<string, string> };\n }\n | { op: 'column.pii'; tableName: string; columnName: string; value: { masked: boolean; kind?: string } }\n | { op: 'column.hidden'; tableName: string; columnName: string; value: { hidden: boolean } }\n | {\n op: 'relation.add';\n tableName: string;\n value: { fromColumn: string; toTable: string; toColumn: string; cardinality: RelationOpCardinality };\n }\n | { op: 'relation.remove'; tableName: string; value: { fromColumn: string; toTable: string } }\n | { op: 'relation.label'; tableName: string; value: { fromColumn: string; label: string } };\n\nexport type RemapOverrideOp = RemapOverride['op'];\n\n/** Ops that carry `columnName` in the PUT item (all others send none). */\nexport const COLUMN_OPS: ReadonlySet<string> = new Set([\n 'column.label',\n 'column.semanticType',\n 'column.enumLabels',\n 'column.pii',\n 'column.hidden',\n]);\n\n/** One staged op + its persistence status (`disabled` rows survive a PUT). */\nexport interface BufferEntry {\n item: RemapOverride;\n status?: 'active' | 'disabled';\n}\n\n/** Row shape of `GET /connections/:id/overrides` (server `overrideDto`). */\nexport interface OverrideDto {\n id: string;\n op: string;\n tableName: string;\n columnName: string | null;\n value: Record<string, unknown>;\n origin: string;\n status: string;\n createdAt: number;\n updatedAt: number;\n}\n\n/** Item shape of the PUT document (server `overridePutItem`). */\nexport interface OverridePutItem {\n op: string;\n tableName: string;\n columnName?: string;\n value: Record<string, unknown>;\n status?: 'active' | 'disabled';\n}\n\nexport interface OverridesPutDocument {\n overrides: OverridePutItem[];\n}\n\n// --- keying ------------------------------------------------------------------\n\nfunction columnKeyPart(item: RemapOverride): string {\n if (COLUMN_OPS.has(item.op)) return (item as { columnName: string }).columnName;\n // Relation ops target a (fromColumn[, toTable]) pair on the table; several\n // may coexist per table, so the value participates in the key.\n if (item.op === 'relation.add' || item.op === 'relation.remove') {\n return `${item.value.fromColumn}->${item.value.toTable}`;\n }\n if (item.op === 'relation.label') return `${item.value.fromColumn}->`;\n return '';\n}\n\n/** Stable identity of an op target — later edits to the same target replace. */\nexport function overrideKey(item: RemapOverride): string {\n return `${item.op}::${item.tableName}::${columnKeyPart(item)}`;\n}\n\n// --- deep equality (small JSON payloads) --------------------------------------\n\nexport function stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`);\n return `{${entries.join(',')}}`;\n}\n\nexport function entriesEqual(a: BufferEntry | null, b: BufferEntry | null): boolean {\n if (a === null || b === null) return a === b;\n return stableStringify({ ...a.item, status: a.status ?? 'active' }) ===\n stableStringify({ ...b.item, status: b.status ?? 'active' });\n}\n\n// --- baseline / overlay -------------------------------------------------------\n\nexport type Baseline = ReadonlyMap<string, BufferEntry>;\n/** `null` = delete the baseline op on save. */\nexport type Overlay = ReadonlyMap<string, BufferEntry | null>;\n\nexport function baselineFromRows(rows: readonly OverrideDto[]): Map<string, BufferEntry> {\n const map = new Map<string, BufferEntry>();\n for (const row of rows) {\n const item = {\n op: row.op,\n tableName: row.tableName,\n ...(row.columnName === null ? {} : { columnName: row.columnName }),\n value: row.value,\n } as RemapOverride;\n map.set(overrideKey(item), {\n item,\n ...(row.status === 'disabled' ? { status: 'disabled' as const } : {}),\n });\n }\n return map;\n}\n\n/** Stage an edit; entries equal to their baseline collapse back out. */\nexport function stageEntry(baseline: Baseline, overlay: Overlay, entry: BufferEntry): Map<string, BufferEntry | null> {\n const key = overrideKey(entry.item);\n const next = new Map(overlay);\n if (entriesEqual(baseline.get(key) ?? null, entry)) next.delete(key);\n else next.set(key, entry);\n return next;\n}\n\n/** Remove the op for `key` entirely (deletes a baseline row on save). */\nexport function dropEntry(baseline: Baseline, overlay: Overlay, key: string): Map<string, BufferEntry | null> {\n const next = new Map(overlay);\n if (baseline.has(key)) next.set(key, null);\n else next.delete(key);\n return next;\n}\n\n/** Undo the local edit for `key` (baseline row, if any, is kept). */\nexport function revertEntry(overlay: Overlay, key: string): Map<string, BufferEntry | null> {\n const next = new Map(overlay);\n next.delete(key);\n return next;\n}\n\n/** Effective entry for a target: overlay wins, `null` means removed. */\nexport function effectiveEntry(baseline: Baseline, overlay: Overlay, key: string): BufferEntry | null {\n if (overlay.has(key)) return overlay.get(key) ?? null;\n return baseline.get(key) ?? null;\n}\n\nexport interface RemapChange {\n key: string;\n kind: 'add' | 'edit' | 'remove';\n next: BufferEntry | null;\n previous: BufferEntry | null;\n}\n\n/** The diff the diff-bar renders; stale overlay entries are filtered out. */\nexport function bufferChanges(baseline: Baseline, overlay: Overlay): RemapChange[] {\n const changes: RemapChange[] = [];\n for (const [key, next] of overlay) {\n const previous = baseline.get(key) ?? null;\n if (entriesEqual(previous, next)) continue;\n if (previous === null && next === null) continue;\n changes.push({\n key,\n kind: previous === null ? 'add' : next === null ? 'remove' : 'edit',\n next,\n previous,\n });\n }\n return changes.sort((a, b) => (a.key < b.key ? -1 : 1));\n}\n\n/**\n * The FULL document for `PUT /connections/:id/overrides` — baseline with the\n * overlay applied, deterministically ordered. `columnName` is present only\n * for column-level ops (table-level ops with a column are a server 422).\n */\nexport function buildPutDocument(baseline: Baseline, overlay: Overlay): OverridesPutDocument {\n const effective = new Map(baseline);\n for (const [key, entry] of overlay) {\n if (entry === null) effective.delete(key);\n else effective.set(key, entry);\n }\n const keys = [...effective.keys()].sort();\n return {\n overrides: keys.map((key) => {\n const { item, status } = effective.get(key) as BufferEntry;\n return {\n op: item.op,\n tableName: item.tableName,\n ...(COLUMN_OPS.has(item.op) ? { columnName: (item as { columnName: string }).columnName } : {}),\n value: item.value as Record<string, unknown>,\n ...(status === 'disabled' ? { status } : {}),\n };\n }),\n };\n}\n","/**\n * React binding of the pure buffer core (`overrides.ts`): baseline derives\n * from the overrides query, the overlay is local state. After a successful\n * save the query refetch swaps the baseline underneath and `clear()` drops\n * the (now redundant) overlay — the diff bar count returns to 0 either way,\n * because changes equal to their baseline are filtered out.\n */\nimport { useCallback, useMemo, useState } from 'react';\n\nimport {\n baselineFromRows,\n bufferChanges,\n buildPutDocument,\n dropEntry,\n effectiveEntry,\n overrideKey,\n revertEntry,\n stageEntry,\n type BufferEntry,\n type OverrideDto,\n type OverridesPutDocument,\n type RemapChange,\n type RemapOverride,\n} from './overrides.js';\n\nexport interface RemapBuffer {\n /** Effective op for a target key (overlay > baseline), null when absent. */\n get(key: string): BufferEntry | null;\n /** Stage/replace the op targeting `overrideKey(item)`. */\n stage(item: RemapOverride, status?: 'active' | 'disabled'): void;\n /** Remove the op entirely (deletes the persisted row on save). */\n drop(key: string): void;\n /** Undo the local edit for one target. */\n revert(key: string): void;\n revertAll(): void;\n /** Drop the whole overlay (used after the post-save refetch). */\n clear(): void;\n changes: RemapChange[];\n dirty: boolean;\n buildDocument(): OverridesPutDocument;\n}\n\nexport function useRemapBuffer(rows: readonly OverrideDto[] | undefined): RemapBuffer {\n const baseline = useMemo(() => baselineFromRows(rows ?? []), [rows]);\n const [overlay, setOverlay] = useState<ReadonlyMap<string, BufferEntry | null>>(new Map());\n\n const get = useCallback(\n (key: string) => effectiveEntry(baseline, overlay, key),\n [baseline, overlay],\n );\n const stage = useCallback(\n (item: RemapOverride, status?: 'active' | 'disabled') => {\n setOverlay((current) =>\n stageEntry(baseline, current, { item, ...(status === 'disabled' ? { status } : {}) }),\n );\n },\n [baseline],\n );\n const drop = useCallback(\n (key: string) => setOverlay((current) => dropEntry(baseline, current, key)),\n [baseline],\n );\n const revert = useCallback((key: string) => setOverlay((current) => revertEntry(current, key)), []);\n const revertAll = useCallback(() => setOverlay(new Map()), []);\n\n const changes = useMemo(() => bufferChanges(baseline, overlay), [baseline, overlay]);\n const buildDocument = useCallback(() => buildPutDocument(baseline, overlay), [baseline, overlay]);\n\n return {\n get,\n stage,\n drop,\n revert,\n revertAll,\n clear: revertAll,\n changes,\n dirty: changes.length > 0,\n buildDocument,\n };\n}\n\nexport { overrideKey };\n","/**\n * Right-pane inspector for a selected column: label override, logical type\n * (read-only — see note), semantic override over the engine SEMANTIC_TAGS\n * with classifier confidence, PII masking toggle, and the enum semantics\n * editor (workflow vs category + per-value label/tone map) when the column\n * is an enum (07-meta-store.md §3.15 `column.*` ops).\n *\n * Logical type: adapters map native types onto the closed LOGICAL_TYPES set\n * at introspection time; the v1 override vocabulary has no\n * `column.logicalType` op, so the select renders disabled with the\n * \"inferred: X\" hint instead of staging an op the server would reject.\n */\nimport { LOGICAL_TYPES, SEMANTIC_TAGS } from '@adminium/engine';\nimport { Badge, FormField, Input, MonoText, SegmentedControl, Select, Switch, Tag } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport { columnDisplayLabel, enumValuesFor, titleCase, type EffectiveColumn, type EffectiveModel, type EffectiveTable } from './model.js';\nimport { overrideKey, type RemapBuffer } from './useRemapBuffer.js';\n\n/** Tone vocabulary shared with the grid enum chips (widgets column-spec). */\nexport const ENUM_TONES = ['neutral', 'accent', 'pos', 'warn', 'danger', 'info'] as const;\n\nexport interface ColumnInspectorProps {\n model: EffectiveModel;\n table: EffectiveTable;\n column: EffectiveColumn;\n buffer: RemapBuffer;\n fieldError?: string | undefined;\n}\n\nexport function ColumnInspector({ model, table, column, buffer, fieldError }: ColumnInspectorProps) {\n const target = { tableName: table.id, columnName: column.name } as const;\n const labelKey = overrideKey({ op: 'column.label', ...target, value: { label: '' } });\n const semanticKey = overrideKey({ op: 'column.semanticType', ...target, value: { semanticType: '' } });\n const piiKey = overrideKey({ op: 'column.pii', ...target, value: { masked: true } });\n const enumKey = overrideKey({ op: 'column.enumLabels', ...target, value: { labels: {} } });\n\n const labelEntry = buffer.get(labelKey);\n const stagedLabel =\n labelEntry !== null && labelEntry.item.op === 'column.label' ? labelEntry.item.value.label : null;\n\n const semanticEntry = buffer.get(semanticKey);\n const stagedSemantic =\n semanticEntry !== null && semanticEntry.item.op === 'column.semanticType'\n ? semanticEntry.item.value\n : null;\n\n const piiEntry = buffer.get(piiKey);\n const stagedPii = piiEntry !== null && piiEntry.item.op === 'column.pii' ? piiEntry.item.value : null;\n\n const enumEntry = buffer.get(enumKey);\n const stagedEnum =\n enumEntry !== null && enumEntry.item.op === 'column.enumLabels' ? enumEntry.item.value : null;\n\n const semantics = column.semantics;\n const inferredTag = semantics?.primary ?? 'plain';\n const confidencePct = semantics === null ? null : Math.round(semantics.confidence * 100);\n const piiKind = semantics?.flags.pii ?? null;\n const masked = stagedPii?.masked ?? column.masked ?? semantics?.flags.maskedByDefault === true;\n\n const enumValues = enumValuesFor(model, column);\n const isEnum = enumValues.length > 0;\n\n const stagePii = (nextMasked: boolean) => {\n buffer.stage({\n op: 'column.pii',\n ...target,\n value: { masked: nextMasked, ...(piiKind === null ? {} : { kind: piiKind }) },\n });\n };\n\n const enumLabels = stagedEnum?.labels ?? column.enumLabels ?? {};\n const enumTones = stagedEnum?.tones ?? column.enumTones ?? {};\n\n const stageEnum = (labels: Record<string, string>, tones: Record<string, string>) => {\n if (Object.keys(labels).length === 0 && Object.keys(tones).length === 0) {\n buffer.drop(enumKey);\n return;\n }\n buffer.stage({\n op: 'column.enumLabels',\n ...target,\n value: { labels, ...(Object.keys(tones).length === 0 ? {} : { tones }) },\n });\n };\n\n const currentEnumSemantic = stagedSemantic?.semanticType ?? inferredTag;\n\n return (\n <div className=\"flex flex-col gap-5\" data-testid=\"column-inspector\">\n <header className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-section text-fg\">{stagedLabel ?? columnDisplayLabel(column)}</h3>\n <MonoText className=\"text-[11px] text-fg-subtle\">\n {table.id}.{column.name}\n </MonoText>\n <Tag mono>{column.dbType}</Tag>\n {column.nullable ? <Badge tone=\"neutral\">{t('studio.remap.column.nullable', 'nullable')}</Badge> : null}\n </header>\n\n <FormField\n label={t('studio.remap.column.labelOverride', 'Display label')}\n helper={t('studio.remap.column.labelHelper', 'Inferred: {name}').replace(\n '{name}',\n titleCase(column.name),\n )}\n {...(fieldError === undefined ? {} : { error: fieldError })}\n >\n <Input\n value={stagedLabel ?? column.label ?? ''}\n placeholder={titleCase(column.name)}\n onChange={(event) => {\n const next = event.target.value;\n if (next === '') buffer.drop(labelKey);\n else buffer.stage({ op: 'column.label', ...target, value: { label: next } });\n }}\n />\n </FormField>\n\n <FormField\n label={t('studio.remap.column.logicalType', 'Logical type')}\n helper={t('studio.remap.column.logicalTypeHelper', 'Inferred: {type} (from {dbType}) — mapped by the adapter; not overridable in v1.')\n .replace('{type}', column.logicalType)\n .replace('{dbType}', column.dbType)}\n tag={<Tag mono>{column.logicalType}</Tag>}\n >\n <Select disabled value={column.logicalType} onChange={() => undefined} mono>\n {LOGICAL_TYPES.map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </Select>\n </FormField>\n\n <FormField\n label={t('studio.remap.column.semantic', 'Semantic type')}\n helper={\n semantics === null\n ? t('studio.remap.column.unclassified', 'Not classified yet.')\n : t('studio.remap.column.semanticHelper', 'Classifier: {tag} · {confidence}% confidence · source: {source}')\n .replace('{tag}', semantics.primary)\n .replace('{confidence}', String(confidencePct))\n .replace('{source}', semantics.source)\n }\n >\n <Select\n value={stagedSemantic?.semanticType ?? ''}\n onChange={(event) => {\n const next = event.target.value;\n if (next === '') buffer.drop(semanticKey);\n else buffer.stage({ op: 'column.semanticType', ...target, value: { semanticType: next } });\n }}\n >\n <option value=\"\">\n {t('studio.remap.column.semanticInferred', 'inferred: {tag}').replace('{tag}', inferredTag)}\n </option>\n {SEMANTIC_TAGS.map((tag) => (\n <option key={tag} value={tag}>\n {tag}\n </option>\n ))}\n </Select>\n </FormField>\n\n {stagedSemantic?.semanticType === 'money' ? (\n <FormField\n label={t('studio.remap.column.currency', 'Currency')}\n helper={t('studio.remap.column.currencyHelper', 'ISO 4217 code applied to money formatting.')}\n >\n <Input\n mono\n value={stagedSemantic.currency ?? ''}\n placeholder=\"USD\"\n onChange={(event) => {\n const currency = event.target.value.toUpperCase();\n buffer.stage({\n op: 'column.semanticType',\n ...target,\n value: { semanticType: 'money', ...(currency === '' ? {} : { currency }) },\n });\n }}\n />\n </FormField>\n ) : null}\n\n <label className=\"flex items-center justify-between gap-3\">\n <span className=\"flex flex-col\">\n <span className=\"flex items-center gap-1.5 text-body-sm font-medium text-fg\">\n {t('studio.remap.column.pii', 'Mask by default')}\n {piiKind !== null ? <Badge tone=\"warn\">{piiKind}</Badge> : null}\n </span>\n <span className=\"text-[11.5px] text-fg-muted\">\n {t(\n 'studio.remap.column.piiHelper',\n 'Masked values render redacted; unmasking requires the data.unmask_pii permission and is audit-logged.',\n )}\n </span>\n </span>\n <Switch\n checked={masked}\n aria-label={t('studio.remap.column.pii', 'Mask by default')}\n onCheckedChange={stagePii}\n />\n </label>\n\n {isEnum ? (\n <section className=\"flex flex-col gap-3\" data-testid=\"enum-editor\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.column.enum', 'Enum semantics')}\n </h4>\n <SegmentedControl\n aria-label={t('studio.remap.column.enumKind', 'Enum kind')}\n options={[\n {\n value: 'status-workflow',\n label: t('studio.remap.column.enumWorkflow', 'Workflow'),\n dot: 'accent',\n },\n {\n value: 'category-enum',\n label: t('studio.remap.column.enumCategory', 'Category'),\n },\n ]}\n value={currentEnumSemantic === 'status-workflow' ? 'status-workflow' : 'category-enum'}\n onValueChange={(next) => {\n if (next === currentEnumSemantic) return;\n buffer.stage({ op: 'column.semanticType', ...target, value: { semanticType: next } });\n }}\n />\n <ul className=\"flex flex-col gap-2\">\n {enumValues.map((value) => (\n <li key={value} className=\"grid grid-cols-[minmax(4rem,1fr)_minmax(6rem,1.4fr)_auto] items-center gap-2\">\n <MonoText className=\"truncate text-[12px]\">{value}</MonoText>\n <Input\n aria-label={t('studio.remap.column.enumLabelFor', 'Label for {value}').replace('{value}', value)}\n value={enumLabels[value] ?? ''}\n placeholder={titleCase(value)}\n onChange={(event) => {\n const labels = { ...enumLabels };\n if (event.target.value === '') delete labels[value];\n else labels[value] = event.target.value;\n stageEnum(labels, enumTones);\n }}\n />\n <Select\n aria-label={t('studio.remap.column.enumToneFor', 'Tone for {value}').replace('{value}', value)}\n value={enumTones[value] ?? ''}\n onChange={(event) => {\n const tones = { ...enumTones };\n if (event.target.value === '') delete tones[value];\n else tones[value] = event.target.value;\n stageEnum(enumLabels, tones);\n }}\n >\n <option value=\"\">{t('studio.remap.column.enumToneAuto', 'auto')}</option>\n {ENUM_TONES.map((tone) => (\n <option key={tone} value={tone}>\n {tone}\n </option>\n ))}\n </Select>\n </li>\n ))}\n </ul>\n <p className=\"text-[11.5px] text-fg-muted\">\n {t(\n 'studio.remap.column.enumHelper',\n 'Workflow enums drive status pills and board columns; tones map values onto the semantic tint scale.',\n )}\n </p>\n </section>\n ) : null}\n </div>\n );\n}\n","/**\n * Dirty-state bar: \"{n} changes\" + per-change chips with individual revert,\n * revert-all, and Save (PUT full document). After a successful save the\n * \"Regenerate pages\" action appears (POST /connections/:id/generate) — copy\n * per 04-widget-registry.md §6.3: only pages whose generated_hash is\n * untouched are regenerated in place; human-edited pages are preserved.\n */\nimport { X } from 'lucide-react';\nimport { Badge, Button, cn } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport type { RemapChange } from './overrides.js';\n\nexport interface DiffBarProps {\n changes: RemapChange[];\n onRevert: (key: string) => void;\n onRevertAll: () => void;\n onSave: () => void;\n saving: boolean;\n /** Key of the change the server rejected (422), if identifiable. */\n errorKey: string | null;\n canRegenerate: boolean;\n onRegenerate: () => void;\n regenerating: boolean;\n}\n\nfunction changeText(change: RemapChange): string {\n const item = change.next?.item ?? change.previous?.item;\n if (item === undefined) return change.key;\n const column = 'columnName' in item && typeof item.columnName === 'string' ? `.${item.columnName}` : '';\n return `${item.op} · ${item.tableName}${column}`;\n}\n\nconst kindTone = { add: 'pos', edit: 'accent', remove: 'danger' } as const;\n\nexport function DiffBar({\n changes,\n onRevert,\n onRevertAll,\n onSave,\n saving,\n errorKey,\n canRegenerate,\n onRegenerate,\n regenerating,\n}: DiffBarProps) {\n if (changes.length === 0 && !canRegenerate) return null;\n\n return (\n <div\n data-testid=\"diff-bar\"\n className=\"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-surface p-3 shadow-card\"\n >\n {changes.length > 0 ? (\n <span className=\"text-body-sm font-semibold text-fg\">\n {changes.length === 1\n ? t('studio.remap.diff.one', '1 change')\n : t('studio.remap.diff.count', '{count} changes').replace('{count}', String(changes.length))}\n </span>\n ) : (\n <span className=\"text-body-sm text-fg-muted\">{t('studio.remap.diff.saved', 'Overrides saved.')}</span>\n )}\n <ul className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1.5\">\n {changes.map((change) => (\n <li key={change.key}>\n <Badge\n tone={errorKey === change.key ? 'danger' : kindTone[change.kind]}\n className={cn('gap-1', errorKey === change.key && 'ring-1 ring-danger')}\n >\n <span className=\"font-mono\">{changeText(change)}</span>\n <button\n type=\"button\"\n aria-label={t('studio.remap.diff.revertOne', 'Revert {change}').replace(\n '{change}',\n changeText(change),\n )}\n className=\"rounded-full hover:opacity-70\"\n onClick={() => onRevert(change.key)}\n >\n <X aria-hidden className=\"size-3\" />\n </button>\n </Badge>\n </li>\n ))}\n </ul>\n <span className=\"ms-auto flex items-center gap-2\">\n {canRegenerate ? (\n <Button variant=\"soft\" size=\"sm\" loading={regenerating} onClick={onRegenerate}>\n {t('studio.remap.diff.regenerate', 'Regenerate pages')}\n </Button>\n ) : null}\n {changes.length > 0 ? (\n <>\n <Button variant=\"ghost\" size=\"sm\" disabled={saving} onClick={onRevertAll}>\n {t('studio.remap.diff.revertAll', 'Revert all')}\n </Button>\n <Button size=\"sm\" loading={saving} onClick={onSave}>\n {t('studio.remap.diff.save', 'Save overrides')}\n </Button>\n </>\n ) : null}\n </span>\n </div>\n );\n}\n","/**\n * Relations tab for the selected table (05-introspection-engine.md §6):\n * declared FKs read-only, inferred relations with confidence + accept /\n * suppress (accept persists a `relation.add` op which re-enters future\n * regenerations at confidence 1.0; suppress persists `relation.remove`),\n * plus the ADD virtual relation form (07-meta-store.md §3.15 payload) for\n * schemas without declared FKs.\n */\nimport { useState } from 'react';\nimport { Badge, Button, Combobox, FormField, MonoText, Select } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport {\n relationsForTable,\n tableById,\n tableDisplayLabel,\n type EffectiveModel,\n type EffectiveRelation,\n type EffectiveTable,\n} from './model.js';\nimport { RELATION_OP_CARDINALITIES, type RelationOpCardinality } from './overrides.js';\nimport { overrideKey, type RemapBuffer } from './useRemapBuffer.js';\n\nexport interface RelationsTabProps {\n model: EffectiveModel;\n table: EffectiveTable;\n buffer: RemapBuffer;\n}\n\nfunction endpointText(relation: EffectiveRelation): string {\n const from = `${relation.from.tableId}.${relation.from.columns.join('+')}`;\n const to = `${relation.to.tableId}.${relation.to.columns.join('+')}`;\n return `${from} → ${to}`;\n}\n\n/** relation.add cardinality from an inferred relation, FK-side perspective. */\nfunction opCardinality(relation: EffectiveRelation): RelationOpCardinality {\n if (relation.cardinality === 'one-to-many') return 'many-to-one';\n return relation.cardinality;\n}\n\nexport function RelationsTab({ model, table, buffer }: RelationsTabProps) {\n const { declared, inferred, overrides } = relationsForTable(model, table.id);\n\n const [fromColumn, setFromColumn] = useState<string | null>(null);\n const [toTable, setToTable] = useState<string | null>(null);\n const [toColumn, setToColumn] = useState<string | null>(null);\n const [cardinality, setCardinality] = useState<RelationOpCardinality>('many-to-one');\n\n const acceptKeyFor = (relation: EffectiveRelation) =>\n overrideKey({\n op: 'relation.add',\n tableName: relation.from.tableId,\n value: {\n fromColumn: relation.from.columns[0] ?? '',\n toTable: relation.to.tableId,\n toColumn: relation.to.columns[0] ?? '',\n cardinality: opCardinality(relation),\n },\n });\n const suppressKeyFor = (relation: EffectiveRelation) =>\n overrideKey({\n op: 'relation.remove',\n tableName: relation.from.tableId,\n value: { fromColumn: relation.from.columns[0] ?? '', toTable: relation.to.tableId },\n });\n\n const accept = (relation: EffectiveRelation) => {\n buffer.drop(suppressKeyFor(relation));\n buffer.stage({\n op: 'relation.add',\n tableName: relation.from.tableId,\n value: {\n fromColumn: relation.from.columns[0] ?? '',\n toTable: relation.to.tableId,\n toColumn: relation.to.columns[0] ?? '',\n cardinality: opCardinality(relation),\n },\n });\n };\n\n const suppress = (relation: EffectiveRelation) => {\n buffer.drop(acceptKeyFor(relation));\n buffer.stage({\n op: 'relation.remove',\n tableName: relation.from.tableId,\n value: { fromColumn: relation.from.columns[0] ?? '', toTable: relation.to.tableId },\n });\n };\n\n const targetTable = toTable === null ? undefined : tableById(model, toTable);\n const canAdd = fromColumn !== null && toTable !== null && toColumn !== null;\n\n return (\n <div className=\"flex flex-col gap-5\" data-testid=\"relations-tab\">\n <section className=\"flex flex-col gap-2\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.relations.declared', 'Declared foreign keys')}\n </h4>\n {declared.length === 0 ? (\n <p className=\"text-body-sm text-fg-muted\">\n {t('studio.remap.relations.noneDeclared', 'No declared foreign keys touch this table.')}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-1.5\">\n {declared.map((relation) => (\n <li key={relation.id} className=\"flex items-center gap-2\">\n <MonoText className=\"truncate text-[12px]\">{endpointText(relation)}</MonoText>\n <Badge tone=\"info\">{relation.cardinality}</Badge>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className=\"flex flex-col gap-2\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.relations.inferred', 'Inferred relations')}\n </h4>\n {inferred.length === 0 ? (\n <p className=\"text-body-sm text-fg-muted\">\n {t('studio.remap.relations.noneInferred', 'Nothing inferred for this table.')}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {inferred.map((relation) => {\n const accepted = buffer.get(acceptKeyFor(relation)) !== null;\n const suppressed = buffer.get(suppressKeyFor(relation)) !== null;\n return (\n <li key={relation.id} className=\"flex flex-wrap items-center gap-2\">\n <MonoText className=\"truncate text-[12px]\">{endpointText(relation)}</MonoText>\n <Badge tone=\"accent\">\n {t('studio.remap.relations.confidence', 'inferred · {pct}%').replace(\n '{pct}',\n String(Math.round(relation.confidence * 100)),\n )}\n </Badge>\n {accepted ? <Badge tone=\"pos\">{t('studio.remap.relations.accepted', 'Accepted')}</Badge> : null}\n {suppressed ? (\n <Badge tone=\"danger\">{t('studio.remap.relations.suppressed', 'Suppressed')}</Badge>\n ) : null}\n <span className=\"ms-auto flex items-center gap-1\">\n <Button size=\"sm\" variant=\"secondary\" disabled={accepted} onClick={() => accept(relation)}>\n {t('studio.remap.relations.accept', 'Accept')}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" disabled={suppressed} onClick={() => suppress(relation)}>\n {t('studio.remap.relations.suppress', 'Suppress')}\n </Button>\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n\n {overrides.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.relations.overrides', 'Override relations (applied)')}\n </h4>\n <ul className=\"flex flex-col gap-1.5\">\n {overrides.map((relation) => (\n <li key={relation.id} className=\"flex items-center gap-2\">\n <MonoText className=\"truncate text-[12px]\">{endpointText(relation)}</MonoText>\n <Badge tone=\"pos\">{t('studio.remap.relations.overrideBadge', 'override')}</Badge>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n <section className=\"flex flex-col gap-3\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.relations.add', 'Add virtual relation')}\n </h4>\n <FormField label={t('studio.remap.relations.fromColumn', 'From column')}>\n <Combobox\n mono\n options={table.columns.map((column) => ({ value: column.name, label: column.name }))}\n value={fromColumn}\n onValueChange={setFromColumn}\n emptyText={t('studio.remap.relations.noColumns', 'No matching column')}\n placeholder={t('studio.remap.relations.fromPlaceholder', 'customer_id')}\n />\n </FormField>\n <FormField label={t('studio.remap.relations.toTable', 'To table')}>\n <Combobox\n mono\n options={model.tables.map((candidate) => ({\n value: candidate.id,\n label: candidate.id,\n description: tableDisplayLabel(candidate),\n }))}\n value={toTable}\n onValueChange={(next) => {\n setToTable(next);\n setToColumn(null);\n }}\n emptyText={t('studio.remap.relations.noTables', 'No matching table')}\n placeholder=\"public.customers\"\n />\n </FormField>\n <FormField label={t('studio.remap.relations.toColumn', 'To column')}>\n <Combobox\n mono\n options={(targetTable?.columns ?? []).map((column) => ({ value: column.name, label: column.name }))}\n value={toColumn}\n onValueChange={setToColumn}\n disabled={targetTable === undefined}\n emptyText={t('studio.remap.relations.noColumns', 'No matching column')}\n placeholder=\"id\"\n />\n </FormField>\n <FormField label={t('studio.remap.relations.cardinality', 'Cardinality')}>\n <Select value={cardinality} onChange={(event) => setCardinality(event.target.value as RelationOpCardinality)}>\n {RELATION_OP_CARDINALITIES.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </Select>\n </FormField>\n <div>\n <Button\n variant=\"secondary\"\n disabled={!canAdd}\n onClick={() => {\n if (!canAdd) return;\n buffer.stage({\n op: 'relation.add',\n tableName: table.id,\n value: {\n fromColumn: fromColumn as string,\n toTable: toTable as string,\n toColumn: toColumn as string,\n cardinality,\n },\n });\n setFromColumn(null);\n setToTable(null);\n setToColumn(null);\n }}\n >\n {t('studio.remap.relations.addButton', 'Add relation')}\n </Button>\n </div>\n </section>\n </div>\n );\n}\n","/**\n * SchemaBadges vocabulary (research/ia-mapping.md §4, UI Kit schema\n * explorer): PK accent · FK info · UNIQUE neutral · PII warn (+ Masked warn),\n * with the mono type chip alongside. Tints always derive from tones.\n */\nimport { Badge, Tag } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport type { EffectiveColumn } from './model.js';\n\nexport function TypeChip({ type }: { type: string }) {\n return <Tag mono>{type}</Tag>;\n}\n\nexport function SchemaBadges({ column }: { column: EffectiveColumn }) {\n const pii = column.semantics?.flags.pii ?? null;\n const masked = column.masked ?? column.semantics?.flags.maskedByDefault === true;\n return (\n <span className=\"inline-flex items-center gap-1\">\n {column.isPrimaryKey ? <Badge tone=\"accent\">{t('studio.remap.badge.pk', 'PK')}</Badge> : null}\n {column.references !== null ? <Badge tone=\"info\">{t('studio.remap.badge.fk', 'FK')}</Badge> : null}\n {column.isUnique && !column.isPrimaryKey ? (\n <Badge tone=\"neutral\">{t('studio.remap.badge.unique', 'UNIQUE')}</Badge>\n ) : null}\n {pii !== null ? <Badge tone=\"warn\">{t('studio.remap.badge.pii', 'PII')}</Badge> : null}\n {masked ? (\n <Badge tone=\"warn\" dot>\n {t('studio.remap.badge.masked', 'Masked')}\n </Badge>\n ) : null}\n </span>\n );\n}\n","/**\n * Left pane: searchable table tree with per-table column lists, mono type\n * chips and PK/FK/UNIQUE/PII badges (UI Kit schema explorer vocabulary).\n * Labels shown are the APPLIED ones from `GET /connections/:id/schema`\n * (server-side override application — the live-preview read path), with any\n * unsaved staged label layered on top and flagged with an accent dot.\n */\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { Badge, MonoText, SearchInput, cn } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport { lucideByName } from '../../lib/lucide.js';\nimport { SchemaBadges, TypeChip } from './badges.js';\nimport {\n columnDisplayLabel,\n tableDisplayLabel,\n type EffectiveModel,\n type EffectiveTable,\n type RemapSelection,\n} from './model.js';\nimport { overrideKey, type RemapBuffer } from './useRemapBuffer.js';\n\nexport interface SchemaTreeProps {\n model: EffectiveModel;\n buffer: RemapBuffer;\n selection: RemapSelection | null;\n onSelect: (selection: RemapSelection) => void;\n}\n\nfunction stagedTableLabel(buffer: RemapBuffer, table: EffectiveTable): string | null {\n const entry = buffer.get(overrideKey({ op: 'table.label', tableName: table.id, value: { label: '' } }));\n if (entry === null || entry.item.op !== 'table.label') return null;\n return entry.item.value.label;\n}\n\nfunction stagedColumnLabel(buffer: RemapBuffer, tableId: string, column: string): string | null {\n const entry = buffer.get(\n overrideKey({ op: 'column.label', tableName: tableId, columnName: column, value: { label: '' } }),\n );\n if (entry === null || entry.item.op !== 'column.label') return null;\n return entry.item.value.label;\n}\n\nexport function SchemaTree({ model, buffer, selection, onSelect }: SchemaTreeProps) {\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(new Set());\n\n const q = query.trim().toLowerCase();\n const visible = useMemo(() => {\n if (q === '') return model.tables;\n return model.tables.filter(\n (table) =>\n table.name.toLowerCase().includes(q) ||\n tableDisplayLabel(table).toLowerCase().includes(q) ||\n table.columns.some((column) => column.name.toLowerCase().includes(q)),\n );\n }, [model.tables, q]);\n\n const toggle = (tableId: string) => {\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(tableId)) next.delete(tableId);\n else next.add(tableId);\n return next;\n });\n };\n\n return (\n <nav aria-label={t('studio.remap.tree.label', 'Schema')} className=\"flex min-h-0 flex-col gap-2\">\n <SearchInput\n aria-label={t('studio.remap.tree.search', 'Search tables and columns')}\n placeholder={t('studio.remap.tree.searchPlaceholder', 'Search tables…')}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onClear={() => setQuery('')}\n clearLabel={t('common.clear', 'Clear')}\n />\n <ul className=\"min-h-0 flex-1 overflow-y-auto pe-1\" data-testid=\"remap-tree\">\n {visible.length === 0 ? (\n <li className=\"p-3 text-body-sm text-fg-muted\">\n {t('studio.remap.tree.noMatches', 'No tables match your search.')}\n </li>\n ) : null}\n {visible.map((table) => {\n const isOpen = expanded.has(table.id) || q !== '';\n const staged = stagedTableLabel(buffer, table);\n const label = staged ?? tableDisplayLabel(table);\n const selected = selection?.kind === 'table' && selection.tableId === table.id;\n const excluded =\n buffer.get(overrideKey({ op: 'table.exclude', tableName: table.id, value: { excluded: true } }))\n ?.item.op === 'table.exclude'\n ? (buffer.get(\n overrideKey({ op: 'table.exclude', tableName: table.id, value: { excluded: true } }),\n )?.item.value as { excluded: boolean }).excluded\n : table.excluded === true;\n const Icon = lucideByName(table.icon ?? 'table');\n return (\n <li key={table.id}>\n <div className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n aria-label={\n isOpen\n ? t('studio.remap.tree.collapse', 'Collapse table')\n : t('studio.remap.tree.expand', 'Expand table')\n }\n aria-expanded={isOpen}\n className=\"rounded-sm p-1 text-fg-muted hover:text-fg\"\n onClick={() => toggle(table.id)}\n >\n {isOpen ? <ChevronDown className=\"size-3.5\" /> : <ChevronRight className=\"size-3.5 rtl:-scale-x-100\" />}\n </button>\n <button\n type=\"button\"\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'flex min-w-0 flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-start text-body-sm',\n selected ? 'bg-surface-2 text-fg' : 'text-fg hover:bg-surface-2',\n excluded && 'opacity-60',\n )}\n onClick={() => {\n onSelect({ kind: 'table', tableId: table.id });\n setExpanded((current) => new Set(current).add(table.id));\n }}\n >\n <Icon aria-hidden className=\"size-4 shrink-0 text-fg-muted\" />\n <span className=\"truncate font-medium\">{label}</span>\n {staged !== null ? (\n <span\n aria-label={t('studio.remap.tree.unsaved', 'Unsaved change')}\n className=\"size-1.5 shrink-0 rounded-full bg-accent\"\n />\n ) : null}\n <MonoText className=\"ms-auto truncate text-[11px] text-fg-subtle\">{table.name}</MonoText>\n {excluded ? <Badge tone=\"neutral\">{t('studio.remap.tree.excluded', 'Excluded')}</Badge> : null}\n </button>\n </div>\n {isOpen ? (\n <ul className=\"ms-5 border-s border-border ps-2\">\n {table.columns.map((column) => {\n const stagedLabel = stagedColumnLabel(buffer, table.id, column.name);\n const columnSelected =\n selection?.kind === 'column' &&\n selection.tableId === table.id &&\n selection.column === column.name;\n return (\n <li key={column.name}>\n <button\n type=\"button\"\n aria-current={columnSelected ? 'true' : undefined}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-2 py-1 text-start text-body-sm',\n columnSelected ? 'bg-surface-2 text-fg' : 'text-fg-muted hover:bg-surface-2 hover:text-fg',\n )}\n onClick={() => onSelect({ kind: 'column', tableId: table.id, column: column.name })}\n >\n <span className=\"truncate\">{stagedLabel ?? columnDisplayLabel(column)}</span>\n {stagedLabel !== null ? (\n <span\n aria-label={t('studio.remap.tree.unsaved', 'Unsaved change')}\n className=\"size-1.5 shrink-0 rounded-full bg-accent\"\n />\n ) : null}\n <span className=\"ms-auto flex shrink-0 items-center gap-1\">\n <TypeChip type={column.logicalType} />\n <SchemaBadges column={column} />\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : null}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","/**\n * Lucide subset grid for the table icon override (`table.label.icon`,\n * 07-meta-store.md §3.15). Kebab-case names, resolved via `lucideByName` so\n * an unknown value can never crash the picker.\n */\nimport { cn } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport { lucideByName } from '../../lib/lucide.js';\n\n/** Curated subset — same vocabulary the generator emits for nav icons. */\nexport const ICON_SUBSET: readonly string[] = [\n 'table',\n 'users',\n 'user-round',\n 'building-2',\n 'shopping-cart',\n 'package',\n 'truck',\n 'credit-card',\n 'receipt',\n 'file-text',\n 'folder',\n 'calendar',\n 'clock',\n 'tag',\n 'star',\n 'heart',\n 'mail',\n 'message-square',\n 'map-pin',\n 'globe',\n 'database',\n 'layers',\n 'bar-chart-3',\n 'book-open',\n];\n\nexport interface IconPickerProps {\n /** Selected kebab-case icon name (null = no override). */\n value: string | null;\n onChange: (icon: string | null) => void;\n}\n\nexport function IconPicker({ value, onChange }: IconPickerProps) {\n return (\n <div\n role=\"group\"\n aria-label={t('studio.remap.table.iconPicker', 'Table icon')}\n className=\"grid grid-cols-8 gap-1\"\n >\n {ICON_SUBSET.map((name) => {\n const Icon = lucideByName(name);\n const selected = value === name;\n return (\n <button\n key={name}\n type=\"button\"\n title={name}\n aria-label={name}\n aria-pressed={selected}\n className={cn(\n 'flex items-center justify-center rounded-md border p-1.5 text-fg-muted transition-colors',\n selected\n ? 'border-accent bg-accent-soft text-accent'\n : 'border-border hover:bg-surface-2 hover:text-fg',\n )}\n onClick={() => onChange(selected ? null : name)}\n >\n <Icon aria-hidden className=\"size-4\" />\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Right-pane inspector for a selected table: label override, icon picker,\n * nav group (read-only — see note below), include/exclude toggle, and the\n * read-only table-shape classification (05-introspection-engine.md §8).\n *\n * Nav group: the v1 override vocabulary (07-meta-store.md §3.15) has no\n * `table.navGroup` op — nav placement is generator-owned — so the select is\n * rendered disabled with an explanatory caption instead of staging an op the\n * server would 422.\n */\nimport { Badge, FormField, Input, KeyValueList, MonoText, Select, Switch, Tag } from '@adminium/ui';\n\nimport { t } from '../../i18n/t.js';\nimport { IconPicker } from './IconPicker.js';\nimport { tableDisplayLabel, titleCase, type EffectiveTable } from './model.js';\nimport { overrideKey, type RemapBuffer } from './useRemapBuffer.js';\n\nconst NAV_GROUPS = ['workspace', 'library', 'planning', 'people', 'account'] as const;\n\nexport interface TableInspectorProps {\n table: EffectiveTable;\n buffer: RemapBuffer;\n /** Field-level 422 message keyed to this table, if the last save failed here. */\n fieldError?: string | undefined;\n}\n\nexport function TableInspector({ table, buffer, fieldError }: TableInspectorProps) {\n const labelKey = overrideKey({ op: 'table.label', tableName: table.id, value: { label: '' } });\n const excludeKey = overrideKey({ op: 'table.exclude', tableName: table.id, value: { excluded: true } });\n\n const labelEntry = buffer.get(labelKey);\n const staged =\n labelEntry !== null && labelEntry.item.op === 'table.label' ? labelEntry.item.value : null;\n const stagedLabel = staged?.label ?? '';\n const stagedIcon = staged?.icon ?? null;\n\n const excludeEntry = buffer.get(excludeKey);\n const excluded =\n excludeEntry !== null && excludeEntry.item.op === 'table.exclude'\n ? excludeEntry.item.value.excluded\n : table.excluded === true;\n\n /** `table.label` requires `label`; icon-only edits reuse the display label. */\n const stageLabelOp = (nextLabel: string, nextIcon: string | null) => {\n if (nextLabel === '' && nextIcon === null) {\n buffer.drop(labelKey);\n return;\n }\n buffer.stage({\n op: 'table.label',\n tableName: table.id,\n value: {\n label: nextLabel === '' ? tableDisplayLabel(table) : nextLabel,\n ...(nextIcon === null ? {} : { icon: nextIcon }),\n },\n });\n };\n\n const semantics = table.semantics;\n\n return (\n <div className=\"flex flex-col gap-5\" data-testid=\"table-inspector\">\n <header className=\"flex items-center gap-2\">\n <h3 className=\"text-section text-fg\">{tableDisplayLabel(table)}</h3>\n <MonoText className=\"text-[11px] text-fg-subtle\">{table.id}</MonoText>\n {table.system ? <Badge tone=\"neutral\">{t('studio.remap.table.system', 'System')}</Badge> : null}\n </header>\n\n <FormField\n label={t('studio.remap.table.labelOverride', 'Display label')}\n helper={t('studio.remap.table.labelHelper', 'Inferred: {name}').replace(\n '{name}',\n titleCase(table.name),\n )}\n {...(fieldError === undefined ? {} : { error: fieldError })}\n >\n <Input\n value={stagedLabel !== '' ? stagedLabel : (table.label ?? '')}\n placeholder={titleCase(table.name)}\n onChange={(event) => stageLabelOp(event.target.value, stagedIcon ?? table.icon ?? null)}\n />\n </FormField>\n\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-body-sm font-medium text-fg\">{t('studio.remap.table.icon', 'Icon')}</span>\n <IconPicker\n value={stagedIcon ?? table.icon ?? null}\n onChange={(icon) => stageLabelOp(stagedLabel !== '' ? stagedLabel : (table.label ?? ''), icon)}\n />\n </div>\n\n <FormField\n label={t('studio.remap.table.navGroup', 'Nav group')}\n helper={t(\n 'studio.remap.table.navGroupHelper',\n 'Nav placement is decided by the generator — a table.navGroup override is not in the v1 vocabulary.',\n )}\n >\n <Select disabled defaultValue=\"workspace\">\n {NAV_GROUPS.map((group) => (\n <option key={group} value={group}>\n {titleCase(group)}\n </option>\n ))}\n </Select>\n </FormField>\n\n <label className=\"flex items-center justify-between gap-3\">\n <span className=\"flex flex-col\">\n <span className=\"text-body-sm font-medium text-fg\">\n {t('studio.remap.table.include', 'Include in generated app')}\n </span>\n <span className=\"text-[11.5px] text-fg-muted\">\n {t('studio.remap.table.includeHelper', 'Excluded tables get no pages and disappear from nav.')}\n </span>\n </span>\n <Switch\n checked={!excluded}\n aria-label={t('studio.remap.table.include', 'Include in generated app')}\n onCheckedChange={(checked) => {\n if (checked) buffer.drop(excludeKey);\n else buffer.stage({ op: 'table.exclude', tableName: table.id, value: { excluded: true } });\n }}\n />\n </label>\n\n <section className=\"flex flex-col gap-2\">\n <h4 className=\"text-body-sm font-semibold text-fg\">\n {t('studio.remap.table.shape', 'Table shape (classified)')}\n </h4>\n <KeyValueList\n items={[\n {\n label: t('studio.remap.table.role', 'Role'),\n value: semantics === null ? t('studio.remap.table.unclassified', 'Not classified') : semantics.role,\n },\n {\n label: t('studio.remap.table.kind', 'Kind'),\n value: table.kind,\n },\n {\n label: t('studio.remap.table.hierarchy', 'Hierarchy'),\n value:\n semantics?.hierarchy == null\n ? '—'\n : t('studio.remap.table.selfFk', 'Self-reference via {column}').replace(\n '{column}',\n semantics.hierarchy.parentColumn,\n ),\n },\n {\n label: t('studio.remap.table.polymorphic', 'Polymorphic pairs'),\n value:\n semantics === null || semantics.polymorphic.length === 0\n ? '—'\n : semantics.polymorphic.map((p) => `${p.typeColumn}/${p.idColumn}`).join(', '),\n },\n {\n label: t('studio.remap.table.rows', 'Row estimate'),\n value: table.rowCountEstimate === null ? '—' : String(table.rowCountEstimate),\n },\n ]}\n />\n <p className=\"text-[11.5px] text-fg-muted\">\n {t(\n 'studio.remap.table.shapeHelper',\n 'Classification is recomputed on every introspection; overrides layer on top and survive regeneration.',\n )}\n </p>\n {semantics !== null ? <Tag mono>{semantics.role}</Tag> : null}\n </section>\n </div>\n );\n}\n","/**\n * Remap editor API client:\n *\n * - `GET /connections/:id/schema` — snapshot with overrides APPLIED\n * (the live-preview read path — labels here are the effective ones),\n * - `GET /connections/:id/overrides` — persisted override rows,\n * - `PUT /connections/:id/overrides` — full-document replace,\n * - `POST /connections/:id/generate` — regeneration with counts.\n *\n * `putJson` locally replicates the `app/api.ts` envelope handling because\n * that client has no `put` yet and apps/dashboard/src/app is outside this\n * feature's paths this wave — fold into `api.put` once the owner adds it.\n */\nimport { queryOptions } from '@tanstack/react-query';\n\nimport { api, ApiError } from '../../app/api.js';\nimport type { GenerateReply, SchemaReply } from './model.js';\nimport type { OverrideDto, OverridesPutDocument } from './overrides.js';\n\nexport interface OverridesReply {\n overrides: OverrideDto[];\n}\n\nasync function putJson<T>(path: string, payload: unknown): Promise<T> {\n const response = await fetch(path, {\n method: 'PUT',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n });\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n // Empty or non-JSON body — leave null.\n }\n if (!response.ok) {\n const envelope = (body ?? {}) as {\n error?: { code?: unknown; message?: unknown; requestId?: unknown; details?: unknown };\n };\n throw new ApiError(\n response.status,\n typeof envelope.error?.code === 'string' ? envelope.error.code : 'INTERNAL',\n typeof envelope.error?.message === 'string'\n ? envelope.error.message\n : `Request failed with status ${response.status}.`,\n typeof envelope.error?.requestId === 'string'\n ? envelope.error.requestId\n : (response.headers.get('x-request-id') ?? null),\n envelope.error?.details,\n );\n }\n return body as T;\n}\n\nconst base = (connectionId: string): string => `/api/v1/connections/${encodeURIComponent(connectionId)}`;\n\nexport function remapSchemaQuery(connectionId: string) {\n return queryOptions({\n queryKey: ['studio', 'remap', 'schema', connectionId] as const,\n queryFn: () => api.get<SchemaReply>(`${base(connectionId)}/schema`),\n });\n}\n\nexport function remapOverridesQuery(connectionId: string) {\n return queryOptions({\n queryKey: ['studio', 'remap', 'overrides', connectionId] as const,\n queryFn: () => api.get<OverridesReply>(`${base(connectionId)}/overrides`),\n });\n}\n\nexport function putOverrides(connectionId: string, document: OverridesPutDocument): Promise<OverridesReply> {\n return putJson<OverridesReply>(`${base(connectionId)}/overrides`, document);\n}\n\nexport function regeneratePages(connectionId: string): Promise<GenerateReply> {\n return api.post<GenerateReply>(`${base(connectionId)}/generate`);\n}\n","/**\n * Schema remap editor (M5-T04; research/ia-mapping.md §4 \"remapped\n * public.customers\"): two-pane Studio surface over the connection's active\n * snapshot.\n *\n * - Left: schema tree (search, per-table columns, type chips, PK/FK/UNIQUE/\n * PII badges) rendering the APPLIED model from `GET /connections/:id/schema`\n * — after a save the queries refetch and the applied labels show up inline,\n * proving the server-side read path.\n * - Right: inspector for the selection (table / column) + Relations tab.\n * - Bottom: diff bar over the local edit buffer; Save = full-document\n * `PUT /connections/:id/overrides`; 422 issues map back to the offending\n * change chip and inspector field.\n * - Post-save: \"Regenerate pages\" (POST /connections/:id/generate) with\n * created/updated/unchanged counts; user-edited pages are preserved via\n * generated_hash semantics (04-widget-registry.md §6.3).\n */\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport {\n Banner,\n EmptyState,\n Skeleton,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n ToastStack,\n useToastQueue,\n} from '@adminium/ui';\n\nimport { ApiError } from '../../app/api.js';\nimport { t } from '../../i18n/t.js';\nimport { capabilityNotes, modelCapabilitySource } from '../connect/capabilityNotes.js';\nimport { ColumnInspector } from './ColumnInspector.js';\nimport { DiffBar } from './DiffBar.js';\nimport { RelationsTab } from './RelationsTab.js';\nimport { SchemaTree } from './SchemaTree.js';\nimport { TableInspector } from './TableInspector.js';\nimport { putOverrides, regeneratePages, remapOverridesQuery, remapSchemaQuery } from './api.js';\nimport { tableById, type RemapSelection } from './model.js';\nimport { overrideKey, type RemapOverride } from './overrides.js';\nimport { useRemapBuffer } from './useRemapBuffer.js';\n\nexport interface RemapEditorProps {\n connectionId: string;\n}\n\ninterface SaveError {\n message: string;\n /** Change key the server rejected, when the 422 details identify one. */\n key: string | null;\n /** Table/column the failure targets (drives the inspector field error). */\n tableName: string | null;\n columnName: string | null;\n}\n\n/** Map a 422 `ValidationFailedError` envelope back onto buffer targets. */\nfunction toSaveError(error: ApiError): SaveError {\n const details = (error.details ?? {}) as {\n item?: { op?: string; tableName?: string; columnName?: string | null; value?: Record<string, unknown> };\n table?: string;\n column?: string;\n };\n const item = details.item;\n let key: string | null = null;\n if (item !== undefined && typeof item.op === 'string' && typeof item.tableName === 'string') {\n key = overrideKey({\n op: item.op,\n tableName: item.tableName,\n ...(typeof item.columnName === 'string' ? { columnName: item.columnName } : {}),\n value: item.value ?? {},\n } as RemapOverride);\n }\n return {\n message: error.message,\n key,\n tableName: item?.tableName ?? details.table ?? null,\n columnName: (typeof item?.columnName === 'string' ? item.columnName : null) ?? details.column ?? null,\n };\n}\n\nexport function RemapEditor({ connectionId }: RemapEditorProps) {\n const queryClient = useQueryClient();\n const schemaQuery = useQuery(remapSchemaQuery(connectionId));\n const overridesQuery = useQuery(remapOverridesQuery(connectionId));\n const buffer = useRemapBuffer(overridesQuery.data?.overrides);\n const toasts = useToastQueue();\n\n const [selection, setSelection] = useState<RemapSelection | null>(null);\n const [saving, setSaving] = useState(false);\n const [regenerating, setRegenerating] = useState(false);\n const [savedOnce, setSavedOnce] = useState(false);\n const [saveError, setSaveError] = useState<SaveError | null>(null);\n\n const model = schemaQuery.data?.model;\n\n const handleSave = async () => {\n setSaving(true);\n setSaveError(null);\n try {\n await putOverrides(connectionId, buffer.buildDocument());\n buffer.clear();\n setSavedOnce(true);\n toasts.push({\n variant: 'success',\n title: t('studio.remap.toast.saved', 'Schema overrides saved'),\n description: t('studio.remap.toast.savedDetail', 'The applied schema below reflects your changes.'),\n });\n // Live-preview read path: refetch the APPLIED schema + persisted rows.\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: remapSchemaQuery(connectionId).queryKey }),\n queryClient.invalidateQueries({ queryKey: remapOverridesQuery(connectionId).queryKey }),\n ]);\n } catch (error) {\n if (error instanceof ApiError && error.status === 422) {\n setSaveError(toSaveError(error));\n } else {\n setSaveError({\n message: error instanceof Error ? error.message : String(error),\n key: null,\n tableName: null,\n columnName: null,\n });\n }\n } finally {\n setSaving(false);\n }\n };\n\n const handleRegenerate = async () => {\n setRegenerating(true);\n try {\n const reply = await regeneratePages(connectionId);\n toasts.push({\n variant: 'success',\n title: t('studio.remap.toast.regenerated', '{created} created · {updated} updated · {unchanged} unchanged')\n .replace('{created}', String(reply.result.created))\n .replace('{updated}', String(reply.result.updated))\n .replace('{unchanged}', String(reply.result.unchanged)),\n description: t(\n 'studio.remap.toast.regeneratedDetail',\n 'Pages you edited by hand are preserved — only pages with an untouched generated_hash were regenerated in place.',\n ),\n });\n } catch (error) {\n toasts.push({\n variant: 'error',\n title: t('studio.remap.toast.regenerateFailed', 'Regeneration failed'),\n description: error instanceof Error ? error.message : undefined,\n });\n } finally {\n setRegenerating(false);\n }\n };\n\n const fieldErrorFor = (tableName: string, columnName: string | null): string | undefined =>\n saveError !== null && saveError.tableName === tableName && saveError.columnName === columnName\n ? saveError.message\n : undefined;\n\n const selectedTable =\n model !== undefined && selection !== null ? tableById(model, selection.tableId) : undefined;\n const selectedColumn =\n selection?.kind === 'column' && selectedTable !== undefined\n ? selectedTable.columns.find((column) => column.name === selection.column)\n : undefined;\n\n // Per-engine capability notes (M9-T04): what this source could not express,\n // so remapping expectations stay honest (e.g. SQLite has no comments to\n // import — labels set here are the labeling path).\n const sourceNotes = model === undefined ? [] : capabilityNotes(modelCapabilitySource(model));\n\n return (\n <div className=\"flex h-full min-h-0 flex-col gap-3 p-4\">\n <header className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-section text-fg\">{t('studio.remap.title', 'Schema remap')}</h2>\n {schemaQuery.data !== undefined ? (\n <span className=\"text-body-sm text-fg-muted\">\n {t('studio.remap.subtitle', '{tables} tables · {applied} overrides applied')\n .replace('{tables}', String(schemaQuery.data.model.tables.length))\n .replace('{applied}', String(schemaQuery.data.appliedOverrides))}\n </span>\n ) : null}\n </header>\n\n {sourceNotes.length > 0 ? (\n <Banner tone=\"info\">\n <span className=\"flex flex-col gap-0.5\">\n {sourceNotes.map((note) => (\n <span key={note}>{note}</span>\n ))}\n </span>\n </Banner>\n ) : null}\n\n {saveError !== null ? (\n <Banner tone=\"danger\" role=\"alert\">\n {t('studio.remap.saveFailed', 'Save failed: {message}').replace('{message}', saveError.message)}\n </Banner>\n ) : null}\n {schemaQuery.isError ? (\n <Banner tone=\"danger\" role=\"alert\">\n {t('studio.remap.loadFailed', 'Could not load the schema for this connection.')}\n </Banner>\n ) : null}\n\n {schemaQuery.isPending || overridesQuery.isPending ? (\n <div className=\"flex flex-col gap-2\" aria-busy=\"true\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n ) : null}\n\n {model !== undefined ? (\n <div className=\"grid min-h-0 flex-1 grid-cols-1 gap-4 md:grid-cols-[minmax(16rem,22rem)_1fr]\">\n <SchemaTree model={model} buffer={buffer} selection={selection} onSelect={setSelection} />\n <section\n aria-label={t('studio.remap.inspector', 'Inspector')}\n className=\"min-h-0 overflow-y-auto rounded-lg border border-border bg-surface p-4\"\n >\n {selection === null || selectedTable === undefined ? (\n <EmptyState\n preset=\"no-data\"\n title={t('studio.remap.empty.title', 'Pick a table or column')}\n body={t(\n 'studio.remap.empty.description',\n 'Select something in the schema tree to remap its label, type, relations or masking.',\n )}\n />\n ) : selection.kind === 'column' && selectedColumn !== undefined ? (\n <ColumnInspector\n model={model}\n table={selectedTable}\n column={selectedColumn}\n buffer={buffer}\n fieldError={fieldErrorFor(selectedTable.id, selectedColumn.name)}\n />\n ) : (\n <Tabs defaultValue=\"details\">\n <TabsList>\n <TabsTrigger value=\"details\">{t('studio.remap.tabs.details', 'Details')}</TabsTrigger>\n <TabsTrigger value=\"relations\">{t('studio.remap.tabs.relations', 'Relations')}</TabsTrigger>\n </TabsList>\n <TabsContent value=\"details\" className=\"pt-4\">\n <TableInspector\n table={selectedTable}\n buffer={buffer}\n fieldError={fieldErrorFor(selectedTable.id, null)}\n />\n </TabsContent>\n <TabsContent value=\"relations\" className=\"pt-4\">\n <RelationsTab model={model} table={selectedTable} buffer={buffer} />\n </TabsContent>\n </Tabs>\n )}\n </section>\n </div>\n ) : null}\n\n <DiffBar\n changes={buffer.changes}\n onRevert={buffer.revert}\n onRevertAll={buffer.revertAll}\n onSave={() => void handleSave()}\n saving={saving}\n errorKey={saveError?.key ?? null}\n canRegenerate={savedOnce}\n onRegenerate={() => void handleRegenerate()}\n regenerating={regenerating}\n />\n\n <ToastStack\n {...toasts.stackProps}\n dismissLabel={t('common.dismiss', 'Dismiss')}\n label={t('common.notifications', 'Notifications')}\n />\n </div>\n );\n}\n"],"names":["titleCase","name","c","tableDisplayLabel","table","columnDisplayLabel","column","tableById","model","tableId","enumValuesFor","def","relationsForTable","touching","relation","r","RELATION_OP_CARDINALITIES","COLUMN_OPS","columnKeyPart","item","overrideKey","stableStringify","value","v","a","b","k","entriesEqual","baselineFromRows","rows","map","row","stageEntry","baseline","overlay","entry","key","next","dropEntry","revertEntry","effectiveEntry","bufferChanges","changes","previous","buildPutDocument","effective","status","useRemapBuffer","useMemo","setOverlay","useState","get","useCallback","stage","current","drop","revert","revertAll","buildDocument","ENUM_TONES","ColumnInspector","buffer","fieldError","target","labelKey","semanticKey","piiKey","enumKey","labelEntry","stagedLabel","semanticEntry","stagedSemantic","piiEntry","stagedPii","enumEntry","stagedEnum","semantics","inferredTag","confidencePct","piiKind","masked","enumValues","isEnum","stagePii","nextMasked","enumLabels","enumTones","stageEnum","labels","tones","currentEnumSemantic","jsxs","jsx","MonoText","Tag","Badge","t","FormField","Input","event","Select","LOGICAL_TYPES","type","SEMANTIC_TAGS","tag","currency","Switch","SegmentedControl","tone","changeText","change","kindTone","DiffBar","onRevert","onRevertAll","onSave","saving","errorKey","canRegenerate","onRegenerate","regenerating","cn","X","Button","Fragment","endpointText","from","to","opCardinality","RelationsTab","declared","inferred","overrides","fromColumn","setFromColumn","toTable","setToTable","toColumn","setToColumn","cardinality","setCardinality","acceptKeyFor","suppressKeyFor","accept","suppress","targetTable","canAdd","accepted","suppressed","Combobox","candidate","option","TypeChip","SchemaBadges","pii","stagedTableLabel","stagedColumnLabel","SchemaTree","selection","onSelect","query","setQuery","expanded","setExpanded","q","visible","toggle","SearchInput","isOpen","staged","label","selected","excluded","Icon","lucideByName","ChevronDown","ChevronRight","columnSelected","ICON_SUBSET","IconPicker","onChange","NAV_GROUPS","TableInspector","excludeKey","stagedIcon","excludeEntry","stageLabelOp","nextLabel","nextIcon","icon","group","checked","KeyValueList","p","putJson","path","payload","response","body","envelope","ApiError","base","connectionId","remapSchemaQuery","queryOptions","api","remapOverridesQuery","putOverrides","document","regeneratePages","toSaveError","error","details","RemapEditor","queryClient","useQueryClient","schemaQuery","useQuery","overridesQuery","toasts","useToastQueue","setSelection","setSaving","setRegenerating","savedOnce","setSavedOnce","saveError","setSaveError","handleSave","handleRegenerate","reply","fieldErrorFor","tableName","columnName","selectedTable","selectedColumn","sourceNotes","capabilityNotes","modelCapabilitySource","Banner","note","Skeleton","EmptyState","Tabs","TabsList","TabsTrigger","TabsContent","ToastStack"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as m,ey as F,ez as Je,j as n,eA as B,eB as W,eC as Ze,eD as et,eE as tt,eF as nt,eG as st,c as Y,eH as lt,eI as rt,eJ as o,as as ot,eK as it,eL as at,at as q,M as L,b9 as K,eM as me,S as E,bU as Se,b3 as ct,el as ut,b7 as ae,bD as dt,b4 as mt,bt as ft,eN as pt,eO as ht,eP as ye,eQ as xt,av as gt,e1 as oe,E as bt,eR as ne,eS as Ne}from"./index-PB1II0WV.js";function ke(e,[t,s]){return Math.min(s,Math.max(t,e))}var Ce=["PageUp","PageDown"],Ee=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],Ae={"from-left":["Home","PageDown","ArrowDown","ArrowLeft"],"from-right":["Home","PageDown","ArrowDown","ArrowRight"],"from-bottom":["Home","PageDown","ArrowDown","ArrowLeft"],"from-top":["Home","PageDown","ArrowUp","ArrowLeft"]},H="Slider",[ce,vt,wt]=Ze(H),[fe]=st(H,[wt]),[yt,X]=fe(H),De=m.forwardRef((e,t)=>{const{name:s,min:l=0,max:r=100,step:i=1,orientation:a="horizontal",disabled:c=!1,minStepsBetweenThumbs:p=0,defaultValue:d=[l],value:f,onValueChange:u=()=>{},onValueCommit:h=()=>{},inverted:g=!1,form:v,...x}=e,y=m.useRef(new Set),w=m.useRef(0),C=m.useRef(!1),S=a==="horizontal"?jt:Rt,[T,J]=m.useState(null),U=F(t,J),[P=[],b]=Je({prop:f,defaultProp:d,onChange:j=>{[...y.current][w.current]?.focus({preventScroll:!0,focusVisible:C.current}),C.current=!1,u(j)}}),N=m.useRef(P),_=m.useRef(P);m.useEffect(()=>{const j=v?T?.ownerDocument.getElementById(v):T?.closest("form");if(j instanceof HTMLFormElement){const M=()=>b(_.current);return j.addEventListener("reset",M),()=>j.removeEventListener("reset",M)}},[T,v,b]);function D(j){const M=Ct(P,j);$(j,M)}function G(j){$(j,w.current)}function Xe(){const j=N.current[w.current];P[w.current]!==j&&h(P)}function $(j,M,{commit:le}={commit:!1}){const ve=$e(i),re=te(Math.round((j-l)/i)*i+l,ve),Q=ke(re,[l,r]);b((z=[])=>{const O=Nt(z,Q,M);if(Dt(O,p*i)){w.current=O.indexOf(Q);const we=String(O)!==String(z);return we&&le&&h(O),we?O:z}else return z})}return n.jsx(yt,{scope:e.__scopeSlider,name:s,disabled:c,min:l,max:r,valueIndexToChangeRef:w,thumbs:y.current,values:P,orientation:a,form:v,children:n.jsx(ce.Provider,{scope:e.__scopeSlider,children:n.jsx(ce.Slot,{scope:e.__scopeSlider,children:n.jsx(S,{"aria-disabled":c,"data-disabled":c?"":void 0,...x,ref:U,onPointerDown:B(x.onPointerDown,()=>{c||(N.current=P,C.current=!1)}),min:l,max:r,inverted:g,onSlideStart:c?void 0:D,onSlideMove:c?void 0:G,onSlideEnd:c?void 0:Xe,onHomeKeyDown:()=>{c||(C.current=!0,$(l,0,{commit:!0}))},onEndKeyDown:()=>{c||(C.current=!0,$(r,P.length-1,{commit:!0}))},onStepKeyDown:({event:j,direction:M})=>{if(!c){C.current=!0;const re=Ce.includes(j.key)||j.shiftKey&&Ee.includes(j.key)?10:1,Q=w.current,z=P[Q],O=Pt(z,{min:l,step:i,direction:M,multiplier:re});$(O,Q,{commit:!0})}}})})})})});De.displayName=H;var[Pe,_e]=fe(H,{startEdge:"left",endEdge:"right",size:"width",direction:1}),jt=m.forwardRef((e,t)=>{const{min:s,max:l,dir:r,inverted:i,onSlideStart:a,onSlideMove:c,onSlideEnd:p,onStepKeyDown:d,...f}=e,[u,h]=m.useState(null),g=F(t,h),v=m.useRef(void 0),x=et(r),y=x==="ltr",w=y&&!i||!y&&i;function C(R){const S=v.current||u.getBoundingClientRect(),T=[0,S.width],U=pe(T,w?[s,l]:[l,s]);return v.current=S,U(R-S.left)}return n.jsx(Pe,{scope:e.__scopeSlider,startEdge:w?"left":"right",endEdge:w?"right":"left",direction:w?1:-1,size:"width",children:n.jsx(Me,{dir:x,"data-orientation":"horizontal",...f,ref:g,style:{...f.style,"--radix-slider-thumb-transform":"translateX(-50%)"},onSlideStart:R=>{const S=C(R.clientX);a?.(S)},onSlideMove:R=>{const S=C(R.clientX);c?.(S)},onSlideEnd:()=>{v.current=void 0,p?.()},onStepKeyDown:R=>{const T=Ae[w?"from-left":"from-right"].includes(R.key);d?.({event:R,direction:T?-1:1})}})})}),Rt=m.forwardRef((e,t)=>{const{min:s,max:l,inverted:r,onSlideStart:i,onSlideMove:a,onSlideEnd:c,onStepKeyDown:p,...d}=e,f=m.useRef(null),u=F(t,f),h=m.useRef(void 0),g=!r;function v(x){const y=h.current||f.current.getBoundingClientRect(),w=[0,y.height],R=pe(w,g?[l,s]:[s,l]);return h.current=y,R(x-y.top)}return n.jsx(Pe,{scope:e.__scopeSlider,startEdge:g?"bottom":"top",endEdge:g?"top":"bottom",size:"height",direction:g?1:-1,children:n.jsx(Me,{"data-orientation":"vertical",...d,ref:u,style:{...d.style,"--radix-slider-thumb-transform":"translateY(50%)"},onSlideStart:x=>{const y=v(x.clientY);i?.(y)},onSlideMove:x=>{const y=v(x.clientY);a?.(y)},onSlideEnd:()=>{h.current=void 0,c?.()},onStepKeyDown:x=>{const w=Ae[g?"from-bottom":"from-top"].includes(x.key);p?.({event:x,direction:w?-1:1})}})})}),Me=m.forwardRef((e,t)=>{const{__scopeSlider:s,onSlideStart:l,onSlideMove:r,onSlideEnd:i,onHomeKeyDown:a,onEndKeyDown:c,onStepKeyDown:p,...d}=e,f=X(H,s);return n.jsx(W.span,{...d,ref:t,onKeyDown:B(e.onKeyDown,u=>{u.key==="Home"?(a(u),u.preventDefault()):u.key==="End"?(c(u),u.preventDefault()):Ce.concat(Ee).includes(u.key)&&(p(u),u.preventDefault())}),onPointerDown:B(e.onPointerDown,u=>{const h=u.target;h.setPointerCapture(u.pointerId),u.preventDefault(),f.thumbs.has(h)?h.focus({preventScroll:!0,focusVisible:!1}):l(u)}),onPointerMove:B(e.onPointerMove,u=>{u.target.hasPointerCapture(u.pointerId)&&r(u)}),onPointerUp:B(e.onPointerUp,u=>{const h=u.target;h.hasPointerCapture(u.pointerId)&&(h.releasePointerCapture(u.pointerId),i(u))})})}),Te="SliderTrack",Ke=m.forwardRef((e,t)=>{const{__scopeSlider:s,...l}=e,r=X(Te,s);return n.jsx(W.span,{"data-disabled":r.disabled?"":void 0,"data-orientation":r.orientation,...l,ref:t})});Ke.displayName=Te;var ue="SliderRange",Oe=m.forwardRef((e,t)=>{const{__scopeSlider:s,...l}=e,r=X(ue,s),i=_e(ue,s),a=m.useRef(null),c=F(t,a),p=r.values.length,d=r.values.map(h=>Ge(h,r.min,r.max)),f=p>1?Math.min(...d):0,u=100-Math.max(...d);return n.jsx(W.span,{"data-orientation":r.orientation,"data-disabled":r.disabled?"":void 0,...l,ref:c,style:{...e.style,[i.startEdge]:f+"%",[i.endEdge]:u+"%"}})});Oe.displayName=ue;var Ie="SliderThumb",[St,ze]=fe(Ie),Be="SliderThumbProvider";function Le(e){const{__scopeSlider:t,name:s,children:l,internal_do_not_use_render:r}=e,i=X(Be,t),a=vt(t),[c,p]=m.useState(null),d=m.useMemo(()=>c?a().findIndex(y=>y.ref.current===c):-1,[a,c]),f=tt(c),u=c?!!i.form||!!c.closest("form"):!0,h=i.values[d],g=s??(i.name?i.name+(i.values.length>1?"[]":""):void 0),v=h===void 0?0:Ge(h,i.min,i.max);m.useEffect(()=>{if(c)return i.thumbs.add(c),()=>{i.thumbs.delete(c)}},[c,i.thumbs]);const x={value:h,name:g,form:i.form,isFormControl:u,index:d,thumb:c,onThumbChange:p,percent:v,size:f};return n.jsx(St,{scope:t,...x,children:_t(r)?r(x):l})}Le.displayName=Be;var ee="SliderThumbTrigger",Ve=m.forwardRef((e,t)=>{const{__scopeSlider:s,...l}=e,r=X(ee,s),i=_e(ee,s),{index:a,value:c,percent:p,size:d,onThumbChange:f}=ze(ee,s),u=F(t,f),h=kt(a,r.values.length),g=d?.[i.size],v=g?Et(g,p,i.direction):0;return n.jsx("span",{style:{transform:"var(--radix-slider-thumb-transform)",position:"absolute",[i.startEdge]:`calc(${p}% + ${v}px)`},children:n.jsx(ce.ItemSlot,{scope:s,children:n.jsx(W.span,{role:"slider","aria-label":e["aria-label"]||h,"aria-valuemin":r.min,"aria-valuenow":c,"aria-valuemax":r.max,"aria-orientation":r.orientation,"data-orientation":r.orientation,"data-disabled":r.disabled?"":void 0,tabIndex:r.disabled?void 0:0,...l,ref:u,style:c===void 0?{display:"none"}:e.style,onFocus:B(e.onFocus,()=>{r.valueIndexToChangeRef.current=a})})})})});Ve.displayName=ee;var Fe=m.forwardRef((e,t)=>{const{__scopeSlider:s,name:l,...r}=e;return n.jsx(Le,{__scopeSlider:s,name:l,internal_do_not_use_render:({index:i,isFormControl:a})=>n.jsxs(n.Fragment,{children:[n.jsx(Ve,{...r,ref:t,__scopeSlider:s}),a?n.jsx(Ue,{__scopeSlider:s},i):null]})})});Fe.displayName=Ie;var He="SliderBubbleInput",Ue=m.forwardRef(({__scopeSlider:e,...t},s)=>{const{value:l,name:r,form:i}=ze(He,e),a=m.useRef(null),c=F(a,s),p=nt(l);return m.useEffect(()=>{const d=a.current;if(!d)return;const f=window.HTMLInputElement.prototype,h=Object.getOwnPropertyDescriptor(f,"value").set;if(p!==l&&h){const g=new Event("input",{bubbles:!0});h.call(d,l),d.dispatchEvent(g)}},[p,l]),n.jsx(W.input,{style:{display:"none"},name:r,form:i,...t,ref:c,defaultValue:l})});Ue.displayName=He;function Nt(e=[],t,s){const l=[...e];return l[s]=t,l.sort((r,i)=>r-i)}function Ge(e,t,s){const i=100/(s-t)*(e-t);return ke(i,[0,100])}function kt(e,t){return t>2?`Value ${e+1} of ${t}`:t===2?["Minimum","Maximum"][e]:void 0}function Ct(e,t){if(e.length===1)return 0;const s=e.map(r=>Math.abs(r-t)),l=Math.min(...s);return s.indexOf(l)}function Et(e,t,s){const l=e/2,i=pe([0,50],[0,l]);return(l-i(t)*s)*s}function At(e){return e.slice(0,-1).map((t,s)=>e[s+1]-t)}function Dt(e,t){if(t>0){const s=At(e);return Math.min(...s)>=t}return!0}function pe(e,t){return s=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const l=(t[1]-t[0])/(e[1]-e[0]);return t[0]+l*(s-e[0])}}function $e(e){if(!Number.isFinite(e))return 0;const t=e.toString();if(t.includes("e")){const[l,r]=t.split("e"),i=l.split(".")[1]||"",a=Number(r);return Math.max(0,i.length-a)}const s=t.split(".")[1];return s?s.length:0}function te(e,t){const s=Math.pow(10,t);return Math.round(e*s)/s}function Pt(e,{min:t,step:s,direction:l,multiplier:r}){const i=$e(s),a=(e-t)/s,c=Math.round(a),p=te(c*s+t,i)===te(e,i);let d;return p?d=c+r*l:l>0?d=Math.ceil(a):d=Math.floor(a),te(d*s+t,i)}function _t(e){return typeof e=="function"}function Mt({className:e,thumbLabels:t,value:s,defaultValue:l,...r}){const i=(s??l??[0]).length;return n.jsxs(De,{...s===void 0?{}:{value:s},...l===void 0?{}:{defaultValue:l},className:Y("relative flex h-5 w-full touch-none select-none items-center data-[disabled]:pointer-events-none data-[disabled]:opacity-40",e),...r,children:[n.jsx(Ke,{className:"relative h-1.5 grow overflow-hidden rounded-full bg-surface-3",children:n.jsx(Oe,{className:"absolute h-full bg-accent"})}),Array.from({length:i},(a,c)=>n.jsx(Fe,{...t?.[c]===void 0?{}:{"aria-label":t[c]},className:Y("block size-4 rounded-full border-2 border-accent bg-surface shadow-card ","transition-shadow duration-150 ","focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-accent-soft")},c))]})}const he=.8,xe=[{id:"labels",categories:["label"],icon:"tag",labelKey:"studio.llmRuns.review.group.labels",labelDefault:"Labels & translations"},{id:"groups",categories:["group"],icon:"layout-grid",labelKey:"studio.llmRuns.review.group.navigation",labelDefault:"Navigation & domains"},{id:"enums",categories:["enum"],icon:"list-checks",labelKey:"studio.llmRuns.review.group.enums",labelDefault:"Enum semantics"},{id:"relations",categories:["relation"],icon:"git-fork",labelKey:"studio.llmRuns.review.group.relations",labelDefault:"Relations"},{id:"keys",categories:["key"],icon:"key-round",labelKey:"studio.llmRuns.review.group.keys",labelDefault:"Key columns"},{id:"templates",categories:["template"],icon:"layout-template",labelKey:"studio.llmRuns.review.group.templates",labelDefault:"Page templates"},{id:"dashboards",categories:["dashboard","widget"],icon:"bar-chart-3",labelKey:"studio.llmRuns.review.group.dashboards",labelDefault:"Dashboards & widgets"},{id:"pii",categories:["pii"],icon:"shield",labelKey:"studio.llmRuns.review.group.pii",labelDefault:"PII & masking"},{id:"icons",categories:["icon"],icon:"shapes",labelKey:"studio.llmRuns.review.group.icons",labelDefault:"Icons"},{id:"microcopy",categories:["copy"],icon:"message-square-text",labelKey:"studio.llmRuns.review.group.microcopy",labelDefault:"Micro-copy"}],Tt=new Map(xe.flatMap(e=>e.categories.map(t=>[t,e.id])));function Kt(e){return Tt.get(e)??null}function Ot(e){const t=new Map;for(const l of e){const r=Kt(l.category);if(r===null)continue;const i=t.get(r);i===void 0?t.set(r,[l]):i.push(l)}const s=[];for(const l of xe){const r=t.get(l.id);r!==void 0&&r.length>0&&s.push({def:l,rows:r})}return s}function It(e){return e==="agree"||e==="conflict"||e==="llm-new"||e==="rejects-heuristic"}function zt(e){return e==="user-locked"}function Qe(e){return e==="conflict"||e==="llm-new"}function Bt(e,t=he){return e.status==="agree"?!0:Qe(e.status)?e.confidence>=t:!1}function Ye(e,t=he){const s=new Set;for(const l of e)Bt(l,t)&&s.add(l.id);return s}function Lt(e,t){return Ye(e,t)}function qe(e){return e.filter(t=>t.status==="agree"||Qe(t.status)).map(t=>t.id)}function Vt(e,t){const s=qe(e);if(s.length===0)return"none";let l=0;for(const r of s)t.has(r)&&(l+=1);return l===0?"none":l===s.length?"all":"some"}function Ft(e){const t={agree:0,conflict:0,new:0,rejects:0,locked:0,heuristicOnly:0,total:e.length};for(const s of e)switch(s.status){case"agree":t.agree+=1;break;case"conflict":t.conflict+=1;break;case"llm-new":t.new+=1;break;case"rejects-heuristic":t.rejects+=1;break;case"user-locked":t.locked+=1;break;case"heuristic-only":t.heuristicOnly+=1;break}return t}function Ht(e,t){const s={labels:0,keys:0,enums:0,relations:0,templates:0,dashboards:0,widgets:0,navGroups:0,pii:0,icons:0,microcopy:0,total:0};for(const l of e)if(t.has(l.id))switch(s.total+=1,l.category){case"label":s.labels+=1;break;case"key":s.keys+=1;break;case"enum":s.enums+=1;break;case"relation":s.relations+=1;break;case"template":s.templates+=1;break;case"dashboard":s.dashboards+=1;break;case"widget":s.widgets+=1;break;case"group":s.navGroups+=1;break;case"pii":s.pii+=1;break;case"icon":s.icons+=1;break;case"copy":s.microcopy+=1;break}return s}function We(e,t){let s=0;for(const l of e)t.has(l.id)&&(s+=1);return s}function Ut(e){const t=e.id.indexOf(":");return(t===-1?e.id:e.id.slice(t+1)).replace(/(^|[.:>-])public\./g,"$1")}function Gt(e){const t={labels:e.labels,groups:e.navGroups,enums:e.enums,relations:e.relations,keys:e.keys,templates:e.templates,dashboards:e.dashboards+e.widgets,pii:e.pii,icons:e.icons,microcopy:e.microcopy},s=[];for(const l of xe){const r=t[l.id]??0;r>0&&s.push({id:l.id,label:o(l.labelKey,l.labelDefault),count:r})}return s}function $t({open:e,summary:t,applying:s,onConfirm:l,onOpenChange:r}){const i=Gt(t);return n.jsxs(lt,{size:"sm",open:e,onOpenChange:a=>{s&&!a||r(a)},children:[n.jsx(rt,{tone:"accent",icon:n.jsx(ot,{}),title:o("studio.llmRuns.review.apply.title","Apply {n} suggestions",{n:t.total}),subtitle:o("studio.llmRuns.review.apply.subtitle","These changes are written in one transaction and can be undone."),closeLabel:o("common.dismiss","Dismiss")}),n.jsx(it,{children:i.length===0?n.jsx("p",{className:"text-body-sm text-fg-muted",children:o("studio.llmRuns.review.apply.empty","Nothing selected to apply.")}):n.jsx("ul",{className:"flex flex-col gap-1.5",children:i.map(a=>n.jsxs("li",{className:"flex items-center justify-between gap-3 text-body-sm",children:[n.jsx("span",{className:"text-fg-muted",children:a.label}),n.jsx("span",{className:"font-semibold tabular-nums text-fg",children:a.count})]},a.id))})}),n.jsxs(at,{children:[n.jsx(q,{variant:"ghost",disabled:s,onClick:()=>r(!1),children:o("common.cancel","Cancel")}),n.jsx(q,{loading:s,disabled:t.total===0,onClick:l,children:o("studio.llmRuns.review.apply.confirm","Apply changes")})]})]})}const Z=["en_US","de_DE","fr_FR","cs_CZ","da_DK","zh_CN","zh_TW","ar_EG"];function I(e){return e===null||typeof e!="object"?!1:Object.values(e).every(t=>typeof t=="string")}function se(e){if(!I(e))return null;if(typeof e.en_US=="string")return e.en_US;const t=Object.values(e)[0];return typeof t=="string"?t:null}function Qt(e){return Object.entries(e).sort(([t],[s])=>{const l=Z.indexOf(t),r=Z.indexOf(s);return(l===-1?Z.length:l)-(r===-1?Z.length:r)})}function Yt({label:e,value:t}){if(!I(t))return null;const s=Qt(t);return s.length===0?null:n.jsxs("div",{className:"flex flex-col gap-1",children:[n.jsx("span",{className:"text-caption font-semibold uppercase tracking-wide text-fg-subtle",children:e}),n.jsx("ul",{className:"flex flex-col gap-0.5",children:s.map(([l,r])=>n.jsxs("li",{className:"flex items-baseline gap-2",children:[n.jsx(L,{className:"shrink-0 text-caption text-fg-subtle",children:l}),n.jsx("span",{className:"text-body-sm text-fg",dir:"auto",children:r})]},l))})]})}const qt=new Set(["label","group","copy"]);function Wt(e){return qt.has(e)}function k({children:e}){return n.jsx("span",{className:"text-body-sm italic text-fg-subtle",children:e})}const Xt={pos:"pos",warn:"warn",danger:"danger",accent:"accent",muted:"neutral"};function A(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function V(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Jt({value:e}){const t=A(e),s=se(t?.label),l=typeof t?.icon=="string"?t.icon:null;if(s===null&&l===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const r=l!==null?me(l):null;return n.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[r!==null?n.jsx(r,{"aria-hidden":!0,className:"size-3.5 text-fg-muted"}):null,n.jsx("span",{className:"text-body-sm font-medium text-fg",dir:"auto",children:s??o("studio.llmRuns.review.value.none","No value")})]})}function Zt({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=typeof t.displayColumn=="string"?t.displayColumn:null,l=V(t.naturalKey);return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1",children:[n.jsx("span",{className:"text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.display","Display")}),s!==null?n.jsx(K,{mono:!0,children:s}):n.jsx(k,{children:o("studio.llmRuns.review.value.dash","—")}),n.jsx("span",{className:"ms-1 text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.key","Key")}),l.length>0?l.map(r=>n.jsx(K,{mono:!0,children:r},r)):n.jsx(k,{children:o("studio.llmRuns.review.value.dash","—")})]})}function en({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=typeof t.kind=="string"?t.kind:null,l=V(t.order),r=A(t.tones)??{},i=new Set(V(t.terminal)),a=l.length>0?l:Object.keys(r);return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1",children:[s!==null?n.jsx(E,{tone:s==="workflow"?"accent":"neutral",children:s==="workflow"?o("studio.llmRuns.review.value.enumWorkflow","Workflow"):o("studio.llmRuns.review.value.enumCategory","Category")}):null,a.map(c=>{const p=Xt[String(r[c]??"muted")]??"neutral";return n.jsx(E,{tone:p,dot:i.has(c),children:c},c)})]})}function tn({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=`${de(t.fromTable)}.${V(t.fromColumns).join(", ")}`,l=`${de(t.toTable)}.${V(t.toColumns).join(", ")}`,r=typeof t.kind=="string"?t.kind:null;return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1.5",children:[n.jsx(K,{mono:!0,children:s}),n.jsx("span",{"aria-hidden":!0,className:"inline-block text-fg-subtle rtl:-scale-x-100",children:"→"}),n.jsx(K,{mono:!0,children:l}),r!==null?n.jsx(E,{tone:"info",children:r}):null]})}function nn({value:e}){if(e===null)return n.jsx(E,{tone:"neutral",children:o("studio.llmRuns.review.value.notPii","Not PII")});const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=typeof t.kind=="string"?t.kind:null,l=typeof t.masking=="string"?t.masking:null;return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1",children:[s!==null?n.jsx(E,{tone:"warn",children:s}):null,l!==null?n.jsx(K,{mono:!0,tone:"warn",children:l}):null]})}function sn({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=typeof t.template=="string"?t.template:null,l=typeof t.rank=="number"?t.rank:null;return n.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[s!==null?n.jsx(K,{mono:!0,tone:"accent",children:s}):null,l!==null?n.jsx("span",{className:"text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.rank","rank {n}",{n:l})}):null]})}function ln({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=se(t.label),l=typeof t.icon=="string"?t.icon:null,r=V(t.tables),i=l!==null?me(l):null;return n.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[i!==null?n.jsx(i,{"aria-hidden":!0,className:"size-3.5 text-fg-muted"}):null,n.jsx("span",{className:"text-body-sm font-medium text-fg",dir:"auto",children:s??o("studio.llmRuns.review.value.none","No value")}),n.jsx("span",{className:"text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.tableCount","{n} tables",{n:r.length})})]})}function rn({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=se(t.label),l=typeof t.domain=="string"?t.domain:null,r=Array.isArray(t.widgets)?t.widgets.length:0;return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1.5",children:[n.jsx("span",{className:"text-body-sm font-medium text-fg",dir:"auto",children:s??l??o("studio.llmRuns.review.value.none","No value")}),n.jsx("span",{className:"text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.widgetCount","{n} widgets",{n:r})})]})}function on({value:e}){const t=A(e);if(t===null)return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")});const s=typeof t.widget=="string"?t.widget:null,l=typeof t.span=="number"?t.span:null,r=typeof t.table=="string"?t.table:null,i=typeof t.metricColumn=="string"?t.metricColumn:null,a=typeof t.dimensionColumn=="string"?t.dimensionColumn:null,c=typeof t.timeColumn=="string"?t.timeColumn:null,d=[typeof t.agg=="string"?t.agg:null,i??a??c].filter(f=>f!==null).join(" · ");return n.jsxs("span",{className:"inline-flex flex-wrap items-center gap-1.5",children:[s!==null?n.jsx(K,{mono:!0,tone:"accent",children:s}):null,l!==null?n.jsx("span",{className:"text-caption text-fg-subtle",children:o("studio.llmRuns.review.value.span","span {n}",{n:l})}):null,r!==null?n.jsxs(L,{className:"text-caption text-fg-muted",children:[de(r),d.length>0?` · ${d}`:""]}):null]})}function an({value:e}){const t=A(e),s=se(t?.pageSubtitle);return s===null?n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")}):n.jsx("span",{className:"text-body-sm text-fg",dir:"auto",children:s})}function de(e){if(typeof e!="string")return"";const t=e.indexOf(".");return t===-1?e:e.slice(t+1)}function je({category:e,value:t}){if(t===void 0)return n.jsx(k,{children:o("studio.llmRuns.review.value.absent","None")});switch(e){case"label":return n.jsx(Jt,{value:t});case"key":return n.jsx(Zt,{value:t});case"enum":return n.jsx(en,{value:t});case"relation":return n.jsx(tn,{value:t});case"pii":return n.jsx(nn,{value:t});case"template":return n.jsx(sn,{value:t});case"group":return n.jsx(ln,{value:t});case"dashboard":return n.jsx(rn,{value:t});case"widget":return n.jsx(on,{value:t});case"copy":return n.jsx(an,{value:t});default:return n.jsx(k,{children:o("studio.llmRuns.review.value.none","No value")})}}function Re(e,t){const s=A(t);if(s===null)return[];if(e==="label"||e==="group"){const l=[];return I(s.label)&&l.push({key:"label",label:o("studio.llmRuns.review.value.label","Label"),value:s.label}),I(s.description)&&l.push({key:"description",label:o("studio.llmRuns.review.value.description","Description"),value:s.description}),l}if(e==="copy"){const l=[];I(s.pageSubtitle)&&l.push({key:"pageSubtitle",label:o("studio.llmRuns.review.value.subtitle","Page subtitle"),value:s.pageSubtitle});const r=A(s.emptyState);return r!==null&&(I(r.headline)&&l.push({key:"headline",label:o("studio.llmRuns.review.value.headline","Empty-state headline"),value:r.headline}),I(r.guidance)&&l.push({key:"guidance",label:o("studio.llmRuns.review.value.guidance","Empty-state guidance"),value:r.guidance})),l}return[]}function cn(e){switch(e){case"agree":return{tone:"pos",label:o("studio.llmRuns.review.status.agree","Agrees")};case"conflict":return{tone:"warn",label:o("studio.llmRuns.review.status.conflict","Conflict")};case"llm-new":return{tone:"accent",label:o("studio.llmRuns.review.status.new","New")};case"heuristic-only":return{tone:"neutral",label:o("studio.llmRuns.review.status.heuristicOnly","Heuristic only")};case"rejects-heuristic":return{tone:"danger",label:o("studio.llmRuns.review.status.rejects","Rejects heuristic")};case"user-locked":return{tone:"info",label:o("studio.llmRuns.review.status.locked","Locked")}}}function un(e){return e>=.8?"pos":e>=.5?"accent":"warn"}function dn(e){switch(e){case"label":return o("studio.llmRuns.review.cat.label","label");case"key":return o("studio.llmRuns.review.cat.key","key columns");case"enum":return o("studio.llmRuns.review.cat.enum","enum");case"relation":return o("studio.llmRuns.review.cat.relation","relation");case"pii":return o("studio.llmRuns.review.cat.pii","PII");case"template":return o("studio.llmRuns.review.cat.template","page template");case"group":return o("studio.llmRuns.review.cat.group","navigation group");case"dashboard":return o("studio.llmRuns.review.cat.dashboard","dashboard");case"widget":return o("studio.llmRuns.review.cat.widget","widget");case"copy":return o("studio.llmRuns.review.cat.copy","micro-copy");default:return e}}function mn({diff:e,checked:t,readOnly:s,onToggle:l}){const[r,i]=m.useState(!1),a=m.useId(),c=cn(e.status),p=zt(e.status),d=It(e.status)&&!s&&!p,f=e.status==="rejects-heuristic",u=Ut(e),h=e.status!=="heuristic-only",g=r?Re(e.category,e.llmValue):[],v=Wt(e.category)&&Re(e.category,e.llmValue).length>0;return n.jsx("li",{"data-testid":"suggestion-row","data-status":e.status,"data-checked":t,className:Y("flex flex-col gap-2 rounded-lg border p-3",f?"border-border bg-warn-soft":"border-border bg-surface",p&&"opacity-90"),children:n.jsxs("div",{className:"flex items-start gap-3",children:[n.jsx(Se,{id:a,className:"mt-0.5",checked:t,disabled:!d,"aria-label":o("studio.llmRuns.review.row.acceptAria","Accept {noun} suggestion for {target}",{noun:dn(e.category),target:u}),onCheckedChange:x=>l(e.id,x===!0)}),n.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-1.5",children:[n.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.jsx(L,{className:"text-caption font-semibold text-fg-muted",children:u}),n.jsx(ct,{status:e.status,tone:c.tone,children:c.label}),p?n.jsxs(E,{tone:"info",children:[n.jsx(ut,{"aria-hidden":!0,className:"me-1 size-3"}),o("studio.llmRuns.review.row.keptEdited","kept — edited by you")]}):null]}),n.jsxs("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1",children:[n.jsx("span",{className:"min-w-0","data-testid":"heuristic-value",children:n.jsx(je,{category:e.category,value:e.heuristicValue})}),n.jsx(ae,{"aria-hidden":!0,className:"size-3.5 shrink-0 text-fg-subtle rtl:-scale-x-100"}),n.jsx("span",{className:"min-w-0","data-testid":"llm-value",children:n.jsx(je,{category:e.category,value:e.llmValue})})]}),f?n.jsxs("p",{className:"flex items-start gap-1.5 text-body-sm text-warn",children:[n.jsx(dt,{"aria-hidden":!0,className:"mt-0.5 size-3.5 shrink-0"}),n.jsx("span",{children:o("studio.llmRuns.review.row.rejectsCallout","The AI rejects a heuristic decision — confirm before accepting.")})]}):null,e.reason!==void 0&&e.reason!==""?n.jsx("p",{className:"text-body-sm text-fg-muted",dir:"auto",children:e.reason}):null,v?n.jsxs("div",{children:[n.jsxs("button",{type:"button","aria-expanded":r,className:"inline-flex items-center gap-1 rounded-sm text-caption font-semibold text-accent hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",onClick:()=>i(x=>!x),children:[n.jsx(ae,{"aria-hidden":!0,className:Y("size-3 transition-transform rtl:-scale-x-100",r&&"rotate-90")}),r?o("studio.llmRuns.review.row.hideTranslations","Hide translations"):o("studio.llmRuns.review.row.showTranslations","Show translations")]}),r?n.jsx("div",{className:"mt-2 flex flex-col gap-2 rounded-md border border-border bg-surface-2 p-2",children:g.map(x=>n.jsx(Yt,{label:x.label,value:x.value},x.key))}):null]}):null]}),h?n.jsxs("div",{className:"flex w-24 shrink-0 flex-col items-end gap-1",children:[n.jsxs("span",{className:"text-caption font-semibold tabular-nums text-fg-muted",children:[Math.round(e.confidence*100),"%"]}),n.jsx(mt,{value:Math.round(e.confidence*100),tone:un(e.confidence),size:"sm",animated:!1,label:o("studio.llmRuns.review.row.confidenceAria","Confidence {pct}%",{pct:Math.round(e.confidence*100)})})]}):n.jsx(K,{className:"shrink-0",children:o("studio.llmRuns.review.row.noAi","No AI suggestion")})]})})}function fn({group:e,selected:t,readOnly:s,defaultCollapsed:l,onToggleRow:r,onSelectAll:i}){const[a,c]=m.useState(!l),p=m.useId(),d=me(e.def.icon),f=o(e.def.labelKey,e.def.labelDefault),u=We(e.rows,t),h=Vt(e.rows,t);return n.jsxs("section",{"data-testid":"category-section","data-group":e.def.id,className:"overflow-hidden rounded-xl border border-border bg-surface",children:[n.jsxs("div",{className:"flex items-center gap-2 bg-surface-2 px-3 py-2",children:[s?null:n.jsx(Se,{checked:h==="all"?!0:h==="some"?"indeterminate":!1,"aria-label":o("studio.llmRuns.review.section.selectAllAria","Select all in {group}",{group:f}),onCheckedChange:g=>i(e.rows,g===!0)}),n.jsxs("button",{type:"button","aria-expanded":a,"aria-controls":p,className:"flex min-w-0 flex-1 items-center gap-2 rounded-sm text-start focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",onClick:()=>c(g=>!g),children:[n.jsx(ae,{"aria-hidden":!0,className:Y("size-4 shrink-0 text-fg-subtle transition-transform rtl:-scale-x-100",a&&"rotate-90")}),n.jsx(d,{"aria-hidden":!0,className:"size-4 shrink-0 text-fg-muted"}),n.jsx("span",{className:"truncate text-body-sm font-semibold text-fg",children:f}),n.jsx(ft,{children:e.rows.length}),u>0?n.jsx(E,{tone:"pos",children:o("studio.llmRuns.review.section.acceptedCount","{n} accepted",{n:u})}):null]})]}),a?n.jsx("ul",{id:p,className:"flex flex-col gap-2 p-3",children:e.rows.map(g=>n.jsx(mn,{diff:g,checked:t.has(g.id),readOnly:s,onToggle:r},g.id))}):null]})}function ie(e){return Math.round(e*100)}function pn({run:e,counts:t,threshold:s,readOnly:l,onThresholdChange:r,onBulkAccept:i,onClear:a}){const c=e.mode==="byo",p=c?o("studio.llmRuns.review.header.byo","BYO"):e.model??o("studio.llmRuns.review.value.dash","—");return n.jsxs("header",{className:"flex flex-col gap-4 rounded-xl border border-border bg-surface p-4",children:[n.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[n.jsxs("div",{className:"flex flex-col gap-1",children:[n.jsx("h1",{className:"text-title-sm font-semibold text-fg",children:o("studio.llmRuns.review.header.title","Review AI suggestions")}),n.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-caption text-fg-muted",children:[n.jsx(E,{tone:c?"info":"accent",children:c?o("studio.llmRuns.review.header.pathByo","Copy-paste"):o("studio.llmRuns.review.header.pathDirect","Direct API")}),n.jsxs("span",{className:"inline-flex items-center gap-1",children:[o("studio.llmRuns.review.header.model","Model"),n.jsx(L,{className:"text-fg",children:p})]}),n.jsxs("span",{className:"inline-flex items-center gap-1",children:[o("studio.llmRuns.review.header.snapshot","Snapshot"),n.jsx(L,{className:"text-fg",children:e.snapshotId})]})]})]}),n.jsxs("ul",{className:"flex flex-wrap items-center gap-2","aria-label":o("studio.llmRuns.review.header.countsAria","Suggestion counts"),children:[n.jsx("li",{children:n.jsx(E,{tone:"pos",children:o("studio.llmRuns.review.header.agree","{n} agree",{n:t.agree})})}),n.jsx("li",{children:n.jsx(E,{tone:"warn",children:o("studio.llmRuns.review.header.conflict","{n} conflict",{n:t.conflict})})}),n.jsx("li",{children:n.jsx(E,{tone:"accent",children:o("studio.llmRuns.review.header.new","{n} new",{n:t.new})})}),n.jsx("li",{children:n.jsx(E,{tone:"danger",children:o("studio.llmRuns.review.header.rejects","{n} rejects",{n:t.rejects})})})]})]}),l?null:n.jsxs("div",{className:"flex flex-wrap items-end gap-4 border-t border-border pt-4",children:[n.jsxs("div",{className:"flex min-w-[220px] flex-1 flex-col gap-1.5",children:[n.jsxs("label",{className:"flex items-center justify-between text-caption font-semibold text-fg-muted",children:[n.jsx("span",{children:o("studio.llmRuns.review.bulk.thresholdLabel","Confidence threshold")}),n.jsxs(L,{className:"text-fg",children:[ie(s),"%"]})]}),n.jsx(Mt,{value:[ie(s)],min:0,max:100,step:5,thumbLabels:[o("studio.llmRuns.review.bulk.thresholdAria","Accept-all confidence threshold")],onValueChange:d=>{const f=d[0];typeof f=="number"&&r(f/100)}})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(q,{variant:"soft",size:"sm",onClick:i,children:o("studio.llmRuns.review.bulk.acceptAll","Accept all ≥ {pct}%",{pct:ie(s)})}),n.jsx(q,{variant:"ghost",size:"sm",onClick:a,children:o("studio.llmRuns.review.bulk.clear","Clear selection")})]})]})]})}const ge="adminium.llmReview.";function be(){try{return globalThis.localStorage??null}catch{return null}}function hn(e){const t=be();if(t===null)return null;try{const s=t.getItem(ge+e);if(s===null)return null;const l=JSON.parse(s);return Array.isArray(l)?l.filter(r=>typeof r=="string"):null}catch{return null}}function xn(e,t){const s=be();if(s!==null)try{s.setItem(ge+e,JSON.stringify([...t]))}catch{}}function gn(e){const t=be();if(t!==null)try{t.removeItem(ge+e)}catch{}}function bn(e){return Ne({queryKey:["llm","run",e],queryFn:()=>ne.getRun(e)})}function vn(e){return Ne({queryKey:["llm","diff",e],queryFn:()=>ne.getDiff(e)})}const wn=new Set(["validated","applied","partially_applied"]);function yn(e){const t=e.undoToken;return typeof t=="string"&&t.length>0?t:null}function Rn({runId:e}){const t=pt(),s=ht(),l=ye(bn(e)),r=ye(vn(e)),i=l.data,a=r.data,c=i!==void 0&&(i.status==="applied"||i.status==="partially_applied"),p=c,[d,f]=m.useState(new Set),[u,h]=m.useState(he),[g,v]=m.useState(!1),x=m.useRef(null);m.useEffect(()=>{if(i===void 0||a===void 0||x.current===e)return;if(x.current=e,i.status==="applied"||i.status==="partially_applied"){f(new Set(i.review?.accepted??[]));return}const b=new Set(a.map(_=>_.id)),N=hn(e);f(N!==null?new Set(N.filter(_=>b.has(_))):Ye(a))},[i,a,e]),m.useEffect(()=>{x.current!==e||c||xn(e,d)},[d,e,c]);const y=m.useMemo(()=>a===void 0?[]:Ot(a),[a]),w=m.useMemo(()=>a===void 0?null:Ft(a),[a]),C=m.useMemo(()=>a===void 0?null:Ht(a,d),[a,d]),R=a===void 0?0:We(a,d),S=xt({mutationFn:()=>ne.applyRun(e,[...d]),onSuccess:b=>{gn(e),f(new Set(b.review.accepted)),v(!1),t.invalidateQueries({queryKey:["llm","run",e]}),t.invalidateQueries({queryKey:["llm","diff",e]}),T(b)},onError:b=>{s.push({variant:"error",title:o("studio.llmRuns.review.toast.applyFailed","Could not apply suggestions"),description:b instanceof Error?b.message:void 0})}});function T(b){const N=yn(b),_=b.partial?o("studio.llmRuns.review.toast.appliedPartial","Applied {n} suggestions (some skipped)",{n:b.review.accepted.length}):o("studio.llmRuns.review.toast.applied","Applied {n} suggestions",{n:b.review.accepted.length});s.push({variant:"success",title:_,...N===null?{}:{action:{label:o("common.undo","Undo"),onAction:()=>{ne.undoApply(e,N).then(()=>{t.invalidateQueries({queryKey:["llm","run",e]}),t.invalidateQueries({queryKey:["llm","diff",e]}),s.push({variant:"info",title:o("undo.done","Change undone")})}).catch(D=>{s.push({variant:"error",title:o("studio.llmRuns.review.toast.undoFailed","Could not undo this change"),description:D instanceof Error?D.message:void 0})})}}}})}function J(b,N){f(_=>{const D=new Set(_);return N?D.add(b):D.delete(b),D})}function U(b,N){f(_=>{const D=new Set(_);if(N)for(const G of qe(b))D.add(G);else for(const G of b)D.delete(G.id);return D})}function P(){a!==void 0&&f(Lt(a,u))}return l.isLoading||r.isLoading?n.jsx("div",{className:"flex items-center justify-center p-16",children:n.jsx(gt,{size:"md"})}):l.isError||i===void 0?n.jsx("div",{className:"mx-auto max-w-narrow p-6",children:n.jsx(oe,{tone:"danger",title:o("studio.llmRuns.review.error.title","Could not load this run"),body:l.error instanceof Error?l.error.message:void 0})}):wn.has(i.status)?n.jsxs("div",{className:"mx-auto flex max-w-wide flex-col gap-4 p-4 pb-24 md:p-6",children:[w!==null?n.jsx(pn,{run:i,counts:w,threshold:u,readOnly:p,onThresholdChange:h,onBulkAccept:P,onClear:()=>f(new Set)}):null,c?n.jsx(oe,{tone:"pos",title:o("studio.llmRuns.review.applied.title","This run has been applied"),body:o("studio.llmRuns.review.applied.body","The accepted suggestions below are read-only.")}):null,y.length===0?n.jsx(bt,{title:o("studio.llmRuns.review.empty.title","No suggestions"),body:o("studio.llmRuns.review.empty.body","This run produced no suggestions to review.")}):n.jsx("div",{className:"flex flex-col gap-3",children:y.map(b=>n.jsx(fn,{group:b,selected:d,readOnly:p,defaultCollapsed:b.rows.every(N=>N.status==="agree"),onToggleRow:J,onSelectAll:U},b.def.id))}),p?null:n.jsx("div",{className:"fixed inset-x-0 bottom-0 z-10 border-t border-border bg-surface/95 px-4 py-3 backdrop-blur md:px-6",children:n.jsxs("div",{className:"mx-auto flex max-w-wide items-center justify-between gap-3",children:[n.jsx("span",{className:"text-body-sm text-fg-muted",children:o("studio.llmRuns.review.footer.count","{n} suggestions selected",{n:R})}),n.jsxs("div",{className:"flex items-center gap-2",children:[S.isError?n.jsx(E,{tone:"danger",children:o("studio.llmRuns.review.footer.failed","Apply failed")}):null,n.jsx(q,{disabled:R===0,onClick:()=>v(!0),children:o("studio.llmRuns.review.footer.apply","Apply {n} accepted suggestions",{n:R})})]})]})}),C!==null?n.jsx($t,{open:g,summary:C,applying:S.isPending,onConfirm:()=>S.mutate(),onOpenChange:v}):null]}):n.jsx("div",{className:"mx-auto max-w-narrow p-6",children:n.jsx(oe,{tone:"info",title:o("studio.llmRuns.review.notReady.title","This run has no suggestions to review yet"),body:o("studio.llmRuns.review.notReady.body","A run must be validated before its suggestions can be reviewed. Generate or paste a response first.")})})}export{Rn as ReviewScreen};
2
+ //# sourceMappingURL=ReviewScreen-COkLQ3T7.js.map