@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,33 @@
|
|
|
1
|
+
import { isLoopbackPeer } from '../../auth/desktop-session.js';
|
|
2
|
+
import { readLanShareStatus } from '../../desktop/lan-share.js';
|
|
3
|
+
import { AppError } from '../../errors.js';
|
|
4
|
+
import { PERMISSIONS } from '../../rbac/permissions.js';
|
|
5
|
+
import { desktopLanShareReply } from './schema.js';
|
|
6
|
+
export function desktopLanRoutes(deps) {
|
|
7
|
+
return async (app) => {
|
|
8
|
+
app.get('/desktop/lan-share', {
|
|
9
|
+
// Gate 3. `rbac.require` carries `requireAuth` semantics: an anonymous
|
|
10
|
+
// request has no principal to resolve and is refused before the handler.
|
|
11
|
+
preHandler: [app.requireMeta, app.rbac.require(PERMISSIONS.settingsManage)],
|
|
12
|
+
schema: { response: { 200: desktopLanShareReply } },
|
|
13
|
+
}, async (request) => {
|
|
14
|
+
// Gate 2, before any work: a LAN peer learns nothing here, not even
|
|
15
|
+
// whether the question was expensive to answer.
|
|
16
|
+
if (!isLoopbackPeer(request.raw.socket)) {
|
|
17
|
+
throw new AppError(403, 'FORBIDDEN', 'The network-sharing panel is only available on the computer Adminium is running on.');
|
|
18
|
+
}
|
|
19
|
+
// `deps.now?.()` — an absent clock passes `undefined`, which takes the
|
|
20
|
+
// parameter's `Date.now()` default rather than pinning time to the boot.
|
|
21
|
+
const status = await readLanShareStatus(deps.env, deps.meta, deps.now?.());
|
|
22
|
+
return {
|
|
23
|
+
data: {
|
|
24
|
+
active: status.active,
|
|
25
|
+
host: deps.env.HOST,
|
|
26
|
+
lanSessions: status.lanSessions,
|
|
27
|
+
otherUsers: status.otherUsers,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/desktop-lan/index.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAe9E,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,GAAG,CACL,oBAAoB,EACpB;YACE,uEAAuE;YACvE,yEAAyE;YACzE,UAAU,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC3E,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE;SACpD,EACD,KAAK,EAAE,OAAO,EAAiC,EAAE;YAC/C,oEAAoE;YACpE,gDAAgD;YAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,QAAQ,CAChB,GAAG,EACH,WAAW,EACX,qFAAqF,CACtF,CAAC;YACJ,CAAC;YAED,uEAAuE;YACvE,yEAAyE;YACzE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAE3E,OAAO;gBACL,IAAI,EAAE;oBACJ,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B;aACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire schema for `GET /api/v1/desktop/lan-share` (11-electron.md §8.3).
|
|
3
|
+
*
|
|
4
|
+
* READ-ONLY, and there is no sibling POST. Turning sharing on is not something
|
|
5
|
+
* this process can do: §8.3's mechanics are "flipping the toggle updates
|
|
6
|
+
* `config.lanShare` … and gracefully restarts the utilityProcess with
|
|
7
|
+
* `ADMINIUM_HOST=0.0.0.0`", and both halves belong to the main process —
|
|
8
|
+
* `config.json` is its file (§2.3) and the utilityProcess is its child. A server
|
|
9
|
+
* route that "enabled LAN share" could at best write a value nobody reads and at
|
|
10
|
+
* worst ask this process to re-listen on a socket its supervisor knows nothing
|
|
11
|
+
* about. The SPA writes the toggle through §4's `setConfig` bridge; this route
|
|
12
|
+
* answers only the two questions the bridge cannot.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
export declare const desktopLanShareReply: z.ZodObject<{
|
|
16
|
+
data: z.ZodObject<{
|
|
17
|
+
active: z.ZodBoolean;
|
|
18
|
+
host: z.ZodString;
|
|
19
|
+
lanSessions: z.ZodNumber;
|
|
20
|
+
otherUsers: z.ZodNumber;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export type DesktopLanShareReply = z.infer<typeof desktopLanShareReply>;
|
|
24
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-lan/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB;;;;;;;iBAwB/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire schema for `GET /api/v1/desktop/lan-share` (11-electron.md §8.3).
|
|
3
|
+
*
|
|
4
|
+
* READ-ONLY, and there is no sibling POST. Turning sharing on is not something
|
|
5
|
+
* this process can do: §8.3's mechanics are "flipping the toggle updates
|
|
6
|
+
* `config.lanShare` … and gracefully restarts the utilityProcess with
|
|
7
|
+
* `ADMINIUM_HOST=0.0.0.0`", and both halves belong to the main process —
|
|
8
|
+
* `config.json` is its file (§2.3) and the utilityProcess is its child. A server
|
|
9
|
+
* route that "enabled LAN share" could at best write a value nobody reads and at
|
|
10
|
+
* worst ask this process to re-listen on a socket its supervisor knows nothing
|
|
11
|
+
* about. The SPA writes the toggle through §4's `setConfig` bridge; this route
|
|
12
|
+
* answers only the two questions the bridge cannot.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
export const desktopLanShareReply = z.object({
|
|
16
|
+
data: z.object({
|
|
17
|
+
/**
|
|
18
|
+
* Is this process ACTUALLY bound to every interface right now?
|
|
19
|
+
*
|
|
20
|
+
* Deliberately not named `enabled`: `config.lanShare.enabled` is the user's
|
|
21
|
+
* intent and this is the state of the socket. They differ for a whole server
|
|
22
|
+
* lifetime after a toggle that has not been applied yet, and the panel needs
|
|
23
|
+
* to show what is true, not what was asked for.
|
|
24
|
+
*/
|
|
25
|
+
active: z.boolean(),
|
|
26
|
+
/** The bind address, so the panel can say something specific when they disagree. */
|
|
27
|
+
host: z.string(),
|
|
28
|
+
/** Sessions held right now by a peer that is not this machine (§8.3). */
|
|
29
|
+
lanSessions: z.number().int().nonnegative(),
|
|
30
|
+
/**
|
|
31
|
+
* Active non-super-admin users — §8.3's precondition ("at least one
|
|
32
|
+
* non-super-admin user exists *or* the admin acknowledges they'll invite
|
|
33
|
+
* users next"). A count and not a boolean: the panel says "2 people can sign
|
|
34
|
+
* in", which is the sentence that makes the precondition make sense, and a
|
|
35
|
+
* bare `true` cannot be rendered as one.
|
|
36
|
+
*/
|
|
37
|
+
otherUsers: z.number().int().nonnegative(),
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/routes/desktop-lan/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb;;;;;;;WAOG;QACH,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;QACnB,oFAAoF;QACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,yEAAyE;QACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;QAC3C;;;;;;WAMG;QACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;KAC3C,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a local SQLite database and register it (11-electron.md §6 step 2
|
|
3
|
+
* card 1, task 11-T07).
|
|
4
|
+
*
|
|
5
|
+
* §6: "Name → slug → creates `<dataDir>/databases/<slug>.sqlite` (WAL, §9).
|
|
6
|
+
* Sub-choice: *Blank* … or *From a schema file* … translated to SQLite DDL and
|
|
7
|
+
* applied; includes the 'Auto-generate placeholder entries' toggle."
|
|
8
|
+
*
|
|
9
|
+
* ─── WHY THE SERVER CREATES THE FILE AT ALL ──────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* `adapter-sqlite` opens every handle with `fileMustExist: true` for anything but
|
|
12
|
+
* `:memory:` (`packages/adapter-sqlite/src/index.ts`), which is correct — an
|
|
13
|
+
* adapter that creates a database when it fails to find one turns a typo in a DSN
|
|
14
|
+
* into a silently empty install. So `POST /connections` with
|
|
15
|
+
* `sqlite:/…/new.sqlite` cannot be the implementation of "create a new local
|
|
16
|
+
* database": it fails, and it fails for a good reason. This route is where the
|
|
17
|
+
* file legitimately comes into existence, and it is desktop-only for the same
|
|
18
|
+
* reason `desktop-demo` is — §2.1's "the server is the only data owner" holds,
|
|
19
|
+
* and `<dataDir>` only means something under the shell.
|
|
20
|
+
*
|
|
21
|
+
* ─── WHY `better-sqlite3` DIRECTLY AND NOT THROUGH THE ADAPTER ───────────────
|
|
22
|
+
*
|
|
23
|
+
* Same answer as `desktop-demo/handlers.ts`: the adapter's contract is
|
|
24
|
+
* introspect/query/mutate over an EXISTING database, and there is no `execute
|
|
25
|
+
* arbitrary DDL` method on it — deliberately, since that method is the one every
|
|
26
|
+
* SQL-injection review starts at. Creating a file and running a CREATE TABLE
|
|
27
|
+
* script is a different act from serving a connection, so it is spelled
|
|
28
|
+
* differently. `@adminium/adapter-sqlite`'s own pragma helper is reused rather
|
|
29
|
+
* than a second copy of §9's four lines (see `applyDataPragmas` below).
|
|
30
|
+
*/
|
|
31
|
+
import { type DatabaseModel, type ImportFormat } from '@adminium/engine';
|
|
32
|
+
import type { ConnectionManager } from '../../connections/manager.js';
|
|
33
|
+
import { type DdlWarning } from './sqlite-ddl.js';
|
|
34
|
+
/** §6: `<dataDir>/databases/<slug>.sqlite`. Shared with `desktop-demo`'s copy. */
|
|
35
|
+
export declare const LOCAL_DATABASE_DIR = "databases";
|
|
36
|
+
/**
|
|
37
|
+
* Name → slug.
|
|
38
|
+
*
|
|
39
|
+
* The output alphabet is `[a-z0-9-]`, which is what makes {@link localDatabaseFile}
|
|
40
|
+
* safe by construction rather than by a path check: `../../etc/passwd`,
|
|
41
|
+
* `C:\evil`, and a NUL byte all reduce to hyphens, so no input can escape
|
|
42
|
+
* `<dataDir>/databases/`. That is the SECOND line of defence — the name is also
|
|
43
|
+
* length-capped by the Zod body — but it is the one that does not depend on
|
|
44
|
+
* anybody keeping a validator in sync with a path join.
|
|
45
|
+
*/
|
|
46
|
+
export declare function slugFor(name: string): string;
|
|
47
|
+
/** `<dataDir>/databases/<slug>.sqlite`, absolute. */
|
|
48
|
+
export declare function localDatabaseFile(dataDir: string, slug: string): string;
|
|
49
|
+
/** §6: "registered in `adminium_connections` as `sqlite:<absolute path>`". */
|
|
50
|
+
export declare function localDsn(file: string): string;
|
|
51
|
+
export interface LocalDatabaseResult {
|
|
52
|
+
connectionId: string;
|
|
53
|
+
name: string;
|
|
54
|
+
slug: string;
|
|
55
|
+
file: string;
|
|
56
|
+
tables: string[];
|
|
57
|
+
rows: Record<string, number>;
|
|
58
|
+
warnings: DdlWarning[];
|
|
59
|
+
}
|
|
60
|
+
export interface LocalDatabaseDeps {
|
|
61
|
+
manager: ConnectionManager;
|
|
62
|
+
/** `ADMINIUM_DATA_DIR` — the database lands under it (§2.2/§6). */
|
|
63
|
+
dataDir: string;
|
|
64
|
+
/**
|
|
65
|
+
* Parse a schema file into the engine IR. Production passes
|
|
66
|
+
* `routes/schema-import`'s `parseSchemaFile` — the SAME resolver
|
|
67
|
+
* `POST /schema-import/parse` uses, so the eight formats behave identically on
|
|
68
|
+
* both paths and there is no second answer to "is this a valid Prisma schema".
|
|
69
|
+
*/
|
|
70
|
+
parseSchema: (input: {
|
|
71
|
+
content: string;
|
|
72
|
+
format: ImportFormat | undefined;
|
|
73
|
+
fileName: string | undefined;
|
|
74
|
+
}) => Promise<{
|
|
75
|
+
model: DatabaseModel;
|
|
76
|
+
warnings: string[];
|
|
77
|
+
}>;
|
|
78
|
+
/** Injected for the suite; see `placeholder.ts`. */
|
|
79
|
+
now?: (() => Date) | undefined;
|
|
80
|
+
}
|
|
81
|
+
export interface LocalDatabaseInput {
|
|
82
|
+
name: string;
|
|
83
|
+
schemaFile: {
|
|
84
|
+
content: string;
|
|
85
|
+
format: ImportFormat | undefined;
|
|
86
|
+
fileName: string | undefined;
|
|
87
|
+
} | undefined;
|
|
88
|
+
placeholderRows: boolean;
|
|
89
|
+
actorId: string | null;
|
|
90
|
+
}
|
|
91
|
+
export declare function createLocalDatabaseHandler(deps: LocalDatabaseDeps, input: LocalDatabaseInput): Promise<LocalDatabaseResult>;
|
|
92
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-local-db/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAG9G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG1F,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc5C;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,WAAW,EAAE,CAAC,KAAK,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;QACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;KAC9B,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5D,oDAAoD;IACpD,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAC5G,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAoBD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CA4G9B"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a local SQLite database and register it (11-electron.md §6 step 2
|
|
3
|
+
* card 1, task 11-T07).
|
|
4
|
+
*
|
|
5
|
+
* §6: "Name → slug → creates `<dataDir>/databases/<slug>.sqlite` (WAL, §9).
|
|
6
|
+
* Sub-choice: *Blank* … or *From a schema file* … translated to SQLite DDL and
|
|
7
|
+
* applied; includes the 'Auto-generate placeholder entries' toggle."
|
|
8
|
+
*
|
|
9
|
+
* ─── WHY THE SERVER CREATES THE FILE AT ALL ──────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* `adapter-sqlite` opens every handle with `fileMustExist: true` for anything but
|
|
12
|
+
* `:memory:` (`packages/adapter-sqlite/src/index.ts`), which is correct — an
|
|
13
|
+
* adapter that creates a database when it fails to find one turns a typo in a DSN
|
|
14
|
+
* into a silently empty install. So `POST /connections` with
|
|
15
|
+
* `sqlite:/…/new.sqlite` cannot be the implementation of "create a new local
|
|
16
|
+
* database": it fails, and it fails for a good reason. This route is where the
|
|
17
|
+
* file legitimately comes into existence, and it is desktop-only for the same
|
|
18
|
+
* reason `desktop-demo` is — §2.1's "the server is the only data owner" holds,
|
|
19
|
+
* and `<dataDir>` only means something under the shell.
|
|
20
|
+
*
|
|
21
|
+
* ─── WHY `better-sqlite3` DIRECTLY AND NOT THROUGH THE ADAPTER ───────────────
|
|
22
|
+
*
|
|
23
|
+
* Same answer as `desktop-demo/handlers.ts`: the adapter's contract is
|
|
24
|
+
* introspect/query/mutate over an EXISTING database, and there is no `execute
|
|
25
|
+
* arbitrary DDL` method on it — deliberately, since that method is the one every
|
|
26
|
+
* SQL-injection review starts at. Creating a file and running a CREATE TABLE
|
|
27
|
+
* script is a different act from serving a connection, so it is spelled
|
|
28
|
+
* differently. `@adminium/adapter-sqlite`'s own pragma helper is reused rather
|
|
29
|
+
* than a second copy of §9's four lines (see `applyDataPragmas` below).
|
|
30
|
+
*/
|
|
31
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
32
|
+
import { mkdir } from 'node:fs/promises';
|
|
33
|
+
import { existsSync } from 'node:fs';
|
|
34
|
+
import { dirname, join, resolve } from 'node:path';
|
|
35
|
+
import { parseDatabaseModel } from '@adminium/engine';
|
|
36
|
+
import { AppError, ValidationFailedError } from '../../errors.js';
|
|
37
|
+
import { emitSqliteDdl, orderTables, quoteIdent } from './sqlite-ddl.js';
|
|
38
|
+
import { planPlaceholderRows } from './placeholder.js';
|
|
39
|
+
/** §6: `<dataDir>/databases/<slug>.sqlite`. Shared with `desktop-demo`'s copy. */
|
|
40
|
+
export const LOCAL_DATABASE_DIR = 'databases';
|
|
41
|
+
/**
|
|
42
|
+
* Name → slug.
|
|
43
|
+
*
|
|
44
|
+
* The output alphabet is `[a-z0-9-]`, which is what makes {@link localDatabaseFile}
|
|
45
|
+
* safe by construction rather than by a path check: `../../etc/passwd`,
|
|
46
|
+
* `C:\evil`, and a NUL byte all reduce to hyphens, so no input can escape
|
|
47
|
+
* `<dataDir>/databases/`. That is the SECOND line of defence — the name is also
|
|
48
|
+
* length-capped by the Zod body — but it is the one that does not depend on
|
|
49
|
+
* anybody keeping a validator in sync with a path join.
|
|
50
|
+
*/
|
|
51
|
+
export function slugFor(name) {
|
|
52
|
+
const slug = name
|
|
53
|
+
.normalize('NFKD')
|
|
54
|
+
// Strip combining marks so `Café` → `cafe` rather than `caf-`.
|
|
55
|
+
.replace(/[̀-ͯ]/g, '')
|
|
56
|
+
.toLowerCase()
|
|
57
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
58
|
+
.replace(/^-+|-+$/g, '')
|
|
59
|
+
.slice(0, 48)
|
|
60
|
+
.replace(/-+$/g, '');
|
|
61
|
+
// A name of only non-Latin characters (`日本語`, `العربية`) legitimately slugs
|
|
62
|
+
// to nothing. Rejecting it would make the wizard's first field refuse a
|
|
63
|
+
// perfectly good database name in three of the eight locales this app ships.
|
|
64
|
+
return slug.length > 0 ? slug : 'database';
|
|
65
|
+
}
|
|
66
|
+
/** `<dataDir>/databases/<slug>.sqlite`, absolute. */
|
|
67
|
+
export function localDatabaseFile(dataDir, slug) {
|
|
68
|
+
return join(resolve(dataDir), LOCAL_DATABASE_DIR, `${slug}.sqlite`);
|
|
69
|
+
}
|
|
70
|
+
/** §6: "registered in `adminium_connections` as `sqlite:<absolute path>`". */
|
|
71
|
+
export function localDsn(file) {
|
|
72
|
+
return `sqlite:${file}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* §9's four pragmas, applied at creation so the file is WAL from its first byte.
|
|
76
|
+
*
|
|
77
|
+
* They are re-applied by `adapter-sqlite`'s data role on every open, which is
|
|
78
|
+
* what actually keeps them true — `journal_mode` is the only one that persists in
|
|
79
|
+
* the file header; `synchronous`, `foreign_keys` and `busy_timeout` are
|
|
80
|
+
* per-connection and reset to their defaults for anybody who opens the file
|
|
81
|
+
* without them. Setting them here is still not redundant: `foreign_keys = ON`
|
|
82
|
+
* governs THIS connection, the one that is about to run the placeholder INSERTs,
|
|
83
|
+
* and without it a dangling FK would be written silently instead of rejected.
|
|
84
|
+
*/
|
|
85
|
+
function applyCreationPragmas(db) {
|
|
86
|
+
db.pragma('journal_mode = WAL');
|
|
87
|
+
db.pragma('synchronous = NORMAL');
|
|
88
|
+
db.pragma('foreign_keys = ON');
|
|
89
|
+
db.pragma('busy_timeout = 5000');
|
|
90
|
+
}
|
|
91
|
+
export async function createLocalDatabaseHandler(deps, input) {
|
|
92
|
+
const slug = slugFor(input.name);
|
|
93
|
+
const file = localDatabaseFile(deps.dataDir, slug);
|
|
94
|
+
const dsn = localDsn(file);
|
|
95
|
+
// Two different conflicts, and collapsing them would be a lie in one
|
|
96
|
+
// direction or the other: a file already here is the user's data (never
|
|
97
|
+
// overwritten — §9's ethos is that the app moves data aside and never
|
|
98
|
+
// destroys it), while a connection already here is a naming collision.
|
|
99
|
+
if (existsSync(file)) {
|
|
100
|
+
throw new AppError(409, 'CONFLICT', `A database file named "${slug}.sqlite" already exists. Choose a different name, or open the existing file instead.`, { slug, file });
|
|
101
|
+
}
|
|
102
|
+
const clash = await findConnectionForDsn(deps.manager, dsn);
|
|
103
|
+
if (clash !== null) {
|
|
104
|
+
throw new AppError(409, 'CONFLICT', `A connection named "${input.name}" already points at this file.`, {
|
|
105
|
+
connectionId: clash,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const warnings = [];
|
|
109
|
+
let tables = [];
|
|
110
|
+
let rows = {};
|
|
111
|
+
await mkdir(dirname(file), { recursive: true });
|
|
112
|
+
// From here on the FILE EXISTS. Every failure below must remove it: a
|
|
113
|
+
// half-created database left on disk means the user's retry hits the 409
|
|
114
|
+
// above — a dead end reachable by one rejected CHECK constraint, with no
|
|
115
|
+
// affordance anywhere in the product to clear it.
|
|
116
|
+
let db;
|
|
117
|
+
try {
|
|
118
|
+
db = new BetterSqlite3(file);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new AppError(500, 'INTERNAL', `Could not create ${file}: ${messageOf(error)}`);
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
applyCreationPragmas(db);
|
|
125
|
+
if (input.schemaFile !== undefined) {
|
|
126
|
+
const parsed = await parseOrReject(deps, input.schemaFile);
|
|
127
|
+
// The PARSER's gaps come first because they happened first: a
|
|
128
|
+
// `CREATE VIEW` the SQL parser could not read never reaches the emitter,
|
|
129
|
+
// so `emitSqliteDdl` cannot know it existed. Only the two lists together
|
|
130
|
+
// describe what the user's file lost on the way to their database.
|
|
131
|
+
warnings.push(...parsed.warnings.map((message) => ({
|
|
132
|
+
code: 'source-not-translated',
|
|
133
|
+
message,
|
|
134
|
+
tableId: null,
|
|
135
|
+
})));
|
|
136
|
+
const ddl = emitSqliteDdl(parsed.model);
|
|
137
|
+
warnings.push(...ddl.warnings);
|
|
138
|
+
tables = ddl.tables;
|
|
139
|
+
applyDdl(db, ddl.statements);
|
|
140
|
+
if (input.placeholderRows) {
|
|
141
|
+
rows = seedPlaceholders(db, parsed.model, deps.now?.() ?? new Date());
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// §9: "`wal_checkpoint(TRUNCATE)` runs on server shutdown so `.sqlite` files
|
|
145
|
+
// are self-contained at rest." The same reasoning applies the moment this
|
|
146
|
+
// handle closes: the connection that opens the file next is a different
|
|
147
|
+
// process' handle in dev, and a user who backs up or copies the file
|
|
148
|
+
// seconds after the wizard created it should get all of it.
|
|
149
|
+
db.pragma('wal_checkpoint(TRUNCATE)');
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
db.close();
|
|
153
|
+
await removeQuietly(file);
|
|
154
|
+
if (error instanceof AppError)
|
|
155
|
+
throw error;
|
|
156
|
+
throw new AppError(500, 'INTERNAL', `Could not build ${slug}.sqlite: ${messageOf(error)}`);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
if (db.open)
|
|
160
|
+
db.close();
|
|
161
|
+
}
|
|
162
|
+
// The same probe `POST /connections` runs — see `desktop-demo/handlers.ts`,
|
|
163
|
+
// which explains why placement is asserted rather than assumed.
|
|
164
|
+
const summary = await deps.manager.testDsn('sqlite', dsn);
|
|
165
|
+
if (summary.ok)
|
|
166
|
+
deps.manager.enforceMetaPlacement(dsn, summary);
|
|
167
|
+
const connection = await deps.manager.connections.create({
|
|
168
|
+
name: input.name,
|
|
169
|
+
engine: 'sqlite',
|
|
170
|
+
sourceKind: 'dsn',
|
|
171
|
+
introspectDsn: dsn,
|
|
172
|
+
// One role — `POST /connections` stores null when both DSNs are the string.
|
|
173
|
+
dataDsn: null,
|
|
174
|
+
readOnly: summary.readOnly,
|
|
175
|
+
settings: {},
|
|
176
|
+
status: summary.ok ? 'connected' : 'error',
|
|
177
|
+
createdBy: input.actorId,
|
|
178
|
+
});
|
|
179
|
+
await deps.manager.connections.recordTestResult(connection.id, {
|
|
180
|
+
ok: summary.ok,
|
|
181
|
+
latencyMs: summary.latencyMs,
|
|
182
|
+
error: summary.error?.message ?? null,
|
|
183
|
+
readOnly: summary.readOnly,
|
|
184
|
+
});
|
|
185
|
+
return { connectionId: connection.id, name: connection.name, slug, file, tables, rows, warnings };
|
|
186
|
+
}
|
|
187
|
+
async function parseOrReject(deps, schemaFile) {
|
|
188
|
+
const parsed = await deps.parseSchema({
|
|
189
|
+
content: schemaFile.content,
|
|
190
|
+
format: schemaFile.format,
|
|
191
|
+
fileName: schemaFile.fileName,
|
|
192
|
+
});
|
|
193
|
+
// Re-validated even though `parseSchema` already did: this handler is a write
|
|
194
|
+
// boundary, and the injected parser is a seam a test can replace.
|
|
195
|
+
const model = parseDatabaseModel(parsed.model);
|
|
196
|
+
if (model.tables.length === 0) {
|
|
197
|
+
// Mirrors `POST /schema-import/parse`'s own rejection: a parse that yields
|
|
198
|
+
// zero tables is not a database, and creating an empty file for it would
|
|
199
|
+
// hand the user a "success" they then cannot explain.
|
|
200
|
+
throw new ValidationFailedError('The schema file contained no parseable tables.', {
|
|
201
|
+
reason: 'PARSE_FAILED',
|
|
202
|
+
info: { warnings: parsed.warnings },
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return { model, warnings: parsed.warnings };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Run the DDL as ONE transaction.
|
|
209
|
+
*
|
|
210
|
+
* SQLite is transactional for DDL (unlike MySQL), so a rejected statement rolls
|
|
211
|
+
* the whole script back and the database is empty rather than half a schema. The
|
|
212
|
+
* caller then deletes the file — but the transaction is what makes that deletion
|
|
213
|
+
* a tidy-up rather than the actual recovery.
|
|
214
|
+
*
|
|
215
|
+
* The statement text rides in the error message because there is nowhere else
|
|
216
|
+
* for the user to see it: the schema file is theirs, the failure is almost always
|
|
217
|
+
* in a `CHECK` expression written in another engine's dialect (`sqlite-ddl.ts`
|
|
218
|
+
* documents why those are passed through), and "SQLITE_ERROR: near ')'" without
|
|
219
|
+
* the statement is unactionable. It carries no row data — this database has none
|
|
220
|
+
* yet.
|
|
221
|
+
*/
|
|
222
|
+
function applyDdl(db, statements) {
|
|
223
|
+
const run = db.transaction((script) => {
|
|
224
|
+
for (const statement of script) {
|
|
225
|
+
try {
|
|
226
|
+
db.exec(statement);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
throw new ValidationFailedError(`The schema could not be applied to SQLite: ${messageOf(error)}`, { reason: 'DDL_FAILED', statement });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
run(statements);
|
|
234
|
+
}
|
|
235
|
+
/** Insert the planned placeholder rows; returns rows-written per table. */
|
|
236
|
+
function seedPlaceholders(db, model, now) {
|
|
237
|
+
const { order } = orderTables(model);
|
|
238
|
+
const prefixed = needsPrefix(order);
|
|
239
|
+
const nameOf = (table) => (prefixed ? `${table.schema}_${table.name}` : table.name);
|
|
240
|
+
const plan = planPlaceholderRows(model, order, nameOf, { now });
|
|
241
|
+
const written = {};
|
|
242
|
+
const run = db.transaction(() => {
|
|
243
|
+
for (const insert of plan.inserts) {
|
|
244
|
+
const columns = insert.columns.map(quoteIdent).join(', ');
|
|
245
|
+
const marks = insert.columns.map(() => '?').join(', ');
|
|
246
|
+
const statement = db.prepare(`INSERT INTO ${quoteIdent(insert.table)} (${columns}) VALUES (${marks})`);
|
|
247
|
+
for (const row of insert.rows)
|
|
248
|
+
statement.run(row);
|
|
249
|
+
written[insert.table] = insert.rows.length;
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
run();
|
|
253
|
+
return written;
|
|
254
|
+
}
|
|
255
|
+
/** Mirrors `sqlite-ddl.ts`'s rule — see `needsSchemaPrefix` there. */
|
|
256
|
+
function needsPrefix(tables) {
|
|
257
|
+
const seen = new Set();
|
|
258
|
+
for (const table of tables) {
|
|
259
|
+
if (seen.has(table.name))
|
|
260
|
+
return true;
|
|
261
|
+
seen.add(table.name);
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
/** The connection id whose introspect/data DSN is this file, if any. */
|
|
266
|
+
async function findConnectionForDsn(manager, dsn) {
|
|
267
|
+
for (const connection of await manager.connections.list()) {
|
|
268
|
+
if (connection.engine !== 'sqlite')
|
|
269
|
+
continue;
|
|
270
|
+
const dsns = await manager.connections.getDsns(connection.id);
|
|
271
|
+
if (dsns?.introspectDsn === dsn || dsns?.dataDsn === dsn)
|
|
272
|
+
return connection.id;
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Best-effort cleanup of a failed creation.
|
|
278
|
+
*
|
|
279
|
+
* Failure to delete is swallowed on purpose: the user is already getting the
|
|
280
|
+
* REAL error (the DDL that would not apply), and replacing it with "could not
|
|
281
|
+
* unlink a temp file" would hide the one message they can act on. WAL/SHM
|
|
282
|
+
* siblings go too — `close()` normally removes them, but a crashed handle can
|
|
283
|
+
* leave them behind, and an orphan `-wal` next to a recreated file of the same
|
|
284
|
+
* name is a corruption report waiting to happen.
|
|
285
|
+
*/
|
|
286
|
+
async function removeQuietly(file) {
|
|
287
|
+
const { rm } = await import('node:fs/promises');
|
|
288
|
+
for (const path of [file, `${file}-wal`, `${file}-shm`]) {
|
|
289
|
+
try {
|
|
290
|
+
await rm(path, { force: true });
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// see above
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function messageOf(error) {
|
|
298
|
+
return error instanceof Error ? error.message : String(error);
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/routes/desktop-local-db/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /api/v1/desktop/local-database` — 11-electron.md §6 step 2 card 1
|
|
3
|
+
* ("Create a new local database"), task 11-T07.
|
|
4
|
+
*
|
|
5
|
+
* ─── THE DESKTOP GATE ────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* EXISTENCE is the gate, exactly as it is for `desktop-demo` and §5's
|
|
8
|
+
* `auth/desktop-session.ts`: `compose.ts` registers this factory only when
|
|
9
|
+
* `ADMINIUM_RUNTIME=desktop`, so self-host and Docker do not have the route at
|
|
10
|
+
* all. That is not a formality here — the route's whole subject is
|
|
11
|
+
* `<dataDir>/databases/`, a directory that exists because the shell created it
|
|
12
|
+
* and passed `ADMINIUM_DATA_DIR` (§2.2). On a Docker deployment `<dataDir>` is a
|
|
13
|
+
* container path nobody can reach with a file dialog, so a "create a local
|
|
14
|
+
* database" button there would create a file the user can neither find, back up,
|
|
15
|
+
* nor delete.
|
|
16
|
+
*
|
|
17
|
+
* No loopback check, for `desktop-demo`'s reason: this creates a database and
|
|
18
|
+
* registers a connection — the same act `POST /connections` performs, from the
|
|
19
|
+
* same principal, under the same `system:connections:manage` grant. The §5 route
|
|
20
|
+
* is loopback-only because it mints a session with no password; this one does
|
|
21
|
+
* not.
|
|
22
|
+
*/
|
|
23
|
+
import type { FastifyPluginAsyncZod } from 'fastify-type-provider-zod';
|
|
24
|
+
import type { ConnectionManager } from '../../connections/manager.js';
|
|
25
|
+
import { type LocalDatabaseDeps } from './handlers.js';
|
|
26
|
+
export interface DesktopLocalDbRoutesDeps {
|
|
27
|
+
manager: ConnectionManager;
|
|
28
|
+
/** `ADMINIUM_DATA_DIR`. */
|
|
29
|
+
dataDir: string;
|
|
30
|
+
/**
|
|
31
|
+
* Test seams. Production omits both: the parser defaults to the one
|
|
32
|
+
* `POST /schema-import/parse` uses (so the eight formats cannot behave
|
|
33
|
+
* differently on the two paths), and the clock to `Date`.
|
|
34
|
+
*/
|
|
35
|
+
parseSchema?: LocalDatabaseDeps['parseSchema'] | undefined;
|
|
36
|
+
now?: (() => Date) | undefined;
|
|
37
|
+
}
|
|
38
|
+
export declare function desktopLocalDbRoutes(deps: DesktopLocalDbRoutesDeps): FastifyPluginAsyncZod;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-local-db/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAItE,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG7F,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IAC3D,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,qBAAqB,CAkE1F"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /api/v1/desktop/local-database` — 11-electron.md §6 step 2 card 1
|
|
3
|
+
* ("Create a new local database"), task 11-T07.
|
|
4
|
+
*
|
|
5
|
+
* ─── THE DESKTOP GATE ────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* EXISTENCE is the gate, exactly as it is for `desktop-demo` and §5's
|
|
8
|
+
* `auth/desktop-session.ts`: `compose.ts` registers this factory only when
|
|
9
|
+
* `ADMINIUM_RUNTIME=desktop`, so self-host and Docker do not have the route at
|
|
10
|
+
* all. That is not a formality here — the route's whole subject is
|
|
11
|
+
* `<dataDir>/databases/`, a directory that exists because the shell created it
|
|
12
|
+
* and passed `ADMINIUM_DATA_DIR` (§2.2). On a Docker deployment `<dataDir>` is a
|
|
13
|
+
* container path nobody can reach with a file dialog, so a "create a local
|
|
14
|
+
* database" button there would create a file the user can neither find, back up,
|
|
15
|
+
* nor delete.
|
|
16
|
+
*
|
|
17
|
+
* No loopback check, for `desktop-demo`'s reason: this creates a database and
|
|
18
|
+
* registers a connection — the same act `POST /connections` performs, from the
|
|
19
|
+
* same principal, under the same `system:connections:manage` grant. The §5 route
|
|
20
|
+
* is loopback-only because it mints a session with no password; this one does
|
|
21
|
+
* not.
|
|
22
|
+
*/
|
|
23
|
+
import { maskDsn } from '../../connections/dsn.js';
|
|
24
|
+
import { CONNECTIONS_MANAGE } from '../connections/index.js';
|
|
25
|
+
import { parseSchemaFileContent } from '../schema-import/index.js';
|
|
26
|
+
import { createLocalDatabaseHandler, localDsn } from './handlers.js';
|
|
27
|
+
import { desktopLocalDbBody, desktopLocalDbReply } from './schema.js';
|
|
28
|
+
export function desktopLocalDbRoutes(deps) {
|
|
29
|
+
return async (app) => {
|
|
30
|
+
app.post('/desktop/local-database', {
|
|
31
|
+
preHandler: app.rbac.require(CONNECTIONS_MANAGE),
|
|
32
|
+
schema: { body: desktopLocalDbBody, response: { 201: desktopLocalDbReply } },
|
|
33
|
+
}, async (request, reply) => {
|
|
34
|
+
const actorId = request.apiKeyPrincipal === null
|
|
35
|
+
? (request.user?.id ?? null)
|
|
36
|
+
: null;
|
|
37
|
+
const body = request.body;
|
|
38
|
+
const result = await createLocalDatabaseHandler({
|
|
39
|
+
manager: deps.manager,
|
|
40
|
+
dataDir: deps.dataDir,
|
|
41
|
+
parseSchema: deps.parseSchema ?? parseSchemaFileContent,
|
|
42
|
+
...(deps.now === undefined ? {} : { now: deps.now }),
|
|
43
|
+
}, {
|
|
44
|
+
name: body.name,
|
|
45
|
+
schemaFile: body.schemaFile === undefined
|
|
46
|
+
? undefined
|
|
47
|
+
: {
|
|
48
|
+
content: body.schemaFile.content,
|
|
49
|
+
format: body.schemaFile.format,
|
|
50
|
+
fileName: body.schemaFile.fileName,
|
|
51
|
+
},
|
|
52
|
+
placeholderRows: body.placeholderRows,
|
|
53
|
+
actorId,
|
|
54
|
+
});
|
|
55
|
+
// `connection.create`, for `desktop-demo`'s reason: the audit reader asks
|
|
56
|
+
// "where did this connection come from?", and the answer belongs in the
|
|
57
|
+
// action every other connection writes. The creation details ride in
|
|
58
|
+
// `changes`.
|
|
59
|
+
//
|
|
60
|
+
// `placeholderRows` is recorded because it is the one part of this
|
|
61
|
+
// request that WRITES ROWS. An operator looking at a table of sample data
|
|
62
|
+
// six months from now needs the audit log to say the app put it there.
|
|
63
|
+
await app.rbac.audit(request, {
|
|
64
|
+
category: 'connection',
|
|
65
|
+
action: 'connection.create',
|
|
66
|
+
connectionId: result.connectionId,
|
|
67
|
+
changes: {
|
|
68
|
+
after: {
|
|
69
|
+
name: result.name,
|
|
70
|
+
engine: 'sqlite',
|
|
71
|
+
dsnMasked: maskDsn(localDsn(result.file)),
|
|
72
|
+
source: 'desktop-local-database',
|
|
73
|
+
tables: result.tables.length,
|
|
74
|
+
placeholderRows: body.placeholderRows,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
reply.status(201);
|
|
79
|
+
return { data: result };
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|