@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,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory widget-data result cache (04-widget-registry.md §5.2 step 6).
|
|
3
|
+
*
|
|
4
|
+
* Keyed on `sha256(descriptor + params + connection + role scope)` so two
|
|
5
|
+
* callers with different role sets (or unmask grants) never share entries.
|
|
6
|
+
* TTL defaults to 30 s (constructor-configurable; 04 specifies
|
|
7
|
+
* `min(binding.refreshInterval ?? 60, 60)` — the binding's interval lives
|
|
8
|
+
* client-side, so the server applies a flat conservative TTL for now).
|
|
9
|
+
*
|
|
10
|
+
* `invalidateTable(connectionId, tableId)` drops a table's entries — the
|
|
11
|
+
* CRUD mutation hook wires into it when the widget-data plugin and data
|
|
12
|
+
* routes share one composition root (start.ts wiring, M4 exit). No
|
|
13
|
+
* cross-process cache by design (works identically inside Electron).
|
|
14
|
+
*/
|
|
15
|
+
export declare const WIDGET_CACHE_TTL_MS = 30000;
|
|
16
|
+
export declare function cacheKeyOf(input: {
|
|
17
|
+
descriptor: unknown;
|
|
18
|
+
params: unknown;
|
|
19
|
+
connectionId: string;
|
|
20
|
+
roleScope: string;
|
|
21
|
+
}): string;
|
|
22
|
+
export declare class WidgetDataCache {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(opts?: {
|
|
25
|
+
ttlMs?: number | undefined;
|
|
26
|
+
now?: (() => number) | undefined;
|
|
27
|
+
});
|
|
28
|
+
get(key: string): unknown | undefined;
|
|
29
|
+
set(key: string, value: unknown, connectionId: string, tableId: string): void;
|
|
30
|
+
/** Drop every cached result over one table (CRUD mutation invalidation). */
|
|
31
|
+
invalidateTable(connectionId: string, tableId: string): void;
|
|
32
|
+
clear(): void;
|
|
33
|
+
get size(): number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/widget-data/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAU1C,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAET;AAED,qBAAa,eAAe;;gBAKd,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAA;KAAO;IAKvF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAUrC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAa7E,4EAA4E;IAC5E,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5D,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory widget-data result cache (04-widget-registry.md §5.2 step 6).
|
|
3
|
+
*
|
|
4
|
+
* Keyed on `sha256(descriptor + params + connection + role scope)` so two
|
|
5
|
+
* callers with different role sets (or unmask grants) never share entries.
|
|
6
|
+
* TTL defaults to 30 s (constructor-configurable; 04 specifies
|
|
7
|
+
* `min(binding.refreshInterval ?? 60, 60)` — the binding's interval lives
|
|
8
|
+
* client-side, so the server applies a flat conservative TTL for now).
|
|
9
|
+
*
|
|
10
|
+
* `invalidateTable(connectionId, tableId)` drops a table's entries — the
|
|
11
|
+
* CRUD mutation hook wires into it when the widget-data plugin and data
|
|
12
|
+
* routes share one composition root (start.ts wiring, M4 exit). No
|
|
13
|
+
* cross-process cache by design (works identically inside Electron).
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
export const WIDGET_CACHE_TTL_MS = 30_000;
|
|
17
|
+
const MAX_ENTRIES = 500;
|
|
18
|
+
export function cacheKeyOf(input) {
|
|
19
|
+
return createHash('sha256').update(JSON.stringify(input)).digest('hex');
|
|
20
|
+
}
|
|
21
|
+
export class WidgetDataCache {
|
|
22
|
+
#ttlMs;
|
|
23
|
+
#now;
|
|
24
|
+
#entries = new Map();
|
|
25
|
+
constructor(opts = {}) {
|
|
26
|
+
this.#ttlMs = opts.ttlMs ?? WIDGET_CACHE_TTL_MS;
|
|
27
|
+
this.#now = opts.now ?? Date.now;
|
|
28
|
+
}
|
|
29
|
+
get(key) {
|
|
30
|
+
const entry = this.#entries.get(key);
|
|
31
|
+
if (entry === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (entry.expiresAt <= this.#now()) {
|
|
34
|
+
this.#entries.delete(key);
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return entry.value;
|
|
38
|
+
}
|
|
39
|
+
set(key, value, connectionId, tableId) {
|
|
40
|
+
// FIFO eviction at the cap — Map iteration order is insertion order.
|
|
41
|
+
if (!this.#entries.has(key) && this.#entries.size >= MAX_ENTRIES) {
|
|
42
|
+
const oldest = this.#entries.keys().next().value;
|
|
43
|
+
if (oldest !== undefined)
|
|
44
|
+
this.#entries.delete(oldest);
|
|
45
|
+
}
|
|
46
|
+
this.#entries.set(key, {
|
|
47
|
+
value,
|
|
48
|
+
expiresAt: this.#now() + this.#ttlMs,
|
|
49
|
+
tableKey: `${connectionId}:${tableId}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Drop every cached result over one table (CRUD mutation invalidation). */
|
|
53
|
+
invalidateTable(connectionId, tableId) {
|
|
54
|
+
const tableKey = `${connectionId}:${tableId}`;
|
|
55
|
+
for (const [key, entry] of this.#entries) {
|
|
56
|
+
if (entry.tableKey === tableKey)
|
|
57
|
+
this.#entries.delete(key);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
clear() {
|
|
61
|
+
this.#entries.clear();
|
|
62
|
+
}
|
|
63
|
+
get size() {
|
|
64
|
+
return this.#entries.size;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/widget-data/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,WAAW,GAAG,GAAG,CAAC;AASxB,MAAM,UAAU,UAAU,CAAC,KAK1B;IACC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,MAAM,CAAS;IACf,IAAI,CAAe;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAElD,YAAY,OAAyE,EAAE;QACrF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,YAAoB,EAAE,OAAe;QACpE,qEAAqE;QACrE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACjD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;YACrB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM;YACpC,QAAQ,EAAE,GAAG,YAAY,IAAI,OAAO,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,eAAe,CAAC,YAAoB,EAAE,OAAe;QACnD,MAAM,QAAQ,GAAG,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query-descriptor compiler (04-widget-registry.md §5.2, M4-T04 subset).
|
|
3
|
+
*
|
|
4
|
+
* Turns a validated `QueryDescriptor` (the pure-Zod leaf shared through
|
|
5
|
+
* `@adminium/engine/config`) into dynamic Kysely over the data connection.
|
|
6
|
+
* Invariants, identical to the CRUD layer (08-server-api.md §7 item 1):
|
|
7
|
+
*
|
|
8
|
+
* - every table/column string that reaches SQL is the schema snapshot's own
|
|
9
|
+
* (`SnapshotView` resolution → 422 `UNKNOWN_IDENTIFIER` otherwise);
|
|
10
|
+
* - PII-masked columns may not be selected, filtered, grouped, bucketed,
|
|
11
|
+
* aggregated, or sorted by callers without the unmask grant → 403
|
|
12
|
+
* `COLUMN_FORBIDDEN` (04 §5.2 step 3);
|
|
13
|
+
* - all values bind as parameters; the only inlined token is the bucket
|
|
14
|
+
* unit, drawn from a closed Zod enum.
|
|
15
|
+
*
|
|
16
|
+
* M4 scope notes: shapes compiled here are `single-metric`, `metric+delta`,
|
|
17
|
+
* `timeseries`, `categorical`, and `record-list` (the M4 widget set).
|
|
18
|
+
* `percentile` aggregations and the remaining shapes reject with 422 until
|
|
19
|
+
* 04-T09/T10.
|
|
20
|
+
*
|
|
21
|
+
* Dialect divergence (04 §5.2 step 4): time bucketing and rolling-window
|
|
22
|
+
* bounds are the two clauses whose SQL differs per engine. Rather than a
|
|
23
|
+
* kysely-typed adapter hook (the `@adminium/engine/adapter` `QueryEngine`
|
|
24
|
+
* contract must stay free of a `kysely` dependency — it types the dialect
|
|
25
|
+
* opaquely), the compiler branches on the connection's engine here, where
|
|
26
|
+
* kysely and the rest of the SQL compilation already live: `bucketExpr()`
|
|
27
|
+
* emits `date_trunc` / `strftime` / `DATE_FORMAT` per dialect, and window
|
|
28
|
+
* boundaries bind as a `Date` on Postgres but as a UTC `'YYYY-MM-DD
|
|
29
|
+
* HH:MM:SS'` string on MySQL/SQLite (better-sqlite3 refuses to bind a
|
|
30
|
+
* `Date`).
|
|
31
|
+
*/
|
|
32
|
+
import { type Kysely, type SelectQueryBuilder } from 'kysely';
|
|
33
|
+
import type { BucketUnit, QueryDescriptor } from '@adminium/engine/config';
|
|
34
|
+
import type { Dialect } from '@adminium/engine';
|
|
35
|
+
import type { SourceDatabase } from '../connections/manager.js';
|
|
36
|
+
import { type FilterCondition } from '../crud/filters.js';
|
|
37
|
+
import type { ResolvedColumn, ResolvedTable, SnapshotView } from '../crud/identifiers.js';
|
|
38
|
+
/** Hard row cap on any compiled query (04 §5.2 guardrails). */
|
|
39
|
+
export declare const WIDGET_LIMIT_MAX = 1000;
|
|
40
|
+
/** Default page size for `record-list` descriptors without a `limit`. */
|
|
41
|
+
export declare const RECORD_LIST_LIMIT_DEFAULT = 50;
|
|
42
|
+
/** Group-by cardinality cap — excess folds into `__other` (04 §5.2). */
|
|
43
|
+
export declare const GROUP_BUCKET_CAP = 500;
|
|
44
|
+
/** Reserved output aliases the shaper relies on. */
|
|
45
|
+
export declare const BUCKET_ALIAS = "__bucket";
|
|
46
|
+
export declare const GROUP_ALIAS = "__group";
|
|
47
|
+
type Qb = SelectQueryBuilder<SourceDatabase, string, Record<string, unknown>>;
|
|
48
|
+
export interface CompileWidgetQueryOptions {
|
|
49
|
+
db: Kysely<SourceDatabase>;
|
|
50
|
+
view: SnapshotView;
|
|
51
|
+
descriptor: QueryDescriptor;
|
|
52
|
+
/** Page-control params for late-bound filters (`filters[].param`). */
|
|
53
|
+
params?: Record<string, unknown> | undefined;
|
|
54
|
+
canReadPii: boolean;
|
|
55
|
+
/** Source dialect — threads into the shared filter compiler (`ilike` per dialect). */
|
|
56
|
+
dialect: Dialect;
|
|
57
|
+
/** Injectable clock for `window` bounds (tests). */
|
|
58
|
+
now?: (() => Date) | undefined;
|
|
59
|
+
}
|
|
60
|
+
export interface CompiledWidgetQuery {
|
|
61
|
+
table: ResolvedTable;
|
|
62
|
+
shape: QueryDescriptor['shape'];
|
|
63
|
+
/** The main query, ready to `.execute()`. */
|
|
64
|
+
query: Qb;
|
|
65
|
+
/** Prior-window twin (`window.compareToPrior`) — same shape, shifted back. */
|
|
66
|
+
prior: Qb | null;
|
|
67
|
+
/** Output aliases of the requested aggregations, in order. */
|
|
68
|
+
aggregationAliases: string[];
|
|
69
|
+
/** Set when the query buckets by time (`timeseries`). */
|
|
70
|
+
bucketAlias: string | null;
|
|
71
|
+
/** Set when the query groups by a column (`categorical`). */
|
|
72
|
+
groupAlias: string | null;
|
|
73
|
+
/** Resolved columns of a `record-list` SELECT (masking metadata). */
|
|
74
|
+
selectedColumns: ResolvedColumn[];
|
|
75
|
+
/** Exact-count twin for `record-list` (fills `RecordList.total`). */
|
|
76
|
+
count: Qb | null;
|
|
77
|
+
/** Effective LIMIT after the hard cap. */
|
|
78
|
+
limit: number;
|
|
79
|
+
}
|
|
80
|
+
/** Resolve the descriptor's source against the snapshot (422 on unknown). */
|
|
81
|
+
export declare function resolveSource(view: SnapshotView, descriptor: QueryDescriptor): ResolvedTable;
|
|
82
|
+
/**
|
|
83
|
+
* UTC window boundaries for `window: { last, unit }` plus the immediately
|
|
84
|
+
* preceding window of the same span (04 §5.2 step 5). Calendar units go
|
|
85
|
+
* through UTC calendar arithmetic so month/quarter/year windows stay exact.
|
|
86
|
+
*/
|
|
87
|
+
export declare function windowBounds(last: number, unit: BucketUnit, now: Date): {
|
|
88
|
+
start: Date;
|
|
89
|
+
end: Date;
|
|
90
|
+
priorStart: Date;
|
|
91
|
+
priorEnd: Date;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Late-bound `param` resolution (04 §5.1): a filter carrying `param` reads
|
|
95
|
+
* its value from the page-control params; an unset param drops the filter
|
|
96
|
+
* (the control is not active). Filters with neither value nor param pass
|
|
97
|
+
* through — `is_null`/`not_null` need no value.
|
|
98
|
+
*/
|
|
99
|
+
export declare function resolveFilterParams(filters: NonNullable<QueryDescriptor['filters']>, params: Record<string, unknown>): FilterCondition[];
|
|
100
|
+
/**
|
|
101
|
+
* Compile one descriptor to dynamic Kysely. Identifier resolution and PII
|
|
102
|
+
* checks happen here; RBAC on the resolved table is the route's job (it
|
|
103
|
+
* needs the request principal).
|
|
104
|
+
*/
|
|
105
|
+
export declare function compileWidgetQuery(opts: CompileWidgetQueryOptions): CompiledWidgetQuery;
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/widget-data/compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAA2B,KAAK,MAAM,EAAmB,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACxG,OAAO,KAAK,EAAe,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAA4C,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1F,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,oDAAoD;AACpD,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,WAAW,YAAY,CAAC;AAerC,KAAK,EAAE,GAAG,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE9E,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,eAAe,CAAC;IAC5B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,UAAU,EAAE,OAAO,CAAC;IACpB,sFAAsF;IACtF,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAChC,6CAA6C;IAC7C,KAAK,EAAE,EAAE,CAAC;IACV,8EAA8E;IAC9E,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC;IACjB,8DAA8D;IAC9D,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,yDAAyD;IACzD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6DAA6D;IAC7D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,qEAAqE;IACrE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC;IACjB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,GAAG,aAAa,CAG5F;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,IAAI,GACR;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CA2B9D;AAsHD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,EAAE,CAgBnB;AAgCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,mBAAmB,CAwHvF"}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query-descriptor compiler (04-widget-registry.md §5.2, M4-T04 subset).
|
|
3
|
+
*
|
|
4
|
+
* Turns a validated `QueryDescriptor` (the pure-Zod leaf shared through
|
|
5
|
+
* `@adminium/engine/config`) into dynamic Kysely over the data connection.
|
|
6
|
+
* Invariants, identical to the CRUD layer (08-server-api.md §7 item 1):
|
|
7
|
+
*
|
|
8
|
+
* - every table/column string that reaches SQL is the schema snapshot's own
|
|
9
|
+
* (`SnapshotView` resolution → 422 `UNKNOWN_IDENTIFIER` otherwise);
|
|
10
|
+
* - PII-masked columns may not be selected, filtered, grouped, bucketed,
|
|
11
|
+
* aggregated, or sorted by callers without the unmask grant → 403
|
|
12
|
+
* `COLUMN_FORBIDDEN` (04 §5.2 step 3);
|
|
13
|
+
* - all values bind as parameters; the only inlined token is the bucket
|
|
14
|
+
* unit, drawn from a closed Zod enum.
|
|
15
|
+
*
|
|
16
|
+
* M4 scope notes: shapes compiled here are `single-metric`, `metric+delta`,
|
|
17
|
+
* `timeseries`, `categorical`, and `record-list` (the M4 widget set).
|
|
18
|
+
* `percentile` aggregations and the remaining shapes reject with 422 until
|
|
19
|
+
* 04-T09/T10.
|
|
20
|
+
*
|
|
21
|
+
* Dialect divergence (04 §5.2 step 4): time bucketing and rolling-window
|
|
22
|
+
* bounds are the two clauses whose SQL differs per engine. Rather than a
|
|
23
|
+
* kysely-typed adapter hook (the `@adminium/engine/adapter` `QueryEngine`
|
|
24
|
+
* contract must stay free of a `kysely` dependency — it types the dialect
|
|
25
|
+
* opaquely), the compiler branches on the connection's engine here, where
|
|
26
|
+
* kysely and the rest of the SQL compilation already live: `bucketExpr()`
|
|
27
|
+
* emits `date_trunc` / `strftime` / `DATE_FORMAT` per dialect, and window
|
|
28
|
+
* boundaries bind as a `Date` on Postgres but as a UTC `'YYYY-MM-DD
|
|
29
|
+
* HH:MM:SS'` string on MySQL/SQLite (better-sqlite3 refuses to bind a
|
|
30
|
+
* `Date`).
|
|
31
|
+
*/
|
|
32
|
+
import { sql } from 'kysely';
|
|
33
|
+
import { ValidationFailedError } from '../errors.js';
|
|
34
|
+
import { compileFilter } from '../crud/filters.js';
|
|
35
|
+
/** Hard row cap on any compiled query (04 §5.2 guardrails). */
|
|
36
|
+
export const WIDGET_LIMIT_MAX = 1000;
|
|
37
|
+
/** Default page size for `record-list` descriptors without a `limit`. */
|
|
38
|
+
export const RECORD_LIST_LIMIT_DEFAULT = 50;
|
|
39
|
+
/** Group-by cardinality cap — excess folds into `__other` (04 §5.2). */
|
|
40
|
+
export const GROUP_BUCKET_CAP = 500;
|
|
41
|
+
/** Reserved output aliases the shaper relies on. */
|
|
42
|
+
export const BUCKET_ALIAS = '__bucket';
|
|
43
|
+
export const GROUP_ALIAS = '__group';
|
|
44
|
+
const ALIAS_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;
|
|
45
|
+
const SUPPORTED_SHAPES = new Set([
|
|
46
|
+
'single-metric',
|
|
47
|
+
'metric+delta',
|
|
48
|
+
'timeseries',
|
|
49
|
+
'categorical',
|
|
50
|
+
'record-list',
|
|
51
|
+
// Live feed snapshot (04 §5.3): compiled exactly like `record-list` (recent
|
|
52
|
+
// rows, DESC), shaped into a `StreamShape` with the resolved WS channel.
|
|
53
|
+
'stream',
|
|
54
|
+
]);
|
|
55
|
+
/** Resolve the descriptor's source against the snapshot (422 on unknown). */
|
|
56
|
+
export function resolveSource(view, descriptor) {
|
|
57
|
+
const { schema, name } = descriptor.source;
|
|
58
|
+
return view.table(schema === undefined ? name : `${schema}.${name}`);
|
|
59
|
+
}
|
|
60
|
+
function reject(message, details) {
|
|
61
|
+
throw new ValidationFailedError(message, details);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* UTC window boundaries for `window: { last, unit }` plus the immediately
|
|
65
|
+
* preceding window of the same span (04 §5.2 step 5). Calendar units go
|
|
66
|
+
* through UTC calendar arithmetic so month/quarter/year windows stay exact.
|
|
67
|
+
*/
|
|
68
|
+
export function windowBounds(last, unit, now) {
|
|
69
|
+
const shift = (from, steps) => {
|
|
70
|
+
const d = new Date(from.getTime());
|
|
71
|
+
switch (unit) {
|
|
72
|
+
case 'hour':
|
|
73
|
+
d.setTime(d.getTime() - steps * 3_600_000);
|
|
74
|
+
return d;
|
|
75
|
+
case 'day':
|
|
76
|
+
d.setTime(d.getTime() - steps * 86_400_000);
|
|
77
|
+
return d;
|
|
78
|
+
case 'week':
|
|
79
|
+
d.setTime(d.getTime() - steps * 7 * 86_400_000);
|
|
80
|
+
return d;
|
|
81
|
+
case 'month':
|
|
82
|
+
d.setUTCMonth(d.getUTCMonth() - steps);
|
|
83
|
+
return d;
|
|
84
|
+
case 'quarter':
|
|
85
|
+
d.setUTCMonth(d.getUTCMonth() - steps * 3);
|
|
86
|
+
return d;
|
|
87
|
+
case 'year':
|
|
88
|
+
d.setUTCFullYear(d.getUTCFullYear() - steps);
|
|
89
|
+
return d;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const end = now;
|
|
93
|
+
const start = shift(end, last);
|
|
94
|
+
return { start, end, priorStart: shift(start, last), priorEnd: start };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Time-bucket expression, compiled per dialect (04 §5.2 step 4). Every bucket
|
|
98
|
+
* evaluates to the ISO-lexicographic start of its period, so `GROUP BY` /
|
|
99
|
+
* `ORDER BY` over the raw expression sort chronologically and the shaper's
|
|
100
|
+
* `toIso` parses the result the same way for all three engines. The unit is a
|
|
101
|
+
* closed Zod enum and every format token is a source constant — no caller
|
|
102
|
+
* string is inlined; the only interpolation is the snapshot's own column ref.
|
|
103
|
+
*/
|
|
104
|
+
function bucketExpr(dialect, ref, unit) {
|
|
105
|
+
switch (dialect) {
|
|
106
|
+
case 'mysql':
|
|
107
|
+
return mysqlBucketExpr(ref, unit);
|
|
108
|
+
case 'sqlite':
|
|
109
|
+
return sqliteBucketExpr(ref, unit);
|
|
110
|
+
// 'postgres' and the schema-only 'generic' fall through to date_trunc,
|
|
111
|
+
// which covers every unit natively.
|
|
112
|
+
default:
|
|
113
|
+
return sql `date_trunc(${sql.lit(unit)}, ${ref})`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** MySQL bucket start (`DATE_FORMAT` / calendar arithmetic). */
|
|
117
|
+
function mysqlBucketExpr(ref, unit) {
|
|
118
|
+
switch (unit) {
|
|
119
|
+
case 'hour':
|
|
120
|
+
return sql `date_format(${ref}, '%Y-%m-%d %H:00:00')`;
|
|
121
|
+
case 'day':
|
|
122
|
+
return sql `date_format(${ref}, '%Y-%m-%d')`;
|
|
123
|
+
case 'week':
|
|
124
|
+
// WEEKDAY() is 0=Monday…6=Sunday, so subtracting it lands on the ISO
|
|
125
|
+
// Monday — matching Postgres `date_trunc('week', …)`.
|
|
126
|
+
return sql `date_sub(date(${ref}), interval weekday(${ref}) day)`;
|
|
127
|
+
case 'month':
|
|
128
|
+
return sql `date_format(${ref}, '%Y-%m-01')`;
|
|
129
|
+
case 'quarter':
|
|
130
|
+
return sql `date(makedate(year(${ref}), 1) + interval (quarter(${ref}) - 1) quarter)`;
|
|
131
|
+
case 'year':
|
|
132
|
+
return sql `date_format(${ref}, '%Y-01-01')`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** SQLite bucket start (`strftime` over ISO-text/epoch storage). */
|
|
136
|
+
function sqliteBucketExpr(ref, unit) {
|
|
137
|
+
switch (unit) {
|
|
138
|
+
case 'hour':
|
|
139
|
+
return sql `strftime('%Y-%m-%d %H:00:00', ${ref})`;
|
|
140
|
+
case 'day':
|
|
141
|
+
return sql `strftime('%Y-%m-%d', ${ref})`;
|
|
142
|
+
case 'week':
|
|
143
|
+
// (%w + 6) % 7 remaps SQLite's 0=Sunday…6=Saturday to 0=Monday, so the
|
|
144
|
+
// offset subtracted lands on the ISO Monday (as Postgres/MySQL do).
|
|
145
|
+
return sql `date(${ref}, '-' || ((strftime('%w', ${ref}) + 6) % 7) || ' days')`;
|
|
146
|
+
case 'month':
|
|
147
|
+
return sql `strftime('%Y-%m-01', ${ref})`;
|
|
148
|
+
case 'quarter':
|
|
149
|
+
return sql `strftime('%Y', ${ref}) || '-' || printf('%02d', ((cast(strftime('%m', ${ref}) as integer) - 1) / 3) * 3 + 1) || '-01'`;
|
|
150
|
+
case 'year':
|
|
151
|
+
return sql `strftime('%Y-01-01', ${ref})`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* A rolling-window boundary as the source driver expects it: Postgres binds
|
|
156
|
+
* the `Date` directly (timestamptz), but MySQL and SQLite take a UTC
|
|
157
|
+
* `'YYYY-MM-DD HH:MM:SS'` string — `windowBounds` computes in UTC, and
|
|
158
|
+
* better-sqlite3 refuses to bind a `Date` at all (it accepts only numbers,
|
|
159
|
+
* strings, bigints, buffers and null).
|
|
160
|
+
*/
|
|
161
|
+
function windowBoundValue(date, dialect) {
|
|
162
|
+
if (dialect === 'mysql' || dialect === 'sqlite') {
|
|
163
|
+
return date.toISOString().slice(0, 19).replace('T', ' ');
|
|
164
|
+
}
|
|
165
|
+
return date;
|
|
166
|
+
}
|
|
167
|
+
/** Validate + resolve one aggregation; returns its select expression factory. */
|
|
168
|
+
function compileAggregation(db, view, table, canReadPii, aggregation) {
|
|
169
|
+
if (!ALIAS_PATTERN.test(aggregation.alias) || aggregation.alias.startsWith('__')) {
|
|
170
|
+
reject('Aggregation aliases must be simple identifiers.', { alias: aggregation.alias });
|
|
171
|
+
}
|
|
172
|
+
if (aggregation.fn === 'percentile') {
|
|
173
|
+
reject('`percentile` aggregations are not supported yet (04-T09).', {});
|
|
174
|
+
}
|
|
175
|
+
if (aggregation.column === undefined) {
|
|
176
|
+
if (aggregation.fn !== 'count') {
|
|
177
|
+
reject(`Aggregation "${aggregation.fn}" requires a column.`, { alias: aggregation.alias });
|
|
178
|
+
}
|
|
179
|
+
return { alias: aggregation.alias, expr: sql `count(*)` };
|
|
180
|
+
}
|
|
181
|
+
// 403 COLUMN_FORBIDDEN when masked and the caller lacks the unmask grant.
|
|
182
|
+
const column = view.readableColumn(table, aggregation.column, canReadPii);
|
|
183
|
+
const ref = db.dynamic.ref(column.name);
|
|
184
|
+
switch (aggregation.fn) {
|
|
185
|
+
case 'count':
|
|
186
|
+
return { alias: aggregation.alias, expr: sql `count(${ref})` };
|
|
187
|
+
case 'count_distinct':
|
|
188
|
+
return { alias: aggregation.alias, expr: sql `count(distinct ${ref})` };
|
|
189
|
+
case 'sum':
|
|
190
|
+
return { alias: aggregation.alias, expr: sql `sum(${ref})` };
|
|
191
|
+
case 'avg':
|
|
192
|
+
return { alias: aggregation.alias, expr: sql `avg(${ref})` };
|
|
193
|
+
case 'min':
|
|
194
|
+
return { alias: aggregation.alias, expr: sql `min(${ref})` };
|
|
195
|
+
case 'max':
|
|
196
|
+
return { alias: aggregation.alias, expr: sql `max(${ref})` };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Late-bound `param` resolution (04 §5.1): a filter carrying `param` reads
|
|
201
|
+
* its value from the page-control params; an unset param drops the filter
|
|
202
|
+
* (the control is not active). Filters with neither value nor param pass
|
|
203
|
+
* through — `is_null`/`not_null` need no value.
|
|
204
|
+
*/
|
|
205
|
+
export function resolveFilterParams(filters, params) {
|
|
206
|
+
const out = [];
|
|
207
|
+
for (const filter of filters) {
|
|
208
|
+
if (filter.param !== undefined) {
|
|
209
|
+
const value = params[filter.param];
|
|
210
|
+
if (value === undefined)
|
|
211
|
+
continue; // control unset — filter inactive
|
|
212
|
+
out.push({ column: filter.column, op: filter.op, value });
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
out.push(filter.value === undefined
|
|
216
|
+
? { column: filter.column, op: filter.op }
|
|
217
|
+
: { column: filter.column, op: filter.op, value: filter.value });
|
|
218
|
+
}
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
/** Shape ⇄ descriptor structural rules (04 §5.2 step 1 semantics). */
|
|
222
|
+
function assertShapeRules(descriptor) {
|
|
223
|
+
const { shape } = descriptor;
|
|
224
|
+
if (!SUPPORTED_SHAPES.has(shape)) {
|
|
225
|
+
reject(`Shape "${shape}" is not supported by the widget-data compiler yet.`, { shape });
|
|
226
|
+
}
|
|
227
|
+
const hasAgg = (descriptor.aggregations?.length ?? 0) > 0;
|
|
228
|
+
const hasGroup = (descriptor.groupBy?.length ?? 0) > 0;
|
|
229
|
+
const hasBucket = descriptor.bucket !== undefined;
|
|
230
|
+
if (shape === 'single-metric' || shape === 'metric+delta') {
|
|
231
|
+
if (!hasAgg)
|
|
232
|
+
reject(`Shape "${shape}" requires at least one aggregation.`, { shape });
|
|
233
|
+
if (hasGroup || hasBucket)
|
|
234
|
+
reject(`Shape "${shape}" cannot group or bucket.`, { shape });
|
|
235
|
+
}
|
|
236
|
+
if (shape === 'timeseries') {
|
|
237
|
+
if (!hasAgg || !hasBucket)
|
|
238
|
+
reject('Shape "timeseries" requires a `bucket` and an aggregation.', {});
|
|
239
|
+
if (hasGroup)
|
|
240
|
+
reject('Grouped timeseries is `multi-timeseries` (not supported yet).', {});
|
|
241
|
+
}
|
|
242
|
+
if (shape === 'categorical') {
|
|
243
|
+
if (!hasAgg)
|
|
244
|
+
reject('Shape "categorical" requires an aggregation.', {});
|
|
245
|
+
if ((descriptor.groupBy?.length ?? 0) !== 1) {
|
|
246
|
+
reject('Shape "categorical" requires exactly one groupBy column.', {});
|
|
247
|
+
}
|
|
248
|
+
if (hasBucket)
|
|
249
|
+
reject('Shape "categorical" cannot time-bucket; use "timeseries".', {});
|
|
250
|
+
}
|
|
251
|
+
if ((shape === 'record-list' || shape === 'stream') && (hasAgg || hasGroup || hasBucket)) {
|
|
252
|
+
reject(`Shape "${shape}" selects rows — aggregations/grouping are not allowed.`, {});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Compile one descriptor to dynamic Kysely. Identifier resolution and PII
|
|
257
|
+
* checks happen here; RBAC on the resolved table is the route's job (it
|
|
258
|
+
* needs the request principal).
|
|
259
|
+
*/
|
|
260
|
+
export function compileWidgetQuery(opts) {
|
|
261
|
+
const { db, view, descriptor, canReadPii, dialect } = opts;
|
|
262
|
+
const params = opts.params ?? {};
|
|
263
|
+
const now = opts.now ?? (() => new Date());
|
|
264
|
+
assertShapeRules(descriptor);
|
|
265
|
+
const table = resolveSource(view, descriptor);
|
|
266
|
+
const dynamic = db.dynamic;
|
|
267
|
+
const filterCtx = { view, table, canReadPii, dynamic, dialect };
|
|
268
|
+
// --- WHERE: descriptor filters (CRUD DSL compiler) + rolling window -------
|
|
269
|
+
const conditions = descriptor.filters === undefined ? [] : resolveFilterParams(descriptor.filters, params);
|
|
270
|
+
// Column resolution happens inside compileFilter via readableColumn.
|
|
271
|
+
const windowColumn = descriptor.window === undefined
|
|
272
|
+
? null
|
|
273
|
+
: view.readableColumn(table, descriptor.window.column, canReadPii);
|
|
274
|
+
const bounds = descriptor.window === undefined
|
|
275
|
+
? null
|
|
276
|
+
: windowBounds(descriptor.window.last, descriptor.window.unit, now());
|
|
277
|
+
const applyWhere = (qb, window) => {
|
|
278
|
+
let out = qb;
|
|
279
|
+
if (conditions.length > 0) {
|
|
280
|
+
out = out.where((eb) => compileFilter(eb, filterCtx, { and: conditions }));
|
|
281
|
+
}
|
|
282
|
+
if (window !== null && windowColumn !== null) {
|
|
283
|
+
const ref = dynamic.ref(windowColumn.name);
|
|
284
|
+
out = out
|
|
285
|
+
.where((eb) => eb(ref, '>=', windowBoundValue(window.start, dialect)))
|
|
286
|
+
.where((eb) => eb(ref, '<', windowBoundValue(window.end, dialect)));
|
|
287
|
+
}
|
|
288
|
+
return out;
|
|
289
|
+
};
|
|
290
|
+
// --- SELECT ----------------------------------------------------------------
|
|
291
|
+
const aggregations = descriptor.aggregations ?? [];
|
|
292
|
+
const seenAliases = new Set();
|
|
293
|
+
const compiledAggs = aggregations.map((aggregation) => {
|
|
294
|
+
if (seenAliases.has(aggregation.alias)) {
|
|
295
|
+
reject('Duplicate aggregation alias.', { alias: aggregation.alias });
|
|
296
|
+
}
|
|
297
|
+
seenAliases.add(aggregation.alias);
|
|
298
|
+
return compileAggregation(db, view, table, canReadPii, aggregation);
|
|
299
|
+
});
|
|
300
|
+
const shape = descriptor.shape;
|
|
301
|
+
const rowShape = shape === 'record-list' || shape === 'stream';
|
|
302
|
+
let selectedColumns = [];
|
|
303
|
+
const requestedLimit = descriptor.limit ?? (rowShape ? RECORD_LIST_LIMIT_DEFAULT : WIDGET_LIMIT_MAX);
|
|
304
|
+
const limit = Math.min(Math.max(requestedLimit, 1), WIDGET_LIMIT_MAX);
|
|
305
|
+
const build = (window) => {
|
|
306
|
+
let qb = applyWhere(db.selectFrom(table.id), window);
|
|
307
|
+
if (rowShape) {
|
|
308
|
+
selectedColumns =
|
|
309
|
+
descriptor.select !== undefined && descriptor.select.length > 0
|
|
310
|
+
? descriptor.select.map((name) => view.readableColumn(table, name, canReadPii))
|
|
311
|
+
: view.selectableColumns(table);
|
|
312
|
+
qb = qb.select(selectedColumns.map((column) => dynamic.ref(column.name)));
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
qb = qb.select(compiledAggs.map(({ expr, alias }) => expr.as(alias)));
|
|
316
|
+
}
|
|
317
|
+
if (shape === 'timeseries' && descriptor.bucket !== undefined) {
|
|
318
|
+
const bucketColumn = view.readableColumn(table, descriptor.bucket.column, canReadPii);
|
|
319
|
+
const bucket = bucketExpr(dialect, dynamic.ref(bucketColumn.name), descriptor.bucket.unit);
|
|
320
|
+
qb = qb.select(bucket.as(BUCKET_ALIAS)).groupBy(bucket).orderBy(bucket, 'asc');
|
|
321
|
+
}
|
|
322
|
+
if (shape === 'categorical') {
|
|
323
|
+
const groupColumn = view.readableColumn(table, descriptor.groupBy[0], canReadPii);
|
|
324
|
+
const ref = dynamic.ref(groupColumn.name);
|
|
325
|
+
qb = qb.select(sql `${ref}`.as(GROUP_ALIAS)).groupBy(ref);
|
|
326
|
+
// Deterministic fold order: biggest buckets first, by the first alias.
|
|
327
|
+
const first = compiledAggs[0];
|
|
328
|
+
if (first !== undefined)
|
|
329
|
+
qb = qb.orderBy(sql.ref(first.alias), 'desc');
|
|
330
|
+
}
|
|
331
|
+
for (const key of descriptor.orderBy ?? []) {
|
|
332
|
+
const column = view.readableColumn(table, key.column, canReadPii);
|
|
333
|
+
qb = qb.orderBy(dynamic.ref(column.name), key.dir);
|
|
334
|
+
}
|
|
335
|
+
// Aggregate-only shapes need no LIMIT; grouped/row shapes get the cap.
|
|
336
|
+
if (rowShape || shape === 'categorical' || shape === 'timeseries') {
|
|
337
|
+
qb = qb.limit(limit);
|
|
338
|
+
}
|
|
339
|
+
return qb;
|
|
340
|
+
};
|
|
341
|
+
const query = build(bounds);
|
|
342
|
+
const wantsPrior = shape === 'metric+delta' || shape === 'timeseries'
|
|
343
|
+
? descriptor.window?.compareToPrior === true
|
|
344
|
+
: false;
|
|
345
|
+
const prior = wantsPrior && bounds !== null ? build({ start: bounds.priorStart, end: bounds.priorEnd }) : null;
|
|
346
|
+
const count = shape === 'record-list'
|
|
347
|
+
? applyWhere(db.selectFrom(table.id), bounds).select((eb) => eb.fn.countAll().as('total'))
|
|
348
|
+
: null;
|
|
349
|
+
return {
|
|
350
|
+
table,
|
|
351
|
+
shape,
|
|
352
|
+
query,
|
|
353
|
+
prior,
|
|
354
|
+
count,
|
|
355
|
+
aggregationAliases: compiledAggs.map(({ alias }) => alias),
|
|
356
|
+
bucketAlias: shape === 'timeseries' ? BUCKET_ALIAS : null,
|
|
357
|
+
groupAlias: shape === 'categorical' ? GROUP_ALIAS : null,
|
|
358
|
+
selectedColumns,
|
|
359
|
+
limit,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/widget-data/compiler.ts"],"names":[],"mappings":"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"}
|