@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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rbac` plugin (08-server-api.md §5, M2-T05): decorates
|
|
3
|
+
*
|
|
4
|
+
* - `request.can(permission)` — lazy, per-request-cached allow/deny against
|
|
5
|
+
* the resolved permission set (union of role grants; super-admin bypass;
|
|
6
|
+
* deny-by-default),
|
|
7
|
+
* - `app.rbac.require(permission)` — route `preHandler` that throws
|
|
8
|
+
* `ForbiddenError` with the missing permission in `details` and writes an
|
|
9
|
+
* `rbac`-category `permission.denied` audit entry,
|
|
10
|
+
* - `app.rbac.audit(request, entry)` — actor/ip/ua/request-id-stamped audit
|
|
11
|
+
* append for the mutating routes in this wave,
|
|
12
|
+
* - the API-key request-auth path: `Authorization: Bearer adm_sk_…` →
|
|
13
|
+
* hashed lookup → `request.apiKeyPrincipal` acting with the key's role
|
|
14
|
+
* (§2.16), with a throttled `last_used_at` touch.
|
|
15
|
+
*
|
|
16
|
+
* Session users arrive as `request.user` from `plugins/auth.ts`; this plugin
|
|
17
|
+
* only *reads* that decoration (structurally — see rbac/principal.ts).
|
|
18
|
+
*/
|
|
19
|
+
import fp from 'fastify-plugin';
|
|
20
|
+
import { apiKeysRepo, auditRepo, } from '@adminium/meta';
|
|
21
|
+
import { ForbiddenError, UnauthorizedError } from '../errors.js';
|
|
22
|
+
import { API_KEY_TOUCH_INTERVAL_MS, hashApiKey, parseBearerApiKey, } from '../rbac/api-keys.js';
|
|
23
|
+
import { parsePermission } from '../rbac/permissions.js';
|
|
24
|
+
import { getPrincipal } from '../rbac/principal.js';
|
|
25
|
+
import { permissionSetAllows, resolvePermissionSet, } from '../rbac/resolver.js';
|
|
26
|
+
export const rbacPlugin = fp(async (app, opts) => {
|
|
27
|
+
const { meta } = opts;
|
|
28
|
+
const now = opts.now ?? Date.now;
|
|
29
|
+
const audit = auditRepo(meta);
|
|
30
|
+
const apiKeys = apiKeysRepo(meta);
|
|
31
|
+
app.decorateRequest('apiKeyPrincipal', null);
|
|
32
|
+
app.decorateRequest('rbacResolution', null);
|
|
33
|
+
async function resolve(request) {
|
|
34
|
+
// `!= null` (not `!== null`): routes registered in encapsulation
|
|
35
|
+
// contexts created BEFORE this plugin (e.g. bootstrap, inside
|
|
36
|
+
// buildServer) never get the decorator default, so the property reads
|
|
37
|
+
// `undefined` there — which must mean "not resolved yet", not a cache hit.
|
|
38
|
+
if (request.rbacResolution != null)
|
|
39
|
+
return request.rbacResolution;
|
|
40
|
+
const principal = getPrincipal(request);
|
|
41
|
+
if (principal === null) {
|
|
42
|
+
throw new UnauthorizedError();
|
|
43
|
+
}
|
|
44
|
+
const set = await resolvePermissionSet(meta, principal);
|
|
45
|
+
request.rbacResolution = set;
|
|
46
|
+
return set;
|
|
47
|
+
}
|
|
48
|
+
app.decorateRequest('can', async function can(permission) {
|
|
49
|
+
if (getPrincipal(this) === null)
|
|
50
|
+
return false;
|
|
51
|
+
return permissionSetAllows(await resolve(this), permission);
|
|
52
|
+
});
|
|
53
|
+
async function auditFromRequest(request, entry) {
|
|
54
|
+
const principal = getPrincipal(request);
|
|
55
|
+
await audit.append({
|
|
56
|
+
...entry,
|
|
57
|
+
actorKind: principal?.kind ?? 'system',
|
|
58
|
+
actorId: principal?.id ?? null,
|
|
59
|
+
actorLabel: principal?.label ?? 'Adminium',
|
|
60
|
+
ip: request.ip ?? null,
|
|
61
|
+
userAgent: typeof request.headers['user-agent'] === 'string' ? request.headers['user-agent'] : null,
|
|
62
|
+
requestId: request.id,
|
|
63
|
+
}, now());
|
|
64
|
+
}
|
|
65
|
+
function require(permission) {
|
|
66
|
+
if (parsePermission(permission) === null) {
|
|
67
|
+
// Fail at registration time, not per-request: a guard on a permission
|
|
68
|
+
// outside the grammar is a programming error, not a client 403.
|
|
69
|
+
throw new Error(`rbac.require(): invalid permission ${JSON.stringify(permission)}`);
|
|
70
|
+
}
|
|
71
|
+
return async (request) => {
|
|
72
|
+
const set = await resolve(request); // throws 401 when unauthenticated
|
|
73
|
+
if (permissionSetAllows(set, permission))
|
|
74
|
+
return;
|
|
75
|
+
await auditFromRequest(request, {
|
|
76
|
+
category: 'rbac',
|
|
77
|
+
action: 'permission.denied',
|
|
78
|
+
changes: { after: { permission, method: request.method, url: request.url } },
|
|
79
|
+
});
|
|
80
|
+
throw new ForbiddenError('You do not have the required permission.', 'FORBIDDEN', {
|
|
81
|
+
permission,
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
app.decorate('rbac', { meta, require, resolve, audit: auditFromRequest, now });
|
|
86
|
+
// API-key request-auth path (§2.16): only engages for Bearer adm_sk_* —
|
|
87
|
+
// cookie sessions and other bearer schemes pass through untouched.
|
|
88
|
+
app.addHook('onRequest', async (request) => {
|
|
89
|
+
const key = parseBearerApiKey(request.headers.authorization);
|
|
90
|
+
if (key === null)
|
|
91
|
+
return;
|
|
92
|
+
const at = now();
|
|
93
|
+
const row = await apiKeys.findValidByTokenHash(hashApiKey(key), at);
|
|
94
|
+
if (row === null) {
|
|
95
|
+
throw new UnauthorizedError('UNAUTHENTICATED', 'Invalid, expired, or revoked API key.');
|
|
96
|
+
}
|
|
97
|
+
request.apiKeyPrincipal = { kind: 'api-key', id: row.id, label: row.name, roleId: row.roleId };
|
|
98
|
+
if (row.lastUsedAt === null || at - row.lastUsedAt >= API_KEY_TOUCH_INTERVAL_MS) {
|
|
99
|
+
await apiKeys.touchLastUsed(row.id, at);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}, { name: 'adminium-rbac', fastify: '5.x' });
|
|
103
|
+
//# sourceMappingURL=rbac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../src/plugins/rbac.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare module 'fastify' {
|
|
2
|
+
interface FastifyInstance {
|
|
3
|
+
/** Absolute dashboard-build root being served, or null when disabled. */
|
|
4
|
+
spaRoot: string | null;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export interface StaticPluginOptions {
|
|
8
|
+
/** Candidate dashboard build directory; must contain `index.html`. */
|
|
9
|
+
root?: string | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare const staticPlugin: import("fastify").FastifyPluginCallback<StaticPluginOptions, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
|
|
12
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/plugins/static.ts"],"names":[],"mappings":"AAaA,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,yEAAyE;QACzE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,qLA2BxB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `static` plugin (08-server-api.md §1.2): serves a dashboard build directory
|
|
3
|
+
* when one exists, with an SPA fallback to `index.html` for non-`/api/*`
|
|
4
|
+
* GET/HEAD requests (the fallback itself lives in the app's not-found handler,
|
|
5
|
+
* keyed off the `spaRoot` decoration). When the directory is absent — the
|
|
6
|
+
* dashboard ships M4 — the plugin cleanly no-ops and the server still boots.
|
|
7
|
+
*/
|
|
8
|
+
import { stat } from 'node:fs/promises';
|
|
9
|
+
import { join, resolve } from 'node:path';
|
|
10
|
+
import fastifyStatic from '@fastify/static';
|
|
11
|
+
import fp from 'fastify-plugin';
|
|
12
|
+
export const staticPlugin = fp(async (app, opts) => {
|
|
13
|
+
let root = null;
|
|
14
|
+
if (opts.root !== undefined && opts.root !== '') {
|
|
15
|
+
const absolute = resolve(opts.root);
|
|
16
|
+
try {
|
|
17
|
+
const entry = await stat(join(absolute, 'index.html'));
|
|
18
|
+
if (entry.isFile())
|
|
19
|
+
root = absolute;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Directory or index.html absent → serve nothing (no-op).
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
app.decorate('spaRoot', root);
|
|
26
|
+
if (root !== null) {
|
|
27
|
+
app.log.info({ root }, 'serving dashboard build');
|
|
28
|
+
await app.register(fastifyStatic, {
|
|
29
|
+
root,
|
|
30
|
+
// Wildcard route; missing files fall through to the not-found handler,
|
|
31
|
+
// which applies the SPA fallback for non-/api paths.
|
|
32
|
+
wildcard: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}, { name: 'adminium-static', fastify: '5.x' });
|
|
36
|
+
//# sourceMappingURL=static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/plugins/static.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAchC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAC5B,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAClB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAE/B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,IAAI,GAAG,QAAQ,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE9B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;YAChC,IAAI;YACJ,uEAAuE;YACvE,qDAAqD;YACrD,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;AACH,CAAC,EACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,CAC5C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API-key secret handling (08-server-api.md §2.16): `adm_sk_` + 40 base62
|
|
3
|
+
* chars, shown exactly once at create time; only the SHA-256 hex hash and a
|
|
4
|
+
* short display/lookup prefix are stored (07-meta-store.md §3.7).
|
|
5
|
+
*/
|
|
6
|
+
export declare const API_KEY_PREFIX = "adm_sk_";
|
|
7
|
+
/** Secret length after the prefix. */
|
|
8
|
+
export declare const API_KEY_SECRET_LENGTH = 40;
|
|
9
|
+
/** Stored display fragment: `adm_sk_` + first 8 secret chars (fits str(16)). */
|
|
10
|
+
export declare const API_KEY_DISPLAY_PREFIX_LENGTH: number;
|
|
11
|
+
/** `last_used_at` write throttle (07 §3.7 "throttled"). */
|
|
12
|
+
export declare const API_KEY_TOUCH_INTERVAL_MS = 60000;
|
|
13
|
+
/** SHA-256 hex of the full key string — the stored `token_hash`. */
|
|
14
|
+
export declare function hashApiKey(key: string): string;
|
|
15
|
+
export interface GeneratedApiKey {
|
|
16
|
+
/** The full secret — returned to the caller once, never stored. */
|
|
17
|
+
key: string;
|
|
18
|
+
/** Display/lookup fragment persisted in the `prefix` column. */
|
|
19
|
+
prefix: string;
|
|
20
|
+
/** SHA-256 hex persisted in the `token_hash` column. */
|
|
21
|
+
tokenHash: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function generateApiKey(): GeneratedApiKey;
|
|
24
|
+
/**
|
|
25
|
+
* Extract an Adminium API key from an `Authorization` header. Returns `null`
|
|
26
|
+
* unless the scheme is Bearer *and* the token carries the `adm_sk_` prefix —
|
|
27
|
+
* other bearer tokens fall through to the session/auth plugin untouched.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseBearerApiKey(authorization: string | undefined): string | null;
|
|
30
|
+
//# sourceMappingURL=api-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../src/rbac/api-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC,sCAAsC;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,QAA4B,CAAC;AAEvE,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAIhD,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,IAAI,eAAe,CAOhD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMlF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API-key secret handling (08-server-api.md §2.16): `adm_sk_` + 40 base62
|
|
3
|
+
* chars, shown exactly once at create time; only the SHA-256 hex hash and a
|
|
4
|
+
* short display/lookup prefix are stored (07-meta-store.md §3.7).
|
|
5
|
+
*/
|
|
6
|
+
import { createHash, randomInt } from 'node:crypto';
|
|
7
|
+
export const API_KEY_PREFIX = 'adm_sk_';
|
|
8
|
+
/** Secret length after the prefix. */
|
|
9
|
+
export const API_KEY_SECRET_LENGTH = 40;
|
|
10
|
+
/** Stored display fragment: `adm_sk_` + first 8 secret chars (fits str(16)). */
|
|
11
|
+
export const API_KEY_DISPLAY_PREFIX_LENGTH = API_KEY_PREFIX.length + 8;
|
|
12
|
+
/** `last_used_at` write throttle (07 §3.7 "throttled"). */
|
|
13
|
+
export const API_KEY_TOUCH_INTERVAL_MS = 60_000;
|
|
14
|
+
const BASE62 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
15
|
+
/** SHA-256 hex of the full key string — the stored `token_hash`. */
|
|
16
|
+
export function hashApiKey(key) {
|
|
17
|
+
return createHash('sha256').update(key, 'utf8').digest('hex');
|
|
18
|
+
}
|
|
19
|
+
export function generateApiKey() {
|
|
20
|
+
let secret = '';
|
|
21
|
+
for (let i = 0; i < API_KEY_SECRET_LENGTH; i += 1) {
|
|
22
|
+
secret += BASE62[randomInt(BASE62.length)];
|
|
23
|
+
}
|
|
24
|
+
const key = `${API_KEY_PREFIX}${secret}`;
|
|
25
|
+
return { key, prefix: key.slice(0, API_KEY_DISPLAY_PREFIX_LENGTH), tokenHash: hashApiKey(key) };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Extract an Adminium API key from an `Authorization` header. Returns `null`
|
|
29
|
+
* unless the scheme is Bearer *and* the token carries the `adm_sk_` prefix —
|
|
30
|
+
* other bearer tokens fall through to the session/auth plugin untouched.
|
|
31
|
+
*/
|
|
32
|
+
export function parseBearerApiKey(authorization) {
|
|
33
|
+
if (authorization === undefined)
|
|
34
|
+
return null;
|
|
35
|
+
const match = /^Bearer\s+(\S+)$/i.exec(authorization.trim());
|
|
36
|
+
if (match === null)
|
|
37
|
+
return null;
|
|
38
|
+
const token = match[1];
|
|
39
|
+
return token.startsWith(API_KEY_PREFIX) ? token : null;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=api-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../src/rbac/api-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AAExC,sCAAsC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,gFAAgF;AAChF,MAAM,CAAC,MAAM,6BAA6B,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;AAEvE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,GAAG,gEAAgE,CAAC;AAEhF,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAWD,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,cAAc,GAAG,MAAM,EAAE,CAAC;IACzC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,6BAA6B,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAiC;IACjE,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;IACjC,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC permission grammar (08-server-api.md §5.1) and its mapping onto the
|
|
3
|
+
* `adminium_role_permissions` matrix rows (07-meta-store.md §3.9).
|
|
4
|
+
*
|
|
5
|
+
* Grant strings:
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* system:<area>:<verb> // closed set — meta SYSTEM_ACTION_KEYS,
|
|
9
|
+
* // e.g. system:users:manage ⇔ `users.manage`
|
|
10
|
+
* table:<connectionId>:<table>:<action> // action: read|create|update|delete|export|import
|
|
11
|
+
* page:<pageId>:<view|edit>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Wildcards: `*` may stand in for any single segment of a stored `table:` or
|
|
15
|
+
* `page:` grant (`table:*:*:read`). Permissions *checked* at enforcement time
|
|
16
|
+
* are always concrete. `system:` grants are always concrete and validated
|
|
17
|
+
* against the v1 closed set. Deny-by-default: anything unparseable never
|
|
18
|
+
* matches anything.
|
|
19
|
+
*
|
|
20
|
+
* Reserved keys: meta's `RESERVED_SYSTEM_ACTION_KEYS` (automations.manage,
|
|
21
|
+
* webhooks.manage, manifests.manage, sql.run) are deferred features with no
|
|
22
|
+
* enforcement point in v1. The grammar here still accepts them — stored
|
|
23
|
+
* grants must keep round-tripping — but no permissions UI may offer them;
|
|
24
|
+
* grantable lists come from meta's `GRANTABLE_SYSTEM_ACTION_KEYS`.
|
|
25
|
+
*/
|
|
26
|
+
import { type PermissionActions, type ResourceKind, type RolePermission } from '@adminium/meta';
|
|
27
|
+
/** Table matrix actions (07-meta-store.md §3.9 `actions` payload). */
|
|
28
|
+
export declare const TABLE_ACTIONS: readonly ["read", "create", "update", "delete", "export", "import"];
|
|
29
|
+
export type TableAction = (typeof TABLE_ACTIONS)[number];
|
|
30
|
+
export declare const PAGE_ACTIONS: readonly ["view", "edit"];
|
|
31
|
+
export type PageAction = (typeof PAGE_ACTIONS)[number];
|
|
32
|
+
/** Canonical permission constants used by route guards in this wave. */
|
|
33
|
+
export declare const PERMISSIONS: {
|
|
34
|
+
readonly usersManage: "system:users:manage";
|
|
35
|
+
readonly rolesManage: "system:roles:manage";
|
|
36
|
+
readonly settingsManage: "system:settings:manage";
|
|
37
|
+
readonly auditRead: "system:audit:read";
|
|
38
|
+
readonly apiKeysManage: "system:api-keys:manage";
|
|
39
|
+
readonly exportsManage: "system:exports:manage";
|
|
40
|
+
readonly importsManage: "system:imports:manage";
|
|
41
|
+
readonly reportsManage: "system:reports:manage";
|
|
42
|
+
readonly jobsRead: "system:jobs:read";
|
|
43
|
+
readonly jobsManage: "system:jobs:manage";
|
|
44
|
+
};
|
|
45
|
+
export type ParsedGrant = {
|
|
46
|
+
kind: 'system';
|
|
47
|
+
area: string;
|
|
48
|
+
verb: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'table';
|
|
51
|
+
connectionId: string;
|
|
52
|
+
table: string;
|
|
53
|
+
action: TableAction | '*';
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'page';
|
|
56
|
+
pageId: string;
|
|
57
|
+
action: PageAction | '*';
|
|
58
|
+
};
|
|
59
|
+
/** A concrete (wildcard-free) permission, as passed to `can()`/`require()`. */
|
|
60
|
+
export type ParsedPermission = {
|
|
61
|
+
kind: 'system';
|
|
62
|
+
area: string;
|
|
63
|
+
verb: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: 'table';
|
|
66
|
+
connectionId: string;
|
|
67
|
+
table: string;
|
|
68
|
+
action: TableAction;
|
|
69
|
+
} | {
|
|
70
|
+
kind: 'page';
|
|
71
|
+
pageId: string;
|
|
72
|
+
action: PageAction;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Parse a grant string (wildcards allowed on table/page segments).
|
|
76
|
+
* Returns `null` for anything outside the grammar — never throws.
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseGrant(input: string): ParsedGrant | null;
|
|
79
|
+
/** Parse a concrete permission for an enforcement check — no wildcards. */
|
|
80
|
+
export declare function parsePermission(input: string): ParsedPermission | null;
|
|
81
|
+
/** Does one stored grant satisfy one concrete required permission? */
|
|
82
|
+
export declare function grantMatches(grant: string, required: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Deny-by-default union check: exact set hit first, then the wildcard scan.
|
|
85
|
+
* `grants` must contain normalized grant strings (as produced by
|
|
86
|
+
* {@link grantsFromMatrixRows}).
|
|
87
|
+
*/
|
|
88
|
+
export declare function isGranted(grants: ReadonlySet<string>, required: string): boolean;
|
|
89
|
+
/** Expand matrix rows into the flat, normalized grant-string union. */
|
|
90
|
+
export declare function grantsFromMatrixRows(rows: readonly RolePermission[]): string[];
|
|
91
|
+
export interface MatrixRowInput {
|
|
92
|
+
resourceKind: ResourceKind;
|
|
93
|
+
resourceRef: string;
|
|
94
|
+
actions: PermissionActions;
|
|
95
|
+
}
|
|
96
|
+
export interface MatrixConversion {
|
|
97
|
+
rows: MatrixRowInput[];
|
|
98
|
+
/** Grant strings outside the grammar (or unknown system keys). */
|
|
99
|
+
invalid: string[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Group a `grants: string[]` payload (PUT /roles/:id/permissions) into matrix
|
|
103
|
+
* rows, merging grants that land on the same (kind, ref) cell. Invalid grants
|
|
104
|
+
* are collected instead of thrown so the route can 422 with the full list.
|
|
105
|
+
*/
|
|
106
|
+
export declare function matrixRowsFromGrants(grants: readonly string[]): MatrixConversion;
|
|
107
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/rbac/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AAExB,sEAAsE;AACtE,eAAO,MAAM,aAAa,qEAAsE,CAAC;AACjG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,YAAY,2BAA4B,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,wEAAwE;AACxE,eAAO,MAAM,WAAW;;;;;;;;;;;CAiBd,CAAC;AAEX,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAAA;CAAE,CAAC;AAE/D,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAWzD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA2B5D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAYtE;AAMD,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsBrE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOhF;AAkBD,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAyB9E;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CA0ChF"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RBAC permission grammar (08-server-api.md §5.1) and its mapping onto the
|
|
3
|
+
* `adminium_role_permissions` matrix rows (07-meta-store.md §3.9).
|
|
4
|
+
*
|
|
5
|
+
* Grant strings:
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* system:<area>:<verb> // closed set — meta SYSTEM_ACTION_KEYS,
|
|
9
|
+
* // e.g. system:users:manage ⇔ `users.manage`
|
|
10
|
+
* table:<connectionId>:<table>:<action> // action: read|create|update|delete|export|import
|
|
11
|
+
* page:<pageId>:<view|edit>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Wildcards: `*` may stand in for any single segment of a stored `table:` or
|
|
15
|
+
* `page:` grant (`table:*:*:read`). Permissions *checked* at enforcement time
|
|
16
|
+
* are always concrete. `system:` grants are always concrete and validated
|
|
17
|
+
* against the v1 closed set. Deny-by-default: anything unparseable never
|
|
18
|
+
* matches anything.
|
|
19
|
+
*
|
|
20
|
+
* Reserved keys: meta's `RESERVED_SYSTEM_ACTION_KEYS` (automations.manage,
|
|
21
|
+
* webhooks.manage, manifests.manage, sql.run) are deferred features with no
|
|
22
|
+
* enforcement point in v1. The grammar here still accepts them — stored
|
|
23
|
+
* grants must keep round-tripping — but no permissions UI may offer them;
|
|
24
|
+
* grantable lists come from meta's `GRANTABLE_SYSTEM_ACTION_KEYS`.
|
|
25
|
+
*/
|
|
26
|
+
import { SYSTEM_ACTION_KEYS, } from '@adminium/meta';
|
|
27
|
+
/** Table matrix actions (07-meta-store.md §3.9 `actions` payload). */
|
|
28
|
+
export const TABLE_ACTIONS = ['read', 'create', 'update', 'delete', 'export', 'import'];
|
|
29
|
+
export const PAGE_ACTIONS = ['view', 'edit'];
|
|
30
|
+
/** Canonical permission constants used by route guards in this wave. */
|
|
31
|
+
export const PERMISSIONS = {
|
|
32
|
+
usersManage: 'system:users:manage',
|
|
33
|
+
rolesManage: 'system:roles:manage',
|
|
34
|
+
settingsManage: 'system:settings:manage',
|
|
35
|
+
auditRead: 'system:audit:read',
|
|
36
|
+
apiKeysManage: 'system:api-keys:manage',
|
|
37
|
+
// M7 wave 2 (T5 data-io + T6 scheduled reports). The routes carry local
|
|
38
|
+
// constants (EXPORTS_MANAGE_PERMISSION / IMPORTS_MANAGE_PERMISSION /
|
|
39
|
+
// REPORTS_MANAGE_PERMISSION); these are the canonical spellings.
|
|
40
|
+
exportsManage: 'system:exports:manage',
|
|
41
|
+
importsManage: 'system:imports:manage',
|
|
42
|
+
reportsManage: 'system:reports:manage',
|
|
43
|
+
// Jobs (08 §2.17). The routes/realtime hub carry local constants
|
|
44
|
+
// (JOBS_READ_PERMISSION / JOBS_MANAGE_PERMISSION in realtime/hub.ts);
|
|
45
|
+
// these are the canonical spellings.
|
|
46
|
+
jobsRead: 'system:jobs:read',
|
|
47
|
+
jobsManage: 'system:jobs:manage',
|
|
48
|
+
};
|
|
49
|
+
const SYSTEM_KEY_SET = new Set(SYSTEM_ACTION_KEYS);
|
|
50
|
+
const TABLE_ACTION_SET = new Set(TABLE_ACTIONS);
|
|
51
|
+
const PAGE_ACTION_SET = new Set(PAGE_ACTIONS);
|
|
52
|
+
/** Segments may not be empty and may not contain `:`, `/`, or whitespace. */
|
|
53
|
+
function validSegment(segment) {
|
|
54
|
+
return segment.length > 0 && !/[:\s/]/.test(segment);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse a grant string (wildcards allowed on table/page segments).
|
|
58
|
+
* Returns `null` for anything outside the grammar — never throws.
|
|
59
|
+
*/
|
|
60
|
+
export function parseGrant(input) {
|
|
61
|
+
const segments = input.split(':');
|
|
62
|
+
const kind = segments[0];
|
|
63
|
+
if (kind === 'system' && segments.length === 3) {
|
|
64
|
+
const [, area, verb] = segments;
|
|
65
|
+
if (!validSegment(area) || !validSegment(verb))
|
|
66
|
+
return null;
|
|
67
|
+
if (area === '*' || verb === '*')
|
|
68
|
+
return null; // system grants are concrete
|
|
69
|
+
if (!SYSTEM_KEY_SET.has(`${area}.${verb}`))
|
|
70
|
+
return null; // v1 closed set
|
|
71
|
+
return { kind: 'system', area, verb };
|
|
72
|
+
}
|
|
73
|
+
if (kind === 'table' && segments.length === 4) {
|
|
74
|
+
const [, connectionId, table, action] = segments;
|
|
75
|
+
if (!validSegment(connectionId) || !validSegment(table))
|
|
76
|
+
return null;
|
|
77
|
+
if (action !== '*' && !TABLE_ACTION_SET.has(action))
|
|
78
|
+
return null;
|
|
79
|
+
return { kind: 'table', connectionId, table, action: action };
|
|
80
|
+
}
|
|
81
|
+
if (kind === 'page' && segments.length === 3) {
|
|
82
|
+
const [, pageId, action] = segments;
|
|
83
|
+
if (!validSegment(pageId))
|
|
84
|
+
return null;
|
|
85
|
+
if (action !== '*' && !PAGE_ACTION_SET.has(action))
|
|
86
|
+
return null;
|
|
87
|
+
return { kind: 'page', pageId, action: action };
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/** Parse a concrete permission for an enforcement check — no wildcards. */
|
|
92
|
+
export function parsePermission(input) {
|
|
93
|
+
const parsed = parseGrant(input);
|
|
94
|
+
if (parsed === null)
|
|
95
|
+
return null;
|
|
96
|
+
if (parsed.kind === 'table') {
|
|
97
|
+
if (parsed.connectionId === '*' || parsed.table === '*' || parsed.action === '*')
|
|
98
|
+
return null;
|
|
99
|
+
return parsed;
|
|
100
|
+
}
|
|
101
|
+
if (parsed.kind === 'page') {
|
|
102
|
+
if (parsed.pageId === '*' || parsed.action === '*')
|
|
103
|
+
return null;
|
|
104
|
+
return parsed;
|
|
105
|
+
}
|
|
106
|
+
return parsed;
|
|
107
|
+
}
|
|
108
|
+
function segmentMatches(grantSegment, requiredSegment) {
|
|
109
|
+
return grantSegment === '*' || grantSegment === requiredSegment;
|
|
110
|
+
}
|
|
111
|
+
/** Does one stored grant satisfy one concrete required permission? */
|
|
112
|
+
export function grantMatches(grant, required) {
|
|
113
|
+
const g = parseGrant(grant);
|
|
114
|
+
const r = parsePermission(required);
|
|
115
|
+
if (g === null || r === null || g.kind !== r.kind)
|
|
116
|
+
return false;
|
|
117
|
+
switch (r.kind) {
|
|
118
|
+
case 'system': {
|
|
119
|
+
const gs = g;
|
|
120
|
+
return gs.area === r.area && gs.verb === r.verb;
|
|
121
|
+
}
|
|
122
|
+
case 'table': {
|
|
123
|
+
const gt = g;
|
|
124
|
+
return (segmentMatches(gt.connectionId, r.connectionId) &&
|
|
125
|
+
segmentMatches(gt.table, r.table) &&
|
|
126
|
+
segmentMatches(gt.action, r.action));
|
|
127
|
+
}
|
|
128
|
+
case 'page': {
|
|
129
|
+
const gp = g;
|
|
130
|
+
return segmentMatches(gp.pageId, r.pageId) && segmentMatches(gp.action, r.action);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Deny-by-default union check: exact set hit first, then the wildcard scan.
|
|
136
|
+
* `grants` must contain normalized grant strings (as produced by
|
|
137
|
+
* {@link grantsFromMatrixRows}).
|
|
138
|
+
*/
|
|
139
|
+
export function isGranted(grants, required) {
|
|
140
|
+
if (parsePermission(required) === null)
|
|
141
|
+
return false;
|
|
142
|
+
if (grants.has(required))
|
|
143
|
+
return true;
|
|
144
|
+
for (const grant of grants) {
|
|
145
|
+
if (grant.includes('*') && grantMatches(grant, required))
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
// --- matrix-row ⇄ grant-string mapping ---------------------------------------
|
|
151
|
+
/** `table` resource_ref is `<connectionId>/<schema.table>` (07 §3.9). */
|
|
152
|
+
function splitTableRef(resourceRef) {
|
|
153
|
+
const slash = resourceRef.indexOf('/');
|
|
154
|
+
if (slash <= 0 || slash === resourceRef.length - 1)
|
|
155
|
+
return null;
|
|
156
|
+
return { connectionId: resourceRef.slice(0, slash), table: resourceRef.slice(slash + 1) };
|
|
157
|
+
}
|
|
158
|
+
/** `system` resource_ref is the dotted action key, e.g. `users.manage`. */
|
|
159
|
+
function splitSystemRef(resourceRef) {
|
|
160
|
+
const dot = resourceRef.indexOf('.');
|
|
161
|
+
if (dot <= 0 || dot === resourceRef.length - 1)
|
|
162
|
+
return null;
|
|
163
|
+
return { area: resourceRef.slice(0, dot), verb: resourceRef.slice(dot + 1) };
|
|
164
|
+
}
|
|
165
|
+
/** Expand matrix rows into the flat, normalized grant-string union. */
|
|
166
|
+
export function grantsFromMatrixRows(rows) {
|
|
167
|
+
const grants = [];
|
|
168
|
+
for (const row of rows) {
|
|
169
|
+
if (row.resourceKind === 'system') {
|
|
170
|
+
const ref = splitSystemRef(row.resourceRef);
|
|
171
|
+
if (ref !== null && row.actions.allowed === true) {
|
|
172
|
+
grants.push(`system:${ref.area}:${ref.verb}`);
|
|
173
|
+
}
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (row.resourceKind === 'table') {
|
|
177
|
+
const ref = splitTableRef(row.resourceRef);
|
|
178
|
+
if (ref === null)
|
|
179
|
+
continue;
|
|
180
|
+
const actions = row.actions;
|
|
181
|
+
for (const action of TABLE_ACTIONS) {
|
|
182
|
+
if (actions[action] === true)
|
|
183
|
+
grants.push(`table:${ref.connectionId}:${ref.table}:${action}`);
|
|
184
|
+
}
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const actions = row.actions;
|
|
188
|
+
for (const action of PAGE_ACTIONS) {
|
|
189
|
+
if (actions[action] === true)
|
|
190
|
+
grants.push(`page:${row.resourceRef}:${action}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return grants;
|
|
194
|
+
}
|
|
195
|
+
function emptyTableActions() {
|
|
196
|
+
return { read: false, create: false, update: false, delete: false, export: false, import: false };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Group a `grants: string[]` payload (PUT /roles/:id/permissions) into matrix
|
|
200
|
+
* rows, merging grants that land on the same (kind, ref) cell. Invalid grants
|
|
201
|
+
* are collected instead of thrown so the route can 422 with the full list.
|
|
202
|
+
*/
|
|
203
|
+
export function matrixRowsFromGrants(grants) {
|
|
204
|
+
const invalid = [];
|
|
205
|
+
const tableRows = new Map();
|
|
206
|
+
const pageRows = new Map();
|
|
207
|
+
const systemRefs = new Set();
|
|
208
|
+
for (const grant of grants) {
|
|
209
|
+
const parsed = parseGrant(grant);
|
|
210
|
+
if (parsed === null) {
|
|
211
|
+
invalid.push(grant);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (parsed.kind === 'system') {
|
|
215
|
+
systemRefs.add(`${parsed.area}.${parsed.verb}`);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (parsed.kind === 'table') {
|
|
219
|
+
const ref = `${parsed.connectionId}/${parsed.table}`;
|
|
220
|
+
const actions = tableRows.get(ref) ?? emptyTableActions();
|
|
221
|
+
if (parsed.action === '*') {
|
|
222
|
+
for (const action of TABLE_ACTIONS)
|
|
223
|
+
actions[action] = true;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
actions[parsed.action] = true;
|
|
227
|
+
}
|
|
228
|
+
tableRows.set(ref, actions);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const actions = pageRows.get(parsed.pageId) ?? { view: false, edit: false };
|
|
232
|
+
if (parsed.action === '*') {
|
|
233
|
+
actions.view = true;
|
|
234
|
+
actions.edit = true;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
actions[parsed.action] = true;
|
|
238
|
+
}
|
|
239
|
+
pageRows.set(parsed.pageId, actions);
|
|
240
|
+
}
|
|
241
|
+
const rows = [];
|
|
242
|
+
for (const ref of systemRefs)
|
|
243
|
+
rows.push({ resourceKind: 'system', resourceRef: ref, actions: { allowed: true } });
|
|
244
|
+
for (const [ref, actions] of tableRows)
|
|
245
|
+
rows.push({ resourceKind: 'table', resourceRef: ref, actions });
|
|
246
|
+
for (const [ref, actions] of pageRows)
|
|
247
|
+
rows.push({ resourceKind: 'page', resourceRef: ref, actions });
|
|
248
|
+
return { rows, invalid };
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=permissions.js.map
|