@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,354 @@
1
+ /**
2
+ * The §9 backup writer (11-electron.md §9) — the thing behind
3
+ * `POST /api/v1/desktop/backup`.
4
+ *
5
+ * It runs HERE, in the server, and not in the Electron main process, because §1
6
+ * principle 2 says so and because the reason it says so is load-bearing: this
7
+ * process is the one holding `ADMINIUM_SECRET`, the meta connection and the
8
+ * source-DB pools. A main process that produced the archive itself would have to
9
+ * open every database behind the back of the process writing to them.
10
+ *
11
+ * ─── Order is the guarantee ──────────────────────────────────────────────────
12
+ *
13
+ * discover → snapshot to a scratch dir → hash what was actually written →
14
+ * build the manifest FROM THOSE HASHES → zip → move into place.
15
+ *
16
+ * Every step reads the previous step's output rather than its intent. The
17
+ * manifest cannot overstate the archive (its checksums are of the bytes that
18
+ * went in, not of the files that were meant to), and the destination does not
19
+ * exist until the whole archive does — a crash mid-backup leaves a scratch
20
+ * directory, never a truncated `.zip` that a restore would cheerfully open.
21
+ *
22
+ * ─── Redaction ───────────────────────────────────────────────────────────────
23
+ *
24
+ * `config.json` travels with `secretEncrypted`/`secretPlain` stripped (§9). This
25
+ * module does not do the stripping and must not learn how: the desktop config is
26
+ * the main process's (§2.3), so the REDACTED body arrives as a parameter, and
27
+ * {@link assertNoSecrets} refuses to write it if it carries a secret-shaped key
28
+ * anyway. That is the `export/redaction.ts` rule — fail closed at the boundary,
29
+ * do not trust the caller's promise — applied to the one config this server does
30
+ * not own.
31
+ */
32
+ import { randomBytes } from 'node:crypto';
33
+ import { mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
34
+ import { dirname, join, resolve } from 'node:path';
35
+ import { strToU8, zipSync } from 'fflate';
36
+ import { APP_VERSION } from '../version.js';
37
+ import { BACKUP_CONFIG_PATH, BACKUP_FILE_PATTERN, BACKUP_FORMAT_VERSION, BACKUP_MANIFEST_PATH, BACKUP_META_PATH, backupDatabasePath, backupFileName, sha256Hex, } from './format.js';
38
+ import { discoverSources, snapshotSqliteFile } from './snapshot.js';
39
+ /** `<dataDir>/backups` — §9's auto-backup home and the staging root. */
40
+ export const BACKUPS_DIR = 'backups';
41
+ /**
42
+ * §9's rotation depth, default 7.
43
+ *
44
+ * Stated here AND in `apps/desktop/src/main/config.ts`, which is a duplication
45
+ * with a reason: that file is the schema for `config.json`, whose default this
46
+ * genuinely is, and this file is the server, which may not import the Electron
47
+ * app (`.dependency-cruiser.cjs` — the edge only runs the other way). The value
48
+ * is a number in a spec, not a decision either module gets to make, and the two
49
+ * are pinned to each other by `backup-defaults.test.ts`.
50
+ */
51
+ export const DEFAULT_AUTO_BACKUP_KEEP = 7;
52
+ /**
53
+ * Where a `staged` archive lands before the main process moves it to the path
54
+ * the user picked in the save dialog.
55
+ *
56
+ * Dot-prefixed and inside `backups/` on purpose. Inside, because the move to the
57
+ * user's chosen path is then a same-filesystem `rename` in the common case
58
+ * (both under the data dir's volume) instead of a cross-device copy. Dotted,
59
+ * because `<dataDir>/backups` is a folder §9 reveals to the user, and a
60
+ * half-written staging file appearing in it next to their real backups is
61
+ * confusing at best; the rotation sweep also skips it, since
62
+ * `BACKUP_FILE_PATTERN` cannot match a directory name.
63
+ */
64
+ export const BACKUP_STAGING_DIR = '.staging';
65
+ /**
66
+ * `secretEncrypted` and `secretPlain` are §9's named pair, but the assertion is
67
+ * SHAPE-based rather than a list of two, for the reason `export/redaction.ts`
68
+ * gives at length: a deny-list rots. A future `config.json` field called
69
+ * `apiToken` would be invisible to a two-name check and would ship in every
70
+ * backup from the day it was added.
71
+ */
72
+ const SECRET_KEY_PATTERN = /secret|password|token|apikey|credential/i;
73
+ /**
74
+ * The one key that is secret-SHAPED and is not a secret: `config.secretStorage`.
75
+ *
76
+ * It names WHERE the secret lives — `"safeStorage"` or `"plain"` — and §2.2
77
+ * step 3 / §13 require it to survive, because it is what makes the About screen
78
+ * warn that the master secret is sitting in cleartext. `redactConfig` keeps it
79
+ * on purpose (see its allow-list); a check that dropped it would silence a
80
+ * security warning in the name of security.
81
+ *
82
+ * Exempted by EXACT name AND by value: the two enum members are the only strings
83
+ * that can pass, so a future field called `secretStorage` holding anything else
84
+ * — a token, a path, a key — still fails. An exception to a fail-closed rule has
85
+ * to be narrower than the rule.
86
+ */
87
+ const SECRET_STORAGE_KEY = 'secretStorage';
88
+ const SECRET_STORAGE_VALUES = new Set(['safeStorage', 'plain']);
89
+ /** Thrown when a redacted config is not, in fact, redacted. The backup aborts. */
90
+ export class BackupRedactionError extends Error {
91
+ name = 'BackupRedactionError';
92
+ constructor(key) {
93
+ super(`refusing to write config.json into a backup: it still carries "${key}", which is ` +
94
+ 'secret-shaped. 11-electron.md §9 requires the desktop config to travel with its ' +
95
+ 'secrets stripped — the caller redacts (main/config.ts redactConfig), this asserts. ' +
96
+ 'A backup zip is a file users email to support.');
97
+ }
98
+ }
99
+ /**
100
+ * Refuse a config body carrying anything secret-shaped, at any depth.
101
+ *
102
+ * Recursive because `config.json` is nested (`lanShare`, `updates`, `window`)
103
+ * and a top-level-only check would pass `{ updates: { token: "…" } }` — which is
104
+ * exactly the shape a future field would take.
105
+ */
106
+ export function assertNoSecrets(value, path = 'config') {
107
+ if (value === null || typeof value !== 'object')
108
+ return;
109
+ if (Array.isArray(value)) {
110
+ for (const [index, item] of value.entries())
111
+ assertNoSecrets(item, `${path}[${String(index)}]`);
112
+ return;
113
+ }
114
+ for (const [key, item] of Object.entries(value)) {
115
+ if (key === SECRET_STORAGE_KEY && SECRET_STORAGE_VALUES.has(item))
116
+ continue;
117
+ if (SECRET_KEY_PATTERN.test(key))
118
+ throw new BackupRedactionError(`${path}.${key}`);
119
+ assertNoSecrets(item, `${path}.${key}`);
120
+ }
121
+ }
122
+ /**
123
+ * The meta store's migration high-water mark — the ledger's last applied name.
124
+ *
125
+ * Read from `adminium_migrations`, not from `ALL_MIGRATIONS`, and the difference
126
+ * is the whole point of the field: what a restore has to reason about is the
127
+ * schema the ARCHIVE actually carries, not the one the build that wrote it
128
+ * happened to ship. They are normally equal (every boot fast-forwards), and when
129
+ * they are not it is because something went wrong — which is precisely when a
130
+ * manifest that reported the build's number would lie.
131
+ */
132
+ async function readMetaMigrationVersion(meta) {
133
+ const rows = await meta.db
134
+ .selectFrom('adminium_migrations')
135
+ .select('name')
136
+ .orderBy('name', 'desc')
137
+ .limit(1)
138
+ .execute();
139
+ const latest = rows[0]?.name;
140
+ if (latest === undefined) {
141
+ throw new Error('refusing to back up a meta store with no applied migrations — there is nothing ' +
142
+ 'here to restore, and an archive claiming otherwise would be worse than none.');
143
+ }
144
+ return latest;
145
+ }
146
+ /**
147
+ * Produce a §9 archive. Returns where it landed and what went in it.
148
+ *
149
+ * `zipSync` + in-memory buffers rather than a streaming writer: a desktop
150
+ * install's databases are the ones a person keeps on a laptop, the snapshots are
151
+ * already on disk before any of this runs, and a streaming zip would trade a
152
+ * bounded, obvious memory profile for a partially-written archive on the failure
153
+ * path. `mtime: createdAt` (not the zip epoch the M10 config bundle uses)
154
+ * because a backup is a MOMENT, not a diffable artifact — the reproducibility
155
+ * that matters there is exactly what would be wrong here.
156
+ */
157
+ export async function createBackup(opts) {
158
+ const now = opts.now ?? Date.now;
159
+ const createdAt = now();
160
+ const dataDir = resolve(opts.dataDir);
161
+ if (opts.redactedConfig !== null && opts.redactedConfig !== undefined) {
162
+ assertNoSecrets(opts.redactedConfig);
163
+ }
164
+ // Staging is a HANDOFF, and every handoff drops things. A staged archive is
165
+ // claimed by the main process moving it to the user's chosen path — but that
166
+ // move can fail (the destination drive unplugged, permissions) or never happen
167
+ // at all (the app is killed between the reply and the move). Nothing else
168
+ // would ever remove it: rotation is documented to skip this directory, and
169
+ // these are FULL copies of every database. Left alone, a dot-directory nobody
170
+ // looks in grows by a whole install's worth of data every time a save goes
171
+ // wrong. So each backup sweeps the leftovers of the ones before it.
172
+ await sweepStaging(dataDir, createdAt);
173
+ const metaMigrationVersion = await readMetaMigrationVersion(opts.meta);
174
+ const sources = await discoverSources(opts.meta, opts.crypto);
175
+ // A scratch dir per run: `backup()` needs a real destination file, two backups
176
+ // must never collide over one, and a crash must leave its debris somewhere
177
+ // sweepable rather than in `backups/`.
178
+ const scratch = join(dataDir, BACKUPS_DIR, BACKUP_STAGING_DIR, `work-${randomBytes(8).toString('hex')}`);
179
+ await mkdir(scratch, { recursive: true });
180
+ try {
181
+ const files = {};
182
+ // meta.db first: it is the file whose loss is unrecoverable, so if the disk
183
+ // is going to be full, be full before the source snapshots waste minutes.
184
+ const metaSnapshot = join(scratch, 'meta.db');
185
+ await snapshotSqliteFile(opts.metaPath, metaSnapshot);
186
+ const metaBytes = await readFile(metaSnapshot);
187
+ files[BACKUP_META_PATH] = metaBytes;
188
+ const databases = [];
189
+ for (const source of sources.local) {
190
+ const dest = join(scratch, `${source.slug}.sqlite`);
191
+ await snapshotSqliteFile(source.path, dest);
192
+ const bytes = await readFile(dest);
193
+ const member = backupDatabasePath(source.slug);
194
+ files[member] = bytes;
195
+ databases.push({
196
+ kind: 'local',
197
+ slug: source.slug,
198
+ file: member,
199
+ bytes: bytes.byteLength,
200
+ sha256: sha256Hex(bytes),
201
+ connectionId: source.connectionId,
202
+ sourcePath: source.path,
203
+ });
204
+ }
205
+ for (const source of sources.external) {
206
+ databases.push({
207
+ kind: 'external',
208
+ slug: source.slug,
209
+ connectionId: source.connectionId,
210
+ engine: source.engine,
211
+ });
212
+ }
213
+ const manifest = {
214
+ formatVersion: BACKUP_FORMAT_VERSION,
215
+ appVersion: opts.appVersion ?? null,
216
+ serverVersion: APP_VERSION,
217
+ metaMigrationVersion,
218
+ createdAt,
219
+ meta: {
220
+ file: BACKUP_META_PATH,
221
+ bytes: metaBytes.byteLength,
222
+ sha256: sha256Hex(metaBytes),
223
+ },
224
+ databases,
225
+ };
226
+ if (opts.redactedConfig !== null && opts.redactedConfig !== undefined) {
227
+ files[BACKUP_CONFIG_PATH] = strToU8(`${JSON.stringify(opts.redactedConfig, null, 2)}\n`);
228
+ }
229
+ files[BACKUP_MANIFEST_PATH] = strToU8(`${JSON.stringify(manifest, null, 2)}\n`);
230
+ const zipped = zipSync(nest(files), { level: 6, mtime: new Date(createdAt) });
231
+ const path = opts.destination === 'auto'
232
+ ? join(dataDir, BACKUPS_DIR, backupFileName(createdAt))
233
+ : join(dataDir, BACKUPS_DIR, BACKUP_STAGING_DIR, `${randomBytes(8).toString('hex')}.zip`);
234
+ // Write beside the target and rename, for the same reason `saveConfig` does:
235
+ // a reader (the restore path, the CLI import) must never see a `.zip` that
236
+ // is still being written. Same directory ⇒ the rename is atomic.
237
+ await mkdir(dirname(path), { recursive: true });
238
+ const tmp = `${path}.part`;
239
+ await writeFile(tmp, zipped);
240
+ await rename(tmp, path);
241
+ return { path, bytes: zipped.byteLength, manifest };
242
+ }
243
+ finally {
244
+ await rm(scratch, { recursive: true, force: true }).catch(() => undefined);
245
+ }
246
+ }
247
+ /**
248
+ * How long a staged archive is allowed to sit unclaimed before a later backup
249
+ * removes it.
250
+ *
251
+ * Generous on purpose: the only thing between the server writing a staged
252
+ * archive and the main process moving it is one `rename`, so anything still
253
+ * there an hour later was abandoned. The window exists at all because a sweep
254
+ * that deleted by mtime alone could race a move that is genuinely in flight —
255
+ * on a slow cross-device copy to a USB stick, of a multi-gigabyte archive.
256
+ */
257
+ export const STAGING_TTL_MS = 60 * 60 * 1000;
258
+ /**
259
+ * Remove abandoned staging entries older than {@link STAGING_TTL_MS}.
260
+ *
261
+ * Best-effort throughout: this is housekeeping, and a backup must never fail
262
+ * because a leftover from last week could not be deleted. Confined to
263
+ * `<dataDir>/backups/.staging`, which only this module ever writes to — unlike
264
+ * `backups/` itself, it is not a folder users are shown, so age is a safe
265
+ * criterion here in a way it explicitly is not one directory up.
266
+ */
267
+ async function sweepStaging(dataDir, now) {
268
+ const dir = join(dataDir, BACKUPS_DIR, BACKUP_STAGING_DIR);
269
+ let entries;
270
+ try {
271
+ entries = await readdir(dir);
272
+ }
273
+ catch {
274
+ return;
275
+ }
276
+ for (const name of entries) {
277
+ const path = join(dir, name);
278
+ try {
279
+ const info = await stat(path);
280
+ if (now - info.mtimeMs < STAGING_TTL_MS)
281
+ continue;
282
+ await rm(path, { recursive: true, force: true });
283
+ }
284
+ catch {
285
+ // Locked, vanished under us, or a permission we do not have. The next
286
+ // backup tries again.
287
+ }
288
+ }
289
+ }
290
+ /** fflate takes a nested object; our member paths are flat `a/b` strings. */
291
+ function nest(files) {
292
+ const root = {};
293
+ for (const [path, bytes] of Object.entries(files)) {
294
+ const parts = path.split('/');
295
+ let cursor = root;
296
+ for (const part of parts.slice(0, -1)) {
297
+ cursor[part] ??= {};
298
+ cursor = cursor[part];
299
+ }
300
+ cursor[parts[parts.length - 1]] = bytes;
301
+ }
302
+ return root;
303
+ }
304
+ /**
305
+ * §9: keep the newest `keep` archives in `<dataDir>/backups/`, delete the rest.
306
+ *
307
+ * ─── The two rules that keep this from being a data-loss bug ─────────────────
308
+ *
309
+ * 1. It only ever considers files matching {@link BACKUP_FILE_PATTERN}. That
310
+ * directory is `showItemInFolder`-revealed (§9), so users WILL put things in
311
+ * it — a copy of a backup they renamed, a note. "Delete the oldest files in
312
+ * the folder" would eat them. This deletes archives this code wrote, and
313
+ * nothing else.
314
+ * 2. It sorts by NAME, not mtime. The names are UTC-stamped and
315
+ * lexicographically ordered by construction ({@link backupFileName}), whereas
316
+ * mtime is metadata that a file copy, an rsync, or a restore-from-Time-Machine
317
+ * rewrites — and a rotation that sorted on it after such an event would delete
318
+ * a real backup and keep an old one.
319
+ *
320
+ * Best-effort per file: a locked archive (Windows, an open zip viewer) must not
321
+ * fail the BACKUP that just succeeded. The next sweep gets it.
322
+ */
323
+ export async function rotateBackups(dataDir, keep, deps) {
324
+ const dir = join(resolve(dataDir), BACKUPS_DIR);
325
+ let names;
326
+ try {
327
+ names = await deps.readdir(dir);
328
+ }
329
+ catch {
330
+ return { kept: [], removed: [] };
331
+ }
332
+ const archives = names.filter((name) => BACKUP_FILE_PATTERN.test(name)).sort();
333
+ const cut = Math.max(0, archives.length - keep);
334
+ const doomed = archives.slice(0, cut);
335
+ const removed = [];
336
+ for (const name of doomed) {
337
+ try {
338
+ await deps.rm(join(dir, name));
339
+ removed.push(name);
340
+ }
341
+ catch {
342
+ // See above: a sweep that fails is a sweep, not a failed backup.
343
+ }
344
+ }
345
+ return { kept: archives.slice(cut), removed };
346
+ }
347
+ /** The real filesystem, for {@link rotateBackups}. */
348
+ export function rotateBackupsOnDisk(dataDir, keep) {
349
+ return rotateBackups(dataDir, keep, {
350
+ readdir: (dir) => readdir(dir),
351
+ rm: (path) => rm(path, { force: true }),
352
+ });
353
+ }
354
+ //# sourceMappingURL=backup-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup-service.js","sourceRoot":"","sources":["../../src/backup/backup-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * THE DESKTOP BACKUP FORMAT (11-electron.md §9), frozen at `formatVersion: 1`.
3
+ *
4
+ * ─────────────────────────────────────────────────────────────────────────────
5
+ * THIS FILE IS A WIRE CONTRACT, NOT AN IMPLEMENTATION DETAIL. A zip written by
6
+ * any build must be readable by any other, so the layout, the manifest shape and
7
+ * the slug grammar live in ONE module, imported by the writer
8
+ * (`backup-service.ts`), the reader (`apps/desktop/src/main/backup-archive.ts`,
9
+ * via a mirrored schema pinned to these types) and the tests. Changing anything
10
+ * here is a `formatVersion` bump, not an edit.
11
+ * ─────────────────────────────────────────────────────────────────────────────
12
+ *
13
+ * ─── THE M10 CLI DOES NOT READ THIS FORMAT. §9's INTEROP CLAIM IS UNBUILT ────
14
+ *
15
+ * §9 says the backup zip "doubles as the migration path to self-host/Cloud:
16
+ * `npx adminium` import accepts the same format". IT DOES NOT, and this header
17
+ * used to assert that it did. The truth, so nobody plans around the fiction:
18
+ *
19
+ * There are TWO unrelated archive formats that both independently call
20
+ * themselves `formatVersion: 1`.
21
+ *
22
+ * - THIS one (§9 backup): `manifest.json` at the archive ROOT, carrying
23
+ * `{ formatVersion, appVersion, serverVersion, metaMigrationVersion,
24
+ * createdAt, meta, databases }`, plus `meta.db` and `databases/*.sqlite` —
25
+ * a byte-level snapshot of a whole desktop install.
26
+ * - The M10 CONFIG BUNDLE (`export/bundle.ts`): `adminium-export/manifest.json`
27
+ * with a required, DISJOINT shape (`{ appVersion, configVersion, metaVersion,
28
+ * exportedAt, connectionId, secrets, counts }`), describing rows to upsert.
29
+ *
30
+ * `cli/commands/import-zip.ts` → `export/import-service.ts` reads only the
31
+ * second: `parseBundle` demands `adminium-export/manifest.json` and throws
32
+ * "it is not an Adminium configuration bundle" for anything else. A desktop user
33
+ * who follows §9's stated migration path is told their backup is not an Adminium
34
+ * file. Nothing outside the desktop reader and a parity test has ever imported
35
+ * {@link BACKUP_FORMAT_VERSION}.
36
+ *
37
+ * WHY IT IS NOT MERELY A MISSING `if`. The two formats are not dialects, they
38
+ * are different operations. The bundle import replays CONFIG ROWS into whatever
39
+ * meta store the target runs; this archive's `meta.db` is a SQLite FILE, and a
40
+ * self-host target's meta store is routinely Postgres or MySQL. Making the CLI
41
+ * "accept the same archive" therefore means reading a SQLite meta store and
42
+ * translating every table into another dialect — a cross-dialect meta migration,
43
+ * not a branch. That is a real feature with a real design, and no task in
44
+ * 11-T12 or M10 covers it.
45
+ *
46
+ * WHOEVER PICKS THIS UP: sniffing a root `manifest.json` in `parseBundle` is the
47
+ * entry point, and the version gate below is ready for it. Until then, the
48
+ * desktop restore (`main/backup.ts`) is the only reader of this format, and
49
+ * anything telling a user otherwise — docs, dialog copy, this comment — is
50
+ * making a promise the code does not keep.
51
+ *
52
+ * The archive (§9, verbatim):
53
+ *
54
+ * ```
55
+ * adminium-backup-20260712-1430.zip
56
+ * manifest.json { formatVersion, appVersion, serverVersion,
57
+ * metaMigrationVersion, createdAt, databases: [...] }
58
+ * meta.db meta-store snapshot
59
+ * config.json desktop config, secrets REDACTED
60
+ * databases/<slug>.sqlite every LOCAL source DB
61
+ * ```
62
+ *
63
+ * ─── Two places this completes §9 rather than quoting it ─────────────────────
64
+ *
65
+ * 1. **`databases[]` is a discriminated union.** §9's example row is
66
+ * `{ slug, file, bytes, sha256 }`, and its prose says remote PG/MySQL "are
67
+ * listed in manifest.json as 'external', never dumped". A row that is not
68
+ * dumped has no `file`, no `bytes` and no `sha256` to carry, so the two cases
69
+ * cannot be one shape. {@link BackupDatabaseEntry} is therefore
70
+ * `kind: 'local' | 'external'`; the local arm is §9's four fields exactly,
71
+ * plus the provenance (`connectionId`, `sourcePath`) a restore needs to
72
+ * explain itself. Reading the union back as §9's example means: take the
73
+ * local arm.
74
+ * 2. **`meta` carries its own checksum.** §9 lists `meta.db` as an archive
75
+ * member and puts checksums only on `databases[]`. That asymmetry cannot be
76
+ * right: a restore validates checksums *before* it moves the live data aside
77
+ * (§9's flow), and meta.db is the file whose corruption is unrecoverable —
78
+ * it holds every connection, page and user. A backup whose source DBs verify
79
+ * and whose meta.db is truncated would pass validation and then destroy the
80
+ * install. Since `formatVersion: 1` is being frozen by this task rather than
81
+ * inherited, the hole is closed now instead of being shipped and versioned
82
+ * around.
83
+ *
84
+ * NOTHING ELSE IS ADDED. In particular there is no `secrets` block: `config.json`
85
+ * travels redacted, unconditionally, and a manifest field describing a policy
86
+ * with one possible value would only invite a second value later.
87
+ */
88
+ import { z } from 'zod';
89
+ /**
90
+ * FROZEN (§9: "format frozen here as `formatVersion: 1`").
91
+ *
92
+ * READ BY: the desktop restore's `validateArchive`, which refuses a higher
93
+ * number rather than parsing leniently — the same rule `config.ts`'s version
94
+ * gate and the M10 bundle's already obey.
95
+ *
96
+ * NOT read by the M10 CLI, whatever §9 says — see the module header. This
97
+ * doc-comment used to claim it was; the claim was never true and the number is
98
+ * the same either way, which is exactly why nobody noticed.
99
+ */
100
+ export declare const BACKUP_FORMAT_VERSION = 1;
101
+ /** Archive member paths. The reader allow-lists against these — see below. */
102
+ export declare const BACKUP_MANIFEST_PATH = "manifest.json";
103
+ export declare const BACKUP_META_PATH = "meta.db";
104
+ export declare const BACKUP_CONFIG_PATH = "config.json";
105
+ export declare const BACKUP_DATABASES_DIR = "databases";
106
+ /** `databases/<slug>.sqlite` — the ONLY shape a source-DB member may have. */
107
+ export declare function backupDatabasePath(slug: string): string;
108
+ /**
109
+ * The slug grammar, and the reason it is this narrow.
110
+ *
111
+ * A slug is interpolated into an archive member path and then, on restore, into
112
+ * a filesystem path under `<dataDir>/databases/`. That makes it the one value in
113
+ * this format that can escape its directory: `../../config.json` is a perfectly
114
+ * good zip entry name, and an unpacker that trusted it would overwrite the
115
+ * desktop config — with the master secret in it — from inside an archive a user
116
+ * double-clicked. Lowercase alnum + `-` + `_` cannot express a separator, a
117
+ * drive letter, a dot segment, or a NUL, so the traversal is not defended
118
+ * against, it is unrepresentable.
119
+ *
120
+ * The reader re-validates every slug it reads (it must: the archive is untrusted
121
+ * input, and the writer's guarantees are the writer's), which is why this regex
122
+ * is exported rather than inlined at the point of use.
123
+ */
124
+ export declare const BACKUP_SLUG_PATTERN: RegExp;
125
+ export declare const backupSlugSchema: z.ZodString;
126
+ /** SHA-256, lowercase hex — the digest every checksum field carries. */
127
+ export declare const sha256Schema: z.ZodString;
128
+ export declare function sha256Hex(bytes: Uint8Array): string;
129
+ /**
130
+ * A LOCAL source database: dumped, checksummed, restorable.
131
+ *
132
+ * `sourcePath` is provenance, not an instruction. It records where the file was
133
+ * when the backup ran; the restore does NOT write to it. See
134
+ * `apps/desktop/src/main/backup-archive.ts` for why an unpacker that honoured an
135
+ * absolute path out of an archive would be a remote-file-write primitive.
136
+ *
137
+ * It is READ, though — by `assertRestorablePaths`, which refuses any archive
138
+ * whose `sourcePath` is not already `<dataDir>/databases/<slug>.sqlite` on the
139
+ * target. That check is the whole reason this field is load-bearing rather than
140
+ * decorative: the unpack writes to the slug-derived path and `meta.db` is
141
+ * restored byte-for-byte, so a `sourcePath` that disagrees means the restored
142
+ * DSN would point somewhere the bytes are not — and the slug might belong to a
143
+ * different connection entirely. Provenance is exactly what is needed to notice
144
+ * that, and refusing is exactly what may be done with it.
145
+ */
146
+ export declare const backupLocalDatabaseSchema: z.ZodObject<{
147
+ kind: z.ZodLiteral<"local">;
148
+ slug: z.ZodString;
149
+ file: z.ZodString;
150
+ bytes: z.ZodNumber;
151
+ sha256: z.ZodString;
152
+ connectionId: z.ZodString;
153
+ sourcePath: z.ZodString;
154
+ }, z.core.$strict>;
155
+ /**
156
+ * A REMOTE source database (§9: "remote PG/MySQL are listed in manifest.json as
157
+ * 'external', never dumped").
158
+ *
159
+ * Listed rather than omitted, because the difference between "this instance had
160
+ * no Postgres" and "this instance had a Postgres we did not dump" is the whole
161
+ * question a person asks when a restore comes up short. No DSN, not even
162
+ * encrypted: the DSN is in meta.db, and a manifest is the one file in the
163
+ * archive that is read before anything is trusted.
164
+ */
165
+ export declare const backupExternalDatabaseSchema: z.ZodObject<{
166
+ kind: z.ZodLiteral<"external">;
167
+ slug: z.ZodString;
168
+ connectionId: z.ZodString;
169
+ engine: z.ZodString;
170
+ }, z.core.$strict>;
171
+ export declare const backupDatabaseEntrySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
172
+ kind: z.ZodLiteral<"local">;
173
+ slug: z.ZodString;
174
+ file: z.ZodString;
175
+ bytes: z.ZodNumber;
176
+ sha256: z.ZodString;
177
+ connectionId: z.ZodString;
178
+ sourcePath: z.ZodString;
179
+ }, z.core.$strict>, z.ZodObject<{
180
+ kind: z.ZodLiteral<"external">;
181
+ slug: z.ZodString;
182
+ connectionId: z.ZodString;
183
+ engine: z.ZodString;
184
+ }, z.core.$strict>], "kind">;
185
+ export type BackupLocalDatabase = z.infer<typeof backupLocalDatabaseSchema>;
186
+ export type BackupExternalDatabase = z.infer<typeof backupExternalDatabaseSchema>;
187
+ export type BackupDatabaseEntry = z.infer<typeof backupDatabaseEntrySchema>;
188
+ /** `meta.db`'s own entry — see point 2 in the module header. */
189
+ export declare const backupMetaEntrySchema: z.ZodObject<{
190
+ file: z.ZodLiteral<"meta.db">;
191
+ bytes: z.ZodNumber;
192
+ sha256: z.ZodString;
193
+ }, z.core.$strict>;
194
+ export type BackupMetaEntry = z.infer<typeof backupMetaEntrySchema>;
195
+ /**
196
+ * `manifest.json` (§9).
197
+ *
198
+ * `strictObject`, like `config.json`'s schema and for the same reason: an
199
+ * unknown key is a hand-edit or a typo, and a genuinely newer archive is caught
200
+ * one field earlier by {@link BACKUP_FORMAT_VERSION}, with a message the user
201
+ * can act on.
202
+ */
203
+ export declare const backupManifestSchema: z.ZodObject<{
204
+ formatVersion: z.ZodNumber;
205
+ appVersion: z.ZodNullable<z.ZodString>;
206
+ serverVersion: z.ZodString;
207
+ metaMigrationVersion: z.ZodString;
208
+ createdAt: z.ZodNumber;
209
+ meta: z.ZodObject<{
210
+ file: z.ZodLiteral<"meta.db">;
211
+ bytes: z.ZodNumber;
212
+ sha256: z.ZodString;
213
+ }, z.core.$strict>;
214
+ databases: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
215
+ kind: z.ZodLiteral<"local">;
216
+ slug: z.ZodString;
217
+ file: z.ZodString;
218
+ bytes: z.ZodNumber;
219
+ sha256: z.ZodString;
220
+ connectionId: z.ZodString;
221
+ sourcePath: z.ZodString;
222
+ }, z.core.$strict>, z.ZodObject<{
223
+ kind: z.ZodLiteral<"external">;
224
+ slug: z.ZodString;
225
+ connectionId: z.ZodString;
226
+ engine: z.ZodString;
227
+ }, z.core.$strict>], "kind">>;
228
+ }, z.core.$strict>;
229
+ export type BackupManifest = z.infer<typeof backupManifestSchema>;
230
+ /**
231
+ * §9: "the migration runner fast-forwards an older backup; a backup whose
232
+ * `metaMigrationVersion` is **newer** than the app is refused".
233
+ *
234
+ * LEXICOGRAPHIC, and that is a property of the names rather than a hope about
235
+ * them: `@adminium/meta`'s ledger names every migration `NNNN_slug` with a
236
+ * zero-padded, append-only ordinal (`0001_core_auth` … `0009_views_kind`), so
237
+ * string order IS apply order for as long as the counter has four digits — about
238
+ * 9,990 migrations from now. That matters because the comparison has to work in
239
+ * the Electron MAIN process, which may not import `@adminium/meta` (§1
240
+ * principle 2 / `.dependency-cruiser.cjs` `desktop-shell-only`) and therefore
241
+ * cannot look a name up in `ALL_MIGRATIONS`. Two strings and `<` it can do.
242
+ *
243
+ * `same` and `older` are both restorable; only `newer` is refused. `older` is
244
+ * not merely tolerated but EXPECTED — it is what restoring last month's backup
245
+ * into this month's build is — and the meta migrator fast-forwards it at the
246
+ * next boot with no special casing anywhere.
247
+ */
248
+ export type BackupVersionOrder = 'older' | 'same' | 'newer';
249
+ export declare function compareMetaMigrationVersion(backupVersion: string, appVersion: string): BackupVersionOrder;
250
+ /** §9's `adminium-backup-20260712-1430.zip`. */
251
+ export declare const BACKUP_FILE_PREFIX = "adminium-backup-";
252
+ export declare const BACKUP_FILE_EXTENSION = ".zip";
253
+ /**
254
+ * Matches {@link backupFileName}'s output. The rotation sweep uses it as an
255
+ * allow-list rather than deleting whatever is in `<dataDir>/backups/`: that
256
+ * directory is `showItemInFolder`-revealed (§9) and users put things in folders
257
+ * they can see. Rotation deletes files THIS code wrote and nothing else.
258
+ */
259
+ export declare const BACKUP_FILE_PATTERN: RegExp;
260
+ /**
261
+ * `adminium-backup-YYYYMMDD-HHMMSS.zip`, in UTC.
262
+ *
263
+ * §9's example shows minutes (`…-1430.zip`); seconds are here because rotation
264
+ * sorts by NAME (the only ordering that survives a file copy, an rsync, or a
265
+ * restored-from-Time-Machine backups folder — mtime does not), and two backups
266
+ * in one minute would then be indistinguishable and unorderable. UTC for the
267
+ * same reason: a local-time name goes backwards for an hour every autumn, and a
268
+ * rotation that sorts names would delete the wrong one.
269
+ */
270
+ export declare function backupFileName(createdAt: number): string;
271
+ /** `<dataDir>/pre-restore-<ts>` (§9). The folder a restore never deletes. */
272
+ export declare const PRE_RESTORE_PREFIX = "pre-restore-";
273
+ export declare function preRestoreDirName(at: number): string;
274
+ /**
275
+ * A slug for a local database file, derived from its BASENAME.
276
+ *
277
+ * The basename, not the connection name, because on desktop they are the same
278
+ * thing by construction: §6 step 2 creates `<dataDir>/databases/<slug>.sqlite`
279
+ * from the name the user typed, so the file already carries the slug the user
280
+ * chose and round-tripping through it keeps `databases/orders.sqlite` in the
281
+ * archive named `orders`. Deriving from `connection.name` instead would rename
282
+ * everything the moment somebody edited a label, and "Open an existing SQLite
283
+ * file" (§6 step 2, opened in place) has a real filename and a name the user
284
+ * never picked.
285
+ *
286
+ * Falls back to the connection id for a basename that survives none of the
287
+ * grammar — a file called `数据.sqlite` is legitimate and must not fail a backup.
288
+ */
289
+ export declare function deriveDatabaseSlug(filePath: string, connectionId: string): string;
290
+ /**
291
+ * Make `slug` unique against `taken`, appending `-2`, `-3`, …
292
+ *
293
+ * Needed because slugs come from basenames and basenames are only unique within
294
+ * a directory: "Open an existing SQLite file" can register
295
+ * `~/work/app.sqlite` and `~/archive/app.sqlite` as two connections, and two
296
+ * archive members called `databases/app.sqlite` means the second silently
297
+ * replaces the first — a backup that looks complete and has lost a database.
298
+ */
299
+ export declare function uniqueSlug(slug: string, taken: ReadonlySet<string>): string;
300
+ //# sourceMappingURL=format.d.ts.map