@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.
- package/LICENSE +661 -0
- package/README.md +94 -0
- package/dashboard/assets/DeltaPill-dxlsGh-1.js +2 -0
- package/dashboard/assets/DeltaPill-dxlsGh-1.js.map +1 -0
- package/dashboard/assets/DistributionCorrelationWidgets-ztVy_W_R.js +2 -0
- package/dashboard/assets/DistributionCorrelationWidgets-ztVy_W_R.js.map +1 -0
- package/dashboard/assets/PartWholeWidgets-BDn0i0jt.js +2 -0
- package/dashboard/assets/PartWholeWidgets-BDn0i0jt.js.map +1 -0
- package/dashboard/assets/RemapEditor-z3vRY12e.js +2 -0
- package/dashboard/assets/RemapEditor-z3vRY12e.js.map +1 -0
- package/dashboard/assets/ReviewScreen-COkLQ3T7.js +2 -0
- package/dashboard/assets/ReviewScreen-COkLQ3T7.js.map +1 -0
- package/dashboard/assets/Sparkline-Cvwo368J.js +2 -0
- package/dashboard/assets/Sparkline-Cvwo368J.js.map +1 -0
- package/dashboard/assets/WidgetMissingCard-D0bPJKIs.js +2 -0
- package/dashboard/assets/WidgetMissingCard-D0bPJKIs.js.map +1 -0
- package/dashboard/assets/arc-CPxb74pf.js +2 -0
- package/dashboard/assets/arc-CPxb74pf.js.map +1 -0
- package/dashboard/assets/bars-ranking-components-9Asn_0gR.js +2 -0
- package/dashboard/assets/bars-ranking-components-9Asn_0gR.js.map +1 -0
- package/dashboard/assets/blocks-track-components-BST-NjK2.js +2 -0
- package/dashboard/assets/blocks-track-components-BST-NjK2.js.map +1 -0
- package/dashboard/assets/calendar-track-components-RgNtGtZR.js +2 -0
- package/dashboard/assets/calendar-track-components-RgNtGtZR.js.map +1 -0
- package/dashboard/assets/chrome-track-components-ClNsentC.js +2 -0
- package/dashboard/assets/chrome-track-components-ClNsentC.js.map +1 -0
- package/dashboard/assets/common-BY1j__bD.js +2 -0
- package/dashboard/assets/common-BY1j__bD.js.map +1 -0
- package/dashboard/assets/common-BdlXKpcB.js +2 -0
- package/dashboard/assets/common-BdlXKpcB.js.map +1 -0
- package/dashboard/assets/common-BqqhgMgB.js +2 -0
- package/dashboard/assets/common-BqqhgMgB.js.map +1 -0
- package/dashboard/assets/common-BribWmIo.js +2 -0
- package/dashboard/assets/common-BribWmIo.js.map +1 -0
- package/dashboard/assets/common-Cmf0_lKV.js +2 -0
- package/dashboard/assets/common-Cmf0_lKV.js.map +1 -0
- package/dashboard/assets/common-i0r48qY9.js +2 -0
- package/dashboard/assets/common-i0r48qY9.js.map +1 -0
- package/dashboard/assets/common-x8cfkwpc.js +2 -0
- package/dashboard/assets/common-x8cfkwpc.js.map +1 -0
- package/dashboard/assets/communication-track-components-CNLZXOH_.js +2 -0
- package/dashboard/assets/communication-track-components-CNLZXOH_.js.map +1 -0
- package/dashboard/assets/components-Bp5cFm2d.js +2 -0
- package/dashboard/assets/components-Bp5cFm2d.js.map +1 -0
- package/dashboard/assets/components-C4-O3_gD.js +2 -0
- package/dashboard/assets/components-C4-O3_gD.js.map +1 -0
- package/dashboard/assets/domain-ops-track-components-BPa41AU7.js +2 -0
- package/dashboard/assets/domain-ops-track-components-BPa41AU7.js.map +1 -0
- package/dashboard/assets/domain-track-components-CQ1i1X1t.js +2 -0
- package/dashboard/assets/domain-track-components-CQ1i1X1t.js.map +1 -0
- package/dashboard/assets/errors-BHUWiAQ3.js +2 -0
- package/dashboard/assets/errors-BHUWiAQ3.js.map +1 -0
- package/dashboard/assets/errors-BbyKweDG.js +2 -0
- package/dashboard/assets/errors-BbyKweDG.js.map +1 -0
- package/dashboard/assets/errors-CMQ6JC31.js +2 -0
- package/dashboard/assets/errors-CMQ6JC31.js.map +1 -0
- package/dashboard/assets/errors-D3nVgTmf.js +2 -0
- package/dashboard/assets/errors-D3nVgTmf.js.map +1 -0
- package/dashboard/assets/errors-IqJSoANC.js +2 -0
- package/dashboard/assets/errors-IqJSoANC.js.map +1 -0
- package/dashboard/assets/errors-gmIkO9F6.js +2 -0
- package/dashboard/assets/errors-gmIkO9F6.js.map +1 -0
- package/dashboard/assets/errors-vFk058Vh.js +2 -0
- package/dashboard/assets/errors-vFk058Vh.js.map +1 -0
- package/dashboard/assets/feeds-track-f-components-Cl_8SkGs.js +2 -0
- package/dashboard/assets/feeds-track-f-components-Cl_8SkGs.js.map +1 -0
- package/dashboard/assets/format-Lx4cQ8k-.js +2 -0
- package/dashboard/assets/format-Lx4cQ8k-.js.map +1 -0
- package/dashboard/assets/forms-track-components-Bc2Hoxdh.js +2 -0
- package/dashboard/assets/forms-track-components-Bc2Hoxdh.js.map +1 -0
- package/dashboard/assets/generated-1EfWhCMA.js +2 -0
- package/dashboard/assets/generated-1EfWhCMA.js.map +1 -0
- package/dashboard/assets/generated-BB3ZMxvx.js +2 -0
- package/dashboard/assets/generated-BB3ZMxvx.js.map +1 -0
- package/dashboard/assets/generated-C0JVNBRX.js +2 -0
- package/dashboard/assets/generated-C0JVNBRX.js.map +1 -0
- package/dashboard/assets/generated-C1W48_-3.js +2 -0
- package/dashboard/assets/generated-C1W48_-3.js.map +1 -0
- package/dashboard/assets/generated-CluiB_xY.js +2 -0
- package/dashboard/assets/generated-CluiB_xY.js.map +1 -0
- package/dashboard/assets/generated-DDGtlf-4.js +2 -0
- package/dashboard/assets/generated-DDGtlf-4.js.map +1 -0
- package/dashboard/assets/generated-DPCHvNto.js +2 -0
- package/dashboard/assets/generated-DPCHvNto.js.map +1 -0
- package/dashboard/assets/geo-track-components-Ct4-MSRw.js +3 -0
- package/dashboard/assets/geo-track-components-Ct4-MSRw.js.map +1 -0
- package/dashboard/assets/ibm-plex-sans-arabic-arabic-400-normal-CyU-ddYS.woff2 +0 -0
- package/dashboard/assets/ibm-plex-sans-arabic-arabic-500-normal-C4MQITzh.woff2 +0 -0
- package/dashboard/assets/ibm-plex-sans-arabic-arabic-600-normal-0pRdybE_.woff2 +0 -0
- package/dashboard/assets/ibm-plex-sans-arabic-arabic-700-normal-DrtBj6UE.woff2 +0 -0
- package/dashboard/assets/index-DPi4cduu.css +1 -0
- package/dashboard/assets/index-PB1II0WV.js +137 -0
- package/dashboard/assets/index-PB1II0WV.js.map +1 -0
- package/dashboard/assets/jetbrains-mono-latin-ext-wght-italic-BrDczivE.woff2 +0 -0
- package/dashboard/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dashboard/assets/jetbrains-mono-latin-wght-italic-B2M6KQje.woff2 +0 -0
- package/dashboard/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dashboard/assets/leaflet-CIGW-MKW.css +1 -0
- package/dashboard/assets/leaflet-src-D12shr04.js +2 -0
- package/dashboard/assets/leaflet-src-D12shr04.js.map +1 -0
- package/dashboard/assets/manrope-latin-ext-wght-normal-Ch3YOpNY.woff2 +0 -0
- package/dashboard/assets/manrope-latin-wght-normal-DHIcAJRg.woff2 +0 -0
- package/dashboard/assets/media-track-components-CpeII-tT.js +2 -0
- package/dashboard/assets/media-track-components-CpeII-tT.js.map +1 -0
- package/dashboard/assets/scales-e0tkfEy1.js +2 -0
- package/dashboard/assets/scales-e0tkfEy1.js.map +1 -0
- package/dashboard/assets/sparkline-2JUGDrMW.js +2 -0
- package/dashboard/assets/sparkline-2JUGDrMW.js.map +1 -0
- package/dashboard/assets/stats-BNgXz5BD.js +2 -0
- package/dashboard/assets/stats-BNgXz5BD.js.map +1 -0
- package/dashboard/assets/studio-B7hMOwAF.js +2 -0
- package/dashboard/assets/studio-B7hMOwAF.js.map +1 -0
- package/dashboard/assets/studio-BN_9xHY3.js +2 -0
- package/dashboard/assets/studio-BN_9xHY3.js.map +1 -0
- package/dashboard/assets/studio-Cn2MObe8.js +2 -0
- package/dashboard/assets/studio-Cn2MObe8.js.map +1 -0
- package/dashboard/assets/studio-DZEZCCkw.js +2 -0
- package/dashboard/assets/studio-DZEZCCkw.js.map +1 -0
- package/dashboard/assets/studio-DzatTvLl.js +2 -0
- package/dashboard/assets/studio-DzatTvLl.js.map +1 -0
- package/dashboard/assets/studio-cBlD8x90.js +2 -0
- package/dashboard/assets/studio-cBlD8x90.js.map +1 -0
- package/dashboard/assets/studio-cglZPbJK.js +2 -0
- package/dashboard/assets/studio-cglZPbJK.js.map +1 -0
- package/dashboard/assets/system-track-components-GTYYpnfB.js +2 -0
- package/dashboard/assets/system-track-components-GTYYpnfB.js.map +1 -0
- package/dashboard/assets/tables-tail-components-DiA5GeHB.js +2 -0
- package/dashboard/assets/tables-tail-components-DiA5GeHB.js.map +1 -0
- package/dashboard/assets/tables-track-f-components-CVNPd7rq.js +2 -0
- package/dashboard/assets/tables-track-f-components-CVNPd7rq.js.map +1 -0
- package/dashboard/assets/time-flow-components-nKsaryry.js +2 -0
- package/dashboard/assets/time-flow-components-nKsaryry.js.map +1 -0
- package/dashboard/assets/ui-B-kZetor.js +2 -0
- package/dashboard/assets/ui-B-kZetor.js.map +1 -0
- package/dashboard/assets/ui-BEStJ5Pw.js +2 -0
- package/dashboard/assets/ui-BEStJ5Pw.js.map +1 -0
- package/dashboard/assets/ui-BS5_eDN4.js +2 -0
- package/dashboard/assets/ui-BS5_eDN4.js.map +1 -0
- package/dashboard/assets/ui-BZ0EyxRH.js +2 -0
- package/dashboard/assets/ui-BZ0EyxRH.js.map +1 -0
- package/dashboard/assets/ui-BloJDdt6.js +2 -0
- package/dashboard/assets/ui-BloJDdt6.js.map +1 -0
- package/dashboard/assets/ui-CpdrplJH.js +2 -0
- package/dashboard/assets/ui-CpdrplJH.js.map +1 -0
- package/dashboard/assets/ui-YJfT644k.js +2 -0
- package/dashboard/assets/ui-YJfT644k.js.map +1 -0
- package/dashboard/assets/widgets-uDqZWw4A.js +2 -0
- package/dashboard/assets/widgets-uDqZWw4A.js.map +1 -0
- package/dashboard/index.html +41 -0
- package/dist/app.d.ts +48 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +250 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/audit.d.ts +22 -0
- package/dist/auth/audit.d.ts.map +1 -0
- package/dist/auth/audit.js +17 -0
- package/dist/auth/audit.js.map +1 -0
- package/dist/auth/desktop-session.d.ts +53 -0
- package/dist/auth/desktop-session.d.ts.map +1 -0
- package/dist/auth/desktop-session.js +111 -0
- package/dist/auth/desktop-session.js.map +1 -0
- package/dist/auth/passwords.d.ts +17 -0
- package/dist/auth/passwords.d.ts.map +1 -0
- package/dist/auth/passwords.js +40 -0
- package/dist/auth/passwords.js.map +1 -0
- package/dist/auth/sessions.d.ts +77 -0
- package/dist/auth/sessions.d.ts.map +1 -0
- package/dist/auth/sessions.js +137 -0
- package/dist/auth/sessions.js.map +1 -0
- package/dist/auth/totp.d.ts +30 -0
- package/dist/auth/totp.d.ts.map +1 -0
- package/dist/auth/totp.js +97 -0
- package/dist/auth/totp.js.map +1 -0
- package/dist/backup/backup-service.d.ts +157 -0
- package/dist/backup/backup-service.d.ts.map +1 -0
- package/dist/backup/backup-service.js +354 -0
- package/dist/backup/backup-service.js.map +1 -0
- package/dist/backup/format.d.ts +300 -0
- package/dist/backup/format.d.ts.map +1 -0
- package/dist/backup/format.js +304 -0
- package/dist/backup/format.js.map +1 -0
- package/dist/backup/notify.d.ts +55 -0
- package/dist/backup/notify.d.ts.map +1 -0
- package/dist/backup/notify.js +60 -0
- package/dist/backup/notify.js.map +1 -0
- package/dist/backup/snapshot.d.ts +78 -0
- package/dist/backup/snapshot.d.ts.map +1 -0
- package/dist/backup/snapshot.js +142 -0
- package/dist/backup/snapshot.js.map +1 -0
- package/dist/capabilities/catalog.d.ts +33 -0
- package/dist/capabilities/catalog.d.ts.map +1 -0
- package/dist/capabilities/catalog.js +32 -0
- package/dist/capabilities/catalog.js.map +1 -0
- package/dist/capabilities/grants.d.ts +44 -0
- package/dist/capabilities/grants.d.ts.map +1 -0
- package/dist/capabilities/grants.js +65 -0
- package/dist/capabilities/grants.js.map +1 -0
- package/dist/cli/allowlist.d.ts +46 -0
- package/dist/cli/allowlist.d.ts.map +1 -0
- package/dist/cli/allowlist.js +99 -0
- package/dist/cli/allowlist.js.map +1 -0
- package/dist/cli/args.d.ts +63 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +92 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/command.d.ts +32 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +64 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/apply-llm-response.d.ts +32 -0
- package/dist/cli/commands/apply-llm-response.d.ts.map +1 -0
- package/dist/cli/commands/apply-llm-response.js +209 -0
- package/dist/cli/commands/apply-llm-response.js.map +1 -0
- package/dist/cli/commands/export-zip.d.ts +17 -0
- package/dist/cli/commands/export-zip.d.ts.map +1 -0
- package/dist/cli/commands/export-zip.js +111 -0
- package/dist/cli/commands/export-zip.js.map +1 -0
- package/dist/cli/commands/generate-prompt.d.ts +29 -0
- package/dist/cli/commands/generate-prompt.d.ts.map +1 -0
- package/dist/cli/commands/generate-prompt.js +154 -0
- package/dist/cli/commands/generate-prompt.js.map +1 -0
- package/dist/cli/commands/import-zip.d.ts +13 -0
- package/dist/cli/commands/import-zip.d.ts.map +1 -0
- package/dist/cli/commands/import-zip.js +95 -0
- package/dist/cli/commands/import-zip.js.map +1 -0
- package/dist/cli/commands/init.d.ts +47 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +372 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/introspect.d.ts +11 -0
- package/dist/cli/commands/introspect.d.ts.map +1 -0
- package/dist/cli/commands/introspect.js +100 -0
- package/dist/cli/commands/introspect.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +11 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +80 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/start.d.ts +22 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +101 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/exit.d.ts +37 -0
- package/dist/cli/exit.d.ts.map +1 -0
- package/dist/cli/exit.js +39 -0
- package/dist/cli/exit.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/io.d.ts +49 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +77 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/run.d.ts +35 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +139 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/runtime.d.ts +116 -0
- package/dist/cli/runtime.d.ts.map +1 -0
- package/dist/cli/runtime.js +181 -0
- package/dist/cli/runtime.js.map +1 -0
- package/dist/cli/static-root.d.ts +42 -0
- package/dist/cli/static-root.d.ts.map +1 -0
- package/dist/cli/static-root.js +58 -0
- package/dist/cli/static-root.js.map +1 -0
- package/dist/compose.d.ts +135 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +383 -0
- package/dist/compose.js.map +1 -0
- package/dist/config/bootstrap.d.ts +33 -0
- package/dist/config/bootstrap.d.ts.map +1 -0
- package/dist/config/bootstrap.js +81 -0
- package/dist/config/bootstrap.js.map +1 -0
- package/dist/config/env.d.ts +95 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +236 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/secrets.d.ts +24 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +74 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/connections/crypto.d.ts +9 -0
- package/dist/connections/crypto.d.ts.map +1 -0
- package/dist/connections/crypto.js +16 -0
- package/dist/connections/crypto.js.map +1 -0
- package/dist/connections/dsn.d.ts +42 -0
- package/dist/connections/dsn.d.ts.map +1 -0
- package/dist/connections/dsn.js +131 -0
- package/dist/connections/dsn.js.map +1 -0
- package/dist/connections/effective-schema.d.ts +65 -0
- package/dist/connections/effective-schema.d.ts.map +1 -0
- package/dist/connections/effective-schema.js +249 -0
- package/dist/connections/effective-schema.js.map +1 -0
- package/dist/connections/introspect.d.ts +52 -0
- package/dist/connections/introspect.d.ts.map +1 -0
- package/dist/connections/introspect.js +111 -0
- package/dist/connections/introspect.js.map +1 -0
- package/dist/connections/manager.d.ts +97 -0
- package/dist/connections/manager.d.ts.map +1 -0
- package/dist/connections/manager.js +224 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/register-adapters.d.ts +42 -0
- package/dist/connections/register-adapters.d.ts.map +1 -0
- package/dist/connections/register-adapters.js +92 -0
- package/dist/connections/register-adapters.js.map +1 -0
- package/dist/crud/filters.d.ts +57 -0
- package/dist/crud/filters.d.ts.map +1 -0
- package/dist/crud/filters.js +177 -0
- package/dist/crud/filters.js.map +1 -0
- package/dist/crud/identifiers.d.ts +58 -0
- package/dist/crud/identifiers.d.ts.map +1 -0
- package/dist/crud/identifiers.js +99 -0
- package/dist/crud/identifiers.js.map +1 -0
- package/dist/crud/list.d.ts +51 -0
- package/dist/crud/list.d.ts.map +1 -0
- package/dist/crud/list.js +126 -0
- package/dist/crud/list.js.map +1 -0
- package/dist/crud/mask.d.ts +23 -0
- package/dist/crud/mask.d.ts.map +1 -0
- package/dist/crud/mask.js +41 -0
- package/dist/crud/mask.js.map +1 -0
- package/dist/crud/records.d.ts +33 -0
- package/dist/crud/records.d.ts.map +1 -0
- package/dist/crud/records.js +126 -0
- package/dist/crud/records.js.map +1 -0
- package/dist/crud/undo.d.ts +55 -0
- package/dist/crud/undo.d.ts.map +1 -0
- package/dist/crud/undo.js +74 -0
- package/dist/crud/undo.js.map +1 -0
- package/dist/data-io/coerce.d.ts +28 -0
- package/dist/data-io/coerce.d.ts.map +1 -0
- package/dist/data-io/coerce.js +123 -0
- package/dist/data-io/coerce.js.map +1 -0
- package/dist/data-io/csv.d.ts +38 -0
- package/dist/data-io/csv.d.ts.map +1 -0
- package/dist/data-io/csv.js +138 -0
- package/dist/data-io/csv.js.map +1 -0
- package/dist/data-io/snapshot-view.d.ts +10 -0
- package/dist/data-io/snapshot-view.d.ts.map +1 -0
- package/dist/data-io/snapshot-view.js +19 -0
- package/dist/data-io/snapshot-view.js.map +1 -0
- package/dist/desktop/demo-seed.d.ts +23 -0
- package/dist/desktop/demo-seed.d.ts.map +1 -0
- package/dist/desktop/demo-seed.js +28 -0
- package/dist/desktop/demo-seed.js.map +1 -0
- package/dist/desktop/lan-share.d.ts +94 -0
- package/dist/desktop/lan-share.d.ts.map +1 -0
- package/dist/desktop/lan-share.js +150 -0
- package/dist/desktop/lan-share.js.map +1 -0
- package/dist/errors.d.ts +72 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +82 -0
- package/dist/errors.js.map +1 -0
- package/dist/export/bundle.d.ts +235 -0
- package/dist/export/bundle.d.ts.map +1 -0
- package/dist/export/bundle.js +172 -0
- package/dist/export/bundle.js.map +1 -0
- package/dist/export/import-service.d.ts +99 -0
- package/dist/export/import-service.d.ts.map +1 -0
- package/dist/export/import-service.js +515 -0
- package/dist/export/import-service.js.map +1 -0
- package/dist/export/readme.d.ts +25 -0
- package/dist/export/readme.d.ts.map +1 -0
- package/dist/export/readme.js +154 -0
- package/dist/export/readme.js.map +1 -0
- package/dist/export/redaction.d.ts +118 -0
- package/dist/export/redaction.d.ts.map +1 -0
- package/dist/export/redaction.js +233 -0
- package/dist/export/redaction.js.map +1 -0
- package/dist/export/zip-service.d.ts +66 -0
- package/dist/export/zip-service.d.ts.map +1 -0
- package/dist/export/zip-service.js +306 -0
- package/dist/export/zip-service.js.map +1 -0
- package/dist/files/storage.d.ts +50 -0
- package/dist/files/storage.d.ts.map +1 -0
- package/dist/files/storage.js +100 -0
- package/dist/files/storage.js.map +1 -0
- package/dist/generate/materialize-llm.d.ts +45 -0
- package/dist/generate/materialize-llm.d.ts.map +1 -0
- package/dist/generate/materialize-llm.js +167 -0
- package/dist/generate/materialize-llm.js.map +1 -0
- package/dist/generate/run.d.ts +48 -0
- package/dist/generate/run.d.ts.map +1 -0
- package/dist/generate/run.js +123 -0
- package/dist/generate/run.js.map +1 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/export-run.d.ts +38 -0
- package/dist/jobs/export-run.d.ts.map +1 -0
- package/dist/jobs/export-run.js +172 -0
- package/dist/jobs/export-run.js.map +1 -0
- package/dist/jobs/import-run.d.ts +43 -0
- package/dist/jobs/import-run.d.ts.map +1 -0
- package/dist/jobs/import-run.js +290 -0
- package/dist/jobs/import-run.js.map +1 -0
- package/dist/jobs/llm-run.d.ts +73 -0
- package/dist/jobs/llm-run.d.ts.map +1 -0
- package/dist/jobs/llm-run.js +225 -0
- package/dist/jobs/llm-run.js.map +1 -0
- package/dist/jobs/register.d.ts +90 -0
- package/dist/jobs/register.d.ts.map +1 -0
- package/dist/jobs/register.js +121 -0
- package/dist/jobs/register.js.map +1 -0
- package/dist/jobs/registry.d.ts +74 -0
- package/dist/jobs/registry.d.ts.map +1 -0
- package/dist/jobs/registry.js +78 -0
- package/dist/jobs/registry.js.map +1 -0
- package/dist/jobs/report-run.d.ts +64 -0
- package/dist/jobs/report-run.d.ts.map +1 -0
- package/dist/jobs/report-run.js +221 -0
- package/dist/jobs/report-run.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +72 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +121 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/worker.d.ts +110 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +282 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/llm/apply-service.d.ts +150 -0
- package/dist/llm/apply-service.d.ts.map +1 -0
- package/dist/llm/apply-service.js +463 -0
- package/dist/llm/apply-service.js.map +1 -0
- package/dist/llm/apply-undo-store.d.ts +50 -0
- package/dist/llm/apply-undo-store.d.ts.map +1 -0
- package/dist/llm/apply-undo-store.js +60 -0
- package/dist/llm/apply-undo-store.js.map +1 -0
- package/dist/llm/direct-runner.d.ts +146 -0
- package/dist/llm/direct-runner.d.ts.map +1 -0
- package/dist/llm/direct-runner.js +204 -0
- package/dist/llm/direct-runner.js.map +1 -0
- package/dist/llm/prompt-service.d.ts +90 -0
- package/dist/llm/prompt-service.d.ts.map +1 -0
- package/dist/llm/prompt-service.js +93 -0
- package/dist/llm/prompt-service.js.map +1 -0
- package/dist/llm/provider-resolver.d.ts +25 -0
- package/dist/llm/provider-resolver.d.ts.map +1 -0
- package/dist/llm/provider-resolver.js +81 -0
- package/dist/llm/provider-resolver.js.map +1 -0
- package/dist/llm/run-service.d.ts +215 -0
- package/dist/llm/run-service.d.ts.map +1 -0
- package/dist/llm/run-service.js +343 -0
- package/dist/llm/run-service.js.map +1 -0
- package/dist/llm/stats-collector.d.ts +40 -0
- package/dist/llm/stats-collector.d.ts.map +1 -0
- package/dist/llm/stats-collector.js +74 -0
- package/dist/llm/stats-collector.js.map +1 -0
- package/dist/log-scrub.d.ts +58 -0
- package/dist/log-scrub.d.ts.map +1 -0
- package/dist/log-scrub.js +103 -0
- package/dist/log-scrub.js.map +1 -0
- package/dist/meta/store.d.ts +96 -0
- package/dist/meta/store.d.ts.map +1 -0
- package/dist/meta/store.js +192 -0
- package/dist/meta/store.js.map +1 -0
- package/dist/notifications/notify.d.ts +43 -0
- package/dist/notifications/notify.d.ts.map +1 -0
- package/dist/notifications/notify.js +42 -0
- package/dist/notifications/notify.js.map +1 -0
- package/dist/plugins/auth.d.ts +42 -0
- package/dist/plugins/auth.d.ts.map +1 -0
- package/dist/plugins/auth.js +84 -0
- package/dist/plugins/auth.js.map +1 -0
- package/dist/plugins/core.d.ts +48 -0
- package/dist/plugins/core.d.ts.map +1 -0
- package/dist/plugins/core.js +248 -0
- package/dist/plugins/core.js.map +1 -0
- package/dist/plugins/rbac.d.ts +54 -0
- package/dist/plugins/rbac.d.ts.map +1 -0
- package/dist/plugins/rbac.js +103 -0
- package/dist/plugins/rbac.js.map +1 -0
- package/dist/plugins/static.d.ts +12 -0
- package/dist/plugins/static.d.ts.map +1 -0
- package/dist/plugins/static.js +36 -0
- package/dist/plugins/static.js.map +1 -0
- package/dist/rbac/api-keys.d.ts +30 -0
- package/dist/rbac/api-keys.d.ts.map +1 -0
- package/dist/rbac/api-keys.js +41 -0
- package/dist/rbac/api-keys.js.map +1 -0
- package/dist/rbac/index.d.ts +6 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +6 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/permissions.d.ts +107 -0
- package/dist/rbac/permissions.d.ts.map +1 -0
- package/dist/rbac/permissions.js +250 -0
- package/dist/rbac/permissions.js.map +1 -0
- package/dist/rbac/principal.d.ts +33 -0
- package/dist/rbac/principal.d.ts.map +1 -0
- package/dist/rbac/principal.js +31 -0
- package/dist/rbac/principal.js.map +1 -0
- package/dist/rbac/resolver.d.ts +26 -0
- package/dist/rbac/resolver.d.ts.map +1 -0
- package/dist/rbac/resolver.js +46 -0
- package/dist/rbac/resolver.js.map +1 -0
- package/dist/realtime/hub.d.ts +90 -0
- package/dist/realtime/hub.d.ts.map +1 -0
- package/dist/realtime/hub.js +146 -0
- package/dist/realtime/hub.js.map +1 -0
- package/dist/realtime/sse.d.ts +35 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +88 -0
- package/dist/realtime/sse.js.map +1 -0
- package/dist/realtime/ws.d.ts +38 -0
- package/dist/realtime/ws.d.ts.map +1 -0
- package/dist/realtime/ws.js +124 -0
- package/dist/realtime/ws.js.map +1 -0
- package/dist/reports/schedule.d.ts +14 -0
- package/dist/reports/schedule.d.ts.map +1 -0
- package/dist/reports/schedule.js +63 -0
- package/dist/reports/schedule.js.map +1 -0
- package/dist/routes/about/index.d.ts +39 -0
- package/dist/routes/about/index.d.ts.map +1 -0
- package/dist/routes/about/index.js +73 -0
- package/dist/routes/about/index.js.map +1 -0
- package/dist/routes/about/schema.d.ts +50 -0
- package/dist/routes/about/schema.d.ts.map +1 -0
- package/dist/routes/about/schema.js +53 -0
- package/dist/routes/about/schema.js.map +1 -0
- package/dist/routes/api-keys/index.d.ts +11 -0
- package/dist/routes/api-keys/index.d.ts.map +1 -0
- package/dist/routes/api-keys/index.js +79 -0
- package/dist/routes/api-keys/index.js.map +1 -0
- package/dist/routes/api-keys/schema.d.ts +62 -0
- package/dist/routes/api-keys/schema.d.ts.map +1 -0
- package/dist/routes/api-keys/schema.js +37 -0
- package/dist/routes/api-keys/schema.js.map +1 -0
- package/dist/routes/audit/index.d.ts +11 -0
- package/dist/routes/audit/index.d.ts.map +1 -0
- package/dist/routes/audit/index.js +107 -0
- package/dist/routes/audit/index.js.map +1 -0
- package/dist/routes/audit/schema.d.ts +129 -0
- package/dist/routes/audit/schema.d.ts.map +1 -0
- package/dist/routes/audit/schema.js +43 -0
- package/dist/routes/audit/schema.js.map +1 -0
- package/dist/routes/auth/desktop-session.d.ts +48 -0
- package/dist/routes/auth/desktop-session.d.ts.map +1 -0
- package/dist/routes/auth/desktop-session.js +132 -0
- package/dist/routes/auth/desktop-session.js.map +1 -0
- package/dist/routes/auth/handlers.d.ts +21 -0
- package/dist/routes/auth/handlers.d.ts.map +1 -0
- package/dist/routes/auth/handlers.js +256 -0
- package/dist/routes/auth/handlers.js.map +1 -0
- package/dist/routes/auth/index.d.ts +27 -0
- package/dist/routes/auth/index.d.ts.map +1 -0
- package/dist/routes/auth/index.js +67 -0
- package/dist/routes/auth/index.js.map +1 -0
- package/dist/routes/auth/schema.d.ts +129 -0
- package/dist/routes/auth/schema.d.ts.map +1 -0
- package/dist/routes/auth/schema.js +84 -0
- package/dist/routes/auth/schema.js.map +1 -0
- package/dist/routes/bootstrap/handlers.d.ts +34 -0
- package/dist/routes/bootstrap/handlers.d.ts.map +1 -0
- package/dist/routes/bootstrap/handlers.js +96 -0
- package/dist/routes/bootstrap/handlers.js.map +1 -0
- package/dist/routes/bootstrap/index.d.ts +9 -0
- package/dist/routes/bootstrap/index.d.ts.map +1 -0
- package/dist/routes/bootstrap/index.js +16 -0
- package/dist/routes/bootstrap/index.js.map +1 -0
- package/dist/routes/bootstrap/schema.d.ts +177 -0
- package/dist/routes/bootstrap/schema.d.ts.map +1 -0
- package/dist/routes/bootstrap/schema.js +55 -0
- package/dist/routes/bootstrap/schema.js.map +1 -0
- package/dist/routes/connections/index.d.ts +21 -0
- package/dist/routes/connections/index.d.ts.map +1 -0
- package/dist/routes/connections/index.js +260 -0
- package/dist/routes/connections/index.js.map +1 -0
- package/dist/routes/connections/schema.d.ts +161 -0
- package/dist/routes/connections/schema.d.ts.map +1 -0
- package/dist/routes/connections/schema.js +91 -0
- package/dist/routes/connections/schema.js.map +1 -0
- package/dist/routes/data/index.d.ts +46 -0
- package/dist/routes/data/index.d.ts.map +1 -0
- package/dist/routes/data/index.js +508 -0
- package/dist/routes/data/index.js.map +1 -0
- package/dist/routes/data/schema.d.ts +128 -0
- package/dist/routes/data/schema.d.ts.map +1 -0
- package/dist/routes/data/schema.js +83 -0
- package/dist/routes/data/schema.js.map +1 -0
- package/dist/routes/desktop/index.d.ts +61 -0
- package/dist/routes/desktop/index.d.ts.map +1 -0
- package/dist/routes/desktop/index.js +91 -0
- package/dist/routes/desktop/index.js.map +1 -0
- package/dist/routes/desktop/schema.d.ts +71 -0
- package/dist/routes/desktop/schema.d.ts.map +1 -0
- package/dist/routes/desktop/schema.js +58 -0
- package/dist/routes/desktop/schema.js.map +1 -0
- package/dist/routes/desktop-capabilities/index.d.ts +9 -0
- package/dist/routes/desktop-capabilities/index.d.ts.map +1 -0
- package/dist/routes/desktop-capabilities/index.js +62 -0
- package/dist/routes/desktop-capabilities/index.js.map +1 -0
- package/dist/routes/desktop-capabilities/schema.d.ts +46 -0
- package/dist/routes/desktop-capabilities/schema.d.ts.map +1 -0
- package/dist/routes/desktop-capabilities/schema.js +30 -0
- package/dist/routes/desktop-capabilities/schema.js.map +1 -0
- package/dist/routes/desktop-demo/handlers.d.ts +94 -0
- package/dist/routes/desktop-demo/handlers.d.ts.map +1 -0
- package/dist/routes/desktop-demo/handlers.js +182 -0
- package/dist/routes/desktop-demo/handlers.js.map +1 -0
- package/dist/routes/desktop-demo/index.d.ts +39 -0
- package/dist/routes/desktop-demo/index.d.ts.map +1 -0
- package/dist/routes/desktop-demo/index.js +73 -0
- package/dist/routes/desktop-demo/index.js.map +1 -0
- package/dist/routes/desktop-demo/schema.d.ts +17 -0
- package/dist/routes/desktop-demo/schema.d.ts.map +1 -0
- package/dist/routes/desktop-demo/schema.js +30 -0
- package/dist/routes/desktop-demo/schema.js.map +1 -0
- package/dist/routes/desktop-lan/index.d.ts +54 -0
- package/dist/routes/desktop-lan/index.d.ts.map +1 -0
- package/dist/routes/desktop-lan/index.js +33 -0
- package/dist/routes/desktop-lan/index.js.map +1 -0
- package/dist/routes/desktop-lan/schema.d.ts +24 -0
- package/dist/routes/desktop-lan/schema.d.ts.map +1 -0
- package/dist/routes/desktop-lan/schema.js +40 -0
- package/dist/routes/desktop-lan/schema.js.map +1 -0
- package/dist/routes/desktop-local-db/handlers.d.ts +92 -0
- package/dist/routes/desktop-local-db/handlers.d.ts.map +1 -0
- package/dist/routes/desktop-local-db/handlers.js +300 -0
- package/dist/routes/desktop-local-db/handlers.js.map +1 -0
- package/dist/routes/desktop-local-db/index.d.ts +39 -0
- package/dist/routes/desktop-local-db/index.d.ts.map +1 -0
- package/dist/routes/desktop-local-db/index.js +83 -0
- package/dist/routes/desktop-local-db/index.js.map +1 -0
- package/dist/routes/desktop-local-db/placeholder.d.ts +75 -0
- package/dist/routes/desktop-local-db/placeholder.d.ts.map +1 -0
- package/dist/routes/desktop-local-db/placeholder.js +420 -0
- package/dist/routes/desktop-local-db/placeholder.js.map +1 -0
- package/dist/routes/desktop-local-db/schema.d.ts +50 -0
- package/dist/routes/desktop-local-db/schema.d.ts.map +1 -0
- package/dist/routes/desktop-local-db/schema.js +71 -0
- package/dist/routes/desktop-local-db/schema.js.map +1 -0
- package/dist/routes/desktop-local-db/sqlite-ddl.d.ts +104 -0
- package/dist/routes/desktop-local-db/sqlite-ddl.d.ts.map +1 -0
- package/dist/routes/desktop-local-db/sqlite-ddl.js +419 -0
- package/dist/routes/desktop-local-db/sqlite-ddl.js.map +1 -0
- package/dist/routes/email-templates/index.d.ts +7 -0
- package/dist/routes/email-templates/index.d.ts.map +1 -0
- package/dist/routes/email-templates/index.js +70 -0
- package/dist/routes/email-templates/index.js.map +1 -0
- package/dist/routes/email-templates/schema.d.ts +54 -0
- package/dist/routes/email-templates/schema.d.ts.map +1 -0
- package/dist/routes/email-templates/schema.js +35 -0
- package/dist/routes/email-templates/schema.js.map +1 -0
- package/dist/routes/exports/index.d.ts +19 -0
- package/dist/routes/exports/index.d.ts.map +1 -0
- package/dist/routes/exports/index.js +145 -0
- package/dist/routes/exports/index.js.map +1 -0
- package/dist/routes/exports/schema.d.ts +183 -0
- package/dist/routes/exports/schema.d.ts.map +1 -0
- package/dist/routes/exports/schema.js +37 -0
- package/dist/routes/exports/schema.js.map +1 -0
- package/dist/routes/generate/index.d.ts +23 -0
- package/dist/routes/generate/index.d.ts.map +1 -0
- package/dist/routes/generate/index.js +80 -0
- package/dist/routes/generate/index.js.map +1 -0
- package/dist/routes/generate/schema.d.ts +43 -0
- package/dist/routes/generate/schema.d.ts.map +1 -0
- package/dist/routes/generate/schema.js +37 -0
- package/dist/routes/generate/schema.js.map +1 -0
- package/dist/routes/imports/index.d.ts +21 -0
- package/dist/routes/imports/index.d.ts.map +1 -0
- package/dist/routes/imports/index.js +288 -0
- package/dist/routes/imports/index.js.map +1 -0
- package/dist/routes/imports/schema.d.ts +292 -0
- package/dist/routes/imports/schema.d.ts.map +1 -0
- package/dist/routes/imports/schema.js +78 -0
- package/dist/routes/imports/schema.js.map +1 -0
- package/dist/routes/index.d.ts +11 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +8 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/jobs/index.d.ts +29 -0
- package/dist/routes/jobs/index.d.ts.map +1 -0
- package/dist/routes/jobs/index.js +175 -0
- package/dist/routes/jobs/index.js.map +1 -0
- package/dist/routes/jobs/schema.d.ts +170 -0
- package/dist/routes/jobs/schema.d.ts.map +1 -0
- package/dist/routes/jobs/schema.js +57 -0
- package/dist/routes/jobs/schema.js.map +1 -0
- package/dist/routes/llm/config-service.d.ts +48 -0
- package/dist/routes/llm/config-service.d.ts.map +1 -0
- package/dist/routes/llm/config-service.js +102 -0
- package/dist/routes/llm/config-service.js.map +1 -0
- package/dist/routes/llm/index.d.ts +69 -0
- package/dist/routes/llm/index.d.ts.map +1 -0
- package/dist/routes/llm/index.js +412 -0
- package/dist/routes/llm/index.js.map +1 -0
- package/dist/routes/llm/schema.d.ts +605 -0
- package/dist/routes/llm/schema.d.ts.map +1 -0
- package/dist/routes/llm/schema.js +238 -0
- package/dist/routes/llm/schema.js.map +1 -0
- package/dist/routes/me/handlers.d.ts +14 -0
- package/dist/routes/me/handlers.d.ts.map +1 -0
- package/dist/routes/me/handlers.js +88 -0
- package/dist/routes/me/handlers.js.map +1 -0
- package/dist/routes/me/index.d.ts +8 -0
- package/dist/routes/me/index.d.ts.map +1 -0
- package/dist/routes/me/index.js +17 -0
- package/dist/routes/me/index.js.map +1 -0
- package/dist/routes/me/schema.d.ts +270 -0
- package/dist/routes/me/schema.d.ts.map +1 -0
- package/dist/routes/me/schema.js +59 -0
- package/dist/routes/me/schema.js.map +1 -0
- package/dist/routes/me-views/index.d.ts +23 -0
- package/dist/routes/me-views/index.d.ts.map +1 -0
- package/dist/routes/me-views/index.js +76 -0
- package/dist/routes/me-views/index.js.map +1 -0
- package/dist/routes/me-views/schema.d.ts +44 -0
- package/dist/routes/me-views/schema.d.ts.map +1 -0
- package/dist/routes/me-views/schema.js +13 -0
- package/dist/routes/me-views/schema.js.map +1 -0
- package/dist/routes/notifications/index.d.ts +19 -0
- package/dist/routes/notifications/index.d.ts.map +1 -0
- package/dist/routes/notifications/index.js +123 -0
- package/dist/routes/notifications/index.js.map +1 -0
- package/dist/routes/notifications/schema.d.ts +122 -0
- package/dist/routes/notifications/schema.d.ts.map +1 -0
- package/dist/routes/notifications/schema.js +83 -0
- package/dist/routes/notifications/schema.js.map +1 -0
- package/dist/routes/onboarding/derive.d.ts +41 -0
- package/dist/routes/onboarding/derive.d.ts.map +1 -0
- package/dist/routes/onboarding/derive.js +30 -0
- package/dist/routes/onboarding/derive.js.map +1 -0
- package/dist/routes/onboarding/index.d.ts +26 -0
- package/dist/routes/onboarding/index.d.ts.map +1 -0
- package/dist/routes/onboarding/index.js +95 -0
- package/dist/routes/onboarding/index.js.map +1 -0
- package/dist/routes/onboarding/schema.d.ts +22 -0
- package/dist/routes/onboarding/schema.d.ts.map +1 -0
- package/dist/routes/onboarding/schema.js +22 -0
- package/dist/routes/onboarding/schema.js.map +1 -0
- package/dist/routes/pages/index.d.ts +26 -0
- package/dist/routes/pages/index.d.ts.map +1 -0
- package/dist/routes/pages/index.js +119 -0
- package/dist/routes/pages/index.js.map +1 -0
- package/dist/routes/pages/layout-schema.d.ts +19 -0
- package/dist/routes/pages/layout-schema.d.ts.map +1 -0
- package/dist/routes/pages/layout-schema.js +19 -0
- package/dist/routes/pages/layout-schema.js.map +1 -0
- package/dist/routes/pages/schema.d.ts +52 -0
- package/dist/routes/pages/schema.d.ts.map +1 -0
- package/dist/routes/pages/schema.js +35 -0
- package/dist/routes/pages/schema.js.map +1 -0
- package/dist/routes/roles/index.d.ts +17 -0
- package/dist/routes/roles/index.d.ts.map +1 -0
- package/dist/routes/roles/index.js +255 -0
- package/dist/routes/roles/index.js.map +1 -0
- package/dist/routes/roles/schema.d.ts +94 -0
- package/dist/routes/roles/schema.d.ts.map +1 -0
- package/dist/routes/roles/schema.js +57 -0
- package/dist/routes/roles/schema.js.map +1 -0
- package/dist/routes/scheduled-reports/index.d.ts +15 -0
- package/dist/routes/scheduled-reports/index.d.ts.map +1 -0
- package/dist/routes/scheduled-reports/index.js +195 -0
- package/dist/routes/scheduled-reports/index.js.map +1 -0
- package/dist/routes/scheduled-reports/schema.d.ts +154 -0
- package/dist/routes/scheduled-reports/schema.d.ts.map +1 -0
- package/dist/routes/scheduled-reports/schema.js +49 -0
- package/dist/routes/scheduled-reports/schema.js.map +1 -0
- package/dist/routes/schema/index.d.ts +24 -0
- package/dist/routes/schema/index.d.ts.map +1 -0
- package/dist/routes/schema/index.js +224 -0
- package/dist/routes/schema/index.js.map +1 -0
- package/dist/routes/schema/schema.d.ts +92 -0
- package/dist/routes/schema/schema.d.ts.map +1 -0
- package/dist/routes/schema/schema.js +64 -0
- package/dist/routes/schema/schema.js.map +1 -0
- package/dist/routes/schema-import/fallback-parser.d.ts +35 -0
- package/dist/routes/schema-import/fallback-parser.d.ts.map +1 -0
- package/dist/routes/schema-import/fallback-parser.js +349 -0
- package/dist/routes/schema-import/fallback-parser.js.map +1 -0
- package/dist/routes/schema-import/index.d.ts +43 -0
- package/dist/routes/schema-import/index.d.ts.map +1 -0
- package/dist/routes/schema-import/index.js +167 -0
- package/dist/routes/schema-import/index.js.map +1 -0
- package/dist/routes/schema-import/schema.d.ts +65 -0
- package/dist/routes/schema-import/schema.d.ts.map +1 -0
- package/dist/routes/schema-import/schema.js +40 -0
- package/dist/routes/schema-import/schema.js.map +1 -0
- package/dist/routes/search/index.d.ts +71 -0
- package/dist/routes/search/index.d.ts.map +1 -0
- package/dist/routes/search/index.js +361 -0
- package/dist/routes/search/index.js.map +1 -0
- package/dist/routes/search/schema.d.ts +125 -0
- package/dist/routes/search/schema.d.ts.map +1 -0
- package/dist/routes/search/schema.js +70 -0
- package/dist/routes/search/schema.js.map +1 -0
- package/dist/routes/settings/index.d.ts +24 -0
- package/dist/routes/settings/index.d.ts.map +1 -0
- package/dist/routes/settings/index.js +164 -0
- package/dist/routes/settings/index.js.map +1 -0
- package/dist/routes/settings/schema.d.ts +110 -0
- package/dist/routes/settings/schema.d.ts.map +1 -0
- package/dist/routes/settings/schema.js +71 -0
- package/dist/routes/settings/schema.js.map +1 -0
- package/dist/routes/setup/index.d.ts +29 -0
- package/dist/routes/setup/index.d.ts.map +1 -0
- package/dist/routes/setup/index.js +68 -0
- package/dist/routes/setup/index.js.map +1 -0
- package/dist/routes/setup/schema.d.ts +61 -0
- package/dist/routes/setup/schema.d.ts.map +1 -0
- package/dist/routes/setup/schema.js +47 -0
- package/dist/routes/setup/schema.js.map +1 -0
- package/dist/routes/system/handlers.d.ts +63 -0
- package/dist/routes/system/handlers.d.ts.map +1 -0
- package/dist/routes/system/handlers.js +121 -0
- package/dist/routes/system/handlers.js.map +1 -0
- package/dist/routes/system/index.d.ts +34 -0
- package/dist/routes/system/index.d.ts.map +1 -0
- package/dist/routes/system/index.js +18 -0
- package/dist/routes/system/index.js.map +1 -0
- package/dist/routes/system/schema.d.ts +93 -0
- package/dist/routes/system/schema.d.ts.map +1 -0
- package/dist/routes/system/schema.js +109 -0
- package/dist/routes/system/schema.js.map +1 -0
- package/dist/routes/views/index.d.ts +21 -0
- package/dist/routes/views/index.d.ts.map +1 -0
- package/dist/routes/views/index.js +155 -0
- package/dist/routes/views/index.js.map +1 -0
- package/dist/routes/views/schema.d.ts +127 -0
- package/dist/routes/views/schema.d.ts.map +1 -0
- package/dist/routes/views/schema.js +56 -0
- package/dist/routes/views/schema.js.map +1 -0
- package/dist/routes/widget-data/index.d.ts +29 -0
- package/dist/routes/widget-data/index.d.ts.map +1 -0
- package/dist/routes/widget-data/index.js +152 -0
- package/dist/routes/widget-data/index.js.map +1 -0
- package/dist/routes/widget-data/schema.d.ts +252 -0
- package/dist/routes/widget-data/schema.d.ts.map +1 -0
- package/dist/routes/widget-data/schema.js +44 -0
- package/dist/routes/widget-data/schema.js.map +1 -0
- package/dist/setup/service.d.ts +63 -0
- package/dist/setup/service.d.ts.map +1 -0
- package/dist/setup/service.js +103 -0
- package/dist/setup/service.js.map +1 -0
- package/dist/start.d.ts +12 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +28 -0
- package/dist/start.js.map +1 -0
- package/dist/telemetry/payload.d.ts +66 -0
- package/dist/telemetry/payload.d.ts.map +1 -0
- package/dist/telemetry/payload.js +69 -0
- package/dist/telemetry/payload.js.map +1 -0
- package/dist/telemetry/service.d.ts +67 -0
- package/dist/telemetry/service.d.ts.map +1 -0
- package/dist/telemetry/service.js +103 -0
- package/dist/telemetry/service.js.map +1 -0
- package/dist/telemetry/update-check.d.ts +79 -0
- package/dist/telemetry/update-check.d.ts.map +1 -0
- package/dist/telemetry/update-check.js +103 -0
- package/dist/telemetry/update-check.js.map +1 -0
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/dist/widget-data/cache.d.ts +35 -0
- package/dist/widget-data/cache.d.ts.map +1 -0
- package/dist/widget-data/cache.js +67 -0
- package/dist/widget-data/cache.js.map +1 -0
- package/dist/widget-data/compiler.d.ts +107 -0
- package/dist/widget-data/compiler.d.ts.map +1 -0
- package/dist/widget-data/compiler.js +362 -0
- package/dist/widget-data/compiler.js.map +1 -0
- package/dist/widget-data/shapers.d.ts +75 -0
- package/dist/widget-data/shapers.d.ts.map +1 -0
- package/dist/widget-data/shapers.js +128 -0
- package/dist/widget-data/shapers.js.map +1 -0
- package/dist/widget-data/stream-publisher.d.ts +42 -0
- package/dist/widget-data/stream-publisher.d.ts.map +1 -0
- package/dist/widget-data/stream-publisher.js +34 -0
- package/dist/widget-data/stream-publisher.js.map +1 -0
- package/package.json +79 -0
- package/vocabulary/llm-allowlist.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/backup/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AACpD,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,mBAAmB,QAA+B,CAAC;AAEhE,eAAO,MAAM,gBAAgB,aAE3B,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,YAAY,aAEvB,CAAC;AAEH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;kBAWpC,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,4BAA4B;;;;;kBAMvC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;4BAGpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,gEAAgE;AAChE,eAAO,MAAM,qBAAqB;;;;kBAIhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;kBAgB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAGpB;AAID,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAuC,CAAC;AAExE;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAUjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAO3E"}
|
|
@@ -0,0 +1,304 @@
|
|
|
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 { createHash } from 'node:crypto';
|
|
89
|
+
import { basename, extname } from 'node:path';
|
|
90
|
+
import { z } from 'zod';
|
|
91
|
+
/**
|
|
92
|
+
* FROZEN (§9: "format frozen here as `formatVersion: 1`").
|
|
93
|
+
*
|
|
94
|
+
* READ BY: the desktop restore's `validateArchive`, which refuses a higher
|
|
95
|
+
* number rather than parsing leniently — the same rule `config.ts`'s version
|
|
96
|
+
* gate and the M10 bundle's already obey.
|
|
97
|
+
*
|
|
98
|
+
* NOT read by the M10 CLI, whatever §9 says — see the module header. This
|
|
99
|
+
* doc-comment used to claim it was; the claim was never true and the number is
|
|
100
|
+
* the same either way, which is exactly why nobody noticed.
|
|
101
|
+
*/
|
|
102
|
+
export const BACKUP_FORMAT_VERSION = 1;
|
|
103
|
+
/** Archive member paths. The reader allow-lists against these — see below. */
|
|
104
|
+
export const BACKUP_MANIFEST_PATH = 'manifest.json';
|
|
105
|
+
export const BACKUP_META_PATH = 'meta.db';
|
|
106
|
+
export const BACKUP_CONFIG_PATH = 'config.json';
|
|
107
|
+
export const BACKUP_DATABASES_DIR = 'databases';
|
|
108
|
+
/** `databases/<slug>.sqlite` — the ONLY shape a source-DB member may have. */
|
|
109
|
+
export function backupDatabasePath(slug) {
|
|
110
|
+
return `${BACKUP_DATABASES_DIR}/${slug}.sqlite`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The slug grammar, and the reason it is this narrow.
|
|
114
|
+
*
|
|
115
|
+
* A slug is interpolated into an archive member path and then, on restore, into
|
|
116
|
+
* a filesystem path under `<dataDir>/databases/`. That makes it the one value in
|
|
117
|
+
* this format that can escape its directory: `../../config.json` is a perfectly
|
|
118
|
+
* good zip entry name, and an unpacker that trusted it would overwrite the
|
|
119
|
+
* desktop config — with the master secret in it — from inside an archive a user
|
|
120
|
+
* double-clicked. Lowercase alnum + `-` + `_` cannot express a separator, a
|
|
121
|
+
* drive letter, a dot segment, or a NUL, so the traversal is not defended
|
|
122
|
+
* against, it is unrepresentable.
|
|
123
|
+
*
|
|
124
|
+
* The reader re-validates every slug it reads (it must: the archive is untrusted
|
|
125
|
+
* input, and the writer's guarantees are the writer's), which is why this regex
|
|
126
|
+
* is exported rather than inlined at the point of use.
|
|
127
|
+
*/
|
|
128
|
+
export const BACKUP_SLUG_PATTERN = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
129
|
+
export const backupSlugSchema = z.string().regex(BACKUP_SLUG_PATTERN, {
|
|
130
|
+
message: 'must be 1-64 chars of lowercase a-z, 0-9, "-" or "_", starting alphanumeric',
|
|
131
|
+
});
|
|
132
|
+
/** SHA-256, lowercase hex — the digest every checksum field carries. */
|
|
133
|
+
export const sha256Schema = z.string().regex(/^[0-9a-f]{64}$/, {
|
|
134
|
+
message: 'must be a lowercase hex SHA-256 digest',
|
|
135
|
+
});
|
|
136
|
+
export function sha256Hex(bytes) {
|
|
137
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* A LOCAL source database: dumped, checksummed, restorable.
|
|
141
|
+
*
|
|
142
|
+
* `sourcePath` is provenance, not an instruction. It records where the file was
|
|
143
|
+
* when the backup ran; the restore does NOT write to it. See
|
|
144
|
+
* `apps/desktop/src/main/backup-archive.ts` for why an unpacker that honoured an
|
|
145
|
+
* absolute path out of an archive would be a remote-file-write primitive.
|
|
146
|
+
*
|
|
147
|
+
* It is READ, though — by `assertRestorablePaths`, which refuses any archive
|
|
148
|
+
* whose `sourcePath` is not already `<dataDir>/databases/<slug>.sqlite` on the
|
|
149
|
+
* target. That check is the whole reason this field is load-bearing rather than
|
|
150
|
+
* decorative: the unpack writes to the slug-derived path and `meta.db` is
|
|
151
|
+
* restored byte-for-byte, so a `sourcePath` that disagrees means the restored
|
|
152
|
+
* DSN would point somewhere the bytes are not — and the slug might belong to a
|
|
153
|
+
* different connection entirely. Provenance is exactly what is needed to notice
|
|
154
|
+
* that, and refusing is exactly what may be done with it.
|
|
155
|
+
*/
|
|
156
|
+
export const backupLocalDatabaseSchema = z.strictObject({
|
|
157
|
+
kind: z.literal('local'),
|
|
158
|
+
slug: backupSlugSchema,
|
|
159
|
+
/** §9's `file` — the archive member, i.e. `databases/<slug>.sqlite`. */
|
|
160
|
+
file: z.string().min(1),
|
|
161
|
+
bytes: z.number().int().nonnegative(),
|
|
162
|
+
sha256: sha256Schema,
|
|
163
|
+
/** `adminium_connections.id` this snapshot came from. */
|
|
164
|
+
connectionId: z.string().min(1),
|
|
165
|
+
/** Absolute path of the live file at backup time. Provenance only. */
|
|
166
|
+
sourcePath: z.string().min(1),
|
|
167
|
+
});
|
|
168
|
+
/**
|
|
169
|
+
* A REMOTE source database (§9: "remote PG/MySQL are listed in manifest.json as
|
|
170
|
+
* 'external', never dumped").
|
|
171
|
+
*
|
|
172
|
+
* Listed rather than omitted, because the difference between "this instance had
|
|
173
|
+
* no Postgres" and "this instance had a Postgres we did not dump" is the whole
|
|
174
|
+
* question a person asks when a restore comes up short. No DSN, not even
|
|
175
|
+
* encrypted: the DSN is in meta.db, and a manifest is the one file in the
|
|
176
|
+
* archive that is read before anything is trusted.
|
|
177
|
+
*/
|
|
178
|
+
export const backupExternalDatabaseSchema = z.strictObject({
|
|
179
|
+
kind: z.literal('external'),
|
|
180
|
+
slug: backupSlugSchema,
|
|
181
|
+
connectionId: z.string().min(1),
|
|
182
|
+
/** `postgres` | `mysql` | … — whatever `adminium_connections.engine` said. */
|
|
183
|
+
engine: z.string().min(1),
|
|
184
|
+
});
|
|
185
|
+
export const backupDatabaseEntrySchema = z.discriminatedUnion('kind', [
|
|
186
|
+
backupLocalDatabaseSchema,
|
|
187
|
+
backupExternalDatabaseSchema,
|
|
188
|
+
]);
|
|
189
|
+
/** `meta.db`'s own entry — see point 2 in the module header. */
|
|
190
|
+
export const backupMetaEntrySchema = z.strictObject({
|
|
191
|
+
file: z.literal(BACKUP_META_PATH),
|
|
192
|
+
bytes: z.number().int().nonnegative(),
|
|
193
|
+
sha256: sha256Schema,
|
|
194
|
+
});
|
|
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 const backupManifestSchema = z.strictObject({
|
|
204
|
+
formatVersion: z.number().int().positive(),
|
|
205
|
+
/** The Electron shell's `app.getVersion()`, or `null` outside it. */
|
|
206
|
+
appVersion: z.string().min(1).nullable(),
|
|
207
|
+
/** `@adminium/server`'s `APP_VERSION`. */
|
|
208
|
+
serverVersion: z.string().min(1),
|
|
209
|
+
/**
|
|
210
|
+
* The meta-store's migration high-water mark — the ledger's last applied
|
|
211
|
+
* name (`0009_views_kind`), NOT the count and NOT the build's own latest.
|
|
212
|
+
* What replay needs to know is what the SOURCE actually ran.
|
|
213
|
+
*/
|
|
214
|
+
metaMigrationVersion: z.string().min(1),
|
|
215
|
+
/** Epoch ms. */
|
|
216
|
+
createdAt: z.number().int().nonnegative(),
|
|
217
|
+
meta: backupMetaEntrySchema,
|
|
218
|
+
databases: z.array(backupDatabaseEntrySchema),
|
|
219
|
+
});
|
|
220
|
+
export function compareMetaMigrationVersion(backupVersion, appVersion) {
|
|
221
|
+
if (backupVersion === appVersion)
|
|
222
|
+
return 'same';
|
|
223
|
+
return backupVersion > appVersion ? 'newer' : 'older';
|
|
224
|
+
}
|
|
225
|
+
// ─── Naming ─────────────────────────────────────────────────────────────────
|
|
226
|
+
/** §9's `adminium-backup-20260712-1430.zip`. */
|
|
227
|
+
export const BACKUP_FILE_PREFIX = 'adminium-backup-';
|
|
228
|
+
export const BACKUP_FILE_EXTENSION = '.zip';
|
|
229
|
+
/**
|
|
230
|
+
* Matches {@link backupFileName}'s output. The rotation sweep uses it as an
|
|
231
|
+
* allow-list rather than deleting whatever is in `<dataDir>/backups/`: that
|
|
232
|
+
* directory is `showItemInFolder`-revealed (§9) and users put things in folders
|
|
233
|
+
* they can see. Rotation deletes files THIS code wrote and nothing else.
|
|
234
|
+
*/
|
|
235
|
+
export const BACKUP_FILE_PATTERN = /^adminium-backup-\d{8}-\d{6}\.zip$/;
|
|
236
|
+
/**
|
|
237
|
+
* `adminium-backup-YYYYMMDD-HHMMSS.zip`, in UTC.
|
|
238
|
+
*
|
|
239
|
+
* §9's example shows minutes (`…-1430.zip`); seconds are here because rotation
|
|
240
|
+
* sorts by NAME (the only ordering that survives a file copy, an rsync, or a
|
|
241
|
+
* restored-from-Time-Machine backups folder — mtime does not), and two backups
|
|
242
|
+
* in one minute would then be indistinguishable and unorderable. UTC for the
|
|
243
|
+
* same reason: a local-time name goes backwards for an hour every autumn, and a
|
|
244
|
+
* rotation that sorts names would delete the wrong one.
|
|
245
|
+
*/
|
|
246
|
+
export function backupFileName(createdAt) {
|
|
247
|
+
const iso = new Date(createdAt).toISOString();
|
|
248
|
+
const date = iso.slice(0, 10).replace(/-/g, '');
|
|
249
|
+
const time = iso.slice(11, 19).replace(/:/g, '');
|
|
250
|
+
return `${BACKUP_FILE_PREFIX}${date}-${time}${BACKUP_FILE_EXTENSION}`;
|
|
251
|
+
}
|
|
252
|
+
/** `<dataDir>/pre-restore-<ts>` (§9). The folder a restore never deletes. */
|
|
253
|
+
export const PRE_RESTORE_PREFIX = 'pre-restore-';
|
|
254
|
+
export function preRestoreDirName(at) {
|
|
255
|
+
return `${PRE_RESTORE_PREFIX}${new Date(at).toISOString().replace(/[:.]/g, '-')}`;
|
|
256
|
+
}
|
|
257
|
+
// ─── Slugs ──────────────────────────────────────────────────────────────────
|
|
258
|
+
/**
|
|
259
|
+
* A slug for a local database file, derived from its BASENAME.
|
|
260
|
+
*
|
|
261
|
+
* The basename, not the connection name, because on desktop they are the same
|
|
262
|
+
* thing by construction: §6 step 2 creates `<dataDir>/databases/<slug>.sqlite`
|
|
263
|
+
* from the name the user typed, so the file already carries the slug the user
|
|
264
|
+
* chose and round-tripping through it keeps `databases/orders.sqlite` in the
|
|
265
|
+
* archive named `orders`. Deriving from `connection.name` instead would rename
|
|
266
|
+
* everything the moment somebody edited a label, and "Open an existing SQLite
|
|
267
|
+
* file" (§6 step 2, opened in place) has a real filename and a name the user
|
|
268
|
+
* never picked.
|
|
269
|
+
*
|
|
270
|
+
* Falls back to the connection id for a basename that survives none of the
|
|
271
|
+
* grammar — a file called `数据.sqlite` is legitimate and must not fail a backup.
|
|
272
|
+
*/
|
|
273
|
+
export function deriveDatabaseSlug(filePath, connectionId) {
|
|
274
|
+
const base = basename(filePath, extname(filePath));
|
|
275
|
+
const slug = base
|
|
276
|
+
.toLowerCase()
|
|
277
|
+
.replace(/[^a-z0-9_-]+/g, '-')
|
|
278
|
+
.replace(/^-+/, '')
|
|
279
|
+
.replace(/-+$/, '')
|
|
280
|
+
.slice(0, 64);
|
|
281
|
+
if (BACKUP_SLUG_PATTERN.test(slug))
|
|
282
|
+
return slug;
|
|
283
|
+
return `db-${connectionId.toLowerCase().replace(/[^a-z0-9]+/g, '')}`.slice(0, 64);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Make `slug` unique against `taken`, appending `-2`, `-3`, …
|
|
287
|
+
*
|
|
288
|
+
* Needed because slugs come from basenames and basenames are only unique within
|
|
289
|
+
* a directory: "Open an existing SQLite file" can register
|
|
290
|
+
* `~/work/app.sqlite` and `~/archive/app.sqlite` as two connections, and two
|
|
291
|
+
* archive members called `databases/app.sqlite` means the second silently
|
|
292
|
+
* replaces the first — a backup that looks complete and has lost a database.
|
|
293
|
+
*/
|
|
294
|
+
export function uniqueSlug(slug, taken) {
|
|
295
|
+
if (!taken.has(slug))
|
|
296
|
+
return slug;
|
|
297
|
+
for (let n = 2;; n += 1) {
|
|
298
|
+
const suffix = `-${String(n)}`;
|
|
299
|
+
const candidate = `${slug.slice(0, 64 - suffix.length)}${suffix}`;
|
|
300
|
+
if (!taken.has(candidate))
|
|
301
|
+
return candidate;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/backup/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The completion notification (11-electron.md §9: "Completion raises an
|
|
3
|
+
* `adminium_notifications` entry with 'Show in folder'").
|
|
4
|
+
*
|
|
5
|
+
* Originally a hand-rolled insert — the first producer in the product, which
|
|
6
|
+
* predated any notifications repo and said so. The repo now exists
|
|
7
|
+
* (`notificationsRepo`, M7 reports/notifications track) and this module rides
|
|
8
|
+
* the shared writer in `../notifications/notify.ts`, exactly the refactor the
|
|
9
|
+
* original comment invited.
|
|
10
|
+
*
|
|
11
|
+
* ─── "Show in folder" is not an `action_url` ─────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* Every other affordance in that table is a link the SPA can follow. Revealing a
|
|
14
|
+
* file in Finder/Explorer is not: it is `shell.showItemInFolder`, which lives in
|
|
15
|
+
* the main process behind §4's bridge. So the row carries the PATH in `entity`
|
|
16
|
+
* and leaves `action_url` null, and the notification centre renders the button
|
|
17
|
+
* only when `window.adminiumDesktop` exists (§4's detection contract). On
|
|
18
|
+
* self-host the same row, if it ever appeared, would render as a plain "backup
|
|
19
|
+
* finished" line — which is the correct degradation rather than a dead button.
|
|
20
|
+
*
|
|
21
|
+
* ─── Language ────────────────────────────────────────────────────────────────
|
|
22
|
+
*
|
|
23
|
+
* The strings are en-US and are NOT routed through `@adminium/i18n`, because a
|
|
24
|
+
* notification row is written once and read later, possibly by a user who has
|
|
25
|
+
* since changed locale — translating at write time bakes in the wrong answer.
|
|
26
|
+
* `kind` is the stable, translatable key (`desktop.backup.completed`) and
|
|
27
|
+
* `entity` carries the substitutions, so the notification centre can localize at
|
|
28
|
+
* RENDER time; `title`/`body` are the fallback for a client that does not know
|
|
29
|
+
* this kind. Same shape the audit log uses for the same reason.
|
|
30
|
+
*/
|
|
31
|
+
import type { MetaDb } from '@adminium/meta';
|
|
32
|
+
import { type NotificationPublisher } from '../notifications/notify.js';
|
|
33
|
+
/** The stable key the notification centre localizes on. */
|
|
34
|
+
export declare const BACKUP_NOTIFICATION_KIND = "desktop.backup.completed";
|
|
35
|
+
export interface BackupNotificationInput {
|
|
36
|
+
meta: MetaDb;
|
|
37
|
+
/** Who gets the row. `adminium_notifications.user_id` is NOT NULL. */
|
|
38
|
+
userId: string;
|
|
39
|
+
/** Absolute path of the archive — the "Show in folder" target. */
|
|
40
|
+
path: string;
|
|
41
|
+
bytes: number;
|
|
42
|
+
/** How many local source DBs went in, for the body line. */
|
|
43
|
+
databases: number;
|
|
44
|
+
/** Optional realtime fan-out (`notifications:<userId>`) when the caller has the hub. */
|
|
45
|
+
hub?: NotificationPublisher | undefined;
|
|
46
|
+
at?: number | undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Insert the row through the shared writer. Best-effort at the CALL SITE, not
|
|
50
|
+
* here: a failure to write a notification must never fail the backup that
|
|
51
|
+
* succeeded (see the route), but it must also not be silently swallowed inside
|
|
52
|
+
* the writer, where nobody would ever learn about it.
|
|
53
|
+
*/
|
|
54
|
+
export declare function notifyBackupCompleted(input: BackupNotificationInput): Promise<void>;
|
|
55
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/backup/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAU,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,GAAG,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAcD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAczF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The completion notification (11-electron.md §9: "Completion raises an
|
|
3
|
+
* `adminium_notifications` entry with 'Show in folder'").
|
|
4
|
+
*
|
|
5
|
+
* Originally a hand-rolled insert — the first producer in the product, which
|
|
6
|
+
* predated any notifications repo and said so. The repo now exists
|
|
7
|
+
* (`notificationsRepo`, M7 reports/notifications track) and this module rides
|
|
8
|
+
* the shared writer in `../notifications/notify.ts`, exactly the refactor the
|
|
9
|
+
* original comment invited.
|
|
10
|
+
*
|
|
11
|
+
* ─── "Show in folder" is not an `action_url` ─────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* Every other affordance in that table is a link the SPA can follow. Revealing a
|
|
14
|
+
* file in Finder/Explorer is not: it is `shell.showItemInFolder`, which lives in
|
|
15
|
+
* the main process behind §4's bridge. So the row carries the PATH in `entity`
|
|
16
|
+
* and leaves `action_url` null, and the notification centre renders the button
|
|
17
|
+
* only when `window.adminiumDesktop` exists (§4's detection contract). On
|
|
18
|
+
* self-host the same row, if it ever appeared, would render as a plain "backup
|
|
19
|
+
* finished" line — which is the correct degradation rather than a dead button.
|
|
20
|
+
*
|
|
21
|
+
* ─── Language ────────────────────────────────────────────────────────────────
|
|
22
|
+
*
|
|
23
|
+
* The strings are en-US and are NOT routed through `@adminium/i18n`, because a
|
|
24
|
+
* notification row is written once and read later, possibly by a user who has
|
|
25
|
+
* since changed locale — translating at write time bakes in the wrong answer.
|
|
26
|
+
* `kind` is the stable, translatable key (`desktop.backup.completed`) and
|
|
27
|
+
* `entity` carries the substitutions, so the notification centre can localize at
|
|
28
|
+
* RENDER time; `title`/`body` are the fallback for a client that does not know
|
|
29
|
+
* this kind. Same shape the audit log uses for the same reason.
|
|
30
|
+
*/
|
|
31
|
+
import { notify } from '../notifications/notify.js';
|
|
32
|
+
/** The stable key the notification centre localizes on. */
|
|
33
|
+
export const BACKUP_NOTIFICATION_KIND = 'desktop.backup.completed';
|
|
34
|
+
/** Bytes → `12.4 MB`, for the body line only. */
|
|
35
|
+
function humanBytes(bytes) {
|
|
36
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
37
|
+
let value = bytes;
|
|
38
|
+
let unit = 0;
|
|
39
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
40
|
+
value /= 1024;
|
|
41
|
+
unit += 1;
|
|
42
|
+
}
|
|
43
|
+
return `${unit === 0 ? String(value) : value.toFixed(1)} ${units[unit] ?? 'B'}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Insert the row through the shared writer. Best-effort at the CALL SITE, not
|
|
47
|
+
* here: a failure to write a notification must never fail the backup that
|
|
48
|
+
* succeeded (see the route), but it must also not be silently swallowed inside
|
|
49
|
+
* the writer, where nobody would ever learn about it.
|
|
50
|
+
*/
|
|
51
|
+
export async function notifyBackupCompleted(input) {
|
|
52
|
+
await notify(input.meta, {
|
|
53
|
+
userId: input.userId,
|
|
54
|
+
kind: BACKUP_NOTIFICATION_KIND,
|
|
55
|
+
title: 'Backup complete',
|
|
56
|
+
body: `${String(input.databases)} database${input.databases === 1 ? '' : 's'} · ${humanBytes(input.bytes)}`,
|
|
57
|
+
entity: { kind: 'backup', path: input.path, bytes: input.bytes },
|
|
58
|
+
}, { hub: input.hub, at: input.at });
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/backup/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,EAAE,MAAM,EAA8B,MAAM,4BAA4B,CAAC;AAEhF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAgBnE,iDAAiD;AACjD,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;IAC/C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,IAAI,IAAI,CAAC;QACd,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAA8B;IACxE,MAAM,MAAM,CACV,KAAK,CAAC,IAAI,EACV;QACE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,UAAU,CAC1F,KAAK,CAAC,KAAK,CACZ,EAAE;QACH,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;KACjE,EACD,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite snapshotting for the §9 backup (11-electron.md §9), and the discovery
|
|
3
|
+
* of what there is to snapshot.
|
|
4
|
+
*
|
|
5
|
+
* ─── Why `backup()` and not `copyFile()` ─────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* §9 is specific — "the server snapshots each SQLite file with the
|
|
8
|
+
* `better-sqlite3` online `backup()` API (WAL-safe, no locking of live writers)"
|
|
9
|
+
* — and the alternative it rules out is not merely inferior, it is silently
|
|
10
|
+
* wrong. Every local database runs `journal_mode = WAL` (§9's pragma block), so
|
|
11
|
+
* a committed row lives in `<db>-wal` until a checkpoint folds it back. Copying
|
|
12
|
+
* the `.sqlite` file therefore copies a database that is missing its most recent
|
|
13
|
+
* commits; copying all three files copies them at three different instants, so
|
|
14
|
+
* the WAL can describe pages the main file does not have yet. Both produce an
|
|
15
|
+
* archive that unzips, opens, passes `PRAGMA integrity_check`, and has lost
|
|
16
|
+
* data — the worst failure a backup can have, because it is invisible until the
|
|
17
|
+
* restore.
|
|
18
|
+
*
|
|
19
|
+
* `backup()` runs SQLite's own online backup: it reads through the same page
|
|
20
|
+
* cache and WAL a reader would, restarts itself if a writer changes the source
|
|
21
|
+
* mid-copy, and lands a self-contained, checkpointed file. The destination is
|
|
22
|
+
* complete at whatever instant the copy finished, and live writers are never
|
|
23
|
+
* blocked.
|
|
24
|
+
*
|
|
25
|
+
* ─── Why a second connection ─────────────────────────────────────────────────
|
|
26
|
+
*
|
|
27
|
+
* The obvious move is to reach through `ConnectionManager` for the handle the
|
|
28
|
+
* server already holds. It is the wrong move: those handles are role-branded
|
|
29
|
+
* (01 §3's privilege model), pooled, and owned by request-scoped code, and a
|
|
30
|
+
* backup that borrowed one would serialize itself behind whatever CRUD is in
|
|
31
|
+
* flight — the exact locking §9 says not to do. A second connection to a WAL
|
|
32
|
+
* database is the normal, supported thing (WAL exists so readers and a writer
|
|
33
|
+
* coexist), so this module opens its own, READONLY, and closes it. `readonly`
|
|
34
|
+
* is belt and braces: a backup is the one operation in the product with no
|
|
35
|
+
* reason whatsoever to be able to write to a source database, and
|
|
36
|
+
* `fileMustExist` keeps a stale DSN from CREATING an empty database and
|
|
37
|
+
* cheerfully backing it up.
|
|
38
|
+
*/
|
|
39
|
+
import { type DsnCrypto, type MetaDb } from '@adminium/meta';
|
|
40
|
+
/** A local SQLite source DB found in `adminium_connections`, ready to snapshot. */
|
|
41
|
+
export interface LocalDatabaseSource {
|
|
42
|
+
connectionId: string;
|
|
43
|
+
slug: string;
|
|
44
|
+
/** Absolute path of the live file. */
|
|
45
|
+
path: string;
|
|
46
|
+
}
|
|
47
|
+
/** A source DB the backup lists but never dumps (§9's "external"). */
|
|
48
|
+
export interface ExternalDatabaseSource {
|
|
49
|
+
connectionId: string;
|
|
50
|
+
slug: string;
|
|
51
|
+
engine: string;
|
|
52
|
+
}
|
|
53
|
+
export interface DiscoveredSources {
|
|
54
|
+
local: LocalDatabaseSource[];
|
|
55
|
+
external: ExternalDatabaseSource[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Split every configured connection into "we dump this" and "we list this".
|
|
59
|
+
*
|
|
60
|
+
* §9's rule is about the ENGINE, not about reachability: a Postgres on
|
|
61
|
+
* `localhost` is still external (we do not have a byte-level snapshot mechanism
|
|
62
|
+
* for it, and `pg_dump` is not a thing this process may assume exists), and a
|
|
63
|
+
* SQLite file on a network share is still local. Anything that is neither — a
|
|
64
|
+
* `sqlite:` connection whose DSN is `:memory:` or relative — is listed as
|
|
65
|
+
* external too, which is the honest answer: the manifest says the connection
|
|
66
|
+
* existed and says its bytes are not in this archive.
|
|
67
|
+
*/
|
|
68
|
+
export declare function discoverSources(meta: MetaDb, crypto: DsnCrypto): Promise<DiscoveredSources>;
|
|
69
|
+
/**
|
|
70
|
+
* Snapshot `sourcePath` to `destPath` with SQLite's online backup.
|
|
71
|
+
*
|
|
72
|
+
* Awaited rather than fire-and-forget: better-sqlite3's `backup()` returns a
|
|
73
|
+
* promise that resolves when `remainingPages` hits 0, and a caller that hashed
|
|
74
|
+
* the destination without waiting would hash a partial file and write a checksum
|
|
75
|
+
* for a database that does not exist yet.
|
|
76
|
+
*/
|
|
77
|
+
export declare function snapshotSqliteFile(sourcePath: string, destPath: string): Promise<void>;
|
|
78
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/backup/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAMH,OAAO,EAAoC,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK/F,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACpC;AAqBD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAkC5B;AAwBD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5F"}
|