thinkwork-cli 0.12.12 → 0.12.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -38
- package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
- package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
- package/dist/cli.js +23823 -10151
- package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
- package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
- package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
- package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
- package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
- package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
- package/dist/drizzle/0001_milky_surge.sql +103 -0
- package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
- package/dist/drizzle/0003_exotic_ogun.sql +3 -0
- package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
- package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
- package/dist/drizzle/0006_new_colonel_america.sql +2 -0
- package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
- package/dist/drizzle/0008_external_task_id_column.sql +43 -0
- package/dist/drizzle/0009_evaluations.sql +64 -0
- package/dist/drizzle/0010_eval_agent_template.sql +2 -0
- package/dist/drizzle/0011_eval_run_template.sql +2 -0
- package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
- package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
- package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
- package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
- package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
- package/dist/drizzle/0017_wiki_places.sql +46 -0
- package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
- package/dist/drizzle/0018_cool_firebird.sql +24 -0
- package/dist/drizzle/0018_skill_runs.sql +84 -0
- package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
- package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
- package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
- package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
- package/dist/drizzle/0021_crm_work_links.sql +76 -0
- package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
- package/dist/drizzle/0022_add_billing_tables.sql +70 -0
- package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
- package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
- package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
- package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
- package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
- package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
- package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
- package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
- package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
- package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
- package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
- package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
- package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
- package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
- package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
- package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
- package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
- package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
- package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
- package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
- package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
- package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
- package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
- package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
- package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
- package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
- package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
- package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
- package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
- package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
- package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
- package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
- package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
- package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
- package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
- package/dist/drizzle/0063_threads_session_data.sql +23 -0
- package/dist/drizzle/0064_tenant_credentials.sql +65 -0
- package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
- package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
- package/dist/drizzle/0069_compliance_schema.sql +364 -0
- package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
- package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
- package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
- package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
- package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
- package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
- package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
- package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
- package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
- package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
- package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
- package/dist/drizzle/0083_computer_runbooks.sql +103 -0
- package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
- package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
- package/dist/drizzle/0086_update_default_template_models.sql +19 -0
- package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
- package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
- package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
- package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
- package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
- package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
- package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
- package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
- package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
- package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
- package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
- package/dist/drizzle/0097_shared_computers.sql +191 -0
- package/dist/drizzle/0098_business_ontology.sql +587 -0
- package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
- package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
- package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
- package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
- package/dist/drizzle/0105_spaces_domain.sql +349 -0
- package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
- package/dist/drizzle/0106_space_threads_participants.sql +197 -0
- package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
- package/dist/drizzle/0108_message_mentions.sql +95 -0
- package/dist/drizzle/0109_space_owned_threads.sql +217 -0
- package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
- package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
- package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
- package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
- package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
- package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
- package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
- package/dist/drizzle/0117_space_access_mode.sql +40 -0
- package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
- package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
- package/dist/drizzle/0120_space_automations.sql +58 -0
- package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
- package/dist/drizzle/0122_space_email_triggers.sql +24 -0
- package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
- package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
- package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
- package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
- package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
- package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
- package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
- package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
- package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
- package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
- package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
- package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
- package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
- package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
- package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
- package/dist/drizzle/0136_goal_ledger.sql +55 -0
- package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
- package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
- package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
- package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
- package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
- package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
- package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
- package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
- package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
- package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
- package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
- package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
- package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
- package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
- package/dist/drizzle/0149_user_model_approvals.sql +89 -0
- package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
- package/dist/drizzle/0151_managed_deployments.sql +91 -0
- package/dist/drizzle/0152_agent_profiles.sql +81 -0
- package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
- package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
- package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
- package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
- package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
- package/dist/drizzle/0158_pending_user_questions.sql +80 -0
- package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
- package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
- package/dist/drizzle/0159_application_plugins.sql +193 -0
- package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
- package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
- package/dist/drizzle/0160_eval_datasets.sql +75 -0
- package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
- package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
- package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
- package/dist/drizzle/0162_eval_result_override.sql +49 -0
- package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
- package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
- package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
- package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
- package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
- package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
- package/dist/drizzle/0169_release_update_jobs.sql +67 -0
- package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
- package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
- package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
- package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
- package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
- package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
- package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
- package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
- package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
- package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
- package/dist/drizzle/0180_skill_drafts.sql +89 -0
- package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
- package/dist/drizzle/0182_agent_loops.sql +260 -0
- package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
- package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
- package/dist/drizzle/0185_agent_loop_space.sql +16 -0
- package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
- package/dist/drizzle/0187_native_work_items.sql +220 -0
- package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
- package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
- package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
- package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
- package/dist/drizzle/0192_work_item_labels.sql +44 -0
- package/dist/drizzle/0193_work_item_documents.sql +31 -0
- package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
- package/dist/drizzle/0194_work_item_comments.sql +35 -0
- package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
- package/dist/drizzle/0196_pi_extensions.sql +118 -0
- package/dist/drizzle/0197_eval_profiles.sql +150 -0
- package/dist/drizzle/0197_rcm_context_columns.sql +28 -0
- package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
- package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
- package/dist/drizzle/meta/_journal.json +160 -0
- package/dist/plugins/README.md +162 -0
- package/dist/plugins/catalog/package.json +40 -0
- package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
- package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
- package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
- package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
- package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
- package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
- package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
- package/dist/plugins/catalog/src/catalog.ts +434 -0
- package/dist/plugins/catalog/src/contracts.ts +1498 -0
- package/dist/plugins/catalog/src/index.ts +4 -0
- package/dist/plugins/catalog/src/plugin-package.ts +171 -0
- package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
- package/dist/plugins/catalog/src/registry/index.ts +1 -0
- package/dist/plugins/catalog/tsconfig.json +8 -0
- package/dist/plugins/company-brain/README.md +37 -0
- package/dist/plugins/company-brain/package.json +33 -0
- package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
- package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
- package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
- package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
- package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
- package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
- package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
- package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
- package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
- package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
- package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
- package/dist/plugins/company-brain/src/api/migration.ts +665 -0
- package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
- package/dist/plugins/company-brain/src/index.ts +62 -0
- package/dist/plugins/company-brain/src/manifest.ts +112 -0
- package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
- package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
- package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
- package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
- package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
- package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
- package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
- package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
- package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
- package/dist/plugins/company-brain/tsconfig.json +8 -0
- package/dist/plugins/company-data/README.md +49 -0
- package/dist/plugins/company-data/package.json +21 -0
- package/dist/plugins/company-data/src/index.ts +30 -0
- package/dist/plugins/company-data/src/manifest.ts +26 -0
- package/dist/plugins/company-data/test/manifest.test.ts +116 -0
- package/dist/plugins/company-data/tsconfig.json +8 -0
- package/dist/plugins/company-etl/README.md +46 -0
- package/dist/plugins/company-etl/package.json +21 -0
- package/dist/plugins/company-etl/src/index.ts +29 -0
- package/dist/plugins/company-etl/src/manifest.ts +26 -0
- package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
- package/dist/plugins/company-etl/tsconfig.json +8 -0
- package/dist/plugins/email-channel/README.md +41 -0
- package/dist/plugins/email-channel/package.json +22 -0
- package/dist/plugins/email-channel/src/index.ts +36 -0
- package/dist/plugins/email-channel/src/manifest.ts +44 -0
- package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
- package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
- package/dist/plugins/email-channel/tsconfig.json +8 -0
- package/dist/plugins/lastmile/README.md +50 -0
- package/dist/plugins/lastmile/package.json +23 -0
- package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
- package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
- package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
- package/dist/plugins/lastmile/src/index.ts +46 -0
- package/dist/plugins/lastmile/src/manifest.ts +139 -0
- package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
- package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
- package/dist/plugins/lastmile/tsconfig.json +8 -0
- package/dist/plugins/n8n/README.md +201 -0
- package/dist/plugins/n8n/n8n-app/README.md +33 -0
- package/dist/plugins/n8n/n8n-app/package.json +23 -0
- package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
- package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
- package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
- package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
- package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
- package/dist/plugins/n8n/package.json +35 -0
- package/dist/plugins/n8n/runtime/Dockerfile +18 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
- package/dist/plugins/n8n/runtime/package-lock.json +13 -0
- package/dist/plugins/n8n/runtime/package.json +7 -0
- package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
- package/dist/plugins/n8n/smoke/README.md +95 -0
- package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
- package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
- package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
- package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
- package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
- package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
- package/dist/plugins/n8n/src/index.ts +79 -0
- package/dist/plugins/n8n/src/manifest.ts +403 -0
- package/dist/plugins/n8n/src/package-config.ts +186 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
- package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
- package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
- package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
- package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
- package/dist/plugins/n8n/test/image-build.test.ts +118 -0
- package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
- package/dist/plugins/n8n/test/manifest.test.ts +278 -0
- package/dist/plugins/n8n/test/package-config.test.ts +57 -0
- package/dist/plugins/n8n/tsconfig.json +8 -0
- package/dist/plugins/sendgrid/README.md +30 -0
- package/dist/plugins/sendgrid/package.json +22 -0
- package/dist/plugins/sendgrid/src/index.ts +36 -0
- package/dist/plugins/sendgrid/src/manifest.ts +37 -0
- package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
- package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
- package/dist/plugins/sendgrid/tsconfig.json +8 -0
- package/dist/plugins/twenty/README.md +78 -0
- package/dist/plugins/twenty/package.json +27 -0
- package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
- package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
- package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
- package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
- package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
- package/dist/plugins/twenty/src/api/cutover.ts +209 -0
- package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
- package/dist/plugins/twenty/src/index.ts +55 -0
- package/dist/plugins/twenty/src/manifest.ts +259 -0
- package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
- package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
- package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
- package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
- package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
- package/dist/plugins/twenty/test/manifest.test.ts +463 -0
- package/dist/plugins/twenty/tsconfig.json +9 -0
- package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
- package/dist/plugins/twenty/twenty-app/README.md +148 -0
- package/dist/plugins/twenty/twenty-app/package.json +30 -0
- package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
- package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
- package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
- package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
- package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
- package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
- package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
- package/dist/plugins/workos-auth/package.json +22 -0
- package/dist/plugins/workos-auth/src/index.ts +30 -0
- package/dist/plugins/workos-auth/src/manifest.ts +40 -0
- package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
- package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
- package/dist/plugins/workos-auth/tsconfig.json +8 -0
- package/dist/scripts/bootstrap-workspace.sh +162 -0
- package/dist/scripts/post-deploy.sh +290 -0
- package/dist/terraform/examples/greenfield/main.tf +903 -75
- package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
- package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
- package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
- package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
- package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
- package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
- package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
- package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
- package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
- package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
- package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
- package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
- package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
- package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
- package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
- package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
- package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
- package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
- package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
- package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
- package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
- package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
- package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
- package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
- package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
- package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
- package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
- package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
- package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
- package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
- package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
- package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
- package/dist/terraform/modules/app/ses-email/main.tf +143 -30
- package/dist/terraform/modules/app/static-site/main.tf +4 -3
- package/dist/terraform/modules/app/www-dns/main.tf +45 -5
- package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
- package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
- package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
- package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
- package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
- package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
- package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
- package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
- package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
- package/dist/terraform/modules/thinkwork/README.md +71 -0
- package/dist/terraform/modules/thinkwork/main.tf +1325 -174
- package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
- package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
- package/dist/terraform/schema.graphql +82 -9
- package/dist/workspace-defaults/files/AGENTS.md +344 -0
- package/dist/workspace-defaults/files/CONTEXT.md +8 -0
- package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
- package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
- package/dist/workspace-defaults/files/ROUTER.md +24 -0
- package/dist/workspace-defaults/files/SPACE.md +62 -0
- package/dist/workspace-defaults/files/TOOLS.md +65 -0
- package/dist/workspace-defaults/files/USER.md +40 -0
- package/dist/workspace-defaults/files/mcp.json +3 -0
- package/dist/workspace-defaults/files/memory/contacts.md +13 -0
- package/dist/workspace-defaults/files/memory/lessons.md +13 -0
- package/dist/workspace-defaults/files/memory/preferences.md +12 -0
- package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
- package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
- package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
- package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
- package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
- package/package.json +2 -1
- package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
- package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
- package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
- package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
- package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
- package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
- package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
- package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
-- Purpose: backfill legacy Agent Templates into Agent-owned runtime fields and Space context modules.
|
|
2
|
+
-- Plan: docs/plans/2026-05-20-003-spaces-as-agent-contextual-workrooms-template-removal-plan.md (U5)
|
|
3
|
+
-- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0114_migrate_templates_to_agents_and_spaces.sql
|
|
4
|
+
-- creates: public.idx_spaces_migrated_template
|
|
5
|
+
|
|
6
|
+
\set ON_ERROR_STOP on
|
|
7
|
+
|
|
8
|
+
BEGIN;
|
|
9
|
+
|
|
10
|
+
SET LOCAL lock_timeout = '5s';
|
|
11
|
+
SET LOCAL statement_timeout = '180s';
|
|
12
|
+
|
|
13
|
+
CREATE INDEX IF NOT EXISTS idx_spaces_migrated_template
|
|
14
|
+
ON public.spaces (tenant_id, template_key)
|
|
15
|
+
WHERE template_key LIKE 'agent-template:%';
|
|
16
|
+
|
|
17
|
+
-- Every tenant gets a contextual default Space. This is distinct from the
|
|
18
|
+
-- legacy "general" thread bucket and becomes the baseline Space for
|
|
19
|
+
-- template-free agents during the hard-cut migration.
|
|
20
|
+
INSERT INTO public.spaces (
|
|
21
|
+
tenant_id,
|
|
22
|
+
slug,
|
|
23
|
+
name,
|
|
24
|
+
description,
|
|
25
|
+
prompt,
|
|
26
|
+
status,
|
|
27
|
+
kind,
|
|
28
|
+
icon,
|
|
29
|
+
category,
|
|
30
|
+
template_key,
|
|
31
|
+
config,
|
|
32
|
+
context_config,
|
|
33
|
+
connected_data_config,
|
|
34
|
+
tool_policy,
|
|
35
|
+
mcp_policy,
|
|
36
|
+
agent_availability_policy
|
|
37
|
+
)
|
|
38
|
+
SELECT
|
|
39
|
+
t.id,
|
|
40
|
+
'default',
|
|
41
|
+
'Default',
|
|
42
|
+
'Default contextual workspace for tenant agents.',
|
|
43
|
+
'Use this Space for baseline agent context that should be available when no specialized Space applies.',
|
|
44
|
+
'active',
|
|
45
|
+
'custom',
|
|
46
|
+
'folder',
|
|
47
|
+
'default',
|
|
48
|
+
'default',
|
|
49
|
+
jsonb_build_object(
|
|
50
|
+
'workflow', 'default',
|
|
51
|
+
'version', 1,
|
|
52
|
+
'source', 'template_migration',
|
|
53
|
+
'migration', '0114_migrate_templates_to_agents_and_spaces'
|
|
54
|
+
),
|
|
55
|
+
jsonb_build_object(
|
|
56
|
+
'source', 'template_migration',
|
|
57
|
+
'workspaceSourcePrefix', format('tenants/%s/spaces/default/', t.slug),
|
|
58
|
+
'legacyDefaultsPrefix', format('tenants/%s/agents/_catalog/defaults/workspace/', t.slug)
|
|
59
|
+
),
|
|
60
|
+
'{}'::jsonb,
|
|
61
|
+
jsonb_build_object('source', 'template_migration'),
|
|
62
|
+
jsonb_build_object('source', 'template_migration'),
|
|
63
|
+
jsonb_build_object(
|
|
64
|
+
'source', 'template_migration',
|
|
65
|
+
'autoSubscribeAssignedAgents', true
|
|
66
|
+
)
|
|
67
|
+
FROM public.tenants t
|
|
68
|
+
ON CONFLICT (tenant_id, slug)
|
|
69
|
+
DO UPDATE SET
|
|
70
|
+
status = 'active',
|
|
71
|
+
kind = COALESCE(public.spaces.kind, EXCLUDED.kind),
|
|
72
|
+
icon = COALESCE(public.spaces.icon, EXCLUDED.icon),
|
|
73
|
+
category = COALESCE(public.spaces.category, EXCLUDED.category),
|
|
74
|
+
template_key = COALESCE(public.spaces.template_key, EXCLUDED.template_key),
|
|
75
|
+
config = COALESCE(public.spaces.config, '{}'::jsonb) || EXCLUDED.config,
|
|
76
|
+
context_config = COALESCE(public.spaces.context_config, '{}'::jsonb) || EXCLUDED.context_config,
|
|
77
|
+
connected_data_config = COALESCE(public.spaces.connected_data_config, EXCLUDED.connected_data_config),
|
|
78
|
+
tool_policy = COALESCE(public.spaces.tool_policy, '{}'::jsonb) || EXCLUDED.tool_policy,
|
|
79
|
+
mcp_policy = COALESCE(public.spaces.mcp_policy, '{}'::jsonb) || EXCLUDED.mcp_policy,
|
|
80
|
+
agent_availability_policy = COALESCE(public.spaces.agent_availability_policy, '{}'::jsonb) || EXCLUDED.agent_availability_policy,
|
|
81
|
+
updated_at = now();
|
|
82
|
+
|
|
83
|
+
-- Copy durable runtime and built-in policy fields from linked Templates onto
|
|
84
|
+
-- Agents. Runtime is intentionally overwritten because old agent rows default
|
|
85
|
+
-- to "strands" even when their Template selected a different runtime.
|
|
86
|
+
UPDATE public.agents a
|
|
87
|
+
SET
|
|
88
|
+
runtime = COALESCE(t.runtime, a.runtime, 'strands'),
|
|
89
|
+
model = COALESCE(a.model, t.model),
|
|
90
|
+
guardrail_id = COALESCE(a.guardrail_id, t.guardrail_id),
|
|
91
|
+
blocked_tools = COALESCE(t.blocked_tools, a.blocked_tools),
|
|
92
|
+
sandbox = COALESCE(t.sandbox, a.sandbox),
|
|
93
|
+
browser = COALESCE(t.browser, a.browser),
|
|
94
|
+
web_search = COALESCE(t.web_search, a.web_search),
|
|
95
|
+
send_email = COALESCE(t.send_email, a.send_email),
|
|
96
|
+
context_engine = COALESCE(t.context_engine, a.context_engine),
|
|
97
|
+
updated_at = now()
|
|
98
|
+
FROM public.agent_templates t
|
|
99
|
+
WHERE a.template_id = t.id;
|
|
100
|
+
|
|
101
|
+
-- Materialize a Space for every meaningful tenant-scoped, non-default Agent
|
|
102
|
+
-- Template so Template context can be reviewed and carried forward as Space
|
|
103
|
+
-- context. Default templates feed the tenant "default" Space above.
|
|
104
|
+
INSERT INTO public.spaces (
|
|
105
|
+
tenant_id,
|
|
106
|
+
slug,
|
|
107
|
+
name,
|
|
108
|
+
description,
|
|
109
|
+
prompt,
|
|
110
|
+
status,
|
|
111
|
+
kind,
|
|
112
|
+
icon,
|
|
113
|
+
category,
|
|
114
|
+
template_key,
|
|
115
|
+
config,
|
|
116
|
+
context_config,
|
|
117
|
+
connected_data_config,
|
|
118
|
+
tool_policy,
|
|
119
|
+
mcp_policy,
|
|
120
|
+
agent_availability_policy
|
|
121
|
+
)
|
|
122
|
+
SELECT
|
|
123
|
+
t.tenant_id,
|
|
124
|
+
'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g'),
|
|
125
|
+
t.name,
|
|
126
|
+
t.description,
|
|
127
|
+
COALESCE(t.config->>'systemPrompt', t.description),
|
|
128
|
+
'active',
|
|
129
|
+
'custom',
|
|
130
|
+
COALESCE(t.icon, 'folder'),
|
|
131
|
+
COALESCE(t.category, 'template'),
|
|
132
|
+
'agent-template:' || t.slug,
|
|
133
|
+
jsonb_build_object(
|
|
134
|
+
'workflow', 'template_migration',
|
|
135
|
+
'version', 1,
|
|
136
|
+
'source', 'template_migration',
|
|
137
|
+
'migration', '0114_migrate_templates_to_agents_and_spaces',
|
|
138
|
+
'legacyTemplateId', t.id::text,
|
|
139
|
+
'legacyTemplateSlug', t.slug,
|
|
140
|
+
'legacyTemplateKind', t.template_kind,
|
|
141
|
+
'legacyTemplateSource', t.source
|
|
142
|
+
),
|
|
143
|
+
jsonb_strip_nulls(jsonb_build_object(
|
|
144
|
+
'source', 'template_migration',
|
|
145
|
+
'sourceKind', 'agent_template',
|
|
146
|
+
'legacyTemplateId', t.id::text,
|
|
147
|
+
'legacyTemplateSlug', t.slug,
|
|
148
|
+
'workspaceSourcePrefix', format('tenants/%s/spaces/%s/', tenant.slug, 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')),
|
|
149
|
+
'legacyTemplatePrefix', format('tenants/%s/agents/_catalog/%s/workspace/', tenant.slug, t.slug),
|
|
150
|
+
'legacyDefaultsPrefix', format('tenants/%s/agents/_catalog/defaults/workspace/', tenant.slug),
|
|
151
|
+
'skills', CASE WHEN jsonb_typeof(t.skills) = 'array' THEN t.skills ELSE '[]'::jsonb END,
|
|
152
|
+
'knowledgeBaseIds', CASE WHEN jsonb_typeof(t.knowledge_base_ids) = 'array' THEN t.knowledge_base_ids ELSE '[]'::jsonb END
|
|
153
|
+
)),
|
|
154
|
+
'{}'::jsonb,
|
|
155
|
+
jsonb_strip_nulls(jsonb_build_object(
|
|
156
|
+
'source', 'template_migration',
|
|
157
|
+
'blockedTools', t.blocked_tools,
|
|
158
|
+
'builtIns', jsonb_strip_nulls(jsonb_build_object(
|
|
159
|
+
'sandbox', t.sandbox,
|
|
160
|
+
'browser', t.browser,
|
|
161
|
+
'webSearch', t.web_search,
|
|
162
|
+
'sendEmail', t.send_email,
|
|
163
|
+
'contextEngine', t.context_engine
|
|
164
|
+
))
|
|
165
|
+
)),
|
|
166
|
+
jsonb_build_object(
|
|
167
|
+
'source', 'template_migration',
|
|
168
|
+
'bindingSource', 'agent_template_mcp_servers'
|
|
169
|
+
),
|
|
170
|
+
jsonb_build_object(
|
|
171
|
+
'source', 'template_migration',
|
|
172
|
+
'legacyTemplateId', t.id::text,
|
|
173
|
+
'autoSubscribeAssignedAgents', true
|
|
174
|
+
)
|
|
175
|
+
FROM public.agent_templates t
|
|
176
|
+
JOIN public.tenants tenant
|
|
177
|
+
ON tenant.id = t.tenant_id
|
|
178
|
+
WHERE t.tenant_id IS NOT NULL
|
|
179
|
+
AND t.template_kind = 'agent'
|
|
180
|
+
AND t.slug <> 'default'
|
|
181
|
+
ON CONFLICT (tenant_id, slug)
|
|
182
|
+
DO UPDATE SET
|
|
183
|
+
template_key = EXCLUDED.template_key,
|
|
184
|
+
config = COALESCE(public.spaces.config, '{}'::jsonb) || EXCLUDED.config,
|
|
185
|
+
context_config = COALESCE(public.spaces.context_config, '{}'::jsonb) || EXCLUDED.context_config,
|
|
186
|
+
tool_policy = COALESCE(public.spaces.tool_policy, '{}'::jsonb) || EXCLUDED.tool_policy,
|
|
187
|
+
mcp_policy = COALESCE(public.spaces.mcp_policy, '{}'::jsonb) || EXCLUDED.mcp_policy,
|
|
188
|
+
agent_availability_policy = COALESCE(public.spaces.agent_availability_policy, '{}'::jsonb) || EXCLUDED.agent_availability_policy,
|
|
189
|
+
updated_at = now();
|
|
190
|
+
|
|
191
|
+
-- Existing Agents should keep their skill, KB, and MCP behavior even after
|
|
192
|
+
-- Templates stop being a live configuration concept.
|
|
193
|
+
INSERT INTO public.agent_skills (
|
|
194
|
+
agent_id,
|
|
195
|
+
tenant_id,
|
|
196
|
+
skill_id,
|
|
197
|
+
config,
|
|
198
|
+
permissions,
|
|
199
|
+
rate_limit_rpm,
|
|
200
|
+
model_override,
|
|
201
|
+
enabled
|
|
202
|
+
)
|
|
203
|
+
SELECT
|
|
204
|
+
a.id,
|
|
205
|
+
a.tenant_id,
|
|
206
|
+
skill.skill_id,
|
|
207
|
+
skill.config,
|
|
208
|
+
skill.permissions,
|
|
209
|
+
skill.rate_limit_rpm,
|
|
210
|
+
skill.model_override,
|
|
211
|
+
COALESCE(skill.enabled, true)
|
|
212
|
+
FROM public.agents a
|
|
213
|
+
JOIN public.agent_templates t
|
|
214
|
+
ON t.id = a.template_id
|
|
215
|
+
CROSS JOIN LATERAL jsonb_to_recordset(
|
|
216
|
+
CASE WHEN jsonb_typeof(t.skills) = 'array' THEN t.skills ELSE '[]'::jsonb END
|
|
217
|
+
) AS skill(
|
|
218
|
+
skill_id text,
|
|
219
|
+
config jsonb,
|
|
220
|
+
permissions jsonb,
|
|
221
|
+
rate_limit_rpm integer,
|
|
222
|
+
model_override text,
|
|
223
|
+
enabled boolean
|
|
224
|
+
)
|
|
225
|
+
WHERE skill.skill_id IS NOT NULL
|
|
226
|
+
ON CONFLICT (agent_id, skill_id)
|
|
227
|
+
DO NOTHING;
|
|
228
|
+
|
|
229
|
+
INSERT INTO public.agent_knowledge_bases (
|
|
230
|
+
agent_id,
|
|
231
|
+
tenant_id,
|
|
232
|
+
knowledge_base_id,
|
|
233
|
+
enabled
|
|
234
|
+
)
|
|
235
|
+
SELECT
|
|
236
|
+
a.id,
|
|
237
|
+
a.tenant_id,
|
|
238
|
+
kb.knowledge_base_id::uuid,
|
|
239
|
+
true
|
|
240
|
+
FROM public.agents a
|
|
241
|
+
JOIN public.agent_templates t
|
|
242
|
+
ON t.id = a.template_id
|
|
243
|
+
CROSS JOIN LATERAL jsonb_array_elements_text(
|
|
244
|
+
CASE WHEN jsonb_typeof(t.knowledge_base_ids) = 'array' THEN t.knowledge_base_ids ELSE '[]'::jsonb END
|
|
245
|
+
) AS kb(knowledge_base_id)
|
|
246
|
+
WHERE kb.knowledge_base_id ~* '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
|
|
247
|
+
ON CONFLICT (agent_id, knowledge_base_id)
|
|
248
|
+
DO NOTHING;
|
|
249
|
+
|
|
250
|
+
INSERT INTO public.agent_mcp_servers (
|
|
251
|
+
agent_id,
|
|
252
|
+
tenant_id,
|
|
253
|
+
mcp_server_id,
|
|
254
|
+
enabled,
|
|
255
|
+
config
|
|
256
|
+
)
|
|
257
|
+
SELECT
|
|
258
|
+
a.id,
|
|
259
|
+
a.tenant_id,
|
|
260
|
+
atm.mcp_server_id,
|
|
261
|
+
COALESCE(atm.enabled, true),
|
|
262
|
+
atm.config
|
|
263
|
+
FROM public.agents a
|
|
264
|
+
JOIN public.agent_template_mcp_servers atm
|
|
265
|
+
ON atm.template_id = a.template_id
|
|
266
|
+
ON CONFLICT (agent_id, mcp_server_id)
|
|
267
|
+
DO NOTHING;
|
|
268
|
+
|
|
269
|
+
-- Make Agents available inside their migrated Template Space. Agents that
|
|
270
|
+
-- were already template-free go to the tenant default Space so every Agent
|
|
271
|
+
-- has at least one contextual workroom.
|
|
272
|
+
WITH agent_target_spaces AS (
|
|
273
|
+
SELECT
|
|
274
|
+
a.tenant_id,
|
|
275
|
+
a.id AS agent_id,
|
|
276
|
+
COALESCE(template_space.id, default_space.id) AS space_id,
|
|
277
|
+
t.id AS legacy_template_id,
|
|
278
|
+
t.slug AS legacy_template_slug
|
|
279
|
+
FROM public.agents a
|
|
280
|
+
LEFT JOIN public.agent_templates t
|
|
281
|
+
ON t.id = a.template_id
|
|
282
|
+
JOIN public.spaces default_space
|
|
283
|
+
ON default_space.tenant_id = a.tenant_id
|
|
284
|
+
AND default_space.slug = 'default'
|
|
285
|
+
LEFT JOIN public.spaces template_space
|
|
286
|
+
ON template_space.tenant_id = a.tenant_id
|
|
287
|
+
AND template_space.slug = 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')
|
|
288
|
+
AND t.slug <> 'default'
|
|
289
|
+
)
|
|
290
|
+
INSERT INTO public.space_agent_assignments (
|
|
291
|
+
tenant_id,
|
|
292
|
+
space_id,
|
|
293
|
+
agent_id,
|
|
294
|
+
local_role,
|
|
295
|
+
local_instructions,
|
|
296
|
+
auto_subscribe,
|
|
297
|
+
allowed_capabilities,
|
|
298
|
+
allowed_tools,
|
|
299
|
+
status
|
|
300
|
+
)
|
|
301
|
+
SELECT
|
|
302
|
+
ats.tenant_id,
|
|
303
|
+
ats.space_id,
|
|
304
|
+
ats.agent_id,
|
|
305
|
+
'agent',
|
|
306
|
+
CASE
|
|
307
|
+
WHEN ats.legacy_template_slug IS NULL THEN 'Assigned by Template removal migration as a template-free agent.'
|
|
308
|
+
ELSE format('Assigned by Template removal migration from legacy template %s.', ats.legacy_template_slug)
|
|
309
|
+
END,
|
|
310
|
+
true,
|
|
311
|
+
NULL,
|
|
312
|
+
NULL,
|
|
313
|
+
'active'
|
|
314
|
+
FROM agent_target_spaces ats
|
|
315
|
+
WHERE ats.space_id IS NOT NULL
|
|
316
|
+
ON CONFLICT (tenant_id, space_id, agent_id)
|
|
317
|
+
DO NOTHING;
|
|
318
|
+
|
|
319
|
+
-- Move Template MCP bindings onto the migrated Space that represents that
|
|
320
|
+
-- context. The agent-level copy above preserves existing runtime behavior;
|
|
321
|
+
-- this Space-level copy is the new contextual source of truth.
|
|
322
|
+
WITH template_target_spaces AS (
|
|
323
|
+
SELECT
|
|
324
|
+
t.id AS template_id,
|
|
325
|
+
t.tenant_id,
|
|
326
|
+
CASE
|
|
327
|
+
WHEN t.slug = 'default' THEN default_space.id
|
|
328
|
+
ELSE template_space.id
|
|
329
|
+
END AS space_id
|
|
330
|
+
FROM public.agent_templates t
|
|
331
|
+
JOIN public.spaces default_space
|
|
332
|
+
ON default_space.tenant_id = t.tenant_id
|
|
333
|
+
AND default_space.slug = 'default'
|
|
334
|
+
LEFT JOIN public.spaces template_space
|
|
335
|
+
ON template_space.tenant_id = t.tenant_id
|
|
336
|
+
AND template_space.slug = 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')
|
|
337
|
+
WHERE t.tenant_id IS NOT NULL
|
|
338
|
+
AND t.template_kind = 'agent'
|
|
339
|
+
)
|
|
340
|
+
INSERT INTO public.space_mcp_servers (
|
|
341
|
+
tenant_id,
|
|
342
|
+
space_id,
|
|
343
|
+
mcp_server_id,
|
|
344
|
+
enabled,
|
|
345
|
+
config
|
|
346
|
+
)
|
|
347
|
+
SELECT
|
|
348
|
+
tts.tenant_id,
|
|
349
|
+
tts.space_id,
|
|
350
|
+
atm.mcp_server_id,
|
|
351
|
+
COALESCE(atm.enabled, true),
|
|
352
|
+
COALESCE(atm.config, '{}'::jsonb)
|
|
353
|
+
|| jsonb_build_object('source', 'template_migration', 'legacyTemplateId', atm.template_id::text)
|
|
354
|
+
FROM template_target_spaces tts
|
|
355
|
+
JOIN public.agent_template_mcp_servers atm
|
|
356
|
+
ON atm.template_id = tts.template_id
|
|
357
|
+
WHERE tts.space_id IS NOT NULL
|
|
358
|
+
ON CONFLICT (space_id, mcp_server_id)
|
|
359
|
+
DO NOTHING;
|
|
360
|
+
|
|
361
|
+
COMMIT;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
-- Purpose: remove remaining Computer/Evaluation dependencies on Agent Templates.
|
|
2
|
+
-- Plan: docs/plans/2026-05-20-003-spaces-as-agent-contextual-workrooms-template-removal-plan.md (U10)
|
|
3
|
+
-- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0115_remove_computer_eval_template_dependencies.sql
|
|
4
|
+
-- creates-column: public.eval_test_cases.agent_id
|
|
5
|
+
-- creates-constraint: public.eval_test_cases.eval_test_cases_agent_id_agents_id_fk
|
|
6
|
+
|
|
7
|
+
\set ON_ERROR_STOP on
|
|
8
|
+
|
|
9
|
+
BEGIN;
|
|
10
|
+
|
|
11
|
+
SET LOCAL lock_timeout = '5s';
|
|
12
|
+
SET LOCAL statement_timeout = '120s';
|
|
13
|
+
|
|
14
|
+
ALTER TABLE public.eval_test_cases
|
|
15
|
+
ADD COLUMN IF NOT EXISTS agent_id uuid;
|
|
16
|
+
|
|
17
|
+
WITH ranked_agents AS (
|
|
18
|
+
SELECT
|
|
19
|
+
tc.id AS test_case_id,
|
|
20
|
+
a.id AS agent_id,
|
|
21
|
+
row_number() OVER (
|
|
22
|
+
PARTITION BY tc.id
|
|
23
|
+
ORDER BY
|
|
24
|
+
CASE WHEN a.type = 'eval' THEN 0 ELSE 1 END,
|
|
25
|
+
CASE WHEN a.source = 'system' THEN 0 ELSE 1 END,
|
|
26
|
+
a.created_at DESC
|
|
27
|
+
) AS rn
|
|
28
|
+
FROM public.eval_test_cases tc
|
|
29
|
+
JOIN public.agents a
|
|
30
|
+
ON a.template_id = tc.agent_template_id
|
|
31
|
+
AND a.tenant_id = tc.tenant_id
|
|
32
|
+
WHERE tc.agent_id IS NULL
|
|
33
|
+
AND tc.agent_template_id IS NOT NULL
|
|
34
|
+
AND a.status <> 'archived'
|
|
35
|
+
)
|
|
36
|
+
UPDATE public.eval_test_cases tc
|
|
37
|
+
SET agent_id = ranked_agents.agent_id
|
|
38
|
+
FROM ranked_agents
|
|
39
|
+
WHERE ranked_agents.test_case_id = tc.id
|
|
40
|
+
AND ranked_agents.rn = 1;
|
|
41
|
+
|
|
42
|
+
DO $$
|
|
43
|
+
BEGIN
|
|
44
|
+
IF NOT EXISTS (
|
|
45
|
+
SELECT 1
|
|
46
|
+
FROM pg_constraint
|
|
47
|
+
WHERE conname = 'eval_test_cases_agent_id_agents_id_fk'
|
|
48
|
+
AND conrelid = 'public.eval_test_cases'::regclass
|
|
49
|
+
) THEN
|
|
50
|
+
ALTER TABLE public.eval_test_cases
|
|
51
|
+
ADD CONSTRAINT eval_test_cases_agent_id_agents_id_fk
|
|
52
|
+
FOREIGN KEY (agent_id)
|
|
53
|
+
REFERENCES public.agents(id);
|
|
54
|
+
END IF;
|
|
55
|
+
END
|
|
56
|
+
$$;
|
|
57
|
+
|
|
58
|
+
DROP INDEX IF EXISTS public.idx_computers_template;
|
|
59
|
+
|
|
60
|
+
ALTER TABLE public.computers
|
|
61
|
+
DROP COLUMN IF EXISTS template_id;
|
|
62
|
+
|
|
63
|
+
ALTER TABLE public.eval_runs
|
|
64
|
+
DROP COLUMN IF EXISTS agent_template_id;
|
|
65
|
+
|
|
66
|
+
ALTER TABLE public.eval_test_cases
|
|
67
|
+
DROP COLUMN IF EXISTS agent_template_id;
|
|
68
|
+
|
|
69
|
+
COMMIT;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
-- Purpose: backfill user Thread participants for per-user Thread visibility.
|
|
2
|
+
-- Context: a user may read a Thread only when they started it (`threads.user_id`)
|
|
3
|
+
-- or were mentioned in it (`message_mentions target_type='user'`).
|
|
4
|
+
-- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0116_backfill_thread_participants_access.sql
|
|
5
|
+
-- creates: public.view_thread_participants_access_backfilled
|
|
6
|
+
|
|
7
|
+
\set ON_ERROR_STOP on
|
|
8
|
+
|
|
9
|
+
BEGIN;
|
|
10
|
+
|
|
11
|
+
SELECT pg_advisory_xact_lock(hashtext('thread_participants_access_backfill_0116'));
|
|
12
|
+
|
|
13
|
+
SET LOCAL lock_timeout = '5s';
|
|
14
|
+
SET LOCAL statement_timeout = '180s';
|
|
15
|
+
|
|
16
|
+
DO $$
|
|
17
|
+
BEGIN
|
|
18
|
+
IF to_regclass('public.thread_participants') IS NULL THEN
|
|
19
|
+
RAISE EXCEPTION 'pre-flight: public.thread_participants does not exist';
|
|
20
|
+
END IF;
|
|
21
|
+
IF to_regclass('public.threads') IS NULL THEN
|
|
22
|
+
RAISE EXCEPTION 'pre-flight: public.threads does not exist';
|
|
23
|
+
END IF;
|
|
24
|
+
IF to_regclass('public.message_mentions') IS NULL THEN
|
|
25
|
+
RAISE EXCEPTION 'pre-flight: public.message_mentions does not exist';
|
|
26
|
+
END IF;
|
|
27
|
+
END $$;
|
|
28
|
+
|
|
29
|
+
-- Threads started by a user. Preserve legacy thread-level read state so
|
|
30
|
+
-- existing owners do not suddenly see old conversations as unread.
|
|
31
|
+
INSERT INTO public.thread_participants (
|
|
32
|
+
tenant_id,
|
|
33
|
+
thread_id,
|
|
34
|
+
space_id,
|
|
35
|
+
participant_type,
|
|
36
|
+
user_id,
|
|
37
|
+
role,
|
|
38
|
+
source,
|
|
39
|
+
notification_preference,
|
|
40
|
+
last_read_at,
|
|
41
|
+
created_at,
|
|
42
|
+
updated_at
|
|
43
|
+
)
|
|
44
|
+
SELECT
|
|
45
|
+
t.tenant_id,
|
|
46
|
+
t.id,
|
|
47
|
+
t.space_id,
|
|
48
|
+
'user',
|
|
49
|
+
t.user_id,
|
|
50
|
+
CASE
|
|
51
|
+
WHEN t.created_by_id = t.user_id::text THEN 'requester'
|
|
52
|
+
ELSE 'member'
|
|
53
|
+
END,
|
|
54
|
+
'thread_owner_backfill',
|
|
55
|
+
'subscribed',
|
|
56
|
+
t.last_read_at,
|
|
57
|
+
COALESCE(t.created_at, now()),
|
|
58
|
+
now()
|
|
59
|
+
FROM public.threads t
|
|
60
|
+
JOIN public.users u
|
|
61
|
+
ON u.id = t.user_id
|
|
62
|
+
AND u.tenant_id = t.tenant_id
|
|
63
|
+
WHERE t.user_id IS NOT NULL
|
|
64
|
+
AND t.space_id IS NOT NULL
|
|
65
|
+
ON CONFLICT (tenant_id, thread_id, user_id)
|
|
66
|
+
WHERE user_id IS NOT NULL
|
|
67
|
+
DO UPDATE SET
|
|
68
|
+
role = CASE
|
|
69
|
+
WHEN public.thread_participants.role = 'member'
|
|
70
|
+
AND EXCLUDED.role = 'requester'
|
|
71
|
+
THEN 'requester'
|
|
72
|
+
ELSE public.thread_participants.role
|
|
73
|
+
END,
|
|
74
|
+
last_read_at = COALESCE(public.thread_participants.last_read_at, EXCLUDED.last_read_at),
|
|
75
|
+
updated_at = now();
|
|
76
|
+
|
|
77
|
+
-- Users mentioned in any existing message become Thread participants.
|
|
78
|
+
-- Mention rows are the durable record that grants access to non-owners.
|
|
79
|
+
INSERT INTO public.thread_participants (
|
|
80
|
+
tenant_id,
|
|
81
|
+
thread_id,
|
|
82
|
+
space_id,
|
|
83
|
+
participant_type,
|
|
84
|
+
user_id,
|
|
85
|
+
role,
|
|
86
|
+
source,
|
|
87
|
+
notification_preference,
|
|
88
|
+
created_at,
|
|
89
|
+
updated_at
|
|
90
|
+
)
|
|
91
|
+
SELECT
|
|
92
|
+
mm.tenant_id,
|
|
93
|
+
mm.thread_id,
|
|
94
|
+
t.space_id,
|
|
95
|
+
'user',
|
|
96
|
+
mm.target_id,
|
|
97
|
+
'member',
|
|
98
|
+
'mention_backfill',
|
|
99
|
+
'subscribed',
|
|
100
|
+
MIN(mm.created_at),
|
|
101
|
+
now()
|
|
102
|
+
FROM public.message_mentions mm
|
|
103
|
+
JOIN public.threads t
|
|
104
|
+
ON t.id = mm.thread_id
|
|
105
|
+
AND t.tenant_id = mm.tenant_id
|
|
106
|
+
JOIN public.users u
|
|
107
|
+
ON u.id = mm.target_id
|
|
108
|
+
AND u.tenant_id = mm.tenant_id
|
|
109
|
+
WHERE mm.target_type = 'user'
|
|
110
|
+
AND t.space_id IS NOT NULL
|
|
111
|
+
GROUP BY mm.tenant_id, mm.thread_id, t.space_id, mm.target_id
|
|
112
|
+
ON CONFLICT (tenant_id, thread_id, user_id)
|
|
113
|
+
WHERE user_id IS NOT NULL
|
|
114
|
+
DO NOTHING;
|
|
115
|
+
|
|
116
|
+
CREATE OR REPLACE VIEW public.view_thread_participants_access_backfilled AS
|
|
117
|
+
SELECT
|
|
118
|
+
COUNT(*) FILTER (WHERE source = 'thread_owner_backfill')::int AS owner_backfill_rows,
|
|
119
|
+
COUNT(*) FILTER (WHERE source = 'mention_backfill')::int AS mention_backfill_rows,
|
|
120
|
+
now() AS checked_at
|
|
121
|
+
FROM public.thread_participants;
|
|
122
|
+
|
|
123
|
+
COMMENT ON VIEW public.view_thread_participants_access_backfilled IS
|
|
124
|
+
'Drift marker and summary for 0116_backfill_thread_participants_access.sql.';
|
|
125
|
+
|
|
126
|
+
COMMIT;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
-- Purpose: add tenant-public/private access semantics to Spaces.
|
|
2
|
+
-- Plan: docs/plans/2026-05-21-001-feat-public-private-space-access-plan.md (U1)
|
|
3
|
+
-- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0117_space_access_mode.sql
|
|
4
|
+
-- creates-column: public.spaces.access_mode
|
|
5
|
+
-- creates-constraint: public.spaces.spaces_access_mode_allowed
|
|
6
|
+
|
|
7
|
+
\set ON_ERROR_STOP on
|
|
8
|
+
|
|
9
|
+
BEGIN;
|
|
10
|
+
|
|
11
|
+
SET LOCAL lock_timeout = '5s';
|
|
12
|
+
SET LOCAL statement_timeout = '120s';
|
|
13
|
+
|
|
14
|
+
ALTER TABLE public.spaces
|
|
15
|
+
ADD COLUMN IF NOT EXISTS access_mode text;
|
|
16
|
+
|
|
17
|
+
UPDATE public.spaces
|
|
18
|
+
SET access_mode = 'public'
|
|
19
|
+
WHERE access_mode IS NULL;
|
|
20
|
+
|
|
21
|
+
ALTER TABLE public.spaces
|
|
22
|
+
ALTER COLUMN access_mode SET DEFAULT 'public',
|
|
23
|
+
ALTER COLUMN access_mode SET NOT NULL;
|
|
24
|
+
|
|
25
|
+
DO $$
|
|
26
|
+
BEGIN
|
|
27
|
+
IF NOT EXISTS (
|
|
28
|
+
SELECT 1
|
|
29
|
+
FROM pg_constraint
|
|
30
|
+
WHERE conname = 'spaces_access_mode_allowed'
|
|
31
|
+
AND conrelid = 'public.spaces'::regclass
|
|
32
|
+
) THEN
|
|
33
|
+
ALTER TABLE public.spaces
|
|
34
|
+
ADD CONSTRAINT spaces_access_mode_allowed
|
|
35
|
+
CHECK (access_mode IN ('public','private'));
|
|
36
|
+
END IF;
|
|
37
|
+
END;
|
|
38
|
+
$$;
|
|
39
|
+
|
|
40
|
+
COMMIT;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
-- Purpose: normalize tenant_members.principal_type to lowercase and prevent
|
|
2
|
+
-- future drift. Two writers (inviteMember mutation, REST POST /tenants/:id/invite)
|
|
3
|
+
-- wrote 'USER' (uppercase) while every reader gate filters on 'user' (lowercase).
|
|
4
|
+
-- The mismatch made invited users invisible to canReadTenantSpaces /
|
|
5
|
+
-- requester-context / auth-me role / etc. — the public/private space change
|
|
6
|
+
-- exposed it because invited users still saw nothing after spaces were
|
|
7
|
+
-- marked public.
|
|
8
|
+
-- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0118_normalize_tenant_member_principal_type.sql
|
|
9
|
+
-- creates-constraint: public.tenant_members.tenant_members_principal_type_lowercase_chk
|
|
10
|
+
|
|
11
|
+
\set ON_ERROR_STOP on
|
|
12
|
+
|
|
13
|
+
BEGIN;
|
|
14
|
+
|
|
15
|
+
SET LOCAL lock_timeout = '5s';
|
|
16
|
+
SET LOCAL statement_timeout = '120s';
|
|
17
|
+
|
|
18
|
+
-- Backfill existing rows. tenant_members is small (< 1000 rows in any
|
|
19
|
+
-- realistic tenant), so a plain UPDATE under the statement_timeout is safe.
|
|
20
|
+
UPDATE public.tenant_members
|
|
21
|
+
SET principal_type = lower(principal_type)
|
|
22
|
+
WHERE principal_type <> lower(principal_type);
|
|
23
|
+
|
|
24
|
+
-- Lock the canonical shape so neither writer (nor any future one) can
|
|
25
|
+
-- reintroduce the case mismatch silently.
|
|
26
|
+
DO $$
|
|
27
|
+
BEGIN
|
|
28
|
+
IF NOT EXISTS (
|
|
29
|
+
SELECT 1
|
|
30
|
+
FROM pg_constraint
|
|
31
|
+
WHERE conname = 'tenant_members_principal_type_lowercase_chk'
|
|
32
|
+
AND conrelid = 'public.tenant_members'::regclass
|
|
33
|
+
) THEN
|
|
34
|
+
ALTER TABLE public.tenant_members
|
|
35
|
+
ADD CONSTRAINT tenant_members_principal_type_lowercase_chk
|
|
36
|
+
CHECK (principal_type = lower(principal_type));
|
|
37
|
+
END IF;
|
|
38
|
+
END;
|
|
39
|
+
$$;
|
|
40
|
+
|
|
41
|
+
COMMIT;
|