provisa 0.1.0a244__tar.gz
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.
- provisa-0.1.0a244/LICENSE +89 -0
- provisa-0.1.0a244/NOTICE +26 -0
- provisa-0.1.0a244/PKG-INFO +129 -0
- provisa-0.1.0a244/README.md +364 -0
- provisa-0.1.0a244/provisa/__init__.py +9 -0
- provisa-0.1.0a244/provisa/_config/capabilities.yaml +218 -0
- provisa-0.1.0a244/provisa/_config/pg_extension_catalog.yaml +106 -0
- provisa-0.1.0a244/provisa/_ui/apple-touch-icon.png +0 -0
- provisa-0.1.0a244/provisa/_ui/assets/AdminPage-Dqs2DYTv.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Alert-olsRF0Jo.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Card-z2Bo-A5p.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/CloseButton-COJkmEJ_.js +5 -0
- provisa-0.1.0a244/provisa/_ui/assets/Code-CuWuP1uE.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/CommandsPage-CGZTC4Jw.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/ConfirmDialog-CnYI0AfS.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/CopyButton-DmLBbp5g.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/DocsPage-CRWTTZLR.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/DocsPage-DAitv_IW.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/ErdModal-CPZQ7m-5.js +2 -0
- provisa-0.1.0a244/provisa/_ui/assets/FilterInput-DFpPDDtr.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/GraphPage-6J0lXseA.js +4 -0
- provisa-0.1.0a244/provisa/_ui/assets/GraphPage-nK82rD0e.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/GrpcPage-B1gbbQHK.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/GrpcPage-DoTbcK4o.js +2 -0
- provisa-0.1.0a244/provisa/_ui/assets/Input-BQ7YLH5k.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/InputBase-D8Jikz1x.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/JsonApiPage-C3-MZvt3.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/JsonApiPage-xEeynjaG.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/List-BFN9Gv0L.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/LoginPage-D3rUrhhP.js +2 -0
- provisa-0.1.0a244/provisa/_ui/assets/Mantine.context-COSAnKfW.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/McpExplorePage-CKVK-a_A.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/McpExplorePage-DN-5kwhM.js +569 -0
- provisa-0.1.0a244/provisa/_ui/assets/MultiSelect-o1U1Tya2.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/NlPage-Dncsd506.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/NumberInput-BcxkyHDO.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/OpenApiPage-BA2uwVJo.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/OpenApiPage-BVXBLXML.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Pagination-DnHpOlc2.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/PasswordInput-CHPV3HHV.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/QueryPage-tMx_5EVY.js +109 -0
- provisa-0.1.0a244/provisa/_ui/assets/QueryPage-wFcZ_rSr.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Radio-Bi-dGDMv.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/RelationshipsPage-BNeNG4Qk.js +3 -0
- provisa-0.1.0a244/provisa/_ui/assets/RequestsPage-CJSlnIdv.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/SchemaExplorer-BlUYmbAz.js +20 -0
- provisa-0.1.0a244/provisa/_ui/assets/SecurityPage-BO6CfBK8.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/SegmentedControl-FblIlBwc.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Select-SA9iAO1h.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/SetupPage-Cxoe46vJ.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/SimpleGrid-BkUQXfli.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/SourcesPage-DosK9lzy.js +11 -0
- provisa-0.1.0a244/provisa/_ui/assets/SqlPage-BD7WXqY8.js +6 -0
- provisa-0.1.0a244/provisa/_ui/assets/TablesPage-CGDxNvB1.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Tabs-CblK1Rtp.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/TextInput-D86W-0Nq.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/Textarea-Dywhas9Y.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/ViewsPage-D9gGGmHP.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/actions-5gXnxx2e.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/admin-BwoS7Ttj.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/admin-WJWK7W-X.js +2 -0
- provisa-0.1.0a244/provisa/_ui/assets/architecture-7EHR7CIX-B1R6OVIb.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/babel-BvCgDdiU.js +15 -0
- provisa-0.1.0a244/provisa/_ui/assets/chevron-right-_50lIoPZ.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/chevron-up-BfLSdWfo.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/chevrons-right-UteR6wPJ.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/circle-alert-Bu1UeVIx.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/codicon-DCmgc-ay.ttf +0 -0
- provisa-0.1.0a244/provisa/_ui/assets/copy-BJSjhFSQ.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/create-safe-context-Cp0rN64W.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/cypher-codemirror-COI3VOX7.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/cypher-codemirror-rzCmupus.js +10 -0
- provisa-0.1.0a244/provisa/_ui/assets/dist-BOx43okh.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/dist-DJ30WIku.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/download-EO2qj82-.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/esm-DoY7ccVx.js +15 -0
- provisa-0.1.0a244/provisa/_ui/assets/estree-CStc1WiO.js +44 -0
- provisa-0.1.0a244/provisa/_ui/assets/eventmodeling-FCH6USID-BPtIDmEK.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/firebase-BZvYX7DS.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/get-env-DN1byi3J.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/get-style-object-BDpgefo6.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/gitGraph-WXDBUCRP-DaajRYRT.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/graph-export-C1Qyb8tJ.js +6 -0
- provisa-0.1.0a244/provisa/_ui/assets/graphql-8PnP7wdF.js +28 -0
- provisa-0.1.0a244/provisa/_ui/assets/graphql-DPd-ryYU.js +28 -0
- provisa-0.1.0a244/provisa/_ui/assets/index-Bk-4qilv.js +21 -0
- provisa-0.1.0a244/provisa/_ui/assets/index-Ubv-iDeM.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/info-Db4sqa4U.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/info-J43DQDTF-DdZDZQFj.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/katex-C4eR7coU.js +257 -0
- provisa-0.1.0a244/provisa/_ui/assets/lib-DJX5c_EK.js +16 -0
- provisa-0.1.0a244/provisa/_ui/assets/liveCapability-Buo2q2KH.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/maximize-2-BjEM81oc.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/naming-D2W_TDLo.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/packet-YPE3B663-D_8FMH56.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/pencil-BKoqPyRv.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/pie-LRSECV5Y-B3u8ZO9o.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/play-DZgTbsd-.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/plus-BZ8PGQwK.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/radar-GUYGQ44K-B57pEu02.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/rolldown-runtime-CMxvf4Kt.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/sparkles-DxXOJOVI.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/standalone-BvaX2kS-.js +29 -0
- provisa-0.1.0a244/provisa/_ui/assets/table-2-BwuZElBq.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/trash-2-DK4I8-td.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/treeView-BLDUP644-D2lP5nmA.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/treemap-LRROVOQU-V5HaemcZ.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/use-media-query-B79wNZr6.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/use-merged-ref-WrlFclhU.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/use-reduced-motion-CwaZt4K5.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/useAdminQueries-DmD_MMVD.js +543 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-apollo-uTC-SxVA.js +158 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-cytoscape-DzheRRTy.js +349 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-firebase-Bne7jdsa.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-mermaid-DYlES3LV.js +2772 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-monaco-B12TyRWl.css +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-monaco-B_j1bxCw.js +1064 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-mui-C2_0bhe-.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/vendor-react-m9IIiB39.js +72 -0
- provisa-0.1.0a244/provisa/_ui/assets/wardley-L42UT6IY-bBVX-Ej4.js +1 -0
- provisa-0.1.0a244/provisa/_ui/assets/x-B488js0C.js +1 -0
- provisa-0.1.0a244/provisa/_ui/favicon.ico +0 -0
- provisa-0.1.0a244/provisa/_ui/favicon.svg +10 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/admin.md +187 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/api-reference.md +825 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/architecture.md +656 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/configuration.md +845 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/cypher.md +234 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/deployment.md +804 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/bolt-neo4j-browser.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/data-sources.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/graph-view.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/natural-language.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/pgwire-datagrip.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/query-explorer.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/relationships.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/schema-voyager.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/security-roles.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/images/table-registration.png +0 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/import.md +115 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/integrations.md +239 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/manifest.json +82 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/multitenant.md +350 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/pgwire.md +196 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/python-client.md +260 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/quickstart.md +160 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/readme.md +364 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/security.md +315 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/sources.md +722 -0
- provisa-0.1.0a244/provisa/_ui/guides-md/subscriptions.md +179 -0
- provisa-0.1.0a244/provisa/_ui/icon-192.png +0 -0
- provisa-0.1.0a244/provisa/_ui/icon-512.png +0 -0
- provisa-0.1.0a244/provisa/_ui/icon.svg +10 -0
- provisa-0.1.0a244/provisa/_ui/icons.svg +24 -0
- provisa-0.1.0a244/provisa/_ui/index.html +294 -0
- provisa-0.1.0a244/provisa/_ui/monacoeditorwork/editor.worker.bundle.js +13516 -0
- provisa-0.1.0a244/provisa/_ui/monacoeditorwork/graphql.worker.bundle.js +32447 -0
- provisa-0.1.0a244/provisa/_ui/monacoeditorwork/json.worker.bundle.js +21317 -0
- provisa-0.1.0a244/provisa/_ui/site.webmanifest +11 -0
- provisa-0.1.0a244/provisa/_ui/voyager/react-dom.production.min.js +277 -0
- provisa-0.1.0a244/provisa/_ui/voyager/react.production.min.js +41 -0
- provisa-0.1.0a244/provisa/_ui/voyager/voyager.css +697 -0
- provisa-0.1.0a244/provisa/_ui/voyager/voyager.standalone.js +1762 -0
- provisa-0.1.0a244/provisa/api/__init__.py +9 -0
- provisa-0.1.0a244/provisa/api/_meta_seed.py +313 -0
- provisa-0.1.0a244/provisa/api/_meta_views.py +115 -0
- provisa-0.1.0a244/provisa/api/_query_helpers.py +140 -0
- provisa-0.1.0a244/provisa/api/admin/__init__.py +11 -0
- provisa-0.1.0a244/provisa/api/admin/_config_io.py +34 -0
- provisa-0.1.0a244/provisa/api/admin/_dev_shared.py +38 -0
- provisa-0.1.0a244/provisa/api/admin/_guards.py +27 -0
- provisa-0.1.0a244/provisa/api/admin/_live_mappers.py +84 -0
- provisa-0.1.0a244/provisa/api/admin/_row_mappers.py +204 -0
- provisa-0.1.0a244/provisa/api/admin/_table_ops.py +201 -0
- provisa-0.1.0a244/provisa/api/admin/actions_router.py +575 -0
- provisa-0.1.0a244/provisa/api/admin/ai_models_router.py +102 -0
- provisa-0.1.0a244/provisa/api/admin/api_discovery.py +148 -0
- provisa-0.1.0a244/provisa/api/admin/capabilities.py +113 -0
- provisa-0.1.0a244/provisa/api/admin/config_export.py +246 -0
- provisa-0.1.0a244/provisa/api/admin/crawl_router.py +69 -0
- provisa-0.1.0a244/provisa/api/admin/creation_requests_router.py +290 -0
- provisa-0.1.0a244/provisa/api/admin/db_queries.py +181 -0
- provisa-0.1.0a244/provisa/api/admin/dev_queries.py +522 -0
- provisa-0.1.0a244/provisa/api/admin/discovery.py +158 -0
- provisa-0.1.0a244/provisa/api/admin/discovery_resilience.py +47 -0
- provisa-0.1.0a244/provisa/api/admin/discovery_schema.py +281 -0
- provisa-0.1.0a244/provisa/api/admin/graphql_remote_router.py +373 -0
- provisa-0.1.0a244/provisa/api/admin/grpc_remote_router.py +426 -0
- provisa-0.1.0a244/provisa/api/admin/introspect.py +664 -0
- provisa-0.1.0a244/provisa/api/admin/invites_router.py +119 -0
- provisa-0.1.0a244/provisa/api/admin/local_users_router.py +242 -0
- provisa-0.1.0a244/provisa/api/admin/neo4j_router.py +155 -0
- provisa-0.1.0a244/provisa/api/admin/openapi_router.py +330 -0
- provisa-0.1.0a244/provisa/api/admin/orgs_router.py +209 -0
- provisa-0.1.0a244/provisa/api/admin/roles_router.py +132 -0
- provisa-0.1.0a244/provisa/api/admin/schema.py +41 -0
- provisa-0.1.0a244/provisa/api/admin/schema_common.py +388 -0
- provisa-0.1.0a244/provisa/api/admin/schema_helpers.py +454 -0
- provisa-0.1.0a244/provisa/api/admin/schema_mutation.py +1089 -0
- provisa-0.1.0a244/provisa/api/admin/schema_mutation_ops.py +459 -0
- provisa-0.1.0a244/provisa/api/admin/schema_query.py +834 -0
- provisa-0.1.0a244/provisa/api/admin/security_router.py +57 -0
- provisa-0.1.0a244/provisa/api/admin/settings_router.py +1057 -0
- provisa-0.1.0a244/provisa/api/admin/source_meta_router.py +126 -0
- provisa-0.1.0a244/provisa/api/admin/sparql_router.py +128 -0
- provisa-0.1.0a244/provisa/api/admin/system_health.py +119 -0
- provisa-0.1.0a244/provisa/api/admin/table_profile_router.py +104 -0
- provisa-0.1.0a244/provisa/api/admin/table_search_router.py +138 -0
- provisa-0.1.0a244/provisa/api/admin/types.py +524 -0
- provisa-0.1.0a244/provisa/api/airport/__init__.py +16 -0
- provisa-0.1.0a244/provisa/api/airport/pushdown.py +248 -0
- provisa-0.1.0a244/provisa/api/airport/query.py +157 -0
- provisa-0.1.0a244/provisa/api/airport/server.py +1038 -0
- provisa-0.1.0a244/provisa/api/airport/service.py +47 -0
- provisa-0.1.0a244/provisa/api/airport/transactions.py +62 -0
- provisa-0.1.0a244/provisa/api/airport/wire.py +207 -0
- provisa-0.1.0a244/provisa/api/app.py +1038 -0
- provisa-0.1.0a244/provisa/api/app_loaders.py +979 -0
- provisa-0.1.0a244/provisa/api/app_rebuild.py +198 -0
- provisa-0.1.0a244/provisa/api/app_schema_build.py +277 -0
- provisa-0.1.0a244/provisa/api/app_startup.py +676 -0
- provisa-0.1.0a244/provisa/api/auth_router.py +248 -0
- provisa-0.1.0a244/provisa/api/billing/__init__.py +4 -0
- provisa-0.1.0a244/provisa/api/billing/kms.py +70 -0
- provisa-0.1.0a244/provisa/api/billing/lemonsqueezy_client.py +80 -0
- provisa-0.1.0a244/provisa/api/billing/models.py +45 -0
- provisa-0.1.0a244/provisa/api/billing/router.py +148 -0
- provisa-0.1.0a244/provisa/api/billing/tenant_db.py +152 -0
- provisa-0.1.0a244/provisa/api/data/__init__.py +9 -0
- provisa-0.1.0a244/provisa/api/data/action_exec.py +40 -0
- provisa-0.1.0a244/provisa/api/data/encrypted_directive.py +58 -0
- provisa-0.1.0a244/provisa/api/data/endpoint.py +910 -0
- provisa-0.1.0a244/provisa/api/data/endpoint_dev.py +908 -0
- provisa-0.1.0a244/provisa/api/data/endpoint_executors.py +907 -0
- provisa-0.1.0a244/provisa/api/data/endpoint_grpc_proxy.py +136 -0
- provisa-0.1.0a244/provisa/api/data/endpoint_helpers.py +432 -0
- provisa-0.1.0a244/provisa/api/data/federation.py +185 -0
- provisa-0.1.0a244/provisa/api/data/hydration.py +297 -0
- provisa-0.1.0a244/provisa/api/data/materialization.py +683 -0
- provisa-0.1.0a244/provisa/api/data/mutations.py +416 -0
- provisa-0.1.0a244/provisa/api/data/redirect_unwrap.py +70 -0
- provisa-0.1.0a244/provisa/api/data/sdl.py +247 -0
- provisa-0.1.0a244/provisa/api/data/subscribe.py +581 -0
- provisa-0.1.0a244/provisa/api/data/subscription_sse.py +458 -0
- provisa-0.1.0a244/provisa/api/flight/__init__.py +11 -0
- provisa-0.1.0a244/provisa/api/flight/catalog.py +266 -0
- provisa-0.1.0a244/provisa/api/flight/server.py +622 -0
- provisa-0.1.0a244/provisa/api/jsonapi/__init__.py +11 -0
- provisa-0.1.0a244/provisa/api/jsonapi/errors.py +46 -0
- provisa-0.1.0a244/provisa/api/jsonapi/generator.py +513 -0
- provisa-0.1.0a244/provisa/api/jsonapi/pagination.py +92 -0
- provisa-0.1.0a244/provisa/api/jsonapi/serializer.py +128 -0
- provisa-0.1.0a244/provisa/api/jsonapi/spec.py +260 -0
- provisa-0.1.0a244/provisa/api/mcp/__init__.py +26 -0
- provisa-0.1.0a244/provisa/api/mcp/chat.py +211 -0
- provisa-0.1.0a244/provisa/api/mcp/search.py +206 -0
- provisa-0.1.0a244/provisa/api/mcp/server.py +207 -0
- provisa-0.1.0a244/provisa/api/mcp/status.py +199 -0
- provisa-0.1.0a244/provisa/api/mcp/tls.py +220 -0
- provisa-0.1.0a244/provisa/api/mcp/tools.py +438 -0
- provisa-0.1.0a244/provisa/api/middleware/__init__.py +9 -0
- provisa-0.1.0a244/provisa/api/middleware/rate_limit_middleware.py +62 -0
- provisa-0.1.0a244/provisa/api/middleware/tenant_middleware.py +95 -0
- provisa-0.1.0a244/provisa/api/otel_setup.py +473 -0
- provisa-0.1.0a244/provisa/api/rate_limit.py +124 -0
- provisa-0.1.0a244/provisa/api/rest/__init__.py +11 -0
- provisa-0.1.0a244/provisa/api/rest/cypher_exec.py +491 -0
- provisa-0.1.0a244/provisa/api/rest/cypher_router.py +875 -0
- provisa-0.1.0a244/provisa/api/rest/generator.py +322 -0
- provisa-0.1.0a244/provisa/api/rest/graph_tools_router.py +258 -0
- provisa-0.1.0a244/provisa/api/rest/neo4j_compat_router.py +233 -0
- provisa-0.1.0a244/provisa/api/rest/nl_router.py +150 -0
- provisa-0.1.0a244/provisa/api/rest/openapi_spec.py +532 -0
- provisa-0.1.0a244/provisa/api/rest/registered_call.py +170 -0
- provisa-0.1.0a244/provisa/api/setup_router.py +223 -0
- provisa-0.1.0a244/provisa/api/startup_resilience.py +62 -0
- provisa-0.1.0a244/provisa/api/startup_seed.py +611 -0
- provisa-0.1.0a244/provisa/api/tenant_helpers.py +40 -0
- provisa-0.1.0a244/provisa/api/trino_setup.py +193 -0
- provisa-0.1.0a244/provisa/api_source/__init__.py +9 -0
- provisa-0.1.0a244/provisa/api_source/cache.py +33 -0
- provisa-0.1.0a244/provisa/api_source/caller.py +431 -0
- provisa-0.1.0a244/provisa/api_source/candidates.py +181 -0
- provisa-0.1.0a244/provisa/api_source/engine_cache.py +423 -0
- provisa-0.1.0a244/provisa/api_source/flattener.py +111 -0
- provisa-0.1.0a244/provisa/api_source/introspect.py +306 -0
- provisa-0.1.0a244/provisa/api_source/loader.py +150 -0
- provisa-0.1.0a244/provisa/api_source/models.py +118 -0
- provisa-0.1.0a244/provisa/api_source/normalizers.py +252 -0
- provisa-0.1.0a244/provisa/api_source/promotions.py +91 -0
- provisa-0.1.0a244/provisa/api_source/router_integration.py +136 -0
- provisa-0.1.0a244/provisa/api_source/schema_integration.py +153 -0
- provisa-0.1.0a244/provisa/api_source/transforms.py +46 -0
- provisa-0.1.0a244/provisa/apq/__init__.py +20 -0
- provisa-0.1.0a244/provisa/apq/cache.py +124 -0
- provisa-0.1.0a244/provisa/audit/__init__.py +35 -0
- provisa-0.1.0a244/provisa/audit/compliance_reporter.py +98 -0
- provisa-0.1.0a244/provisa/audit/query_log.py +136 -0
- provisa-0.1.0a244/provisa/audit/sla_monitor.py +115 -0
- provisa-0.1.0a244/provisa/auth/__init__.py +9 -0
- provisa-0.1.0a244/provisa/auth/approval.proto +30 -0
- provisa-0.1.0a244/provisa/auth/approval_hook.py +327 -0
- provisa-0.1.0a244/provisa/auth/approval_pb2.py +55 -0
- provisa-0.1.0a244/provisa/auth/approval_pb2_grpc.py +113 -0
- provisa-0.1.0a244/provisa/auth/middleware.py +279 -0
- provisa-0.1.0a244/provisa/auth/models.py +58 -0
- provisa-0.1.0a244/provisa/auth/providers/__init__.py +9 -0
- provisa-0.1.0a244/provisa/auth/providers/basic.py +73 -0
- provisa-0.1.0a244/provisa/auth/providers/firebase.py +63 -0
- provisa-0.1.0a244/provisa/auth/providers/keycloak.py +74 -0
- provisa-0.1.0a244/provisa/auth/providers/oauth.py +80 -0
- provisa-0.1.0a244/provisa/auth/providers/simple.py +86 -0
- provisa-0.1.0a244/provisa/auth/role_mapping.py +70 -0
- provisa-0.1.0a244/provisa/auth/superuser.py +59 -0
- provisa-0.1.0a244/provisa/auth/wiring.py +195 -0
- provisa-0.1.0a244/provisa/bolt/__init__.py +20 -0
- provisa-0.1.0a244/provisa/bolt/framing.py +52 -0
- provisa-0.1.0a244/provisa/bolt/messages.py +82 -0
- provisa-0.1.0a244/provisa/bolt/packstream.py +456 -0
- provisa-0.1.0a244/provisa/bolt/server.py +218 -0
- provisa-0.1.0a244/provisa/bolt/session.py +824 -0
- provisa-0.1.0a244/provisa/bolt/websocket.py +250 -0
- provisa-0.1.0a244/provisa/cache/__init__.py +24 -0
- provisa-0.1.0a244/provisa/cache/hot_tables.py +790 -0
- provisa-0.1.0a244/provisa/cache/key.py +103 -0
- provisa-0.1.0a244/provisa/cache/middleware.py +70 -0
- provisa-0.1.0a244/provisa/cache/policy.py +76 -0
- provisa-0.1.0a244/provisa/cache/store.py +283 -0
- provisa-0.1.0a244/provisa/cache/warm_tables.py +181 -0
- provisa-0.1.0a244/provisa/cassandra/__init__.py +11 -0
- provisa-0.1.0a244/provisa/cassandra/source.py +149 -0
- provisa-0.1.0a244/provisa/cli.py +110 -0
- provisa-0.1.0a244/provisa/compiler/__init__.py +9 -0
- provisa-0.1.0a244/provisa/compiler/actions_schema.py +251 -0
- provisa-0.1.0a244/provisa/compiler/aggregate_gen.py +259 -0
- provisa-0.1.0a244/provisa/compiler/aggregates.py +622 -0
- provisa-0.1.0a244/provisa/compiler/context.py +380 -0
- provisa-0.1.0a244/provisa/compiler/cte_utils.py +29 -0
- provisa-0.1.0a244/provisa/compiler/cursor.py +206 -0
- provisa-0.1.0a244/provisa/compiler/directives.py +368 -0
- provisa-0.1.0a244/provisa/compiler/enum_detect.py +178 -0
- provisa-0.1.0a244/provisa/compiler/federation.py +263 -0
- provisa-0.1.0a244/provisa/compiler/function_gen.py +170 -0
- provisa-0.1.0a244/provisa/compiler/hints.py +180 -0
- provisa-0.1.0a244/provisa/compiler/introspect.py +279 -0
- provisa-0.1.0a244/provisa/compiler/mask_inject.py +188 -0
- provisa-0.1.0a244/provisa/compiler/mutation_gen.py +401 -0
- provisa-0.1.0a244/provisa/compiler/naming.py +351 -0
- provisa-0.1.0a244/provisa/compiler/nf_extractor.py +251 -0
- provisa-0.1.0a244/provisa/compiler/normalize.py +248 -0
- provisa-0.1.0a244/provisa/compiler/order_by_gen.py +41 -0
- provisa-0.1.0a244/provisa/compiler/params.py +119 -0
- provisa-0.1.0a244/provisa/compiler/parser.py +112 -0
- provisa-0.1.0a244/provisa/compiler/rls.py +182 -0
- provisa-0.1.0a244/provisa/compiler/sampling.py +52 -0
- provisa-0.1.0a244/provisa/compiler/schema_directives.py +224 -0
- provisa-0.1.0a244/provisa/compiler/schema_gen.py +869 -0
- provisa-0.1.0a244/provisa/compiler/schema_inputs.py +290 -0
- provisa-0.1.0a244/provisa/compiler/schema_service.py +87 -0
- provisa-0.1.0a244/provisa/compiler/schema_types.py +78 -0
- provisa-0.1.0a244/provisa/compiler/sql_gen.py +794 -0
- provisa-0.1.0a244/provisa/compiler/sql_rewrite.py +316 -0
- provisa-0.1.0a244/provisa/compiler/sql_selection.py +684 -0
- provisa-0.1.0a244/provisa/compiler/sql_types.py +180 -0
- provisa-0.1.0a244/provisa/compiler/sql_validator.py +549 -0
- provisa-0.1.0a244/provisa/compiler/sql_where.py +307 -0
- provisa-0.1.0a244/provisa/compiler/stage1.py +32 -0
- provisa-0.1.0a244/provisa/compiler/stage2.py +582 -0
- provisa-0.1.0a244/provisa/compiler/type_map.py +243 -0
- provisa-0.1.0a244/provisa/compiler/view_expand.py +94 -0
- provisa-0.1.0a244/provisa/control_plane/__init__.py +11 -0
- provisa-0.1.0a244/provisa/control_plane/models.py +30 -0
- provisa-0.1.0a244/provisa/control_plane/router.py +117 -0
- provisa-0.1.0a244/provisa/control_plane/store.py +46 -0
- provisa-0.1.0a244/provisa/core/__init__.py +9 -0
- provisa-0.1.0a244/provisa/core/auth_models.py +304 -0
- provisa-0.1.0a244/provisa/core/catalog.py +210 -0
- provisa-0.1.0a244/provisa/core/change_signal.py +118 -0
- provisa-0.1.0a244/provisa/core/config_loader.py +983 -0
- provisa-0.1.0a244/provisa/core/control_plane.py +36 -0
- provisa-0.1.0a244/provisa/core/control_plane_pg.py +87 -0
- provisa-0.1.0a244/provisa/core/database.py +914 -0
- provisa-0.1.0a244/provisa/core/db.py +167 -0
- provisa-0.1.0a244/provisa/core/desktop_profile.py +217 -0
- provisa-0.1.0a244/provisa/core/domain_policy.py +108 -0
- provisa-0.1.0a244/provisa/core/duckdb_async.py +358 -0
- provisa-0.1.0a244/provisa/core/ir_types.py +233 -0
- provisa-0.1.0a244/provisa/core/meta_rls.py +136 -0
- provisa-0.1.0a244/provisa/core/models.py +1080 -0
- provisa-0.1.0a244/provisa/core/org_provisioning.py +165 -0
- provisa-0.1.0a244/provisa/core/redis_factory.py +61 -0
- provisa-0.1.0a244/provisa/core/repositories/__init__.py +9 -0
- provisa-0.1.0a244/provisa/core/repositories/creation_request.py +146 -0
- provisa-0.1.0a244/provisa/core/repositories/domain.py +53 -0
- provisa-0.1.0a244/provisa/core/repositories/function.py +223 -0
- provisa-0.1.0a244/provisa/core/repositories/relationship.py +202 -0
- provisa-0.1.0a244/provisa/core/repositories/rls.py +106 -0
- provisa-0.1.0a244/provisa/core/repositories/role.py +52 -0
- provisa-0.1.0a244/provisa/core/repositories/source.py +81 -0
- provisa-0.1.0a244/provisa/core/repositories/table.py +239 -0
- provisa-0.1.0a244/provisa/core/schema.sql +606 -0
- provisa-0.1.0a244/provisa/core/schema_admin.py +168 -0
- provisa-0.1.0a244/provisa/core/schema_org.py +737 -0
- provisa-0.1.0a244/provisa/core/secrets.py +80 -0
- provisa-0.1.0a244/provisa/core/source_registry.py +59 -0
- provisa-0.1.0a244/provisa/core/tenant_context.py +55 -0
- provisa-0.1.0a244/provisa/core/trino_catalog_files.py +348 -0
- provisa-0.1.0a244/provisa/cypher/__init__.py +11 -0
- provisa-0.1.0a244/provisa/cypher/assembler.py +478 -0
- provisa-0.1.0a244/provisa/cypher/comprehension.py +277 -0
- provisa-0.1.0a244/provisa/cypher/correlated_call.py +110 -0
- provisa-0.1.0a244/provisa/cypher/expr_ast.py +247 -0
- provisa-0.1.0a244/provisa/cypher/expr_context.py +421 -0
- provisa-0.1.0a244/provisa/cypher/expr_parser.py +463 -0
- provisa-0.1.0a244/provisa/cypher/expr_visitor.py +302 -0
- provisa-0.1.0a244/provisa/cypher/graph_rewriter.py +304 -0
- provisa-0.1.0a244/provisa/cypher/graph_types.py +88 -0
- provisa-0.1.0a244/provisa/cypher/group_by.py +60 -0
- provisa-0.1.0a244/provisa/cypher/label_map.py +678 -0
- provisa-0.1.0a244/provisa/cypher/map_projection.py +90 -0
- provisa-0.1.0a244/provisa/cypher/params.py +71 -0
- provisa-0.1.0a244/provisa/cypher/parser.py +880 -0
- provisa-0.1.0a244/provisa/cypher/path_functions.py +719 -0
- provisa-0.1.0a244/provisa/cypher/path_translator.py +178 -0
- provisa-0.1.0a244/provisa/cypher/select_builder.py +629 -0
- provisa-0.1.0a244/provisa/cypher/sql_to_cypher.py +764 -0
- provisa-0.1.0a244/provisa/cypher/sql_to_cypher_agg.py +492 -0
- provisa-0.1.0a244/provisa/cypher/sql_to_cypher_helpers.py +85 -0
- provisa-0.1.0a244/provisa/cypher/translator.py +876 -0
- provisa-0.1.0a244/provisa/cypher/translator_helpers.py +452 -0
- provisa-0.1.0a244/provisa/cypher/translator_rel.py +576 -0
- provisa-0.1.0a244/provisa/cypher/translator_types.py +34 -0
- provisa-0.1.0a244/provisa/cypher/translator_union.py +324 -0
- provisa-0.1.0a244/provisa/cypher/write_translator.py +422 -0
- provisa-0.1.0a244/provisa/ddn/__init__.py +17 -0
- provisa-0.1.0a244/provisa/ddn/__main__.py +20 -0
- provisa-0.1.0a244/provisa/ddn/cli.py +172 -0
- provisa-0.1.0a244/provisa/ddn/mapper.py +580 -0
- provisa-0.1.0a244/provisa/ddn/models.py +166 -0
- provisa-0.1.0a244/provisa/ddn/parser.py +496 -0
- provisa-0.1.0a244/provisa/discovery/__init__.py +9 -0
- provisa-0.1.0a244/provisa/discovery/analyzer.py +141 -0
- provisa-0.1.0a244/provisa/discovery/candidates.py +147 -0
- provisa-0.1.0a244/provisa/discovery/catalog_cache.py +239 -0
- provisa-0.1.0a244/provisa/discovery/collector.py +267 -0
- provisa-0.1.0a244/provisa/discovery/column_inference.py +40 -0
- provisa-0.1.0a244/provisa/discovery/fk_introspect.py +462 -0
- provisa-0.1.0a244/provisa/discovery/prompt.py +95 -0
- provisa-0.1.0a244/provisa/discovery/table_search.py +192 -0
- provisa-0.1.0a244/provisa/elasticsearch/__init__.py +11 -0
- provisa-0.1.0a244/provisa/elasticsearch/source.py +236 -0
- provisa-0.1.0a244/provisa/encryption/__init__.py +51 -0
- provisa-0.1.0a244/provisa/encryption/envelope.py +118 -0
- provisa-0.1.0a244/provisa/encryption/factory.py +52 -0
- provisa-0.1.0a244/provisa/encryption/providers.py +252 -0
- provisa-0.1.0a244/provisa/encryption/registry.py +311 -0
- provisa-0.1.0a244/provisa/encryption/runtime.py +55 -0
- provisa-0.1.0a244/provisa/encryption/service.py +52 -0
- provisa-0.1.0a244/provisa/events/__init__.py +11 -0
- provisa-0.1.0a244/provisa/events/app_wiring.py +313 -0
- provisa-0.1.0a244/provisa/events/boot.py +415 -0
- provisa-0.1.0a244/provisa/events/calendars.py +299 -0
- provisa-0.1.0a244/provisa/events/content_hash.py +77 -0
- provisa-0.1.0a244/provisa/events/deadlines.py +176 -0
- provisa-0.1.0a244/provisa/events/freshness_contract.py +75 -0
- provisa-0.1.0a244/provisa/events/handlers.py +282 -0
- provisa-0.1.0a244/provisa/events/injector.py +123 -0
- provisa-0.1.0a244/provisa/events/lineage.py +215 -0
- provisa-0.1.0a244/provisa/events/outcomes.py +95 -0
- provisa-0.1.0a244/provisa/events/probes.py +179 -0
- provisa-0.1.0a244/provisa/events/processor.py +543 -0
- provisa-0.1.0a244/provisa/events/queue.py +267 -0
- provisa-0.1.0a244/provisa/events/snapshots.py +128 -0
- provisa-0.1.0a244/provisa/events/source_loader.py +190 -0
- provisa-0.1.0a244/provisa/events/supervisor.py +74 -0
- provisa-0.1.0a244/provisa/events/triggers.py +286 -0
- provisa-0.1.0a244/provisa/executor/__init__.py +9 -0
- provisa-0.1.0a244/provisa/executor/ctas.py +375 -0
- provisa-0.1.0a244/provisa/executor/direct.py +117 -0
- provisa-0.1.0a244/provisa/executor/drivers/__init__.py +11 -0
- provisa-0.1.0a244/provisa/executor/drivers/base.py +61 -0
- provisa-0.1.0a244/provisa/executor/drivers/bigquery.py +95 -0
- provisa-0.1.0a244/provisa/executor/drivers/clickhouse.py +81 -0
- provisa-0.1.0a244/provisa/executor/drivers/databricks.py +87 -0
- provisa-0.1.0a244/provisa/executor/drivers/duckdb_driver.py +67 -0
- provisa-0.1.0a244/provisa/executor/drivers/mssql_warehouse.py +114 -0
- provisa-0.1.0a244/provisa/executor/drivers/mysql.py +71 -0
- provisa-0.1.0a244/provisa/executor/drivers/oracle.py +70 -0
- provisa-0.1.0a244/provisa/executor/drivers/postgresql.py +133 -0
- provisa-0.1.0a244/provisa/executor/drivers/registry.py +193 -0
- provisa-0.1.0a244/provisa/executor/drivers/snowflake.py +86 -0
- provisa-0.1.0a244/provisa/executor/drivers/sqlalchemy_driver.py +117 -0
- provisa-0.1.0a244/provisa/executor/drivers/sqlserver.py +78 -0
- provisa-0.1.0a244/provisa/executor/errors.py +53 -0
- provisa-0.1.0a244/provisa/executor/formats/__init__.py +11 -0
- provisa-0.1.0a244/provisa/executor/formats/arrow.py +66 -0
- provisa-0.1.0a244/provisa/executor/formats/ndjson.py +48 -0
- provisa-0.1.0a244/provisa/executor/formats/tabular.py +125 -0
- provisa-0.1.0a244/provisa/executor/function_dispatch.py +310 -0
- provisa-0.1.0a244/provisa/executor/pool.py +139 -0
- provisa-0.1.0a244/provisa/executor/redirect.py +446 -0
- provisa-0.1.0a244/provisa/executor/result.py +29 -0
- provisa-0.1.0a244/provisa/executor/serialize.py +648 -0
- provisa-0.1.0a244/provisa/executor/stats.py +100 -0
- provisa-0.1.0a244/provisa/executor/trino.py +270 -0
- provisa-0.1.0a244/provisa/executor/trino_flight.py +169 -0
- provisa-0.1.0a244/provisa/executor/trino_write.py +113 -0
- provisa-0.1.0a244/provisa/executor/writable.py +118 -0
- provisa-0.1.0a244/provisa/federation/__init__.py +2 -0
- provisa-0.1.0a244/provisa/federation/backend.py +587 -0
- provisa-0.1.0a244/provisa/federation/bigquery_backend.py +34 -0
- provisa-0.1.0a244/provisa/federation/bigquery_connectors.py +113 -0
- provisa-0.1.0a244/provisa/federation/bigquery_runtime.py +234 -0
- provisa-0.1.0a244/provisa/federation/cardinality.py +85 -0
- provisa-0.1.0a244/provisa/federation/clickhouse_backend.py +46 -0
- provisa-0.1.0a244/provisa/federation/clickhouse_connectors.py +227 -0
- provisa-0.1.0a244/provisa/federation/clickhouse_runtime.py +403 -0
- provisa-0.1.0a244/provisa/federation/conformance.py +102 -0
- provisa-0.1.0a244/provisa/federation/connector.py +55 -0
- provisa-0.1.0a244/provisa/federation/connector_base.py +199 -0
- provisa-0.1.0a244/provisa/federation/connector_duckdb.py +729 -0
- provisa-0.1.0a244/provisa/federation/databricks_backend.py +37 -0
- provisa-0.1.0a244/provisa/federation/databricks_connectors.py +92 -0
- provisa-0.1.0a244/provisa/federation/databricks_runtime.py +268 -0
- provisa-0.1.0a244/provisa/federation/databricks_store.py +334 -0
- provisa-0.1.0a244/provisa/federation/databricks_tls.py +34 -0
- provisa-0.1.0a244/provisa/federation/databricks_uc.py +169 -0
- provisa-0.1.0a244/provisa/federation/delta.py +79 -0
- provisa-0.1.0a244/provisa/federation/duckdb_backend.py +34 -0
- provisa-0.1.0a244/provisa/federation/duckdb_extensions.py +106 -0
- provisa-0.1.0a244/provisa/federation/duckdb_runtime.py +372 -0
- provisa-0.1.0a244/provisa/federation/engine.py +1222 -0
- provisa-0.1.0a244/provisa/federation/fabric_shortcuts.py +184 -0
- provisa-0.1.0a244/provisa/federation/fdw_artifact_catalog.py +218 -0
- provisa-0.1.0a244/provisa/federation/freshness_gate.py +86 -0
- provisa-0.1.0a244/provisa/federation/materialization.py +107 -0
- provisa-0.1.0a244/provisa/federation/materialize_exec.py +240 -0
- provisa-0.1.0a244/provisa/federation/mssql_warehouse_backend.py +52 -0
- provisa-0.1.0a244/provisa/federation/mssql_warehouse_connectors.py +76 -0
- provisa-0.1.0a244/provisa/federation/mssql_warehouse_runtime.py +280 -0
- provisa-0.1.0a244/provisa/federation/native_backend.py +305 -0
- provisa-0.1.0a244/provisa/federation/pg_backend.py +50 -0
- provisa-0.1.0a244/provisa/federation/pg_runtime.py +109 -0
- provisa-0.1.0a244/provisa/federation/pgwire_replica.py +494 -0
- provisa-0.1.0a244/provisa/federation/plan.py +190 -0
- provisa-0.1.0a244/provisa/federation/promote.py +142 -0
- provisa-0.1.0a244/provisa/federation/read_through.py +70 -0
- provisa-0.1.0a244/provisa/federation/residency.py +145 -0
- provisa-0.1.0a244/provisa/federation/runtime.py +316 -0
- provisa-0.1.0a244/provisa/federation/runtime_support.py +49 -0
- provisa-0.1.0a244/provisa/federation/snowflake_backend.py +37 -0
- provisa-0.1.0a244/provisa/federation/snowflake_connectors.py +134 -0
- provisa-0.1.0a244/provisa/federation/snowflake_runtime.py +157 -0
- provisa-0.1.0a244/provisa/federation/sqlalchemy_backend.py +32 -0
- provisa-0.1.0a244/provisa/federation/sqlalchemy_runtime.py +71 -0
- provisa-0.1.0a244/provisa/federation/store_connection.py +130 -0
- provisa-0.1.0a244/provisa/federation/store_writer.py +319 -0
- provisa-0.1.0a244/provisa/federation/strategy.py +165 -0
- provisa-0.1.0a244/provisa/federation/trino_connectors.py +544 -0
- provisa-0.1.0a244/provisa/federation/trino_lifecycle.py +320 -0
- provisa-0.1.0a244/provisa/file_source/__init__.py +9 -0
- provisa-0.1.0a244/provisa/file_source/crawler.py +226 -0
- provisa-0.1.0a244/provisa/file_source/pg_migrate.py +171 -0
- provisa-0.1.0a244/provisa/file_source/source.py +333 -0
- provisa-0.1.0a244/provisa/freshness/__init__.py +52 -0
- provisa-0.1.0a244/provisa/freshness/adapters.py +53 -0
- provisa-0.1.0a244/provisa/freshness/decision.py +52 -0
- provisa-0.1.0a244/provisa/freshness/predicate.py +135 -0
- provisa-0.1.0a244/provisa/freshness/producer.py +78 -0
- provisa-0.1.0a244/provisa/freshness/source_gate.py +99 -0
- provisa-0.1.0a244/provisa/freshness/subject.py +63 -0
- provisa-0.1.0a244/provisa/google_sheets/__init__.py +11 -0
- provisa-0.1.0a244/provisa/google_sheets/source.py +68 -0
- provisa-0.1.0a244/provisa/govdata/__init__.py +9 -0
- provisa-0.1.0a244/provisa/govdata/schema_import.py +199 -0
- provisa-0.1.0a244/provisa/govdata/source.py +145 -0
- provisa-0.1.0a244/provisa/govdata/subjects.py +46 -0
- provisa-0.1.0a244/provisa/govdata/subscription.py +65 -0
- provisa-0.1.0a244/provisa/graphql_remote/__init__.py +9 -0
- provisa-0.1.0a244/provisa/graphql_remote/executor.py +117 -0
- provisa-0.1.0a244/provisa/graphql_remote/introspect.py +66 -0
- provisa-0.1.0a244/provisa/graphql_remote/mapper.py +589 -0
- provisa-0.1.0a244/provisa/grpc/__init__.py +9 -0
- provisa-0.1.0a244/provisa/grpc/proto_gen.py +243 -0
- provisa-0.1.0a244/provisa/grpc/query_ir.py +38 -0
- provisa-0.1.0a244/provisa/grpc/reflection.py +32 -0
- provisa-0.1.0a244/provisa/grpc/schema_gen.py +67 -0
- provisa-0.1.0a244/provisa/grpc/server.py +214 -0
- provisa-0.1.0a244/provisa/grpc_remote/__init__.py +9 -0
- provisa-0.1.0a244/provisa/grpc_remote/executor.py +151 -0
- provisa-0.1.0a244/provisa/grpc_remote/loader.py +239 -0
- provisa-0.1.0a244/provisa/grpc_remote/mapper.py +238 -0
- provisa-0.1.0a244/provisa/hasura_v2/__init__.py +17 -0
- provisa-0.1.0a244/provisa/hasura_v2/__main__.py +18 -0
- provisa-0.1.0a244/provisa/hasura_v2/cli.py +168 -0
- provisa-0.1.0a244/provisa/hasura_v2/mapper.py +608 -0
- provisa-0.1.0a244/provisa/hasura_v2/models.py +139 -0
- provisa-0.1.0a244/provisa/hasura_v2/parser.py +383 -0
- provisa-0.1.0a244/provisa/import_shared/__init__.py +12 -0
- provisa-0.1.0a244/provisa/import_shared/filters.py +157 -0
- provisa-0.1.0a244/provisa/import_shared/warnings.py +55 -0
- provisa-0.1.0a244/provisa/ingest/__init__.py +11 -0
- provisa-0.1.0a244/provisa/ingest/ddl.py +99 -0
- provisa-0.1.0a244/provisa/ingest/engine.py +90 -0
- provisa-0.1.0a244/provisa/ingest/provider.py +80 -0
- provisa-0.1.0a244/provisa/ingest/router.py +117 -0
- provisa-0.1.0a244/provisa/kafka/__init__.py +11 -0
- provisa-0.1.0a244/provisa/kafka/change_events.py +99 -0
- provisa-0.1.0a244/provisa/kafka/schema_registry.py +176 -0
- provisa-0.1.0a244/provisa/kafka/sink.py +146 -0
- provisa-0.1.0a244/provisa/kafka/sink_executor.py +94 -0
- provisa-0.1.0a244/provisa/kafka/source.py +297 -0
- provisa-0.1.0a244/provisa/kafka/window.py +134 -0
- provisa-0.1.0a244/provisa/lineage/__init__.py +33 -0
- provisa-0.1.0a244/provisa/lineage/columns.py +80 -0
- provisa-0.1.0a244/provisa/lineage/versions.py +86 -0
- provisa-0.1.0a244/provisa/live/__init__.py +15 -0
- provisa-0.1.0a244/provisa/live/engine.py +387 -0
- provisa-0.1.0a244/provisa/live/outputs/__init__.py +11 -0
- provisa-0.1.0a244/provisa/live/outputs/base.py +29 -0
- provisa-0.1.0a244/provisa/live/outputs/kafka.py +71 -0
- provisa-0.1.0a244/provisa/live/outputs/sse.py +93 -0
- provisa-0.1.0a244/provisa/live/reconcile.py +83 -0
- provisa-0.1.0a244/provisa/live/watermark.py +76 -0
- provisa-0.1.0a244/provisa/llm/__init__.py +5 -0
- provisa-0.1.0a244/provisa/llm/client.py +151 -0
- provisa-0.1.0a244/provisa/mongodb/__init__.py +11 -0
- provisa-0.1.0a244/provisa/mongodb/source.py +152 -0
- provisa-0.1.0a244/provisa/mv/__init__.py +15 -0
- provisa-0.1.0a244/provisa/mv/aggregate_catalog.py +210 -0
- provisa-0.1.0a244/provisa/mv/coordination.py +214 -0
- provisa-0.1.0a244/provisa/mv/delta.py +248 -0
- provisa-0.1.0a244/provisa/mv/determinism.py +97 -0
- provisa-0.1.0a244/provisa/mv/input_signals.py +122 -0
- provisa-0.1.0a244/provisa/mv/models.py +175 -0
- provisa-0.1.0a244/provisa/mv/refresh.py +522 -0
- provisa-0.1.0a244/provisa/mv/registry.py +131 -0
- provisa-0.1.0a244/provisa/mv/rewriter.py +352 -0
- provisa-0.1.0a244/provisa/mv/schema.sql +62 -0
- provisa-0.1.0a244/provisa/neo4j/__init__.py +11 -0
- provisa-0.1.0a244/provisa/neo4j/preview.py +104 -0
- provisa-0.1.0a244/provisa/neo4j/source.py +120 -0
- provisa-0.1.0a244/provisa/nl/__init__.py +12 -0
- provisa-0.1.0a244/provisa/nl/executor.py +206 -0
- provisa-0.1.0a244/provisa/nl/job.py +182 -0
- provisa-0.1.0a244/provisa/nl/loop.py +162 -0
- provisa-0.1.0a244/provisa/nl/prompt.py +114 -0
- provisa-0.1.0a244/provisa/nl/runner.py +320 -0
- provisa-0.1.0a244/provisa/nl/schema_matcher.py +274 -0
- provisa-0.1.0a244/provisa/observability/__init__.py +7 -0
- provisa-0.1.0a244/provisa/observability/ops_schema.py +173 -0
- provisa-0.1.0a244/provisa/observability/ops_trino.py +152 -0
- provisa-0.1.0a244/provisa/observability/otlp2sql.py +360 -0
- provisa-0.1.0a244/provisa/observability/stage_trace.py +100 -0
- provisa-0.1.0a244/provisa/observability/telemetry_pg.py +61 -0
- provisa-0.1.0a244/provisa/openapi/__init__.py +9 -0
- provisa-0.1.0a244/provisa/openapi/loader.py +58 -0
- provisa-0.1.0a244/provisa/openapi/mapper.py +259 -0
- provisa-0.1.0a244/provisa/openapi/pg_cache.py +394 -0
- provisa-0.1.0a244/provisa/openapi/register.py +321 -0
- provisa-0.1.0a244/provisa/otel_compat.py +221 -0
- provisa-0.1.0a244/provisa/pg_extensions/__init__.py +33 -0
- provisa-0.1.0a244/provisa/pg_extensions/catalog.py +277 -0
- provisa-0.1.0a244/provisa/pgwire/__init__.py +9 -0
- provisa-0.1.0a244/provisa/pgwire/_pipeline.py +533 -0
- provisa-0.1.0a244/provisa/pgwire/catalog.py +331 -0
- provisa-0.1.0a244/provisa/pgwire/catalog_columns_data.py +840 -0
- provisa-0.1.0a244/provisa/pgwire/catalog_constraints.py +502 -0
- provisa-0.1.0a244/provisa/pgwire/catalog_data.py +459 -0
- provisa-0.1.0a244/provisa/pgwire/catalog_populate.py +883 -0
- provisa-0.1.0a244/provisa/pgwire/catalog_rewrite.py +351 -0
- provisa-0.1.0a244/provisa/pgwire/copy_binary.py +112 -0
- provisa-0.1.0a244/provisa/pgwire/copy_handler.py +455 -0
- provisa-0.1.0a244/provisa/pgwire/ddl_handler.py +254 -0
- provisa-0.1.0a244/provisa/pgwire/ext_surfaces.py +305 -0
- provisa-0.1.0a244/provisa/pgwire/function_call.py +88 -0
- provisa-0.1.0a244/provisa/pgwire/function_catalog.py +104 -0
- provisa-0.1.0a244/provisa/pgwire/server.py +676 -0
- provisa-0.1.0a244/provisa/pgwire/system_tables.py +205 -0
- provisa-0.1.0a244/provisa/prometheus/__init__.py +11 -0
- provisa-0.1.0a244/provisa/prometheus/source.py +115 -0
- provisa-0.1.0a244/provisa/redis/__init__.py +11 -0
- provisa-0.1.0a244/provisa/redis/source.py +136 -0
- provisa-0.1.0a244/provisa/runtime_deps/__init__.py +44 -0
- provisa-0.1.0a244/provisa/runtime_deps/pgwire_bundles.py +161 -0
- provisa-0.1.0a244/provisa/scheduler/__init__.py +5 -0
- provisa-0.1.0a244/provisa/scheduler/jobs.py +534 -0
- provisa-0.1.0a244/provisa/scheduler/templating.py +49 -0
- provisa-0.1.0a244/provisa/schema_clusters.py +37 -0
- provisa-0.1.0a244/provisa/security/__init__.py +11 -0
- provisa-0.1.0a244/provisa/security/association_suggester.py +246 -0
- provisa-0.1.0a244/provisa/security/high_security.py +107 -0
- provisa-0.1.0a244/provisa/security/masking.py +278 -0
- provisa-0.1.0a244/provisa/security/mutation_authz.py +156 -0
- provisa-0.1.0a244/provisa/security/rights.py +100 -0
- provisa-0.1.0a244/provisa/security/visibility.py +56 -0
- provisa-0.1.0a244/provisa/source_adapters/__init__.py +11 -0
- provisa-0.1.0a244/provisa/source_adapters/grpc_remote_adapter.py +97 -0
- provisa-0.1.0a244/provisa/source_adapters/openapi_adapter.py +127 -0
- provisa-0.1.0a244/provisa/source_adapters/registry.py +69 -0
- provisa-0.1.0a244/provisa/sources/__init__.py +3 -0
- provisa-0.1.0a244/provisa/sources/counts.py +43 -0
- provisa-0.1.0a244/provisa/sources/gql.py +26 -0
- provisa-0.1.0a244/provisa/sparql/__init__.py +11 -0
- provisa-0.1.0a244/provisa/sparql/source.py +163 -0
- provisa-0.1.0a244/provisa/subscriptions/__init__.py +16 -0
- provisa-0.1.0a244/provisa/subscriptions/base.py +47 -0
- provisa-0.1.0a244/provisa/subscriptions/cdc_landing.py +62 -0
- provisa-0.1.0a244/provisa/subscriptions/debezium_provider.py +257 -0
- provisa-0.1.0a244/provisa/subscriptions/govdata_provider.py +162 -0
- provisa-0.1.0a244/provisa/subscriptions/kafka_provider.py +110 -0
- provisa-0.1.0a244/provisa/subscriptions/mongo_provider.py +84 -0
- provisa-0.1.0a244/provisa/subscriptions/pg_provider.py +131 -0
- provisa-0.1.0a244/provisa/subscriptions/pg_triggers.py +82 -0
- provisa-0.1.0a244/provisa/subscriptions/polling_provider.py +82 -0
- provisa-0.1.0a244/provisa/subscriptions/registry.py +163 -0
- provisa-0.1.0a244/provisa/subscriptions/rss_provider.py +230 -0
- provisa-0.1.0a244/provisa/subscriptions/trino_polling_provider.py +137 -0
- provisa-0.1.0a244/provisa/subscriptions/websocket_provider.py +143 -0
- provisa-0.1.0a244/provisa/tools/__init__.py +9 -0
- provisa-0.1.0a244/provisa/tools/req_schema.py +194 -0
- provisa-0.1.0a244/provisa/transpiler/__init__.py +9 -0
- provisa-0.1.0a244/provisa/transpiler/router.py +241 -0
- provisa-0.1.0a244/provisa/transpiler/transpile.py +182 -0
- provisa-0.1.0a244/provisa/transpiler/transpile_correlated.py +970 -0
- provisa-0.1.0a244/provisa/ui_server.py +141 -0
- provisa-0.1.0a244/provisa/vector/__init__.py +11 -0
- provisa-0.1.0a244/provisa/vector/cache_invalidation.py +71 -0
- provisa-0.1.0a244/provisa/vector/capability.py +42 -0
- provisa-0.1.0a244/provisa/vector/fallback_cache.py +101 -0
- provisa-0.1.0a244/provisa/vector/generation.py +85 -0
- provisa-0.1.0a244/provisa/vector/governance.py +47 -0
- provisa-0.1.0a244/provisa/vector/providers.py +117 -0
- provisa-0.1.0a244/provisa/vector/query.py +98 -0
- provisa-0.1.0a244/provisa/vector/registry.py +74 -0
- provisa-0.1.0a244/provisa/vector/scheduled_refresh.py +65 -0
- provisa-0.1.0a244/provisa/vector/support.py +44 -0
- provisa-0.1.0a244/provisa/webhooks/__init__.py +15 -0
- provisa-0.1.0a244/provisa/webhooks/executor.py +98 -0
- provisa-0.1.0a244/provisa.egg-info/PKG-INFO +129 -0
- provisa-0.1.0a244/provisa.egg-info/SOURCES.txt +750 -0
- provisa-0.1.0a244/provisa.egg-info/dependency_links.txt +1 -0
- provisa-0.1.0a244/provisa.egg-info/entry_points.txt +2 -0
- provisa-0.1.0a244/provisa.egg-info/requires.txt +137 -0
- provisa-0.1.0a244/provisa.egg-info/top_level.txt +2 -0
- provisa-0.1.0a244/pyproject.toml +300 -0
- provisa-0.1.0a244/setup.cfg +4 -0
- provisa-0.1.0a244/vendor/buenavista/buenavista/__init__.py +9 -0
- provisa-0.1.0a244/vendor/buenavista/buenavista/bv_dialects.py +123 -0
- provisa-0.1.0a244/vendor/buenavista/buenavista/core.py +150 -0
- provisa-0.1.0a244/vendor/buenavista/buenavista/postgres.py +853 -0
- provisa-0.1.0a244/vendor/buenavista/buenavista/rewrite.py +66 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
Parameters
|
|
4
|
+
|
|
5
|
+
Licensor: Kenneth Stott
|
|
6
|
+
Licensed Work: Provisa (this repository and any accompanying code, data,
|
|
7
|
+
or assets). The Licensed Work is (c) 2026 Kenneth Stott.
|
|
8
|
+
Additional Use Grant: In addition to non-production use, production use by
|
|
9
|
+
individuals and organizations with fewer than 100 total
|
|
10
|
+
employees and contractors and with less than 1,000,000 USD
|
|
11
|
+
(or equivalent) total revenue in the prior tax year is
|
|
12
|
+
permitted. Any production use by larger organizations
|
|
13
|
+
requires a separate commercial license.
|
|
14
|
+
Change Date: The fourth anniversary of the date on which each released
|
|
15
|
+
version of the Licensed Work is first made publicly
|
|
16
|
+
available by the Licensor.
|
|
17
|
+
Change License: GNU General Public License, Version 2.0 or later.
|
|
18
|
+
|
|
19
|
+
For information about alternative licensing arrangements for the Licensed Work,
|
|
20
|
+
please contact: kennethstott@gmail.com
|
|
21
|
+
|
|
22
|
+
Notice
|
|
23
|
+
|
|
24
|
+
Business Source License 1.1
|
|
25
|
+
|
|
26
|
+
Terms
|
|
27
|
+
|
|
28
|
+
The Licensor hereby grants you the right to copy, modify, create derivative
|
|
29
|
+
works, redistribute, and make non-production use of the Licensed Work. The
|
|
30
|
+
Licensor may make an Additional Use Grant, above, permitting limited production
|
|
31
|
+
use.
|
|
32
|
+
|
|
33
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
34
|
+
available distribution of a specific version of the Licensed Work under this
|
|
35
|
+
License, whichever comes first, the Licensor hereby grants you rights under the
|
|
36
|
+
terms of the Change License, and the rights granted in the paragraph above
|
|
37
|
+
terminate.
|
|
38
|
+
|
|
39
|
+
If your use of the Licensed Work does not comply with the requirements currently
|
|
40
|
+
in effect as described in this License, you must purchase a commercial license
|
|
41
|
+
from the Licensor, its affiliated entities, or authorized resellers, or you must
|
|
42
|
+
refrain from using the Licensed Work.
|
|
43
|
+
|
|
44
|
+
All copies of the original and modified Licensed Work, and derivative works of
|
|
45
|
+
the Licensed Work, are subject to this License. This License applies separately
|
|
46
|
+
for each version of the Licensed Work and the Change Date may vary for each
|
|
47
|
+
version of the Licensed Work released by Licensor.
|
|
48
|
+
|
|
49
|
+
You must conspicuously display this License on each original or modified copy of
|
|
50
|
+
the Licensed Work. If you receive the Licensed Work in original or modified form
|
|
51
|
+
from a third party, the terms and conditions set forth in this License apply to
|
|
52
|
+
your use of that work.
|
|
53
|
+
|
|
54
|
+
Any use of the Licensed Work in violation of this License will automatically
|
|
55
|
+
terminate your rights under this License for the current and all other versions
|
|
56
|
+
of the Licensed Work.
|
|
57
|
+
|
|
58
|
+
This License does not grant you any right in any trademark or logo of Licensor
|
|
59
|
+
or its affiliates (provided that you may use a trademark or logo of Licensor as
|
|
60
|
+
expressly required by this License).
|
|
61
|
+
|
|
62
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN
|
|
63
|
+
"AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS
|
|
64
|
+
OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY,
|
|
65
|
+
FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.
|
|
66
|
+
|
|
67
|
+
MariaDB hereby grants you permission to use this License's text to license your
|
|
68
|
+
works, and to refer to it using the trademark "Business Source License", as long
|
|
69
|
+
as you comply with the Covenants of Licensor below.
|
|
70
|
+
|
|
71
|
+
Covenants of Licensor
|
|
72
|
+
|
|
73
|
+
In consideration of the right to use this License's text and the "Business Source
|
|
74
|
+
License" name and trademark, Licensor covenants to MariaDB, and to all other
|
|
75
|
+
recipients of the licensed work to be provided by Licensor:
|
|
76
|
+
|
|
77
|
+
1. To specify as the Change License the GPL Version 2.0 or any later version, or
|
|
78
|
+
a license that is compatible with GPL Version 2.0 or a later version, where
|
|
79
|
+
"compatible" means that software provided under the Change License can be
|
|
80
|
+
included in a program with software provided under GPL Version 2.0 or a later
|
|
81
|
+
version. Licensor may specify additional Change Licenses without limitation.
|
|
82
|
+
|
|
83
|
+
2. To either: (a) specify an additional grant of rights to use that does not
|
|
84
|
+
impose any additional restriction on the right granted in this License, as the
|
|
85
|
+
Additional Use Grant; or (b) insert the text "None".
|
|
86
|
+
|
|
87
|
+
3. To specify a Change Date.
|
|
88
|
+
|
|
89
|
+
4. Not to modify this License in any other way.
|
provisa-0.1.0a244/NOTICE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Provisa
|
|
2
|
+
Copyright (c) 2026 Kenneth Stott
|
|
3
|
+
|
|
4
|
+
This product is licensed under the Business Source License 1.1 (see LICENSE).
|
|
5
|
+
|
|
6
|
+
AI / Machine-Learning Training Notice
|
|
7
|
+
-------------------------------------
|
|
8
|
+
The Licensor does not consent to the use of the Licensed Work, or any portion
|
|
9
|
+
of it, or any outputs derived from it, for training, fine-tuning, instructing,
|
|
10
|
+
or otherwise developing or improving (directly or indirectly) any machine
|
|
11
|
+
learning, foundation, or generative AI model, or for creating datasets for such
|
|
12
|
+
purposes ("AI Training Use").
|
|
13
|
+
|
|
14
|
+
This is a reservation of rights and a declared opt-out under applicable text-
|
|
15
|
+
and data-mining and copyright frameworks. It is a notice of the Licensor's
|
|
16
|
+
intent, not an additional restriction on the rights granted by the Business
|
|
17
|
+
Source License 1.1. Any party wishing to make AI Training Use of the Licensed
|
|
18
|
+
Work must obtain a separate written license from the Licensor:
|
|
19
|
+
kennethstott@gmail.com
|
|
20
|
+
|
|
21
|
+
Machine-readable opt-out signals accompanying this repository:
|
|
22
|
+
- robots.txt (crawler exclusion for known AI/data-collection agents)
|
|
23
|
+
- ai.txt (Do-Not-Train declaration)
|
|
24
|
+
|
|
25
|
+
Attribution notices in the Licensed Work must be preserved in copies and
|
|
26
|
+
derivative works, as required by the Business Source License 1.1.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: provisa
|
|
3
|
+
Version: 0.1.0a244
|
|
4
|
+
Summary: Config-driven data virtualization platform
|
|
5
|
+
Requires-Python: <3.13,>=3.12
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
License-File: NOTICE
|
|
8
|
+
Requires-Dist: fastapi
|
|
9
|
+
Requires-Dist: uvicorn
|
|
10
|
+
Requires-Dist: asyncpg
|
|
11
|
+
Requires-Dist: pydantic>=2
|
|
12
|
+
Requires-Dist: strawberry-graphql[fastapi]
|
|
13
|
+
Requires-Dist: pyyaml
|
|
14
|
+
Requires-Dist: graphql-core>=3.2
|
|
15
|
+
Requires-Dist: sqlglot
|
|
16
|
+
Requires-Dist: trino
|
|
17
|
+
Requires-Dist: grpcio
|
|
18
|
+
Requires-Dist: grpcio-tools
|
|
19
|
+
Requires-Dist: grpcio-reflection
|
|
20
|
+
Requires-Dist: pyarrow
|
|
21
|
+
Requires-Dist: adbc-driver-flightsql
|
|
22
|
+
Requires-Dist: adbc-driver-manager
|
|
23
|
+
Requires-Dist: httpx
|
|
24
|
+
Requires-Dist: redis[hiredis]
|
|
25
|
+
Requires-Dist: fakeredis
|
|
26
|
+
Requires-Dist: anthropic
|
|
27
|
+
Requires-Dist: mcp>=1.2.0
|
|
28
|
+
Requires-Dist: aisuite>=0.1
|
|
29
|
+
Requires-Dist: apscheduler>=3.10
|
|
30
|
+
Requires-Dist: inflect
|
|
31
|
+
Requires-Dist: jsonpath-ng
|
|
32
|
+
Requires-Dist: PyJWT[crypto]
|
|
33
|
+
Requires-Dist: bcrypt
|
|
34
|
+
Requires-Dist: motor
|
|
35
|
+
Requires-Dist: elasticsearch<9,>=8
|
|
36
|
+
Requires-Dist: aiokafka
|
|
37
|
+
Requires-Dist: websockets>=11.0
|
|
38
|
+
Requires-Dist: boto3
|
|
39
|
+
Requires-Dist: cryptography
|
|
40
|
+
Requires-Dist: sqlalchemy>=2
|
|
41
|
+
Requires-Dist: duckdb-engine
|
|
42
|
+
Requires-Dist: clickhouse-connect
|
|
43
|
+
Requires-Dist: clickhouse-driver
|
|
44
|
+
Requires-Dist: chdb; sys_platform != "win32"
|
|
45
|
+
Requires-Dist: snowflake-connector-python[pandas]
|
|
46
|
+
Requires-Dist: databricks-sql-connector
|
|
47
|
+
Requires-Dist: google-cloud-bigquery
|
|
48
|
+
Requires-Dist: google-cloud-bigquery-storage
|
|
49
|
+
Requires-Dist: google-cloud-storage
|
|
50
|
+
Requires-Dist: protobuf<7,>=6.33.5
|
|
51
|
+
Requires-Dist: grpcio-status<1.82
|
|
52
|
+
Requires-Dist: pyodbc
|
|
53
|
+
Requires-Dist: azure-identity
|
|
54
|
+
Requires-Dist: psycopg2-binary
|
|
55
|
+
Requires-Dist: opentelemetry-sdk
|
|
56
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc
|
|
57
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-http
|
|
58
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi
|
|
59
|
+
Requires-Dist: opentelemetry-instrumentation-httpx
|
|
60
|
+
Requires-Dist: opentelemetry-instrumentation-asyncpg
|
|
61
|
+
Requires-Dist: opentelemetry-instrumentation-redis
|
|
62
|
+
Requires-Dist: opentelemetry-instrumentation-pymongo
|
|
63
|
+
Requires-Dist: opentelemetry-instrumentation-elasticsearch
|
|
64
|
+
Requires-Dist: opentelemetry-instrumentation-grpc
|
|
65
|
+
Requires-Dist: python-dateutil
|
|
66
|
+
Requires-Dist: duckdb
|
|
67
|
+
Requires-Dist: networkx>=3.0
|
|
68
|
+
Requires-Dist: scipy
|
|
69
|
+
Requires-Dist: defusedxml
|
|
70
|
+
Requires-Dist: jpype1
|
|
71
|
+
Requires-Dist: minio
|
|
72
|
+
Requires-Dist: pyiceberg
|
|
73
|
+
Requires-Dist: neo4j
|
|
74
|
+
Requires-Dist: aiosqlite
|
|
75
|
+
Requires-Dist: greenlet
|
|
76
|
+
Provides-Extra: embedded
|
|
77
|
+
Requires-Dist: duckdb; extra == "embedded"
|
|
78
|
+
Requires-Dist: aiosqlite; extra == "embedded"
|
|
79
|
+
Requires-Dist: greenlet; extra == "embedded"
|
|
80
|
+
Requires-Dist: fakeredis; extra == "embedded"
|
|
81
|
+
Provides-Extra: telemetry-pg
|
|
82
|
+
Requires-Dist: pgserver; extra == "telemetry-pg"
|
|
83
|
+
Provides-Extra: desktop
|
|
84
|
+
Requires-Dist: mcp-proxy; extra == "desktop"
|
|
85
|
+
Provides-Extra: mysql
|
|
86
|
+
Requires-Dist: aiomysql; extra == "mysql"
|
|
87
|
+
Provides-Extra: sqlserver
|
|
88
|
+
Requires-Dist: aioodbc; extra == "sqlserver"
|
|
89
|
+
Provides-Extra: oracle
|
|
90
|
+
Requires-Dist: oracledb; extra == "oracle"
|
|
91
|
+
Provides-Extra: all-drivers
|
|
92
|
+
Requires-Dist: aiomysql; extra == "all-drivers"
|
|
93
|
+
Requires-Dist: aioodbc; extra == "all-drivers"
|
|
94
|
+
Requires-Dist: oracledb; extra == "all-drivers"
|
|
95
|
+
Provides-Extra: govdata
|
|
96
|
+
Requires-Dist: askamerica[engine]; extra == "govdata"
|
|
97
|
+
Provides-Extra: firebase
|
|
98
|
+
Requires-Dist: firebase-admin; extra == "firebase"
|
|
99
|
+
Provides-Extra: vault
|
|
100
|
+
Requires-Dist: hvac; extra == "vault"
|
|
101
|
+
Provides-Extra: azure
|
|
102
|
+
Requires-Dist: azure-keyvault-keys; extra == "azure"
|
|
103
|
+
Provides-Extra: gcp
|
|
104
|
+
Requires-Dist: google-cloud-kms; extra == "gcp"
|
|
105
|
+
Provides-Extra: kms-all
|
|
106
|
+
Requires-Dist: hvac; extra == "kms-all"
|
|
107
|
+
Requires-Dist: azure-keyvault-keys; extra == "kms-all"
|
|
108
|
+
Requires-Dist: google-cloud-kms; extra == "kms-all"
|
|
109
|
+
Provides-Extra: dev
|
|
110
|
+
Requires-Dist: pytest; extra == "dev"
|
|
111
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
112
|
+
Requires-Dist: pytest-bdd; extra == "dev"
|
|
113
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
114
|
+
Requires-Dist: ruff; extra == "dev"
|
|
115
|
+
Requires-Dist: black; extra == "dev"
|
|
116
|
+
Requires-Dist: pyright; extra == "dev"
|
|
117
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
118
|
+
Requires-Dist: bandit; extra == "dev"
|
|
119
|
+
Requires-Dist: pip-audit; extra == "dev"
|
|
120
|
+
Requires-Dist: import-linter; extra == "dev"
|
|
121
|
+
Requires-Dist: syrupy; extra == "dev"
|
|
122
|
+
Requires-Dist: respx; extra == "dev"
|
|
123
|
+
Requires-Dist: python-pptx; extra == "dev"
|
|
124
|
+
Requires-Dist: aiosqlite; extra == "dev"
|
|
125
|
+
Requires-Dist: greenlet; extra == "dev"
|
|
126
|
+
Requires-Dist: pandas; extra == "dev"
|
|
127
|
+
Requires-Dist: aiomysql; extra == "dev"
|
|
128
|
+
Requires-Dist: oracledb; extra == "dev"
|
|
129
|
+
Dynamic: license-file
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Provisa
|
|
2
|
+
|
|
3
|
+
I almost called this project *Insanity*. The surface area looked impossible — 46 kinds of data source on one side, a Babel of query languages and wire protocols on the other. Chasing all of it seemed insane.
|
|
4
|
+
|
|
5
|
+
Then the core fell out: one federation model, one intermediate representation, a thin contract for sources and another for consumers. Once those held, the surface area became tractable — and the real insanity came into focus. It isn't building this. It's trying to govern data from *outside* the data environment: a catalog here, a policy engine there, a lineage graph somewhere else, each a copy of the truth that drifts on freshness, misses on coverage, and describes access instead of enforcing it. The only sane move is to put governance on the path every query already takes.
|
|
6
|
+
|
|
7
|
+
That's Provisa. A single governed API over 46 heterogeneous data sources — query it with **GraphQL, Cypher, or SQL**, consume it over **pgwire, Bolt, gRPC, REST, Arrow Flight, or JDBC**. RLS, column masking, and query approval aren't a layer bolted on top; they *are* the path. No query reaches data without passing through governance, so coverage is total by construction, not by diligence.
|
|
8
|
+
|
|
9
|
+
Put another way, this is what a semantic layer was supposed to be. Every prior one — dbt, Cube, LookML — is *passive*: a metadata description of your data that some other engine may or may not consult. Provisa is an **active semantic layer** — the model isn't documentation the engine reads, it *is* the engine. Registered domains and relationships are the only legal join paths; governance is compiled into the plan; every request is enforced inline because no execution path goes around it. And because the same governed path serves SQL, GraphQL, and Cypher over pgwire, Bolt, Flight, JDBC, and REST, effectively all of your cross-system data movement — system-to-system, analytical, application, and human — travels through one place that both describes the data and enforces the rules on it. Describing your data and governing it become the same act.
|
|
10
|
+
|
|
11
|
+
GraphQL, Cypher, and SQL are all first-class over federated data — something no federated engine offers natively. And that's not three integrations but one. Every query language lowers to a single intermediate representation, and governance is injected there — one place, so it cannot drift between languages, and the same IR retargets to any source dialect on the way out. A new query language is a front-end onto that shared governed core, not a new engine, which is why the IR can absorb almost any query dialect. If that sounds too good to be true: some languages carry a small compromise at the edges, but every core language feature is supported — you are not writing a crippled subset. And it isn't read-only: most federation engines are. Provisa carries both analytical and transactional flows through the same governed API. Cross-source reads fan out through the federation layer; writes and single-source reads route direct to the source driver — governed the same way, but transactional and sub-100ms. Arrow Flight columnar streaming is built in, not bolted on. Distributed traces, metrics, and logs are automatically registered as queryable tables in the same schema as your business data, so observability is just another join.
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
### Query Interfaces
|
|
16
|
+
|
|
17
|
+
These are the languages and structured APIs you write queries in. Each has its own syntax and semantics; governance (RLS, masking, column visibility, relationship enforcement) applies uniformly across all of them regardless of which wire protocol delivers them.
|
|
18
|
+
|
|
19
|
+
- **GraphQL** — Per-role schemas with field-level visibility, filtering, cursor-based pagination, and aggregate queries (`count`, `sum`, `avg`, `min`, `max`). Schema-constrained to registered relationships — structurally valid by construction, the fastest path to a correct simple query. Apollo APQ included: queries are hashed and registered server-side; subsequent calls send only the hash over HTTP GET, making responses CDN-cacheable with zero client changes required. Lookup tables below a configurable row threshold are exposed as enum types.
|
|
20
|
+
- **SQL** — Full SQL over federated data; unconstrained and more expressive than GraphQL. Write standard SQL — correlated subqueries and all — and it runs across sources unchanged. Single-source queries bypass the federation layer entirely (sub-100ms).
|
|
21
|
+
- **Cypher** — Graph query language over the same federated schema. Traverse relationships as graph edges; union sources; variable-length paths. Governance applies identically to GraphQL and SQL.
|
|
22
|
+
- **gRPC model API** — Auto-generated `.proto` from the registered schema; typed query and insert RPCs per table, streamed responses. Schema-driven in the same sense as GraphQL — the registration model is the contract, protobuf is the wire encoding. Unlike Arrow Flight (which is a columnar streaming transport), this is a full per-table query interface.
|
|
23
|
+
- **JSON:API** — Structured query API at `/data/jsonapi/{table}`, HTTP-only by design. Supports JSON:API 1.1: sparse fieldsets (`fields[table]=col1,col2`), filter expressions (`filter[field][op]=value`), compound documents (`include=relation`), and sort. Not a general-purpose query language — queries one table at a time with standardized filter syntax rather than an ad-hoc query string.
|
|
24
|
+
- **Query Language Explorer** — Write a GraphQL query and see live **Semantic SQL** and **Cypher** translations in side panels; copy either or jump directly into the SQL or Graph editor. A practical workflow is to sketch query fragments in GraphQL, then stitch the resulting SQL into complex views or reports.
|
|
25
|
+
|
|
26
|
+
The Explorer shows a GraphQL query alongside its live SQL and Cypher translations:
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
The same federated schema is explorable as a live graph — domain and node labels, relationship types, and variable-length traversals:
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
### Query Composition Tools
|
|
35
|
+
|
|
36
|
+
These tools help you write queries in the above languages — they are not query languages themselves.
|
|
37
|
+
|
|
38
|
+
- **Natural language query** — NL→SQL/Cypher/GraphQL pipeline powered by Claude. Describe what you want in plain English; the pipeline produces a query in your chosen language with an interactive validation loop before execution.
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
### Wire Protocols
|
|
43
|
+
|
|
44
|
+
These are the connection protocols. SQL, GraphQL, and Cypher ride over them — the choice of wire protocol does not change the query interface or governance behaviour.
|
|
45
|
+
|
|
46
|
+
- **pgwire** — Any PostgreSQL client (psql, DBeaver, DataGrip, asyncpg, SQLAlchemy, pandas `read_sql`) connects on port 5439 as if it were a Postgres server. Accepts SQL only. Full governance pipeline applies. `pg_catalog` and `information_schema` answered from an in-memory catalog so schema browsers work without a federation round-trip. TLS optional.
|
|
47
|
+
- **Bolt (Neo4j)** — Any Neo4j client (Neo4j Browser, Bloom, official drivers) connects over the Bolt protocol and runs Cypher against the federated graph. Each role the user holds surfaces as a `provisa_<role>` database. Same governance as every other transport. TLS optional.
|
|
48
|
+
- **Arrow Flight** — High-throughput columnar streaming over gRPC; accepts GraphQL or SQL as the query input. Unbounded result sets, no server-side materialization, no separate infrastructure required.
|
|
49
|
+
- **JDBC** — BI tool integration (Tableau, Power BI, DBeaver) in `approved` or `catalog` mode.
|
|
50
|
+
- **WebSocket / SSE** — Subscriptions: near-real-time change events; backends: PG native, MongoDB native, CDC, polling. Also exposed over Kafka.
|
|
51
|
+
|
|
52
|
+
### Data Sources
|
|
53
|
+
|
|
54
|
+
- **46 source types** — PostgreSQL, MySQL, MongoDB, Cassandra, Elasticsearch, Neo4j, SPARQL triplestores, Kafka, Google Sheets, and more through a single API; graph and RDF sources are first-class, not adapters
|
|
55
|
+
- **Smart routing** — Single-source queries bypass federation (sub-100ms); multi-source queries route through the federation layer — bring your own cluster or use the embedded workers
|
|
56
|
+
- **API sources** — Register REST, GraphQL, gRPC, WebSocket, or RSS endpoints as queryable tables; SPARQL helpers included; federated joins across API sources and relational sources work transparently
|
|
57
|
+
- **Remote schema introspection** — Point at any GraphQL, OpenAPI, or gRPC endpoint; documented operations are automatically surfaced as queryable tables, graph nodes, and edges with full governance applied on top
|
|
58
|
+
- **File sources** — CSV, Parquet, and SQLite files as queryable tables; supports local paths and remote object storage (`s3://`, `ftp://`, `sftp://`)
|
|
59
|
+
- **Kafka integration** — Topics as read-only tables; query results as Kafka sinks
|
|
60
|
+
- **Scheduled triggers** — Cron and interval triggers (APScheduler) that fire webhooks, mutations, or Kafka sink publishes
|
|
61
|
+
- **Federation performance hints** — SQL-comment routing hints override automatic routing decisions
|
|
62
|
+
|
|
63
|
+

|
|
64
|
+
|
|
65
|
+
Sources, files, and remote endpoints are registered as governed tables from the UI:
|
|
66
|
+
|
|
67
|
+

|
|
68
|
+
|
|
69
|
+
### Security & Governance
|
|
70
|
+
|
|
71
|
+
- **Row-level security** — Per-table, per-role WHERE clause injection
|
|
72
|
+
- **Column masking** — Per-column masking (regex, constant, truncate) with role-based bypass
|
|
73
|
+
- **Column presets** — Server-side static or session-variable values injected on insert/update; not exposed in mutation input types
|
|
74
|
+
- **Write permissions** — Per-column mutation access control (`writable_by`)
|
|
75
|
+
- **Inherited roles** — Roles inherit RLS, visibility, and masking from a parent role recursively
|
|
76
|
+
- **Tracked functions & webhooks** — DB functions and outbound webhooks exposed as GraphQL mutations with typed return shapes
|
|
77
|
+
- **ABAC approval hook** — Pre-execution authorization hook; webhook, gRPC, or unix_socket transport; per-table, per-source, or global scope; configurable fallback policy
|
|
78
|
+
- **Pluggable auth** — Firebase, Keycloak, OAuth 2.0, simple (testing)
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
### Delivery & Performance
|
|
83
|
+
|
|
84
|
+
- **Materialized views as recorded transforms** — An MV captures the transform that produced it: its join shape or SQL, the per-source input signals (Iceberg snapshot, RDB watermark) it was built from, and a determinism check at registration. Because the transform is recorded, queries (or subexpressions) are transparently rewritten onto a fresh MV — structural join-pattern matching with partial-match support, so an MV covering a subset of joins still applies, with remaining joins preserved
|
|
85
|
+
- **Hot table inlining** — Small frequently-joined lookup tables are inlined as VALUES CTEs directly in the query plan, eliminating cross-source round trips for dimension data
|
|
86
|
+
- **Query caching** — Role+RLS-partitioned Redis result cache; APQ hash cache included
|
|
87
|
+
- **Observability as data** — Distributed traces, metrics, and logs are collected via OpenTelemetry, compacted into Iceberg on S3, and automatically registered as queryable tables (`traces`, `metrics`, `logs`, `queries`) in the federated schema; query them with SQL, GraphQL, or Cypher alongside your business data — join a `customers` table to the `queries` table to see who ran what and how long it took
|
|
88
|
+
|
|
89
|
+
### Administration & Integration
|
|
90
|
+
|
|
91
|
+
- **Admin API** — GraphQL at `/admin/graphql`; config upload/download, relationship editing, query approval
|
|
92
|
+
- **GraphQL Voyager** — Interactive role-scoped schema visualization as an entity-relationship diagram
|
|
93
|
+
- **LLM relationship discovery** — Claude-powered foreign key candidate suggestions
|
|
94
|
+
- **Python client** — `pip install provisa-client`; GraphQL/SQL → DataFrames, Arrow Flight → pyarrow Tables, SQLAlchemy dialect, ADBC support
|
|
95
|
+
- **Data ingestion** — HTTP endpoints for pushing JSON event data into the platform
|
|
96
|
+
- **Hasura v2 / DDN import** — Convert Hasura v2 metadata or DDN supergraph YAML to Provisa config
|
|
97
|
+
- **Apollo Federation** — Expose Provisa as an Apollo Federation v2 subgraph
|
|
98
|
+
|
|
99
|
+
Role-scoped schema visualized as an entity-relationship diagram (GraphQL Voyager):
|
|
100
|
+
|
|
101
|
+

|
|
102
|
+
|
|
103
|
+
Relationships are registered, approved, and enforced as the only legal JOIN paths:
|
|
104
|
+
|
|
105
|
+

|
|
106
|
+
|
|
107
|
+
## Security Model
|
|
108
|
+
|
|
109
|
+
This is where "on the path every query already takes" stops being a slogan. Provisa enforces a multi-layered security model across every query language (GraphQL, SQL, Cypher) and every transport (REST, gRPC, Arrow Flight, JDBC, pgwire, Bolt, WebSocket). Governance is applied uniformly — there is no query path that bypasses it. Coverage is total by construction, not by diligence: add a source, column, or relationship and every layer applies to it automatically, with nothing to remember to register.
|
|
110
|
+
|
|
111
|
+
The layers apply in order. A request must clear each layer before the next is evaluated.
|
|
112
|
+
|
|
113
|
+
### Layer 0 — Introspection filtering
|
|
114
|
+
|
|
115
|
+
The schema and catalog presented to a role contain only the tables in its `domain_access` list and the columns that pass per-column `visible_to` rules. Objects outside a role's access are invisible at discovery time — they cannot be queried, autocompleted, or inferred to exist. This applies to the GraphQL schema, SQL catalog, and the query editor's schema browser.
|
|
116
|
+
|
|
117
|
+
### Layer 1 — Public access
|
|
118
|
+
|
|
119
|
+
Tables in domains with no `domain_access` restriction are visible to all authenticated identities with no additional configuration. Zero friction for genuinely public data.
|
|
120
|
+
|
|
121
|
+
### Layer 2 — Domain access
|
|
122
|
+
|
|
123
|
+
Each role carries a `domain_access` list of domain IDs. A query that touches a table outside those domains is rejected before execution. This is the coarse ownership boundary — an HR role cannot reach finance tables regardless of how the SQL is written.
|
|
124
|
+
|
|
125
|
+
### Layer 3 — Row-level security
|
|
126
|
+
|
|
127
|
+
After domain access is confirmed, per-table, per-role `WHERE` predicates are injected into every `SELECT` at execution time. The predicates evaluate against raw data. A regional manager querying a shared orders table sees only their region's rows even on a `SELECT *`.
|
|
128
|
+
|
|
129
|
+
### Layer 4 — Column visibility and masking
|
|
130
|
+
|
|
131
|
+
Columns with a `visible_to` list that excludes the requesting role are stripped from query output. Columns with a masking rule have their values replaced — regex redaction, constant replacement, or truncation — before results leave the server. Masking applies in all query languages and output formats.
|
|
132
|
+
|
|
133
|
+
### Layer 5 — Predicate guard
|
|
134
|
+
|
|
135
|
+
Masked columns are rejected from `WHERE` and `HAVING` clauses. Without this, a caller could infer the unmasked value by binary-searching it in a filter even though the output is masked. Rejection is enforced at query parse time, before execution.
|
|
136
|
+
|
|
137
|
+
### Relationship governance
|
|
138
|
+
|
|
139
|
+
JOIN conditions in SQL must match a registered, approved relationship between tables. Unapproved joins are rejected. Each relationship carries a human-readable reason and description — guidance for both users and autonomous agents about why a traversal path exists. This is governance policy, not a hard security boundary: Layers 2–5 hold regardless of join structure, so a deliberate circumvention does not expose data the role could not reach through two separate queries. Circumvention attempts are logged and auditable.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
These layers compose. A role with domain access, RLS, and masked columns has all five constraints active simultaneously. Adding a new data source, column, or relationship does not require updating every rule — each layer is configured independently and applies automatically to any query that touches governed objects.
|
|
144
|
+
|
|
145
|
+
### macOS
|
|
146
|
+
1. Download the DMG from the [releases page](https://github.com/kenstott/provisa/releases/latest)
|
|
147
|
+
2. Drag **Provisa.app** to `/Applications` and double-click to launch
|
|
148
|
+
3. First launch completes a one-time setup (~2 min, no internet required)
|
|
149
|
+
4. Open Terminal:
|
|
150
|
+
```bash
|
|
151
|
+
provisa start # start all services
|
|
152
|
+
provisa open # open the UI in your browser
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Linux
|
|
156
|
+
1. Download `Provisa-<version>-linux-x86_64.AppImage` from the [releases page](https://github.com/kenstott/provisa/releases/latest)
|
|
157
|
+
2. Make it executable and run it — first launch completes a one-time setup (no internet required):
|
|
158
|
+
```bash
|
|
159
|
+
chmod +x Provisa-*-linux-x86_64.AppImage
|
|
160
|
+
./Provisa-*-linux-x86_64.AppImage
|
|
161
|
+
provisa start && provisa open
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Windows
|
|
165
|
+
1. Download `Provisa-<version>-windows-x64.exe` from the [releases page](https://github.com/kenstott/provisa/releases/latest)
|
|
166
|
+
2. Run the installer — no admin rights required
|
|
167
|
+
3. Open **Provisa First Launch** from the Start Menu — completes a one-time setup (~5 min, no internet required)
|
|
168
|
+
4. Open a new terminal:
|
|
169
|
+
```
|
|
170
|
+
provisa start
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### First Query
|
|
174
|
+
|
|
175
|
+
In local development (`PROVISA_MODE=test`), no credentials are required. In production, authenticate with a Bearer token — the role is extracted from it automatically.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Local dev — no auth required, role defaults to admin
|
|
179
|
+
curl -X POST http://localhost:8001/data/graphql \
|
|
180
|
+
-H "Content-Type: application/json" \
|
|
181
|
+
-d '{"query": "{ orders { id amount region } }"}'
|
|
182
|
+
|
|
183
|
+
# Ad-hoc SQL works the same way
|
|
184
|
+
curl -X POST http://localhost:8001/data/graphql \
|
|
185
|
+
-H "Content-Type: application/json" \
|
|
186
|
+
-d '{"query": "SELECT id, amount, region FROM orders"}'
|
|
187
|
+
|
|
188
|
+
# Production — authenticate with a Bearer token; role is derived from the token
|
|
189
|
+
curl -X POST https://provisa.example.com/data/graphql \
|
|
190
|
+
-H "Authorization: Bearer <token>" \
|
|
191
|
+
-H "Content-Type: application/json" \
|
|
192
|
+
-d '{"query": "{ orders { id amount region } }"}'
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### JDBC (Tableau, DBeaver, Power BI)
|
|
196
|
+
|
|
197
|
+
Download `provisa-jdbc-<version>.jar` from the [releases page](https://github.com/kenstott/provisa/releases/latest) and add it to your BI tool's driver path.
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
jdbc:provisa://localhost:8815
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Authenticate with your Provisa username and password — the server assigns your role.
|
|
204
|
+
|
|
205
|
+
- **`catalog` mode** — full schema visible; use with catalog tools (Collibra, Atlan, DBeaver)
|
|
206
|
+
|
|
207
|
+
See [docs/integrations.md](docs/integrations.md) for Tableau and Power BI setup steps.
|
|
208
|
+
|
|
209
|
+
### PostgreSQL Wire Protocol (pgwire)
|
|
210
|
+
|
|
211
|
+
Provisa speaks the PostgreSQL wire protocol on port 5439. Any client that can connect to Postgres connects to Provisa — no driver, no adapter, no changes to existing tooling.
|
|
212
|
+
|
|
213
|
+
**The PostgreSQL username selects the Provisa role.** With `provider: none` (trust mode), the password is ignored and any configured role name is accepted as the username — connect as `analyst`, `admin`, or any role to see that role's governed view of the data. With `provider: simple`, the password is bcrypt-validated. Other providers (`firebase`, `keycloak`, `oauth`) are not supported over pgwire.
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# psql — connect as analyst role
|
|
217
|
+
psql -h localhost -p 5439 -U analyst
|
|
218
|
+
|
|
219
|
+
# psql — connect as admin role
|
|
220
|
+
psql -h localhost -p 5439 -U admin
|
|
221
|
+
|
|
222
|
+
# asyncpg (Python) — role = username, password ignored in trust mode
|
|
223
|
+
conn = await asyncpg.connect(host="localhost", port=5439, user="analyst", password="x")
|
|
224
|
+
rows = await conn.fetch("SELECT id, amount FROM orders WHERE region = 'west'")
|
|
225
|
+
|
|
226
|
+
# SQLAlchemy
|
|
227
|
+
engine = create_engine("postgresql+psycopg2://analyst:x@localhost:5439/provisa")
|
|
228
|
+
|
|
229
|
+
# pandas
|
|
230
|
+
df = pd.read_sql("SELECT * FROM orders", engine)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
All queries run through the full governance pipeline — domain access, RLS, masking, and predicate guard apply exactly as they do for GraphQL and REST. Schema browsers (DBeaver, DataGrip, pgAdmin) work out of the box: `pg_catalog` and `information_schema` queries are answered from an in-memory catalog scoped to the role's domain access, so users see only the tables and columns they are permitted to query.
|
|
234
|
+
|
|
235
|
+
DataGrip browsing the governed schema and its foreign-key diagram over pgwire — no driver, no adapter:
|
|
236
|
+
|
|
237
|
+

|
|
238
|
+
|
|
239
|
+
TLS is enabled by setting `PROVISA_PGWIRE_CERT` and `PROVISA_PGWIRE_KEY`. The port is configurable via `PROVISA_PGWIRE_PORT` (default `5439`).
|
|
240
|
+
|
|
241
|
+
### Bolt (Neo4j Wire Protocol)
|
|
242
|
+
|
|
243
|
+
Provisa also speaks the Neo4j **Bolt** protocol, so graph-native tools connect directly and run Cypher against the federated graph — no export, no separate graph database. Point **Neo4j Browser** or **Bloom** at Provisa and traverse relationships across sources with the same governance (domain access, RLS, masking) applied.
|
|
244
|
+
|
|
245
|
+
Neo4j Browser running Cypher against Provisa — node labels, relationship types, and property keys come straight from the registered schema:
|
|
246
|
+
|
|
247
|
+

|
|
248
|
+
|
|
249
|
+
Enable it by setting `PROVISA_BOLT_PORT` (Neo4j's default is `7687`). TLS is enabled with `PROVISA_BOLT_CERT` and `PROVISA_BOLT_KEY`. Each Provisa role the authenticated user holds surfaces as a selectable `provisa_<role>` database (the `provisa_admin` selector above) — choosing one narrows the session to that role's domain rights; the user can never exceed the roles they hold.
|
|
250
|
+
|
|
251
|
+
### Python Client
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
pip install provisa-client # core
|
|
255
|
+
pip install "provisa-client[pandas]" # + DataFrame support
|
|
256
|
+
pip install "provisa-client[sqlalchemy]" # + SQLAlchemy dialect
|
|
257
|
+
pip install "provisa-client[adbc]" # + ADBC over Arrow Flight
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
from provisa_client import ProvisaClient, connect
|
|
262
|
+
|
|
263
|
+
# GraphQL → DataFrame
|
|
264
|
+
client = ProvisaClient("http://localhost:8001", username="alice", password="secret")
|
|
265
|
+
df = client.query_df("{ orders { id amount region } }")
|
|
266
|
+
|
|
267
|
+
# SQL → DataFrame
|
|
268
|
+
df = client.query_df("SELECT id, amount, region FROM orders WHERE region = 'west'")
|
|
269
|
+
|
|
270
|
+
# Arrow Flight → pyarrow Table (high-throughput columnar)
|
|
271
|
+
table = client.flight("{ orders { id amount region } }")
|
|
272
|
+
|
|
273
|
+
# DB-API 2.0 (PEP 249) — GraphQL or SQL, detected automatically
|
|
274
|
+
with connect("http://localhost:8001", username="alice", password="secret") as conn:
|
|
275
|
+
cur = conn.cursor()
|
|
276
|
+
|
|
277
|
+
# GraphQL
|
|
278
|
+
cur.execute("{ orders { id amount region } }")
|
|
279
|
+
rows = cur.fetchall()
|
|
280
|
+
|
|
281
|
+
# SQL (routed through governance engine — RLS and masking applied)
|
|
282
|
+
cur.execute("SELECT id, amount FROM orders WHERE region = %s", ("west",))
|
|
283
|
+
rows = cur.fetchall()
|
|
284
|
+
|
|
285
|
+
# SQLAlchemy dialect — provisa+http:// or provisa+https://
|
|
286
|
+
from sqlalchemy import create_engine, text
|
|
287
|
+
import pandas as pd
|
|
288
|
+
|
|
289
|
+
engine = create_engine("provisa+http://alice:secret@localhost:8001")
|
|
290
|
+
|
|
291
|
+
# pandas read_sql — GraphQL or SQL
|
|
292
|
+
df = pd.read_sql("{ orders { id amount region } }", engine)
|
|
293
|
+
df = pd.read_sql("SELECT id, amount, region FROM orders WHERE region = 'west'", engine)
|
|
294
|
+
|
|
295
|
+
# raw execute
|
|
296
|
+
with engine.connect() as conn:
|
|
297
|
+
rows = conn.execute(text("SELECT id, amount FROM orders")).fetchall()
|
|
298
|
+
|
|
299
|
+
# role + mode URL parameters (mode=catalog for arbitrary SQL)
|
|
300
|
+
engine = create_engine(
|
|
301
|
+
"provisa+http://alice:secret@localhost:8001?role=analyst&mode=catalog"
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
# ADBC — Arrow-native streaming via Flight
|
|
305
|
+
from provisa_client.adbc import adbc_connect
|
|
306
|
+
with adbc_connect("http://localhost:8001", user="alice", password="secret") as conn:
|
|
307
|
+
with conn.cursor() as cur:
|
|
308
|
+
cur.execute("{ orders { id amount } }")
|
|
309
|
+
table = cur.fetch_arrow_table()
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
See [docs/python-client.md](docs/python-client.md) for full reference.
|
|
313
|
+
|
|
314
|
+
## Documentation
|
|
315
|
+
|
|
316
|
+
| Topic | Doc |
|
|
317
|
+
|-------|-----|
|
|
318
|
+
| Developer quick start (running from source) | [docs/quickstart.md](docs/quickstart.md) |
|
|
319
|
+
| Full YAML configuration reference | [docs/configuration.md](docs/configuration.md) |
|
|
320
|
+
| Endpoint reference (GraphQL, REST, Flight, gRPC) | [docs/api-reference.md](docs/api-reference.md) |
|
|
321
|
+
| System design and component map | [docs/architecture.md](docs/architecture.md) |
|
|
322
|
+
| Security model (RLS, masking, auth) | [docs/security.md](docs/security.md) |
|
|
323
|
+
| Supported source types | [docs/sources.md](docs/sources.md) |
|
|
324
|
+
| SSE subscriptions | [docs/subscriptions.md](docs/subscriptions.md) |
|
|
325
|
+
| JDBC, BI tools, Arrow Flight clients, Apollo Federation | [docs/integrations.md](docs/integrations.md) |
|
|
326
|
+
| Python client (`provisa-client`) | [docs/python-client.md](docs/python-client.md) |
|
|
327
|
+
| Admin API | [docs/admin.md](docs/admin.md) |
|
|
328
|
+
| Deployment (Docker Compose, Kubernetes, macOS) | [docs/deployment.md](docs/deployment.md) |
|
|
329
|
+
| Hasura v2 / DDN import | [docs/import.md](docs/import.md) |
|
|
330
|
+
| Release workflow (alpha/beta/stable tags) | [docs/releasing.md](docs/releasing.md) |
|
|
331
|
+
|
|
332
|
+
## Sizing
|
|
333
|
+
|
|
334
|
+
Provisa includes a built-in federation engine for multi-source queries. At first launch you choose a RAM budget; Provisa derives the number of local federation workers automatically.
|
|
335
|
+
|
|
336
|
+
| Host RAM | Workers | Typical workload |
|
|
337
|
+
|----------|---------|-----------------|
|
|
338
|
+
| < 24 GB | 0 | Development, single-source queries, small teams |
|
|
339
|
+
| 24–47 GB | 1 | Small team, moderate cross-source queries |
|
|
340
|
+
| 48–95 GB | 2 | Departmental deployment, mixed BI + notebook usage |
|
|
341
|
+
| 96 GB+ | 4 | Large department, heavy concurrent federation |
|
|
342
|
+
|
|
343
|
+
Worker count can be changed at any time by editing `~/.provisa/config.yaml` (`federation_workers: N`) and running `provisa restart`. Set to `0` to run coordination-only (single-node).
|
|
344
|
+
|
|
345
|
+
### Scaling beyond a single box
|
|
346
|
+
|
|
347
|
+
**Horizontal scale-out** — Run multiple Provisa instances behind a load balancer. Each instance is a fully functioning system. All instances must point at the same config DB (set `CONFIG_DB_HOST` on secondary boxes) and optionally a shared Redis instance (`REDIS_URL`) for a unified cache. Most queries distribute transparently; very large cross-source joins may exceed the resources of a single instance and require a larger box or an external federation cluster.
|
|
348
|
+
|
|
349
|
+
**Shared Redis** — Set `REDIS_URL` on each instance to point at an external Redis. Shared Redis means cache entries from one instance are available to all, improving hit rates across the cluster.
|
|
350
|
+
|
|
351
|
+
**Bring your own federation cluster** — Point Provisa at an existing external federation cluster instead of the embedded workers. Recommended for large-scale or cloud deployments; see [docs/deployment.md](docs/deployment.md) for configuration.
|
|
352
|
+
|
|
353
|
+
## License
|
|
354
|
+
|
|
355
|
+
Business Source License 1.1 (unmodified, per MariaDB's Licensor covenants). Each
|
|
356
|
+
released version converts to the Change License (GPL v2.0 or later) on the 4th
|
|
357
|
+
anniversary of its public release; current and recent code stays under BSL.
|
|
358
|
+
Production use above the Additional Use Grant thresholds (fewer than 100
|
|
359
|
+
employees/contractors and under $1M prior-year revenue) requires a commercial
|
|
360
|
+
license. See [LICENSE](LICENSE).
|
|
361
|
+
|
|
362
|
+
The Licensor does not consent to use of this work for AI/ML training. See
|
|
363
|
+
[NOTICE](NOTICE), [ai.txt](ai.txt), and [robots.txt](robots.txt). For commercial
|
|
364
|
+
or AI-training licenses: kennethstott@gmail.com
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Copyright (c) 2026 Kenneth Stott
|
|
2
|
+
# Canary: 10926cca-c492-48cf-889a-d55181674ef3
|
|
3
|
+
#
|
|
4
|
+
# This source code is licensed under the Business Source License 1.1
|
|
5
|
+
# found in the LICENSE file in the root directory of this source tree.
|
|
6
|
+
#
|
|
7
|
+
# NOTICE: Use of this software for training artificial intelligence or
|
|
8
|
+
# machine learning models is strictly prohibited without explicit written
|
|
9
|
+
# permission from the copyright holder.
|