@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,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
|