From b74c9fe0e7a0ab6ee16706ef1c7123bfc5700dba Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 16 Aug 2026 04:05:41 +0000 Subject: [PATCH 1/4] sync: port the machine, repository and image module tables from constructive-db constructive-db vendors these modules under pgpm-modules/ and edits them in place, so the two trees drift until someone ports the changes back (last done in #119). Two modules had drift: types and metaschema-modules. types gains upload_ids(upload[]) -> text[], the one indexable expression for a column holding many uploads: a scalar upload column answers "which file is this?" with (value ->> 'id') and a btree expression index serves it, an array cannot, so storage garbage collection and the files-to-document sync trigger both key off this function and file_ref_field emits a GIN index over it. IMMUTABLE (index expressions must be) and it drops elements with no id, since an upload naming only a url is not a reference to a files row. metaschema-modules gains three module tables the platform now provisions -- image_module (central container image catalog), repository_module (repositories, events, workflows, builds, partitioned build_steps, local change requests) and machine_module (enrolled machines, sessions, append-only command ledger) -- plus internal_config_module and k8s_admission_module, and the @module_table provenance comments and agent/catalog/resource/route column additions that landed on constructive-db main since #119. config_secrets_user_module exists only upstream and is kept; jwt-claims, metaschema-schema and object-store still carry unported drift, out of scope here. sql/ artifacts regenerated with pgpm package; metaschema-modules snapshots re-recorded against the ported deploy tree. A publish needs a version bump -- 0.41.0 is already released and these changes add objects to it. --- .../__snapshots__/modules.test.ts.snap | 13 +- .../tables/agent_module/table.sql | 37 + .../tables/api_surface_module/table.sql | 9 + .../tables/app_module/table.sql | 7 + .../tables/billing_module/table.sql | 12 + .../tables/billing_provider_module/table.sql | 12 + .../tables/capabilities_module/table.sql | 7 + .../tables/catalog_module/table.sql | 30 +- .../tables/compute_log_module/table.sql | 7 + .../connected_accounts_module/table.sql | 6 + .../tables/content_preset_module/table.sql | 6 + .../tables/crypto_addresses_module/table.sql | 6 + .../tables/database_settings_module/table.sql | 9 + .../tables/db_preset_module/table.sql | 6 + .../tables/db_usage_module/table.sql | 9 + .../tables/devices_module/table.sql | 7 + .../tables/domain_module/table.sql | 9 + .../tables/email_sender_module/table.sql | 8 + .../tables/emails_module/table.sql | 6 + .../tables/events_module/table.sql | 12 + .../function_deployment_module/table.sql | 7 + .../function_invocation_module/table.sql | 8 + .../constraints/one_platform_database.sql | 2 +- .../tables/function_module/table.sql | 9 + .../tables/graph_execution_module/table.sql | 8 + .../tables/graph_module/table.sql | 6 + .../tables/hierarchy_module/table.sql | 8 + .../tables/http_route_module/table.sql | 6 + .../tables/i18n_module/table.sql | 6 + .../identity_providers_module/table.sql | 6 + .../tables/image_module/table.sql | 79 ++ .../tables/inference_log_module/table.sql | 7 + .../tables/infra_config_module/table.sql | 6 + .../tables/infra_secrets_module/table.sql | 6 + .../integration_providers_module/table.sql | 6 + .../tables/internal_config_module/table.sql | 75 ++ .../tables/internal_secrets_module/table.sql | 6 + .../tables/invites_module/table.sql | 7 + .../tables/k8s_admission_module/table.sql | 56 ++ .../tables/limits_module/table.sql | 17 + .../tables/machine_module/table.sql | 92 ++ .../tables/membership_types_module/table.sql | 6 + .../tables/memberships_module/table.sql | 19 + .../tables/merkle_store_module/table.sql | 16 + .../tables/namespace_module/table.sql | 7 + .../tables/notifications_module/table.sql | 11 + .../tables/oauth_requests_module/table.sql | 7 + .../tables/pages_module/table.sql | 6 + .../tables/phone_numbers_module/table.sql | 6 + .../tables/plans_module/table.sql | 11 + .../tables/principal_auth_module/table.sql | 8 + .../tables/profiles_module/table.sql | 11 + .../tables/rate_limit_meters_module/table.sql | 8 + .../tables/rate_limits_module/table.sql | 8 + .../tables/realtime_module/table.sql | 8 + .../tables/repository_module/table.sql | 121 +++ .../tables/resource_module/table.sql | 20 + .../tables/route_module/table.sql | 16 + .../tables/scope_types_module/table.sql | 6 + .../tables/session_secrets_module/table.sql | 6 + .../tables/sessions_module/table.sql | 6 + .../tables/site_surface_module/table.sql | 13 + .../tables/storage_log_module/table.sql | 7 + .../tables/storage_module/table.sql | 16 +- .../tables/transfer_log_module/table.sql | 7 + .../tables/user_auth_module/table.sql | 6 + .../tables/user_credentials_module/table.sql | 6 + .../tables/user_settings_module/table.sql | 6 + .../user_settings_security_module/table.sql | 6 + .../tables/user_state_module/table.sql | 6 + .../tables/users_module/table.sql | 7 + .../webauthn_credentials_module/table.sql | 6 + .../tables/webhook_module/table.sql | 7 + packages/metaschema-modules/pgpm.plan | 7 +- .../tables/image_module/table.sql | 7 + .../tables/internal_config_module/table.sql | 7 + .../tables/k8s_admission_module/table.sql | 7 + .../tables/machine_module/table.sql | 7 + .../tables/repository_module/table.sql | 7 + .../metaschema-modules--0.41.0.bundle.tar.gz | Bin 87600 -> 97182 bytes .../sql/metaschema-modules--0.41.0.sql | 866 +++++++++++++++++- .../tables/catalog_module/table.sql | 3 +- .../tables/image_module/table.sql | 8 + .../tables/internal_config_module/table.sql | 9 + .../tables/k8s_admission_module/table.sql | 9 + .../tables/machine_module/table.sql | 10 + .../tables/repository_module/table.sql | 14 + .../tables/route_module/table.sql | 3 +- packages/types/__tests__/upload-ids.test.ts | 85 ++ .../schemas/public/procedures/upload_ids.sql | 33 + packages/types/pgpm.plan | 1 + .../schemas/public/procedures/upload_ids.sql | 7 + .../sql/pgpm-types--0.41.0.bundle.tar.gz | Bin 4487 -> 5748 bytes packages/types/sql/pgpm-types--0.41.0.sql | 15 +- .../schemas/public/procedures/upload_ids.sql | 31 + 95 files changed, 2163 insertions(+), 14 deletions(-) create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/image_module/table.sql create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_config_module/table.sql create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/machine_module/table.sql create mode 100644 packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/image_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/internal_config_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/machine_module/table.sql create mode 100644 packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/repository_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/image_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/internal_config_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/machine_module/table.sql create mode 100644 packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/repository_module/table.sql create mode 100644 packages/types/__tests__/upload-ids.test.ts create mode 100644 packages/types/deploy/schemas/public/procedures/upload_ids.sql create mode 100644 packages/types/revert/schemas/public/procedures/upload_ids.sql create mode 100644 packages/types/verify/schemas/public/procedures/upload_ids.sql diff --git a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap index 0d7567e1c..49d0cbce4 100644 --- a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap +++ b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap @@ -34,13 +34,17 @@ exports[`db_meta_modules should have all expected module tables 1`] = ` "http_route_module", "i18n_module", "identity_providers_module", + "image_module", "inference_log_module", "infra_config_module", "infra_secrets_module", "integration_providers_module", + "internal_config_module", "internal_secrets_module", "invites_module", + "k8s_admission_module", "limits_module", + "machine_module", "membership_types_module", "memberships_module", "merkle_store_module", @@ -55,6 +59,7 @@ exports[`db_meta_modules should have all expected module tables 1`] = ` "rate_limit_meters_module", "rate_limits_module", "realtime_module", + "repository_module", "resource_module", "rls_module", "route_module", @@ -80,8 +85,8 @@ exports[`db_meta_modules should have all expected module tables 1`] = ` exports[`db_meta_modules should verify all module tables exist in metaschema_modules_public schema 1`] = ` { - "moduleTablesCount": 71, - "totalTables": 80, + "moduleTablesCount": 76, + "totalTables": 85, } `; @@ -148,13 +153,13 @@ exports[`db_meta_modules should verify emails_module table structure 1`] = ` exports[`db_meta_modules should verify module table structures have database_id foreign keys 1`] = ` { - "constraintCount": 71, + "constraintCount": 76, } `; exports[`db_meta_modules should verify module tables have proper foreign key relationships 1`] = ` { - "constraintCount": 505, + "constraintCount": 549, "foreignTables": [ "catalog_module", "database", diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql index d6c81128d..3d90f056f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql @@ -30,6 +30,9 @@ CREATE TABLE metaschema_modules_public.agent_module ( agent_table_id uuid DEFAULT NULL, persona_table_id uuid DEFAULT NULL, resource_table_id uuid DEFAULT NULL, + run_table_id uuid DEFAULT NULL, + event_table_id uuid DEFAULT NULL, + workspace_table_id uuid DEFAULT NULL, -- Table names (input to the generator) thread_table_name text NOT NULL DEFAULT 'agent_thread', @@ -40,11 +43,23 @@ CREATE TABLE metaschema_modules_public.agent_module ( agent_table_name text NOT NULL DEFAULT 'agent', persona_table_name text NOT NULL DEFAULT 'agent_persona', resource_table_name text NOT NULL DEFAULT 'agent_resource', + run_table_name text NOT NULL DEFAULT 'agent_run', + event_table_name text NOT NULL DEFAULT 'agent_event', + workspace_table_name text NOT NULL DEFAULT 'agent_run_workspace', -- Feature flags has_plans boolean NOT NULL DEFAULT false, has_resources boolean NOT NULL DEFAULT false, has_agents boolean NOT NULL DEFAULT false, + -- The coding-agent execution surface: runs and their append-only transcripts. + -- Off by default, so a conversation-only install provisions exactly what it did + -- before this flag existed. + has_runs boolean NOT NULL DEFAULT false, + -- Files carried by a message: an upload[] column on the message table, managed + -- by the storage module installed at this same scope. Off by default because + -- turning it on *requires* that storage module — an attachment with nowhere to + -- live fails provisioning rather than accepting a file it cannot store. + has_attachments boolean NOT NULL DEFAULT false, shared boolean NOT NULL DEFAULT false, -- API routing (configurable per-module) @@ -92,6 +107,9 @@ CREATE TABLE metaschema_modules_public.agent_module ( CONSTRAINT agent_module_agent_table_fkey FOREIGN KEY (agent_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT agent_module_persona_table_fkey FOREIGN KEY (persona_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT agent_module_resource_table_fkey FOREIGN KEY (resource_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT agent_module_run_table_fkey FOREIGN KEY (run_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT agent_module_event_table_fkey FOREIGN KEY (event_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT agent_module_workspace_table_fkey FOREIGN KEY (workspace_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT agent_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); @@ -104,9 +122,28 @@ CREATE INDEX agent_module_persona_table_id_idx ON metaschema_modules_public.agen CREATE INDEX agent_module_plan_table_id_idx ON metaschema_modules_public.agent_module ( plan_table_id ); CREATE INDEX agent_module_prompts_table_id_idx ON metaschema_modules_public.agent_module ( prompts_table_id ); CREATE INDEX agent_module_resource_table_id_idx ON metaschema_modules_public.agent_module ( resource_table_id ); +CREATE INDEX agent_module_run_table_id_idx ON metaschema_modules_public.agent_module ( run_table_id ); +CREATE INDEX agent_module_event_table_id_idx ON metaschema_modules_public.agent_module ( event_table_id ); +CREATE INDEX agent_module_workspace_table_id_idx ON metaschema_modules_public.agent_module ( workspace_table_id ); CREATE INDEX agent_module_task_table_id_idx ON metaschema_modules_public.agent_module ( task_table_id ); CREATE INDEX agent_module_thread_table_id_idx ON metaschema_modules_public.agent_module ( thread_table_id ); CREATE INDEX agent_module_private_schema_id_idx ON metaschema_modules_public.agent_module ( private_schema_id ); CREATE INDEX agent_module_schema_id_idx ON metaschema_modules_public.agent_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.agent_module.agent_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.message_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.persona_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.plan_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.prompts_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.resource_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.task_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.thread_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.run_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.event_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.agent_module.workspace_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql index 76ec941e1..4d87bb258 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/api_surface_module/table.sql @@ -102,4 +102,13 @@ CREATE INDEX api_surface_module_entity_table_id_idx ON metaschema_modules_public CREATE INDEX api_surface_module_schema_id_idx ON metaschema_modules_public.api_surface_module ( schema_id ); CREATE INDEX api_surface_module_catalog_module_id_idx ON metaschema_modules_public.api_surface_module ( catalog_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.api_schemas_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.api_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.apis_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.cors_settings_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql index 3c57a1e06..6f5b8ef4b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/app_module/table.sql @@ -95,4 +95,11 @@ CREATE INDEX app_module_private_schema_id_idx ON metaschema_modules_public.app_m CREATE INDEX app_module_schema_id_idx ON metaschema_modules_public.app_module ( schema_id ); CREATE INDEX app_module_catalog_module_id_idx ON metaschema_modules_public.app_module ( catalog_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.app_module.app_components_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.app_module.apps_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql index a28278e9d..e42fae3a9 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_module/table.sql @@ -87,4 +87,16 @@ CREATE INDEX billing_module_plan_subscriptions_table_id_idx ON metaschema_module CREATE INDEX billing_module_private_schema_id_idx ON metaschema_modules_public.billing_module ( private_schema_id ); CREATE INDEX billing_module_schema_id_idx ON metaschema_modules_public.billing_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.billing_module.balances_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.ledger_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_credits_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_defaults_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_sources_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.meters_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_module.plan_subscriptions_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql index 8784d1f92..68558e4f6 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/billing_provider_module/table.sql @@ -87,4 +87,16 @@ CREATE INDEX billing_provider_module_subscriptions_table_id_idx ON metaschema_mo CREATE INDEX billing_provider_module_private_schema_id_idx ON metaschema_modules_public.billing_provider_module ( private_schema_id ); CREATE INDEX billing_provider_module_schema_id_idx ON metaschema_modules_public.billing_provider_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_customers_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_invoices_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_prices_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_products_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_refunds_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_subscriptions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_webhook_events_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/capabilities_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/capabilities_module/table.sql index 496b3889e..f307c0b41 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/capabilities_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/capabilities_module/table.sql @@ -94,4 +94,11 @@ CREATE INDEX capabilities_module_table_id_idx ON metaschema_modules_public.capab CREATE INDEX capabilities_module_private_schema_id_idx ON metaschema_modules_public.capabilities_module ( private_schema_id ); CREATE INDEX capabilities_module_schema_id_idx ON metaschema_modules_public.capabilities_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.capabilities_module.default_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.capabilities_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql index bd811a26d..812f45167 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/catalog_module/table.sql @@ -7,7 +7,7 @@ BEGIN; -- Typed catalog module configuration: one row per database installs the typed -- catalog tables (catalog_private.domains / apis / sites / namespaces / -- functions / resources / resource_definitions / resource_installations / --- apps / buckets / bindings). The catalog is +-- apps / buckets / redirects / bindings). The catalog is -- a system projection surface holding ALL scopes of each type; scoped source -- tables register into it via catalog_register. The stable schema-qualified -- table names are load-bearing deployment contracts. @@ -37,6 +37,7 @@ CREATE TABLE metaschema_modules_public.catalog_module ( sites_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), sites_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), sites_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + redirects_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (inputs to the generator; stable load-bearing contracts) domains_table_name text NOT NULL DEFAULT 'domains', @@ -54,6 +55,7 @@ CREATE TABLE metaschema_modules_public.catalog_module ( sites_error_pages_table_name text NOT NULL DEFAULT 'sites_error_pages', sites_app_links_table_name text NOT NULL DEFAULT 'sites_app_links', sites_deep_links_table_name text NOT NULL DEFAULT 'sites_deep_links', + redirects_table_name text NOT NULL DEFAULT 'redirects', -- API routing (get-or-create: if set, schema is added to this API) api_name text, @@ -143,6 +145,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( FOREIGN KEY (sites_deep_links_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT catalog_module_redirects_table_fkey + FOREIGN KEY (redirects_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT catalog_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) @@ -161,6 +167,7 @@ CREATE INDEX catalog_module_sites_web_config_table_id_idx ON metaschema_modules_ CREATE INDEX catalog_module_sites_error_pages_table_id_idx ON metaschema_modules_public.catalog_module ( sites_error_pages_table_id ); CREATE INDEX catalog_module_sites_app_links_table_id_idx ON metaschema_modules_public.catalog_module ( sites_app_links_table_id ); CREATE INDEX catalog_module_sites_deep_links_table_id_idx ON metaschema_modules_public.catalog_module ( sites_deep_links_table_id ); +CREATE INDEX catalog_module_redirects_table_id_idx ON metaschema_modules_public.catalog_module ( redirects_table_id ); CREATE INDEX catalog_module_domains_table_id_idx ON metaschema_modules_public.catalog_module ( domains_table_id ); CREATE INDEX catalog_module_entity_table_id_idx ON metaschema_modules_public.catalog_module ( entity_table_id ); CREATE INDEX catalog_module_functions_table_id_idx ON metaschema_modules_public.catalog_module ( functions_table_id ); @@ -171,4 +178,25 @@ CREATE INDEX catalog_module_resources_table_id_idx ON metaschema_modules_public. CREATE INDEX catalog_module_sites_table_id_idx ON metaschema_modules_public.catalog_module ( sites_table_id ); CREATE INDEX catalog_module_schema_id_idx ON metaschema_modules_public.catalog_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.catalog_module.apis_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.apps_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.buckets_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.domains_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.functions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.namespaces_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resource_definitions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resource_installations_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.redirects_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resources_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_app_links_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_deep_links_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_error_pages_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_web_config_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql index 7b6d3d5b8..d246641e7 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/compute_log_module/table.sql @@ -58,4 +58,11 @@ CREATE INDEX compute_log_module_usage_summary_table_id_idx ON metaschema_modules CREATE INDEX compute_log_module_private_schema_id_idx ON metaschema_modules_public.compute_log_module ( private_schema_id ); CREATE INDEX compute_log_module_schema_id_idx ON metaschema_modules_public.compute_log_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.compute_log_module.compute_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.compute_log_module.usage_summary_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql index 69b7f653f..953a9a70e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/connected_accounts_module/table.sql @@ -34,4 +34,10 @@ CREATE INDEX connected_accounts_module_table_id_idx ON metaschema_modules_public CREATE INDEX connected_accounts_module_private_schema_id_idx ON metaschema_modules_public.connected_accounts_module ( private_schema_id ); CREATE INDEX connected_accounts_module_schema_id_idx ON metaschema_modules_public.connected_accounts_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.connected_accounts_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/content_preset_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/content_preset_module/table.sql index 247b8c70d..676cf461c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/content_preset_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/content_preset_module/table.sql @@ -41,4 +41,10 @@ CREATE INDEX content_preset_module_private_schema_id_idx ON metaschema_modules_p CREATE INDEX content_preset_module_public_schema_id_idx ON metaschema_modules_public.content_preset_module ( public_schema_id ); CREATE INDEX content_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.content_preset_module ( merkle_store_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.content_preset_module.content_presets_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql index e6a7bc5c8..d363e9c0b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/crypto_addresses_module/table.sql @@ -35,4 +35,10 @@ CREATE INDEX crypto_addresses_module_table_id_idx ON metaschema_modules_public.c CREATE INDEX crypto_addresses_module_private_schema_id_idx ON metaschema_modules_public.crypto_addresses_module ( private_schema_id ); CREATE INDEX crypto_addresses_module_schema_id_idx ON metaschema_modules_public.crypto_addresses_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.crypto_addresses_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql index e22caa512..a1002289d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/database_settings_module/table.sql @@ -91,4 +91,13 @@ CREATE INDEX database_settings_module_database_settings_table_id_idx ON metasche CREATE INDEX database_settings_module_webauthn_settings_table_id_idx ON metaschema_modules_public.database_settings_module ( webauthn_settings_table_id ); CREATE INDEX database_settings_module_schema_id_idx ON metaschema_modules_public.database_settings_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.database_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.pubkey_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.rls_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.webauthn_settings_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql index 4c5190f04..c8eda7c1d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_preset_module/table.sql @@ -41,4 +41,10 @@ CREATE INDEX db_preset_module_private_schema_id_idx ON metaschema_modules_public CREATE INDEX db_preset_module_public_schema_id_idx ON metaschema_modules_public.db_preset_module ( public_schema_id ); CREATE INDEX db_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.db_preset_module ( merkle_store_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.db_preset_module.db_presets_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql index 375e31695..b2b19e1b8 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/db_usage_module/table.sql @@ -78,4 +78,13 @@ CREATE INDEX db_usage_module_table_stats_summary_table_id_idx ON metaschema_modu CREATE INDEX db_usage_module_private_schema_id_idx ON metaschema_modules_public.db_usage_module ( private_schema_id ); CREATE INDEX db_usage_module_schema_id_idx ON metaschema_modules_public.db_usage_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.query_stats_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.query_stats_summary_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.table_stats_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.table_stats_summary_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql index 99cdfd643..f2a36f23a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/devices_module/table.sql @@ -35,4 +35,11 @@ CREATE INDEX devices_module_device_settings_table_id_idx ON metaschema_modules_p CREATE INDEX devices_module_user_devices_table_id_idx ON metaschema_modules_public.devices_module ( user_devices_table_id ); CREATE INDEX devices_module_schema_id_idx ON metaschema_modules_public.devices_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.devices_module.device_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.devices_module.user_devices_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql index 1601d6f1b..20b79e42c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/domain_module/table.sql @@ -114,4 +114,13 @@ CREATE INDEX domain_module_private_schema_id_idx ON metaschema_modules_public.do CREATE INDEX domain_module_schema_id_idx ON metaschema_modules_public.domain_module ( schema_id ); CREATE INDEX domain_module_catalog_module_id_idx ON metaschema_modules_public.domain_module ( catalog_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.domain_module.domain_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.domain_module.domain_verifications_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.domain_module.domains_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.domain_module.managed_domains_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/email_sender_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/email_sender_module/table.sql index 58057f4a7..0e46243dd 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/email_sender_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/email_sender_module/table.sql @@ -83,4 +83,12 @@ CREATE INDEX email_sender_module_site_identities_table_id_idx ON metaschema_modu CREATE INDEX email_sender_module_site_surface_module_id_idx ON metaschema_modules_public.email_sender_module ( site_surface_module_id ); CREATE INDEX email_sender_module_entity_table_id_idx ON metaschema_modules_public.email_sender_module ( entity_table_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_identities_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_provider_accounts_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_site_identities_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql index 2bd3e6c83..179a8f109 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/emails_module/table.sql @@ -34,4 +34,10 @@ CREATE INDEX emails_module_table_id_idx ON metaschema_modules_public.emails_modu CREATE INDEX emails_module_private_schema_id_idx ON metaschema_modules_public.emails_module ( private_schema_id ); CREATE INDEX emails_module_schema_id_idx ON metaschema_modules_public.emails_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.emails_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql index c2707c4a1..ca2ab1604 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/events_module/table.sql @@ -121,4 +121,16 @@ CREATE INDEX events_module_levels_table_id_idx ON metaschema_modules_public.even CREATE INDEX events_module_private_schema_id_idx ON metaschema_modules_public.events_module ( private_schema_id ); CREATE INDEX events_module_schema_id_idx ON metaschema_modules_public.events_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.events_module.achievement_rewards_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.event_aggregates_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.event_types_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.level_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.level_requirements_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.events_module.levels_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql index ae4fcddb4..908e77032 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_deployment_module/table.sql @@ -88,4 +88,11 @@ CREATE INDEX function_deployment_module_schema_id_idx ON metaschema_modules_publ CREATE INDEX function_deployment_module_function_module_id_idx ON metaschema_modules_public.function_deployment_module ( function_module_id ); CREATE INDEX function_deployment_module_namespace_module_id_idx ON metaschema_modules_public.function_deployment_module ( namespace_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.function_deployment_module.deployment_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_deployment_module.deployments_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql index a7f85e23c..cc2ea07ed 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_invocation_module/table.sql @@ -76,4 +76,12 @@ CREATE INDEX function_invocation_module_execution_logs_table_id_idx ON metaschem CREATE INDEX function_invocation_module_private_schema_id_idx ON metaschema_modules_public.function_invocation_module ( private_schema_id ); CREATE INDEX function_invocation_module_schema_id_idx ON metaschema_modules_public.function_invocation_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.attempts_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.execution_logs_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.invocations_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database.sql index 638f01a50..d3af4d38d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database.sql @@ -5,7 +5,7 @@ BEGIN; -- No-op migration: platform database uniqueness is enforced at the application --- layer by resolveDatabaseId(), which queries: +-- layer by resolvePlatformDatabaseId(), which queries: -- SELECT database_id FROM function_module WHERE scope = 'platform' LIMIT 1 -- -- A hard UNIQUE constraint on ((true)) WHERE scope='platform' would break diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql index 3f0c50f63..33b04c3cf 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/function_module/table.sql @@ -92,4 +92,13 @@ CREATE INDEX function_module_capability_bindings_table_id_idx ON metaschema_modu CREATE INDEX function_module_private_schema_id_idx ON metaschema_modules_public.function_module ( private_schema_id ); CREATE INDEX function_module_schema_id_idx ON metaschema_modules_public.function_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.function_module.bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_module.capability_bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_module.definitions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.function_module.schedules_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql index b6fefd568..0eebd839e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_execution_module/table.sql @@ -90,4 +90,12 @@ CREATE INDEX graph_execution_module_private_schema_id_idx ON metaschema_modules_ CREATE INDEX graph_execution_module_schema_id_idx ON metaschema_modules_public.graph_execution_module ( schema_id ); CREATE INDEX graph_execution_module_graph_module_id_idx ON metaschema_modules_public.graph_execution_module ( graph_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.executions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.node_states_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.outputs_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql index 38dc006ca..58fb50d3a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/graph_module/table.sql @@ -78,4 +78,10 @@ CREATE INDEX graph_module_private_schema_id_idx ON metaschema_modules_public.gra CREATE INDEX graph_module_public_schema_id_idx ON metaschema_modules_public.graph_module ( public_schema_id ); CREATE INDEX graph_module_merkle_store_module_id_idx ON metaschema_modules_public.graph_module ( merkle_store_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.graph_module.graphs_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql index 90c0b6dfd..17ff2dd40 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/hierarchy_module/table.sql @@ -76,4 +76,12 @@ CREATE INDEX hierarchy_module_users_table_id_idx ON metaschema_modules_public.hi CREATE INDEX hierarchy_module_private_schema_id_idx ON metaschema_modules_public.hierarchy_module ( private_schema_id ); CREATE INDEX hierarchy_module_schema_id_idx ON metaschema_modules_public.hierarchy_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.chart_edge_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.chart_edges_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.hierarchy_sprt_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql index 7fedb29c9..599973de6 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/http_route_module/table.sql @@ -80,4 +80,10 @@ CREATE INDEX http_route_module_function_module_id_idx ON metaschema_modules_publ CREATE INDEX http_route_module_resource_module_id_idx ON metaschema_modules_public.http_route_module ( resource_module_id ); CREATE INDEX http_route_module_storage_module_id_idx ON metaschema_modules_public.http_route_module ( storage_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.http_route_module.http_routes_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql index bf5458c4d..a7a99af9e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/i18n_module/table.sql @@ -30,4 +30,10 @@ CREATE INDEX i18n_module_settings_table_id_idx ON metaschema_modules_public.i18n CREATE INDEX i18n_module_private_schema_id_idx ON metaschema_modules_public.i18n_module ( private_schema_id ); CREATE INDEX i18n_module_schema_id_idx ON metaschema_modules_public.i18n_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.i18n_module.settings_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql index 03ae8850f..4043d837b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/identity_providers_module/table.sql @@ -71,4 +71,10 @@ COMMENT ON TABLE metaschema_modules_public.identity_providers_module IS scope=database → per-database infra, carries database_id'; COMMENT ON COLUMN metaschema_modules_public.identity_providers_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER admin helpers which write to identity_providers (create / update / enable / disable / rotate-secret / delete) and the per-app quota check.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.identity_providers_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/image_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/image_module/table.sql new file mode 100644 index 000000000..84ea1095a --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/image_module/table.sql @@ -0,0 +1,79 @@ +-- Deploy schemas/metaschema_modules_public/tables/image_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema + +BEGIN; + +CREATE TABLE metaschema_modules_public.image_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + + -- Scope-key column name on the generated table(s), recorded by the insert + -- trigger via metaschema_generators.scope_key_column(scope, key): database -> + -- 'database_id', entity -> the module's key ('entity_id' here), global -> NULL. + entity_field text, + + -- Schema references (if uuid_nil, resolved from schema name or default) + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Optional schema name overrides (used when schema IDs are not provided) + public_schema_name text, + private_schema_name text, + + -- Generated table IDs (populated by the generator) + images_table_id uuid NOT NULL DEFAULT uuid_nil(), + image_grants_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Table names (input to the generator) + images_table_name text NOT NULL DEFAULT 'images', + image_grants_table_name text NOT NULL DEFAULT 'image_grants', + + -- API routing (get-or-create: if set, schema is added to this API; if NULL, no API is added) + api_name text, + private_api_name text, + + -- Scope: determines the security level for this module instance. + scope text NOT NULL, + + -- Table name prefix. Auto-derived from scope by the trigger when empty. + prefix text NOT NULL DEFAULT '', + + -- Entity table for RLS (NULL for global scopes, entity table for entity scopes) + entity_table_id uuid NULL, + + -- Configurable security policies (NULL = use defaults based on scope). + policies jsonb NULL, + + -- Per-table provisions overrides from blueprint config. + -- Keys are table keys (images, image_grants). + provisions jsonb NULL, + + -- Default capabilities: capability names auto-granted to new members. + default_capabilities text[] DEFAULT NULL, + + CONSTRAINT image_module_db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT image_module_schema_fkey FOREIGN KEY (schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT image_module_private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT image_module_images_table_fkey FOREIGN KEY (images_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT image_module_grants_table_fkey FOREIGN KEY (image_grants_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT image_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE +); + +-- One image module per database per scope: the catalog is central by design, so +-- a second install at the same scope would split it in two. +CREATE UNIQUE INDEX image_module_unique_scope ON metaschema_modules_public.image_module ( database_id, scope ); +CREATE INDEX image_module_entity_table_id_idx ON metaschema_modules_public.image_module ( entity_table_id ); +CREATE INDEX image_module_images_table_id_idx ON metaschema_modules_public.image_module ( images_table_id ); +CREATE INDEX image_module_image_grants_table_id_idx ON metaschema_modules_public.image_module ( image_grants_table_id ); +CREATE INDEX image_module_private_schema_id_idx ON metaschema_modules_public.image_module ( private_schema_id ); +CREATE INDEX image_module_schema_id_idx ON metaschema_modules_public.image_module ( schema_id ); + +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.image_module.images_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.image_module.image_grants_table_id IS '@module_table'; + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql index 669da7799..d1dc50d7e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/inference_log_module/table.sql @@ -58,4 +58,11 @@ CREATE INDEX inference_log_module_usage_summary_table_id_idx ON metaschema_modul CREATE INDEX inference_log_module_private_schema_id_idx ON metaschema_modules_public.inference_log_module ( private_schema_id ); CREATE INDEX inference_log_module_schema_id_idx ON metaschema_modules_public.inference_log_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.inference_log_module.inference_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.inference_log_module.usage_summary_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql index 162925c50..3f1cd6592 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_config_module/table.sql @@ -65,4 +65,10 @@ CREATE INDEX infra_config_module_private_schema_id_idx ON metaschema_modules_pub COMMENT ON TABLE metaschema_modules_public.infra_config_module IS 'Namespace-backed plaintext key-value config module. Requires namespace_module and emits namespace:sync_config job triggers for K8s ConfigMap synchronization.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.infra_config_module.config_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql index 0b375dd10..f1c105550 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/infra_secrets_module/table.sql @@ -66,4 +66,10 @@ CREATE INDEX infra_secrets_module_private_schema_id_idx ON metaschema_modules_pu COMMENT ON TABLE metaschema_modules_public.infra_secrets_module IS 'Namespace-backed PGP-encrypted key-value secrets module. Requires namespace_module and emits namespace:sync_secrets job triggers for K8s Secret synchronization.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.infra_secrets_module.secrets_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql index 5dce11e7a..e951a002b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/integration_providers_module/table.sql @@ -60,4 +60,10 @@ COMMENT ON TABLE metaschema_modules_public.integration_providers_module IS and list the canonical secret/config names required to use them. Other modules (function_module, resource_module) match the provider slug as a string.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.integration_providers_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_config_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_config_module/table.sql new file mode 100644 index 000000000..58091bf51 --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_config_module/table.sql @@ -0,0 +1,75 @@ +-- Deploy schemas/metaschema_modules_public/tables/internal_config_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema + +BEGIN; + +CREATE TABLE metaschema_modules_public.internal_config_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + + -- Schema references (resolved by BEFORE INSERT trigger when uuid_nil) + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Schema name overrides: when set, the trigger uses these instead of hardcoded defaults. + public_schema_name text, + private_schema_name text, + + -- Generated table IDs (populated by the generator) + internal_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Table name (input -- bare name without scope prefix). + -- The trigger prepends the scope prefix automatically. + internal_config_table_name text NOT NULL DEFAULT 'internal_config', + + -- API routing (get-or-create: if set, schema is added to this API) + api_name text DEFAULT 'config', + private_api_name text DEFAULT NULL, + + -- Scope: determines the security level for this module instance. + scope text NOT NULL, + + -- Table name prefix. Auto-derived from scope by the trigger when empty. + prefix text NOT NULL DEFAULT '', + + -- Entity table for RLS (NULL for app-level, entity table for entity-scoped) + entity_table_id uuid NULL, + + -- Scope-key column name on the generated config table, recorded by the + -- insert trigger via metaschema_generators.scope_key_column(scope, key). + -- database -> 'database_id', entity -> the module's key ('owner_id' here), + -- global (platform/app) -> NULL. Consumers read this instead of hardcoding. + entity_field text, + + -- Configurable security policies (NULL = use defaults based on scope). + policies jsonb NULL, + + -- Per-table provisions overrides from blueprint config. + provisions jsonb NULL, + + -- Constraints + CONSTRAINT internal_config_module_db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT internal_config_module_schema_fkey FOREIGN KEY (schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT internal_config_module_private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT internal_config_module_internal_config_table_fkey FOREIGN KEY (internal_config_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT internal_config_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE +); + +CREATE INDEX internal_config_module_schema_id_idx ON metaschema_modules_public.internal_config_module ( schema_id ); +CREATE INDEX internal_config_module_internal_config_table_id_idx ON metaschema_modules_public.internal_config_module ( internal_config_table_id ); + +CREATE UNIQUE INDEX internal_config_module_unique_scope ON metaschema_modules_public.internal_config_module ( database_id, scope ); +CREATE INDEX internal_config_module_entity_table_id_idx ON metaschema_modules_public.internal_config_module ( entity_table_id ); +CREATE INDEX internal_config_module_private_schema_id_idx ON metaschema_modules_public.internal_config_module ( private_schema_id ); + +COMMENT ON TABLE metaschema_modules_public.internal_config_module IS + 'Scope-aware plaintext internal config store. No namespace_module dependency and no K8s synchronization: values are read from the database at invocation time. Configuration that must be projected into a Kubernetes ConfigMap belongs in infra_config_module.'; + +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.internal_config_module.internal_config_table_id IS '@module_table'; + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql index f26c6fc7f..02a0a3d9a 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/internal_secrets_module/table.sql @@ -66,4 +66,10 @@ CREATE INDEX internal_secrets_module_private_schema_id_idx ON metaschema_modules COMMENT ON TABLE metaschema_modules_public.internal_secrets_module IS 'App-scoped PGP-encrypted internal secrets store. No namespace_module dependency and no K8s synchronization. Used by identity_providers_module for OAuth2 client_secret storage.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.internal_secrets_module.internal_secrets_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql index e6334bbc4..51250f1b7 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/invites_module/table.sql @@ -65,4 +65,11 @@ CREATE INDEX invites_module_users_table_id_idx ON metaschema_modules_public.invi CREATE INDEX invites_module_private_schema_id_idx ON metaschema_modules_public.invites_module ( private_schema_id ); CREATE INDEX invites_module_schema_id_idx ON metaschema_modules_public.invites_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.invites_module.claimed_invites_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.invites_module.invites_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql new file mode 100644 index 000000000..ea4ee8500 --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql @@ -0,0 +1,56 @@ +-- Deploy schemas/metaschema_modules_public/tables/k8s_admission_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema +-- requires: schemas/metaschema_modules_public/tables/merkle_store_module/table + +BEGIN; + +CREATE TABLE metaschema_modules_public.k8s_admission_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + public_schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + scope text NOT NULL, + prefix text NOT NULL, + merkle_store_module_id uuid NOT NULL, + k8s_resource_kinds_table_id uuid NOT NULL DEFAULT uuid_nil(), + k8s_spec_rules_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Store row name inside the Merkle store tables (one shared infra store) + store_name text NOT NULL, + + api_name text, + private_api_name text, + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT public_schema_fkey FOREIGN KEY (public_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT merkle_store_fkey FOREIGN KEY (merkle_store_module_id) REFERENCES metaschema_modules_public.merkle_store_module (id) ON DELETE CASCADE, + CONSTRAINT k8s_resource_kinds_table_fkey FOREIGN KEY (k8s_resource_kinds_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT k8s_spec_rules_table_fkey FOREIGN KEY (k8s_spec_rules_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT k8s_admission_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT k8s_admission_module_database_merkle_unique UNIQUE (database_id, merkle_store_module_id) +); + +CREATE INDEX k8s_admission_module_entity_table_id_idx ON metaschema_modules_public.k8s_admission_module ( entity_table_id ); +CREATE INDEX k8s_admission_module_k8s_resource_kinds_table_id_idx ON metaschema_modules_public.k8s_admission_module ( k8s_resource_kinds_table_id ); +CREATE INDEX k8s_admission_module_k8s_spec_rules_table_id_idx ON metaschema_modules_public.k8s_admission_module ( k8s_spec_rules_table_id ); +CREATE INDEX k8s_admission_module_private_schema_id_idx ON metaschema_modules_public.k8s_admission_module ( private_schema_id ); +CREATE INDEX k8s_admission_module_public_schema_id_idx ON metaschema_modules_public.k8s_admission_module ( public_schema_id ); +CREATE INDEX k8s_admission_module_merkle_store_module_id_idx ON metaschema_modules_public.k8s_admission_module ( merkle_store_module_id ); + +COMMENT ON TABLE metaschema_modules_public.k8s_admission_module IS 'Provisions the platform-managed Kubernetes admission catalogs: a kinds table and a spec-rules table, Merkle-versioned through the referenced merkle_store_module, whose rows the generated admission gate on resources/resource_definitions reads. Writes are platform-admin and human-only; every scope reads the one catalog.'; + +-- Tables this module generates, as opposed to tables it is handed (the entity +-- table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.k8s_admission_module.k8s_resource_kinds_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.k8s_admission_module.k8s_spec_rules_table_id IS '@module_table'; + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql index fe605a899..2b2ed627f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/limits_module/table.sql @@ -129,4 +129,21 @@ CREATE INDEX limits_module_table_id_idx ON metaschema_modules_public.limits_modu CREATE INDEX limits_module_private_schema_id_idx ON metaschema_modules_public.limits_module ( private_schema_id ); CREATE INDEX limits_module_schema_id_idx ON metaschema_modules_public.limits_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.limits_module.aggregate_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_code_items_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_codes_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_redemptions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.default_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_caps_defaults_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_caps_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_credits_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_warning_state_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_warnings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.limits_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/machine_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/machine_module/table.sql new file mode 100644 index 000000000..a4b509946 --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/machine_module/table.sql @@ -0,0 +1,92 @@ +-- Deploy schemas/metaschema_modules_public/tables/machine_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema + +BEGIN; + +CREATE TABLE metaschema_modules_public.machine_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + + -- Scope-key column name on the generated table(s), recorded by the insert + -- trigger via metaschema_generators.scope_key_column(scope, key): database -> + -- 'database_id', entity -> the module's key ('entity_id' here), global -> NULL. + entity_field text, + + -- Schema references (if uuid_nil, resolved from schema name or default) + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Optional schema name overrides (used when schema IDs are not provided) + public_schema_name text, + private_schema_name text, + + -- Generated table IDs (populated by the generator) + machines_table_id uuid NOT NULL DEFAULT uuid_nil(), + machine_sessions_table_id uuid NOT NULL DEFAULT uuid_nil(), + machine_messages_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Table names (input to the generator) + machines_table_name text NOT NULL DEFAULT 'machines', + machine_sessions_table_name text NOT NULL DEFAULT 'machine_sessions', + machine_messages_table_name text NOT NULL DEFAULT 'machine_messages', + + -- Ledger partition lifecycle. Command-mode output is unbounded and + -- time-keyed, and terminal scrollback stops being interesting long before + -- metering does, so the default window is shorter than the usage tiers'. + partition_interval text NOT NULL DEFAULT '1 month', + retention text NOT NULL DEFAULT '3 months', + premake int NOT NULL DEFAULT 2, + + -- API routing (get-or-create: if set, schema is added to this API; if NULL, no API is added) + api_name text, + private_api_name text, + + -- Scope: determines the security level for this module instance. + scope text NOT NULL, + + -- Table name prefix. Auto-derived from scope by the trigger when empty. + prefix text NOT NULL DEFAULT '', + + -- Entity table for RLS (NULL for global scopes, entity table for entity scopes) + entity_table_id uuid NULL, + + -- Configurable security policies (NULL = use defaults based on scope). + policies jsonb NULL, + + -- Per-table provisions overrides from blueprint config. Keys are table keys + -- (machines, machine_sessions, machine_messages). + provisions jsonb NULL, + + -- Default capabilities: capability names auto-granted to new members. + default_capabilities text[] DEFAULT NULL, + + CONSTRAINT machine_module_db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT machine_module_schema_fkey FOREIGN KEY (schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT machine_module_private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT machine_module_machines_table_fkey FOREIGN KEY (machines_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT machine_module_sessions_table_fkey FOREIGN KEY (machine_sessions_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT machine_module_messages_table_fkey FOREIGN KEY (machine_messages_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT machine_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE +); + +-- One machine module per database per scope: a machine label is unique within +-- the scope that owns it, so a second install at the same scope would make +-- "which dan-macbook" ambiguous in a picker. +CREATE UNIQUE INDEX machine_module_unique_scope ON metaschema_modules_public.machine_module ( database_id, scope ); +CREATE INDEX machine_module_entity_table_id_idx ON metaschema_modules_public.machine_module ( entity_table_id ); +CREATE INDEX machine_module_machines_table_id_idx ON metaschema_modules_public.machine_module ( machines_table_id ); +CREATE INDEX machine_module_machine_sessions_table_id_idx ON metaschema_modules_public.machine_module ( machine_sessions_table_id ); +CREATE INDEX machine_module_machine_messages_table_id_idx ON metaschema_modules_public.machine_module ( machine_messages_table_id ); +CREATE INDEX machine_module_private_schema_id_idx ON metaschema_modules_public.machine_module ( private_schema_id ); +CREATE INDEX machine_module_schema_id_idx ON metaschema_modules_public.machine_module ( schema_id ); + +-- Tables this module generates, as opposed to tables it is handed: the +-- @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.machine_module.machines_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.machine_module.machine_sessions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.machine_module.machine_messages_table_id IS '@module_table'; + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql index efc1dd761..de0bab4ad 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/membership_types_module/table.sql @@ -24,4 +24,10 @@ CREATE INDEX membership_types_module_database_id_idx ON metaschema_modules_publi CREATE INDEX membership_types_module_table_id_idx ON metaschema_modules_public.membership_types_module ( table_id ); CREATE INDEX membership_types_module_schema_id_idx ON metaschema_modules_public.membership_types_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.membership_types_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql index 13b5b76c0..762ade35d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/memberships_module/table.sql @@ -120,4 +120,23 @@ CREATE INDEX memberships_module_private_schema_id_idx ON metaschema_modules_publ CREATE INDEX memberships_module_schema_id_idx ON metaschema_modules_public.memberships_module ( schema_id ); CREATE INDEX memberships_module_entity_table_owner_id_idx ON metaschema_modules_public.memberships_module ( entity_table_owner_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.memberships_module.admin_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.capability_default_capabilities_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.capability_default_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.member_profiles_table_id IS '@module_table'; +-- members_table_id is deliberately unmarked: outside an entity scope the +-- generator returns the actor table it was handed rather than creating a +-- members table, so the reference names a table this install generated only +-- some of the time. +COMMENT ON COLUMN metaschema_modules_public.memberships_module.membership_defaults_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.membership_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.memberships_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.owner_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.memberships_module.sprt_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql index 8b4a83bba..af55ac0da 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/merkle_store_module/table.sql @@ -39,6 +39,11 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( -- RLS through metaschema_public.database ownership. scope text NOT NULL, + -- The table an entity scope's entities live in, resolved by the insert + -- trigger from the memberships module at `scope`. NULL at every non-entity + -- scope, which carry an opaque store partition key instead of an owner. + entity_table_id uuid NULL, + -- Function name prefix override: NULL (default) inherits from `prefix`; -- '' (empty string) generates unprefixed function names (e.g., get_all instead of function_graph_get_all); -- any other value is used as-is. Tables always keep their prefix regardless of this setting. @@ -60,6 +65,7 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( CONSTRAINT store_table_fkey FOREIGN KEY (store_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT commit_table_fkey FOREIGN KEY (commit_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT ref_table_fkey FOREIGN KEY (ref_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT merkle_store_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, -- Only one merkle store module per database + prefix combination CONSTRAINT merkle_store_module_database_prefix_unique UNIQUE (database_id, prefix) @@ -71,5 +77,15 @@ CREATE INDEX merkle_store_module_object_table_id_idx ON metaschema_modules_publi CREATE INDEX merkle_store_module_ref_table_id_idx ON metaschema_modules_public.merkle_store_module ( ref_table_id ); CREATE INDEX merkle_store_module_store_table_id_idx ON metaschema_modules_public.merkle_store_module ( store_table_id ); CREATE INDEX merkle_store_module_schema_id_idx ON metaschema_modules_public.merkle_store_module ( schema_id ); +CREATE INDEX merkle_store_module_entity_table_id_idx ON metaschema_modules_public.merkle_store_module ( entity_table_id ); + +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.commit_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.object_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.ref_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.store_table_id IS '@module_table'; COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql index bc696fa0f..598d0a111 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/namespace_module/table.sql @@ -77,4 +77,11 @@ CREATE INDEX namespace_module_namespaces_table_id_idx ON metaschema_modules_publ CREATE INDEX namespace_module_private_schema_id_idx ON metaschema_modules_public.namespace_module ( private_schema_id ); CREATE INDEX namespace_module_schema_id_idx ON metaschema_modules_public.namespace_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.namespace_module.namespace_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.namespace_module.namespaces_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql index 0ea9c855d..8321787e0 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/notifications_module/table.sql @@ -93,4 +93,15 @@ CREATE INDEX notifications_module_user_settings_table_id_idx ON metaschema_modul CREATE INDEX notifications_module_private_schema_id_idx ON metaschema_modules_public.notifications_module ( private_schema_id ); CREATE INDEX notifications_module_schema_id_idx ON metaschema_modules_public.notifications_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.notifications_module.channels_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.notifications_module.delivery_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.notifications_module.notifications_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.notifications_module.preferences_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.notifications_module.read_state_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.notifications_module.suppressions_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/oauth_requests_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/oauth_requests_module/table.sql index b6f61d76f..906a1cd41 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/oauth_requests_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/oauth_requests_module/table.sql @@ -67,4 +67,11 @@ COMMENT ON TABLE metaschema_modules_public.oauth_requests_module IS Sibling of identity_providers_module (durable provider configuration) rather than part of it: this is ephemeral, purged flow state with its own retention.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.oauth_requests_module.oauth_authorization_requests_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.oauth_requests_module.pending_identity_links_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql index 6eba4c310..7fc4515b5 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/pages_module/table.sql @@ -59,4 +59,10 @@ CREATE INDEX pages_module_private_schema_id_idx ON metaschema_modules_public.pag CREATE INDEX pages_module_public_schema_id_idx ON metaschema_modules_public.pages_module ( public_schema_id ); CREATE INDEX pages_module_merkle_store_module_id_idx ON metaschema_modules_public.pages_module ( merkle_store_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.pages_module.pages_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql index 6b73cc13b..eb990cb09 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/phone_numbers_module/table.sql @@ -34,4 +34,10 @@ CREATE INDEX phone_numbers_module_table_id_idx ON metaschema_modules_public.phon CREATE INDEX phone_numbers_module_private_schema_id_idx ON metaschema_modules_public.phone_numbers_module ( private_schema_id ); CREATE INDEX phone_numbers_module_schema_id_idx ON metaschema_modules_public.phone_numbers_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.phone_numbers_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql index d34661167..09f84343c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/plans_module/table.sql @@ -70,4 +70,15 @@ CREATE INDEX plans_module_plans_table_id_idx ON metaschema_modules_public.plans_ CREATE INDEX plans_module_private_schema_id_idx ON metaschema_modules_public.plans_module ( private_schema_id ); CREATE INDEX plans_module_schema_id_idx ON metaschema_modules_public.plans_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_caps_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_limits_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_meter_limits_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_overrides_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_pricing_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.plans_module.plans_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql index 0a4474bd3..e81ef8c8b 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/principal_auth_module/table.sql @@ -61,4 +61,12 @@ COMMENT ON CONSTRAINT principal_entities_table_fkey COMMENT ON TABLE metaschema_modules_public.principal_auth_module IS 'Provisions the principals subsystem: a principals table, a principal_entities junction table, create/delete mutations, and org API key management. Supports both human-owned principals (AuthzDirectOwner, AuthzHumanOnly) and org-owned principals (AuthzEntityMembership with is_admin). Org principal and org API key functions are only generated when an org-scoped memberships_module exists for the database.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principal_entities_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principal_scope_overrides_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principals_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql index 217d29269..589524c8e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/profiles_module/table.sql @@ -95,4 +95,15 @@ CREATE INDEX profiles_module_table_id_idx ON metaschema_modules_public.profiles_ CREATE INDEX profiles_module_private_schema_id_idx ON metaschema_modules_public.profiles_module ( private_schema_id ); CREATE INDEX profiles_module_schema_id_idx ON metaschema_modules_public.profiles_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.profiles_module.membership_profiles_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_capabilities_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_definition_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_grants_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_templates_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.profiles_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql index d2dcdda7b..2519aed1e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limit_meters_module/table.sql @@ -64,4 +64,12 @@ CREATE INDEX rate_limit_meters_module_rate_window_limits_table_id_idx ON metasch CREATE INDEX rate_limit_meters_module_private_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module ( private_schema_id ); CREATE INDEX rate_limit_meters_module_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_limit_overrides_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_limit_state_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_window_limits_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql index 72a0cd207..dbfff8152 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/rate_limits_module/table.sql @@ -41,4 +41,12 @@ CREATE INDEX rate_limits_module_rate_limit_settings_table_id_idx ON metaschema_m CREATE INDEX rate_limits_module_rate_limits_table_id_idx ON metaschema_modules_public.rate_limits_module ( rate_limits_table_id ); CREATE INDEX rate_limits_module_schema_id_idx ON metaschema_modules_public.rate_limits_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.ip_rate_limits_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.rate_limit_settings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.rate_limits_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql index 3a56ae489..2e8e886ca 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/realtime_module/table.sql @@ -48,4 +48,12 @@ CREATE INDEX realtime_module_change_log_table_id_idx ON metaschema_modules_publi CREATE INDEX realtime_module_listener_node_table_id_idx ON metaschema_modules_public.realtime_module ( listener_node_table_id ); CREATE INDEX realtime_module_source_registry_table_id_idx ON metaschema_modules_public.realtime_module ( source_registry_table_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.realtime_module.change_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.realtime_module.listener_node_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.realtime_module.source_registry_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql new file mode 100644 index 000000000..1648e5260 --- /dev/null +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql @@ -0,0 +1,121 @@ +-- Deploy schemas/metaschema_modules_public/tables/repository_module/table to pg + +-- requires: schemas/metaschema_modules_public/schema + +BEGIN; + +CREATE TABLE metaschema_modules_public.repository_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + + -- Scope-key column name on the generated table(s), recorded by the insert + -- trigger via metaschema_generators.scope_key_column(scope, key): database -> + -- 'database_id', entity -> the module's key ('entity_id' here), global -> NULL. + entity_field text, + + -- Schema references (if uuid_nil, resolved from schema name or default) + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Optional schema name overrides (used when schema IDs are not provided) + public_schema_name text, + private_schema_name text, + + -- Generated table IDs (populated by the generator) + repositories_table_id uuid NOT NULL DEFAULT uuid_nil(), + repository_events_table_id uuid NOT NULL DEFAULT uuid_nil(), + workflows_table_id uuid NOT NULL DEFAULT uuid_nil(), + builds_table_id uuid NOT NULL DEFAULT uuid_nil(), + build_steps_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_requests_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_comments_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_reactions_table_id uuid NOT NULL DEFAULT uuid_nil(), + + -- Table names (input to the generator) + repositories_table_name text NOT NULL DEFAULT 'repositories', + repository_events_table_name text NOT NULL DEFAULT 'repository_events', + workflows_table_name text NOT NULL DEFAULT 'repository_workflows', + builds_table_name text NOT NULL DEFAULT 'builds', + build_steps_table_name text NOT NULL DEFAULT 'build_steps', + change_requests_table_name text NOT NULL DEFAULT 'change_requests', + change_request_comments_table_name text NOT NULL DEFAULT 'change_request_comments', + change_request_reactions_table_name text NOT NULL DEFAULT 'change_request_reactions', + + -- Workflows and builds enqueue jobs that run flow graphs, so they are only + -- coherent at a scope that has a compute plane; an install without one gets + -- the repository, event and review surface and nothing that needs a runner. + has_builds boolean NOT NULL DEFAULT false, + + -- Images and files in a review comment, stored by the storage module at this + -- same scope. Off by default because turning it on requires that module: + -- provisioning raises rather than accepting a file it has nowhere to put. + has_attachments boolean NOT NULL DEFAULT false, + + -- API routing (get-or-create: if set, schema is added to this API; if NULL, no API is added) + api_name text, + private_api_name text, + + -- Scope: determines the security level for this module instance. + scope text NOT NULL, + + -- Table name prefix. Auto-derived from scope by the trigger when empty. + prefix text NOT NULL DEFAULT '', + + -- Entity table for RLS (NULL for global scopes, entity table for entity scopes) + entity_table_id uuid NULL, + + -- Configurable security policies (NULL = use defaults based on scope). + policies jsonb NULL, + + -- Per-table provisions overrides from blueprint config. Keys are table keys + -- (repositories, repository_events, workflows, builds, build_steps, + -- change_requests, change_request_comments, change_request_reactions). + provisions jsonb NULL, + + -- Default capabilities: capability names auto-granted to new members. + default_capabilities text[] DEFAULT NULL, + + CONSTRAINT repository_module_db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, + CONSTRAINT repository_module_schema_fkey FOREIGN KEY (schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT repository_module_private_schema_fkey FOREIGN KEY (private_schema_id) REFERENCES metaschema_public.schema (id) ON DELETE CASCADE, + CONSTRAINT repository_module_repositories_table_fkey FOREIGN KEY (repositories_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_events_table_fkey FOREIGN KEY (repository_events_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_workflows_table_fkey FOREIGN KEY (workflows_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_builds_table_fkey FOREIGN KEY (builds_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_build_steps_table_fkey FOREIGN KEY (build_steps_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_change_requests_table_fkey FOREIGN KEY (change_requests_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_comments_table_fkey FOREIGN KEY (change_request_comments_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_reactions_table_fkey FOREIGN KEY (change_request_reactions_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE +); + +-- One repository module per database per scope: repository slugs are unique +-- within the scope that owns them, so a second install at the same scope would +-- make a clone URL ambiguous. +CREATE UNIQUE INDEX repository_module_unique_scope ON metaschema_modules_public.repository_module ( database_id, scope ); +CREATE INDEX repository_module_entity_table_id_idx ON metaschema_modules_public.repository_module ( entity_table_id ); +CREATE INDEX repository_module_repositories_table_id_idx ON metaschema_modules_public.repository_module ( repositories_table_id ); +CREATE INDEX repository_module_repository_events_table_id_idx ON metaschema_modules_public.repository_module ( repository_events_table_id ); +CREATE INDEX repository_module_workflows_table_id_idx ON metaschema_modules_public.repository_module ( workflows_table_id ); +CREATE INDEX repository_module_builds_table_id_idx ON metaschema_modules_public.repository_module ( builds_table_id ); +CREATE INDEX repository_module_build_steps_table_id_idx ON metaschema_modules_public.repository_module ( build_steps_table_id ); +CREATE INDEX repository_module_change_requests_table_id_idx ON metaschema_modules_public.repository_module ( change_requests_table_id ); +CREATE INDEX repository_module_comments_table_id_idx ON metaschema_modules_public.repository_module ( change_request_comments_table_id ); +CREATE INDEX repository_module_reactions_table_id_idx ON metaschema_modules_public.repository_module ( change_request_reactions_table_id ); +CREATE INDEX repository_module_private_schema_id_idx ON metaschema_modules_public.repository_module ( private_schema_id ); +CREATE INDEX repository_module_schema_id_idx ON metaschema_modules_public.repository_module ( schema_id ); + +-- Tables this module generates, as opposed to tables it is handed (an entity or +-- graph table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.repository_module.repositories_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.repository_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.workflows_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.builds_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.build_steps_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_requests_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_comments_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reactions_table_id IS '@module_table'; + +COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql index fef07595b..82c9711ba 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/resource_module/table.sql @@ -32,6 +32,10 @@ CREATE TABLE metaschema_modules_public.resource_module ( resource_usage_summary_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Resource-bundles Stage 1: the installation ("release") grouping table. resource_installations_table_id uuid NOT NULL DEFAULT uuid_nil(), + -- Which registry a namespace pulls from, per lane. Generated here rather + -- than by namespace_module because its keys are the namespace and the + -- installed registry, which only exist together in this scope. + registry_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (input to the generator — bare names without scope prefix). -- The trigger prepends the scope prefix automatically. @@ -42,6 +46,7 @@ CREATE TABLE metaschema_modules_public.resource_module ( resource_usage_log_table_name text NOT NULL DEFAULT 'resource_usage_log', resource_usage_summary_table_name text NOT NULL DEFAULT 'resource_usage_summary', resource_installations_table_name text NOT NULL DEFAULT 'resource_installations', + registry_bindings_table_name text NOT NULL DEFAULT 'registry_bindings', -- Generated functions (populated by the generator) rollup_resource_usage_summary_function text NOT NULL DEFAULT '', @@ -99,6 +104,7 @@ CREATE TABLE metaschema_modules_public.resource_module ( CONSTRAINT resource_module_usage_log_table_fkey FOREIGN KEY (resource_usage_log_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT resource_module_usage_summary_table_fkey FOREIGN KEY (resource_usage_summary_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT resource_module_installations_table_fkey FOREIGN KEY (resource_installations_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT resource_module_registry_bindings_table_fkey FOREIGN KEY (registry_bindings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT resource_module_merkle_store_module_fkey FOREIGN KEY (merkle_store_module_id) REFERENCES metaschema_modules_public.merkle_store_module (id) ON DELETE SET NULL, CONSTRAINT resource_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT resource_module_namespace_module_fkey FOREIGN KEY (namespace_module_id) REFERENCES metaschema_modules_public.namespace_module (id) ON DELETE SET NULL @@ -110,6 +116,7 @@ CREATE INDEX resource_module_resource_definitions_table_id_idx ON metaschema_mod CREATE INDEX resource_module_entity_table_id_idx ON metaschema_modules_public.resource_module ( entity_table_id ); CREATE INDEX resource_module_resource_events_table_id_idx ON metaschema_modules_public.resource_module ( resource_events_table_id ); CREATE INDEX resource_module_resource_installations_table_id_idx ON metaschema_modules_public.resource_module ( resource_installations_table_id ); +CREATE INDEX resource_module_registry_bindings_table_id_idx ON metaschema_modules_public.resource_module ( registry_bindings_table_id ); CREATE INDEX resource_module_resources_table_id_idx ON metaschema_modules_public.resource_module ( resources_table_id ); CREATE INDEX resource_module_resource_status_checks_table_id_idx ON metaschema_modules_public.resource_module ( resource_status_checks_table_id ); CREATE INDEX resource_module_resource_usage_log_table_id_idx ON metaschema_modules_public.resource_module ( resource_usage_log_table_id ); @@ -119,4 +126,17 @@ CREATE INDEX resource_module_schema_id_idx ON metaschema_modules_public.resource CREATE INDEX resource_module_merkle_store_module_id_idx ON metaschema_modules_public.resource_module ( merkle_store_module_id ); CREATE INDEX resource_module_namespace_module_id_idx ON metaschema_modules_public.resource_module ( namespace_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_definitions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_installations_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.registry_bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_status_checks_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_usage_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_usage_summary_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.resource_module.resources_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql index 6992b4226..1166b42cf 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/route_module/table.sql @@ -36,11 +36,13 @@ CREATE TABLE metaschema_modules_public.route_module ( routes_table_id uuid NOT NULL DEFAULT uuid_nil(), hostname_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), route_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), + redirects_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (input to the generator) routes_table_name text NOT NULL DEFAULT 'routes', hostname_bindings_table_name text NOT NULL DEFAULT 'hostname_bindings', route_bindings_table_name text NOT NULL DEFAULT 'route_bindings', + redirects_table_name text NOT NULL DEFAULT 'redirects', -- Generated resolver name (populated by the generator) resolver_function_name text, @@ -106,6 +108,10 @@ CREATE TABLE metaschema_modules_public.route_module ( FOREIGN KEY (route_bindings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT route_module_redirects_table_fkey + FOREIGN KEY (redirects_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT route_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) @@ -118,9 +124,19 @@ CREATE INDEX route_module_entity_table_id_idx ON metaschema_modules_public.route CREATE INDEX route_module_hostname_bindings_table_id_idx ON metaschema_modules_public.route_module ( hostname_bindings_table_id ); CREATE INDEX route_module_route_bindings_table_id_idx ON metaschema_modules_public.route_module ( route_bindings_table_id ); CREATE INDEX route_module_routes_table_id_idx ON metaschema_modules_public.route_module ( routes_table_id ); +CREATE INDEX route_module_redirects_table_id_idx ON metaschema_modules_public.route_module ( redirects_table_id ); CREATE INDEX route_module_private_schema_id_idx ON metaschema_modules_public.route_module ( private_schema_id ); CREATE INDEX route_module_schema_id_idx ON metaschema_modules_public.route_module ( schema_id ); CREATE INDEX route_module_catalog_module_id_idx ON metaschema_modules_public.route_module ( catalog_module_id ); CREATE INDEX route_module_domain_module_id_idx ON metaschema_modules_public.route_module ( domain_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.route_module.hostname_bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.route_module.route_bindings_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.route_module.routes_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.route_module.redirects_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/scope_types_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/scope_types_module/table.sql index 02953ff50..9854944fa 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/scope_types_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/scope_types_module/table.sql @@ -35,4 +35,10 @@ CREATE INDEX scope_types_module_database_id_idx ON metaschema_modules_public.sco CREATE INDEX scope_types_module_schema_id_idx ON metaschema_modules_public.scope_types_module ( schema_id ); CREATE INDEX scope_types_module_scope_types_table_id_idx ON metaschema_modules_public.scope_types_module ( scope_types_table_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.scope_types_module.scope_types_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/session_secrets_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/session_secrets_module/table.sql index 4b8eda28e..2778b39b2 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/session_secrets_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/session_secrets_module/table.sql @@ -28,4 +28,10 @@ CREATE INDEX session_secrets_module_sessions_table_id_idx ON metaschema_modules_ COMMENT ON TABLE metaschema_modules_public.session_secrets_module IS 'Config row for the session_secrets_module, which provisions a DB-private, session-scoped ephemeral key-value store for challenges, nonces, and one-time tokens that must never be readable by end users.'; COMMENT ON COLUMN metaschema_modules_public.session_secrets_module.sessions_table_id IS 'Resolved reference to sessions_module.sessions_table_name, used to FK session_secrets.session_id with ON DELETE CASCADE.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.session_secrets_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql index 54ec2df7d..12d1c4d3d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/sessions_module/table.sql @@ -43,4 +43,10 @@ COMMENT ON CONSTRAINT session_credentials_table_fkey COMMENT ON CONSTRAINT auth_settings_table_fkey ON metaschema_modules_public.sessions_module IS E'@fieldName authSettingsTableByAuthSettingsTableId'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.sessions_module.sessions_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql index 109198d5b..d3e542c12 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/site_surface_module/table.sql @@ -140,4 +140,17 @@ CREATE INDEX site_surface_module_sites_table_id_idx ON metaschema_modules_public CREATE INDEX site_surface_module_schema_id_idx ON metaschema_modules_public.site_surface_module ( schema_id ); CREATE INDEX site_surface_module_catalog_module_id_idx ON metaschema_modules_public.site_surface_module ( catalog_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_app_links_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_deep_links_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_error_pages_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_metadata_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_modules_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_themes_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_web_config_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.sites_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql index bcb69b0d1..bc4325bbf 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_log_module/table.sql @@ -58,4 +58,11 @@ CREATE INDEX storage_log_module_usage_summary_table_id_idx ON metaschema_modules CREATE INDEX storage_log_module_private_schema_id_idx ON metaschema_modules_public.storage_log_module ( private_schema_id ); CREATE INDEX storage_log_module_schema_id_idx ON metaschema_modules_public.storage_log_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.storage_log_module.storage_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.storage_log_module.usage_summary_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql index 296aef843..602577895 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/storage_module/table.sql @@ -108,8 +108,11 @@ CREATE TABLE metaschema_modules_public.storage_module ( -- Constraints -- API routing (configurable per-module) - -- NULL = no automatic API routing (caller must route explicitly or use entity_type_provision). - api_name text DEFAULT NULL, + -- Storage is its own surface: buckets and files are served on the storage + -- API by default, so a module instance is reachable without the caller + -- remembering to name an API. Explicit NULL opts out (route elsewhere or + -- through entity_type_provision). + api_name text DEFAULT 'storage', private_api_name text DEFAULT NULL, CONSTRAINT db_fkey FOREIGN KEY (database_id) REFERENCES metaschema_public.database (id) ON DELETE CASCADE, @@ -132,4 +135,13 @@ CREATE INDEX storage_module_path_shares_table_id_idx ON metaschema_modules_publi CREATE INDEX storage_module_private_schema_id_idx ON metaschema_modules_public.storage_module ( private_schema_id ); CREATE INDEX storage_module_schema_id_idx ON metaschema_modules_public.storage_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.storage_module.buckets_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.storage_module.file_events_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.storage_module.files_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.storage_module.path_shares_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql index c312b31fa..a7202a4da 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/transfer_log_module/table.sql @@ -58,4 +58,11 @@ CREATE INDEX transfer_log_module_usage_summary_table_id_idx ON metaschema_module CREATE INDEX transfer_log_module_private_schema_id_idx ON metaschema_modules_public.transfer_log_module ( private_schema_id ); CREATE INDEX transfer_log_module_schema_id_idx ON metaschema_modules_public.transfer_log_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.transfer_log_module.transfer_log_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.transfer_log_module.usage_summary_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql index c56392889..972dfab7f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_auth_module/table.sql @@ -83,4 +83,10 @@ COMMENT ON CONSTRAINT sessions_table_fkey COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.user_auth_module IS E'@behavior -*'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.user_auth_module.audits_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql index 1aa8b24a5..6b91d021e 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_credentials_module/table.sql @@ -41,4 +41,10 @@ COMMENT ON TABLE metaschema_modules_public.user_credentials_module IS Always user-scoped with AuthzDirectOwner RLS. Consumed by user_auth_module, identity_providers_module, and bootstrap procedures.'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.user_credentials_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql index 51be32d64..3b192638d 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_module/table.sql @@ -33,4 +33,10 @@ CREATE INDEX user_settings_module_owner_table_id_idx ON metaschema_modules_publi CREATE INDEX user_settings_module_table_id_idx ON metaschema_modules_public.user_settings_module ( table_id ); CREATE INDEX user_settings_module_schema_id_idx ON metaschema_modules_public.user_settings_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.user_settings_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_security_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_security_module/table.sql index c0254ca11..0c523a675 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_security_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_settings_security_module/table.sql @@ -33,4 +33,10 @@ CREATE INDEX user_settings_security_module_owner_table_id_idx ON metaschema_modu CREATE INDEX user_settings_security_module_table_id_idx ON metaschema_modules_public.user_settings_security_module ( table_id ); CREATE INDEX user_settings_security_module_schema_id_idx ON metaschema_modules_public.user_settings_security_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.user_settings_security_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql index f6d8546d8..e51e5634c 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/user_state_module/table.sql @@ -26,4 +26,10 @@ CREATE INDEX user_state_module_database_id_idx ON metaschema_modules_public.user CREATE INDEX user_state_module_table_id_idx ON metaschema_modules_public.user_state_module ( table_id ); CREATE INDEX user_state_module_schema_id_idx ON metaschema_modules_public.user_state_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.user_state_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql index 21313e2a7..7f421d153 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/users_module/table.sql @@ -33,4 +33,11 @@ CREATE INDEX users_module_table_id_idx ON metaschema_modules_public.users_module CREATE INDEX users_module_type_table_id_idx ON metaschema_modules_public.users_module ( type_table_id ); CREATE INDEX users_module_schema_id_idx ON metaschema_modules_public.users_module ( schema_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.users_module.table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.users_module.type_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql index 94c224cf9..6f614d473 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webauthn_credentials_module/table.sql @@ -37,4 +37,10 @@ CREATE INDEX webauthn_credentials_module_schema_id_idx ON metaschema_modules_pub COMMENT ON TABLE metaschema_modules_public.webauthn_credentials_module IS 'Config row for the webauthn_credentials_module, which provisions the per-user WebAuthn/passkey credentials table (public key, counter, transports, device type, backup state) mirroring crypto_addresses_module. The sibling webauthn_auth_module holds RP config and the registration/sign-in challenge state.'; COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER helpers which write to webauthn_credentials (registration / counter-bump / delete).'; +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql index 4cc85a120..ff4057c8f 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/webhook_module/table.sql @@ -103,4 +103,11 @@ CREATE INDEX webhook_module_function_invocation_module_id_idx ON metaschema_modu CREATE INDEX webhook_module_namespace_module_id_idx ON metaschema_modules_public.webhook_module ( namespace_module_id ); CREATE INDEX webhook_module_infra_secrets_module_id_idx ON metaschema_modules_public.webhook_module ( infra_secrets_module_id ); +-- Tables this module generates, as opposed to tables it is handed (an +-- entity or users table it points at): the @module_table marker is what +-- metaschema_modules_private.tg_module_install_provenance attributes to this +-- install, keyed by the role name in the column. +COMMENT ON COLUMN metaschema_modules_public.webhook_module.webhook_endpoints_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.webhook_module.webhook_events_table_id IS '@module_table'; + COMMIT; diff --git a/packages/metaschema-modules/pgpm.plan b/packages/metaschema-modules/pgpm.plan index 8c6e5373d..01200b122 100644 --- a/packages/metaschema-modules/pgpm.plan +++ b/packages/metaschema-modules/pgpm.plan @@ -55,6 +55,7 @@ schemas/metaschema_modules_public/tables/merkle_store_module/table [schemas/meta schemas/metaschema_modules_public/tables/graph_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/merkle_store_module/table] 2026-05-21T01:00:00Z devin # add graph_module config table for FBP graph utilities on top of merkle store schemas/metaschema_modules_public/tables/graph_execution_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/graph_module/table] 2026-06-12T00:00:00Z devin # add graph_execution_module config table for partitioned execution state + merkle tree time-travel debugging schemas/metaschema_modules_public/tables/db_preset_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/merkle_store_module/table] 2026-07-10T00:00:00Z devin # add db_preset_module config table for merkle-versioned db_preset catalog +schemas/metaschema_modules_public/tables/k8s_admission_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/merkle_store_module/table] 2026-08-13T00:00:00Z devin # add k8s_admission_module config table for merkle-versioned k8s admission policy catalogs schemas/metaschema_modules_public/tables/namespace_module/table [schemas/metaschema_modules_public/schema] 2026-05-21T02:00:00Z devin # add namespace_module config table for entity-aware namespace provisioning schemas/metaschema_modules_public/tables/function_module/table [schemas/metaschema_modules_public/schema] 2026-05-21T03:00:00Z devin # add function_module config table for entity-aware function definitions schemas/metaschema_modules_public/tables/function_invocation_module/table [schemas/metaschema_modules_public/schema] 2026-06-08T00:00:00Z devin # add function_invocation_module config table for entity-scoped invocations and execution logs @@ -66,7 +67,7 @@ schemas/metaschema_modules_public/tables/user_settings_module/table [schemas/met schemas/metaschema_modules_public/tables/i18n_module/table [schemas/metaschema_modules_public/schema] 2026-05-28T00:00:00Z devin # add i18n_module config table for internationalization settings schemas/metaschema_modules_public/tables/function_deployment_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/function_module/table schemas/metaschema_modules_public/tables/namespace_module/table] 2026-06-11T06:00:00Z devin # add function_deployment_module config table for function-to-namespace deployment binding -schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database [schemas/metaschema_modules_public/tables/function_module/table] 2026-06-11T08:00:00Z devin # enforce at most one platform-scope function_module (unambiguous resolveDatabaseId) +schemas/metaschema_modules_public/tables/function_module/constraints/one_platform_database [schemas/metaschema_modules_public/tables/function_module/table] 2026-06-11T08:00:00Z devin # enforce at most one platform-scope function_module (unambiguous resolvePlatformDatabaseId) schemas/metaschema_modules_public/tables/principal_auth_module/table [schemas/metaschema_modules_public/schema] 2026-06-24T11:15:00Z devin # add principal_auth_module config table for scoped API keys and agent principals schemas/metaschema_modules_public/tables/resource_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/namespace_module/table schemas/metaschema_modules_public/tables/merkle_store_module/table] 2026-07-02T00:00:00Z devin # add resource_module config table for unified K8s resource management (kind-based dispatch) schemas/metaschema_modules_public/tables/integration_providers_module/table [schemas/metaschema_modules_public/schema] 2026-07-11T17:30:00Z devin # add integration_providers_module config table for branded service integration definitions @@ -94,3 +95,7 @@ schemas/metaschema_modules_public/tables/data_capabilities_field/table [schemas/ schemas/metaschema_modules_public/tables/email_sender_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/site_surface_module/table] 2026-08-09T00:00:00Z devin # add scoped email sender module registration schemas/metaschema_modules_public/tables/oauth_requests_module/table [schemas/metaschema_modules_public/schema] 2026-08-09T06:00:00Z devin # add oauth requests module registration: in-flight OAuth state + pending identity links schemas/metaschema_modules_public/tables/content_preset_module/table [schemas/metaschema_modules_public/schema schemas/metaschema_modules_public/tables/merkle_store_module/table] 2026-08-09T08:00:00Z devin # add content_preset_module config table for the merkle-versioned seed-content catalog +schemas/metaschema_modules_public/tables/internal_config_module/table [schemas/metaschema_modules_public/schema] 2026-08-12T00:00:00Z devin # add internal_config_module for scope-aware plaintext config with no namespace dependency +schemas/metaschema_modules_public/tables/image_module/table [schemas/metaschema_modules_public/schema] 2026-08-15T00:00:00Z devin # add image_module config table for the central container image catalog + grants +schemas/metaschema_modules_public/tables/repository_module/table [schemas/metaschema_modules_public/schema] 2026-08-15T01:00:00Z devin # add repository_module config table (repositories, events, workflows, builds, local change requests) +schemas/metaschema_modules_public/tables/machine_module/table [schemas/metaschema_modules_public/schema] 2026-08-15T02:00:00Z devin # add machine_module config table (enrolled machines, sessions, command ledger) diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/image_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/image_module/table.sql new file mode 100644 index 000000000..ee5931dda --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/image_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/image_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.image_module; + +COMMIT; diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/internal_config_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/internal_config_module/table.sql new file mode 100644 index 000000000..341ab62fe --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/internal_config_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/internal_config_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.internal_config_module CASCADE; + +COMMIT; diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql new file mode 100644 index 000000000..b48f9e819 --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/k8s_admission_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.k8s_admission_module CASCADE; + +COMMIT; diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/machine_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/machine_module/table.sql new file mode 100644 index 000000000..9ea8835f6 --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/machine_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/machine_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.machine_module; + +COMMIT; diff --git a/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/repository_module/table.sql b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/repository_module/table.sql new file mode 100644 index 000000000..995117adf --- /dev/null +++ b/packages/metaschema-modules/revert/schemas/metaschema_modules_public/tables/repository_module/table.sql @@ -0,0 +1,7 @@ +-- Revert schemas/metaschema_modules_public/tables/repository_module/table from pg + +BEGIN; + +DROP TABLE IF EXISTS metaschema_modules_public.repository_module; + +COMMIT; diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.bundle.tar.gz b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.bundle.tar.gz index 7990c8955df2b2aa98820cf7c9a58691569e5179..df82f53d24d4e922ee5c1da52edccc48b2cf9512 100644 GIT binary patch literal 97182 zcmV)9K*hfwiwFP!000021MI!)lHAC7AnM=y6bSA*NLt;kyk98GVQPjWGt3!|NsjGZ zQPGjtZiv-D89Q8x^{LK;m0000Zr2HEIu<h!MmVzs-M#5ODN2;BQXwXOD#D%71Or%q?HJRmqL}CY>b#rX=&9t(#8L`?r~O z*^?L1AIcx2=t%`8|Md#w^&I5&bfzb<`E~W{eD+o&3Z*A5AeAJ}6wY2NV*)z){Ke{p zJ~L+b(;~fA)@Clx-Dva8irb-6S?ASkQe4M2A3jwQR>&m&v$NObZ`VF{6We=2ccAZJMQ@uz{0n zlQ|oBrzYdgIfiJ6?fi?DAJdK?Cz7;?eQe4-IsAN>sNs|7cruBTo3W-@aBA?G<WbHxZ>FiyP7Tw>hyB)u7~JKjxa#VAu1nM!i+vN7gbh{F-4vif?Kk04sr zjZ2E*N@MnE;;sXEgAuyP)bw_oN!-uQ%*s=GIJ2jj%iUl`eG>V#vUhPM?uW`eb?5S_ zGJ{#}XNehuP0M-W0vrmnCX47H*~5J>q#?85XW6;^byH zyAj0B_PVW9Ruv~j{_9{a24y-pzpkw+lva5^TQN>dJXMoX6rarH=`0(* zW5epZ$<{28F?6U6$=k@w+@#atPLt86uT>vLhfx*>E3>QH2^qw@dF-JXqkWX?&f}GCzWXkjI4^Ypzikt)|n#OrDl`pwo9i~u#<;=zp%l^@ec>b>2>D(zz{*;{`H1~c!ZF{b?%Z8OysmY=`;5q zGnW@*gfWVs>x^SSEY;4DwAi~5Ovubl(>yNHZ16h0Q|2~Kwh$_3`Qsw07~fQ}%_o3h zY?#2DIzlNEm??ss62JmRj736eLpX7OOHP624hk!UbdYoDsW)NXzl2$z1b0uE@o)3{ zq)=zlB%e3VcldcABMsa;Et0Zj|(6^0%`ru6^(^X&dQ`5J2n_z)L_r0PzBe z7XbXPD0mi==Y0MusecRu!19kPOmmQZVxrFEviM1sJ2tGFSdpUZe2SBsE;6zvhr8Eq>87Y` zK#eLN(;981>Kv)WMtWvGxlW&dPda&b!bo|5_x^~rxUA7>?-O+wn`mX`M&aFP`EL0! zyGZ?p?Dt-j(=MNM7jm^qT~cI~M>r~Ov$QCd-+NZ2ICXM`?Mm(jWzR)L zQ$EwV$>M4GB`>0hvo|igs8ldDQHgPV2(GPb>P0#3BGVec@3O%CTqRsBMl5%2w3dV2 z$>^@Bzv@MAr~SGGc9+iZ!ew|PTK~>bSu#=St+P&N_Wt^?J_L7D$(rC-#HQ7^{1PWN z{SqlX%S(;AaFwm}EH6}I)g(<^IZ;$j6el;Gj;Y3iwqDei8@u%hRRg<5a;dB+M>-q5 zdGq~hR5VF%Zn{~CO%->&XcZq&`!Br79p)~PFJD(LgeM^rS5;1}+srAOUqp8<52WUm;!&vlQ{E|~ zp`lQ<57nqsT(}1GF7fkZ@ykVur;WZZhpn&dPHNU}HSIC{n~iMUWLA4Yw~qEMm%jVm zkJTH|te7W6L}87j(?;{Q2G4fC%z{}g?57SZs~+?H;$!*t+%NpA1>1_u zxhUv?mqn(6WU)@qdI->(a)-05Jbnp5Cs*DU>UBm@0J*3VaBD-NdHq)hPBj;VpM_iE z65=l0szbj8$3BTXS`Le*=_EGy3+8o^ZuJ%LePuan@BP?~F_i@6ztM#`67ti^!J2egu|9T#+S zyMylJ^WY-r;?=ByUDCQ-zL#2=PtHa^{{F{k{$6L=YUw(BDyx zp3M?*$laue6`aeY2b(?-U)W>5p@a9ob+xjA?g*PDcC|<-44oC9#j4js98W%a@}&m8ct6 z?!;%G;>2EtRc0d_=TlXf+vgqim;Eh;`Y16Fet^7npmiS(yByJ(N~{a1DOs6gvo^Y? z4bq_lQU|Hj?CIg9h0=~cEkx3W*KF#trIWaKh2m&Ds3|Nw5)(Ec_2oj3Zc-hX(Ht2( z5>INwfjwE%xdm1S#xw;HkHnUm$YD>Wbnn^Kfh&yx$0M<&F3Q-GFP+@mdDPZ(QO+x{;0k>BEN~qmq5m zhW6X3sC~B=VJ{6{et_*GBcV3IEbzJ_II!m6iW-o-$v>56!aP63j zrXEk`Ps=RaiAvn_PMc`@02UBwElAaL8mXI`%-yH~OK5+S(>})m0$mao7XonM%3Ywb zb27|d2z?`dJ)P-K?tWSFvK-XOce>Mz^`!X}(Qpa3VmXE%plr?Zb;@h}wQ=Dtt0LN+ ztc);nk%87bG*;WPw);X8mw@(Nd84UdXyO)tmLJD~4H?8uYc0*-@o9p%>nssaD zQJU-Xa?n4`lh?Pl)|cDZ+|FNhiJ7Fi%Oj^2zjdLsuJ`XTw$(nJT9jsNdkM6O^TM3D ze^J`BS^A|kTxZiss%+H_H>zH=&P-JI^3#27jgNEWG&F_UZP>@y`q2Ih$l#V9rS?;gX&t=m0+bLZ^ke1aaSr2ATf z_gOXFl9216uVTdWB*Eb{m=ZBDs^!u@1BT6VF>4l&eC;NhlgDkC=sjMg*VBtKg|k3(@r6@|NqzNFbFKS{sj7m=RDlTg7iNljo$d294i z%ydyh>bk`DrN8~bxCwQO_)4F2%eV52MfZdJB7~XlLS95wG5h>uQg+6F5*9_4PS)<} zjwkMi#v8e>7Vj^v-L3>hc=^9ayRR>j!@{`}5C}5mx6#vmFFyU4ESgczg;E#+t_ZvW zPd_Hr``1%d+=k5>p8bzWtZkhAdUw{RACvHD!f1uZzHcJWmsW0by=yzFMnFK@vl}?zPxPwKNr^zEN(gPe)afL z6vfrNe_VeuN$;26uKX<|U<5exXBVp{`G17Z{N(a7`nG)5x_N(8q|vnO@AA7>zkmJ1 zZ^D0l^X}El53i#4-~7|7?_WlZGnDWC{@u$TK14sgfBE}Y(c2#mj)^|Jjl$_44sR12 z(ZA_8g}sZDN?S;?-+WA7zWMO#UG(j%?_U1&=0o)3yVw8v`pv7~zj`0NZZTg4|K*!E z0s4oRzkBoQeI1(P!Fd1bUw(S^!#BqU^W9HBeDmS;+aHb$W{qP<`zo6pI~tfxj%|VY zn0)j0`|n?W_|06rF81m2z7WKzCjD`VL`1ak~AKS@*1AJkcDuJwk zl52yV`43%KKMuUVZZ+QhDyO;<|e8+0(|Ep1ydIxtpcx`MjLt-P<>Be)sa5e{STMHCh9U zr9y}+NFZexK}3y}kYjHt#J~{hw8zW}>ph{$YOD~^Mrvi%F2~m9_EIQMnN|Q=rLcnx z3D2-*TstN?_uL|4t)K)O;f1Hrhjpr)<&NmJOLsyI%H}tibNa;R$0#SrY0i+7ogybY zM^1B+oa`()(P`2kC>bS)GY+U?z)?t@aX@QBfwTf>#5vP~7>2MBP$Nt!^vr0Ak;D)q zy4?2vZEf@SP*U4nfYhwSt_g&;3h{i%3Dw`0H&QLth*eo?);49_jb{P6Ze^uteY-prp@ z|3AlL`<;zRuakJPoOa%T@4EBA>i?_0!tFNWz;&H(v~beLTkiVFI--hg$0Y4 z@3Uo7$VJ6d#rWsd+aXP2HQ560(;yO`ZZW3*)h*c7-`~9b;r)kqFJJ%gA*8(d(Ae&~ zx9?uP{{0W-hkds837<#rUVZoKT_wHN7SMd*EQ6rW!mDq8h`xRG=GBK+(Kj#OfAjL& zR~I|*=GPcs_O)=5qBO05{hL+rr!09J_FLcFz#_ zACu?n!sYc3-@f|ys8NJmudSx**!~>m>m`XcBul`cCH&3rJPd^`vCsjFap3oXyz}jc zp|C56JK!=B4x6yclk!7(xJJcoybSLwQV&C4ojgjX(=^l(6=}uAJc^4b&ZFC^;O3dC z=9$NMLUB?En$Mk~aS=_^kjxyZ;`xix5B`tqA2zyE*{9$N&!aE5swiiwBdy}yRk4UA zT*paXsL7;z4;e!YNX-BwSXt$b&`2Y0k)~Q8 z2OR;HN+E@@f>R8nzy>;KC>79|GdL((YH7_5jNZytD~}I!#41XO_5v#HFi{R74TzD5 z0Z*Nvf?>iuhCm?95QWY{1uddVQ-aUn*=WhogPxD_wLOlHX2w=75i?PF-qIa{o%DcU z;tit^DQ6||+*@pc(cDWwDF%okO}SFQXu%DFTq5SE;gk@w&mE!-Wt>upt>% z7-T&Q({U|0VFXi+oUoWPtQauLG7mA=&hz%}kO69cD}{fLuHQw$@1xsyQ0P1B^36*8 zeto=+Dt6>0|4JN`doPbahkLRfp-1QBc+Sc2c+Td;6(PfE^OcpZ^SckCDb!WxP{mO=|D&zBGNGDl~Rll#V~MZ^jq##-UfIr>*sC5 zOouInN((QAlhSf4C=7X4T2V?Z6iR!qm9oYYg$(9Wc&0SM$WcrrmuK`@?q%i(9?Saq zyZb9CWr%AVeCE(=2AM?=E5S6kL{bKvV~SZtfIw0aE+ll^LO`vcifXbqeG5TMEftPq z$4oH42ryC;skO%(V1}J>-f2c1LQG>@lo_kcR4#@))3c|?tSh!?YmZdrdkL!-QaQgdUek{DXA z4TjozhP>xW66hH+)(}mUkpMX8DY6nH$-HI69m$8e-GTS(a$oNB7e1rsa;@F)gK%0_ zLrOdGx~umwn5=LA`PC2auiw4;{_VfMeDfkI(oZf~n<;a5>1Su7%lXzWbGV}<{SrXt z%QC__OXm2`+sAc9XE|BVfg6qXyUwwa4c)!5WqXgR5kY;bXeWPcNl|b8_QqVZ>2;`%z7G1uzFF4Z+s38*y)|i@Z$EuV z-s8;`U!&!1?TAsGy6by?7xboN7!LT5%qTJFBQ-YIxgiMZ__-x1#`Tgnijzi6YDLdq zk?VfpI&bxL7X{n%uiT<`5q6n*aJi+s@6t2621C^#r?flC^`~yd-+#vFCv6fYVrr zbcDVsgL;DAQgK>Q-QDWgq;|{2f51CRobZHMYB}SCac7iMiYjLiM}&D#ErrlQ>b)RX zaPO@5$T4R)kpQy?;A-Acw1<0{S5vl1ibWhT>^v42A}9sH09#KmQy~1pje(FFt(7)F zL9e7nL^A4#LKtvL&hKE}Vc~eb<<->P-O9#>0&@zGGFm{)Ee3)rg&9YhD^48*+8ECy zAxZ*@lmyCB1gYo9Xh8S5l_gNjW1t{1TqtFgkx~;3I3gTKC!zBSVl5~}##^bdAp$W? zoFzs$3dVOUukYfMdX&4`VLfc6K4#KD3#pfJ)NB=X@@9`|35{d~4X}SkGJVeEp+BXW za}EpVd^X5KGe1sedF*i_k7+@)3mc4XLG0{^maxaRAoi}4E;x;ZNLT1%SP)xsq8-)4 zEQqy`MZH=Eyc8I6042o;2<`zFnqUu^G=fkh4JXP2hKwheTH~~|S`sTbB!GaiQ=%6Q z)?)iLWrG_;taeFnNx&|66WC7fA-vEY_4EUaaQ zQ^Wxm4k!ybmp1&T;|L1onPJ8ustq2`K(E`!gAMePiMA67whdjiVYM(Uwd4d72!Jj> z7ZQvZrigP)VkMO_)}oNYr-{KFz>u^+Jo8X_0!G&xk~F&u7hgNOuvJ!_<-Zo~VIPg> z(IM(FI*KMy@A#PyFTpmC4ZX%=o0m`j@WTB-;Twe*J z0^~ z+{I@e1a~R+y77Ay*c)QEm0=~JmQ-NCCAQ9a0ksfbGbT6?N<%KBaGo#+HK&khODSSr zNyV+ljGZ&`dEitZVqVox+=iWyb0`56+)zt2VVW3+g~mc!W|+#hyY$DRI^d=dkpQAc&o|iYR9dV$KRf4OM_@ zN+G6%P+>U|dY{2X1@eRxw`7$udStNlp+G+?TkVq!8? zF%7P!Z9drSYEa#pl)-H+aG(0OPxISW`dVmvMK*I6Efu}$-8u!Yg>LtiSI(S5g*%n@ zc4Ect3~Jl{kk`@Gwv7eR0sa`U`@kJTby_Zzj{F`2_QpbOa2p}QoCKZ#t}yn_AcP?; zyYXPD5p|ME#FauUl=KRxtrtWi%rG|`U_Q3nsJxTzYm7A25Oxj+(FPiS> zy=Zle8}2&Wn6g>?Wk%e^$-VMC!{$|?sa1_lV= z>iU(h`H!(xR#6KX7CL+bZY1K`OC}`Lh=yCnw5G&(s|hn$Iwzq;7GQ+{)OI|7*_LR0 zY)A9hJo~Z5%!6w&GoF^Z-$^#AmU^&t%t%^lYY4-&)HW?)#?n#;w0~)@k2S>Oh~?n| zRw;!tmMAAMb1vMNDJ0dvGRLsQ2woWKJYB|rl zvWm^wC{IJf`FwU4?6J%#8_Y44M=HvTG;=oc$`qx26rQC%x>cDqsg0AH`D~R@w^rMC zvFVuV>=Eqh)@#yCR;oz(Y3AQ)Zc!G|I1Hn7b!IC z&(61MH16|*m)A96(CJ2tX7GD2j%$M5?H-9{;9WZ+NNPNANP3_Vz>p$BJcHN(Z#9w# z7_2oi8d;<*k!8(kHGLudN~_F?u z;MG{iJ;V23OLgQkyiH9q)ed?CrI*+N00BlydFGMRolDssO0)bb4-iB5mFo)Pv+{>B?)Ut~67}fvAC_}IU8Cpe;uMQ6|Dl9GS10l?K6>_a ze#9;9?ThGUl4>;xuLlksu$WJmJ5%z$6#Ny(Kf5f8ZCG1hZe0?Rb1zEz77Q&LH5Run zcQvj6XBUN!c}ZZkkQPWS&&v|$EsWP6&UsUL=eqg;y0^TYuj~10?+VXMRD9>`b>H!I z(Dx}UPxr!YGcup)ySSJSybho3I;1ccaoBFnLpS&8i^#gdWp{B>t%uMAXqJTyF>#;W zB=TvtktI;Z)f3~c77IL`?#ZDl(+sK=InA7pf4+)d&WiNXx-1S2L`y5Hnq$8I7wfZJ zweD_O++QtrMi}3UuvgWNo*Qy$7QK7(K6+LT2>(*k>19dWa__I+tbVvGQL@iBHuu(o z7(ZLg-o?pZXS&$t+T8`cy{AUa;@XfeyRf&!&tGwC-gTPSmt+min=5uy(Dm|a7l$T! z`q!PociPmw%ggAeB>sV$t(GBy0yT<+EzW1Fhs z^{fPTT@J2j-)n|!E0${#<|3M_VHNltU*;Czrp0pD6xzn2`5Zrl!k;GWe=dBGe{q z4gk~+z`+oJ7F;5T8L?D3O@yMtIpC-c_q8#M86;REX+uL^N4-Ig3WKd--fHZ@8QWOZ zdOZ3^QZ}b+!#V&FVHQFKfN+*`hLpxiQ0O#w#2Sn&7Rn&yaR^FD&oBZUa80c@ke=}Z z!&=r2kC<#u+dWExl;uuIWGIHlX-6F(fjt zR#AIn!{QB11&}7vVxkm)Ax=Vx<6MO6m6!q=D`yCjf>WW0myQDmc(^Zqv?$58L_T+9 zq)(=3laHp^LDStc)4l(7cW=r7M@%R0OE1SuKc7pjm*k*BV~^kAfD7RPN4HMtDL9Xl z;M|R^Pv;tVC|-ecWl5hQJ-V&&KBnD%D$BibX&l61u;sqJ{SQMNYPoN3!-Eiq^S3)+ zhg$9jJ93Y2xwpw!AJ1|hkh4C>Mm@TfT5k-9aPte-LJGi%hX6w?tV9ACVx5#+I7E-Ajs_7b~F9%$!o14ttsP5tZhT-iY7x&YiK-WjM zfmcSlyMo#n)Edh5Trl1B_=1fSw1<9^slISGhPHvI%x&yGmxx|x?u*K7SHR6Pw1Gdr zv#MMY`}0JqTRhvmS=@Aa>$*s9ZYHkN%hzR3zIG!HzdDZL*Q!L?jMmC zZkjKaq}~5+wT$N9)E>md+&c5=dTj|DK&4!t>+c_gu)DktEtAjbC)XZCSb%raS#W}> zsnYQzF5*KBEpD#Yw%c`npP2mv+|ScEbMxJKXiHpPMn9^oh)ZAGB=*kSn~95-xj5zT zWscA1is50im8Z^=I4NBASxr7ZX#xVHyEIvJbIM#1PV$AzZ}k$Y-pZfO4?K6LKDqj4 zlIUVn4H}e()trSjW)4=n46L#9uMTBjt@L5Lh=k6w@sugjuFb*bGk#ksHPQOoezE%3 zeaX%|Tzj2fmaDUh#3t@bbm#80%PMu~^0ET9(4kgJqn^c+;xbN_>eFw+VxPn&)M{p# zx?d?~Vc=ak-QqHdogMdwKh~v&g>RqD@*GL)>61xO!d zv*aefs<004=TVXtw{ddwn}wEr>!MjcQ2$sr(`0fV{onune*%8pft^HR1*KW+U3QqDk7V@68p&g9OuOb*-;VSRXe8$47#4r`=>ljbOR?_ z=l3Lhra>|^e{CD^t`*UMLY=iTIx_3l zMH3#Iw#$epY*-z;(6=m^u>sc^9}P&<8#<#Sv|*Jrp|WN5jEF?Dg|dswK6_})MS9Y_ z*9~5*bcs6Z*ENmtir?oQR@VJ+9lPOdy6_J4Y}|me?~8T^yw_enh{-y4`@r7N0}nv! z9NO6icQ7Y&3tp3K?*X~dsnrUHO}X9|{FY~{4dlT<+rz7sncbn*JDggjJ zYlFvN*zMu<=|i;zu}!zs4VVL9J!a#M+%0vTzgK$?g24&7o3NVY;ZXo>NxoyiINtR2 z6748J>V?)ZKn+gC4v}t#iIq}QW2q4^bd`k&J7}oK)>)u6K?qqKZoJZ#S?dYVL|{UU z(PwPVTN6Vb(42RDwl<7I+-ReL5r%3cwc=1iW4Q!ENF@}65K5t;pb zwZ_yrB>-mo(y+C`juQi@q7HLstrpT_BrrvQT5hHCTmUOoxJg)ILPIlP4!Og?D1iKk z&3QLZ;$KP@cGrM+muUBpKzF|=ch3NK=je9#z;>6Y_OO6<-)MHi_P_vk@91^Q zz;(;0b&HU7`*?N7V0GI_b%!u@#~5|%0Cnr=bl1>ym$-D-pme8*bmwq%w^(%BKyy zLxFaHH%>ULUfi~WJx(}m-@(%gkD;(Tz#AS8YjrKlNa3&{*Rl)@{G2fKbDH4K(ZfF{ z3ILrn1a#yeP{XB+7*ebdRgx$zu>z1V?WhOP0%I{!z+0#V(?%%?5OR)ctg({LLE|AB zxzceG-^E{LrDF|Y=cshtKx6c)ejZyRk9wKVS62BL@VY$KHA$FWC`Xr(tu4eWx*%kG)f~=5I1*<06`SpeN3j zz!oJ;%Zbak@&mn!UsVNAY8GY;T}3DBGu6iK45W1}!RE$`dGhmS#6|Xhu!* zizrFwo|bsgje4om9->H17rAK9@W~=FZ1GU(5YuDrD>EyEu zqu0QH^Y-PNSMR@h6;0Cg(`@>pEasVilK=bv{(lSUSN=Dc!_TUj0t>or;eS(E63U0> zUnP{g<*6?&OOA$0rP#-&EMUslS^cFNcJPzT-@6VU`_STepZcO2HvcjULh@ZP6>#h* zfmds^;}nm*>5tKyzM(#{PlaT(8hm*fy(w4FLJZUw7{*EY`}N|Gt=@ea<+p0;UM#2j z!+(A(?V^uQUPK?Cga}{2+T}%lJ$2c&RrepCg!t;6`Z>Hp0r<;Bbai$0$GT$0l_pZv z9L9M#)w27j2x+iIRUcTE1qSWf`80FYLRu!cuB!!e>Kdy9N9zB-Rw4L!?PNpy^;1_0 zp6=SqU0|DKj)lgC{je98ElcAV2<@5}jTqHgBga^-D{G-~t*#ps$3kJt7}<-HFmxY>QE`^7POt? zq6frXbN>L;W`Wcl`W`n*dn`smpfl_`0oWUZTHnqAJhnBo9!q=MYkL4<=WLB_fCr10 zx8QZnSJ;7fsC;)5-aZ-L9r#{XR(niFL7*etE$y#2=xu*-E9muSL|+^l{8n8s$;U#X zJtz7DYzv`Bp2#++7G=|$FbBYTESny;YzJ^PN7BGjd1f6zk_oIGVG2MdC?%3%53Dts zQUDPp+8Jd-Qk6y68*Qut6hO<6R_7~~uS-JeUn;*bTN}m^z_F$PFsXsZ*f?*j70g4U zAo5N*MlhDpNUIPA5;J9?utHJH1QPy?cb3&LZg{Eu#;n~-xc&hnzD=y%E%SW(fz{Yq+me9ztydVbFSQCoJ+@v_L%5+pXe*sIZoE?YE$!Ynh_ zG1sYMn$zLrr9DYW2UCjL(JQguO>>}o4#_-P-zW>FPgI=67UjGn6_2)0gKTm-EA;sn&R#^VL5&4G}jDHw$ z_y-n(KWg}We-Ztt;rD~3>!XL?YYvb@P)7{E?-5@euowq{?yyG*zwZ;82Uqpb@cWL6 zb_n9o@cZFr3FC&}54Q_AV)%XU5zqmXF%akqcWC&%K{0FxeWdXF-ovI7CizH6bl^m9 zfUO}655Ko*(=b-}eL$Oreu3swhMG?lY(8nY`S=0nqlcVN8+1NN*!fg}=hKFsPZoSW zR`|Ig(x-@Xk^xMxq{dh&A=DBg28l36a1I>sQadIcg5DUYrBId|;}x*T(UF^U%rE}C zji>WwFkfH0j=dzFqj5(ALL;~E=-sa3SZy7)$=;|i-6+!h1r-M#(Xn4!!O*bwx;axC z7x4b7h9=nU)#7Hr&H1TKP&=rt&0rt%N5{<{ZQ%6KG%x2V5tvgAsD;2#;-v6E5v+)D zQbTGHz`#?eF|ZzU0gYoEF@=HV-pKQ%dF?;E`X_uf%-iaE8Az;m%vdQ5V?s&6xy4La z$~^E;0ZP1mBq#j0+sh%oG{XLL;1lS~Di7)KHI?4%R4E2PcMg$> zv&X}COa*3u2d>Xi-Cz=1iY?R>Xoz?)bE%^MC={-7B8*@|k+TRYtpUPN3QvH-%q!uY zMq0R|nZ#eWHT;ka;m0GkKCfmC>x$gPFYX-Ob?CF=p zWqqO63~s&H9vc`AZ(z9dy!s$bZ4Q4-r?W{Z3iW+dqYy1sii-XlS6rvrjY{G_mrXar zyrBhPB~Isprh4bvFRBtYK`z&JDM0R2{^@$&=yZRV%JTEw0e;}dxe@Q0+ufKeg{x+Bu4`k%z&@lVpf$(-0R$Gh!2vWX1OCDH zBHgeK8VUuDwA^Y9l;--iQBm1#d%1hg*HqTjDFa90Nh@^r>L?@gXIGuNo+a^r%v|)- z53m2_r&k*q!@PiYQ8N4dKw3lZvW+@t@mYLB9cTF5OL7uL}{5NbDQwc6(xGI;6bdQ5~H zHxX`C>|q3YTY~UG8eW>Sp0dU=F^t@f4)`LLhT_6Sk9KGAs*~2SATrxu0~>WgOYH(@7kaN z92ek`0o6yMjsa=&*zT9+>xt#SVQUrQj!P!A7hGA$tz>`!0;I)`5Qrck7(nZlg3>X9 ztk8sO{t(i9kC5TpDY+LwjurA$Tdu8<+7qsTV~haI1az8mYB;r2LC7Hy)N-OQGC(>m zjV2Evx%Y^9z5P>qrI*5Mtu3=$YHEo`P(x=m^2$3Vq!AE8>@8)AXlOh(R4HSaLL~Gi z-J8-&f#b|!ZLQS|XiSWD-bo3Cg3vIay|)BXN3kc;Qi?T25J2Y?WyFbNr1bvc+C28l zBkG(&)FXGOQ`*qLe4*Z{LTyucdS~x+PuuB|vD33DU*4ySXZMjkQ)h;z-gM2n>6>oT zJ=3OdicR9$F5>xzZobllgG^q=)l2PCZYe!?|0xo-V!NVPrO(Kc(T}WiyPH#&EhM zhJy_#kDbKOv@|Mp^cctP_Lv8 zD2DG7u0M0Y{%j%p(**5L9JW70`1%Y1>=TBtPZ`8Mei*yq9ztahM8+6BhNZvV`VALS<*ahRU3&zR1 zU>v8}=hKU|)}EW}?tXt^-MH4k*ZPWpHmTh3?F zyXmZOSJ97YUfg8v{lC14Ch9&9nSEipX;jRnlPU%E`4|%C+68$XL zH6zbgv@a6#(l3{JKu^!iCs%}&z9PC!CpHgUc!tRHNKG=Q?0rDaB{q*{(*PwrW#svb z9nz!lXyTISzry5m4F0P^@)`U-{FpzF{wvZ&=3Er?^5w5k4e?<`|(f7YwoD<;(!lUnhw>FH3<*T5>Ft&uo(V<~c6#aep24R_2 zj9;IKE(hb)I05%el!T?eIni>$-^In3ICs&@AHMzd+jn6tgirVPzh&fk_^QpuxHeX5PRrGBdC20|5 zDlm1b@``?y&(vgcABL1WgZ}Dy^rzX~be?^F^^Q{qFJK6ccyUmHM#x##zF23?E7pLor-drYqiaSpqQn!K=h0ts3wQJ6uZXH}}t>*ph z=j&j0jjz^&Jya!LOKs$yAJkHpxvPLh>O&NZBgA>2Y)c! z$14WLt*or!a?87^hC&%w-2@q+P)jDc_ndhHfVP@ghz;ZpdPe{?9$N|}cU%D|kwe@V zM-9e;L43aIre=R@|MI4qIa`&8dC0u<7;1nlK)`DR33C)U%o!zG3!pfY#&8dvb69H% zg+wIW(!`07=c{jOX5#Pyr<%FDS2%fUDBz6R5UUUdX`!ft5DN^1gMvDx5wT2orGYV0 zSPh&9+&iGD=YsF6aI(N7?hQZ~b3r8oUH}1*l7uq{r13;jO##4yNePg`#v>`Tb`$}v zH5jkLsa8n;LQ0%Qy(;19MGsGKCnxYB_r>_78J&xOTASl7Eb(?mcnACYvG(C%*FGH6 zNv59_+ZxY5sl&&SD+uyC_bFkdjzAnBeb!M;x^fW$1sWq zTwBxM{5!4zSg%t9D>d}qV_~TF#8P9lunH(30Ta**MzO;}L!*IZ6ksSRFy2@v5rdwL zoEJ2`O%r#W%&J7{uP-sEnZ9#m2GwD6giB&inFO9gXtM@VTA z7=2S^^dpY0JufKp%#PTkRL-1g4hK-s#1*L#iTH=KijzNJ1W6WSfA$HzjBp`>} zSthA9Oc8F3c0}{gX6uacfIVy+9uTOTyhlVpJIS3i%z9*r0D^JAgw;+NM+oB{Lnb+9 zo(MyM6aXP2yyDU_ub2V*A_71#<(cJJN$H4E8W{^|Xl-Vk6H0rgDU#eV%n`FdY98hl zh!G8FXjC^^M4(=Xp7ajmKK}pCO^-(K{$K3ZpC7PC`Bc8vQ)$S*2ygibwc`C=)+1`g zTT7xP?4eM*!W&I1ZsT!0j#fOt=h#{Qt3OUDM&2prJ)s0@D72**a7shlPb@t47*Y+a zF|yQAxM7TYZmHwm3T^G!&cH=I>{sXqtRw9#F2GGh9t#5>3jfc|#|M0#&i`%f# z8NwJ6+=L5D8PLc>>W~q_b897GoO%pA1_XLN%*D4H7`hXOqphe9~J^K9+xi{|Lc?$~BYbkQo>v6^wqP}r_1UcJ~r zcAdVzu&-8w_Z<%x2OV`9F)}9Ahehh5_1l@#)3Kr3}jAw z!!7hsA&VG6q4R^VMlfX^bdFiBv>Y*Ua9b;SY$MRCjljT&Z~tI#|L|>}$n7Wr*nzRv zfdR?hvB*KO!=7Qo2hbj(?~3ku7x81ihsS;o4<=moFd|hCIY{-;;!_VPH1&(=Bl5s* zX*~CRy!~TOr-(cqY>F~|qoE zJ+#MXl*rSblc>wC871c-qxIaAd)T*Fo#K_Z-GM>RPmXk+W&J$-jVWj1> zv6kaSTN(l^gh5J#CE8iYJz$1FtT{zUX=Q=5NI9V}lAKs4m;)35tthjWc*(UJx#BCE ze2v9k+f<#S&TECkQA)f{*W4+0c^>41$y|Bij+%7O$ez#9eP9{y?|D7S+9fNq;5(7RyX_{j3R-kz?c70@EK#QSe zG2LS;tjdenxOQtCi+k4jxBy{5p1+-|Ha9~fCPxClzNL0yZ*I81?v7n2t3+sC?`v%c zg5P59wb)qliwxN{W`_PMg>7qgPM=QM+69IZm_a^6z$1O4@FZ<3T(&n4L8~ z2*#G}vU>e`pUgOH$*ijg`;Xb3%)MP4h5~L0ZBssU1hsXV?}O9B5ZwUPBKvWjhdrTe z=R6)r3la*0kSt}fBtV9n4-7S)at|@$P%$K=!%#x!6#@VW!!^;=GmbeBim~%$SM6xj z{rh^YrfSvA%Oj1s^NKQwtu<0AsGZWz880<6h*~TxVNN;=sP@)Sj*tw=Ab=r4&zDKH z!?NK$yjD|o@7yIF(HcT01fot-OPC-yv_eBlK}C^LMmXY-#|#pvJaj@?uY}V|07&~8`MR>J<=|8 z%q3J}&WHt1zXHTo1n9J^OS8M%h=56cpG%{(D&+bBjU>4e^#YHGFR8d}}p`nderl@JH z7AH5y>K!+JBem7%dAdX{`o(pcIbzmqSfMoncV}C4YcN~0tM=cyunVvKxm5?O+2yti zsl$m<2kNm5c-%7J9Uc!Y@gxdD?4-36C?^2sPBn#lqL|?r7-TF`8WU-tWgICc89~T# zPLOsul($KLK9^(@1BZJicV_PHpcK|KX@HT6JLbdv)`*1L8Wd8PBE*$J)?%(X#t`QuycyC=p`T9$Tj;M*8L<`y9<9=i*83)EG zOBe)JglkJ2b`WtWr1S!+a!2BX5QIu@opOR%3atWTC;2TMC10QETua(H4CgIG zj$}6XG(>x+-;I&`7s4plxhp~f+UXJimn1K4f^|Pn<80CPxp3KMHK{qiFo>+W&!4_{ zv3RMTh5L@c#j8&bGO@)h>!Y6T;po1p)O5OfeLa~kET~_c_u$OwcMmcpv2I1xR5;e| zic+Kxh|_Zux8t*o=Zg7r0%6M7ux_ z<+$xo+FsGEp|B?ZtX1f8-ZrQcxGFcYv@(APr_JJd>E8R@{rmNQzP5d{PDjM-n-zdf z9Je3r!?sB@j)7;G`~7_CIfgH{f2weM^rH^-qi%hRt6kyH&z(w@;(%+cv64;-rx6m) zso06AkIG`f-u7zoao(^+pj^>?Oj&DSa+mSGAJbj%^-9iITgloc2DnNE6giqcDITYQi9*fJ^HD!kCJEZd9iXw}McQ08rKu2srnS5$6Gw zP!d9v;sP6DJXMAR1C7>J1VG;SF&nMz9EB%M_Uw~+IWXC?uNB=r<8wUAxu4NIroB9d zsr>bOvCo&c`Oq?0&t(Un!2~|K0lYu9a5MwB;o}^}U}OWhV_M`f4B$2ilA{~I2U8`- zG=TTTdHQGW)|hSG?A~LfEw@9eqsiOV=pBS&7i;(EmR-H_%p_L|2`nXL&T-5*_X=?& z9HZ14gNYW_dxw#6R47fo#*_l%fJ9moa*V9k@>_hRNv}J!oh|2e4U>n_ufyG`cyfw( zSrwu(nd@=wt4mCFKP{Z?JTkbm-v0BeAKqWTd-eU>e|`DpMO37p-1@G~++7;3*1U|= zWKv3xC`rFm7bS1)`Bhr+tM~6;zy0C*``5pJ_wvK*w?DjCzFJ-oTO)y^>c-RZ_eDvKO5?A|@T%ThMmxhl zXVZ4WX48#f>8xlsE}a#t=xT92ReAm;&Fta9YcDS*$Xur>HeX*%;?wLV?J&#M`zvA+ zdtJJzLP=y;J*60EL09d##k7^L~ zXzY}{sbzd6jfOU~nL1C>rnWQkg{hk=QC)ZHZKY{A0*BP85{r=(DxYR9zDYumZbNx$ z)UX~?aM~rHY#Smy(t9_|m=-lg>(I7jK`)5gR!a-0JG-GD;9X1PFzjtX&g`4*L}Qf{_S-8R`GJHQ4sJUceL-6Qtc z5bMs>@nE((KTUdf=aOP^j+Ucp&d2mFE*9^$J0LfX)RD8ehJEFsnOg0jKV~m?1P9XU_JEKG6=D9L{lb}w%!P0Apn8}URnx)W+Mx}x^%{qdA!fwf%1fY?sK}hA9Ga?^n@7EXWXJA#K=D5 z?G4!m>L@OTxpYk0I_4FR0j*c=a38=&a5y#;P#UHQ#i2bKw9+X9BzM+0jvPhd zIs)n#)DU?9tYVy7uQjpUQO!fOnLI+yZT^+!+vX1<*Y-#~avor-)_kK&>n4iD{nT|% z>s%YO4|aJ2LU=ddX%ibgCSQFWooZ`wr*{d*+Q~UO=WDlZFf9Ji;1CecotnevC+L|27judX5zIj)g12DD)apj2Pnz6U>P< z1ZnDt^p-%Q8I}lAMzrG;U_mk37lq}9L5Z;OP8x;`M1XMsx#b9JK`kJJ3ZR6iLTm0J zGJr#Cg+N9Ug2rq!u_4}gsq~REDLSG_? zsmF$RNxZj48^D#pBRhz0W0$GS+}?kMPNI6+&fzH9#^eajqMo-AJn&&T;s7IIou$=Sh8a+=J zP5-0Ie<nWS1x!s~$p2X8!z-dBfN=Df>XVqD(SvDV{W z)b*0ng-N@HNSRS>GPn97`J%2=WyQ6#H?DiV^zPVw`p#xq>}sjz(}m*Q0d(!~_Rv?D zU*BXZDTdI#IYWCKN=vX53%1O0$r3f0y9~A$(0s|&<9Ja{^)|avN&M$BeQM!(cvg+O zEO&{0ez@1c#k}@(<-OS6?k^(i3YXo*N$D^NEmX`b3wvtfKD$Y|%+~!VrRO0r?rO0U z(&-j^>Q`>b#%bn!{PR`xa#p05)@5<1!z)eSYM!|mS;&nqw=Rj?-L$yBT5O{*zQfnZ z(@6jkfLA-_-JAE(RAsr#qDh*5noY|Ovb8@@6iuyJ-%~!q3)&&VO$C5 zYgI(W;!*MEUA`pgmtB$nO`7CIrh=#O7Z)$CX@RpP26f(EY9R`dMtMIo<+3n zi3s;u&s^<|*0u4iotc_H^FX&AQ z{9!D*rlQpVKUBWF1GC5d(luar?Xts=he3RdR*oC3+-C9B9w{<7hPemWQNc8A&3=JX z7|JV+rw9@1i1Z#xO|VdeDXImqEZh>wy(gj7ym#I@2({x#BS4Tt=6r$E2FKi?;OXn{ zqF4X^`u&IZ9eCb`k=QVE(?@`@`K-)QSR~N}|6?4ALcgXIw0#twBN440pN{EhN4X`W zd*xz%?P6_6KS@JUz@PFo(KV*SAO5)N@IK4kbvDT(ou(6~lHIq9Z0444m&W^i;y?Vc zX6pa^%WCRM6t%))nufH7mME94tSUqTf11)7&X{#@(!#;xnoY}y>Pn9H+;gwrSExVz zaq&~WOxn7budIvtqPZx0tu9wZniOfIDz;uluavosvh+)2RJhY}Aufx_{fp=sd_FgJ z7i%>nahBWR4}Y9z%{hI=Zth|g&XX%&c7tu5Hyuzup z8RLn&an+m^qP3HT3fwYEv>Xx@D!XyvVVDvxaV*oi7F32=7ysCgY`A#q&wsZXxj^?S z`hM|BmVU`g233%&6uDApEJU$M??QMkvav6d{6g2;#JDWUucDWeNmSfs&Mkk7ROX^| z8axteQhuE^&R_Mp_N#7@T$P9We4YGM*(7nmq)M#)n(C z%IMvKuH7U}ZbH=XYMDbh9y+V@WQ9!iHRoHl;)h#ojCoF48N^(j9KYGfP0Xs?!g<)X zjCQ&x+?!gVvY0vcQIZzRe6z`YMYJ80yft-hle(3*uza@_ZPljALnL{P%*B!q+iUIc zJROB4xFwC{WqPTfBetUVDrCEsvGTcWNUK!OXf|CVqD(DaGA_#E%f^Ot zcz4=a8z(o_KfjwzCLi3-#d{Y_n)#5)?B*hJg}HiO%2buCWbDT$LF&vYG-*<(I0>h~ zvJBxepE?s-RYuGH4@J3G-d9IPzB(|fFEc+TE}}bCnA*_N8iE zezte%m*`EIcK&{mg+AY!_pXRs66Ugtf|T`5e=&a;#YL4}ey57qsLA9$bYLyFNPtn7 zU%sX(l(3S^D&u^EHDUC4JeX@#D@88Ni<`{7|Ccw5d}Kf0wN;RBZ9T2+{)Ko;YD8cu z1?F4+R+aTIdHDR*LWrJKVZ((KcpjF{TnyAbn#V_0PZxWud>ZH1i?_oYa|3Ag(lWkM zV(rx=cjdUdI0^6jNvgJ|yi-3nJ<8mT`+3@gN@Cs5ZIOun@BjWk%cD+3x(I4oIm3dd z|37>0y5zQzt%?4hr$9J%1dH1&3inGnw5MfB?yhND(nxamnXq&!5}AoAj7We3fGU-H z`}~{-m`9u^IkEBrByJ=~f>kA%-VwW1AdtCo2~7I@kEntJp9N2|~_ry3qbVZG{R*I+-ejHOZQ5Kk>B(QmD)xs;6ho`D1=^oJ}

ot@mH}EFom#d|gpyI*&^XgBU+}ikiix!B9Gqx@+Ovjy73*q9!cmMBi==^v6Jh=M!{l9(q?vKgj;(~3T znO1K<$7$ART+9G(9Twz;UiM??dev6zto+v>;;cl3#Nw*qqa5+H6smt)6yU0qJPr5( z0rwC`E-E#wVe)`H9YEL0<<|P`V|5C!ty0SF>@{ElC!$Da8l7Lywcq&l0$K)!g~gbP z2xIFPb5jXyuoX31kd2Gcw4YE z4zxERr*x+~dEid`x9;1RZ4hW#HC)^&$1!{+HV1p9EvmD}tp_z3pFOEbF~=JCE%ikl5~4wBz)U zXH>0g#kK@&68r%@iG_41CzY~E{EUi@4-e-%D6IQL*wqU~OVhdEE zh_8&i-XSdWyj?c8W%fz&9`7 z{&M;5-Q_=CLZfeAzI*@n^7;GAf4uymCOCl{tPZ&@Pu5z*>%4%(&UFOgNz%enWswU` zKnry?pjL7y+YPW3@*;~@E4b*`iWIR=(=JV|Y18Xh!8$ieOPx}q?)Z0H!2(T+iLB+P zSF&mAkLIeqsI5FrS$Zw?uDLA-5QK0cRlClP%Y$62PVh}fcgaE_D9S^;)RAU2Z3@-Y zF0PN|V3{57ELJ=gwD$J8RlgCzG5T4CdSkbIX|r7KAwGdCjodLJD=y>c+)27>}Q$#RBp; z@|$$MAWRKr$}Dt5*veSk3Enn5?A`3!4TGl7W+_n68HhJE$SfR1xDyv)U<3PqS*I!C-RB!g@JBR8{yC-c4V2RryGIw zaG4bw{mo9Jva9I``nL1vsMI-y5l~Eu}ZZp;OJX2lEv%2$m)^rbVO$X>6=pIP{p{IvY zWDwgA9poE95Fy76T+4PX5{5bn3@>nPM-NLn%e3i6h;kUWEOzi^ybj!It&6nZw^Vx`)W$Z_{$5 z-2L-&?de$mDTN$3^-QSZ%DPhVWZW(#3Zvi`>#+_UCTterlC~_4iP~h~jFsZIdX=hQI-J(pG_#2}C z5qUElQt0R$5ytt4;=~TPMn`8wEv~B0kZxt`hA z`9C6KN;}Hts~ukJ5juL`uZaU&->wM+8{dA&l3l8j&=KWX*C9rQ(yD15U6HIc#pHml zC92k#tBtQXS(iol({Q>32gosc+9^u5Lyzym1Cy_zh2onCX>m(sm{_h@pQCi0m7j1g z{)NzGE8V+P=`O%w41SixFJ(wk&G>kRZ{h_38#lx&74c^ZhTsC_pK>Ku z60RcVqWbV1EAR?G&&4xXHuDyZrH0um*8wSWF6tQk<$j0=3KJ zGtF`q*H`kdlkC?CZBs2G+ythu5)`p3!y!I5Pqkc5cz%O2O3sDuz$*TV*b68EM1^g) zq~r1(cLFJ@#u*&?szSt_oAgVZv&iE&@>}?|W2V%*w+dlt=r(NprAQBbglTajht17E z)gbd3Q{}HwQAHD!(jL5ARyOUu)Fqwo!C=jNooPbPQ9{lMgcHiGgcg;QM6z)fq={9wemVMP=nrAgfG^6TSynR1bGV@Vj3lF;N3gd02SK32yBH zz7CMDG?bsmxo{R7<#_KmDjxZa-|9wcAM!)-{K`Z8(4hAY5(a|$l_Ycqy=%X$^MVJP zvV~KAn?~y9uEe%#mzU4R8BW7|s}6`gNh9S-lpzu<7(0iXlV;C>>;x?#f@afgSsicc zb)=57es(K^)y}~0Kht_|#-3~Er}F6Sa7))NhW;zGo9r5OD%rL12(o)_%YBGeue$DQ zm3i-3!pcv7pQ({a)eYW%^L7mO`|f*pr+I^Tz^j}Va3pgsz%>F-fd{o;=j^XoT>89z zz;u^;TkUd{rBMtrUQD#7yh6epj@oJ&(QWjv|ro=rw+XV!CpxmK*6ORTXBUdTX1^8cU1oX^o}5VVgZ^uFNFhTrX@oGW=X;2b&`UAU!B-$%QC5yY4=Tk^OLq$8R{fcG?I8y4{K0Y zBmYGczZ|e2wbvrY5^HBN?SH0a+L;W*ozApGJA3z%8^r;;g8wB<<<+ngX#FDGN#k-|Vg?&(83XJWNO)M{Vs7mli>GTXif(0C& za-YjxHq}BlhkudHUMApG%$F#GyN6i<5dkY;o@%v_g#!9vRqhc_W`*8Brr`uU;UVE# z%-UoAirSDGBjMmOwP^tJu2>^ywGpC4MiIHI@t>)$jF z<<-gU3r!vzOc<^Y6%ZlvUgV4FU||cV`r)DzI|6A5y>0dY*{3}=>~*eEq(reb`W0s) z0+V_y?9eQ@zfMN}DPHAWo{cnF+;Q(wx!h)28K=b^HgVJuy(Mh#S<1CFLXAqwwnSz8TV0kTs>2HpdVx*agO zbYAtn~6a~6Ifc5t+VsytPKSFV%eJO5TRJT%gFYghg+_vh-t7USVDx#nW zzS6!IlRoWUnHxm+^GbMch$<`_S4mc0eL9%7$DU!m`TJaZ1>X7< zVh|!Rkr|AYVld~C6Eum^48zUHtnvxX%Ou4WiZh{YX!$x8__ArHI}E$m8g(lGVpmJLo24~q?qq>C5}t5*JS z!dop~zODW$9B%;FRNJLCyGn>bzm-D)BqAy0;7j#HU*3&4lLelZh<0VtG+I!k4rPKl`UJR`BP!AYHUJ)BfA*%UAhK8ij=MO+@09QO9>o3|+5S-ZubkX*q?R zQ^XKTgi(^u2Zb0Ub^M=A5qd*h|67_H=D`E4Wu=((+O9gObgTU?1-J$yV3;RbnEJVC5(n9D8Vqi zyntBYTN+>Az>-Bo&Mo|YU$=5SGvrZT!1ZL2T`ph#C7aq`E?&V2pA~pr$XOQ-OJ-I2 z?>_@8`VWlqHf1h?ygOs2M}A}mEgrPcG-Q=fSE3ut5@CQ?oF)ks7I+~Pa4`_E4{vEXme4-ZmD12ym`#PmWO- z<1)HTLAVuYSd30V9Eo#4#6lStX#`Kp7(wWTNxiuYR-xoVbk@iQ5{!SsX_Q^Hje<`~ zYSeRkpL^^{({FK4dv9aHQEyhsBix~ldZfKpxIy5aO%eAXl+R57nR9Rs_U1K-_|jT< zYbh$gF`lh52qwz7O^%6GAbW5qI~kS4v03uRhJ`7}8-|Ffh4d~J+fcDqC!}FP+-N}j zn)YR9+S}K(ADdMHw{FNf;$EK-Zpd~S1(I)6JiY0tfOE5M9Jzf!;~t}tW}h_2N4Npn zHTkw~fd=T^eeHom5b<_HtQ(3o_b^Cuj|Rvlo@_v5GlwIx zH9^ugO9JH(<#Oze3xtD1B3FY~U;TKUEWpAiT=~KXwzzxrGC@7d`B5HpwT$PUl6U*C z^`eB2lZM$Ux>6Y1Kzn3~U{iJ~R>7H1M4VkAlH@vUOFuB8L|@Gp>+Y2|J*njafv!8g zVmG9@!>3?FNJ9TyG~;$vZa4N>7teQKOs`aN&unTY(I3d9rnzw^&*@jlz9y=`{jzWG zZ8;A6RDi@be|Cd{>;k*nT(+{K$69{io_*GH42SgENGjU1-)3skke(ZfAba-QOeYys zHq-Y^&m~UiM3EPUrX3i8L97VCCn=6dfGnL*L?g$JJQCr+2p!kA+`tS?Bd~q+aAh-l zAs)vlnb~f92s1rw7`jPy;zovpqsWOY8X||fj^R-Y>C|;?$8&t!(@993FvPw|T-|dG zYPptfK3uuXUS{rJDzml$XPw}Qvre$YSrb5T)&UkcYXJk!+Q5Ia9u&M;FT~xf56*7Z z16?=kfvKDIfVS;Y{Ilw|QxKZtT;c~W?6KyYqJxYn%rinf3(l81_N{2d#YYXt(~&z~DbcP&_~0_4dx4*h3wb)7&bFYOZh<%5 zjQzP4^m7Na&z)dC_d&xP2!lBc|8fxULvTn9+9Q;W?cwlH{IP++ zV*?S#9;jOF{h^FK2*B9RWo$bEx=z?!Cv2`0HrEN8>s!R;8UxtskziVVOK?^vB&!pW z)d|V!gk-fJlGO>s>I7o-RfAZa@T*SvRYzQKwG`A7#M24l=}|yDozR`Wa&)H?u+vuz z>~z9(I$=7Ex461O4o?6`CjcY`0O^E%^hmIe{%o*EC&Z(NL_9iy9UYtNU64R0G@uh2 z&dyVNTQ#m7LQ}rZ!wfA>b*n}{b!Of?9 zS|(068Nm+&uiO_QQIrzvQ2 zUtkTy2?0$r&BV-BzqDW%S{*AdU%um{zJ9AV!ARl`RUl=V5@u6}e~Y&og#CiDPqbJq z5Qel`2--U%Gy#9bBK}>dQ~zrXZV~WfOeM{$yDOZo6K?JV`)7-Fdf7{qW}k+?4M#{M zV)*4zbc>iR<&!iMpoHZWRLxUz1wV9yCDf(?Ts6fxA|#`E&Q9B3X!dDAA+_NK61~8B zKofEf>{^4I1+D-gWVM#{6@10IRCXR*v7$9@PmwsJbXLi=pL;@-F`ehk8qTJ9m9!l#|d6LQ9m@R>ZVr?Vl=t5ebjY^YCIA6~=O3konC zJ|sJ1Hgw!{CHCGko@@X!SdJL14g7@4D2`XOH0o6+=CayDbM3uoHRsEOa^oP2g6Ihj z_`XBxR>x$Y}CG&%XS>9<*85-{*EpYSV~Lj zEibY-xvpF8ndmkS0X4C&q~dSuB}yvhiI+Aq@#Xn*!9?vx&ct!(Q)JEx!c*F$)nC&{ zyS)(s{v~bYe$U4tr<7|;T0pjAncKHFX_e0^wpo4yE{O3LyDIUPXDbGuA-EBWEM2sw zX)X_h3$2XA;Y%74N^(ktS8;VW7e@pH!rwtMB1>7x(%Zaxr;5I-oz3bZ72S<9U`0GH z2mFE`%*szNW`!P3Gzh!xQ~QRZMR9{s20<2(y93?>m3+Ef6?gn@8D|JgW2hkZGfG)R z5_`;|^eD>k4dXD0bDXkJ8BX{rOUW7os!5s=n&mTXh3>#_l^>gEMN6oy_)cvGffMb& zy?g!YM~$R-4Ft}aM2O-G83|fM}9t^ zH+(bm`TUPRq=QfZ*D*CpdZuO#1xtkb4Qf|pHk29}jD~;CzGdU6V~4O|mIg=(43n_Y zPUj{54omM!GYI0mTck+jid{qWPp>$TN=ah0+o)gjD<}US;(;)=DzndGu!=Ic{?}Y6 zHv$5O$@{2?Svgab)uj1vX{6nxw>)XTY$fOJ&k#W2iUq4p>qx?xqSy}| zGV}H$u>_^+Q4L;I^6PTRvFKMU2jv)s+8@dnc!*%-;Su?+l}jeg;_DbB!gA0fExO90 zP~CshNWk-|+9Qz>`(vNU%ob8#FWWqNR&T=Q!aXK9|FS2vh~GRH25EY5*io*^s3#z7%& zS&Tqk#)}vPpwh+0H0v?klbxcQVsa`cfJ-_{v|=omu0@f`#{(+kj2*n6W3omIP0W~J zVQCO!BHq7PeiW1PxC8<=FD`;q0PmmA2-9_(`URNuF%2W&C#4RJ_z_1G{14(PR7XM6Sd>$}TWf7PzzL_4cm z8qzOlK!^4SZ4BwFahmSO+D0RTsxpL>8jk0fNOzFuIsu9F&>|isu0hAD+Wy;F%U?UIyJcrh zpX;pY1)WuH&RNqbGuz@PtW{Q+HN9}Nri*LV^kU7r{7$n@*U+r(6Ph)BL9?ctXKTrX z_AKpDGJ%G^<$JEjDkJ!wZhE2alE|<;>f0fKQ-GLW82Jd>T_W~Sxw&6HrypjoB z=i{)F2_1n3149-z#VWLe6#8Njc8ECGDbQeWD8Yajf(;J-z1;LeobfyQ;5Yi$M|P_> z{Ni0+?uIkG_mzzf?QREjm*;s$m-CLk=Hoe;AA^6H6$u!}y?pX4|A{=y_wQ8x8vV%+ z?n-{VUgSsOKz z+-K!#WeZGt&XhIGoo5>pGml&%d{9bgyKZ;24i59t9g+m9L;Ly(z9i2$coQ~{i> zI9eOhpe$z`#kf32=Gybh_5wSM6{=*~VFxF+YV2Sg4A=3Z5G5IK1{G&H+GN+3Z5Xjo zp)oM0cnJWR+~Ed=Sl9u9rIn}F;q6U~ZGt>eW( z+T_r*%<6+fI@^*cm)?S-C4L1qa};a?Q=P_xvir>N4w^NYF;Bg4l$k z`hvPCSLz{S*d>Ft`l`#dI0`xYXNHb6rMqN)j@j)|Gv2D2GYYh#pou^2_jT;xrT902 zJlX4kV8p0!Nl$8pikTCoB#*zwsg&>Wzos*Z4_YbNBUn7Z$5q@2WM_Es9M(9u1|=yov6ML5iuLP|#h{8(t?ZR*MJV<@^@>8h zR?9LBOIll{fxP2hI)whA=_{Q>8EG4R9ce3k8?`N$9mcHtu|5t@I@!_c_-Jg0iYJC4 zub1}vquCD!XN=VM!%it9Qt;Wqyi~>M4M}0xv1wHc=x=?0+t_~T5HyVJ$RQ!3CU$Jc zvRos?#4?FRBhS;3hrB4l)HQVYA@U5 zZkYzb*gyddJjBmc*TIqJV%rTZ8`H>eUC17C4UYsNH4TrL zrms8L)luY-P3Z-WLoI@cZMnWp9mlXR%UZIrk8GDldKgj?dA4r&ksZ;%^P?~#j_#SJ zfnCQpj*wn3G^?O5*uUQ<*_nv2TZX}gDE-aGxW^r6zN>-kL2P3WXBIoiD0Z@kJq~-= z{hGq=)e82t8o(Z(?d##pUiWVCIvKl8#;!(e-q&X5dN>o;$-1?#b?ao<8qu(|uTAS% z7Oi93wC=~M)vboR#P={pp5u8=;QFp_g}UiFrmct6h$0U;0SS@gxY+Y;)1(H8jEGpo zM0VtRmU*;-4ypkC*rL83O|Vx7mmWIuYm9)ey7shZ^w&Qjvxwc5vN1~dk5xa1g@A#i zDUzSpaFwB4UXqY`z~$;HMhl8TqXY`L@)E|194YWd_yf_S+R;my{=^XYeYAqG zyN)|i%3=I5NP}mqvUCxO3Yt|DH&v~daK+ZGRK0a8-X&<2-=sxHDi1QP^?0Jm)Gb%3%*_5&t)ZGBO5H}g zTB3Fj6syrEY;rw>?QWdwCg-5y0ktEna@K+1nyaE+wA-!$ zk|NaXA~OwX3B8p|IIa{P2)Y!Bn9^Rw&#MmeotpCqa%WuR++d~M#CefIVNA4Gq_?cX zZzU}jDHt;{dM-D~OkMgswX-a2DS0o7-m@y{klliij7C6N?@;9h8fqwm3Al ztc!~Ah^XC5J;6Ig$E`LV1w+EnXj2t!%BR2O2M7ID9-SFdu{G7dp-F{@g~Y|nRn z7jHeY^Nto;M)P#>c}$+l3s(-IahdbGsc&s*;)=eg>=vx-DJM2BP{xvO)!X|5l6WDd zsl2S1qO45Qg_f@wY66&e?n*otGS~Pue^KRIiznI{ASKkU{ONccs*4g8qu{Z&1cSge zmHq)iPdBsJWQsblg6(lGJ{gbPN(@ng9fyfI%9kqe6daX-TT>6agt`*+E|9~3#|B1Eb0xgqgrNOht+ zo}q`X>sg*l?a*kbNyjc)T1u3 zQAmgz>Lzxg(6EW;MtWpM$RkeZ7;fMY8d0PZn-GK|6MF=~|LKwc7%*eI`PPh{g21Vo zjiwg;GOO$)GjYk!>XONx zU8j~|6Vr(z2O%8krsW}*z}_S_F_7*NBQ!jG4Aj;7IWjCpYJ>f5Q=C-8zBbT+HkRG2 z%V0LpqP5w`w8^^k5K&hf3`yhJk9Lcu>arajDV}RQi_ytg^r($RkH=2*kS3x>VjcRr z4MQiJ&~}^9*I^DiS%SJOK_?@SVg&jM>_3mn^fQ9h=izKV4`=ncU%O9Fk{lwD8F+?E zOe28QHz?p?=#d!`j~K+GPC#9k8id-qZet6~7_J+lP>-;o2gb;;MIei!Ybt&{LQK(v z#RGMX?BF<{Jpy>@bnFYM>f7#B-q$TF`76CqgJ=^-5s<^1$R$u@*drO$349)qZ&^r;zQ7C0&Lb`i-NL$4Nn9 zAEI(nxqSq}mmBYjOpv)eRMJ%+YFmx7+A5<_{AI2^TNmj$gDsXp+q@02v}E^eJuo@E z8pCUGj8xh}WdLamJeT3yuoQU@a(^>A`uIO-;HO3L^*ZB%x#YM^PtnfUr%&PVDi0`) zXK{d}3VlxJO1LFWcxn{^Q%*)12zNaqk~MwDBJsg?vsx|guH>B|`>$Gr$_`-O;z>Ik z=pT+v(Tae+zbN0=8rb&F*2T^5FWE8pOF73}Rf1zKUeIf9w#z9uTAgG1$4qy9U+6C0m3@d^GsW7}pXw`Y^< z2;Ks{X9em~BJLisV&sC$KgFxOGLgvH<~s`(6Lj}O*>F$6Aeb|$IPr{1k=*p8WQw@p z%H>$HpqpEKg2ZTnnzui{6H5>NLaWs|KLf-M3JuO zIWUoDK#5yDQO`(bW?}4q!e&F<#Is7-4DZSY+n0zqYD&qeJbCjuqxqQ!(g?0wH2vFMK z30keDtQBAo%ZeL*~WZ2z5lTu)q)Jq-dt8K{QCB1?d+F0xqLm--kLM*#cS=|3XZFp z_Sfg{W*RNbO54)cik%At?`>;gCbb};E(%XcUzWDX+&jLbwragc0 zN|e)@D*J{o;P_#K74l*A-5p%3lVzO5DJy+v!T-O;`GgNoy$4>ueJ5rF%0Dp8PMMhQ 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 literal 87600 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%0D3xivn)=EU<-|txHOphG`ms7 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 PI{y6sN>~ud0Ne`zaMaHb diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql index 9ddc694e9..619e4ede3 100644 --- a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql +++ b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql @@ -65,6 +65,8 @@ CREATE INDEX connected_accounts_module_private_schema_id_idx ON metaschema_modul CREATE INDEX connected_accounts_module_schema_id_idx ON metaschema_modules_public.connected_accounts_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.connected_accounts_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.crypto_addresses_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -108,6 +110,8 @@ CREATE INDEX crypto_addresses_module_private_schema_id_idx ON metaschema_modules CREATE INDEX crypto_addresses_module_schema_id_idx ON metaschema_modules_public.crypto_addresses_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.crypto_addresses_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.crypto_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -259,6 +263,8 @@ CREATE INDEX emails_module_private_schema_id_idx ON metaschema_modules_public.em CREATE INDEX emails_module_schema_id_idx ON metaschema_modules_public.emails_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.emails_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.config_secrets_user_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -358,6 +364,10 @@ CREATE INDEX invites_module_private_schema_id_idx ON metaschema_modules_public.i CREATE INDEX invites_module_schema_id_idx ON metaschema_modules_public.invites_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.invites_module.claimed_invites_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.invites_module.invites_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.events_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -482,6 +492,20 @@ CREATE INDEX events_module_private_schema_id_idx ON metaschema_modules_public.ev CREATE INDEX events_module_schema_id_idx ON metaschema_modules_public.events_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.events_module.achievement_rewards_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.event_aggregates_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.event_types_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.level_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.level_requirements_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.events_module.levels_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.limits_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -625,6 +649,30 @@ CREATE INDEX limits_module_private_schema_id_idx ON metaschema_modules_public.li CREATE INDEX limits_module_schema_id_idx ON metaschema_modules_public.limits_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.limits_module.aggregate_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_code_items_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_codes_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.credit_redemptions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.default_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_caps_defaults_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_caps_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_credits_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_warning_state_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.limit_warnings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.limits_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.membership_types_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -651,6 +699,8 @@ CREATE INDEX membership_types_module_table_id_idx ON metaschema_modules_public.m CREATE INDEX membership_types_module_schema_id_idx ON metaschema_modules_public.membership_types_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.membership_types_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.memberships_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -792,6 +842,26 @@ CREATE INDEX memberships_module_schema_id_idx ON metaschema_modules_public.membe CREATE INDEX memberships_module_entity_table_owner_id_idx ON metaschema_modules_public.memberships_module (entity_table_owner_id); +COMMENT ON COLUMN metaschema_modules_public.memberships_module.admin_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.capability_default_capabilities_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.capability_default_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.member_profiles_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.membership_defaults_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.membership_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.memberships_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.owner_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.memberships_module.sprt_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.capabilities_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -859,6 +929,10 @@ CREATE INDEX capabilities_module_private_schema_id_idx ON metaschema_modules_pub CREATE INDEX capabilities_module_schema_id_idx ON metaschema_modules_public.capabilities_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.capabilities_module.default_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.capabilities_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.phone_numbers_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -901,6 +975,8 @@ CREATE INDEX phone_numbers_module_private_schema_id_idx ON metaschema_modules_pu CREATE INDEX phone_numbers_module_schema_id_idx ON metaschema_modules_public.phone_numbers_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.phone_numbers_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.profiles_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1009,6 +1085,18 @@ CREATE INDEX profiles_module_private_schema_id_idx ON metaschema_modules_public. CREATE INDEX profiles_module_schema_id_idx ON metaschema_modules_public.profiles_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.profiles_module.membership_profiles_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_capabilities_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_definition_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.profiles_module.profile_templates_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.profiles_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.rls_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1096,6 +1184,8 @@ CREATE INDEX user_state_module_table_id_idx ON metaschema_modules_public.user_st CREATE INDEX user_state_module_schema_id_idx ON metaschema_modules_public.user_state_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.user_state_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.sessions_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1152,6 +1242,8 @@ COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_publi COMMENT ON CONSTRAINT auth_settings_table_fkey ON metaschema_modules_public.sessions_module IS '@fieldName authSettingsTableByAuthSettingsTableId'; +COMMENT ON COLUMN metaschema_modules_public.sessions_module.sessions_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.user_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1243,6 +1335,8 @@ COMMENT ON CONSTRAINT sessions_table_fkey ON metaschema_modules_public.user_auth COMMENT ON CONSTRAINT session_credentials_table_fkey ON metaschema_modules_public.user_auth_module IS '@behavior -*'; +COMMENT ON COLUMN metaschema_modules_public.user_auth_module.audits_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.users_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1279,6 +1373,10 @@ CREATE INDEX users_module_type_table_id_idx ON metaschema_modules_public.users_m CREATE INDEX users_module_schema_id_idx ON metaschema_modules_public.users_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.users_module.table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.users_module.type_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.hierarchy_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1353,6 +1451,12 @@ CREATE INDEX hierarchy_module_private_schema_id_idx ON metaschema_modules_public CREATE INDEX hierarchy_module_schema_id_idx ON metaschema_modules_public.hierarchy_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.chart_edge_grants_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.chart_edges_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.hierarchy_module.hierarchy_sprt_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.secure_table_provision ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -1793,7 +1897,7 @@ CREATE TABLE metaschema_modules_public.storage_module ( confirm_upload_delay interval NOT NULL DEFAULT '30 seconds', file_events_table_id uuid NULL DEFAULT NULL, default_capabilities text[] DEFAULT NULL, - api_name text DEFAULT NULL, + api_name text DEFAULT 'storage', private_api_name text DEFAULT NULL, CONSTRAINT db_fkey FOREIGN KEY(database_id) @@ -1845,6 +1949,14 @@ CREATE INDEX storage_module_private_schema_id_idx ON metaschema_modules_public.s CREATE INDEX storage_module_schema_id_idx ON metaschema_modules_public.storage_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.storage_module.buckets_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.storage_module.file_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.storage_module.files_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.storage_module.path_shares_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.entity_type_provision ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2147,6 +2259,12 @@ CREATE INDEX rate_limits_module_rate_limits_table_id_idx ON metaschema_modules_p CREATE INDEX rate_limits_module_schema_id_idx ON metaschema_modules_public.rate_limits_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.ip_rate_limits_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.rate_limit_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.rate_limits_module.rate_limits_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.devices_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2185,6 +2303,10 @@ CREATE INDEX devices_module_user_devices_table_id_idx ON metaschema_modules_publ CREATE INDEX devices_module_schema_id_idx ON metaschema_modules_public.devices_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.devices_module.device_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.devices_module.user_devices_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.session_secrets_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2222,6 +2344,8 @@ COMMENT ON TABLE metaschema_modules_public.session_secrets_module IS 'Config row COMMENT ON COLUMN metaschema_modules_public.session_secrets_module.sessions_table_id IS 'Resolved reference to sessions_module.sessions_table_name, used to FK session_secrets.session_id with ON DELETE CASCADE.'; +COMMENT ON COLUMN metaschema_modules_public.session_secrets_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.webauthn_credentials_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2268,6 +2392,8 @@ COMMENT ON TABLE metaschema_modules_public.webauthn_credentials_module IS 'Confi COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER helpers which write to webauthn_credentials (registration / counter-bump / delete).'; +COMMENT ON COLUMN metaschema_modules_public.webauthn_credentials_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.webauthn_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2394,6 +2520,8 @@ COMMENT ON TABLE metaschema_modules_public.identity_providers_module IS 'Entity- COMMENT ON COLUMN metaschema_modules_public.identity_providers_module.private_schema_id IS 'Private schema that hosts SECURITY DEFINER admin helpers which write to identity_providers (create / update / enable / disable / rotate-secret / delete) and the per-app quota check.'; +COMMENT ON COLUMN metaschema_modules_public.identity_providers_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.notifications_module ( id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), database_id uuid NOT NULL, @@ -2524,6 +2652,18 @@ CREATE INDEX notifications_module_private_schema_id_idx ON metaschema_modules_pu CREATE INDEX notifications_module_schema_id_idx ON metaschema_modules_public.notifications_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.notifications_module.channels_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.notifications_module.delivery_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.notifications_module.notifications_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.notifications_module.preferences_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.notifications_module.read_state_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.notifications_module.suppressions_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.plans_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2602,6 +2742,18 @@ CREATE INDEX plans_module_private_schema_id_idx ON metaschema_modules_public.pla CREATE INDEX plans_module_schema_id_idx ON metaschema_modules_public.plans_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_caps_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_limits_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_meter_limits_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_overrides_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.plans_module.plan_pricing_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.plans_module.plans_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.billing_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2693,6 +2845,20 @@ CREATE INDEX billing_module_private_schema_id_idx ON metaschema_modules_public.b CREATE INDEX billing_module_schema_id_idx ON metaschema_modules_public.billing_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.billing_module.balances_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.ledger_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_credits_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_defaults_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.meter_sources_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.meters_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_module.plan_subscriptions_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.billing_provider_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2804,6 +2970,20 @@ CREATE INDEX billing_provider_module_private_schema_id_idx ON metaschema_modules CREATE INDEX billing_provider_module_schema_id_idx ON metaschema_modules_public.billing_provider_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_customers_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_invoices_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_prices_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_products_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_refunds_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_subscriptions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.billing_provider_module.billing_webhook_events_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.realtime_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2863,6 +3043,12 @@ CREATE INDEX realtime_module_listener_node_table_id_idx ON metaschema_modules_pu CREATE INDEX realtime_module_source_registry_table_id_idx ON metaschema_modules_public.realtime_module (source_registry_table_id); +COMMENT ON COLUMN metaschema_modules_public.realtime_module.change_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.realtime_module.listener_node_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.realtime_module.source_registry_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.rate_limit_meters_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2925,6 +3111,12 @@ CREATE INDEX rate_limit_meters_module_private_schema_id_idx ON metaschema_module CREATE INDEX rate_limit_meters_module_schema_id_idx ON metaschema_modules_public.rate_limit_meters_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_limit_overrides_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_limit_state_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.rate_limit_meters_module.rate_window_limits_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.inference_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -2978,6 +3170,10 @@ CREATE INDEX inference_log_module_private_schema_id_idx ON metaschema_modules_pu CREATE INDEX inference_log_module_schema_id_idx ON metaschema_modules_public.inference_log_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.inference_log_module.inference_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.inference_log_module.usage_summary_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.compute_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3031,6 +3227,10 @@ CREATE INDEX compute_log_module_private_schema_id_idx ON metaschema_modules_publ CREATE INDEX compute_log_module_schema_id_idx ON metaschema_modules_public.compute_log_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.compute_log_module.compute_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.compute_log_module.usage_summary_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.transfer_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3084,6 +3284,10 @@ CREATE INDEX transfer_log_module_private_schema_id_idx ON metaschema_modules_pub CREATE INDEX transfer_log_module_schema_id_idx ON metaschema_modules_public.transfer_log_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.transfer_log_module.transfer_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.transfer_log_module.usage_summary_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.storage_log_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3137,6 +3341,10 @@ CREATE INDEX storage_log_module_private_schema_id_idx ON metaschema_modules_publ CREATE INDEX storage_log_module_schema_id_idx ON metaschema_modules_public.storage_log_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.storage_log_module.storage_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.storage_log_module.usage_summary_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.db_usage_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3209,6 +3417,14 @@ CREATE INDEX db_usage_module_private_schema_id_idx ON metaschema_modules_public. CREATE INDEX db_usage_module_schema_id_idx ON metaschema_modules_public.db_usage_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.query_stats_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.query_stats_summary_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.table_stats_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.db_usage_module.table_stats_summary_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.agent_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3225,6 +3441,9 @@ CREATE TABLE metaschema_modules_public.agent_module ( agent_table_id uuid DEFAULT NULL, persona_table_id uuid DEFAULT NULL, resource_table_id uuid DEFAULT NULL, + run_table_id uuid DEFAULT NULL, + event_table_id uuid DEFAULT NULL, + workspace_table_id uuid DEFAULT NULL, thread_table_name text NOT NULL DEFAULT 'agent_thread', message_table_name text NOT NULL DEFAULT 'agent_message', task_table_name text NOT NULL DEFAULT 'agent_task', @@ -3233,9 +3452,14 @@ CREATE TABLE metaschema_modules_public.agent_module ( agent_table_name text NOT NULL DEFAULT 'agent', persona_table_name text NOT NULL DEFAULT 'agent_persona', resource_table_name text NOT NULL DEFAULT 'agent_resource', + run_table_name text NOT NULL DEFAULT 'agent_run', + event_table_name text NOT NULL DEFAULT 'agent_event', + workspace_table_name text NOT NULL DEFAULT 'agent_run_workspace', has_plans boolean NOT NULL DEFAULT false, has_resources boolean NOT NULL DEFAULT false, has_agents boolean NOT NULL DEFAULT false, + has_runs boolean NOT NULL DEFAULT false, + has_attachments boolean NOT NULL DEFAULT false, shared boolean NOT NULL DEFAULT false, api_name text DEFAULT 'agent', private_api_name text DEFAULT NULL, @@ -3290,6 +3514,18 @@ CREATE TABLE metaschema_modules_public.agent_module ( FOREIGN KEY(resource_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT agent_module_run_table_fkey + FOREIGN KEY(run_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT agent_module_event_table_fkey + FOREIGN KEY(event_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT agent_module_workspace_table_fkey + FOREIGN KEY(workspace_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT agent_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) @@ -3312,6 +3548,12 @@ CREATE INDEX agent_module_prompts_table_id_idx ON metaschema_modules_public.agen CREATE INDEX agent_module_resource_table_id_idx ON metaschema_modules_public.agent_module (resource_table_id); +CREATE INDEX agent_module_run_table_id_idx ON metaschema_modules_public.agent_module (run_table_id); + +CREATE INDEX agent_module_event_table_id_idx ON metaschema_modules_public.agent_module (event_table_id); + +CREATE INDEX agent_module_workspace_table_id_idx ON metaschema_modules_public.agent_module (workspace_table_id); + CREATE INDEX agent_module_task_table_id_idx ON metaschema_modules_public.agent_module (task_table_id); CREATE INDEX agent_module_thread_table_id_idx ON metaschema_modules_public.agent_module (thread_table_id); @@ -3320,6 +3562,28 @@ CREATE INDEX agent_module_private_schema_id_idx ON metaschema_modules_public.age CREATE INDEX agent_module_schema_id_idx ON metaschema_modules_public.agent_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.agent_module.agent_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.message_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.persona_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.plan_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.prompts_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.resource_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.task_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.thread_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.run_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.event_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.agent_module.workspace_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.merkle_store_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3336,6 +3600,7 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( api_name text, private_api_name text, scope text NOT NULL, + entity_table_id uuid NULL, function_prefix text DEFAULT NULL, capability_key text DEFAULT NULL, created_at timestamptz NOT NULL DEFAULT now(), @@ -3367,6 +3632,10 @@ CREATE TABLE metaschema_modules_public.merkle_store_module ( FOREIGN KEY(ref_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT merkle_store_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT merkle_store_module_database_prefix_unique UNIQUE (database_id, prefix) ); @@ -3383,6 +3652,16 @@ CREATE INDEX merkle_store_module_store_table_id_idx ON metaschema_modules_public CREATE INDEX merkle_store_module_schema_id_idx ON metaschema_modules_public.merkle_store_module (schema_id); +CREATE INDEX merkle_store_module_entity_table_id_idx ON metaschema_modules_public.merkle_store_module (entity_table_id); + +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.commit_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.object_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.ref_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.merkle_store_module.store_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.graph_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3440,6 +3719,8 @@ CREATE INDEX graph_module_public_schema_id_idx ON metaschema_modules_public.grap CREATE INDEX graph_module_merkle_store_module_id_idx ON metaschema_modules_public.graph_module (merkle_store_module_id); +COMMENT ON COLUMN metaschema_modules_public.graph_module.graphs_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.graph_execution_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3514,6 +3795,12 @@ CREATE INDEX graph_execution_module_schema_id_idx ON metaschema_modules_public.g CREATE INDEX graph_execution_module_graph_module_id_idx ON metaschema_modules_public.graph_execution_module (graph_module_id); +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.executions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.node_states_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.graph_execution_module.outputs_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.db_preset_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3570,6 +3857,77 @@ CREATE INDEX db_preset_module_public_schema_id_idx ON metaschema_modules_public. CREATE INDEX db_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.db_preset_module (merkle_store_module_id); +COMMENT ON COLUMN metaschema_modules_public.db_preset_module.db_presets_table_id IS '@module_table'; + +CREATE TABLE metaschema_modules_public.k8s_admission_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + public_schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + scope text NOT NULL, + prefix text NOT NULL, + merkle_store_module_id uuid NOT NULL, + k8s_resource_kinds_table_id uuid NOT NULL DEFAULT uuid_nil(), + k8s_spec_rules_table_id uuid NOT NULL DEFAULT uuid_nil(), + store_name text NOT NULL, + api_name text, + private_api_name text, + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + created_at timestamptz NOT NULL DEFAULT now(), + CONSTRAINT db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT public_schema_fkey + FOREIGN KEY(public_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT merkle_store_fkey + FOREIGN KEY(merkle_store_module_id) + REFERENCES metaschema_modules_public.merkle_store_module (id) + ON DELETE CASCADE, + CONSTRAINT k8s_resource_kinds_table_fkey + FOREIGN KEY(k8s_resource_kinds_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT k8s_spec_rules_table_fkey + FOREIGN KEY(k8s_spec_rules_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT k8s_admission_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT k8s_admission_module_database_merkle_unique + UNIQUE (database_id, merkle_store_module_id) +); + +CREATE INDEX k8s_admission_module_entity_table_id_idx ON metaschema_modules_public.k8s_admission_module (entity_table_id); + +CREATE INDEX k8s_admission_module_k8s_resource_kinds_table_id_idx ON metaschema_modules_public.k8s_admission_module (k8s_resource_kinds_table_id); + +CREATE INDEX k8s_admission_module_k8s_spec_rules_table_id_idx ON metaschema_modules_public.k8s_admission_module (k8s_spec_rules_table_id); + +CREATE INDEX k8s_admission_module_private_schema_id_idx ON metaschema_modules_public.k8s_admission_module (private_schema_id); + +CREATE INDEX k8s_admission_module_public_schema_id_idx ON metaschema_modules_public.k8s_admission_module (public_schema_id); + +CREATE INDEX k8s_admission_module_merkle_store_module_id_idx ON metaschema_modules_public.k8s_admission_module (merkle_store_module_id); + +COMMENT ON TABLE metaschema_modules_public.k8s_admission_module IS 'Provisions the platform-managed Kubernetes admission catalogs: a kinds table and a spec-rules table, Merkle-versioned through the referenced merkle_store_module, whose rows the generated admission gate on resources/resource_definitions reads. Writes are platform-admin and human-only; every scope reads the one catalog.'; + +COMMENT ON COLUMN metaschema_modules_public.k8s_admission_module.k8s_resource_kinds_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.k8s_admission_module.k8s_spec_rules_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.namespace_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3628,6 +3986,10 @@ CREATE INDEX namespace_module_private_schema_id_idx ON metaschema_modules_public CREATE INDEX namespace_module_schema_id_idx ON metaschema_modules_public.namespace_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.namespace_module.namespace_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.namespace_module.namespaces_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.function_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3701,6 +4063,14 @@ CREATE INDEX function_module_private_schema_id_idx ON metaschema_modules_public. CREATE INDEX function_module_schema_id_idx ON metaschema_modules_public.function_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.function_module.bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_module.capability_bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_module.definitions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_module.schedules_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.function_invocation_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3767,6 +4137,12 @@ CREATE INDEX function_invocation_module_private_schema_id_idx ON metaschema_modu CREATE INDEX function_invocation_module_schema_id_idx ON metaschema_modules_public.function_invocation_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.attempts_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.execution_logs_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_invocation_module.invocations_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.infra_secrets_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3818,6 +4194,8 @@ CREATE INDEX infra_secrets_module_private_schema_id_idx ON metaschema_modules_pu COMMENT ON TABLE metaschema_modules_public.infra_secrets_module IS 'Namespace-backed PGP-encrypted key-value secrets module. Requires namespace_module and emits namespace:sync_secrets job triggers for K8s Secret synchronization.'; +COMMENT ON COLUMN metaschema_modules_public.infra_secrets_module.secrets_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.infra_config_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3869,6 +4247,8 @@ CREATE INDEX infra_config_module_private_schema_id_idx ON metaschema_modules_pub COMMENT ON TABLE metaschema_modules_public.infra_config_module IS 'Namespace-backed plaintext key-value config module. Requires namespace_module and emits namespace:sync_config job triggers for K8s ConfigMap synchronization.'; +COMMENT ON COLUMN metaschema_modules_public.infra_config_module.config_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.internal_secrets_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3920,6 +4300,8 @@ CREATE INDEX internal_secrets_module_private_schema_id_idx ON metaschema_modules COMMENT ON TABLE metaschema_modules_public.internal_secrets_module IS 'App-scoped PGP-encrypted internal secrets store. No namespace_module dependency and no K8s synchronization. Used by identity_providers_module for OAuth2 client_secret storage.'; +COMMENT ON COLUMN metaschema_modules_public.internal_secrets_module.internal_secrets_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.user_credentials_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3952,6 +4334,8 @@ COMMENT ON TABLE metaschema_modules_public.user_credentials_module IS 'Per-user Always user-scoped with AuthzDirectOwner RLS. Consumed by user_auth_module, identity_providers_module, and bootstrap procedures.'; +COMMENT ON COLUMN metaschema_modules_public.user_credentials_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.user_settings_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -3986,6 +4370,8 @@ CREATE INDEX user_settings_module_table_id_idx ON metaschema_modules_public.user CREATE INDEX user_settings_module_schema_id_idx ON metaschema_modules_public.user_settings_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.user_settings_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.i18n_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4020,6 +4406,8 @@ CREATE INDEX i18n_module_private_schema_id_idx ON metaschema_modules_public.i18n CREATE INDEX i18n_module_schema_id_idx ON metaschema_modules_public.i18n_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.i18n_module.settings_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.function_deployment_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4092,6 +4480,10 @@ CREATE INDEX function_deployment_module_function_module_id_idx ON metaschema_mod CREATE INDEX function_deployment_module_namespace_module_id_idx ON metaschema_modules_public.function_deployment_module (namespace_module_id); +COMMENT ON COLUMN metaschema_modules_public.function_deployment_module.deployment_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.function_deployment_module.deployments_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.principal_auth_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4167,6 +4559,12 @@ COMMENT ON CONSTRAINT principal_entities_table_fkey ON metaschema_modules_public COMMENT ON TABLE metaschema_modules_public.principal_auth_module IS 'Provisions the principals subsystem: a principals table, a principal_entities junction table, create/delete mutations, and org API key management. Supports both human-owned principals (AuthzDirectOwner, AuthzHumanOnly) and org-owned principals (AuthzEntityMembership with is_admin). Org principal and org API key functions are only generated when an org-scoped memberships_module exists for the database.'; +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principal_entities_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principal_scope_overrides_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.principal_auth_module.principals_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.resource_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4182,6 +4580,7 @@ CREATE TABLE metaschema_modules_public.resource_module ( resource_usage_log_table_id uuid NOT NULL DEFAULT uuid_nil(), resource_usage_summary_table_id uuid NOT NULL DEFAULT uuid_nil(), resource_installations_table_id uuid NOT NULL DEFAULT uuid_nil(), + registry_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), resources_table_name text NOT NULL DEFAULT 'resources', resource_events_table_name text NOT NULL DEFAULT 'resource_events', resource_status_checks_table_name text NOT NULL DEFAULT 'resource_status_checks', @@ -4189,6 +4588,7 @@ CREATE TABLE metaschema_modules_public.resource_module ( resource_usage_log_table_name text NOT NULL DEFAULT 'resource_usage_log', resource_usage_summary_table_name text NOT NULL DEFAULT 'resource_usage_summary', resource_installations_table_name text NOT NULL DEFAULT 'resource_installations', + registry_bindings_table_name text NOT NULL DEFAULT 'registry_bindings', rollup_resource_usage_summary_function text NOT NULL DEFAULT '', resource_billing_rollup_function text NOT NULL DEFAULT '', resolved_requirements_view_name text, @@ -4244,6 +4644,10 @@ CREATE TABLE metaschema_modules_public.resource_module ( FOREIGN KEY(resource_installations_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT resource_module_registry_bindings_table_fkey + FOREIGN KEY(registry_bindings_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT resource_module_merkle_store_module_fkey FOREIGN KEY(merkle_store_module_id) REFERENCES metaschema_modules_public.merkle_store_module (id) @@ -4268,6 +4672,8 @@ CREATE INDEX resource_module_resource_events_table_id_idx ON metaschema_modules_ CREATE INDEX resource_module_resource_installations_table_id_idx ON metaschema_modules_public.resource_module (resource_installations_table_id); +CREATE INDEX resource_module_registry_bindings_table_id_idx ON metaschema_modules_public.resource_module (registry_bindings_table_id); + CREATE INDEX resource_module_resources_table_id_idx ON metaschema_modules_public.resource_module (resources_table_id); CREATE INDEX resource_module_resource_status_checks_table_id_idx ON metaschema_modules_public.resource_module (resource_status_checks_table_id); @@ -4284,6 +4690,22 @@ CREATE INDEX resource_module_merkle_store_module_id_idx ON metaschema_modules_pu CREATE INDEX resource_module_namespace_module_id_idx ON metaschema_modules_public.resource_module (namespace_module_id); +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_definitions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_installations_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.registry_bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_status_checks_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_usage_log_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resource_usage_summary_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.resource_module.resources_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.integration_providers_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4337,6 +4759,8 @@ COMMENT ON TABLE metaschema_modules_public.integration_providers_module IS 'Conf and list the canonical secret/config names required to use them. Other modules (function_module, resource_module) match the provider slug as a string.'; +COMMENT ON COLUMN metaschema_modules_public.integration_providers_module.table_id IS '@module_table'; + CREATE UNIQUE INDEX graph_module_one_platform_scope ON metaschema_modules_public.graph_module (database_id) WHERE scope = 'platform'; CREATE UNIQUE INDEX events_module_one_platform_scope ON metaschema_modules_public.events_module (database_id) WHERE scope = 'platform'; @@ -4437,6 +4861,10 @@ CREATE INDEX webhook_module_namespace_module_id_idx ON metaschema_modules_public CREATE INDEX webhook_module_infra_secrets_module_id_idx ON metaschema_modules_public.webhook_module (infra_secrets_module_id); +COMMENT ON COLUMN metaschema_modules_public.webhook_module.webhook_endpoints_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.webhook_module.webhook_events_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.http_route_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4509,6 +4937,8 @@ CREATE INDEX http_route_module_resource_module_id_idx ON metaschema_modules_publ CREATE INDEX http_route_module_storage_module_id_idx ON metaschema_modules_public.http_route_module (storage_module_id); +COMMENT ON COLUMN metaschema_modules_public.http_route_module.http_routes_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.catalog_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4529,6 +4959,7 @@ CREATE TABLE metaschema_modules_public.catalog_module ( sites_error_pages_table_id uuid NOT NULL DEFAULT uuid_nil(), sites_app_links_table_id uuid NOT NULL DEFAULT uuid_nil(), sites_deep_links_table_id uuid NOT NULL DEFAULT uuid_nil(), + redirects_table_id uuid NOT NULL DEFAULT uuid_nil(), domains_table_name text NOT NULL DEFAULT 'domains', apis_table_name text NOT NULL DEFAULT 'apis', sites_table_name text NOT NULL DEFAULT 'sites', @@ -4544,6 +4975,7 @@ CREATE TABLE metaschema_modules_public.catalog_module ( sites_error_pages_table_name text NOT NULL DEFAULT 'sites_error_pages', sites_app_links_table_name text NOT NULL DEFAULT 'sites_app_links', sites_deep_links_table_name text NOT NULL DEFAULT 'sites_deep_links', + redirects_table_name text NOT NULL DEFAULT 'redirects', api_name text, private_api_name text, scope text NOT NULL, @@ -4619,6 +5051,10 @@ CREATE TABLE metaschema_modules_public.catalog_module ( FOREIGN KEY(sites_deep_links_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT catalog_module_redirects_table_fkey + FOREIGN KEY(redirects_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT catalog_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) @@ -4643,6 +5079,8 @@ CREATE INDEX catalog_module_sites_app_links_table_id_idx ON metaschema_modules_p CREATE INDEX catalog_module_sites_deep_links_table_id_idx ON metaschema_modules_public.catalog_module (sites_deep_links_table_id); +CREATE INDEX catalog_module_redirects_table_id_idx ON metaschema_modules_public.catalog_module (redirects_table_id); + CREATE INDEX catalog_module_domains_table_id_idx ON metaschema_modules_public.catalog_module (domains_table_id); CREATE INDEX catalog_module_entity_table_id_idx ON metaschema_modules_public.catalog_module (entity_table_id); @@ -4661,6 +5099,38 @@ CREATE INDEX catalog_module_sites_table_id_idx ON metaschema_modules_public.cata CREATE INDEX catalog_module_schema_id_idx ON metaschema_modules_public.catalog_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.catalog_module.apis_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.apps_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.buckets_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.domains_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.functions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.namespaces_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resource_definitions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resource_installations_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.redirects_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.resources_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_app_links_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_deep_links_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_error_pages_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.catalog_module.sites_web_config_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.domain_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4742,6 +5212,14 @@ CREATE INDEX domain_module_schema_id_idx ON metaschema_modules_public.domain_mod CREATE INDEX domain_module_catalog_module_id_idx ON metaschema_modules_public.domain_module (catalog_module_id); +COMMENT ON COLUMN metaschema_modules_public.domain_module.domain_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.domain_module.domain_verifications_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.domain_module.domains_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.domain_module.managed_domains_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.api_surface_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4815,6 +5293,14 @@ CREATE INDEX api_surface_module_schema_id_idx ON metaschema_modules_public.api_s CREATE INDEX api_surface_module_catalog_module_id_idx ON metaschema_modules_public.api_surface_module (catalog_module_id); +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.api_schemas_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.api_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.apis_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.api_surface_module.cors_settings_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.site_surface_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4926,6 +5412,22 @@ CREATE INDEX site_surface_module_schema_id_idx ON metaschema_modules_public.site CREATE INDEX site_surface_module_catalog_module_id_idx ON metaschema_modules_public.site_surface_module (catalog_module_id); +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_app_links_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_deep_links_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_error_pages_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_metadata_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_modules_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_themes_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.site_web_config_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.site_surface_module.sites_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.route_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -4939,9 +5441,11 @@ CREATE TABLE metaschema_modules_public.route_module ( routes_table_id uuid NOT NULL DEFAULT uuid_nil(), hostname_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), route_bindings_table_id uuid NOT NULL DEFAULT uuid_nil(), + redirects_table_id uuid NOT NULL DEFAULT uuid_nil(), routes_table_name text NOT NULL DEFAULT 'routes', hostname_bindings_table_name text NOT NULL DEFAULT 'hostname_bindings', route_bindings_table_name text NOT NULL DEFAULT 'route_bindings', + redirects_table_name text NOT NULL DEFAULT 'redirects', resolver_function_name text, app_links_function_name text, deep_link_function_name text, @@ -4985,6 +5489,10 @@ CREATE TABLE metaschema_modules_public.route_module ( FOREIGN KEY(route_bindings_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT route_module_redirects_table_fkey + FOREIGN KEY(redirects_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT route_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) @@ -5001,6 +5509,8 @@ CREATE INDEX route_module_route_bindings_table_id_idx ON metaschema_modules_publ CREATE INDEX route_module_routes_table_id_idx ON metaschema_modules_public.route_module (routes_table_id); +CREATE INDEX route_module_redirects_table_id_idx ON metaschema_modules_public.route_module (redirects_table_id); + CREATE INDEX route_module_private_schema_id_idx ON metaschema_modules_public.route_module (private_schema_id); CREATE INDEX route_module_schema_id_idx ON metaschema_modules_public.route_module (schema_id); @@ -5009,6 +5519,14 @@ CREATE INDEX route_module_catalog_module_id_idx ON metaschema_modules_public.rou CREATE INDEX route_module_domain_module_id_idx ON metaschema_modules_public.route_module (domain_module_id); +COMMENT ON COLUMN metaschema_modules_public.route_module.hostname_bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.route_module.route_bindings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.route_module.routes_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.route_module.redirects_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.app_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5074,6 +5592,10 @@ CREATE INDEX app_module_schema_id_idx ON metaschema_modules_public.app_module (s CREATE INDEX app_module_catalog_module_id_idx ON metaschema_modules_public.app_module (catalog_module_id); +COMMENT ON COLUMN metaschema_modules_public.app_module.app_components_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.app_module.apps_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.database_settings_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5140,6 +5662,14 @@ CREATE INDEX database_settings_module_webauthn_settings_table_id_idx ON metasche CREATE INDEX database_settings_module_schema_id_idx ON metaschema_modules_public.database_settings_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.database_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.pubkey_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.rls_settings_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.database_settings_module.webauthn_settings_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.pages_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5210,6 +5740,8 @@ CREATE INDEX pages_module_public_schema_id_idx ON metaschema_modules_public.page CREATE INDEX pages_module_merkle_store_module_id_idx ON metaschema_modules_public.pages_module (merkle_store_module_id); +COMMENT ON COLUMN metaschema_modules_public.pages_module.pages_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.user_settings_security_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5244,6 +5776,8 @@ CREATE INDEX user_settings_security_module_table_id_idx ON metaschema_modules_pu CREATE INDEX user_settings_security_module_schema_id_idx ON metaschema_modules_public.user_settings_security_module (schema_id); +COMMENT ON COLUMN metaschema_modules_public.user_settings_security_module.table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.scope_types_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5272,6 +5806,8 @@ CREATE INDEX scope_types_module_schema_id_idx ON metaschema_modules_public.scope CREATE INDEX scope_types_module_scope_types_table_id_idx ON metaschema_modules_public.scope_types_module (scope_types_table_id); +COMMENT ON COLUMN metaschema_modules_public.scope_types_module.scope_types_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.file_ref_field ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5458,6 +5994,12 @@ CREATE INDEX email_sender_module_site_surface_module_id_idx ON metaschema_module CREATE INDEX email_sender_module_entity_table_id_idx ON metaschema_modules_public.email_sender_module (entity_table_id); +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_identities_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_provider_accounts_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.email_sender_module.email_site_identities_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.oauth_requests_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5510,6 +6052,10 @@ COMMENT ON TABLE metaschema_modules_public.oauth_requests_module IS 'Config row Sibling of identity_providers_module (durable provider configuration) rather than part of it: this is ephemeral, purged flow state with its own retention.'; +COMMENT ON COLUMN metaschema_modules_public.oauth_requests_module.oauth_authorization_requests_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.oauth_requests_module.pending_identity_links_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.content_preset_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, @@ -5564,4 +6110,320 @@ CREATE INDEX content_preset_module_private_schema_id_idx ON metaschema_modules_p CREATE INDEX content_preset_module_public_schema_id_idx ON metaschema_modules_public.content_preset_module (public_schema_id); -CREATE INDEX content_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.content_preset_module (merkle_store_module_id); \ No newline at end of file +CREATE INDEX content_preset_module_merkle_store_module_id_idx ON metaschema_modules_public.content_preset_module (merkle_store_module_id); + +COMMENT ON COLUMN metaschema_modules_public.content_preset_module.content_presets_table_id IS '@module_table'; + +CREATE TABLE metaschema_modules_public.internal_config_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + internal_config_table_id uuid NOT NULL DEFAULT uuid_nil(), + internal_config_table_name text NOT NULL DEFAULT 'internal_config', + api_name text DEFAULT 'config', + private_api_name text DEFAULT NULL, + scope text NOT NULL, + prefix text NOT NULL DEFAULT '', + entity_table_id uuid NULL, + entity_field text, + policies jsonb NULL, + provisions jsonb NULL, + CONSTRAINT internal_config_module_db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT internal_config_module_schema_fkey + FOREIGN KEY(schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT internal_config_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT internal_config_module_internal_config_table_fkey + FOREIGN KEY(internal_config_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT internal_config_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE +); + +CREATE INDEX internal_config_module_schema_id_idx ON metaschema_modules_public.internal_config_module (schema_id); + +CREATE INDEX internal_config_module_internal_config_table_id_idx ON metaschema_modules_public.internal_config_module (internal_config_table_id); + +CREATE UNIQUE INDEX internal_config_module_unique_scope ON metaschema_modules_public.internal_config_module (database_id, scope); + +CREATE INDEX internal_config_module_entity_table_id_idx ON metaschema_modules_public.internal_config_module (entity_table_id); + +CREATE INDEX internal_config_module_private_schema_id_idx ON metaschema_modules_public.internal_config_module (private_schema_id); + +COMMENT ON TABLE metaschema_modules_public.internal_config_module IS 'Scope-aware plaintext internal config store. No namespace_module dependency and no K8s synchronization: values are read from the database at invocation time. Configuration that must be projected into a Kubernetes ConfigMap belongs in infra_config_module.'; + +COMMENT ON COLUMN metaschema_modules_public.internal_config_module.internal_config_table_id IS '@module_table'; + +CREATE TABLE metaschema_modules_public.image_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + entity_field text, + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + images_table_id uuid NOT NULL DEFAULT uuid_nil(), + image_grants_table_id uuid NOT NULL DEFAULT uuid_nil(), + images_table_name text NOT NULL DEFAULT 'images', + image_grants_table_name text NOT NULL DEFAULT 'image_grants', + api_name text, + private_api_name text, + scope text NOT NULL, + prefix text NOT NULL DEFAULT '', + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + default_capabilities text[] DEFAULT NULL, + CONSTRAINT image_module_db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT image_module_schema_fkey + FOREIGN KEY(schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT image_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT image_module_images_table_fkey + FOREIGN KEY(images_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT image_module_grants_table_fkey + FOREIGN KEY(image_grants_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT image_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE +); + +CREATE UNIQUE INDEX image_module_unique_scope ON metaschema_modules_public.image_module (database_id, scope); + +CREATE INDEX image_module_entity_table_id_idx ON metaschema_modules_public.image_module (entity_table_id); + +CREATE INDEX image_module_images_table_id_idx ON metaschema_modules_public.image_module (images_table_id); + +CREATE INDEX image_module_image_grants_table_id_idx ON metaschema_modules_public.image_module (image_grants_table_id); + +CREATE INDEX image_module_private_schema_id_idx ON metaschema_modules_public.image_module (private_schema_id); + +CREATE INDEX image_module_schema_id_idx ON metaschema_modules_public.image_module (schema_id); + +COMMENT ON COLUMN metaschema_modules_public.image_module.images_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.image_module.image_grants_table_id IS '@module_table'; + +CREATE TABLE metaschema_modules_public.repository_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + entity_field text, + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + repositories_table_id uuid NOT NULL DEFAULT uuid_nil(), + repository_events_table_id uuid NOT NULL DEFAULT uuid_nil(), + workflows_table_id uuid NOT NULL DEFAULT uuid_nil(), + builds_table_id uuid NOT NULL DEFAULT uuid_nil(), + build_steps_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_requests_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_comments_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_reactions_table_id uuid NOT NULL DEFAULT uuid_nil(), + repositories_table_name text NOT NULL DEFAULT 'repositories', + repository_events_table_name text NOT NULL DEFAULT 'repository_events', + workflows_table_name text NOT NULL DEFAULT 'repository_workflows', + builds_table_name text NOT NULL DEFAULT 'builds', + build_steps_table_name text NOT NULL DEFAULT 'build_steps', + change_requests_table_name text NOT NULL DEFAULT 'change_requests', + change_request_comments_table_name text NOT NULL DEFAULT 'change_request_comments', + change_request_reactions_table_name text NOT NULL DEFAULT 'change_request_reactions', + has_builds boolean NOT NULL DEFAULT false, + has_attachments boolean NOT NULL DEFAULT false, + api_name text, + private_api_name text, + scope text NOT NULL, + prefix text NOT NULL DEFAULT '', + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + default_capabilities text[] DEFAULT NULL, + CONSTRAINT repository_module_db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_schema_fkey + FOREIGN KEY(schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_repositories_table_fkey + FOREIGN KEY(repositories_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_events_table_fkey + FOREIGN KEY(repository_events_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_workflows_table_fkey + FOREIGN KEY(workflows_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_builds_table_fkey + FOREIGN KEY(builds_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_build_steps_table_fkey + FOREIGN KEY(build_steps_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_change_requests_table_fkey + FOREIGN KEY(change_requests_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_comments_table_fkey + FOREIGN KEY(change_request_comments_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_reactions_table_fkey + FOREIGN KEY(change_request_reactions_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE +); + +CREATE UNIQUE INDEX repository_module_unique_scope ON metaschema_modules_public.repository_module (database_id, scope); + +CREATE INDEX repository_module_entity_table_id_idx ON metaschema_modules_public.repository_module (entity_table_id); + +CREATE INDEX repository_module_repositories_table_id_idx ON metaschema_modules_public.repository_module (repositories_table_id); + +CREATE INDEX repository_module_repository_events_table_id_idx ON metaschema_modules_public.repository_module (repository_events_table_id); + +CREATE INDEX repository_module_workflows_table_id_idx ON metaschema_modules_public.repository_module (workflows_table_id); + +CREATE INDEX repository_module_builds_table_id_idx ON metaschema_modules_public.repository_module (builds_table_id); + +CREATE INDEX repository_module_build_steps_table_id_idx ON metaschema_modules_public.repository_module (build_steps_table_id); + +CREATE INDEX repository_module_change_requests_table_id_idx ON metaschema_modules_public.repository_module (change_requests_table_id); + +CREATE INDEX repository_module_comments_table_id_idx ON metaschema_modules_public.repository_module (change_request_comments_table_id); + +CREATE INDEX repository_module_reactions_table_id_idx ON metaschema_modules_public.repository_module (change_request_reactions_table_id); + +CREATE INDEX repository_module_private_schema_id_idx ON metaschema_modules_public.repository_module (private_schema_id); + +CREATE INDEX repository_module_schema_id_idx ON metaschema_modules_public.repository_module (schema_id); + +COMMENT ON COLUMN metaschema_modules_public.repository_module.repositories_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.repository_events_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.workflows_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.builds_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.build_steps_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_requests_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_comments_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reactions_table_id IS '@module_table'; + +CREATE TABLE metaschema_modules_public.machine_module ( + id uuid PRIMARY KEY DEFAULT uuidv7(), + database_id uuid NOT NULL, + entity_field text, + schema_id uuid NOT NULL DEFAULT uuid_nil(), + private_schema_id uuid NOT NULL DEFAULT uuid_nil(), + public_schema_name text, + private_schema_name text, + machines_table_id uuid NOT NULL DEFAULT uuid_nil(), + machine_sessions_table_id uuid NOT NULL DEFAULT uuid_nil(), + machine_messages_table_id uuid NOT NULL DEFAULT uuid_nil(), + machines_table_name text NOT NULL DEFAULT 'machines', + machine_sessions_table_name text NOT NULL DEFAULT 'machine_sessions', + machine_messages_table_name text NOT NULL DEFAULT 'machine_messages', + partition_interval text NOT NULL DEFAULT '1 month', + retention text NOT NULL DEFAULT '3 months', + premake int NOT NULL DEFAULT 2, + api_name text, + private_api_name text, + scope text NOT NULL, + prefix text NOT NULL DEFAULT '', + entity_table_id uuid NULL, + policies jsonb NULL, + provisions jsonb NULL, + default_capabilities text[] DEFAULT NULL, + CONSTRAINT machine_module_db_fkey + FOREIGN KEY(database_id) + REFERENCES metaschema_public.database (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_schema_fkey + FOREIGN KEY(schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_private_schema_fkey + FOREIGN KEY(private_schema_id) + REFERENCES metaschema_public.schema (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_machines_table_fkey + FOREIGN KEY(machines_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_sessions_table_fkey + FOREIGN KEY(machine_sessions_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_messages_table_fkey + FOREIGN KEY(machine_messages_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT machine_module_entity_table_fkey + FOREIGN KEY(entity_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE +); + +CREATE UNIQUE INDEX machine_module_unique_scope ON metaschema_modules_public.machine_module (database_id, scope); + +CREATE INDEX machine_module_entity_table_id_idx ON metaschema_modules_public.machine_module (entity_table_id); + +CREATE INDEX machine_module_machines_table_id_idx ON metaschema_modules_public.machine_module (machines_table_id); + +CREATE INDEX machine_module_machine_sessions_table_id_idx ON metaschema_modules_public.machine_module (machine_sessions_table_id); + +CREATE INDEX machine_module_machine_messages_table_id_idx ON metaschema_modules_public.machine_module (machine_messages_table_id); + +CREATE INDEX machine_module_private_schema_id_idx ON metaschema_modules_public.machine_module (private_schema_id); + +CREATE INDEX machine_module_schema_id_idx ON metaschema_modules_public.machine_module (schema_id); + +COMMENT ON COLUMN metaschema_modules_public.machine_module.machines_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.machine_module.machine_sessions_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.machine_module.machine_messages_table_id IS '@module_table'; \ No newline at end of file diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/catalog_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/catalog_module/table.sql index 3ad5550f9..785137670 100644 --- a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/catalog_module/table.sql +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/catalog_module/table.sql @@ -2,7 +2,8 @@ BEGIN; -SELECT id, database_id, scope, domains_table_id, apis_table_id, sites_table_id +SELECT id, database_id, scope, domains_table_id, apis_table_id, sites_table_id, + redirects_table_id, redirects_table_name FROM metaschema_modules_public.catalog_module WHERE false; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/image_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/image_module/table.sql new file mode 100644 index 000000000..01f76edbd --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/image_module/table.sql @@ -0,0 +1,8 @@ +-- Verify schemas/metaschema_modules_public/tables/image_module/table on pg + +SELECT id, database_id, schema_id, private_schema_id, + images_table_id, images_table_name, + image_grants_table_id, image_grants_table_name, + scope, prefix, entity_table_id, policies, provisions +FROM metaschema_modules_public.image_module +WHERE FALSE; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/internal_config_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/internal_config_module/table.sql new file mode 100644 index 000000000..5d3503407 --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/internal_config_module/table.sql @@ -0,0 +1,9 @@ +-- Verify schemas/metaschema_modules_public/tables/internal_config_module/table on pg + +BEGIN; + +SELECT id, database_id, schema_id, internal_config_table_id, scope, prefix + FROM metaschema_modules_public.internal_config_module + WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql new file mode 100644 index 000000000..dea96524a --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/k8s_admission_module/table.sql @@ -0,0 +1,9 @@ +-- Verify schemas/metaschema_modules_public/tables/k8s_admission_module/table on pg + +BEGIN; + +SELECT id, database_id, public_schema_id, private_schema_id, merkle_store_module_id, store_name, scope, prefix + FROM metaschema_modules_public.k8s_admission_module + WHERE FALSE; + +ROLLBACK; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/machine_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/machine_module/table.sql new file mode 100644 index 000000000..28d98c3ce --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/machine_module/table.sql @@ -0,0 +1,10 @@ +-- Verify schemas/metaschema_modules_public/tables/machine_module/table on pg + +SELECT id, database_id, schema_id, private_schema_id, + machines_table_id, machines_table_name, + machine_sessions_table_id, machine_sessions_table_name, + machine_messages_table_id, machine_messages_table_name, + partition_interval, retention, premake, + scope, prefix, entity_table_id, policies, provisions +FROM metaschema_modules_public.machine_module +WHERE FALSE; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/repository_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/repository_module/table.sql new file mode 100644 index 000000000..a76b45b92 --- /dev/null +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/repository_module/table.sql @@ -0,0 +1,14 @@ +-- Verify schemas/metaschema_modules_public/tables/repository_module/table on pg + +SELECT id, database_id, schema_id, private_schema_id, + repositories_table_id, repositories_table_name, + repository_events_table_id, repository_events_table_name, + workflows_table_id, workflows_table_name, + builds_table_id, builds_table_name, + build_steps_table_id, build_steps_table_name, + change_requests_table_id, change_requests_table_name, + change_request_comments_table_id, change_request_comments_table_name, + change_request_reactions_table_id, change_request_reactions_table_name, + has_builds, scope, prefix, entity_table_id, policies, provisions +FROM metaschema_modules_public.repository_module +WHERE FALSE; diff --git a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/route_module/table.sql b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/route_module/table.sql index 4383f93c4..0ccad3d85 100644 --- a/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/route_module/table.sql +++ b/packages/metaschema-modules/verify/schemas/metaschema_modules_public/tables/route_module/table.sql @@ -2,7 +2,8 @@ BEGIN; -SELECT id, database_id, scope, routes_table_id +SELECT id, database_id, scope, routes_table_id, + redirects_table_id, redirects_table_name FROM metaschema_modules_public.route_module WHERE false; diff --git a/packages/types/__tests__/upload-ids.test.ts b/packages/types/__tests__/upload-ids.test.ts new file mode 100644 index 000000000..235044f6d --- /dev/null +++ b/packages/types/__tests__/upload-ids.test.ts @@ -0,0 +1,85 @@ +import { getConnections, PgTestClient } from 'pgsql-test'; + +// upload_ids(upload[]) is the one indexable expression for a column holding many +// uploads: storage garbage collection and the files-to-document sync trigger both +// key off it, and a GIN index is built over it. + +const fileA = '0d1e3d64-1e2a-4c7f-9c3a-6f7f9f2b1c44'; +const fileB = '9a7f1c2e-4b6d-4a11-8f30-2c5d7e9a0b13'; + +let pg: PgTestClient; +let teardown: () => Promise; + +beforeAll(async () => { + ({ pg, teardown } = await getConnections()); +}); + +afterAll(async () => { + await teardown(); +}); + +const uploadIds = async (uploads: unknown[]): Promise => { + const { ids } = await pg.one<{ ids: string[] | null }>( + `SELECT upload_ids($1::jsonb[]::upload[]) AS ids`, + [uploads.map((u) => JSON.stringify(u))] + ); + return ids; +}; + +describe('upload_ids', () => { + it('returns the file ids in element order', async () => { + expect(await uploadIds([{ id: fileA }, { id: fileB }])).toEqual([fileA, fileB]); + }); + + it('skips elements that name no file', async () => { + expect( + await uploadIds([{ url: 'https://example.com/a.pdf' }, { id: fileB }]) + ).toEqual([fileB]); + }); + + it('returns an empty array for an empty array', async () => { + expect(await uploadIds([])).toEqual([]); + }); + + it('is strict: null in, null out', async () => { + const { ids } = await pg.one<{ ids: string[] | null }>( + `SELECT upload_ids(NULL::upload[]) AS ids` + ); + expect(ids).toBeNull(); + }); + + it('is immutable, so it can back an expression index', async () => { + const { provolatile, proparallel } = await pg.one<{ + provolatile: string; + proparallel: string; + }>( + `SELECT provolatile, proparallel + FROM pg_proc + WHERE proname = 'upload_ids'` + ); + expect(provolatile).toBe('i'); + expect(proparallel).toBe('s'); + }); + + it('supports a GIN index over the ids of an upload array column', async () => { + await pg.any(` +CREATE TABLE messages ( + id serial PRIMARY KEY, + attachments upload[] +); +CREATE INDEX messages_attachments_idx ON messages USING gin (upload_ids(attachments)); +`); + await pg.any( + `INSERT INTO messages (attachments) VALUES (ARRAY[$1::jsonb::upload, $2::jsonb::upload])`, + [JSON.stringify({ id: fileA }), JSON.stringify({ id: fileB })] + ); + + const { count } = await pg.one<{ count: string }>( + `SELECT count(*)::text AS count + FROM messages + WHERE upload_ids(attachments) && ARRAY[$1::text]`, + [fileB] + ); + expect(count).toBe('1'); + }); +}); diff --git a/packages/types/deploy/schemas/public/procedures/upload_ids.sql b/packages/types/deploy/schemas/public/procedures/upload_ids.sql new file mode 100644 index 000000000..ddcf5365b --- /dev/null +++ b/packages/types/deploy/schemas/public/procedures/upload_ids.sql @@ -0,0 +1,33 @@ +-- Deploy schemas/public/procedures/upload_ids to pg +-- requires: schemas/public/schema +-- requires: schemas/public/domains/upload + +BEGIN; + +-- The file ids an upload array refers to, as text, in element order. +-- +-- One indexable expression for a column holding many uploads. A scalar upload +-- column answers "which file is this?" with (value ->> 'id'), which a btree +-- expression index serves; an array cannot, so storage garbage collection and +-- the files-to-document sync trigger both key off this function instead, and +-- metaschema_generators.file_ref_field emits a GIN index over it. Without the +-- index those two questions cost a sequential scan of tenant data per candidate +-- object. +-- +-- IMMUTABLE and NULL-free: an index expression must be immutable, and an +-- element with no id (an upload naming only a url, which the domain allows) is +-- not a reference to a files row, so it contributes nothing rather than a NULL +-- that && would have to reason about. +CREATE FUNCTION upload_ids(uploads upload[]) +RETURNS text[] AS $$ + SELECT COALESCE( + array_agg(u.value ->> 'id' ORDER BY u.ordinality), + ARRAY[]::text[] + ) + FROM unnest(uploads) WITH ORDINALITY AS u(value, ordinality) + WHERE u.value ? 'id'; +$$ LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE; + +COMMENT ON FUNCTION upload_ids(upload[]) IS E'@omit'; + +COMMIT; diff --git a/packages/types/pgpm.plan b/packages/types/pgpm.plan index 0baba9f92..1676aa172 100644 --- a/packages/types/pgpm.plan +++ b/packages/types/pgpm.plan @@ -12,3 +12,4 @@ schemas/public/domains/upload [schemas/public/schema] 2017-08-11T08:11:51Z skitc schemas/public/domains/url [schemas/public/schema] 2017-08-11T08:11:51Z skitch # add schemas/public/domains/url schemas/public/domains/upload_file_ref_keys [schemas/public/domains/upload] 2026-08-07T00:00:00Z constructive # declare bucket_id, size and filename on upload schemas/public/domains/image_file_ref_keys [schemas/public/domains/image] 2026-08-07T00:00:00Z constructive # declare bucket_id, size and filename on image +schemas/public/procedures/upload_ids [schemas/public/domains/upload] 2026-08-15T00:00:00Z constructive # the file ids an upload array refers to diff --git a/packages/types/revert/schemas/public/procedures/upload_ids.sql b/packages/types/revert/schemas/public/procedures/upload_ids.sql new file mode 100644 index 000000000..8b66060a2 --- /dev/null +++ b/packages/types/revert/schemas/public/procedures/upload_ids.sql @@ -0,0 +1,7 @@ +-- Revert schemas/public/procedures/upload_ids from pg + +BEGIN; + +DROP FUNCTION upload_ids(upload[]); + +COMMIT; diff --git a/packages/types/sql/pgpm-types--0.41.0.bundle.tar.gz b/packages/types/sql/pgpm-types--0.41.0.bundle.tar.gz index fe42cff185ae7f6feb14426ef5ecb9520469604a..5dff93f2d54b0d5fa45dfee2d87ccdeb788aba2e 100644 GIT binary patch literal 5748 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 literal 4487 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 ZpWQyU&+T*j+&;hj`Cka2kaPfO000rr=p_IE diff --git a/packages/types/sql/pgpm-types--0.41.0.sql b/packages/types/sql/pgpm-types--0.41.0.sql index 327ba0ed6..fb3c081d3 100644 --- a/packages/types/sql/pgpm-types--0.41.0.sql +++ b/packages/types/sql/pgpm-types--0.41.0.sql @@ -126,4 +126,17 @@ ALTER DOMAIN image ADD CONSTRAINT image_check OR jsonb_typeof(value -> 'filename') = 'string') AND (NOT (value ? 'versions') OR jsonb_typeof(value -> 'versions') = 'array') -); \ No newline at end of file +); + +CREATE FUNCTION upload_ids( + uploads upload[] +) RETURNS text[] AS $EOFCODE$ + SELECT COALESCE( + array_agg(u.value ->> 'id' ORDER BY u.ordinality), + ARRAY[]::text[] + ) + FROM unnest(uploads) WITH ORDINALITY AS u(value, ordinality) + WHERE u.value ? 'id'; +$EOFCODE$ LANGUAGE sql IMMUTABLE STRICT PARALLEL safe; + +COMMENT ON FUNCTION upload_ids(upload[]) IS '@omit'; \ No newline at end of file diff --git a/packages/types/verify/schemas/public/procedures/upload_ids.sql b/packages/types/verify/schemas/public/procedures/upload_ids.sql new file mode 100644 index 000000000..a63f459f5 --- /dev/null +++ b/packages/types/verify/schemas/public/procedures/upload_ids.sql @@ -0,0 +1,31 @@ +-- Verify schemas/public/procedures/upload_ids on pg + +BEGIN; + +SELECT has_function_privilege('public.upload_ids(upload[])', 'execute'); + +DO $$ +DECLARE + v_ids text[]; +BEGIN + v_ids := public.upload_ids(ARRAY[ + '{"id": "0d1e3d64-1e2a-4c7f-9c3a-6f7f9f2b1c44", "key": "a.png"}'::jsonb::public.upload, + '{"url": "https://example.com/b.png"}'::jsonb::public.upload, + '{"id": "9a7f1c2e-4b6d-4a11-8f30-2c5d7e9a0b13", "key": "c.png"}'::jsonb::public.upload + ]); + + -- Element order is preserved and an element carrying no id is not a reference. + IF v_ids <> ARRAY[ + '0d1e3d64-1e2a-4c7f-9c3a-6f7f9f2b1c44', + '9a7f1c2e-4b6d-4a11-8f30-2c5d7e9a0b13' + ] THEN + RAISE EXCEPTION 'public.upload_ids returned %', v_ids; + END IF; + + IF public.upload_ids(ARRAY[]::public.upload[]) <> ARRAY[]::text[] THEN + RAISE EXCEPTION 'public.upload_ids did not return an empty array for no uploads'; + END IF; +END +$$; + +ROLLBACK; From 6cd65e0f0196a892f90bb487d7c972141bc6b4e1 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 16 Aug 2026 04:13:04 +0000 Subject: [PATCH 2/4] test: supply catalog_module.redirects_table_id in function-resolution fixtures catalog_module gained a NOT NULL redirects_table_id whose uuid_nil() default cannot satisfy the new FK to metaschema_public."table", same as its sibling module-table columns, so the fixture inserts must name it. --- packages/function-resolution/__tests__/capabilities.test.ts | 4 ++-- .../function-resolution/__tests__/catalog-fastpath.test.ts | 4 ++-- .../__tests__/published-capability-catalog.test.ts | 5 +++-- .../function-resolution/__tests__/published-catalog.test.ts | 4 ++-- packages/function-resolution/__tests__/resolution.test.ts | 4 ++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/function-resolution/__tests__/capabilities.test.ts b/packages/function-resolution/__tests__/capabilities.test.ts index 547fdd4d3..b845d946a 100644 --- a/packages/function-resolution/__tests__/capabilities.test.ts +++ b/packages/function-resolution/__tests__/capabilities.test.ts @@ -175,8 +175,8 @@ describe('function-resolution capability resolution', () => { resource_installations_table_id, apps_table_id, buckets_table_id, sites_web_config_table_id, sites_error_pages_table_id, sites_app_links_table_id, sites_deep_links_table_id, - bindings_table_id, scope) - VALUES ($1, $2, $3, $3, $4, $3, $3, $3, $3, $3, $3, $5, $3, $3, $3, $3, $6, 'database')`, + redirects_table_id, bindings_table_id, scope) + VALUES ($1, $2, $3, $3, $4, $3, $3, $3, $3, $3, $3, $5, $3, $3, $3, $3, $3, $6, 'database')`, [ TENANT_DB, catFunctions.schemaId, diff --git a/packages/function-resolution/__tests__/catalog-fastpath.test.ts b/packages/function-resolution/__tests__/catalog-fastpath.test.ts index 91b2de36a..b68af7684 100644 --- a/packages/function-resolution/__tests__/catalog-fastpath.test.ts +++ b/packages/function-resolution/__tests__/catalog-fastpath.test.ts @@ -200,8 +200,8 @@ describe('function-resolution catalog fast-path', () => { resource_installations_table_id, apps_table_id, buckets_table_id, sites_web_config_table_id, sites_error_pages_table_id, sites_app_links_table_id, sites_deep_links_table_id, - bindings_table_id, scope) - VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, + redirects_table_id, bindings_table_id, scope) + VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, [TENANT_DB, catSchema.id, catTable.id] ); diff --git a/packages/function-resolution/__tests__/published-capability-catalog.test.ts b/packages/function-resolution/__tests__/published-capability-catalog.test.ts index 8b114a3b2..f6efe0123 100644 --- a/packages/function-resolution/__tests__/published-capability-catalog.test.ts +++ b/packages/function-resolution/__tests__/published-capability-catalog.test.ts @@ -242,8 +242,9 @@ describe('capability resolution against the published catalog planes', () => { resource_installations_table_id, apps_table_id, buckets_table_id, bindings_table_id, sites_web_config_table_id, sites_error_pages_table_id, - sites_app_links_table_id, sites_deep_links_table_id, scope) - VALUES ($1, $2, $3, $3, $4, $3, $3, $3, $3, $3, $3, $5, $6, $3, $3, $3, $3, 'database')`, + sites_app_links_table_id, sites_deep_links_table_id, + redirects_table_id, scope) + VALUES ($1, $2, $3, $3, $4, $3, $3, $3, $3, $3, $3, $5, $6, $3, $3, $3, $3, $3, 'database')`, [dbId, schemaId, bucketsTableId, apisTableId, bucketsTableId, bindingsTableId] ); // Label kept for readability of the fixture rows above. diff --git a/packages/function-resolution/__tests__/published-catalog.test.ts b/packages/function-resolution/__tests__/published-catalog.test.ts index 3ddad7c40..09e6559da 100644 --- a/packages/function-resolution/__tests__/published-catalog.test.ts +++ b/packages/function-resolution/__tests__/published-catalog.test.ts @@ -147,8 +147,8 @@ describe('function-resolution against the published catalog plane', () => { resource_installations_table_id, apps_table_id, buckets_table_id, sites_web_config_table_id, sites_error_pages_table_id, sites_app_links_table_id, sites_deep_links_table_id, - bindings_table_id, scope) - VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, + redirects_table_id, bindings_table_id, scope) + VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, [dbId, schemaId, tableId] ); diff --git a/packages/function-resolution/__tests__/resolution.test.ts b/packages/function-resolution/__tests__/resolution.test.ts index 53d793b19..9d109ec62 100644 --- a/packages/function-resolution/__tests__/resolution.test.ts +++ b/packages/function-resolution/__tests__/resolution.test.ts @@ -160,8 +160,8 @@ describe('function-resolution end-to-end (format-based, no AST)', () => { resource_installations_table_id, apps_table_id, buckets_table_id, sites_web_config_table_id, sites_error_pages_table_id, sites_app_links_table_id, sites_deep_links_table_id, - bindings_table_id, scope) - VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, + redirects_table_id, bindings_table_id, scope) + VALUES ($1, $2, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, $3, 'app')`, [TENANT_DB, catSchema.id, catTable.id] ); }); From 7130da4063d6b9ed6c874b6b44d5b4b3ed408ea2 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 16 Aug 2026 07:56:53 +0000 Subject: [PATCH 3/4] sync: agent_module default_visibility and repository_module review tables --- .../__snapshots__/modules.test.ts.snap | 2 +- .../tables/agent_module/table.sql | 6 ++++- .../tables/repository_module/table.sql | 13 ++++++++++- .../metaschema-modules--0.41.0.bundle.tar.gz | Bin 97182 -> 97493 bytes .../sql/metaschema-modules--0.41.0.sql | 22 +++++++++++++++++- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap index 49d0cbce4..13a6770e8 100644 --- a/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap +++ b/packages/metaschema-modules/__tests__/__snapshots__/modules.test.ts.snap @@ -159,7 +159,7 @@ exports[`db_meta_modules should verify module table structures have database_id exports[`db_meta_modules should verify module tables have proper foreign key relationships 1`] = ` { - "constraintCount": 549, + "constraintCount": 551, "foreignTables": [ "catalog_module", "database", diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql index 3d90f056f..ddd06ca70 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/agent_module/table.sql @@ -60,7 +60,11 @@ CREATE TABLE metaschema_modules_public.agent_module ( -- turning it on *requires* that storage module — an attachment with nowhere to -- live fails provisioning rather than accepting a file it cannot store. has_attachments boolean NOT NULL DEFAULT false, - shared boolean NOT NULL DEFAULT false, + -- The DDL default of the thread table's visibility column, and nothing more: + -- who may read a thread is decided per row by that column, never by how the + -- module was installed. 'private' (owner only) or 'entity' (scope members). + default_visibility text NOT NULL DEFAULT 'private' + CONSTRAINT default_visibility_chk CHECK (default_visibility IN ('private', 'entity')), -- API routing (configurable per-module) api_name text DEFAULT 'agent', diff --git a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql index 1648e5260..8dbbb62f5 100644 --- a/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql +++ b/packages/metaschema-modules/deploy/schemas/metaschema_modules_public/tables/repository_module/table.sql @@ -30,6 +30,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( change_requests_table_id uuid NOT NULL DEFAULT uuid_nil(), change_request_comments_table_id uuid NOT NULL DEFAULT uuid_nil(), change_request_reactions_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_reviews_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_file_views_table_id uuid NOT NULL DEFAULT uuid_nil(), -- Table names (input to the generator) repositories_table_name text NOT NULL DEFAULT 'repositories', @@ -40,6 +42,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( change_requests_table_name text NOT NULL DEFAULT 'change_requests', change_request_comments_table_name text NOT NULL DEFAULT 'change_request_comments', change_request_reactions_table_name text NOT NULL DEFAULT 'change_request_reactions', + change_request_reviews_table_name text NOT NULL DEFAULT 'change_request_reviews', + change_request_file_views_table_name text NOT NULL DEFAULT 'change_request_file_views', -- Workflows and builds enqueue jobs that run flow graphs, so they are only -- coherent at a scope that has a compute plane; an install without one gets @@ -69,7 +73,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( -- Per-table provisions overrides from blueprint config. Keys are table keys -- (repositories, repository_events, workflows, builds, build_steps, - -- change_requests, change_request_comments, change_request_reactions). + -- change_requests, change_request_comments, change_request_reactions, + -- change_request_reviews, change_request_file_views). provisions jsonb NULL, -- Default capabilities: capability names auto-granted to new members. @@ -86,6 +91,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( CONSTRAINT repository_module_change_requests_table_fkey FOREIGN KEY (change_requests_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT repository_module_comments_table_fkey FOREIGN KEY (change_request_comments_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT repository_module_reactions_table_fkey FOREIGN KEY (change_request_reactions_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_reviews_table_fkey FOREIGN KEY (change_request_reviews_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_file_views_table_fkey FOREIGN KEY (change_request_file_views_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, CONSTRAINT repository_module_entity_table_fkey FOREIGN KEY (entity_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE ); @@ -102,6 +109,8 @@ CREATE INDEX repository_module_build_steps_table_id_idx ON metaschema_modules_pu CREATE INDEX repository_module_change_requests_table_id_idx ON metaschema_modules_public.repository_module ( change_requests_table_id ); CREATE INDEX repository_module_comments_table_id_idx ON metaschema_modules_public.repository_module ( change_request_comments_table_id ); CREATE INDEX repository_module_reactions_table_id_idx ON metaschema_modules_public.repository_module ( change_request_reactions_table_id ); +CREATE INDEX repository_module_reviews_table_id_idx ON metaschema_modules_public.repository_module ( change_request_reviews_table_id ); +CREATE INDEX repository_module_file_views_table_id_idx ON metaschema_modules_public.repository_module ( change_request_file_views_table_id ); CREATE INDEX repository_module_private_schema_id_idx ON metaschema_modules_public.repository_module ( private_schema_id ); CREATE INDEX repository_module_schema_id_idx ON metaschema_modules_public.repository_module ( schema_id ); @@ -117,5 +126,7 @@ COMMENT ON COLUMN metaschema_modules_public.repository_module.build_steps_table_ COMMENT ON COLUMN metaschema_modules_public.repository_module.change_requests_table_id IS '@module_table'; COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_comments_table_id IS '@module_table'; COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reactions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reviews_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_file_views_table_id IS '@module_table'; COMMIT; diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.bundle.tar.gz b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.bundle.tar.gz index df82f53d24d4e922ee5c1da52edccc48b2cf9512..e200e67fbeb5807f328157fd794d566d8eb9bc1b 100644 GIT binary patch delta 50071 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�=wDV8X2wOnA-%c_R?SI#Y) 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 KS1AAkv<(0=M>$vk diff --git a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql index 619e4ede3..1d1af5473 100644 --- a/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql +++ b/packages/metaschema-modules/sql/metaschema-modules--0.41.0.sql @@ -3460,7 +3460,7 @@ CREATE TABLE metaschema_modules_public.agent_module ( has_agents boolean NOT NULL DEFAULT false, has_runs boolean NOT NULL DEFAULT false, has_attachments boolean NOT NULL DEFAULT false, - shared boolean NOT NULL DEFAULT false, + default_visibility text NOT NULL DEFAULT 'private' CONSTRAINT default_visibility_chk CHECK (default_visibility IN ('private', 'entity')), api_name text DEFAULT 'agent', private_api_name text DEFAULT NULL, scope text NOT NULL, @@ -6245,6 +6245,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( change_requests_table_id uuid NOT NULL DEFAULT uuid_nil(), change_request_comments_table_id uuid NOT NULL DEFAULT uuid_nil(), change_request_reactions_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_reviews_table_id uuid NOT NULL DEFAULT uuid_nil(), + change_request_file_views_table_id uuid NOT NULL DEFAULT uuid_nil(), repositories_table_name text NOT NULL DEFAULT 'repositories', repository_events_table_name text NOT NULL DEFAULT 'repository_events', workflows_table_name text NOT NULL DEFAULT 'repository_workflows', @@ -6253,6 +6255,8 @@ CREATE TABLE metaschema_modules_public.repository_module ( change_requests_table_name text NOT NULL DEFAULT 'change_requests', change_request_comments_table_name text NOT NULL DEFAULT 'change_request_comments', change_request_reactions_table_name text NOT NULL DEFAULT 'change_request_reactions', + change_request_reviews_table_name text NOT NULL DEFAULT 'change_request_reviews', + change_request_file_views_table_name text NOT NULL DEFAULT 'change_request_file_views', has_builds boolean NOT NULL DEFAULT false, has_attachments boolean NOT NULL DEFAULT false, api_name text, @@ -6307,6 +6311,14 @@ CREATE TABLE metaschema_modules_public.repository_module ( FOREIGN KEY(change_request_reactions_table_id) REFERENCES metaschema_public.table (id) ON DELETE CASCADE, + CONSTRAINT repository_module_reviews_table_fkey + FOREIGN KEY(change_request_reviews_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, + CONSTRAINT repository_module_file_views_table_fkey + FOREIGN KEY(change_request_file_views_table_id) + REFERENCES metaschema_public.table (id) + ON DELETE CASCADE, CONSTRAINT repository_module_entity_table_fkey FOREIGN KEY(entity_table_id) REFERENCES metaschema_public.table (id) @@ -6333,6 +6345,10 @@ CREATE INDEX repository_module_comments_table_id_idx ON metaschema_modules_publi CREATE INDEX repository_module_reactions_table_id_idx ON metaschema_modules_public.repository_module (change_request_reactions_table_id); +CREATE INDEX repository_module_reviews_table_id_idx ON metaschema_modules_public.repository_module (change_request_reviews_table_id); + +CREATE INDEX repository_module_file_views_table_id_idx ON metaschema_modules_public.repository_module (change_request_file_views_table_id); + CREATE INDEX repository_module_private_schema_id_idx ON metaschema_modules_public.repository_module (private_schema_id); CREATE INDEX repository_module_schema_id_idx ON metaschema_modules_public.repository_module (schema_id); @@ -6353,6 +6369,10 @@ COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_com COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reactions_table_id IS '@module_table'; +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_reviews_table_id IS '@module_table'; + +COMMENT ON COLUMN metaschema_modules_public.repository_module.change_request_file_views_table_id IS '@module_table'; + CREATE TABLE metaschema_modules_public.machine_module ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL, From fe3d2b49318b1feba459bd47996bc5ecbff5952e Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 16 Aug 2026 09:26:32 +0000 Subject: [PATCH 4/4] sync: port the remaining jwt-claims, metaschema-schema and object-store drift from constructive-db Backlog that predates this sync: current_database_id marked LEAKPROOF, a derived policy's column_refs persisted on metaschema_public.policy, predicate calls carrying schema and name separately, and the immutable-objects delete trigger returning OLD. Artifacts repackaged for the three modules. --- .../procedures/current_database_id.sql | 7 +- .../sql/pgpm-jwt-claims--0.41.0.bundle.tar.gz | Bin 8119 -> 8295 bytes .../sql/pgpm-jwt-claims--0.41.0.sql | 2 +- .../procedures/is_valid_step_up.sql | 58 ++++++++++++- .../tables/derives/table.sql | 4 + .../tables/embedding_chunks/table.sql | 2 +- .../metaschema_public/tables/policy/table.sql | 7 ++ .../metaschema_public/tables/table/table.sql | 36 ++++++++ .../metaschema-schema--0.41.0.bundle.tar.gz | Bin 28282 -> 29952 bytes .../sql/metaschema-schema--0.41.0.sql | 79 +++++++++++++++++- .../tables/derives/table.sql | 3 +- .../object/triggers/immutable_objects.sql | 4 + .../sql/object-store--0.41.0.bundle.tar.gz | Bin 19482 -> 19587 bytes .../object-store/sql/object-store--0.41.0.sql | 4 + 14 files changed, 200 insertions(+), 6 deletions(-) diff --git a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql index 1c6e22d9a..92c3ff7e0 100644 --- a/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql +++ b/packages/jwt-claims/deploy/schemas/jwt_private/procedures/current_database_id.sql @@ -16,6 +16,11 @@ BEGIN; -- -- pg_input_is_valid() validates without raising, so no EXCEPTION block is -- needed: an exception handler would open a subtransaction on every call +-- +-- LEAKPROOF like its sibling claim readers: it takes no arguments, so it can +-- leak nothing about the row a policy is testing, and the planner may push the +-- claim comparison down instead of treating every policy that reads a claim as +-- a barrier. Its one error path depends on the session, never on a value. CREATE FUNCTION jwt_private.current_database_id() RETURNS uuid AS $$ @@ -35,6 +40,6 @@ BEGIN RETURN database_id; END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'plpgsql' STABLE LEAKPROOF; COMMIT; diff --git a/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.bundle.tar.gz b/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.bundle.tar.gz index aafc727c2a1b1cc50bb2e83159721f9cfc5f223e..6092c4ff6baf8cb97eb0d9b6d0bd2aad3f9f51e3 100644 GIT binary patch literal 8295 zcmV-tAei4DiwFP!000021MPillUp~A_I#dSamt&iwySK1;0Pe!z-?T7s~aen-H_K1fx*qbgM z^F(Q;^0&ckx0U)!EB52`OCC@3sK_pjKIqf&!Kifz`S54a{o(l2%ZcdZ-gfst{f}LD zZ_2y6N7FBP_RE*^?}zQ2dA2_pv&z9lr(X{C-;>Bhr_)P|jwgc;gVCkM4(Nl9W|tQm z$faeb$_JCd?9+SEIvDBXe1#u>p1t2cD8m6?_`)ZOoM@U4CKDaa-XBbL@_rd9tE;VI z+Zr8Sz@pVPFXI2|TKkj1hzI*L+~6%Iq0XsG}Vg< zySVOb{F9D0sW{bXTc(>-rTxJs)jmvUfA_uqqI@tr?745@?~AoO_%IhI_X?y;;*_f) zaE3#a%zyY6Qt{ON&-rS9zY!9ac6T8~^Hq2!)XclO zkdnEey%S32U0qDcK<A$;YH0oY_8a0|^*#7?I z8I7iozWe%zNA41e&h~mt-Z^AyeVa#M9|68Gaogjz%~$LDT$4+CyBOq-S#qwWzn`Tp zZHKrqbr+McF2&2%{c57E+lIUic#}jg69?;}`xWT6X5081XZD#TyN+&g3C-7A%j*!Z zF1aU_n#&j+ADQ^b#y7@po3L%nGDh=wG@VTjcsBT`j|bzck$#exbzk5}vs#b()L3rJ zZBTzi$r;j5>2~L3m)m5*o@#S>f2;MxGu%4W-nms}w{6;-$kl|bP5eSpy^Qi3SX-A9 zu{PDmTJohFkB;S6K5M z;v3Vz?^gJKo~U>8UFba?k7kqc@PsL3Fx2mt8$BK`3NI`hCTkx^p}~A z+MvH1@px~q!Rep7tqV(Sy&H*EIvCF0AMSKoar4;2W3%;cv^SQ6p}yaz*>1DQv}a!o z2So;xFV8f&^=>rLe;f=ZI_*0g?ths6WB5=flksHwurJ(1<>A+lIvLbYeVyT$n{XJm z#w!h{O`0C;>!cy^@lS0Zb-YQN+jgc$2Auz0Y%CXMqgCb{(S03>j(9L{;qND(49B02 z#-#u4r@=^Ci-*r19zU7>qYdA^M~}K^{j(*Tvu-x-_CLHEwg0}}`S$tuU$t*fU+p}3 zv(vqP`tLj6J?VJ%OaJS)ubzDWrhEJP$+tV*%kNJ-eK&gZvZI69u8w8{Zf38C9gW7L zPkZBoXY}E=CX5rC5l(reamayUgMo zhU7A6a+R&P=*%7$( zZ6jI?oNLHZsH(9cTI<@o=U9*}7wf31GFgPIV5&=$nVE>QtM2^U&ey^6w>^Be^lksz zKU?;;%58G)0{oz-xb$icQebcyLk1T>*1^A ze9xj5YpURctd)>eiZK=}O400%NI^$gutwvOiySo7WRkanwd(Qw`{N1juaupan7hx4 z(i5ycFMtmp-io+gZudHrzP)sqO$Pc=r`>EnG~1eX&wuC^WqT>{|Ni!-TUhS; zdJ9O~UTS$exya_7985-+bkQE3?B>y*$Vbo{94(9%_U-n@PF{p)Tp(%HMwlh@rBU$mbO zrNZc7I2_db#~S0T^>}~l$De1957m$32Dct|v&n%zc-U=iJ=orEEq?WG)Y^OTm zwxzQ*{l{>td;R9g*DrR~ld3szwo)|^QApm27j`yhD^^p%nsZfV;*y-yTs>6@wzyQt zg{mRmDuyhdSQkUeg(GpA7t1+O+IwRSsT8O+WA;u;wh$;|$VQEZY6IEI$t7b9vZe+# zK}oR^+$z2-=fvfBQx8Vml;0k4PO)STKS%AZ4L>Qnkc&qyzHuwF%_WBFL$VO1`V=%s zLe4RB6_b4Mu29Gl$om|475q3`K^ev5=oK9%=Lp253<*?|g8Gn_c~*?bN>L+V z<4UGjZ9!IFeWe_&GtPMlz{OCG4oi0RS_pLZ6z|uFK8M!8i;$<`iB4zTVX+$qon@^r z#~bO<=IP5KR&!PfcLgzr9JngHELgEAv>;Pv z(8dKynFuQeB?68tHA5h^8i5OQuGY8!%AQLt4wBc(brrOv!XdHA&RFZgMs*ZKq0}4; zXN|>0EC~=}DmK(e3J$GF!da?T*brJ4EIG3{uK_HVEYS^M#c8e@igPJ>6DVlSk};C4 z1#R%bawtKna|JW|5?pXT7D~|@F=XLduyWSx=GO=-hX>XdZfNGC)is;h*0h@!p3WwN z(T5w~*qrEUNk>cI=FRS4+6|^1b<^GPWVYK-rlHUA;mYIlr*92Umd)maqo>DcGt*x- z+t?g;cWN?UA7`o$khIvy)sbXtqA@9$nlR^5s|%h5k*%>@prUHFRf>%cWAUEhu5jjX zTCIsQ3*N7TGr&0(QgIMmAS@8QLF*u*;b6E*0i+O8m7<1Fa~8->L-LpME+7v_vaz-6$&E3F$r6%$|Wfu*3!--u<(InuUpt?|k zvrSbp);UkchnTq(Ta0jw&U$laI5Lp6L8LK$9R%?FMm<%(F9O9>*CGotZMAVq5!N{lgDqb7h< z&&Ee%tfYj-=jv=Vx(YjN3K0xB6%Hk3u^2PkkfR66&ILuMDHa!~)pJduQi>&M z@S9>s?L~<{)YvH~>c+IH*+t zXXRShaj_r&uMtSjd6FKZ%F{k#W7;iN!n7CMiwfPMLhsw~%dF#F<)1dfmPJRipU2&< z4)=AkW}n-A^)?^RzQ+9r-D%9~eIdrR|9-ByHUW>C8cg4>Zf$a)-JqV{Rt=_0TRwz9 zooYuDZABNyMz3DH?)JySL7NNRY?o%;NVUiG@@b!%1+Qo4{PjOgXS&yo_jS@+{ig3m z&t7(4y!g)--#!2K)swa;`xWhy`6`JRV*`SNG>r zeP5Z(o$sHuI;Z&j)e4`Ci&**QW%t9|uU|ZWdTHh5uY9up8Y&1=azMTq0pl}L;by0a zNxhOUwPaU-PysDTZ{SkzBqI}PLLhfnD#$s}v!*_Bo2PiP$^j`VnPxxE*n!g zRL4e3s4=3al4C@?ntr+>Z1mP0E6)c8t>IsJTxo@y*Kwg6@wPnK+~!V~7r4tLL9Co} zcItCxftmr3t8p$QlPf1uVzdQ| zRTD};g-{sd;7Cb54-WC|B2>Z_qOc5k^K+v2c!Li z+55rtegEkGg9UXuCw6==>n1dq_THY;aW@)wJOA}`=Z9W5D8n)T)D7k~@V2v8+3sl6 z=`XDNz2{D|gb#Jn{X9MxO559ynvMLR%qBFNQm;`rk<`da%&y-n1sK(7@c>cS41`$O_-R*m?3FKfHSR z@|$(=CxELa#$0o0ZXd?R5CBsFQ$3)>8mukKB}i@=2NH0NRC6NCrX-W^0(n=grZqOi ztLDI3HhWO?A$fKz347LWy8CQ zRhOCeFK~jvAO^`7pb*4HW1P)`Q7fV$q$F4z6czw$qe~{1gn>Bu8UhNgH0-m>1`AZ< zjAn0(LN;niQmj<01{F@hCC4^XB?zI`7HHtL1}U62Fzl~l&|0?sU$;nEb&zmEtXweE z2`qY_6~#vboU9lOITJ@ztJND46OmMvqbW`;s`n8!nCAGLZcw8t&z z3s(&SxsIOEJBoj#;eq~^wT-LAtz0S{W|P6*`u_3#B5z`%^>#)~Y|_%)%YF?NWF1&_ z)J|PBQmGcaDK2tUv}8F+LM#G8g{_1T2y6AVFj(=`VW&()wMiAJ6tT#ZG=`kLuQ5yVQkoy1D=ql70=m4?oZyjNt<_0nAqFvs%my{(Vo?Ga zS3E=S{+9rwqX4l=*wMb=uaFOVTriN<(=7Ul%i zXszf>Y>~}1HYd)~;(OHjXm8wZab=h6UzO?N5@+p&R&ap}^%|~q8>%7e`)seHjeOPr z+N&MCn$R9}Ow(DfQVeDt)96r#_^6X!-_Sn9=&0~no#Xz`y93@`rB*yx-)^zCqxjlh zsQr4oE|x2%z{RFQMpDt{80|UOAW|q`^eI-&)`_hGxi{hp*WdzYEz#d%#)P%!^)>7W zS8yQr9jwxqr0W^zOA2=Hy3Ry>)z4HX3fEg2LSsf?qLUM(HV>WDz zH@UD6Oqe=SIQJCU?kL(V%7s9iG0e@pST zv4Sf9mhi!VNihfKF^C$-m{4eCY%V9RU;<8-J(+sLIm;6>>7McY*I_-<|IYyqZaKq6M-#AB-3mJ(VCXLBxe0gdcrAQ zT~Ap!&9lw+zv|iLT0o^G5MxW^Tk0$?C1)sTGGc^cGbD`_RGe`osKi=wLg!#*GLK+m z28&hzYVZZ5rYJ6EXHv*5_RAO%P6ZfpEh&O+p_<+)kpZhWqcEK2((RwB-=WaC*7>@j znhiSZz~sQxLPDd|mH;d(dJb$o1(Uc>H{yzT2{vJpq!2MnzDXrz$xSf79S!9;+4^Pb zNh{g)CC_Rm_YV^c_b2pQz0cl*8&*%wbiPC{d3KJ5e#1U$@dv~1$q&yLd;NLw*Jp#| zx^~L*;e$@554)eolb>`leb987Zq`E5Tch*1x~;V|g(J4EWuG3?P^YZ-*U&*7OiK%zFA>#EtC!9kP8F? z&>}$$BqD7G!t8vA4vE>LBWr*lv4Q9$wcHH`BzfAz6mY?{X?GKOboyS8bwiKlwJwWi zn3uY_;G;!*HywRcoBM}Gw%&0wnPHButvr|79>jV>E%AAjoP3D}a;mnv+}qP6mh5g< z?w=l^^}>%%jL#+SjOl=2(;#w*px@~EG z`rWS>fHbeXSp<@^xmZ)FomodFZyW(QldD>0=OyPNk=Q^=p#_H<@=lOriR~@`TA7f9 zLru9xM?Qcr)oO4t2dN>EW5pVyugD=lU}+f|vw$m^xEkma^KKS_bd@FB-Rz3JfgmJ_ zEnq)UA@DgCmnt{MEv%lkS|4(?h_1Hu+O|0#SIBBCA*7mHn#;|_^13%wuDSm?E$nY~ z1GL^1N|)_{7G;;&XYVii7>s5*8PTwL<6N>2I&=LX~PzDoD=WH8e{TUcr4;@P;H9E`ey5zS_kK{=SIJnq~2h6clFHyj_x z@KZM!O=n8dlDo_!%^N+&gT|ieSs$^X(ogL$V7E1JIAHAne*AMs^VBw<`m{JY zJ-!g36=>JBwp2p#GD8o@9ooMFddIN8UH*wIlQx$C#dx{f4Rdx`f+Ha zw~?8*L3935S7@ZqGGI?Q!-lmp`VH&-nE>w-amcu z(ysHpztvN^^{~5$><34+w-yq7YyQiF zvoA3ptCKJC)w|KMvy{V2vNp58q-a~1p)cMhEXE}%u_c4kYTKb~t(h@EO5{bdZRaSC zo%4w)1@vm~L=(RRP}eoWtXdsw1qO(SF`=3IT{FJ4Ja*(MfaVy$)Mmc&zUHc`gw~j3 zG&EBHCMvexjplv{udZy1S;e%?%rW9}wl(H<4F(qHinC&bZFJ5ycOC+hqncQPPe{<* z-cm*ehwX+8S$Xf1x|U7PMJ0&VX<`TfMC8S#s%Owi zluN4)RDPGezd6}^-q>|0fY&v6c^|VlW2yo0sW}LF9~`2ofSTHAAA1{f@gPzx5<9Vk zDr%A;@pz*l*%wXKkPN+s6jAyAB#oGb}P7ptwnR={O+ z(E^(2O!7>D5eQ2p;A}saDssf7>*^uL?Akbcek{?VWr2(=F{6)y5_3u})|OXC6ve4i zQ;l*WlpIs?v7$s0Dl60Wh3aiZ@Sp_(Gz}vKgOp2l%{L@Og~*tSYZo^FIyQo?CH|m3 zf&LAtA;(O*skF$KEd32UL5mvntS$snlTyjH?Jb%kE$bp6}J!xPtrUxtValiO!AGA;;M&&IeYy*4hM$n*b`?)Sc@y=A=drAhr$ zEI14;FWOsje%T*S=XsACMRn3&lr8H)?ePfQ5ZE3!crCcSz(bHq4lXx8Gscz*zypyD z+ybzm)D~aRZXZ@O1w2Ak@t(*@EXtz3d@is(G0!)I+mqw84yTwH4Jzks8m5W|D>2!c znG_AFp#s^stTBSG>T1mri*c1r_Kxf40^Advx+dbDE|t!I<2RAFN$9;PfK{mq8C#jKS`t^HFiE>JsM>%b0~(T` z)=^~21nth6b_41SA?`^g-4y0tDgibL)lbsyB}9q|d=1zFEYKRLHaG3sXiA!^u~i{@ zEn=`;L*SFxl)%KBJ>8@I!EY9E=d@pnw#_y0PLcNiM&!hq)i)oETMwF;ceA)ItJCy-O8Y8EO@x&t% zRv4v6mpvL!WK9eiL>(sqUo@+;{Wb_;5Z1PQvF;C$CAakq4Ke8#;nD;R6$$FrO_Nc70wQApyI2KkePB&BY+N#Kq@If zHc(nR{t!*pM4w9$S;Dz%DkaM}xS4`t$)=jnTc{<57Dfb7+Epgeq#}aSvgMNpSDN>= z1)r(i+uCl;38lo9wuaPhUJ7W8RFP7PF-WF@Q>)%EhyKO{jIQ0BnTs`Tv0-o2~$=001J?V>SQ) literal 8119 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 R|9sh>{}229h?M}S004@@|JMKj diff --git a/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.sql b/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.sql index 27e115909..258a44bb7 100644 --- a/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.sql +++ b/packages/jwt-claims/sql/pgpm-jwt-claims--0.41.0.sql @@ -103,7 +103,7 @@ BEGIN END IF; RETURN database_id; END; -$EOFCODE$ LANGUAGE plpgsql STABLE; +$EOFCODE$ LANGUAGE plpgsql STABLE LEAKPROOF; CREATE FUNCTION jwt_private.current_token_id() RETURNS uuid AS $EOFCODE$ SELECT nullif(current_setting('jwt.claims.token_id', true), '')::uuid; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_private/procedures/is_valid_step_up.sql b/packages/metaschema-schema/deploy/schemas/metaschema_private/procedures/is_valid_step_up.sql index 01ad49b8e..dc5cfdd18 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_private/procedures/is_valid_step_up.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_private/procedures/is_valid_step_up.sql @@ -37,8 +37,16 @@ BEGIN; -- =, !=, >, <, >=, <=, LIKE, NOT LIKE, IS NULL, IS NOT NULL, -- IS DISTINCT FROM; row is NEW or OLD; comparison ops require exactly -- one of value (scalar) or ref ({field, row?}). +-- - predicate call leaf: {schema, function, args?} — schema and function name +-- are separate keys, as in the FieldGeneration DSL, and each arg is a column +-- reference ({field, row?}). -- Field existence and AST safety are enforced at apply time by --- build_condition_expr + ast_validate.validate_column_expression_ast. +-- build_condition_expr + ast_validate.validate_column_expression_ast, and so +-- is *which* predicate a call may name: the allow-list lives in +-- metaschema_generators.allowed_condition_calls(), which this immutable +-- shape check cannot reach across modules. A well-shaped call to an +-- unlisted predicate is therefore stored and rejected when the guard is +-- built, the same way a well-shaped reference to a missing column is. CREATE FUNCTION metaschema_private.is_valid_step_up_conditions(cond jsonb) RETURNS boolean AS $$ DECLARE @@ -52,6 +60,9 @@ DECLARE -- ref validation (column-to-column comparison) v_ref jsonb; v_ref_key text; + + -- predicate call leaf argument validation + v_arg jsonb; BEGIN IF cond IS NULL THEN RETURN false; @@ -88,6 +99,51 @@ BEGIN RETURN metaschema_private.is_valid_step_up_conditions(COALESCE(cond -> 'AND', cond -> 'OR')); END IF; + -- Predicate call leaf: {schema, function, args?} + IF cond ? 'function' THEN + FOR v_key IN SELECT key FROM jsonb_each(cond) LOOP + IF v_key NOT IN ('schema', 'function', 'args') THEN + RETURN false; + END IF; + END LOOP; + + -- A predicate is always schema-qualified: it is platform SQL named by + -- the allow-list, never something resolved out of the search_path. + IF jsonb_typeof(cond -> 'schema') IS DISTINCT FROM 'string' + OR jsonb_typeof(cond -> 'function') IS DISTINCT FROM 'string' THEN + RETURN false; + END IF; + + IF cond ? 'args' THEN + IF jsonb_typeof(cond -> 'args') != 'array' THEN + RETURN false; + END IF; + + FOR v_i IN 0..jsonb_array_length(cond -> 'args') - 1 LOOP + v_arg := (cond -> 'args') -> v_i; + IF jsonb_typeof(v_arg) != 'object' THEN + RETURN false; + END IF; + FOR v_key IN SELECT key FROM jsonb_each(v_arg) LOOP + IF v_key NOT IN ('field', 'row') THEN + RETURN false; + END IF; + END LOOP; + IF jsonb_typeof(v_arg -> 'field') IS DISTINCT FROM 'string' THEN + RETURN false; + END IF; + IF v_arg ? 'row' THEN + IF jsonb_typeof(v_arg -> 'row') != 'string' + OR upper(v_arg ->> 'row') NOT IN ('NEW', 'OLD') THEN + RETURN false; + END IF; + END IF; + END LOOP; + END IF; + + RETURN true; + END IF; + -- Leaf condition: {field, op, value?, row?, ref?} FOR v_key IN SELECT key FROM jsonb_each(cond) LOOP IF v_key NOT IN ('field', 'op', 'value', 'row', 'ref') THEN diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql index 04faa7776..7074fc65a 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/derives/table.sql @@ -27,6 +27,10 @@ CREATE TABLE metaschema_public.derives ( include_mutations boolean NOT NULL DEFAULT false, policy_prefix text NOT NULL DEFAULT 'derived', + -- grant derivation: also mirror the source's table-wide grants onto the + -- companion (i18n/history set their own grants and leave this off) + include_grants boolean NOT NULL DEFAULT false, + created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now(), diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql index 26882fb53..751d381fa 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/embedding_chunks/table.sql @@ -37,7 +37,7 @@ CREATE TABLE metaschema_public.embedding_chunks ( -- job configuration enqueue_chunking_job boolean NOT NULL DEFAULT true, - chunking_task_name text NOT NULL DEFAULT 'embedding:generate_chunks', + chunking_task_name text NOT NULL DEFAULT 'embedding:chunk_record', -- model config (optional — worker falls back to runtime config when null) embedding_model text, diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql index 49c1f3ca4..dd77da634 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/policy/table.sql @@ -35,6 +35,10 @@ CREATE TABLE metaschema_public.policy ( derived_from_table_id uuid, derived_from_policy_id uuid, + -- columns of this policy's own table that its expression filters on, resolved + -- from the node type's parameter schema when the policy was derived + column_refs text[], + category metaschema_public.object_category NOT NULL DEFAULT 'app', tags citext[] NOT NULL DEFAULT '{}', @@ -62,6 +66,9 @@ CREATE TABLE metaschema_public.policy ( UNIQUE (table_id, name) ); +COMMENT ON COLUMN metaschema_public.policy.column_refs IS + 'Columns of this policy''s table that its expression filters on. Stamped when the policy is derived onto a companion table, so a consumer needing those columns (e.g. a chunking worker copying them from the parent row) reads them here instead of re-walking the node type''s parameter schema.'; + COMMENT ON COLUMN metaschema_public.policy.with_check IS 'Optional WITH CHECK override node {"$type": "Authz...", "data": {...}}. Only valid for UPDATE policies; NULL inherits the USING expression.'; diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql index 614782ef3..13a5a673f 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/table/table.sql @@ -59,6 +59,42 @@ COMMENT ON COLUMN metaschema_public.table.step_up IS ALTER TABLE metaschema_public.table ADD COLUMN inherits_id uuid NULL REFERENCES metaschema_public.table(id); +-- Provenance for a table a module generated: which module installed it, which +-- instance of that module, and the module's own name for the table's role +-- ('message', 'thread', ...). A module chooses its tables' names, prefixes them +-- per install and may move them between schemas, so a consumer that wants "this +-- module instance's message table" cannot name it — it selects on the +-- provenance instead. NULL on every table no module generated. +ALTER TABLE metaschema_public.table + ADD COLUMN module_type text NULL, + ADD COLUMN module_id uuid NULL, + ADD COLUMN module_scope text NULL, + ADD COLUMN module_prefix text NULL, + ADD COLUMN module_table_key text NULL; + +-- One table per (module instance, role): scope and prefix are the +-- discriminators an instance is installed under, so they participate. +-- COALESCE because a module without scopes leaves both NULL, and NULLs would +-- otherwise compare distinct and let a role be claimed twice. +CREATE UNIQUE INDEX table_module_provenance_uniq + ON metaschema_public.table ( + database_id, + module_type, + COALESCE(module_scope, ''), + COALESCE(module_prefix, ''), + module_table_key + ) + WHERE module_type IS NOT NULL AND module_table_key IS NOT NULL; + +-- Generator-written machinery, kept off the API the way schema_hash is: a client +-- that could write these could point a blueprint reference at a table the module +-- never generated, and reading them is a platform concern, not an app one. +COMMENT ON COLUMN metaschema_public.table.module_type IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.table.module_id IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.table.module_scope IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.table.module_prefix IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.table.module_table_key IS '@behavior -*'; + CREATE INDEX table_schema_id_idx ON metaschema_public.table ( schema_id ); CREATE INDEX table_inherits_id_idx ON metaschema_public.table ( inherits_id ); diff --git a/packages/metaschema-schema/sql/metaschema-schema--0.41.0.bundle.tar.gz b/packages/metaschema-schema/sql/metaschema-schema--0.41.0.bundle.tar.gz index a089efc0c7ac8e2c900ced8c7f892e2f0625b2ee..af9fcc2fd2d9377ba76bc0dfd4d6071b780712e6 100644 GIT binary patch delta 29881 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 literal 28282 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

}HIHLXx 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 'AND', cond -> 'OR')); END IF; + -- Predicate call leaf: {schema, function, args?} + IF cond ? 'function' THEN + FOR v_key IN SELECT key FROM jsonb_each(cond) LOOP + IF v_key NOT IN ('schema', 'function', 'args') THEN + RETURN false; + END IF; + END LOOP; + + -- A predicate is always schema-qualified: it is platform SQL named by + -- the allow-list, never something resolved out of the search_path. + IF jsonb_typeof(cond -> 'schema') IS DISTINCT FROM 'string' + OR jsonb_typeof(cond -> 'function') IS DISTINCT FROM 'string' THEN + RETURN false; + END IF; + + IF cond ? 'args' THEN + IF jsonb_typeof(cond -> 'args') != 'array' THEN + RETURN false; + END IF; + + FOR v_i IN 0..jsonb_array_length(cond -> 'args') - 1 LOOP + v_arg := (cond -> 'args') -> v_i; + IF jsonb_typeof(v_arg) != 'object' THEN + RETURN false; + END IF; + FOR v_key IN SELECT key FROM jsonb_each(v_arg) LOOP + IF v_key NOT IN ('field', 'row') THEN + RETURN false; + END IF; + END LOOP; + IF jsonb_typeof(v_arg -> 'field') IS DISTINCT FROM 'string' THEN + RETURN false; + END IF; + IF v_arg ? 'row' THEN + IF jsonb_typeof(v_arg -> 'row') != 'string' + OR upper(v_arg ->> 'row') NOT IN ('NEW', 'OLD') THEN + RETURN false; + END IF; + END IF; + END LOOP; + END IF; + + RETURN true; + END IF; + -- Leaf condition: {field, op, value?, row?, ref?} FOR v_key IN SELECT key FROM jsonb_each(cond) LOOP IF v_key NOT IN ('field', 'op', 'value', 'row', 'ref') THEN @@ -376,6 +424,31 @@ ALTER TABLE metaschema_public.table NULL REFERENCES metaschema_public.table (id); +ALTER TABLE metaschema_public.table + ADD COLUMN module_type text + NULL, + ADD COLUMN module_id uuid + NULL, + ADD COLUMN module_scope text + NULL, + ADD COLUMN module_prefix text + NULL, + ADD COLUMN module_table_key text + NULL; + +CREATE UNIQUE INDEX table_module_provenance_uniq ON metaschema_public.table (database_id, module_type, (COALESCE(module_scope, '')), (COALESCE(module_prefix, '')), module_table_key) WHERE module_type IS NOT NULL + AND module_table_key IS NOT NULL; + +COMMENT ON COLUMN metaschema_public."table".module_type IS '@behavior -*'; + +COMMENT ON COLUMN metaschema_public."table".module_id IS '@behavior -*'; + +COMMENT ON COLUMN metaschema_public."table".module_scope IS '@behavior -*'; + +COMMENT ON COLUMN metaschema_public."table".module_prefix IS '@behavior -*'; + +COMMENT ON COLUMN metaschema_public."table".module_table_key IS '@behavior -*'; + CREATE INDEX table_schema_id_idx ON metaschema_public.table (schema_id); CREATE INDEX table_inherits_id_idx ON metaschema_public.table (inherits_id); @@ -583,6 +656,7 @@ CREATE TABLE metaschema_public.policy ( smart_tags jsonb, derived_from_table_id uuid, derived_from_policy_id uuid, + column_refs text[], category metaschema_public.object_category NOT NULL DEFAULT 'app', tags citext[] NOT NULL DEFAULT '{}', created_at timestamptz DEFAULT now(), @@ -615,6 +689,8 @@ CREATE TABLE metaschema_public.policy ( UNIQUE (table_id, name) ); +COMMENT ON COLUMN metaschema_public.policy.column_refs IS 'Columns of this policy''s table that its expression filters on. Stamped when the policy is derived onto a companion table, so a consumer needing those columns (e.g. a chunking worker copying them from the parent row) reads them here instead of re-walking the node type''s parameter schema.'; + COMMENT ON COLUMN metaschema_public.policy.with_check IS 'Optional WITH CHECK override node {"$type": "Authz...", "data": {...}}. Only valid for UPDATE policies; NULL inherits the USING expression.'; CREATE INDEX policy_database_id_idx ON metaschema_public.policy (database_id); @@ -953,7 +1029,7 @@ CREATE TABLE metaschema_public.embedding_chunks ( metadata_fields jsonb, search_indexes jsonb, enqueue_chunking_job boolean NOT NULL DEFAULT true, - chunking_task_name text NOT NULL DEFAULT 'embedding:generate_chunks', + chunking_task_name text NOT NULL DEFAULT 'embedding:chunk_record', embedding_model text, embedding_provider text, parent_fk_field_id uuid, @@ -1226,6 +1302,7 @@ CREATE TABLE metaschema_public.derives ( kind text NOT NULL, include_mutations boolean NOT NULL DEFAULT false, policy_prefix text NOT NULL DEFAULT 'derived', + include_grants boolean NOT NULL DEFAULT false, created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now(), CONSTRAINT db_fkey diff --git a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/derives/table.sql b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/derives/table.sql index ecafdc4c5..bd383bf99 100644 --- a/packages/metaschema-schema/verify/schemas/metaschema_public/tables/derives/table.sql +++ b/packages/metaschema-schema/verify/schemas/metaschema_public/tables/derives/table.sql @@ -9,7 +9,8 @@ SELECT source_table_id, kind, include_mutations, - policy_prefix + policy_prefix, + include_grants FROM metaschema_public.derives WHERE FALSE; diff --git a/packages/object-store/deploy/schemas/object_store_public/tables/object/triggers/immutable_objects.sql b/packages/object-store/deploy/schemas/object_store_public/tables/object/triggers/immutable_objects.sql index efea38d00..26316a0e1 100644 --- a/packages/object-store/deploy/schemas/object_store_public/tables/object/triggers/immutable_objects.sql +++ b/packages/object-store/deploy/schemas/object_store_public/tables/object/triggers/immutable_objects.sql @@ -18,6 +18,10 @@ BEGIN IF (OLD.frzn IS TRUE) THEN RAISE EXCEPTION 'you cannot delete an immutable record.'; END IF; + -- A BEFORE DELETE trigger returning NULL cancels the delete: returning + -- NEW here made every delete of an unfrozen object a silent no-op + -- (DELETE 0, row still there). + RETURN OLD; END IF; RETURN NEW; END; diff --git a/packages/object-store/sql/object-store--0.41.0.bundle.tar.gz b/packages/object-store/sql/object-store--0.41.0.bundle.tar.gz index f3c961d5069b15734654ca978c40bad63e849a2a..7079fbcb32806b4c147716a472dc57ba4e2c438f 100644 GIT binary patch delta 18900 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%0DrgW`Q{zIn}XpCj+Rnvgd&V5+kqYA! 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 GdHxH!QFb5z delta 18819 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 gfF|vuN!>|sMiSq(=0BI*q*D^PdIT~O&