thinkwork-cli 0.12.11 → 0.12.15

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.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22157 -9229
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,46 @@
1
+ -- Purpose: honest eval aggregation (Evaluations Trust Core U2) — errors leave
2
+ -- the pass rate. eval_runs gains an `errored` counter plus the
3
+ -- scoring-semantics stamps, eval_results gains an error cause subtag.
4
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U2)
5
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0159_eval_scoring_version.sql
6
+ --
7
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
8
+ -- stopped at 0020; repo convention is psql-applied files gated by the
9
+ -- db:migrate-manual drift reporter).
10
+ --
11
+ -- All columns are additive and nullable with NO defaults — null is
12
+ -- semantically load-bearing:
13
+ -- * eval_runs.scoring_version NULL => legacy run (~v1 semantics: errors
14
+ -- fold into `failed`); never recomputed under new semantics.
15
+ -- * eval_runs.errored NULL => counter not produced (legacy runs).
16
+ -- * eval_runs.summary_scoring_version NULL => summary written by
17
+ -- pre-stamp code; read path/reconciler recompute when it diverges from
18
+ -- the run's stamped scoring_version.
19
+ -- * eval_results.error_cause: 'timeout' | 'throttle' | 'evaluator_error'
20
+ -- | 'reconciler' | 'infra_other' (enum-by-comment; NULL on pass/fail
21
+ -- rows and on pre-migration error rows).
22
+ --
23
+ -- creates-column: public.eval_runs.errored
24
+ -- creates-column: public.eval_runs.scoring_version
25
+ -- creates-column: public.eval_runs.summary_scoring_version
26
+ -- creates-column: public.eval_results.error_cause
27
+
28
+ \set ON_ERROR_STOP on
29
+
30
+ BEGIN;
31
+
32
+ SET LOCAL lock_timeout = '5s';
33
+
34
+ ALTER TABLE public.eval_runs
35
+ ADD COLUMN IF NOT EXISTS errored integer;
36
+
37
+ ALTER TABLE public.eval_runs
38
+ ADD COLUMN IF NOT EXISTS scoring_version integer;
39
+
40
+ ALTER TABLE public.eval_runs
41
+ ADD COLUMN IF NOT EXISTS summary_scoring_version integer;
42
+
43
+ ALTER TABLE public.eval_results
44
+ ADD COLUMN IF NOT EXISTS error_cause text;
45
+
46
+ COMMIT;
@@ -0,0 +1,37 @@
1
+ -- Hand-rolled — apply manually to dev via:
2
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0160_compliance_event_types_plugins.sql
3
+ --
4
+ -- See docs/solutions/workflow-issues/manually-applied-drizzle-migrations-drift-from-dev-2026-04-21.md
5
+ --
6
+ -- U5 of docs/plans/2026-06-12-001-feat-application-plugins-plan.md.
7
+ -- Extends the event_type prefix CHECK constraints on compliance.audit_outbox
8
+ -- and compliance.audit_events to recognize the plugin.* event-type family —
9
+ -- so plugin.installed and plugin.uninstalled (and the U6 activation events
10
+ -- plugin.activation_granted / plugin.activation_revoked) can be inserted.
11
+ --
12
+ -- The new constraints are renamed *_v3 so the drift reporter at
13
+ -- scripts/db-migrate-manual.sh can verify application (probing by name).
14
+ -- The old *_v2 constraints are DROPped in the same transaction.
15
+ --
16
+ -- creates-constraint: compliance.audit_outbox.audit_outbox_event_type_prefix_v3
17
+ -- creates-constraint: compliance.audit_events.audit_events_event_type_prefix_v3
18
+
19
+ BEGIN;
20
+
21
+ ALTER TABLE compliance.audit_outbox
22
+ DROP CONSTRAINT IF EXISTS audit_outbox_event_type_prefix_v2;
23
+
24
+ ALTER TABLE compliance.audit_outbox
25
+ ADD CONSTRAINT audit_outbox_event_type_prefix_v3 CHECK (
26
+ event_type ~ '^(auth|user|agent|mcp|workspace|data|policy|approval|attachment|skill|output|plugin)\.'
27
+ );
28
+
29
+ ALTER TABLE compliance.audit_events
30
+ DROP CONSTRAINT IF EXISTS audit_events_event_type_prefix_v2;
31
+
32
+ ALTER TABLE compliance.audit_events
33
+ ADD CONSTRAINT audit_events_event_type_prefix_v3 CHECK (
34
+ event_type ~ '^(auth|user|agent|mcp|workspace|data|policy|approval|attachment|skill|output|plugin)\.'
35
+ );
36
+
37
+ COMMIT;
@@ -0,0 +1,75 @@
1
+ -- Purpose: dataset substrate for Evaluations Trust Core U4 — versioned
2
+ -- per-tenant eval datasets live in S3 (tenants/<slug>/eval-datasets/);
3
+ -- eval_datasets is the derived write-through index and
4
+ -- eval_test_cases gains the (dataset_id, dataset_case_id) linkage
5
+ -- the runner will fan out from in U6. Lands inert: nothing consumes
6
+ -- the new columns yet.
7
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U4)
8
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0160_eval_datasets.sql
9
+ --
10
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
11
+ -- stopped at 0020; repo convention is psql-applied files gated by the
12
+ -- db:migrate-manual drift reporter).
13
+ --
14
+ -- Semantics:
15
+ -- * eval_datasets is fully reconstructible from S3 (manifest_sha is the
16
+ -- drift detector); rows soft-archive via archived_at — never hard
17
+ -- delete while eval_test_cases / eval_results history references them.
18
+ -- * eval_test_cases.dataset_id is ON DELETE NO ACTION by design: case
19
+ -- removal is a manifest tombstone + enabled=false, never a row delete
20
+ -- (eval_results FK the case rows for trend history).
21
+ -- * uq_eval_test_cases_dataset_case is partial (WHERE dataset_id IS NOT
22
+ -- NULL) so legacy rows with null linkage are unconstrained.
23
+ --
24
+ -- creates: public.eval_datasets
25
+ -- creates: public.uq_eval_datasets_tenant_slug
26
+ -- creates: public.idx_eval_datasets_tenant_created
27
+ -- creates-constraint: public.eval_datasets.eval_datasets_tenant_id_tenants_id_fk
28
+ -- creates-column: public.eval_test_cases.dataset_id
29
+ -- creates-column: public.eval_test_cases.dataset_case_id
30
+ -- creates-constraint: public.eval_test_cases.eval_test_cases_dataset_id_eval_datasets_id_fk
31
+ -- creates: public.uq_eval_test_cases_dataset_case
32
+
33
+ \set ON_ERROR_STOP on
34
+
35
+ BEGIN;
36
+
37
+ SET LOCAL lock_timeout = '5s';
38
+
39
+ CREATE TABLE IF NOT EXISTS public.eval_datasets (
40
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
41
+ tenant_id uuid NOT NULL,
42
+ slug text NOT NULL,
43
+ name text,
44
+ kind text NOT NULL DEFAULT 'custom',
45
+ version integer NOT NULL DEFAULT 1,
46
+ manifest_sha text,
47
+ archived_at timestamptz,
48
+ created_at timestamptz NOT NULL DEFAULT now(),
49
+ updated_at timestamptz NOT NULL DEFAULT now(),
50
+ CONSTRAINT eval_datasets_tenant_id_tenants_id_fk
51
+ FOREIGN KEY (tenant_id)
52
+ REFERENCES public.tenants(id)
53
+ );
54
+
55
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_eval_datasets_tenant_slug
56
+ ON public.eval_datasets (tenant_id, slug);
57
+
58
+ CREATE INDEX IF NOT EXISTS idx_eval_datasets_tenant_created
59
+ ON public.eval_datasets (tenant_id, created_at);
60
+
61
+ ALTER TABLE public.eval_test_cases
62
+ ADD COLUMN IF NOT EXISTS dataset_id uuid
63
+ CONSTRAINT eval_test_cases_dataset_id_eval_datasets_id_fk
64
+ REFERENCES public.eval_datasets(id);
65
+
66
+ ALTER TABLE public.eval_test_cases
67
+ ADD COLUMN IF NOT EXISTS dataset_case_id text;
68
+
69
+ -- Case identity within a dataset is unique; partial so pre-dataset rows
70
+ -- (null dataset_id) stay unconstrained.
71
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_eval_test_cases_dataset_case
72
+ ON public.eval_test_cases (dataset_id, dataset_case_id)
73
+ WHERE dataset_id IS NOT NULL;
74
+
75
+ COMMIT;
@@ -0,0 +1,35 @@
1
+ -- Purpose: eval results link to the thread turn whose stored workspace
2
+ -- projection snapshot the test case asserted against (dynamic workspace
3
+ -- U10, origin R17/AE5). Direct AgentCore eval sessions use synthetic
4
+ -- session IDs that never join to thread_turns, so the linkage is an
5
+ -- explicit nullable FK column. ON DELETE SET NULL: deleting a turn keeps
6
+ -- the eval result row (assertion outcomes are snapshotted in
7
+ -- eval_results.assertions) but drops the projection convenience read.
8
+ -- Plan: docs/plans/2026-06-12-002-feat-dynamic-workspace-plan.md U10
9
+ -- Apply manually (no CI migration runner):
10
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0160_eval_results_thread_turn.sql
11
+ -- creates-column: public.eval_results.thread_turn_id
12
+ -- creates-constraint: public.eval_results.eval_results_thread_turn_id_thread_turns_id_fk
13
+
14
+ \set ON_ERROR_STOP on
15
+
16
+ SET lock_timeout = '5s';
17
+ SET statement_timeout = '15min';
18
+
19
+ SELECT pg_advisory_lock(hashtext('migration:0160_eval_results_thread_turn'));
20
+
21
+ ALTER TABLE public.eval_results
22
+ ADD COLUMN IF NOT EXISTS thread_turn_id uuid;
23
+
24
+ DO $$
25
+ BEGIN
26
+ ALTER TABLE public.eval_results
27
+ ADD CONSTRAINT eval_results_thread_turn_id_thread_turns_id_fk
28
+ FOREIGN KEY (thread_turn_id)
29
+ REFERENCES public.thread_turns(id)
30
+ ON DELETE SET NULL;
31
+ EXCEPTION
32
+ WHEN duplicate_object THEN NULL;
33
+ END $$;
34
+
35
+ SELECT pg_advisory_unlock(hashtext('migration:0160_eval_results_thread_turn'));
@@ -0,0 +1,54 @@
1
+ -- Purpose: run scope pinning (Evaluations Trust Core U6) — runs execute
2
+ -- exactly the dataset version they were launched with. eval_runs
3
+ -- gains the dataset linkage (dataset_id), the manifest version
4
+ -- pinned at launch (dataset_version), and the resolved
5
+ -- dataset_case_id scope (pinned_case_ids). Case CONTENT is not
6
+ -- stored in the DB: launch copies each enabled case file to the
7
+ -- run snapshot prefix tenants/<slug>/eval-datasets/.runs/<run-id>/
8
+ -- in S3 (inside the guarded eval-datasets prefix, so the Pi-role
9
+ -- IAM Deny and tenant teardown cover it by construction).
10
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U6)
11
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0161_eval_run_pinning.sql
12
+ --
13
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
14
+ -- stopped at 0020; repo convention is psql-applied files gated by the
15
+ -- db:migrate-manual drift reporter). Requires 0160_eval_datasets.sql
16
+ -- (the eval_datasets table this FK points at).
17
+ --
18
+ -- All columns are additive and nullable with NO defaults — null is
19
+ -- semantically load-bearing:
20
+ -- * eval_runs.dataset_id NULL => legacy category/test-case launch
21
+ -- (the pre-U6 path keeps working unchanged).
22
+ -- * eval_runs.dataset_version NULL => scope not yet pinned (the
23
+ -- eval-runner stamps it when it captures the run snapshot, before
24
+ -- fan-out) or a legacy launch.
25
+ -- * eval_runs.pinned_case_ids NULL => same. Non-null = the launch-time
26
+ -- resolved dataset_case_ids; the reconciler reconstructs expected
27
+ -- scope from THIS list, never the live enabled=true table filter
28
+ -- (a case tombstoned mid-run must not wedge the run).
29
+ -- * eval_runs.dataset_id is ON DELETE NO ACTION by design: datasets
30
+ -- soft-archive (archived_at), never hard-delete while runs pin them.
31
+ --
32
+ -- creates-column: public.eval_runs.dataset_id
33
+ -- creates-column: public.eval_runs.dataset_version
34
+ -- creates-column: public.eval_runs.pinned_case_ids
35
+ -- creates-constraint: public.eval_runs.eval_runs_dataset_id_eval_datasets_id_fk
36
+
37
+ \set ON_ERROR_STOP on
38
+
39
+ BEGIN;
40
+
41
+ SET LOCAL lock_timeout = '5s';
42
+
43
+ ALTER TABLE public.eval_runs
44
+ ADD COLUMN IF NOT EXISTS dataset_id uuid
45
+ CONSTRAINT eval_runs_dataset_id_eval_datasets_id_fk
46
+ REFERENCES public.eval_datasets(id);
47
+
48
+ ALTER TABLE public.eval_runs
49
+ ADD COLUMN IF NOT EXISTS dataset_version integer;
50
+
51
+ ALTER TABLE public.eval_runs
52
+ ADD COLUMN IF NOT EXISTS pinned_case_ids text[];
53
+
54
+ COMMIT;
@@ -0,0 +1,62 @@
1
+ -- Hand-rolled — apply manually to dev via:
2
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0161_tenant_mcp_servers_plugin_source.sql
3
+ --
4
+ -- See docs/solutions/workflow-issues/manually-applied-drizzle-migrations-drift-from-dev-2026-04-21.md
5
+ --
6
+ -- U10 of docs/plans/2026-06-12-001-feat-application-plugins-plan.md.
7
+ -- Extends the tenant_mcp_servers management_source CHECK constraints
8
+ -- (created by 0149) to recognize the 'plugin' ownership source used by the
9
+ -- plugin engine's MCP component handler (0159 added plugin_install_id but
10
+ -- did not relax the checks):
11
+ --
12
+ -- - management_source may now be 'manual' | 'managed_application' | 'plugin'
13
+ -- - shape: plugin rows must carry plugin_install_id; managed_application
14
+ -- rows must carry managed_application_key; manual rows carry neither
15
+ -- ownership key. An ADOPTED Twenty row (U10 cutover) is
16
+ -- management_source='plugin' with plugin_install_id set and its
17
+ -- legacy managed_application_key retained — covered by the plugin arm,
18
+ -- which does not constrain managed_application_key.
19
+ --
20
+ -- The new constraints are renamed *_v2 so the drift reporter at
21
+ -- scripts/db-migrate-manual.sh can verify application (probing by name).
22
+ -- The old constraints are DROPped in the same transaction.
23
+ --
24
+ -- creates-constraint: public.tenant_mcp_servers.tenant_mcp_servers_management_source_check_v2
25
+ -- creates-constraint: public.tenant_mcp_servers.tenant_mcp_servers_managed_application_shape_check_v2
26
+
27
+ \set ON_ERROR_STOP on
28
+
29
+ SET lock_timeout = '5s';
30
+ SET statement_timeout = '15min';
31
+
32
+ BEGIN;
33
+
34
+ SELECT pg_advisory_xact_lock(hashtext('migration:0161_tenant_mcp_servers_plugin_source'));
35
+
36
+ ALTER TABLE public.tenant_mcp_servers
37
+ DROP CONSTRAINT IF EXISTS tenant_mcp_servers_management_source_check;
38
+
39
+ ALTER TABLE public.tenant_mcp_servers
40
+ DROP CONSTRAINT IF EXISTS tenant_mcp_servers_management_source_check_v2;
41
+
42
+ ALTER TABLE public.tenant_mcp_servers
43
+ ADD CONSTRAINT tenant_mcp_servers_management_source_check_v2
44
+ CHECK (management_source IN ('manual', 'managed_application', 'plugin'))
45
+ NOT VALID;
46
+
47
+ ALTER TABLE public.tenant_mcp_servers
48
+ DROP CONSTRAINT IF EXISTS tenant_mcp_servers_managed_application_shape_check;
49
+
50
+ ALTER TABLE public.tenant_mcp_servers
51
+ DROP CONSTRAINT IF EXISTS tenant_mcp_servers_managed_application_shape_check_v2;
52
+
53
+ ALTER TABLE public.tenant_mcp_servers
54
+ ADD CONSTRAINT tenant_mcp_servers_managed_application_shape_check_v2
55
+ CHECK (
56
+ (management_source = 'manual' AND managed_application_key IS NULL)
57
+ OR (management_source = 'managed_application' AND managed_application_key IS NOT NULL)
58
+ OR (management_source = 'plugin' AND plugin_install_id IS NOT NULL)
59
+ )
60
+ NOT VALID;
61
+
62
+ COMMIT;
@@ -0,0 +1,49 @@
1
+ -- Purpose: operator verdict override (Evaluations Trust Core U9). An
2
+ -- operator can overturn a wrong judge verdict; the override is
3
+ -- a SEPARATE field, never a mutation of `status` — the judge's
4
+ -- original verdict + rendered rubric stay immutable on the row
5
+ -- while aggregation reads the override last
6
+ -- (effective = override_status ?? status).
7
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U9)
8
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0162_eval_result_override.sql
9
+ --
10
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
11
+ -- stopped at 0020; repo convention is psql-applied files gated by the
12
+ -- db:migrate-manual drift reporter).
13
+ --
14
+ -- All columns are additive and nullable with NO defaults — null is
15
+ -- semantically load-bearing:
16
+ -- * eval_results.override_status NULL => no override; the judge's
17
+ -- verdict stands. Non-null: 'pass' | 'fail' (enum-by-comment) —
18
+ -- only scored rows (status pass|fail) may carry one; error rows
19
+ -- are rejected at the mutation.
20
+ -- * eval_results.overridden_by => authenticated caller identity,
21
+ -- derived server-side (never an argument).
22
+ -- * eval_results.overridden_at => when the override was written
23
+ -- (last-write posture; no history table in v1).
24
+ -- * eval_results.override_reason => required non-empty audit note.
25
+ --
26
+ -- creates-column: public.eval_results.override_status
27
+ -- creates-column: public.eval_results.overridden_by
28
+ -- creates-column: public.eval_results.overridden_at
29
+ -- creates-column: public.eval_results.override_reason
30
+
31
+ \set ON_ERROR_STOP on
32
+
33
+ BEGIN;
34
+
35
+ SET LOCAL lock_timeout = '5s';
36
+
37
+ ALTER TABLE public.eval_results
38
+ ADD COLUMN IF NOT EXISTS override_status text;
39
+
40
+ ALTER TABLE public.eval_results
41
+ ADD COLUMN IF NOT EXISTS overridden_by text;
42
+
43
+ ALTER TABLE public.eval_results
44
+ ADD COLUMN IF NOT EXISTS overridden_at timestamptz;
45
+
46
+ ALTER TABLE public.eval_results
47
+ ADD COLUMN IF NOT EXISTS override_reason text;
48
+
49
+ COMMIT;
@@ -0,0 +1,50 @@
1
+ -- Purpose: per-tenant read-only MCP tool allowlist for eval replay
2
+ -- (Evaluations Trust Core U13). Replay strips all MCP tools by
3
+ -- default (mcp_configs undefined); this table is a DEFAULT-DENY
4
+ -- allowlist — a tool is restored on replay ONLY if an operator
5
+ -- explicitly lists it for the tenant. One row per
6
+ -- (tenant_id, server_name, tool_name).
7
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U13)
8
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0163_eval_replay_tool_allowlist.sql
9
+ --
10
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
11
+ -- stopped at 0020; repo convention is psql-applied files gated by the
12
+ -- db:migrate-manual drift reporter).
13
+ --
14
+ -- Semantics:
15
+ -- * Default-deny: an empty allowlist for a tenant means replay carries no
16
+ -- MCP servers (mcp_configs stays undefined — current safe behavior).
17
+ -- * Per-tool: only the listed (server_name, tool_name) pairs become the
18
+ -- entry's toolWhitelist on replay; mutating tools and the email/web
19
+ -- side-effect kill-list stay blocked regardless.
20
+ -- * Lands inert until the eval payload/worker (same PR) reads it.
21
+ --
22
+ -- creates: public.eval_replay_tool_allowlist
23
+ -- creates-constraint: public.eval_replay_tool_allowlist.eval_replay_tool_allowlist_tenant_id_tenants_id_fk
24
+ -- creates: public.uq_eval_replay_tool_allowlist_tenant_server_tool
25
+ -- creates: public.idx_eval_replay_tool_allowlist_tenant
26
+
27
+ \set ON_ERROR_STOP on
28
+
29
+ BEGIN;
30
+
31
+ SET LOCAL lock_timeout = '5s';
32
+
33
+ CREATE TABLE IF NOT EXISTS public.eval_replay_tool_allowlist (
34
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
35
+ tenant_id uuid NOT NULL,
36
+ server_name text NOT NULL,
37
+ tool_name text NOT NULL,
38
+ created_at timestamptz NOT NULL DEFAULT now(),
39
+ CONSTRAINT eval_replay_tool_allowlist_tenant_id_tenants_id_fk
40
+ FOREIGN KEY (tenant_id)
41
+ REFERENCES public.tenants(id)
42
+ );
43
+
44
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_eval_replay_tool_allowlist_tenant_server_tool
45
+ ON public.eval_replay_tool_allowlist (tenant_id, server_name, tool_name);
46
+
47
+ CREATE INDEX IF NOT EXISTS idx_eval_replay_tool_allowlist_tenant
48
+ ON public.eval_replay_tool_allowlist (tenant_id);
49
+
50
+ COMMIT;
@@ -0,0 +1,52 @@
1
+ -- Purpose: turn the per-tenant eval-replay MCP tool allowlist into an
2
+ -- OPTIONAL OVERRIDE list (Evaluations Trust Core U14). Replay now
3
+ -- DEFAULT-ALLOWS read-shaped tools by a name heuristic and blocks
4
+ -- write-shaped tools (classified in @thinkwork/evals-core
5
+ -- classifyMcpToolAccess). This table stops being the gate and
6
+ -- becomes overrides: a row force-ALLOWS a tool the heuristic would
7
+ -- block (e.g. a trusted write) or force-BLOCKS a tool the heuristic
8
+ -- would allow (e.g. suppress a read). The `mode` column carries
9
+ -- which.
10
+ -- Plan: docs/plans/2026-06-12-003-feat-evaluations-trust-core-plan.md (U14)
11
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0164_eval_replay_tool_override_mode.sql
12
+ --
13
+ -- Hand-rolled (NOT registered in meta/_journal.json — the journal snapshot
14
+ -- stopped at 0020; repo convention is psql-applied files gated by the
15
+ -- db:migrate-manual drift reporter).
16
+ --
17
+ -- Semantics:
18
+ -- * Additive, nullable-with-default: every existing 0163 row defaults to
19
+ -- mode 'allow', which preserves its prior force-allow meaning exactly.
20
+ -- * mode is an enum-by-comment: 'allow' (force-allow this server/tool on
21
+ -- replay even if the heuristic blocks it) | 'block' (force-block this
22
+ -- server/tool on replay even if the heuristic allows it).
23
+ -- * The unique key stays (tenant_id, server_name, tool_name) — one
24
+ -- override per tool; toggling mode UPDATEs the existing row.
25
+ --
26
+ -- creates-column: public.eval_replay_tool_allowlist.mode
27
+ -- creates-constraint: public.eval_replay_tool_allowlist.eval_replay_tool_allowlist_mode_check
28
+
29
+ \set ON_ERROR_STOP on
30
+
31
+ BEGIN;
32
+
33
+ SET LOCAL lock_timeout = '5s';
34
+
35
+ ALTER TABLE public.eval_replay_tool_allowlist
36
+ ADD COLUMN IF NOT EXISTS mode text NOT NULL DEFAULT 'allow';
37
+
38
+ -- Guard the comment-enum at the DB so a stray write can't smuggle an
39
+ -- unknown mode (the selector treats only 'allow'/'block' meaningfully).
40
+ DO $$
41
+ BEGIN
42
+ IF NOT EXISTS (
43
+ SELECT 1 FROM pg_constraint
44
+ WHERE conname = 'eval_replay_tool_allowlist_mode_check'
45
+ ) THEN
46
+ ALTER TABLE public.eval_replay_tool_allowlist
47
+ ADD CONSTRAINT eval_replay_tool_allowlist_mode_check
48
+ CHECK (mode IN ('allow', 'block'));
49
+ END IF;
50
+ END $$;
51
+
52
+ COMMIT;
@@ -0,0 +1,153 @@
1
+ -- Purpose: add generic premium plugin entitlement and one-time install-key
2
+ -- storage for Company Brain and future premium plugins. Entitlements are
3
+ -- persistent tenant/plugin grants independent of install state; install keys
4
+ -- store digests only and can be redeemed once into an entitlement.
5
+ -- Plan: docs/plans/2026-06-13-002-feat-company-brain-premium-plugin-plan.md U2
6
+ -- Apply manually (no CI migration runner):
7
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0165_plugin_premium_entitlements.sql
8
+ -- Pre-flight:
9
+ -- SELECT count(*) FROM public.tenants;
10
+ -- SELECT count(*) FROM public.users;
11
+ -- SELECT count(*) FROM public.plugin_installs;
12
+ -- creates: public.plugin_entitlements
13
+ -- creates: public.plugin_install_keys
14
+ -- creates: public.uq_plugin_entitlements_active_tenant_plugin
15
+ -- creates: public.idx_plugin_entitlements_tenant_plugin
16
+ -- creates: public.idx_plugin_entitlements_product_status
17
+ -- creates: public.uq_plugin_install_keys_digest
18
+ -- creates: public.idx_plugin_install_keys_lookup
19
+ -- creates: public.idx_plugin_install_keys_plugin_status
20
+ -- creates: public.idx_plugin_install_keys_tenant_status
21
+ -- creates-constraint: public.plugin_entitlements.plugin_entitlements_pkey
22
+ -- creates-constraint: public.plugin_entitlements.plugin_entitlements_tenant_id_tenants_id_fk
23
+ -- creates-constraint: public.plugin_entitlements.plugin_entitlements_granted_by_user_id_users_id_fk
24
+ -- creates-constraint: public.plugin_entitlements.plugin_entitlements_status_allowed
25
+ -- creates-constraint: public.plugin_entitlements.plugin_entitlements_source_allowed
26
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_pkey
27
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_tenant_id_tenants_id_fk
28
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_issued_by_user_id_users_id_fk
29
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_redeemed_by_user_id_users_id_fk
30
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_redeemed_tenant_id_tenants_id_fk
31
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_redeemed_entitlement_id_fk
32
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_status_allowed
33
+ -- creates-constraint: public.plugin_install_keys.plugin_install_keys_redeemed_fields
34
+
35
+ \set ON_ERROR_STOP on
36
+
37
+ SET lock_timeout = '5s';
38
+ SET statement_timeout = '15min';
39
+
40
+ SELECT pg_advisory_lock(hashtext('migration:0165_plugin_premium_entitlements'));
41
+
42
+ -- ---------------------------------------------------------------------------
43
+ -- plugin_entitlements — persistent tenant premium grants
44
+ -- ---------------------------------------------------------------------------
45
+
46
+ CREATE TABLE IF NOT EXISTS public.plugin_entitlements (
47
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
48
+ tenant_id uuid NOT NULL,
49
+ plugin_key text NOT NULL,
50
+ entitlement_product_key text NOT NULL,
51
+ status text NOT NULL DEFAULT 'active',
52
+ source text NOT NULL,
53
+ granted_by_user_id uuid,
54
+ granted_at timestamptz NOT NULL DEFAULT now(),
55
+ revoked_at timestamptz,
56
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
57
+ created_at timestamptz NOT NULL DEFAULT now(),
58
+ updated_at timestamptz NOT NULL DEFAULT now(),
59
+ CONSTRAINT plugin_entitlements_tenant_id_tenants_id_fk
60
+ FOREIGN KEY (tenant_id)
61
+ REFERENCES public.tenants(id)
62
+ ON DELETE CASCADE,
63
+ CONSTRAINT plugin_entitlements_granted_by_user_id_users_id_fk
64
+ FOREIGN KEY (granted_by_user_id)
65
+ REFERENCES public.users(id)
66
+ ON DELETE SET NULL,
67
+ CONSTRAINT plugin_entitlements_status_allowed
68
+ CHECK (status IN ('active', 'revoked')),
69
+ CONSTRAINT plugin_entitlements_source_allowed
70
+ CHECK (source IN ('install_key', 'backdoor_key', 'operator_grant', 'migration'))
71
+ );
72
+
73
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_plugin_entitlements_active_tenant_plugin
74
+ ON public.plugin_entitlements (tenant_id, plugin_key)
75
+ WHERE status = 'active';
76
+
77
+ CREATE INDEX IF NOT EXISTS idx_plugin_entitlements_tenant_plugin
78
+ ON public.plugin_entitlements (tenant_id, plugin_key);
79
+
80
+ CREATE INDEX IF NOT EXISTS idx_plugin_entitlements_product_status
81
+ ON public.plugin_entitlements (entitlement_product_key, status);
82
+
83
+ -- ---------------------------------------------------------------------------
84
+ -- plugin_install_keys — digest-only one-time premium install keys
85
+ -- ---------------------------------------------------------------------------
86
+
87
+ CREATE TABLE IF NOT EXISTS public.plugin_install_keys (
88
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
89
+ plugin_key text NOT NULL,
90
+ entitlement_product_key text NOT NULL,
91
+ key_digest text NOT NULL,
92
+ digest_algorithm text NOT NULL DEFAULT 'sha256',
93
+ key_secret_version text,
94
+ tenant_id uuid,
95
+ status text NOT NULL DEFAULT 'issued',
96
+ issued_by_user_id uuid,
97
+ issued_at timestamptz NOT NULL DEFAULT now(),
98
+ expires_at timestamptz,
99
+ revoked_at timestamptz,
100
+ redeemed_by_user_id uuid,
101
+ redeemed_tenant_id uuid,
102
+ redeemed_entitlement_id uuid,
103
+ redeemed_at timestamptz,
104
+ audit_correlation_id text,
105
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
106
+ created_at timestamptz NOT NULL DEFAULT now(),
107
+ updated_at timestamptz NOT NULL DEFAULT now(),
108
+ CONSTRAINT plugin_install_keys_tenant_id_tenants_id_fk
109
+ FOREIGN KEY (tenant_id)
110
+ REFERENCES public.tenants(id)
111
+ ON DELETE SET NULL,
112
+ CONSTRAINT plugin_install_keys_issued_by_user_id_users_id_fk
113
+ FOREIGN KEY (issued_by_user_id)
114
+ REFERENCES public.users(id)
115
+ ON DELETE SET NULL,
116
+ CONSTRAINT plugin_install_keys_redeemed_by_user_id_users_id_fk
117
+ FOREIGN KEY (redeemed_by_user_id)
118
+ REFERENCES public.users(id)
119
+ ON DELETE SET NULL,
120
+ CONSTRAINT plugin_install_keys_redeemed_tenant_id_tenants_id_fk
121
+ FOREIGN KEY (redeemed_tenant_id)
122
+ REFERENCES public.tenants(id)
123
+ ON DELETE SET NULL,
124
+ CONSTRAINT plugin_install_keys_redeemed_entitlement_id_fk
125
+ FOREIGN KEY (redeemed_entitlement_id)
126
+ REFERENCES public.plugin_entitlements(id)
127
+ ON DELETE SET NULL,
128
+ CONSTRAINT plugin_install_keys_status_allowed
129
+ CHECK (status IN ('issued', 'redeemed', 'revoked', 'expired')),
130
+ CONSTRAINT plugin_install_keys_redeemed_fields
131
+ CHECK (
132
+ status <> 'redeemed'
133
+ OR (
134
+ redeemed_at IS NOT NULL
135
+ AND redeemed_tenant_id IS NOT NULL
136
+ AND redeemed_entitlement_id IS NOT NULL
137
+ )
138
+ )
139
+ );
140
+
141
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_plugin_install_keys_digest
142
+ ON public.plugin_install_keys (key_digest);
143
+
144
+ CREATE INDEX IF NOT EXISTS idx_plugin_install_keys_lookup
145
+ ON public.plugin_install_keys (plugin_key, key_digest);
146
+
147
+ CREATE INDEX IF NOT EXISTS idx_plugin_install_keys_plugin_status
148
+ ON public.plugin_install_keys (plugin_key, status);
149
+
150
+ CREATE INDEX IF NOT EXISTS idx_plugin_install_keys_tenant_status
151
+ ON public.plugin_install_keys (tenant_id, status);
152
+
153
+ SELECT pg_advisory_unlock(hashtext('migration:0165_plugin_premium_entitlements'));