@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,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire schemas for the desktop capability grant table (11-electron.md §12).
|
|
3
|
+
*
|
|
4
|
+
* The grant identity `{ manifestId, capabilityId }` is the body of both POST
|
|
5
|
+
* (consent) and DELETE (revoke) — one shape, so a form that can grant can revoke
|
|
6
|
+
* the same thing. `capabilityId` is the closed host vocabulary (`catalog.ts`),
|
|
7
|
+
* NOT a free string: a grant for a capability this build has no provider for
|
|
8
|
+
* would be a dead row that the consent UI could offer and the host could never
|
|
9
|
+
* honour, so an unknown id is a 422 here rather than a persisted lie.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
/** The identity written by consent / removed by revoke. */
|
|
13
|
+
export declare const capabilityGrantRefBody: z.ZodObject<{
|
|
14
|
+
manifestId: z.ZodString;
|
|
15
|
+
capabilityId: z.ZodEnum<{
|
|
16
|
+
"printer.escpos": "printer.escpos";
|
|
17
|
+
}>;
|
|
18
|
+
}, z.core.$strict>;
|
|
19
|
+
export type CapabilityGrantRefBody = z.infer<typeof capabilityGrantRefBody>;
|
|
20
|
+
export declare const capabilityGrantsListReply: z.ZodObject<{
|
|
21
|
+
data: z.ZodObject<{
|
|
22
|
+
grants: z.ZodArray<z.ZodObject<{
|
|
23
|
+
manifestId: z.ZodString;
|
|
24
|
+
capabilityId: z.ZodString;
|
|
25
|
+
grantedAt: z.ZodNumber;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export type CapabilityGrantsListReply = z.infer<typeof capabilityGrantsListReply>;
|
|
30
|
+
export declare const capabilityGrantReply: z.ZodObject<{
|
|
31
|
+
data: z.ZodObject<{
|
|
32
|
+
grant: z.ZodObject<{
|
|
33
|
+
manifestId: z.ZodString;
|
|
34
|
+
capabilityId: z.ZodString;
|
|
35
|
+
grantedAt: z.ZodNumber;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
export type CapabilityGrantReply = z.infer<typeof capabilityGrantReply>;
|
|
40
|
+
export declare const capabilityRevokeReply: z.ZodObject<{
|
|
41
|
+
data: z.ZodObject<{
|
|
42
|
+
removed: z.ZodBoolean;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export type CapabilityRevokeReply = z.infer<typeof capabilityRevokeReply>;
|
|
46
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-capabilities/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB;;;;;kBAIjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,eAAO,MAAM,yBAAyB;;;;;;;;iBAEpC,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAElF,eAAO,MAAM,oBAAoB;;;;;;;;iBAE/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;iBAGhC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire schemas for the desktop capability grant table (11-electron.md §12).
|
|
3
|
+
*
|
|
4
|
+
* The grant identity `{ manifestId, capabilityId }` is the body of both POST
|
|
5
|
+
* (consent) and DELETE (revoke) — one shape, so a form that can grant can revoke
|
|
6
|
+
* the same thing. `capabilityId` is the closed host vocabulary (`catalog.ts`),
|
|
7
|
+
* NOT a free string: a grant for a capability this build has no provider for
|
|
8
|
+
* would be a dead row that the consent UI could offer and the host could never
|
|
9
|
+
* honour, so an unknown id is a 422 here rather than a persisted lie.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { capabilityGrantSchema } from '@adminium/meta';
|
|
13
|
+
import { capabilityIdSchema } from '../../capabilities/catalog.js';
|
|
14
|
+
/** The identity written by consent / removed by revoke. */
|
|
15
|
+
export const capabilityGrantRefBody = z.strictObject({
|
|
16
|
+
/** The installed micro-SaaS manifest's id (reverse-DNS; §12 / 13-marketplace.md). */
|
|
17
|
+
manifestId: z.string().min(1).max(200),
|
|
18
|
+
capabilityId: capabilityIdSchema,
|
|
19
|
+
});
|
|
20
|
+
export const capabilityGrantsListReply = z.object({
|
|
21
|
+
data: z.object({ grants: z.array(capabilityGrantSchema) }),
|
|
22
|
+
});
|
|
23
|
+
export const capabilityGrantReply = z.object({
|
|
24
|
+
data: z.object({ grant: capabilityGrantSchema }),
|
|
25
|
+
});
|
|
26
|
+
export const capabilityRevokeReply = z.object({
|
|
27
|
+
/** `removed: false` when there was no such grant — revoke is idempotent, not an error. */
|
|
28
|
+
data: z.object({ removed: z.boolean() }),
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/routes/desktop-capabilities/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,YAAY,CAAC;IACnD,qFAAqF;IACrF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtC,YAAY,EAAE,kBAAkB;CACjC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;CAC3D,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;CACjD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,0FAA0F;IAC1F,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;CACzC,CAAC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The demo database — seed the file, register the connection (11-electron.md §6
|
|
3
|
+
* step 2 card 4, task 11-T08).
|
|
4
|
+
*
|
|
5
|
+
* ─── WHY THE SEED SCRIPT IS LOADED BY PATH ───────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* `demo-seed.mjs` lives in `apps/desktop/resources/`, and `@adminium/server` may
|
|
8
|
+
* not import `@adminium/desktop` — the dependency arrow points the other way
|
|
9
|
+
* (.dependency-cruiser.cjs, rule `desktop-shell-only`), and it points that way
|
|
10
|
+
* because self-host and Docker run this same server with no desktop package
|
|
11
|
+
* within a mile of them. So the shell TELLS the server where the script is
|
|
12
|
+
* (`ADMINIUM_DEMO_SEED_SCRIPT`, §2.2's env block) and the server imports that
|
|
13
|
+
* path at runtime. `compose.ts` already loads `@adminium/widgets` by file path
|
|
14
|
+
* for the same boundary reason; this is that pattern, not a new one.
|
|
15
|
+
*
|
|
16
|
+
* ─── WHY THE SERVER OPENS THE FILE, NOT THE SCRIPT ───────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* §2.1: "The server is the only data owner." The script is a pure description of
|
|
19
|
+
* a schema and its rows; the `better-sqlite3` handle it writes through is opened
|
|
20
|
+
* here, by the process that owns every other database handle in the app. That
|
|
21
|
+
* also keeps the script free of module resolution — see its header.
|
|
22
|
+
*/
|
|
23
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
24
|
+
import type { ConnectionManager } from '../../connections/manager.js';
|
|
25
|
+
/** §6: "creates `<dataDir>/databases/demo.sqlite`". Both halves are spec'd. */
|
|
26
|
+
export declare const DEMO_DATABASE_DIR = "databases";
|
|
27
|
+
export declare const DEMO_DATABASE_FILE = "demo.sqlite";
|
|
28
|
+
/** What `demo-seed.mjs` exports. Structural — the script is plain JS. */
|
|
29
|
+
export interface DemoSeeder {
|
|
30
|
+
createDemoDatabase(input: {
|
|
31
|
+
file: string;
|
|
32
|
+
Database: typeof BetterSqlite3;
|
|
33
|
+
}): Record<string, number>;
|
|
34
|
+
}
|
|
35
|
+
/** Rows-per-table, as the script reports them. */
|
|
36
|
+
export type DemoSeedCounts = Record<string, number>;
|
|
37
|
+
export interface DemoDatabaseResult {
|
|
38
|
+
connectionId: string;
|
|
39
|
+
name: string;
|
|
40
|
+
file: string;
|
|
41
|
+
seeded: boolean;
|
|
42
|
+
rows: DemoSeedCounts;
|
|
43
|
+
}
|
|
44
|
+
export interface DemoDatabaseDeps {
|
|
45
|
+
manager: ConnectionManager;
|
|
46
|
+
/** `ADMINIUM_DATA_DIR` — the demo lands under it (§2.2/§6). */
|
|
47
|
+
dataDir: string;
|
|
48
|
+
/** Absolute path to `demo-seed.mjs` (`ADMINIUM_DEMO_SEED_SCRIPT`). */
|
|
49
|
+
seedScriptPath: string;
|
|
50
|
+
/**
|
|
51
|
+
* Test seam. Production leaves it out and gets {@link importDemoSeeder}, which
|
|
52
|
+
* imports {@link DemoDatabaseDeps.seedScriptPath} — the suites point it at the
|
|
53
|
+
* REAL script rather than replacing it, because a fake seeder would test the
|
|
54
|
+
* plumbing and not the fixture the whole task exists to produce.
|
|
55
|
+
*/
|
|
56
|
+
loadSeeder?: ((scriptPath: string) => Promise<DemoSeeder>) | undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* `import()` the seed script. The `file://` URL is required, not cosmetic: an
|
|
60
|
+
* absolute Windows path (`C:\…`) is not a valid ESM specifier and throws
|
|
61
|
+
* `ERR_UNSUPPORTED_ESM_URL_SCHEME`, which would make this route fail on exactly
|
|
62
|
+
* one of the three platforms §10 ships.
|
|
63
|
+
*/
|
|
64
|
+
export declare function importDemoSeeder(scriptPath: string): Promise<DemoSeeder>;
|
|
65
|
+
/** `<dataDir>/databases/demo.sqlite`, absolute. */
|
|
66
|
+
export declare function demoDatabaseFile(dataDir: string): string;
|
|
67
|
+
/** §6: "registered in `adminium_connections` as `sqlite:<absolute path>`". */
|
|
68
|
+
export declare function demoDsn(file: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Create the demo database and register it.
|
|
71
|
+
*
|
|
72
|
+
* THREE STATES, because §6 promises the connection is "deletable afterwards from
|
|
73
|
+
* Data Connections … nothing special" — and deleting a connection does not
|
|
74
|
+
* delete the file behind it. So:
|
|
75
|
+
*
|
|
76
|
+
* 1. A connection already points at the demo file ⇒ 409. The wizard sends the
|
|
77
|
+
* user to the connection it already has; re-seeding underneath a live
|
|
78
|
+
* connection would silently discard whatever they had done to it.
|
|
79
|
+
* 2. The file exists but no connection does (they deleted it and came back)
|
|
80
|
+
* ⇒ adopt the file as-is. NOT re-seeded: the app never destroys data the
|
|
81
|
+
* user could have edited (§9's ethos — even `restore` only moves data
|
|
82
|
+
* aside), and a demo they had been playing in is exactly that.
|
|
83
|
+
* 3. Neither ⇒ seed, then register.
|
|
84
|
+
*
|
|
85
|
+
* State 2 is the one worth having: without it, deleting the demo connection
|
|
86
|
+
* leaves the user permanently unable to make another (the file is in the way and
|
|
87
|
+
* nothing in the UI removes it), which is a dead end reachable by one click on a
|
|
88
|
+
* button the wizard offers.
|
|
89
|
+
*/
|
|
90
|
+
export declare function createDemoDatabaseHandler(deps: DemoDatabaseDeps, input: {
|
|
91
|
+
name: string;
|
|
92
|
+
actorId: string | null;
|
|
93
|
+
}): Promise<DemoDatabaseResult>;
|
|
94
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-demo/handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAQ3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,kBAAkB,CAAC,KAAK,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,aAAa,CAAC;KAChC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,kDAAkD;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;CACxE;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9E;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC9C,OAAO,CAAC,kBAAkB,CAAC,CAkD7B"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The demo database — seed the file, register the connection (11-electron.md §6
|
|
3
|
+
* step 2 card 4, task 11-T08).
|
|
4
|
+
*
|
|
5
|
+
* ─── WHY THE SEED SCRIPT IS LOADED BY PATH ───────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* `demo-seed.mjs` lives in `apps/desktop/resources/`, and `@adminium/server` may
|
|
8
|
+
* not import `@adminium/desktop` — the dependency arrow points the other way
|
|
9
|
+
* (.dependency-cruiser.cjs, rule `desktop-shell-only`), and it points that way
|
|
10
|
+
* because self-host and Docker run this same server with no desktop package
|
|
11
|
+
* within a mile of them. So the shell TELLS the server where the script is
|
|
12
|
+
* (`ADMINIUM_DEMO_SEED_SCRIPT`, §2.2's env block) and the server imports that
|
|
13
|
+
* path at runtime. `compose.ts` already loads `@adminium/widgets` by file path
|
|
14
|
+
* for the same boundary reason; this is that pattern, not a new one.
|
|
15
|
+
*
|
|
16
|
+
* ─── WHY THE SERVER OPENS THE FILE, NOT THE SCRIPT ───────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* §2.1: "The server is the only data owner." The script is a pure description of
|
|
19
|
+
* a schema and its rows; the `better-sqlite3` handle it writes through is opened
|
|
20
|
+
* here, by the process that owns every other database handle in the app. That
|
|
21
|
+
* also keeps the script free of module resolution — see its header.
|
|
22
|
+
*/
|
|
23
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
24
|
+
import { mkdir, rename, rm } from 'node:fs/promises';
|
|
25
|
+
import { existsSync } from 'node:fs';
|
|
26
|
+
import { randomUUID } from 'node:crypto';
|
|
27
|
+
import { dirname, join, resolve } from 'node:path';
|
|
28
|
+
import { pathToFileURL } from 'node:url';
|
|
29
|
+
import { AppError } from '../../errors.js';
|
|
30
|
+
/** §6: "creates `<dataDir>/databases/demo.sqlite`". Both halves are spec'd. */
|
|
31
|
+
export const DEMO_DATABASE_DIR = 'databases';
|
|
32
|
+
export const DEMO_DATABASE_FILE = 'demo.sqlite';
|
|
33
|
+
/**
|
|
34
|
+
* `import()` the seed script. The `file://` URL is required, not cosmetic: an
|
|
35
|
+
* absolute Windows path (`C:\…`) is not a valid ESM specifier and throws
|
|
36
|
+
* `ERR_UNSUPPORTED_ESM_URL_SCHEME`, which would make this route fail on exactly
|
|
37
|
+
* one of the three platforms §10 ships.
|
|
38
|
+
*/
|
|
39
|
+
export async function importDemoSeeder(scriptPath) {
|
|
40
|
+
const module = await import(pathToFileURL(scriptPath).href);
|
|
41
|
+
const seeder = module;
|
|
42
|
+
if (typeof seeder.createDemoDatabase !== 'function') {
|
|
43
|
+
throw new AppError(500, 'INTERNAL', `The demo seed script at ${scriptPath} does not export createDemoDatabase().`);
|
|
44
|
+
}
|
|
45
|
+
return seeder;
|
|
46
|
+
}
|
|
47
|
+
/** `<dataDir>/databases/demo.sqlite`, absolute. */
|
|
48
|
+
export function demoDatabaseFile(dataDir) {
|
|
49
|
+
return join(resolve(dataDir), DEMO_DATABASE_DIR, DEMO_DATABASE_FILE);
|
|
50
|
+
}
|
|
51
|
+
/** §6: "registered in `adminium_connections` as `sqlite:<absolute path>`". */
|
|
52
|
+
export function demoDsn(file) {
|
|
53
|
+
return `sqlite:${file}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create the demo database and register it.
|
|
57
|
+
*
|
|
58
|
+
* THREE STATES, because §6 promises the connection is "deletable afterwards from
|
|
59
|
+
* Data Connections … nothing special" — and deleting a connection does not
|
|
60
|
+
* delete the file behind it. So:
|
|
61
|
+
*
|
|
62
|
+
* 1. A connection already points at the demo file ⇒ 409. The wizard sends the
|
|
63
|
+
* user to the connection it already has; re-seeding underneath a live
|
|
64
|
+
* connection would silently discard whatever they had done to it.
|
|
65
|
+
* 2. The file exists but no connection does (they deleted it and came back)
|
|
66
|
+
* ⇒ adopt the file as-is. NOT re-seeded: the app never destroys data the
|
|
67
|
+
* user could have edited (§9's ethos — even `restore` only moves data
|
|
68
|
+
* aside), and a demo they had been playing in is exactly that.
|
|
69
|
+
* 3. Neither ⇒ seed, then register.
|
|
70
|
+
*
|
|
71
|
+
* State 2 is the one worth having: without it, deleting the demo connection
|
|
72
|
+
* leaves the user permanently unable to make another (the file is in the way and
|
|
73
|
+
* nothing in the UI removes it), which is a dead end reachable by one click on a
|
|
74
|
+
* button the wizard offers.
|
|
75
|
+
*/
|
|
76
|
+
export async function createDemoDatabaseHandler(deps, input) {
|
|
77
|
+
const file = demoDatabaseFile(deps.dataDir);
|
|
78
|
+
const dsn = demoDsn(file);
|
|
79
|
+
const existing = await findDemoConnection(deps.manager, dsn);
|
|
80
|
+
if (existing !== null) {
|
|
81
|
+
throw new AppError(409, 'CONFLICT', 'The demo database is already connected. Delete it from Data Connections to start over.', { connectionId: existing });
|
|
82
|
+
}
|
|
83
|
+
let seeded = false;
|
|
84
|
+
let rows = {};
|
|
85
|
+
if (!existsSync(file)) {
|
|
86
|
+
rows = await seedDemoFile(deps, file);
|
|
87
|
+
seeded = true;
|
|
88
|
+
}
|
|
89
|
+
// The same probe `POST /connections` runs, for the same reasons: it decides
|
|
90
|
+
// `readOnly` and it is what `enforceMetaPlacement` reads. A demo file cannot
|
|
91
|
+
// BE the meta store (§2.1 puts that at `<dataDir>/meta.db`), but the check is
|
|
92
|
+
// cheap and asserting placement here rather than assuming it means the day
|
|
93
|
+
// someone changes either path, this fails loudly instead of quietly sharing.
|
|
94
|
+
const summary = await deps.manager.testDsn('sqlite', dsn);
|
|
95
|
+
if (summary.ok)
|
|
96
|
+
deps.manager.enforceMetaPlacement(dsn, summary);
|
|
97
|
+
const connection = await deps.manager.connections.create({
|
|
98
|
+
name: input.name,
|
|
99
|
+
engine: 'sqlite',
|
|
100
|
+
sourceKind: 'dsn',
|
|
101
|
+
introspectDsn: dsn,
|
|
102
|
+
// One role: `POST /connections` stores `null` when data and introspect are
|
|
103
|
+
// the same string, and Data Connections renders whichever is set.
|
|
104
|
+
dataDsn: null,
|
|
105
|
+
readOnly: summary.readOnly,
|
|
106
|
+
settings: {},
|
|
107
|
+
status: summary.ok ? 'connected' : 'error',
|
|
108
|
+
createdBy: input.actorId,
|
|
109
|
+
});
|
|
110
|
+
await deps.manager.connections.recordTestResult(connection.id, {
|
|
111
|
+
ok: summary.ok,
|
|
112
|
+
latencyMs: summary.latencyMs,
|
|
113
|
+
error: summary.error?.message ?? null,
|
|
114
|
+
readOnly: summary.readOnly,
|
|
115
|
+
});
|
|
116
|
+
return { connectionId: connection.id, name: connection.name, file, seeded, rows };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Seed the demo database so that `demo.sqlite` only ever exists COMPLETE.
|
|
120
|
+
*
|
|
121
|
+
* ─── WHY THIS IS NOT `createDemoDatabase({ file })` ──────────────────────────
|
|
122
|
+
*
|
|
123
|
+
* `new Database(file)` CREATES THE FILE ON OPEN — before the schema, before the
|
|
124
|
+
* row transaction. Seeding straight into `demo.sqlite` therefore published an
|
|
125
|
+
* empty database the instant the seeder started, and left it there for good if
|
|
126
|
+
* anything went wrong in the ~800 ms that followed: the app quits mid-seed, the
|
|
127
|
+
* disk fills, or `journal_mode = WAL` fails because dataDir is on a network or
|
|
128
|
+
* synced share (the exact placement 11-T03's sync-folder detection exists to
|
|
129
|
+
* warn about).
|
|
130
|
+
*
|
|
131
|
+
* Nothing removed that file, and state 2 above adopts any `demo.sqlite` it finds
|
|
132
|
+
* BY DESIGN — so the wreckage was claimed as "a demo the user had been playing
|
|
133
|
+
* in" on every subsequent click, forever. Reproduced against the real route: a
|
|
134
|
+
* 0-byte demo.sqlite returns 201 `{seeded:false, rows:{}}`, `testDsn` says ok
|
|
135
|
+
* (an empty file is a valid 0-table SQLite database), the connection registers
|
|
136
|
+
* as 'connected', and `generate` then produces 0 pages from 0 tables. The button
|
|
137
|
+
* becomes a permanent success-returning no-op — the same dead end state 2 was
|
|
138
|
+
* added to prevent, reached by one click on a button the wizard offers.
|
|
139
|
+
*
|
|
140
|
+
* ─── THE FIX: A TEMP FILE AND A RENAME ──────────────────────────────────────
|
|
141
|
+
*
|
|
142
|
+
* `rename` is atomic and same-directory, so `demo.sqlite` goes from absent to
|
|
143
|
+
* fully-seeded with no state in between that `existsSync` can observe. A crash
|
|
144
|
+
* mid-seed leaves only `demo.sqlite.<uuid>.partial`, which state 2 does not look
|
|
145
|
+
* for and the next attempt simply ignores. A try/catch alone could not deliver
|
|
146
|
+
* that: it does not run when the process is killed, which is the case that
|
|
147
|
+
* matters most here.
|
|
148
|
+
*
|
|
149
|
+
* The seeder closes its handle in a `finally` and `wal_checkpoint(TRUNCATE)`s on
|
|
150
|
+
* the way out, so a clean close leaves no `-wal`/`-shm` beside the temp file.
|
|
151
|
+
* The cleanup removes them anyway — an UNCLEAN close is exactly when they exist,
|
|
152
|
+
* and that is exactly the path this function is here for.
|
|
153
|
+
*/
|
|
154
|
+
async function seedDemoFile(deps, file) {
|
|
155
|
+
await mkdir(dirname(file), { recursive: true });
|
|
156
|
+
const temp = `${file}.${randomUUID()}.partial`;
|
|
157
|
+
try {
|
|
158
|
+
const loadSeeder = deps.loadSeeder ?? importDemoSeeder;
|
|
159
|
+
const seeder = await loadSeeder(deps.seedScriptPath);
|
|
160
|
+
const rows = seeder.createDemoDatabase({ file: temp, Database: BetterSqlite3 });
|
|
161
|
+
await rename(temp, file);
|
|
162
|
+
return rows;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
// Best effort, and it must not mask the real failure: the user needs to know
|
|
166
|
+
// the disk filled, not that we then failed to tidy up after it.
|
|
167
|
+
await Promise.all([temp, `${temp}-wal`, `${temp}-shm`].map((path) => rm(path, { force: true }).catch(() => undefined)));
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** The connection id whose introspect/data DSN is the demo file, if any. */
|
|
172
|
+
async function findDemoConnection(manager, dsn) {
|
|
173
|
+
for (const connection of await manager.connections.list()) {
|
|
174
|
+
if (connection.engine !== 'sqlite')
|
|
175
|
+
continue;
|
|
176
|
+
const dsns = await manager.connections.getDsns(connection.id);
|
|
177
|
+
if (dsns?.introspectDsn === dsn || dsns?.dataDsn === dsn)
|
|
178
|
+
return connection.id;
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/routes/desktop-demo/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /api/v1/desktop/demo-database` — 11-electron.md §6 step 2 card 4
|
|
3
|
+
* ("Explore the demo database"), task 11-T08.
|
|
4
|
+
*
|
|
5
|
+
* ─── THE DESKTOP GATE ────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* Same shape as §5's `auth/desktop-session.ts`, and for the same reason:
|
|
8
|
+
* EXISTENCE is the gate. `compose.ts` registers this factory only when
|
|
9
|
+
* `ADMINIUM_RUNTIME=desktop` AND `ADMINIUM_DEMO_SEED_SCRIPT` names a script, so
|
|
10
|
+
* a self-host or Docker instance does not have the route at all — it 404s there,
|
|
11
|
+
* which no runtime check inside a handler could improve on. Both halves of the
|
|
12
|
+
* AND are load-bearing, exactly as they are for the boot-token route: a desktop
|
|
13
|
+
* boot with no seed script has nothing to run, so the route would be an
|
|
14
|
+
* unreachable surface, and the wizard hides the card instead.
|
|
15
|
+
*
|
|
16
|
+
* Where this route deliberately DIFFERS from the §5 route: no loopback check.
|
|
17
|
+
* §2.4 makes loopback unconditional for the boot-token exchange because that
|
|
18
|
+
* route mints a super-admin session with no password — it is a credential door,
|
|
19
|
+
* and §8.3 puts a LAN on the other side of it. This one creates a database and
|
|
20
|
+
* registers a connection: the same act `POST /connections` performs, from the
|
|
21
|
+
* same authenticated principal, under the same grant. An admin who may connect a
|
|
22
|
+
* production Postgres over the LAN may certainly seed a demo SQLite file, and
|
|
23
|
+
* refusing them would be security theatre — the authorization that matters is
|
|
24
|
+
* `system:connections:manage`, which is what guards it.
|
|
25
|
+
*/
|
|
26
|
+
import type { FastifyPluginAsyncZod } from 'fastify-type-provider-zod';
|
|
27
|
+
import type { ConnectionManager } from '../../connections/manager.js';
|
|
28
|
+
import { type DemoSeeder } from './handlers.js';
|
|
29
|
+
export interface DesktopDemoRoutesDeps {
|
|
30
|
+
manager: ConnectionManager;
|
|
31
|
+
/** `ADMINIUM_DATA_DIR`. */
|
|
32
|
+
dataDir: string;
|
|
33
|
+
/** Absolute path to `apps/desktop/resources/demo/demo-seed.mjs`. */
|
|
34
|
+
seedScriptPath: string;
|
|
35
|
+
/** Test seam — see `handlers.ts`. */
|
|
36
|
+
loadSeeder?: ((scriptPath: string) => Promise<DemoSeeder>) | undefined;
|
|
37
|
+
}
|
|
38
|
+
export declare function desktopDemoRoutes(deps: DesktopDemoRoutesDeps): FastifyPluginAsyncZod;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-demo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAGpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,UAAU,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;CACxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,qBAAqB,CAqDpF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `POST /api/v1/desktop/demo-database` — 11-electron.md §6 step 2 card 4
|
|
3
|
+
* ("Explore the demo database"), task 11-T08.
|
|
4
|
+
*
|
|
5
|
+
* ─── THE DESKTOP GATE ────────────────────────────────────────────────────────
|
|
6
|
+
*
|
|
7
|
+
* Same shape as §5's `auth/desktop-session.ts`, and for the same reason:
|
|
8
|
+
* EXISTENCE is the gate. `compose.ts` registers this factory only when
|
|
9
|
+
* `ADMINIUM_RUNTIME=desktop` AND `ADMINIUM_DEMO_SEED_SCRIPT` names a script, so
|
|
10
|
+
* a self-host or Docker instance does not have the route at all — it 404s there,
|
|
11
|
+
* which no runtime check inside a handler could improve on. Both halves of the
|
|
12
|
+
* AND are load-bearing, exactly as they are for the boot-token route: a desktop
|
|
13
|
+
* boot with no seed script has nothing to run, so the route would be an
|
|
14
|
+
* unreachable surface, and the wizard hides the card instead.
|
|
15
|
+
*
|
|
16
|
+
* Where this route deliberately DIFFERS from the §5 route: no loopback check.
|
|
17
|
+
* §2.4 makes loopback unconditional for the boot-token exchange because that
|
|
18
|
+
* route mints a super-admin session with no password — it is a credential door,
|
|
19
|
+
* and §8.3 puts a LAN on the other side of it. This one creates a database and
|
|
20
|
+
* registers a connection: the same act `POST /connections` performs, from the
|
|
21
|
+
* same authenticated principal, under the same grant. An admin who may connect a
|
|
22
|
+
* production Postgres over the LAN may certainly seed a demo SQLite file, and
|
|
23
|
+
* refusing them would be security theatre — the authorization that matters is
|
|
24
|
+
* `system:connections:manage`, which is what guards it.
|
|
25
|
+
*/
|
|
26
|
+
import { maskDsn } from '../../connections/dsn.js';
|
|
27
|
+
import { CONNECTIONS_MANAGE } from '../connections/index.js';
|
|
28
|
+
import { createDemoDatabaseHandler, demoDsn } from './handlers.js';
|
|
29
|
+
import { desktopDemoBody, desktopDemoReply } from './schema.js';
|
|
30
|
+
export function desktopDemoRoutes(deps) {
|
|
31
|
+
return async (app) => {
|
|
32
|
+
app.post('/desktop/demo-database', {
|
|
33
|
+
// The grant that governs "add a database to this workspace" everywhere
|
|
34
|
+
// else. Reusing it rather than inventing `desktop:demo:create` is the
|
|
35
|
+
// point: the demo IS a connection, and an operator who has revoked
|
|
36
|
+
// connection management has already answered this question.
|
|
37
|
+
preHandler: app.rbac.require(CONNECTIONS_MANAGE),
|
|
38
|
+
schema: { body: desktopDemoBody, response: { 201: desktopDemoReply } },
|
|
39
|
+
}, async (request, reply) => {
|
|
40
|
+
const actorId = request.apiKeyPrincipal === null
|
|
41
|
+
? (request.user?.id ?? null)
|
|
42
|
+
: null;
|
|
43
|
+
const result = await createDemoDatabaseHandler({
|
|
44
|
+
manager: deps.manager,
|
|
45
|
+
dataDir: deps.dataDir,
|
|
46
|
+
seedScriptPath: deps.seedScriptPath,
|
|
47
|
+
...(deps.loadSeeder === undefined ? {} : { loadSeeder: deps.loadSeeder }),
|
|
48
|
+
}, { name: request.body.name, actorId });
|
|
49
|
+
// `connection.create`, not a bespoke `demo.create`: the audit reader's
|
|
50
|
+
// question is "where did this connection come from?", and the answer
|
|
51
|
+
// belongs in the same action every other connection writes. The demo-ness
|
|
52
|
+
// rides in `changes` — the same way §5's route records that a login used
|
|
53
|
+
// a boot token rather than inventing a second kind of login.
|
|
54
|
+
await app.rbac.audit(request, {
|
|
55
|
+
category: 'connection',
|
|
56
|
+
action: 'connection.create',
|
|
57
|
+
connectionId: result.connectionId,
|
|
58
|
+
changes: {
|
|
59
|
+
after: {
|
|
60
|
+
name: result.name,
|
|
61
|
+
engine: 'sqlite',
|
|
62
|
+
dsnMasked: maskDsn(demoDsn(result.file)),
|
|
63
|
+
source: 'desktop-demo',
|
|
64
|
+
seeded: result.seeded,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
reply.status(201);
|
|
69
|
+
return { data: result };
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/desktop-demo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAmB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAYvF,MAAM,UAAU,iBAAiB,CAAC,IAA2B;IAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,IAAI,CACN,wBAAwB,EACxB;YACE,uEAAuE;YACvE,sEAAsE;YACtE,mEAAmE;YACnE,4DAA4D;YAC5D,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAChD,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE;SACvE,EACD,KAAK,EAAE,OAAO,EAAE,KAAK,EAA6B,EAAE;YAClD,MAAM,OAAO,GACX,OAAO,CAAC,eAAe,KAAK,IAAI;gBAC9B,CAAC,CAAC,CAAE,OAAiD,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;gBACvE,CAAC,CAAC,IAAI,CAAC;YAEX,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAC5C;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aAC1E,EACD,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CACrC,CAAC;YAEF,uEAAuE;YACvE,qEAAqE;YACrE,0EAA0E;YAC1E,yEAAyE;YACzE,6DAA6D;YAC7D,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC5B,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACxC,MAAM,EAAE,cAAc;wBACtB,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB;iBACF;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Zod schemas for the desktop demo-database resource (11-T08, §6 step 2 card 4). */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare const desktopDemoBody: z.ZodObject<{
|
|
4
|
+
name: z.ZodDefault<z.ZodString>;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export type DesktopDemoBody = z.infer<typeof desktopDemoBody>;
|
|
7
|
+
export declare const desktopDemoReply: z.ZodObject<{
|
|
8
|
+
data: z.ZodObject<{
|
|
9
|
+
connectionId: z.ZodString;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
file: z.ZodString;
|
|
12
|
+
seeded: z.ZodBoolean;
|
|
13
|
+
rows: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type DesktopDemoReply = z.infer<typeof desktopDemoReply>;
|
|
17
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-demo/schema.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;iBAG1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB;;;;;;;;iBAsB3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Zod schemas for the desktop demo-database resource (11-T08, §6 step 2 card 4). */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const desktopDemoBody = z.object({
|
|
4
|
+
/** The name the connection appears under in Data Connections. */
|
|
5
|
+
name: z.string().min(1).max(80).default('Demo'),
|
|
6
|
+
});
|
|
7
|
+
export const desktopDemoReply = z.object({
|
|
8
|
+
data: z.object({
|
|
9
|
+
connectionId: z.string(),
|
|
10
|
+
name: z.string(),
|
|
11
|
+
/**
|
|
12
|
+
* The absolute `<dataDir>/databases/demo.sqlite` path.
|
|
13
|
+
*
|
|
14
|
+
* Not a secret and deliberately unmasked: a SQLite DSN carries no
|
|
15
|
+
* credentials (`maskDsn` reduces one to `sqlite:<file>` — the same string),
|
|
16
|
+
* this route only ever names a file it just created inside the app's own
|
|
17
|
+
* data directory, and the wizard's "Show in folder" affordance needs a path
|
|
18
|
+
* to hand the preload bridge.
|
|
19
|
+
*/
|
|
20
|
+
file: z.string(),
|
|
21
|
+
/**
|
|
22
|
+
* Whether this call seeded the file, or adopted one already on disk (see
|
|
23
|
+
* `handlers.ts` — deleting the connection leaves the file behind).
|
|
24
|
+
*/
|
|
25
|
+
seeded: z.boolean(),
|
|
26
|
+
/** Rows written per table. Empty when `seeded` is false. */
|
|
27
|
+
rows: z.record(z.string(), z.number().int().min(0)),
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/routes/desktop-demo/schema.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,iEAAiE;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAChD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB;;;;;;;;WAQG;QACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB;;;WAGG;QACH,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;QACnB,4DAA4D;QAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GET /api/v1/desktop/lan-share` — what §8.3's share panel needs from the side
|
|
3
|
+
* of the boundary that holds the data (11-electron.md §8.3, §1 principle 2).
|
|
4
|
+
*
|
|
5
|
+
* The panel is built from two sources and this is one of them. §4's bridge
|
|
6
|
+
* supplies what only the main process knows — the reachable
|
|
7
|
+
* `http://<LAN-IPv4>:<port>` URLs, which come from `os.networkInterfaces()` in a
|
|
8
|
+
* process that has interfaces to enumerate. This route supplies what only the
|
|
9
|
+
* server knows: who is connected, and whether there is anyone to invite. Neither
|
|
10
|
+
* can answer the other's question, which is why the panel asks both.
|
|
11
|
+
*
|
|
12
|
+
* ─── The gates, in order, mirroring `routes/desktop/index.ts` ────────────────
|
|
13
|
+
*
|
|
14
|
+
* 1. EXISTENCE. `compose.ts` registers this factory only when
|
|
15
|
+
* `ADMINIUM_RUNTIME=desktop`. Self-host has no LAN-share feature to report
|
|
16
|
+
* on — it binds `0.0.0.0` as its normal, correct configuration behind a
|
|
17
|
+
* reverse proxy, and "how many non-loopback sessions do you have" is a
|
|
18
|
+
* question about EVERY session there. The route would answer a different
|
|
19
|
+
* question under the same name, which is worse than 404.
|
|
20
|
+
* 2. PEER. The SOCKET's `remoteAddress` must be loopback — `request.raw.socket`,
|
|
21
|
+
* never `request.ip`; see `auth/desktop-session.ts` for why that distinction
|
|
22
|
+
* is the difference between a check and a vulnerability. This is the gate
|
|
23
|
+
* with the most direct reasoning behind it in the whole file: the route
|
|
24
|
+
* exists ONLY when the server is bound to every interface, so the LAN users
|
|
25
|
+
* §8.3 invited can reach it by construction. Without this gate, any of them
|
|
26
|
+
* with a super-admin account — and §8.3's whole point is that LAN users get
|
|
27
|
+
* real accounts — could enumerate how many other people are on the network
|
|
28
|
+
* right now. That is a surveillance surface, and it is not one the panel's
|
|
29
|
+
* owner asked for. The panel is a LOCAL affordance about the local machine;
|
|
30
|
+
* it belongs to the person sitting at it.
|
|
31
|
+
* 3. SESSION + RBAC. `system:settings:manage`, i.e. Super Admin — the same
|
|
32
|
+
* grant `routes/desktop/index.ts` requires for a backup, and for the same
|
|
33
|
+
* reason: `config.lanShare` is a security setting, and the count of who is
|
|
34
|
+
* connected is the operational half of it. There is no narrower system
|
|
35
|
+
* action in meta's closed set (`SYSTEM_ACTION_KEYS`) and this route is not
|
|
36
|
+
* the place to invent one.
|
|
37
|
+
*/
|
|
38
|
+
import type { FastifyPluginAsyncZod } from 'fastify-type-provider-zod';
|
|
39
|
+
import type { MetaDb } from '@adminium/meta';
|
|
40
|
+
import type { Env } from '../../config/env.js';
|
|
41
|
+
export interface DesktopLanRoutesDeps {
|
|
42
|
+
meta: MetaDb;
|
|
43
|
+
/**
|
|
44
|
+
* The validated boot environment. INJECTED for the reason
|
|
45
|
+
* `routes/system/index.ts` gives at length: `HOST` and `ADMINIUM_RUNTIME`
|
|
46
|
+
* decide what this reply CLAIMS, and a value sampled off `process.env` inside
|
|
47
|
+
* a handler reads as a plausible default instead of failing the boot.
|
|
48
|
+
*/
|
|
49
|
+
env: Env;
|
|
50
|
+
/** Test seam for the session-window arithmetic. */
|
|
51
|
+
now?: (() => number) | undefined;
|
|
52
|
+
}
|
|
53
|
+
export declare function desktopLanRoutes(deps: DesktopLanRoutesDeps): FastifyPluginAsyncZod;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/desktop-lan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,GAAG,EAAE,GAAG,CAAC;IACT,mDAAmD;IACnD,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAoClF"}
|