@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,236 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Environment validation (01-architecture.md §7.1). `loadEnv()` is called
|
|
4
|
+
* first in the boot sequence; on invalid input it prints a fail-fast table
|
|
5
|
+
* (variable | problem | hint) to stderr and throws — it never calls
|
|
6
|
+
* `process.exit` so callers (CLI, tests, Electron) decide how to die.
|
|
7
|
+
*/
|
|
8
|
+
export const LOG_LEVELS = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
|
|
9
|
+
/**
|
|
10
|
+
* The DEPLOYMENT WRAPPER this process is running under (01-architecture.md §4:
|
|
11
|
+
* "All four deployment modes run the identical `@adminium/server` process; only
|
|
12
|
+
* the wrapper differs"). Only the wrapper sets it, and only `desktop` means
|
|
13
|
+
* anything today: 11-electron.md §5 registers `POST /api/v1/auth/desktop-session`
|
|
14
|
+
* ONLY under that value, so a self-host or Docker instance does not expose the
|
|
15
|
+
* boot-token exchange at all — it has no route to attack, not merely a guarded
|
|
16
|
+
* one. Everything that is not the Electron shell is `self-host` (Docker and npx
|
|
17
|
+
* included); `cloud` joins when 12-cloud-platform.md lands.
|
|
18
|
+
*/
|
|
19
|
+
export const RUNTIMES = ['self-host', 'desktop'];
|
|
20
|
+
/** 11-electron.md §2.2 step 4: the per-boot token is 32 random bytes, hex. */
|
|
21
|
+
export const BOOT_TOKEN_HEX_LENGTH = 64;
|
|
22
|
+
const TRUTHY = new Set(['on', 'true', '1']);
|
|
23
|
+
const BOOLEANISH = ['on', 'off', 'true', 'false', '1', '0'];
|
|
24
|
+
/** Treat empty strings as unset so `FOO= adminium start` behaves like unset FOO. */
|
|
25
|
+
const emptyToUndefined = (value) => (value === '' ? undefined : value);
|
|
26
|
+
export const envSchema = z.object({
|
|
27
|
+
ADMINIUM_SECRET: z
|
|
28
|
+
.string({ error: 'is required' })
|
|
29
|
+
.min(16, 'must be at least 16 characters'),
|
|
30
|
+
PORT: z.preprocess(emptyToUndefined, z.coerce
|
|
31
|
+
.number({ error: 'must be a number' })
|
|
32
|
+
.int('must be an integer')
|
|
33
|
+
.min(1, 'must be between 1 and 65535')
|
|
34
|
+
.max(65535, 'must be between 1 and 65535')
|
|
35
|
+
.default(4600)),
|
|
36
|
+
HOST: z.preprocess(emptyToUndefined, z.string().default('0.0.0.0')),
|
|
37
|
+
DATABASE_URL: z.preprocess(emptyToUndefined, z.string().min(1).optional()),
|
|
38
|
+
ADMINIUM_META_URL: z.preprocess(emptyToUndefined, z.string().min(1).optional()),
|
|
39
|
+
ADMINIUM_DATA_DIR: z.preprocess(emptyToUndefined, z.string().default('./data')),
|
|
40
|
+
ADMINIUM_LOG_LEVEL: z.preprocess(emptyToUndefined, z.enum(LOG_LEVELS).default('info')),
|
|
41
|
+
/**
|
|
42
|
+
* ─── The desktop block (11-electron.md §2.2 step 5) ───────────────────────
|
|
43
|
+
*
|
|
44
|
+
* Set by `apps/desktop`'s `buildServerEnv` when it forks the utilityProcess,
|
|
45
|
+
* and by nothing else. They live HERE, in the schema every front door
|
|
46
|
+
* validates through, rather than being read off `process.env` at the point of
|
|
47
|
+
* use, because {@link Runtime} decides whether a route EXISTS: a value that
|
|
48
|
+
* changes the server's attack surface has to be parsed once, at the boot
|
|
49
|
+
* everything else already fails fast in, not sampled from ambient state deep
|
|
50
|
+
* inside a request handler where a typo reads as "not desktop" and silently
|
|
51
|
+
* ships a server with no auto-login (or, worse, the reverse).
|
|
52
|
+
*/
|
|
53
|
+
ADMINIUM_RUNTIME: z.preprocess(emptyToUndefined, z.enum(RUNTIMES).default('self-host')),
|
|
54
|
+
/**
|
|
55
|
+
* The per-boot token the desktop main process generated this launch (§2.2
|
|
56
|
+
* step 4), which `POST /api/v1/auth/desktop-session` exchanges for a session.
|
|
57
|
+
* NEVER persisted anywhere — it exists in the main process's memory, in this
|
|
58
|
+
* child's environment, and in the one URL that opens the window.
|
|
59
|
+
*
|
|
60
|
+
* Optional even under `ADMINIUM_RUNTIME=desktop`: absent ⇒ the route is not
|
|
61
|
+
* registered and the app lands on the normal login screen. That is a
|
|
62
|
+
* degradation, not a failure, so it must not be a boot error — the desktop
|
|
63
|
+
* shell's own schema (`apps/desktop/src/server/env.ts`) already requires the
|
|
64
|
+
* variable, which is the right place to fail a desktop boot over it.
|
|
65
|
+
*/
|
|
66
|
+
ADMINIUM_BOOT_TOKEN: z.preprocess(emptyToUndefined, z
|
|
67
|
+
.string()
|
|
68
|
+
.regex(new RegExp(`^[0-9a-fA-F]{${String(BOOT_TOKEN_HEX_LENGTH)}}$`), `must be ${String(BOOT_TOKEN_HEX_LENGTH)} hex characters (32 bytes)`)
|
|
69
|
+
.optional()),
|
|
70
|
+
/**
|
|
71
|
+
* The §5 "Skip login on this computer" answer, mirrored out of the desktop's
|
|
72
|
+
* `config.json` (§2.3 `singleUser`) on every boot.
|
|
73
|
+
*
|
|
74
|
+
* Tri-state, for the same reason `ADMINIUM_TELEMETRY` is: `config.json` is the
|
|
75
|
+
* source of truth for this value (§2.3 — the main process owns it, because the
|
|
76
|
+
* settings panel writes it through the preload bridge), and the env var is the
|
|
77
|
+
* only channel that reaches the child at boot. Set ⇒ compose mirrors it into
|
|
78
|
+
* `adminium_settings.desktop.singleUser`, which is what the route reads (§5).
|
|
79
|
+
* Unset ⇒ NOTHING is written and the stored value stands, so a wrapper that
|
|
80
|
+
* has not wired the mirror cannot silently flip a user's answer.
|
|
81
|
+
*/
|
|
82
|
+
ADMINIUM_DESKTOP_SINGLE_USER: z.preprocess(emptyToUndefined, z
|
|
83
|
+
.enum(BOOLEANISH)
|
|
84
|
+
.optional()
|
|
85
|
+
.transform((value) => (value === undefined ? undefined : TRUTHY.has(value)))),
|
|
86
|
+
/**
|
|
87
|
+
* Absolute path to `demo-seed.mjs` — the §6 step 2 "Explore the demo database"
|
|
88
|
+
* seed script, which ships in `apps/desktop/resources/` (11-T08).
|
|
89
|
+
*
|
|
90
|
+
* The server cannot find this itself and must not try: the script's location is
|
|
91
|
+
* a fact about the SHELL's layout (`resources/demo/` in the repo, inside the
|
|
92
|
+
* app bundle once §10 packages it), and `@adminium/server` may not import
|
|
93
|
+
* `@adminium/desktop` to ask. So the shell states it, the same way it states
|
|
94
|
+
* the boot token — and, like the boot token, this being absent is a
|
|
95
|
+
* DEGRADATION rather than an error: `compose.ts` skips the route and the
|
|
96
|
+
* wizard's demo card has nothing to call, while every other first-run path
|
|
97
|
+
* still works. A missing demo must not cost you your app.
|
|
98
|
+
*
|
|
99
|
+
* Only meaningful when {@link Runtime} is `desktop`; compose requires both.
|
|
100
|
+
*/
|
|
101
|
+
ADMINIUM_DEMO_SEED_SCRIPT: z.preprocess(emptyToUndefined, z.string().min(1).optional()),
|
|
102
|
+
/**
|
|
103
|
+
* The telemetry OVERRIDE, and — unlike its siblings — deliberately tri-state:
|
|
104
|
+
* `true` / `false` / `undefined` (unset).
|
|
105
|
+
*
|
|
106
|
+
* `undefined` MUST survive parsing. The real gate is the `telemetry.enabled`
|
|
107
|
+
* setting, written by the first-run consent screen; an env var that collapsed
|
|
108
|
+
* "unset" to `false` could not be layered over it without silently vetoing
|
|
109
|
+
* every consenting instance. So: set ⇒ the environment wins outright (01 §7.2
|
|
110
|
+
* "environment always wins"); unset ⇒ the consent answer stands.
|
|
111
|
+
*
|
|
112
|
+
* It is layered at all because it was documented as the kill-switch
|
|
113
|
+
* (`self-hosting/telemetry.md`, `env-vars.md`) while being read by NOTHING —
|
|
114
|
+
* an org that put `ADMINIUM_TELEMETRY=off` in its compose file to enforce a
|
|
115
|
+
* no-phone-home policy had exactly no protection if any user later clicked
|
|
116
|
+
* "yes" on the consent screen. A documented control has to be a control.
|
|
117
|
+
*/
|
|
118
|
+
ADMINIUM_TELEMETRY: z.preprocess(emptyToUndefined, z
|
|
119
|
+
.enum(BOOLEANISH)
|
|
120
|
+
.optional()
|
|
121
|
+
.transform((value) => (value === undefined ? undefined : TRUTHY.has(value)))),
|
|
122
|
+
/**
|
|
123
|
+
* May this deployment use network-dependent features at all
|
|
124
|
+
* (11-electron.md §8.2 `networkFeaturesAllowed`)?
|
|
125
|
+
*
|
|
126
|
+
* READ THIS BEFORE USING IT: THIS IS A POLICY ANSWER, NOT A REACHABILITY
|
|
127
|
+
* ANSWER. It does not mean "the internet is up" and must never be rendered as
|
|
128
|
+
* if it did. The server cannot know whether the network is reachable without
|
|
129
|
+
* making an outbound call, and 11-electron.md §7 ("Offline is the default,
|
|
130
|
+
* network is the exception. Every network touchpoint … is explicit,
|
|
131
|
+
* user-visible, and individually disableable") is precisely the promise an
|
|
132
|
+
* unprompted reachability probe would break — the desktop offline smoke test
|
|
133
|
+
* fails the build over exactly that request. So the honest thing the server
|
|
134
|
+
* CAN report is the one it owns: whether the operator has permitted outbound
|
|
135
|
+
* features here. §8.2's webhooks row is written to match — those rows carry a
|
|
136
|
+
* "Requires internet" HINT rather than a claim, because nothing in this
|
|
137
|
+
* process is entitled to make the claim.
|
|
138
|
+
*
|
|
139
|
+
* Default `on`, because a self-host behind a normal internet connection is the
|
|
140
|
+
* common case and webhooks/OAuth are ordinary features there. `off` is the
|
|
141
|
+
* air-gap switch for the fleet admin who already reaches for
|
|
142
|
+
* `ADMINIUM_DISABLE_UPDATES=1` (§11) and `ADMINIUM_TELEMETRY=off`: it tells the
|
|
143
|
+
* SPA to stop offering what this network cannot do, instead of letting users
|
|
144
|
+
* discover it one timeout at a time.
|
|
145
|
+
*
|
|
146
|
+
* NOT tri-state, unlike `ADMINIUM_TELEMETRY`: there is no stored setting
|
|
147
|
+
* underneath for an unset value to defer to, so "unset" has exactly one
|
|
148
|
+
* possible meaning and a boolean says it without pretending otherwise.
|
|
149
|
+
*/
|
|
150
|
+
ADMINIUM_NETWORK_FEATURES: z.preprocess(emptyToUndefined, z
|
|
151
|
+
.enum(BOOLEANISH)
|
|
152
|
+
.optional()
|
|
153
|
+
.transform((value) => (value === undefined ? true : TRUTHY.has(value)))),
|
|
154
|
+
ADMINIUM_TRUST_PROXY: z.preprocess(emptyToUndefined, z
|
|
155
|
+
.enum(BOOLEANISH)
|
|
156
|
+
.optional()
|
|
157
|
+
.transform((value) => (value === undefined ? false : TRUTHY.has(value)))),
|
|
158
|
+
// CORS is off by default — the SPA is same-origin (08-server-api.md §7 item 4).
|
|
159
|
+
// A CSV of exact origins opts split deployments in; wildcard is rejected here
|
|
160
|
+
// because responses are credentialed (cookies).
|
|
161
|
+
ADMINIUM_CORS_ORIGINS: z.preprocess(emptyToUndefined, z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.transform((value, ctx) => {
|
|
165
|
+
if (value === undefined)
|
|
166
|
+
return undefined;
|
|
167
|
+
const origins = value
|
|
168
|
+
.split(',')
|
|
169
|
+
.map((origin) => origin.trim())
|
|
170
|
+
.filter((origin) => origin.length > 0);
|
|
171
|
+
if (origins.length === 0)
|
|
172
|
+
return undefined;
|
|
173
|
+
if (origins.includes('*')) {
|
|
174
|
+
ctx.addIssue({
|
|
175
|
+
code: 'custom',
|
|
176
|
+
message: 'wildcard origin is not allowed with credentialed requests',
|
|
177
|
+
});
|
|
178
|
+
return z.NEVER;
|
|
179
|
+
}
|
|
180
|
+
return origins;
|
|
181
|
+
})),
|
|
182
|
+
});
|
|
183
|
+
const ENV_HINTS = {
|
|
184
|
+
ADMINIUM_SECRET: 'set a random string of at least 16 characters, e.g. `openssl rand -hex 32`',
|
|
185
|
+
PORT: 'integer between 1 and 65535 (default 4600)',
|
|
186
|
+
HOST: 'bind address, e.g. 0.0.0.0 or 127.0.0.1',
|
|
187
|
+
DATABASE_URL: 'optional seed source-DB DSN, e.g. postgres://user:pass@host:5432/db',
|
|
188
|
+
ADMINIUM_META_URL: 'optional meta-store DSN: postgres://, mysql://, or sqlite:<path>',
|
|
189
|
+
ADMINIUM_DATA_DIR: 'writable directory for files, exports, and backups (default ./data)',
|
|
190
|
+
ADMINIUM_LOG_LEVEL: `one of ${LOG_LEVELS.join(', ')} (default info)`,
|
|
191
|
+
ADMINIUM_RUNTIME: `one of ${RUNTIMES.join(', ')} (default self-host; set to desktop only by the Electron shell)`,
|
|
192
|
+
ADMINIUM_BOOT_TOKEN: `${String(BOOT_TOKEN_HEX_LENGTH)} hex characters, generated per boot by the desktop shell`,
|
|
193
|
+
ADMINIUM_DESKTOP_SINGLE_USER: `one of ${BOOLEANISH.join(', ')} (desktop only; mirrors config.json's singleUser)`,
|
|
194
|
+
ADMINIUM_DEMO_SEED_SCRIPT: 'absolute path to the desktop shell’s demo-seed.mjs (desktop only; enables the first-run demo card)',
|
|
195
|
+
ADMINIUM_TELEMETRY: `one of ${BOOLEANISH.join(', ')} (default off)`,
|
|
196
|
+
ADMINIUM_NETWORK_FEATURES: `one of ${BOOLEANISH.join(', ')} (default on; set off on air-gapped installs so the UI stops offering webhooks/OAuth)`,
|
|
197
|
+
ADMINIUM_TRUST_PROXY: `one of ${BOOLEANISH.join(', ')} (default off; enable behind Caddy/TLS)`,
|
|
198
|
+
ADMINIUM_CORS_ORIGINS: 'CSV of exact origins for split deployments, e.g. https://admin.acme.io — no wildcard',
|
|
199
|
+
};
|
|
200
|
+
export class EnvValidationError extends Error {
|
|
201
|
+
name = 'EnvValidationError';
|
|
202
|
+
issues;
|
|
203
|
+
table;
|
|
204
|
+
constructor(issues, table) {
|
|
205
|
+
super(`invalid environment configuration (${String(issues.length)} problem(s)):\n${table}`);
|
|
206
|
+
this.issues = issues;
|
|
207
|
+
this.table = table;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Renders the fail-fast `variable | problem | hint` table. */
|
|
211
|
+
export function formatEnvErrorTable(issues) {
|
|
212
|
+
const header = ['variable', 'problem', 'hint'];
|
|
213
|
+
const rows = issues.map((issue) => {
|
|
214
|
+
const variable = issue.path.length > 0 ? issue.path.map(String).join('.') : '(env)';
|
|
215
|
+
return [variable, issue.message, ENV_HINTS[variable] ?? '—'];
|
|
216
|
+
});
|
|
217
|
+
const all = [header, ...rows];
|
|
218
|
+
const widths = header.map((_, col) => Math.max(...all.map((row) => (row[col] ?? '').length)));
|
|
219
|
+
const line = (row) => `| ${row.map((cell, col) => cell.padEnd(widths[col] ?? 0)).join(' | ')} |`;
|
|
220
|
+
const separator = `|${widths.map((w) => '-'.repeat(w + 2)).join('|')}|`;
|
|
221
|
+
return [line(header), separator, ...rows.map(line)].join('\n');
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Parses and validates the process environment. On failure, prints the
|
|
225
|
+
* problem table to stderr and throws `EnvValidationError`.
|
|
226
|
+
*/
|
|
227
|
+
export function loadEnv(env = process.env, stderr = process.stderr) {
|
|
228
|
+
const result = envSchema.safeParse(env);
|
|
229
|
+
if (!result.success) {
|
|
230
|
+
const table = formatEnvErrorTable(result.error.issues);
|
|
231
|
+
stderr.write(`Adminium failed to start — invalid environment configuration:\n\n${table}\n`);
|
|
232
|
+
throw new EnvValidationError(result.error.issues, table);
|
|
233
|
+
}
|
|
234
|
+
return result.data;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const ENC_TOKEN_PREFIX = "enc:v1:";
|
|
2
|
+
export declare class SecretFormatError extends Error {
|
|
3
|
+
readonly name = "SecretFormatError";
|
|
4
|
+
}
|
|
5
|
+
export declare class SecretIntegrityError extends Error {
|
|
6
|
+
readonly name = "SecretIntegrityError";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Derives a 32-byte key from the master secret via HKDF-SHA256. `info`
|
|
10
|
+
* scopes the key to a purpose so encryption, HMAC, and CSRF keys never
|
|
11
|
+
* coincide even for the same secret + salt.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deriveKey(secret: string, salt: string | Uint8Array, info?: string): Buffer;
|
|
14
|
+
/** Encrypts a UTF-8 string to an `enc:v1:` token with a fresh random IV. */
|
|
15
|
+
export declare function encryptSecret(plaintext: string, key: Uint8Array): string;
|
|
16
|
+
/**
|
|
17
|
+
* Decrypts an `enc:v1:` token. Throws `SecretFormatError` on malformed
|
|
18
|
+
* tokens and `SecretIntegrityError` when the GCM tag does not verify
|
|
19
|
+
* (tampered payload or wrong key).
|
|
20
|
+
*/
|
|
21
|
+
export declare function decryptSecret(token: string, key: Uint8Array): string;
|
|
22
|
+
/** True when `value` looks like an `enc:v1:` token (format check only). */
|
|
23
|
+
export declare function isEncryptedSecret(value: string): boolean;
|
|
24
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/config/secrets.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAkB,IAAI,uBAAuB;CAC9C;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAkB,IAAI,0BAA0B;CACjD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,SAAiB,GAAG,MAAM,CAKlG;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAoBpE;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, hkdfSync, randomBytes } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Secret handling (01-architecture.md §7.1): `ADMINIUM_SECRET` is the master
|
|
4
|
+
* secret; HKDF-SHA256 derives purpose-scoped keys (DSN/LLM-key encryption at
|
|
5
|
+
* rest, session-token HMAC, CSRF). Values at rest are AES-256-GCM tokens of
|
|
6
|
+
* the form `enc:v1:<base64(iv|tag|ciphertext)>`.
|
|
7
|
+
*/
|
|
8
|
+
const KEY_BYTES = 32;
|
|
9
|
+
const IV_BYTES = 12;
|
|
10
|
+
const TAG_BYTES = 16;
|
|
11
|
+
export const ENC_TOKEN_PREFIX = 'enc:v1:';
|
|
12
|
+
export class SecretFormatError extends Error {
|
|
13
|
+
name = 'SecretFormatError';
|
|
14
|
+
}
|
|
15
|
+
export class SecretIntegrityError extends Error {
|
|
16
|
+
name = 'SecretIntegrityError';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Derives a 32-byte key from the master secret via HKDF-SHA256. `info`
|
|
20
|
+
* scopes the key to a purpose so encryption, HMAC, and CSRF keys never
|
|
21
|
+
* coincide even for the same secret + salt.
|
|
22
|
+
*/
|
|
23
|
+
export function deriveKey(secret, salt, info = 'adminium:enc') {
|
|
24
|
+
if (secret.length === 0) {
|
|
25
|
+
throw new SecretFormatError('cannot derive a key from an empty secret');
|
|
26
|
+
}
|
|
27
|
+
return Buffer.from(hkdfSync('sha256', secret, salt, info, KEY_BYTES));
|
|
28
|
+
}
|
|
29
|
+
/** Encrypts a UTF-8 string to an `enc:v1:` token with a fresh random IV. */
|
|
30
|
+
export function encryptSecret(plaintext, key) {
|
|
31
|
+
assertKeyLength(key);
|
|
32
|
+
const iv = randomBytes(IV_BYTES);
|
|
33
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
34
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
35
|
+
const tag = cipher.getAuthTag();
|
|
36
|
+
return ENC_TOKEN_PREFIX + Buffer.concat([iv, tag, ciphertext]).toString('base64');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Decrypts an `enc:v1:` token. Throws `SecretFormatError` on malformed
|
|
40
|
+
* tokens and `SecretIntegrityError` when the GCM tag does not verify
|
|
41
|
+
* (tampered payload or wrong key).
|
|
42
|
+
*/
|
|
43
|
+
export function decryptSecret(token, key) {
|
|
44
|
+
assertKeyLength(key);
|
|
45
|
+
if (!token.startsWith(ENC_TOKEN_PREFIX)) {
|
|
46
|
+
throw new SecretFormatError(`expected an "${ENC_TOKEN_PREFIX}" token`);
|
|
47
|
+
}
|
|
48
|
+
const raw = Buffer.from(token.slice(ENC_TOKEN_PREFIX.length), 'base64');
|
|
49
|
+
// empty plaintext is legal: GCM yields zero ciphertext bytes, the tag still authenticates it
|
|
50
|
+
if (raw.length < IV_BYTES + TAG_BYTES) {
|
|
51
|
+
throw new SecretFormatError('encrypted token payload is too short');
|
|
52
|
+
}
|
|
53
|
+
const iv = raw.subarray(0, IV_BYTES);
|
|
54
|
+
const tag = raw.subarray(IV_BYTES, IV_BYTES + TAG_BYTES);
|
|
55
|
+
const ciphertext = raw.subarray(IV_BYTES + TAG_BYTES);
|
|
56
|
+
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
57
|
+
decipher.setAuthTag(tag);
|
|
58
|
+
try {
|
|
59
|
+
return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new SecretIntegrityError('decryption failed — token was tampered with or the key is wrong');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** True when `value` looks like an `enc:v1:` token (format check only). */
|
|
66
|
+
export function isEncryptedSecret(value) {
|
|
67
|
+
return value.startsWith(ENC_TOKEN_PREFIX);
|
|
68
|
+
}
|
|
69
|
+
function assertKeyLength(key) {
|
|
70
|
+
if (key.byteLength !== KEY_BYTES) {
|
|
71
|
+
throw new SecretFormatError(`key must be exactly ${String(KEY_BYTES)} bytes (use deriveKey)`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/config/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSN encryption closures (01-architecture.md §3/§7.1): AES-256-GCM with an
|
|
3
|
+
* HKDF key derived from `ADMINIUM_SECRET`, purpose-scoped so DSN, TOTP, and
|
|
4
|
+
* session keys never coincide. `@adminium/meta` receives only these
|
|
5
|
+
* closures — the meta store stays crypto-agnostic.
|
|
6
|
+
*/
|
|
7
|
+
import type { DsnCrypto } from '@adminium/meta';
|
|
8
|
+
export declare function dsnCryptoFromSecret(masterSecret: string): DsnCrypto;
|
|
9
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/connections/crypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAMnE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSN encryption closures (01-architecture.md §3/§7.1): AES-256-GCM with an
|
|
3
|
+
* HKDF key derived from `ADMINIUM_SECRET`, purpose-scoped so DSN, TOTP, and
|
|
4
|
+
* session keys never coincide. `@adminium/meta` receives only these
|
|
5
|
+
* closures — the meta store stays crypto-agnostic.
|
|
6
|
+
*/
|
|
7
|
+
import { decryptSecret, deriveKey, encryptSecret } from '../config/secrets.js';
|
|
8
|
+
const DSN_KEY_SALT = 'adminium:dsn:v1';
|
|
9
|
+
export function dsnCryptoFromSecret(masterSecret) {
|
|
10
|
+
const key = deriveKey(masterSecret, DSN_KEY_SALT);
|
|
11
|
+
return {
|
|
12
|
+
encrypt: (plaintext) => encryptSecret(plaintext, key),
|
|
13
|
+
decrypt: (token) => decryptSecret(token, key),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/connections/crypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAClD,OAAO;QACL,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC;QACrD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSN parsing, masking, and the connection-string SSRF guard
|
|
3
|
+
* (08-server-api.md §7 item 2). Scheme allowlist `postgres|mysql|sqlite`;
|
|
4
|
+
* cloud-metadata addresses are always refused. Loopback blocking is
|
|
5
|
+
* production-only by default — a DB on the same box is the normal self-host
|
|
6
|
+
* case (§7's `ADMINIUM_NETWORK_POLICY=strict` tightens it further at M15).
|
|
7
|
+
*/
|
|
8
|
+
import { AppError } from '../errors.js';
|
|
9
|
+
export interface ParsedDsn {
|
|
10
|
+
scheme: 'postgres' | 'mysql' | 'sqlite';
|
|
11
|
+
host: string | null;
|
|
12
|
+
port: number | null;
|
|
13
|
+
database: string | null;
|
|
14
|
+
user: string | null;
|
|
15
|
+
/** SQLite: the file path. */
|
|
16
|
+
file: string | null;
|
|
17
|
+
}
|
|
18
|
+
/** Parse + allowlist a DSN; throws 422 `VALIDATION_FAILED` outside the grammar. */
|
|
19
|
+
export declare function parseDsn(dsn: string): ParsedDsn;
|
|
20
|
+
export interface DsnGuardOptions {
|
|
21
|
+
/** Default: `NODE_ENV === 'production'` at the call site. */
|
|
22
|
+
blockLoopback?: boolean | undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* §7 item 2 guard, run before any dial. Cloud-metadata (169.254.0.0/16) is
|
|
26
|
+
* always blocked; loopback per {@link DsnGuardOptions}. Throws 422.
|
|
27
|
+
*/
|
|
28
|
+
export declare function guardDsn(dsn: string, opts?: DsnGuardOptions): ParsedDsn;
|
|
29
|
+
/** `postgres://ava:secret@db.acme.io:5432/prod` → `postgres://ava@db.acme.io:5432/prod`. */
|
|
30
|
+
export declare function maskDsn(dsn: string | null): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* True when two DSNs point at the same physical database (host+port+db, or
|
|
33
|
+
* the same SQLite file) — drives the meta-placement same-db check
|
|
34
|
+
* (01-architecture.md §3.1).
|
|
35
|
+
*/
|
|
36
|
+
export declare function sameDatabase(a: string | null, b: string | null): boolean;
|
|
37
|
+
/** 409 `META_PLACEMENT_INVALID` (01-architecture.md §3.1, enforced server-side). */
|
|
38
|
+
export declare class MetaPlacementError extends AppError {
|
|
39
|
+
readonly name = "MetaPlacementError";
|
|
40
|
+
constructor(message: string, details?: unknown);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=dsn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsn.d.ts","sourceRoot":"","sources":["../../src/connections/dsn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAyB,MAAM,cAAc,CAAC;AAE/D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAiBD,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA4B/C;AASD,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,SAAS,CAc3E;AAED,4FAA4F;AAC5F,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAazD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAiBxE;AAED,oFAAoF;AACpF,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,SAAkB,IAAI,wBAAwB;gBAElC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAG/C"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSN parsing, masking, and the connection-string SSRF guard
|
|
3
|
+
* (08-server-api.md §7 item 2). Scheme allowlist `postgres|mysql|sqlite`;
|
|
4
|
+
* cloud-metadata addresses are always refused. Loopback blocking is
|
|
5
|
+
* production-only by default — a DB on the same box is the normal self-host
|
|
6
|
+
* case (§7's `ADMINIUM_NETWORK_POLICY=strict` tightens it further at M15).
|
|
7
|
+
*/
|
|
8
|
+
import { AppError, ValidationFailedError } from '../errors.js';
|
|
9
|
+
const SCHEME_ALIASES = {
|
|
10
|
+
postgres: 'postgres',
|
|
11
|
+
postgresql: 'postgres',
|
|
12
|
+
mysql: 'mysql',
|
|
13
|
+
mariadb: 'mysql',
|
|
14
|
+
sqlite: 'sqlite',
|
|
15
|
+
file: 'sqlite',
|
|
16
|
+
};
|
|
17
|
+
const DEFAULT_PORTS = {
|
|
18
|
+
postgres: 5432,
|
|
19
|
+
mysql: 3306,
|
|
20
|
+
sqlite: null,
|
|
21
|
+
};
|
|
22
|
+
/** Parse + allowlist a DSN; throws 422 `VALIDATION_FAILED` outside the grammar. */
|
|
23
|
+
export function parseDsn(dsn) {
|
|
24
|
+
const schemeMatch = /^([a-z][a-z0-9+.-]*):/i.exec(dsn);
|
|
25
|
+
const rawScheme = schemeMatch?.[1]?.toLowerCase();
|
|
26
|
+
const scheme = rawScheme === undefined ? undefined : SCHEME_ALIASES[rawScheme];
|
|
27
|
+
if (scheme === undefined) {
|
|
28
|
+
throw new ValidationFailedError('Unsupported DSN scheme — postgres, mysql, or sqlite only.', {
|
|
29
|
+
allowed: ['postgres', 'mysql', 'sqlite'],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (scheme === 'sqlite') {
|
|
33
|
+
const file = dsn.replace(/^(sqlite:\/\/|sqlite:|file:)/i, '');
|
|
34
|
+
return { scheme, host: null, port: null, database: null, user: null, file };
|
|
35
|
+
}
|
|
36
|
+
let url;
|
|
37
|
+
try {
|
|
38
|
+
url = new URL(dsn);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new ValidationFailedError('Malformed DSN.', {});
|
|
42
|
+
}
|
|
43
|
+
const port = url.port.length > 0 ? Number(url.port) : DEFAULT_PORTS[scheme];
|
|
44
|
+
return {
|
|
45
|
+
scheme,
|
|
46
|
+
host: url.hostname.length > 0 ? url.hostname : null,
|
|
47
|
+
port,
|
|
48
|
+
database: url.pathname.replace(/^\//, '') || null,
|
|
49
|
+
user: url.username.length > 0 ? decodeURIComponent(url.username) : null,
|
|
50
|
+
file: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function ipv4Octets(host) {
|
|
54
|
+
const m = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(host);
|
|
55
|
+
if (m === null)
|
|
56
|
+
return null;
|
|
57
|
+
const octets = m.slice(1).map(Number);
|
|
58
|
+
return octets.every((o) => o <= 255) ? octets : null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* §7 item 2 guard, run before any dial. Cloud-metadata (169.254.0.0/16) is
|
|
62
|
+
* always blocked; loopback per {@link DsnGuardOptions}. Throws 422.
|
|
63
|
+
*/
|
|
64
|
+
export function guardDsn(dsn, opts = {}) {
|
|
65
|
+
const parsed = parseDsn(dsn);
|
|
66
|
+
if (parsed.scheme === 'sqlite')
|
|
67
|
+
return parsed;
|
|
68
|
+
const host = parsed.host?.toLowerCase() ?? '';
|
|
69
|
+
const octets = ipv4Octets(host);
|
|
70
|
+
if ((octets !== null && octets[0] === 169 && octets[1] === 254) || host === 'metadata.google.internal') {
|
|
71
|
+
throw new ValidationFailedError('DSN host resolves to a blocked address range.', { host });
|
|
72
|
+
}
|
|
73
|
+
const loopback = host === 'localhost' || host === '::1' || host === '[::1]' || (octets !== null && octets[0] === 127);
|
|
74
|
+
if (loopback && opts.blockLoopback === true) {
|
|
75
|
+
throw new ValidationFailedError('Loopback DSN hosts are not allowed in production.', { host });
|
|
76
|
+
}
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
/** `postgres://ava:secret@db.acme.io:5432/prod` → `postgres://ava@db.acme.io:5432/prod`. */
|
|
80
|
+
export function maskDsn(dsn) {
|
|
81
|
+
if (dsn === null)
|
|
82
|
+
return null;
|
|
83
|
+
let parsed;
|
|
84
|
+
try {
|
|
85
|
+
parsed = parseDsn(dsn);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null; // never leak an unparseable (possibly credentialed) string
|
|
89
|
+
}
|
|
90
|
+
if (parsed.scheme === 'sqlite')
|
|
91
|
+
return `sqlite:${parsed.file ?? ''}`;
|
|
92
|
+
const auth = parsed.user === null ? '' : `${parsed.user}@`;
|
|
93
|
+
const port = parsed.port === null ? '' : `:${String(parsed.port)}`;
|
|
94
|
+
const db = parsed.database === null ? '' : `/${parsed.database}`;
|
|
95
|
+
return `${parsed.scheme}://${auth}${parsed.host ?? ''}${port}${db}`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* True when two DSNs point at the same physical database (host+port+db, or
|
|
99
|
+
* the same SQLite file) — drives the meta-placement same-db check
|
|
100
|
+
* (01-architecture.md §3.1).
|
|
101
|
+
*/
|
|
102
|
+
export function sameDatabase(a, b) {
|
|
103
|
+
if (a === null || b === null)
|
|
104
|
+
return false;
|
|
105
|
+
let pa;
|
|
106
|
+
let pb;
|
|
107
|
+
try {
|
|
108
|
+
pa = parseDsn(a);
|
|
109
|
+
pb = parseDsn(b);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (pa.scheme !== pb.scheme)
|
|
115
|
+
return false;
|
|
116
|
+
if (pa.scheme === 'sqlite')
|
|
117
|
+
return pa.file !== null && pa.file === pb.file;
|
|
118
|
+
const hostA = pa.host?.toLowerCase() ?? '';
|
|
119
|
+
const hostB = pb.host?.toLowerCase() ?? '';
|
|
120
|
+
const localA = hostA === 'localhost' || hostA === '127.0.0.1' ? 'localhost' : hostA;
|
|
121
|
+
const localB = hostB === 'localhost' || hostB === '127.0.0.1' ? 'localhost' : hostB;
|
|
122
|
+
return localA === localB && pa.port === pb.port && pa.database === pb.database;
|
|
123
|
+
}
|
|
124
|
+
/** 409 `META_PLACEMENT_INVALID` (01-architecture.md §3.1, enforced server-side). */
|
|
125
|
+
export class MetaPlacementError extends AppError {
|
|
126
|
+
name = 'MetaPlacementError';
|
|
127
|
+
constructor(message, details) {
|
|
128
|
+
super(409, 'META_PLACEMENT_INVALID', message, details);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=dsn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsn.js","sourceRoot":"","sources":["../../src/connections/dsn.ts"],"names":[],"mappings":"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"}
|