@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
package/dist/app.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `buildServer()` — the Fastify 5 application skeleton (08-server-api.md §1,
|
|
3
|
+
* M2-T01). Assembles: pino logger with the §1.3 redaction set, `req_`-prefixed
|
|
4
|
+
* request ids echoed as `x-request-id`, fastify-type-provider-zod compilers,
|
|
5
|
+
* the global §1.4 error envelope, the core/static plugins, and the `/api/v1`
|
|
6
|
+
* route tree. Wave 1 boots with no meta DB configured — auth/meta wiring is
|
|
7
|
+
* wave 2 (01-architecture.md §8.1 gates arrive with it).
|
|
8
|
+
*/
|
|
9
|
+
import { randomBytes } from 'node:crypto';
|
|
10
|
+
import { fastify } from 'fastify';
|
|
11
|
+
import { pino } from 'pino';
|
|
12
|
+
import { serializerCompiler, validatorCompiler, } from 'fastify-type-provider-zod';
|
|
13
|
+
import { hashPassword } from './auth/passwords.js';
|
|
14
|
+
import { loadEnv } from './config/env.js';
|
|
15
|
+
import { AppError, errorEnvelope } from './errors.js';
|
|
16
|
+
import { scrubUrlForLog } from './log-scrub.js';
|
|
17
|
+
import { authPlugin } from './plugins/auth.js';
|
|
18
|
+
import { corePlugin } from './plugins/core.js';
|
|
19
|
+
import { staticPlugin } from './plugins/static.js';
|
|
20
|
+
import { createSetupService } from './setup/service.js';
|
|
21
|
+
import { createUpdateCheckService } from './telemetry/update-check.js';
|
|
22
|
+
import { API_PREFIX, registerRoutes } from './routes/index.js';
|
|
23
|
+
import { aboutRoutes } from './routes/about/index.js';
|
|
24
|
+
import { authRoutes } from './routes/auth/index.js';
|
|
25
|
+
import { bootstrapRoutes } from './routes/bootstrap/index.js';
|
|
26
|
+
import { meRoutes } from './routes/me/index.js';
|
|
27
|
+
import { setupRoutes } from './routes/setup/index.js';
|
|
28
|
+
import { APP_VERSION } from './version.js';
|
|
29
|
+
/** Pino deny-by-path redaction set (08-server-api.md §1.3 + ADMINIUM_SECRET). */
|
|
30
|
+
export const REDACT_PATHS = [
|
|
31
|
+
'req.headers.authorization',
|
|
32
|
+
'req.headers.cookie',
|
|
33
|
+
'ADMINIUM_SECRET',
|
|
34
|
+
'*.ADMINIUM_SECRET',
|
|
35
|
+
'*.password',
|
|
36
|
+
'*.newPassword',
|
|
37
|
+
'*.currentPassword',
|
|
38
|
+
'*.token',
|
|
39
|
+
'*.secret',
|
|
40
|
+
'*.apiKey',
|
|
41
|
+
'*.dsn',
|
|
42
|
+
'*.connectionString',
|
|
43
|
+
'*.smtpUrl',
|
|
44
|
+
// 11-electron.md §2.2 step 4: the desktop per-boot token. `*.token` above does
|
|
45
|
+
// not match `bootToken` — pino paths are field names, not substrings — and the
|
|
46
|
+
// field travels in this product (the §5 exchange body). The QUERY-STRING half
|
|
47
|
+
// of the same secret is `log-scrub.ts`'s job; paths cannot reach into a string.
|
|
48
|
+
'*.bootToken',
|
|
49
|
+
'ADMINIUM_BOOT_TOKEN',
|
|
50
|
+
'*.ADMINIUM_BOOT_TOKEN',
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* The `req` serializer, which REPLACES Fastify's default one.
|
|
54
|
+
*
|
|
55
|
+
* Fastify merges the serializers off a supplied `loggerInstance` OVER its own
|
|
56
|
+
* (`lib/logger-pino.js`: `Object.assign({}, opts.serializers, prevLogger[serializersSym])`),
|
|
57
|
+
* so defining `req` here wins — and therefore has to reproduce the default's
|
|
58
|
+
* shape, or every request line in the product silently loses fields. It is the
|
|
59
|
+
* default, verbatim, with the one change this exists for: {@link scrubUrlForLog}
|
|
60
|
+
* on the url. Deliberately still no `headers` — the fields below are the whole
|
|
61
|
+
* contract, and `REDACT_PATHS` covers the header paths for anyone who logs `req`
|
|
62
|
+
* by hand.
|
|
63
|
+
*/
|
|
64
|
+
function serializeRequest(request) {
|
|
65
|
+
return {
|
|
66
|
+
method: request.method,
|
|
67
|
+
url: scrubUrlForLog(request.url),
|
|
68
|
+
version: request.headers['accept-version'],
|
|
69
|
+
host: request.host,
|
|
70
|
+
remoteAddress: request.ip,
|
|
71
|
+
remotePort: request.socket.remotePort,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Structured pino logger: level from env, §1.3 redaction, pretty in dev. */
|
|
75
|
+
export function buildLogger(env, opts = {}) {
|
|
76
|
+
const pretty = opts.pretty ?? (process.env.NODE_ENV !== 'production' && Boolean(process.stdout.isTTY));
|
|
77
|
+
const options = {
|
|
78
|
+
level: env.ADMINIUM_LOG_LEVEL,
|
|
79
|
+
redact: { paths: [...REDACT_PATHS], censor: '[REDACTED]' },
|
|
80
|
+
serializers: { req: serializeRequest },
|
|
81
|
+
...(pretty ? { transport: { target: 'pino-pretty', options: { colorize: true } } } : {}),
|
|
82
|
+
};
|
|
83
|
+
return opts.stream === undefined ? pino(options) : pino(options, opts.stream);
|
|
84
|
+
}
|
|
85
|
+
/** Maps residual (non-AppError) status codes to §1.4 canonical codes. */
|
|
86
|
+
const CODE_BY_STATUS = {
|
|
87
|
+
400: 'VALIDATION_FAILED',
|
|
88
|
+
401: 'UNAUTHENTICATED',
|
|
89
|
+
403: 'FORBIDDEN',
|
|
90
|
+
404: 'NOT_FOUND',
|
|
91
|
+
409: 'CONFLICT',
|
|
92
|
+
413: 'PAYLOAD_TOO_LARGE',
|
|
93
|
+
415: 'VALIDATION_FAILED',
|
|
94
|
+
422: 'VALIDATION_FAILED',
|
|
95
|
+
429: 'RATE_LIMITED',
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Normalizes Fastify's `error.validation` entries (ZodFastifySchemaValidation
|
|
99
|
+
* errors from fastify-type-provider-zod) into `{ path, message, code }` field
|
|
100
|
+
* details for the 422 envelope, without coupling to the provider's internals.
|
|
101
|
+
*/
|
|
102
|
+
function mapValidationIssues(validation) {
|
|
103
|
+
return validation.map((entry) => {
|
|
104
|
+
const raw = entry;
|
|
105
|
+
const zodIssue = raw.params?.issue;
|
|
106
|
+
const zodPath = zodIssue?.path;
|
|
107
|
+
let path = '';
|
|
108
|
+
if (Array.isArray(zodPath) && zodPath.length > 0) {
|
|
109
|
+
path = zodPath.map(String).join('.');
|
|
110
|
+
}
|
|
111
|
+
else if (typeof raw.instancePath === 'string') {
|
|
112
|
+
path = raw.instancePath.replace(/^\//, '').replaceAll('/', '.');
|
|
113
|
+
}
|
|
114
|
+
const message = typeof raw.message === 'string'
|
|
115
|
+
? raw.message
|
|
116
|
+
: typeof zodIssue?.message === 'string'
|
|
117
|
+
? zodIssue.message
|
|
118
|
+
: 'Invalid value';
|
|
119
|
+
const code = typeof zodIssue?.code === 'string'
|
|
120
|
+
? zodIssue.code
|
|
121
|
+
: typeof raw.keyword === 'string'
|
|
122
|
+
? raw.keyword
|
|
123
|
+
: 'invalid';
|
|
124
|
+
return { path, message, code };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Builds the configured Fastify instance. Does not listen — `start()` does.
|
|
129
|
+
* Boots without any database configured (meta wiring lands in wave 2).
|
|
130
|
+
*/
|
|
131
|
+
export async function buildServer(opts = {}) {
|
|
132
|
+
const env = opts.env ?? loadEnv();
|
|
133
|
+
const exposeInternalErrors = opts.exposeInternalErrors ?? process.env.NODE_ENV !== 'production';
|
|
134
|
+
const loggerInstance = opts.logger === false
|
|
135
|
+
? pino({ level: 'silent' })
|
|
136
|
+
: typeof opts.logger === 'object'
|
|
137
|
+
? opts.logger
|
|
138
|
+
: buildLogger(env);
|
|
139
|
+
const app = fastify({
|
|
140
|
+
loggerInstance,
|
|
141
|
+
// §1.3: `req_` + 8 lowercase hex chars, e.g. req_8f2a91cd.
|
|
142
|
+
genReqId: () => `req_${randomBytes(4).toString('hex')}`,
|
|
143
|
+
// An inbound x-request-id is honored only behind a trusted proxy (§1.3).
|
|
144
|
+
requestIdHeader: env.ADMINIUM_TRUST_PROXY ? 'x-request-id' : false,
|
|
145
|
+
// Hop count 1, NEVER a bare `true`: `trustProxy: true` trusts every hop,
|
|
146
|
+
// so proxy-addr returns the LEFT-most (fully client-supplied)
|
|
147
|
+
// X-Forwarded-For entry as `request.ip` — an attacker rotating the header
|
|
148
|
+
// then gets a fresh §6 rate-limit bucket per request and forges the audit
|
|
149
|
+
// trail's source ip. With `1`, only the immediate peer (Caddy) is trusted
|
|
150
|
+
// and `request.ip` is the RIGHT-most entry — the one Caddy itself
|
|
151
|
+
// appended, which no client controls. The documented deployment is a
|
|
152
|
+
// single reverse proxy (§7 item 5: "behind Caddy/TLS").
|
|
153
|
+
trustProxy: env.ADMINIUM_TRUST_PROXY ? 1 : false,
|
|
154
|
+
bodyLimit: 1_048_576, // 1 MiB JSON; multipart gets its own limits (§3.10)
|
|
155
|
+
}).withTypeProvider();
|
|
156
|
+
app.setValidatorCompiler(validatorCompiler);
|
|
157
|
+
app.setSerializerCompiler(serializerCompiler);
|
|
158
|
+
// Every /api route must declare a schema — no untyped routes (§1.1, 08-T01).
|
|
159
|
+
app.addHook('onRoute', (route) => {
|
|
160
|
+
const methods = Array.isArray(route.method) ? route.method : [route.method];
|
|
161
|
+
if (!route.url.startsWith('/api/'))
|
|
162
|
+
return;
|
|
163
|
+
if (methods.every((method) => method === 'HEAD' || method === 'OPTIONS'))
|
|
164
|
+
return;
|
|
165
|
+
if (route.schema === undefined) {
|
|
166
|
+
throw new Error(`route ${methods.join(',')} ${route.url} registered without a schema (08-server-api.md §1.1)`);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// The request id is echoed on every response (§1.3).
|
|
170
|
+
app.addHook('onSend', async (request, reply) => {
|
|
171
|
+
void reply.header('x-request-id', request.id);
|
|
172
|
+
});
|
|
173
|
+
// Global §1.4 error envelope.
|
|
174
|
+
app.setErrorHandler((error, request, reply) => {
|
|
175
|
+
const requestId = request.id;
|
|
176
|
+
if (error instanceof AppError) {
|
|
177
|
+
void reply
|
|
178
|
+
.status(error.statusCode)
|
|
179
|
+
.send(errorEnvelope(error.code, error.message, requestId, error.details));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (Array.isArray(error.validation) && error.validation.length > 0) {
|
|
183
|
+
const details = {
|
|
184
|
+
in: error.validationContext ?? 'body',
|
|
185
|
+
issues: mapValidationIssues(error.validation),
|
|
186
|
+
};
|
|
187
|
+
void reply
|
|
188
|
+
.status(422)
|
|
189
|
+
.send(errorEnvelope('VALIDATION_FAILED', `Request ${error.validationContext ?? 'input'} failed validation.`, requestId, details));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const statusCode = typeof error.statusCode === 'number' && error.statusCode >= 400 ? error.statusCode : 500;
|
|
193
|
+
const code = CODE_BY_STATUS[statusCode];
|
|
194
|
+
if (statusCode < 500 && code !== undefined) {
|
|
195
|
+
void reply.status(statusCode).send(errorEnvelope(code, error.message, requestId));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
// Unexpected: full stack to the log under the same requestId; message
|
|
199
|
+
// hidden from the client in production (§1.4).
|
|
200
|
+
request.log.error({ err: error }, 'unhandled error');
|
|
201
|
+
const message = exposeInternalErrors
|
|
202
|
+
? error.message
|
|
203
|
+
: 'Something went wrong. Share the request id with support.';
|
|
204
|
+
void reply.status(500).send(errorEnvelope('INTERNAL', message, requestId));
|
|
205
|
+
});
|
|
206
|
+
// `staticRoot` rides along so core can hash the served index.html's inline
|
|
207
|
+
// scripts into the CSP allowance (plugins/core.ts).
|
|
208
|
+
await app.register(corePlugin, { env, staticRoot: opts.staticRoot });
|
|
209
|
+
await app.register(authPlugin, {
|
|
210
|
+
env,
|
|
211
|
+
metaDb: opts.metaDb ?? null,
|
|
212
|
+
deliverResetToken: opts.onPasswordResetToken,
|
|
213
|
+
});
|
|
214
|
+
await app.register(staticPlugin, { root: opts.staticRoot });
|
|
215
|
+
// Unknown route → 404 envelope; non-API GET/HEAD falls back to the SPA
|
|
216
|
+
// index when a dashboard build is being served (05/09 request lifecycle).
|
|
217
|
+
app.setNotFoundHandler((request, reply) => {
|
|
218
|
+
const isApi = request.url.startsWith('/api/');
|
|
219
|
+
if (!isApi &&
|
|
220
|
+
app.spaRoot !== null &&
|
|
221
|
+
(request.method === 'GET' || request.method === 'HEAD')) {
|
|
222
|
+
void reply.sendFile('index.html');
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
void reply
|
|
226
|
+
.status(404)
|
|
227
|
+
.send(errorEnvelope('NOT_FOUND', `Route ${request.method}:${request.url} not found.`, request.id));
|
|
228
|
+
});
|
|
229
|
+
await registerRoutes(app, env);
|
|
230
|
+
// Auth + me + bootstrap resources (08-server-api.md §2.1–§2.2,
|
|
231
|
+
// 09-generated-app.md §2.1) under the same prefix.
|
|
232
|
+
await app.register(async (api) => {
|
|
233
|
+
await api.register(authRoutes);
|
|
234
|
+
await api.register(meRoutes);
|
|
235
|
+
await api.register(bootstrapRoutes);
|
|
236
|
+
// First-run setup + About (M10-T04). Both need a meta store to say
|
|
237
|
+
// anything at all, so — unlike auth, whose 503 is itself the answer —
|
|
238
|
+
// they are wired only when one is configured. Composition roots that
|
|
239
|
+
// want injected services (tests with a stubbed release feed, the CLI)
|
|
240
|
+
// build the server without `metaDb` and register these factories
|
|
241
|
+
// themselves, exactly as the LLM/settings resources are wired.
|
|
242
|
+
const meta = opts.metaDb;
|
|
243
|
+
if (meta !== undefined && meta !== null) {
|
|
244
|
+
await api.register(setupRoutes({ service: createSetupService({ meta, hashPassword }) }));
|
|
245
|
+
await api.register(aboutRoutes({ meta, updates: createUpdateCheckService({ meta, version: APP_VERSION }) }));
|
|
246
|
+
}
|
|
247
|
+
}, { prefix: API_PREFIX });
|
|
248
|
+
return app;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth audit trail (08-server-api.md §7 item 9): every auth mutation writes an
|
|
3
|
+
* `auth`-category entry — login, login_failed, logout, 2FA lifecycle, password
|
|
4
|
+
* reset — with IP, user agent, and request id, never any secret material.
|
|
5
|
+
*/
|
|
6
|
+
import type { FastifyRequest } from 'fastify';
|
|
7
|
+
import { type AuditEntry, type MetaDb } from '@adminium/meta';
|
|
8
|
+
export interface AuthAuditInput {
|
|
9
|
+
/** Dotted verb, e.g. `login`, `login_failed`, `2fa_enrolled`. */
|
|
10
|
+
action: string;
|
|
11
|
+
/** `usr_…` id when the principal is known. */
|
|
12
|
+
actorId?: string | null | undefined;
|
|
13
|
+
/** Display snapshot: user name, or the attempted email on failures. */
|
|
14
|
+
actorLabel: string;
|
|
15
|
+
changes?: {
|
|
16
|
+
before?: Record<string, unknown> | null;
|
|
17
|
+
after?: Record<string, unknown> | null;
|
|
18
|
+
} | null;
|
|
19
|
+
}
|
|
20
|
+
/** Appends an `auth` audit entry stamped with the request's context. */
|
|
21
|
+
export declare function auditAuth(meta: MetaDb, request: FastifyRequest, input: AuthAuditInput): Promise<AuditEntry>;
|
|
22
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/auth/audit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAa,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACtG;AAED,wEAAwE;AACxE,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,UAAU,CAAC,CAarB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { auditRepo } from '@adminium/meta';
|
|
2
|
+
/** Appends an `auth` audit entry stamped with the request's context. */
|
|
3
|
+
export async function auditAuth(meta, request, input) {
|
|
4
|
+
const userAgent = request.headers['user-agent'];
|
|
5
|
+
return auditRepo(meta).append({
|
|
6
|
+
actorKind: 'user',
|
|
7
|
+
actorId: input.actorId ?? null,
|
|
8
|
+
actorLabel: input.actorLabel,
|
|
9
|
+
category: 'auth',
|
|
10
|
+
action: input.action,
|
|
11
|
+
changes: input.changes ?? null,
|
|
12
|
+
ip: request.ip,
|
|
13
|
+
userAgent: typeof userAgent === 'string' ? userAgent.slice(0, 300) : null,
|
|
14
|
+
requestId: request.id,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/auth/audit.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAgC,MAAM,gBAAgB,CAAC;AAYzE,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,OAAuB,EACvB,KAAqB;IAErB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QACzE,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when `address` is a loopback address in any of the shapes Node hands out.
|
|
3
|
+
*
|
|
4
|
+
* `undefined`/empty ⇒ FALSE. An absent `remoteAddress` means the socket is gone
|
|
5
|
+
* (or is not a socket at all); "we could not tell who this is" is not "this is
|
|
6
|
+
* the local user", and the failure has to land on the deny side.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isLoopbackAddress(address: string | undefined | null): boolean;
|
|
9
|
+
/** The narrow slice of a request this module reads: the raw socket's peer. */
|
|
10
|
+
export interface PeerSocketLike {
|
|
11
|
+
remoteAddress?: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The §2.4 peer check. Takes the SOCKET, never the request, so a caller cannot
|
|
15
|
+
* pass the proxy-aware `request.ip` by accident — the type will not allow it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isLoopbackPeer(socket: PeerSocketLike | undefined | null): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Constant-time equality for the boot token (§5: "compares against
|
|
20
|
+
* `ADMINIUM_BOOT_TOKEN` (constant-time)").
|
|
21
|
+
*
|
|
22
|
+
* Both sides are hashed first. `timingSafeEqual` THROWS on a length mismatch,
|
|
23
|
+
* so comparing the raw strings would both leak the token's length through the
|
|
24
|
+
* error path and turn a short guess into a 500 instead of a 401. SHA-256 makes
|
|
25
|
+
* every candidate exactly 32 bytes, which is the point — the comparison is over
|
|
26
|
+
* digests, and the digest of a wrong guess differs from the first byte on.
|
|
27
|
+
*/
|
|
28
|
+
export declare function bootTokenMatches(candidate: string, bootToken: string): boolean;
|
|
29
|
+
/** Why a claim was refused. The route maps every one of these to a 401. */
|
|
30
|
+
export type BootTokenClaim = 'ok' | 'invalid' | 'used';
|
|
31
|
+
export interface BootTokenGuard {
|
|
32
|
+
/**
|
|
33
|
+
* Verify and CONSUME. Exactly one call in this process's lifetime can return
|
|
34
|
+
* `ok`; every later call returns `used`, including a second call with the
|
|
35
|
+
* correct token (that is the §5 replay case, not a retry).
|
|
36
|
+
*/
|
|
37
|
+
claim(candidate: string): BootTokenClaim;
|
|
38
|
+
/** Introspection for tests/diagnostics — never gates anything. */
|
|
39
|
+
readonly consumed: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The one-shot guard over this boot's token.
|
|
43
|
+
*
|
|
44
|
+
* ORDERING MATTERS: the `used` check comes FIRST. Once the token is spent the
|
|
45
|
+
* answer is `used` for every candidate, right or wrong, so a spent boot stops
|
|
46
|
+
* being an oracle that confirms a guessed token by answering it differently.
|
|
47
|
+
*
|
|
48
|
+
* The claim is taken BEFORE the session is issued (see the route): if minting
|
|
49
|
+
* the session then fails, the token is still burned. Better a user who clicks
|
|
50
|
+
* relaunch than a token that survives its first use.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createBootTokenGuard(bootToken: string): BootTokenGuard;
|
|
53
|
+
//# sourceMappingURL=desktop-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-session.d.ts","sourceRoot":"","sources":["../../src/auth/desktop-session.ts"],"names":[],"mappings":"AA2CA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAa7E;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAEjF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI9E;AAED,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAatE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The desktop boot-token mechanics (11-electron.md §5, §2.2 step 4).
|
|
3
|
+
*
|
|
4
|
+
* Three primitives, deliberately framework-free so they can be tested as what
|
|
5
|
+
* they are — security decisions — rather than through a route:
|
|
6
|
+
*
|
|
7
|
+
* {@link isLoopbackPeer} — is the SOCKET peer this same machine?
|
|
8
|
+
* {@link bootTokenMatches} — constant-time comparison against the boot token
|
|
9
|
+
* {@link createBootTokenGuard} — the one-shot-per-boot claim
|
|
10
|
+
*
|
|
11
|
+
* ─── Why the socket, and not `request.ip` ────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* `request.ip` is Fastify's PROXY-AWARE address: with `trustProxy` on it is
|
|
14
|
+
* whatever `X-Forwarded-For` said. That header is a claim by the client, and
|
|
15
|
+
* this is the one route in the product where a client's claim about its own
|
|
16
|
+
* address would be an authentication bypass — a LAN peer (§8.3 binds `0.0.0.0`)
|
|
17
|
+
* could send `X-Forwarded-For: 127.0.0.1` and become the super admin without a
|
|
18
|
+
* password. So the check reads `socket.remoteAddress`: the kernel's view of who
|
|
19
|
+
* actually opened the connection, which no header can move. §2.4 states the rule
|
|
20
|
+
* without qualification — "rejects non-loopback peers unconditionally" — and
|
|
21
|
+
* unconditional means "not even for a proxy we would otherwise trust".
|
|
22
|
+
*
|
|
23
|
+
* ─── Why one-shot lives in memory ────────────────────────────────────────────
|
|
24
|
+
*
|
|
25
|
+
* "One success per boot token" (§5) and "never persisted" (§2.2) are the same
|
|
26
|
+
* requirement seen twice: the token's lifetime IS this process's lifetime. A
|
|
27
|
+
* replay table in the meta store would outlive the token it guards, and give the
|
|
28
|
+
* next boot a row to be confused by. The guard is therefore a closure over a
|
|
29
|
+
* boolean, and a restarted server is a new boot with a new token — which is
|
|
30
|
+
* exactly why "a token from a previous boot" fails: nothing in this process ever
|
|
31
|
+
* heard of it.
|
|
32
|
+
*/
|
|
33
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
34
|
+
/**
|
|
35
|
+
* IPv4 loopback is a whole /8 (127.0.0.0/8), not just 127.0.0.1 — `127.0.0.2`
|
|
36
|
+
* is equally this machine and equally reachable from nowhere else.
|
|
37
|
+
*/
|
|
38
|
+
const IPV4_LOOPBACK = /^127\.(?:\d{1,3})\.(?:\d{1,3})\.(?:\d{1,3})$/;
|
|
39
|
+
/** `::ffff:127.0.0.1` — an IPv4 peer seen through a dual-stack listener. */
|
|
40
|
+
const IPV4_MAPPED_PREFIX = '::ffff:';
|
|
41
|
+
/**
|
|
42
|
+
* True when `address` is a loopback address in any of the shapes Node hands out.
|
|
43
|
+
*
|
|
44
|
+
* `undefined`/empty ⇒ FALSE. An absent `remoteAddress` means the socket is gone
|
|
45
|
+
* (or is not a socket at all); "we could not tell who this is" is not "this is
|
|
46
|
+
* the local user", and the failure has to land on the deny side.
|
|
47
|
+
*/
|
|
48
|
+
export function isLoopbackAddress(address) {
|
|
49
|
+
if (address === undefined || address === null || address === '')
|
|
50
|
+
return false;
|
|
51
|
+
// Strip a zone index (`fe80::1%en0`) before comparing — it belongs to the
|
|
52
|
+
// interface, not the address, and `::1%lo0` is still `::1`.
|
|
53
|
+
const zoneless = address.split('%')[0] ?? '';
|
|
54
|
+
const normalized = zoneless.toLowerCase();
|
|
55
|
+
if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1')
|
|
56
|
+
return true;
|
|
57
|
+
if (normalized.startsWith(IPV4_MAPPED_PREFIX)) {
|
|
58
|
+
return IPV4_LOOPBACK.test(normalized.slice(IPV4_MAPPED_PREFIX.length));
|
|
59
|
+
}
|
|
60
|
+
return IPV4_LOOPBACK.test(normalized);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The §2.4 peer check. Takes the SOCKET, never the request, so a caller cannot
|
|
64
|
+
* pass the proxy-aware `request.ip` by accident — the type will not allow it.
|
|
65
|
+
*/
|
|
66
|
+
export function isLoopbackPeer(socket) {
|
|
67
|
+
return isLoopbackAddress(socket?.remoteAddress);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Constant-time equality for the boot token (§5: "compares against
|
|
71
|
+
* `ADMINIUM_BOOT_TOKEN` (constant-time)").
|
|
72
|
+
*
|
|
73
|
+
* Both sides are hashed first. `timingSafeEqual` THROWS on a length mismatch,
|
|
74
|
+
* so comparing the raw strings would both leak the token's length through the
|
|
75
|
+
* error path and turn a short guess into a 500 instead of a 401. SHA-256 makes
|
|
76
|
+
* every candidate exactly 32 bytes, which is the point — the comparison is over
|
|
77
|
+
* digests, and the digest of a wrong guess differs from the first byte on.
|
|
78
|
+
*/
|
|
79
|
+
export function bootTokenMatches(candidate, bootToken) {
|
|
80
|
+
const a = createHash('sha256').update(candidate, 'utf8').digest();
|
|
81
|
+
const b = createHash('sha256').update(bootToken, 'utf8').digest();
|
|
82
|
+
return timingSafeEqual(a, b);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The one-shot guard over this boot's token.
|
|
86
|
+
*
|
|
87
|
+
* ORDERING MATTERS: the `used` check comes FIRST. Once the token is spent the
|
|
88
|
+
* answer is `used` for every candidate, right or wrong, so a spent boot stops
|
|
89
|
+
* being an oracle that confirms a guessed token by answering it differently.
|
|
90
|
+
*
|
|
91
|
+
* The claim is taken BEFORE the session is issued (see the route): if minting
|
|
92
|
+
* the session then fails, the token is still burned. Better a user who clicks
|
|
93
|
+
* relaunch than a token that survives its first use.
|
|
94
|
+
*/
|
|
95
|
+
export function createBootTokenGuard(bootToken) {
|
|
96
|
+
let consumed = false;
|
|
97
|
+
return {
|
|
98
|
+
claim(candidate) {
|
|
99
|
+
if (consumed)
|
|
100
|
+
return 'used';
|
|
101
|
+
if (!bootTokenMatches(candidate, bootToken))
|
|
102
|
+
return 'invalid';
|
|
103
|
+
consumed = true;
|
|
104
|
+
return 'ok';
|
|
105
|
+
},
|
|
106
|
+
get consumed() {
|
|
107
|
+
return consumed;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=desktop-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-session.js","sourceRoot":"","sources":["../../src/auth/desktop-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,4EAA4E;AAC5E,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAkC;IAClE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAE9E,0EAA0E;IAC1E,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE1C,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,UAAU,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyC;IACtE,OAAO,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IACnE,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IAClE,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IAClE,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAgBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO;QACL,KAAK,CAAC,SAAiB;YACrB,IAAI,QAAQ;gBAAE,OAAO,MAAM,CAAC;YAC5B,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC9D,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** OWASP argon2id first-choice configuration (m=19456 KiB, t=2, p=1). */
|
|
2
|
+
export declare const ARGON2_OPTIONS: {
|
|
3
|
+
readonly type: 2;
|
|
4
|
+
readonly memoryCost: 19456;
|
|
5
|
+
readonly timeCost: 2;
|
|
6
|
+
readonly parallelism: 1;
|
|
7
|
+
};
|
|
8
|
+
/** Hashes a plaintext password to a PHC-format argon2id string. */
|
|
9
|
+
export declare function hashPassword(plain: string): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Constant-shape verify: malformed/foreign hashes return `false` instead of
|
|
12
|
+
* throwing so login failure handling stays uniform (no user enumeration).
|
|
13
|
+
*/
|
|
14
|
+
export declare function verifyPassword(hash: string, plain: string): Promise<boolean>;
|
|
15
|
+
/** True when `hash` was minted with weaker/different parameters than ours. */
|
|
16
|
+
export declare function needsRehash(hash: string): boolean;
|
|
17
|
+
//# sourceMappingURL=passwords.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passwords.d.ts","sourceRoot":"","sources":["../../src/auth/passwords.ts"],"names":[],"mappings":"AAQA,yEAAyE;AACzE,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX,mEAAmE;AACnE,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMlF;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password hashing (08-server-api.md §2.1, §7 item 7): argon2id with the
|
|
3
|
+
* OWASP first-choice parameters — 19 MiB memory, 2 iterations, parallelism 1.
|
|
4
|
+
* Only this module talks to the argon2 binding; callers never see raw hashes
|
|
5
|
+
* beyond passing them to/from `@adminium/meta`.
|
|
6
|
+
*/
|
|
7
|
+
import argon2 from 'argon2';
|
|
8
|
+
/** OWASP argon2id first-choice configuration (m=19456 KiB, t=2, p=1). */
|
|
9
|
+
export const ARGON2_OPTIONS = {
|
|
10
|
+
type: argon2.argon2id,
|
|
11
|
+
memoryCost: 19_456, // KiB = 19 MiB
|
|
12
|
+
timeCost: 2,
|
|
13
|
+
parallelism: 1,
|
|
14
|
+
};
|
|
15
|
+
/** Hashes a plaintext password to a PHC-format argon2id string. */
|
|
16
|
+
export async function hashPassword(plain) {
|
|
17
|
+
return argon2.hash(plain, ARGON2_OPTIONS);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Constant-shape verify: malformed/foreign hashes return `false` instead of
|
|
21
|
+
* throwing so login failure handling stays uniform (no user enumeration).
|
|
22
|
+
*/
|
|
23
|
+
export async function verifyPassword(hash, plain) {
|
|
24
|
+
try {
|
|
25
|
+
return await argon2.verify(hash, plain);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** True when `hash` was minted with weaker/different parameters than ours. */
|
|
32
|
+
export function needsRehash(hash) {
|
|
33
|
+
try {
|
|
34
|
+
return argon2.needsRehash(hash, ARGON2_OPTIONS);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=passwords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passwords.js","sourceRoot":"","sources":["../../src/auth/passwords.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC,QAAQ;IACrB,UAAU,EAAE,MAAM,EAAE,eAAe;IACnC,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;CACN,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from 'fastify';
|
|
2
|
+
import { type MetaDb, type Session } from '@adminium/meta';
|
|
3
|
+
export declare const SESSION_COOKIE = "adminium_session";
|
|
4
|
+
export declare const SESSION_TOKEN_PREFIX = "adms_";
|
|
5
|
+
export declare const CHALLENGE_TOKEN_PREFIX = "admc_";
|
|
6
|
+
export declare const RESET_TOKEN_PREFIX = "admr_";
|
|
7
|
+
/** Sliding-expiry defaults (08-server-api.md §2.1). */
|
|
8
|
+
export declare const SESSION_IDLE_TTL_MS: number;
|
|
9
|
+
export declare const SESSION_ABSOLUTE_TTL_MS: number;
|
|
10
|
+
/** 2FA login challenge: 5 minutes, single-use (§2.1). */
|
|
11
|
+
export declare const CHALLENGE_TTL_MS: number;
|
|
12
|
+
/** Password-reset tokens: single-use, 30-minute TTL (§7 item 7). */
|
|
13
|
+
export declare const RESET_TOKEN_TTL_MS: number;
|
|
14
|
+
/** `<prefix>` + 32 random bytes base64url (43 chars of payload). */
|
|
15
|
+
export declare function mintToken(prefix: string): string;
|
|
16
|
+
/** SHA-256 hex of the full token string — the only form stored at rest. */
|
|
17
|
+
export declare function hashToken(token: string): string;
|
|
18
|
+
export interface RequestMeta {
|
|
19
|
+
ip?: string | null | undefined;
|
|
20
|
+
userAgent?: string | null | undefined;
|
|
21
|
+
}
|
|
22
|
+
export interface MintedSession {
|
|
23
|
+
token: string;
|
|
24
|
+
session: Session;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a full session row and returns the plaintext token exactly once.
|
|
28
|
+
* `absoluteDeadline` caps `expires_at` below the default 30-day horizon so
|
|
29
|
+
* rotation never extends the original absolute lifetime.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createSession(meta: MetaDb, userId: string, reqMeta?: RequestMeta, at?: number, absoluteDeadline?: number): Promise<MintedSession>;
|
|
32
|
+
export type SessionResolution = {
|
|
33
|
+
state: 'none';
|
|
34
|
+
} | {
|
|
35
|
+
state: 'expired';
|
|
36
|
+
session: Session;
|
|
37
|
+
} | {
|
|
38
|
+
state: 'active';
|
|
39
|
+
session: Session;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a cookie token to a session, distinguishing "no such session"
|
|
43
|
+
* (`none` → UNAUTHENTICATED) from "existed but timed out" (`expired` →
|
|
44
|
+
* SESSION_EXPIRED). Revoked sessions resolve to `none` — sign-out is not the
|
|
45
|
+
* expired-session UX. Idle timeout: `last_seen_at + 7d`; absolute: `expires_at`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveSessionByToken(meta: MetaDb, token: string, at?: number): Promise<SessionResolution>;
|
|
48
|
+
/**
|
|
49
|
+
* Privilege-boundary rotation hook (§7 item 7): revokes the old row and mints
|
|
50
|
+
* a fresh token for the same user, keeping the original absolute deadline.
|
|
51
|
+
* Call on login step-ups, role changes, and password changes that keep the
|
|
52
|
+
* current session alive.
|
|
53
|
+
*/
|
|
54
|
+
export declare function rotateSession(meta: MetaDb, session: Session, reqMeta?: RequestMeta, at?: number): Promise<MintedSession>;
|
|
55
|
+
/** Mints a 5-minute single-use 2FA challenge row (`admc_` prefix). */
|
|
56
|
+
export declare function createChallenge(meta: MetaDb, userId: string, reqMeta?: RequestMeta, at?: number): Promise<MintedSession>;
|
|
57
|
+
/**
|
|
58
|
+
* Atomically consumes a challenge token: the first caller revokes the row and
|
|
59
|
+
* wins; replays, expired, or non-challenge tokens return `null`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function consumeChallenge(meta: MetaDb, token: string, at?: number): Promise<Session | null>;
|
|
62
|
+
/** True when the request arrived over TLS (directly or via trusted proxy). */
|
|
63
|
+
export declare function isSecureRequest(request: FastifyRequest): boolean;
|
|
64
|
+
/** Cookie contract (§2.1): httpOnly, SameSite=Lax, signed, path /. */
|
|
65
|
+
export declare function sessionCookieOptions(secure: boolean): {
|
|
66
|
+
readonly path: "/";
|
|
67
|
+
readonly httpOnly: true;
|
|
68
|
+
readonly sameSite: "lax";
|
|
69
|
+
readonly signed: true;
|
|
70
|
+
readonly secure: boolean;
|
|
71
|
+
readonly maxAge: number;
|
|
72
|
+
};
|
|
73
|
+
export declare function setSessionCookie(reply: FastifyReply, token: string, request: FastifyRequest): void;
|
|
74
|
+
export declare function clearSessionCookie(reply: FastifyReply, request: FastifyRequest): void;
|
|
75
|
+
/** Reads and unsigns the session cookie; `null` on absent/tampered values. */
|
|
76
|
+
export declare function readSessionCookie(request: FastifyRequest): string | null;
|
|
77
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/auth/sessions.ts"],"names":[],"mappings":"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"}
|