thinkwork-cli 0.12.12 → 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 +22123 -9219
  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,152 @@
1
+ -- Purpose: add tenant-scoped Bedrock model catalog state.
2
+ -- Plan: docs/plans/2026-06-09-001-feat-tenant-model-catalog-plan.md U1
3
+ -- Apply manually (no CI migration runner):
4
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0155_tenant_model_catalog.sql
5
+ -- Pre-flight:
6
+ -- SELECT count(*) FROM public.model_catalog;
7
+ -- SELECT count(*) FROM public.tenants;
8
+ -- creates: public.tenant_model_catalog
9
+ -- creates: public.idx_tenant_model_catalog_tenant_enabled
10
+ -- creates: public.idx_tenant_model_catalog_model
11
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_pkey
12
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_tenant_id_tenants_id_fk
13
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_model_id_model_catalog_model_id_fk
14
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_imported_by_user_id_users_id_fk
15
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_pricing_status_allowed
16
+ -- creates-constraint: public.tenant_model_catalog.tenant_model_catalog_enabled_requires_resolved_pricing
17
+
18
+ \set ON_ERROR_STOP on
19
+
20
+ SET lock_timeout = '5s';
21
+ SET statement_timeout = '15min';
22
+
23
+ SELECT pg_advisory_lock(hashtext('migration:0155_tenant_model_catalog'));
24
+
25
+ CREATE TABLE IF NOT EXISTS public.tenant_model_catalog (
26
+ tenant_id uuid NOT NULL,
27
+ model_id text NOT NULL,
28
+ display_name text NOT NULL,
29
+ enabled boolean NOT NULL DEFAULT false,
30
+ pricing_status text NOT NULL DEFAULT 'missing',
31
+ pricing_source text,
32
+ pricing_diagnostics jsonb NOT NULL DEFAULT '{}'::jsonb,
33
+ last_priced_at timestamptz,
34
+ import_source text NOT NULL DEFAULT 'backfill',
35
+ import_payload jsonb NOT NULL DEFAULT '{}'::jsonb,
36
+ imported_by_user_id uuid,
37
+ imported_at timestamptz NOT NULL DEFAULT now(),
38
+ created_at timestamptz NOT NULL DEFAULT now(),
39
+ updated_at timestamptz NOT NULL DEFAULT now(),
40
+ CONSTRAINT tenant_model_catalog_pkey
41
+ PRIMARY KEY (tenant_id, model_id),
42
+ CONSTRAINT tenant_model_catalog_tenant_id_tenants_id_fk
43
+ FOREIGN KEY (tenant_id)
44
+ REFERENCES public.tenants(id)
45
+ ON DELETE CASCADE,
46
+ CONSTRAINT tenant_model_catalog_model_id_model_catalog_model_id_fk
47
+ FOREIGN KEY (model_id)
48
+ REFERENCES public.model_catalog(model_id)
49
+ ON DELETE CASCADE,
50
+ CONSTRAINT tenant_model_catalog_imported_by_user_id_users_id_fk
51
+ FOREIGN KEY (imported_by_user_id)
52
+ REFERENCES public.users(id)
53
+ ON DELETE SET NULL,
54
+ CONSTRAINT tenant_model_catalog_pricing_status_allowed
55
+ CHECK (pricing_status IN ('resolved', 'missing', 'ambiguous', 'error')),
56
+ CONSTRAINT tenant_model_catalog_enabled_requires_resolved_pricing
57
+ CHECK (enabled IS FALSE OR pricing_status = 'resolved')
58
+ );
59
+
60
+ CREATE INDEX IF NOT EXISTS idx_tenant_model_catalog_tenant_enabled
61
+ ON public.tenant_model_catalog (tenant_id, enabled);
62
+
63
+ CREATE INDEX IF NOT EXISTS idx_tenant_model_catalog_model
64
+ ON public.tenant_model_catalog (model_id);
65
+
66
+ WITH referenced_models AS (
67
+ SELECT tenant_id, default_model AS model_id
68
+ FROM public.tenant_settings
69
+ WHERE tenant_id IS NOT NULL
70
+ AND default_model IS NOT NULL
71
+
72
+ UNION
73
+
74
+ SELECT tenant_id, model AS model_id
75
+ FROM public.agents
76
+ WHERE model IS NOT NULL
77
+ AND status <> 'archived'
78
+
79
+ UNION
80
+
81
+ SELECT tenant_id, model AS model_id
82
+ FROM public.agent_templates
83
+ WHERE tenant_id IS NOT NULL
84
+ AND model IS NOT NULL
85
+
86
+ UNION
87
+
88
+ SELECT tenant_id, model_id
89
+ FROM public.agent_profiles
90
+ WHERE model_id IS NOT NULL
91
+
92
+ UNION
93
+
94
+ SELECT tenant_id, model_id
95
+ FROM public.user_model_approvals
96
+ ),
97
+ eligible_models AS (
98
+ SELECT DISTINCT
99
+ rm.tenant_id,
100
+ mc.model_id,
101
+ mc.display_name,
102
+ mc.input_cost_per_million,
103
+ mc.output_cost_per_million
104
+ FROM referenced_models rm
105
+ JOIN public.model_catalog mc
106
+ ON mc.model_id = rm.model_id
107
+ AND mc.is_available IS TRUE
108
+ WHERE rm.tenant_id IS NOT NULL
109
+ )
110
+ INSERT INTO public.tenant_model_catalog (
111
+ tenant_id,
112
+ model_id,
113
+ display_name,
114
+ enabled,
115
+ pricing_status,
116
+ pricing_source,
117
+ pricing_diagnostics,
118
+ last_priced_at,
119
+ import_source,
120
+ import_payload
121
+ )
122
+ SELECT
123
+ tenant_id,
124
+ model_id,
125
+ display_name,
126
+ (input_cost_per_million IS NOT NULL AND output_cost_per_million IS NOT NULL) AS enabled,
127
+ CASE
128
+ WHEN input_cost_per_million IS NOT NULL AND output_cost_per_million IS NOT NULL
129
+ THEN 'resolved'
130
+ ELSE 'missing'
131
+ END AS pricing_status,
132
+ CASE
133
+ WHEN input_cost_per_million IS NOT NULL AND output_cost_per_million IS NOT NULL
134
+ THEN 'legacy-model-catalog'
135
+ ELSE NULL
136
+ END AS pricing_source,
137
+ CASE
138
+ WHEN input_cost_per_million IS NOT NULL AND output_cost_per_million IS NOT NULL
139
+ THEN jsonb_build_object('backfilledFrom', 'model_catalog')
140
+ ELSE jsonb_build_object('reason', 'model_catalog_missing_token_costs')
141
+ END AS pricing_diagnostics,
142
+ CASE
143
+ WHEN input_cost_per_million IS NOT NULL AND output_cost_per_million IS NOT NULL
144
+ THEN now()
145
+ ELSE NULL
146
+ END AS last_priced_at,
147
+ 'backfill' AS import_source,
148
+ jsonb_build_object('referencedBy', 'existing tenant defaults, agents, profiles, templates, or approvals') AS import_payload
149
+ FROM eligible_models
150
+ ON CONFLICT (tenant_id, model_id) DO NOTHING;
151
+
152
+ SELECT pg_advisory_unlock(hashtext('migration:0155_tenant_model_catalog'));
@@ -0,0 +1,52 @@
1
+ -- Bootstrap credential lease metadata for browser-first customer deployments.
2
+ --
3
+ -- Credential material lives only in AWS Secrets Manager. This table stores
4
+ -- lease metadata, redaction-safe fingerprints, and cleanup state.
5
+ --
6
+ -- creates: public.bootstrap_credential_leases
7
+ -- creates: public.bootstrap_credential_leases_session_idx
8
+ -- creates: public.bootstrap_credential_leases_status_expires_idx
9
+ -- creates: public.bootstrap_credential_leases_secret_arn_uidx
10
+
11
+ CREATE TABLE IF NOT EXISTS "bootstrap_credential_leases" (
12
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
13
+ "session_id" uuid NOT NULL REFERENCES "customer_deployment_sessions"("id") ON DELETE cascade,
14
+ "status" text NOT NULL DEFAULT 'pending',
15
+ "lease_type" text NOT NULL,
16
+ "secret_arn" text NOT NULL,
17
+ "secret_fingerprint" text NOT NULL,
18
+ "external_id_hash" text,
19
+ "role_arn" text,
20
+ "expires_at" timestamp with time zone NOT NULL,
21
+ "validated_at" timestamp with time zone,
22
+ "in_use_at" timestamp with time zone,
23
+ "transferred_at" timestamp with time zone,
24
+ "revoked_at" timestamp with time zone,
25
+ "failed_cleanup_reason" text,
26
+ "audit_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
27
+ "created_at" timestamp with time zone NOT NULL DEFAULT now(),
28
+ "updated_at" timestamp with time zone NOT NULL DEFAULT now(),
29
+ CONSTRAINT "bootstrap_credential_leases_status_allowed" CHECK (
30
+ "status" IN (
31
+ 'pending',
32
+ 'validated',
33
+ 'in_use',
34
+ 'transferred',
35
+ 'revoked',
36
+ 'expired',
37
+ 'failed_cleanup'
38
+ )
39
+ ),
40
+ CONSTRAINT "bootstrap_credential_leases_type_allowed" CHECK (
41
+ "lease_type" IN ('temporary_credentials', 'assumable_role')
42
+ )
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS "bootstrap_credential_leases_session_idx"
46
+ ON "bootstrap_credential_leases" ("session_id");
47
+
48
+ CREATE INDEX IF NOT EXISTS "bootstrap_credential_leases_status_expires_idx"
49
+ ON "bootstrap_credential_leases" ("status", "expires_at");
50
+
51
+ CREATE UNIQUE INDEX IF NOT EXISTS "bootstrap_credential_leases_secret_arn_uidx"
52
+ ON "bootstrap_credential_leases" ("secret_arn");
@@ -0,0 +1,79 @@
1
+ -- Purpose: admit Hindsight observations as a Knowledge Graph ingest source and
2
+ -- add per-(tenant, bank) incremental cursors for the tenant fan-in.
3
+ -- Plan: docs/plans/2026-06-09-004-feat-cognee-centric-memory-pipeline-plan.md (U4)
4
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0157_knowledge_graph_observations_source.sql
5
+ -- creates: public.knowledge_graph_observation_cursors
6
+ -- creates: public.uq_kg_observation_cursors_tenant_bank
7
+ -- creates: public.idx_kg_observation_cursors_tenant
8
+ -- creates-constraint: public.knowledge_graph_ingest_runs.knowledge_graph_ingest_runs_source_kind_allowed
9
+ -- creates-constraint: public.knowledge_graph_ingest_runs.knowledge_graph_ingest_runs_trigger_allowed
10
+ -- creates-constraint: public.knowledge_graph_entities.knowledge_graph_entities_source_kind_allowed
11
+ -- creates-constraint: public.knowledge_graph_relationships.knowledge_graph_relationships_source_kind_allowed
12
+ -- creates-constraint: public.knowledge_graph_evidence.knowledge_graph_evidence_source_kind_allowed
13
+ -- creates-constraint: public.knowledge_graph_evidence.knowledge_graph_evidence_evidence_source_kind_allowed
14
+
15
+ \set ON_ERROR_STOP on
16
+
17
+ BEGIN;
18
+
19
+ SET LOCAL lock_timeout = '5s';
20
+
21
+ -- Source-kind vocabulary gains 'observations'. Constraint re-adds validate
22
+ -- against existing rows; all current rows use thread/wiki/brain, so widening
23
+ -- is safe in either deploy order.
24
+ ALTER TABLE public.knowledge_graph_ingest_runs
25
+ DROP CONSTRAINT IF EXISTS knowledge_graph_ingest_runs_source_kind_allowed;
26
+ ALTER TABLE public.knowledge_graph_ingest_runs
27
+ ADD CONSTRAINT knowledge_graph_ingest_runs_source_kind_allowed
28
+ CHECK (source_kind IN ('thread','wiki','brain','observations'));
29
+
30
+ -- U5's drainer schedules observation runs; 'manual' stays the default.
31
+ ALTER TABLE public.knowledge_graph_ingest_runs
32
+ DROP CONSTRAINT IF EXISTS knowledge_graph_ingest_runs_trigger_allowed;
33
+ ALTER TABLE public.knowledge_graph_ingest_runs
34
+ ADD CONSTRAINT knowledge_graph_ingest_runs_trigger_allowed
35
+ CHECK ("trigger" IN ('manual','scheduled'));
36
+
37
+ ALTER TABLE public.knowledge_graph_entities
38
+ DROP CONSTRAINT IF EXISTS knowledge_graph_entities_source_kind_allowed;
39
+ ALTER TABLE public.knowledge_graph_entities
40
+ ADD CONSTRAINT knowledge_graph_entities_source_kind_allowed
41
+ CHECK (source_kind IN ('thread','wiki','brain','observations'));
42
+
43
+ ALTER TABLE public.knowledge_graph_relationships
44
+ DROP CONSTRAINT IF EXISTS knowledge_graph_relationships_source_kind_allowed;
45
+ ALTER TABLE public.knowledge_graph_relationships
46
+ ADD CONSTRAINT knowledge_graph_relationships_source_kind_allowed
47
+ CHECK (source_kind IN ('thread','wiki','brain','observations'));
48
+
49
+ ALTER TABLE public.knowledge_graph_evidence
50
+ DROP CONSTRAINT IF EXISTS knowledge_graph_evidence_source_kind_allowed;
51
+ ALTER TABLE public.knowledge_graph_evidence
52
+ ADD CONSTRAINT knowledge_graph_evidence_source_kind_allowed
53
+ CHECK (source_kind IN ('thread','wiki','brain','observations'));
54
+
55
+ ALTER TABLE public.knowledge_graph_evidence
56
+ DROP CONSTRAINT IF EXISTS knowledge_graph_evidence_evidence_source_kind_allowed;
57
+ ALTER TABLE public.knowledge_graph_evidence
58
+ ADD CONSTRAINT knowledge_graph_evidence_evidence_source_kind_allowed
59
+ CHECK (evidence_source_kind IN ('thread_message','wiki_page','wiki_section','brain_page','brain_section','hindsight_observation','cognee_payload','normalizer'));
60
+
61
+ -- Per-(tenant, bank) cursors for the observations fan-in. The
62
+ -- (last_record_updated_at, last_record_id) pair mirrors the wiki compile
63
+ -- cursor tiebreaker; cursors advance only in the same transaction as the
64
+ -- mirror snapshot replace.
65
+ CREATE TABLE IF NOT EXISTS public.knowledge_graph_observation_cursors (
66
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
67
+ bank_id text NOT NULL,
68
+ last_record_updated_at timestamptz,
69
+ last_record_id text,
70
+ updated_at timestamptz NOT NULL DEFAULT now()
71
+ );
72
+
73
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_kg_observation_cursors_tenant_bank
74
+ ON public.knowledge_graph_observation_cursors (tenant_id, bank_id);
75
+
76
+ CREATE INDEX IF NOT EXISTS idx_kg_observation_cursors_tenant
77
+ ON public.knowledge_graph_observation_cursors (tenant_id);
78
+
79
+ COMMIT;
@@ -0,0 +1,80 @@
1
+ -- Purpose: add pending_user_questions for the ask_user_question HITL flow —
2
+ -- one row per question batch the parent agent asks; answer state lives on
3
+ -- this row (never mutated into the message's parts payload). The partial
4
+ -- unique index enforces one `pending` batch per thread (R8) so the intake
5
+ -- endpoint can return 409 on conflict.
6
+ -- Plan: docs/plans/2026-06-09-005-feat-ask-user-question-plan.md U1
7
+ -- Apply manually (no CI migration runner):
8
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0158_pending_user_questions.sql
9
+ -- creates: public.pending_user_questions
10
+ -- creates: public.pending_user_questions_one_pending_per_thread
11
+ -- creates: public.idx_pending_user_questions_tenant
12
+ -- creates: public.idx_pending_user_questions_thread_status
13
+ -- creates: public.idx_pending_user_questions_message
14
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_tenant_id_tenants_id_fk
15
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_thread_id_threads_id_fk
16
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_message_id_messages_id_fk
17
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_thread_turn_id_thread_turns_id_fk
18
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_status_allowed
19
+ -- creates-constraint: public.pending_user_questions.pending_user_questions_answered_via_allowed
20
+
21
+ \set ON_ERROR_STOP on
22
+
23
+ SET lock_timeout = '5s';
24
+ SET statement_timeout = '15min';
25
+
26
+ SELECT pg_advisory_lock(hashtext('migration:0158_pending_user_questions'));
27
+
28
+ CREATE TABLE IF NOT EXISTS public.pending_user_questions (
29
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
30
+ tenant_id uuid NOT NULL,
31
+ thread_id uuid NOT NULL,
32
+ message_id uuid NOT NULL,
33
+ thread_turn_id uuid NOT NULL,
34
+ status text NOT NULL DEFAULT 'pending',
35
+ questions jsonb NOT NULL,
36
+ answers jsonb,
37
+ answered_via text,
38
+ answered_by text,
39
+ answered_at timestamptz,
40
+ delegation_context jsonb,
41
+ created_at timestamptz NOT NULL DEFAULT now(),
42
+ CONSTRAINT pending_user_questions_tenant_id_tenants_id_fk
43
+ FOREIGN KEY (tenant_id)
44
+ REFERENCES public.tenants(id)
45
+ ON DELETE CASCADE,
46
+ CONSTRAINT pending_user_questions_thread_id_threads_id_fk
47
+ FOREIGN KEY (thread_id)
48
+ REFERENCES public.threads(id)
49
+ ON DELETE CASCADE,
50
+ CONSTRAINT pending_user_questions_message_id_messages_id_fk
51
+ FOREIGN KEY (message_id)
52
+ REFERENCES public.messages(id)
53
+ ON DELETE CASCADE,
54
+ CONSTRAINT pending_user_questions_thread_turn_id_thread_turns_id_fk
55
+ FOREIGN KEY (thread_turn_id)
56
+ REFERENCES public.thread_turns(id),
57
+ CONSTRAINT pending_user_questions_status_allowed
58
+ CHECK (status IN ('pending', 'answered', 'cancelled')),
59
+ CONSTRAINT pending_user_questions_answered_via_allowed
60
+ CHECK (answered_via IS NULL OR answered_via IN ('card', 'reply'))
61
+ );
62
+
63
+ -- R8: at most one pending question batch per thread; the intake endpoint
64
+ -- surfaces violations as 409.
65
+ CREATE UNIQUE INDEX IF NOT EXISTS pending_user_questions_one_pending_per_thread
66
+ ON public.pending_user_questions (thread_id)
67
+ WHERE status = 'pending';
68
+
69
+ CREATE INDEX IF NOT EXISTS idx_pending_user_questions_tenant
70
+ ON public.pending_user_questions (tenant_id);
71
+
72
+ CREATE INDEX IF NOT EXISTS idx_pending_user_questions_thread_status
73
+ ON public.pending_user_questions (thread_id, status);
74
+
75
+ -- Message.userQuestion resolves by message id; the messages.id FK cascade
76
+ -- also needs this to avoid a sequential scan on message deletes.
77
+ CREATE INDEX IF NOT EXISTS idx_pending_user_questions_message
78
+ ON public.pending_user_questions (message_id);
79
+
80
+ SELECT pg_advisory_unlock(hashtext('migration:0158_pending_user_questions'));
@@ -0,0 +1,38 @@
1
+ -- Purpose: relax the wiki owner-scope covenant for tenant-scoped pages —
2
+ -- `owner_id` becomes nullable on wiki.pages AND wiki.compile_jobs
3
+ -- (graph-mode compile jobs are tenant-keyed), and a partial unique
4
+ -- index enforces (tenant_id, type, slug) uniqueness for null-owner
5
+ -- pages (the existing four-column unique treats NULLs as distinct
6
+ -- and would silently allow duplicate tenant pages).
7
+ -- Purely additive: nothing drops, no data changes. User-scoped
8
+ -- pages keep their owner_id; the U11 cutover archive pass is a
9
+ -- separate, later migration.
10
+ -- Plan: docs/plans/2026-06-09-004-feat-cognee-centric-memory-pipeline-plan.md (U9)
11
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0158_wiki_tenant_scope.sql
12
+ -- creates: wiki.uq_pages_tenant_type_slug_tenant_scope
13
+ -- Note: the two ALTER COLUMN ... DROP NOT NULL statements (wiki.pages.owner_id,
14
+ -- wiki.compile_jobs.owner_id) have no drift-reporter marker convention —
15
+ -- nullability changes aren't object creations. They are idempotent.
16
+
17
+ \set ON_ERROR_STOP on
18
+
19
+ BEGIN;
20
+
21
+ SET LOCAL lock_timeout = '5s';
22
+
23
+ -- Tenant-scoped pages carry owner_id NULL (graph→wiki materializer).
24
+ ALTER TABLE wiki.pages
25
+ ALTER COLUMN owner_id DROP NOT NULL;
26
+
27
+ -- Graph-mode compile jobs are tenant-keyed — same covenant change.
28
+ ALTER TABLE wiki.compile_jobs
29
+ ALTER COLUMN owner_id DROP NOT NULL;
30
+
31
+ -- Integrity-load-bearing: uq_pages_tenant_owner_type_slug treats NULL
32
+ -- owner_id as distinct, so duplicate (tenant, type, slug) tenant pages
33
+ -- would otherwise insert silently. All existing indexes stay untouched.
34
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_pages_tenant_type_slug_tenant_scope
35
+ ON wiki.pages (tenant_id, type, slug)
36
+ WHERE owner_id IS NULL;
37
+
38
+ COMMIT;
@@ -0,0 +1,49 @@
1
+ -- Purpose: space-local Agent Profiles (dynamic workspace U7). Profiles defined
2
+ -- under a Space source's agents/ folder project into agent_profiles scoped to
3
+ -- that Space via source_space_id (NULL = central/agent-source profile). Slug
4
+ -- uniqueness becomes per-origin: central keeps tenant+slug uniqueness, while
5
+ -- space-local rows are unique per (tenant, slug, source_space_id) so a
6
+ -- space-local slug may intentionally shadow a central one while its Space is
7
+ -- active.
8
+ -- Plan: docs/plans/2026-06-12-002-feat-dynamic-workspace-plan.md U7
9
+ -- Apply manually (no CI migration runner):
10
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0159_agent_profiles_space_local.sql
11
+ -- creates-column: public.agent_profiles.source_space_id
12
+ -- creates-constraint: public.agent_profiles.agent_profiles_source_space_id_spaces_id_fk
13
+ -- creates: public.uq_agent_profiles_tenant_slug
14
+ -- creates: public.uq_agent_profiles_tenant_slug_source_space
15
+
16
+ \set ON_ERROR_STOP on
17
+
18
+ SET lock_timeout = '5s';
19
+ SET statement_timeout = '15min';
20
+
21
+ SELECT pg_advisory_lock(hashtext('migration:0159_agent_profiles_space_local'));
22
+
23
+ ALTER TABLE public.agent_profiles
24
+ ADD COLUMN IF NOT EXISTS source_space_id uuid;
25
+
26
+ DO $$
27
+ BEGIN
28
+ ALTER TABLE public.agent_profiles
29
+ ADD CONSTRAINT agent_profiles_source_space_id_spaces_id_fk
30
+ FOREIGN KEY (source_space_id)
31
+ REFERENCES public.spaces(id)
32
+ ON DELETE CASCADE;
33
+ EXCEPTION
34
+ WHEN duplicate_object THEN NULL;
35
+ END $$;
36
+
37
+ -- Recreate the tenant+slug uniqueness as a partial index over central rows
38
+ -- only; space-local rows get their own per-Space uniqueness.
39
+ DROP INDEX IF EXISTS uq_agent_profiles_tenant_slug;
40
+
41
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_agent_profiles_tenant_slug
42
+ ON public.agent_profiles (tenant_id, slug)
43
+ WHERE source_space_id IS NULL;
44
+
45
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_agent_profiles_tenant_slug_source_space
46
+ ON public.agent_profiles (tenant_id, slug, source_space_id)
47
+ WHERE source_space_id IS NOT NULL;
48
+
49
+ SELECT pg_advisory_unlock(hashtext('migration:0159_agent_profiles_space_local'));
@@ -0,0 +1,193 @@
1
+ -- Purpose: add the application-plugin engine tables — canonical install,
2
+ -- component, and user-activation state for the plugin system. Installs pin
3
+ -- a catalog version + payload sha256; components carry handler linkage
4
+ -- (handler_ref) for read-time reconciliation against deployment jobs;
5
+ -- activations hold one app-level OAuth grant per (user, install) with one
6
+ -- token record per RFC 8707 resource indicator. Also adds the
7
+ -- tenant_mcp_servers.plugin_install_id ownership column for plugin-managed
8
+ -- MCP rows.
9
+ -- Plan: docs/plans/2026-06-12-001-feat-application-plugins-plan.md U4
10
+ -- Apply manually (no CI migration runner):
11
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0159_application_plugins.sql
12
+ -- Pre-flight:
13
+ -- SELECT count(*) FROM public.tenants;
14
+ -- SELECT count(*) FROM public.users;
15
+ -- SELECT count(*) FROM public.tenant_mcp_servers;
16
+ -- creates: public.plugin_installs
17
+ -- creates: public.plugin_components
18
+ -- creates: public.user_plugin_activations
19
+ -- creates: public.user_plugin_activation_tokens
20
+ -- creates: public.uq_plugin_installs_tenant_plugin
21
+ -- creates: public.idx_plugin_installs_tenant_state
22
+ -- creates: public.uq_plugin_components_install_key
23
+ -- creates: public.idx_plugin_components_install
24
+ -- creates: public.uq_user_plugin_activations
25
+ -- creates: public.idx_user_plugin_activations_install
26
+ -- creates: public.uq_user_plugin_activation_tokens_resource
27
+ -- creates-column: public.tenant_mcp_servers.plugin_install_id
28
+ -- creates-constraint: public.plugin_installs.plugin_installs_pkey
29
+ -- creates-constraint: public.plugin_installs.plugin_installs_tenant_id_tenants_id_fk
30
+ -- creates-constraint: public.plugin_installs.plugin_installs_state_allowed
31
+ -- creates-constraint: public.plugin_components.plugin_components_pkey
32
+ -- creates-constraint: public.plugin_components.plugin_components_plugin_install_id_plugin_installs_id_fk
33
+ -- creates-constraint: public.plugin_components.plugin_components_state_allowed
34
+ -- creates-constraint: public.plugin_components.plugin_components_type_allowed
35
+ -- creates-constraint: public.user_plugin_activations.user_plugin_activations_pkey
36
+ -- creates-constraint: public.user_plugin_activations.user_plugin_activations_user_id_users_id_fk
37
+ -- creates-constraint: public.user_plugin_activations.user_plugin_activations_plugin_install_id_plugin_installs_id_fk
38
+ -- creates-constraint: public.user_plugin_activations.user_plugin_activations_status_allowed
39
+ -- creates-constraint: public.user_plugin_activation_tokens.user_plugin_activation_tokens_pkey
40
+ -- creates-constraint: public.user_plugin_activation_tokens.user_plugin_activation_tokens_activation_id_fk
41
+ -- creates-constraint: public.user_plugin_activation_tokens.user_plugin_activation_tokens_status_allowed
42
+ -- creates-constraint: public.tenant_mcp_servers.tenant_mcp_servers_plugin_install_id_plugin_installs_id_fk
43
+
44
+ \set ON_ERROR_STOP on
45
+
46
+ SET lock_timeout = '5s';
47
+ SET statement_timeout = '15min';
48
+
49
+ SELECT pg_advisory_lock(hashtext('migration:0159_application_plugins'));
50
+
51
+ -- ---------------------------------------------------------------------------
52
+ -- plugin_installs — one row per (tenant, plugin); pins the catalog version
53
+ -- ---------------------------------------------------------------------------
54
+
55
+ CREATE TABLE IF NOT EXISTS public.plugin_installs (
56
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
57
+ tenant_id uuid NOT NULL,
58
+ plugin_key text NOT NULL,
59
+ pinned_version text NOT NULL,
60
+ pinned_payload_sha256 text NOT NULL,
61
+ state text NOT NULL DEFAULT 'installing',
62
+ idempotency_key text NOT NULL,
63
+ last_transition_at timestamptz NOT NULL DEFAULT now(),
64
+ last_error text,
65
+ created_at timestamptz NOT NULL DEFAULT now(),
66
+ updated_at timestamptz NOT NULL DEFAULT now(),
67
+ CONSTRAINT plugin_installs_tenant_id_tenants_id_fk
68
+ FOREIGN KEY (tenant_id)
69
+ REFERENCES public.tenants(id)
70
+ ON DELETE CASCADE,
71
+ CONSTRAINT plugin_installs_state_allowed
72
+ CHECK (state IN ('installing', 'awaiting_approval', 'installed', 'partially_installed', 'failed', 'uninstalling'))
73
+ );
74
+
75
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_plugin_installs_tenant_plugin
76
+ ON public.plugin_installs (tenant_id, plugin_key);
77
+
78
+ CREATE INDEX IF NOT EXISTS idx_plugin_installs_tenant_state
79
+ ON public.plugin_installs (tenant_id, state);
80
+
81
+ -- ---------------------------------------------------------------------------
82
+ -- plugin_components — per-component provisioning state under an install
83
+ -- ---------------------------------------------------------------------------
84
+
85
+ CREATE TABLE IF NOT EXISTS public.plugin_components (
86
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
87
+ plugin_install_id uuid NOT NULL,
88
+ component_key text NOT NULL,
89
+ component_type text NOT NULL,
90
+ state text NOT NULL DEFAULT 'pending',
91
+ handler_ref jsonb NOT NULL DEFAULT '{}'::jsonb,
92
+ last_error text,
93
+ created_at timestamptz NOT NULL DEFAULT now(),
94
+ updated_at timestamptz NOT NULL DEFAULT now(),
95
+ CONSTRAINT plugin_components_plugin_install_id_plugin_installs_id_fk
96
+ FOREIGN KEY (plugin_install_id)
97
+ REFERENCES public.plugin_installs(id)
98
+ ON DELETE CASCADE,
99
+ CONSTRAINT plugin_components_state_allowed
100
+ CHECK (state IN ('pending', 'provisioned', 'failed')),
101
+ CONSTRAINT plugin_components_type_allowed
102
+ CHECK (component_type IN ('mcp-server', 'skills', 'infrastructure', 'ui-surface'))
103
+ );
104
+
105
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_plugin_components_install_key
106
+ ON public.plugin_components (plugin_install_id, component_key);
107
+
108
+ CREATE INDEX IF NOT EXISTS idx_plugin_components_install
109
+ ON public.plugin_components (plugin_install_id);
110
+
111
+ -- ---------------------------------------------------------------------------
112
+ -- user_plugin_activations — one app-level OAuth grant per (user, install)
113
+ -- ---------------------------------------------------------------------------
114
+
115
+ CREATE TABLE IF NOT EXISTS public.user_plugin_activations (
116
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
117
+ user_id uuid NOT NULL,
118
+ plugin_install_id uuid NOT NULL,
119
+ status text NOT NULL DEFAULT 'active',
120
+ granted_scopes jsonb NOT NULL DEFAULT '[]'::jsonb,
121
+ granted_at timestamptz NOT NULL DEFAULT now(),
122
+ revoked_at timestamptz,
123
+ created_at timestamptz NOT NULL DEFAULT now(),
124
+ updated_at timestamptz NOT NULL DEFAULT now(),
125
+ CONSTRAINT user_plugin_activations_user_id_users_id_fk
126
+ FOREIGN KEY (user_id)
127
+ REFERENCES public.users(id)
128
+ ON DELETE CASCADE,
129
+ CONSTRAINT user_plugin_activations_plugin_install_id_plugin_installs_id_fk
130
+ FOREIGN KEY (plugin_install_id)
131
+ REFERENCES public.plugin_installs(id)
132
+ ON DELETE CASCADE,
133
+ CONSTRAINT user_plugin_activations_status_allowed
134
+ CHECK (status IN ('active', 'needs_reauth', 'revoked'))
135
+ );
136
+
137
+ -- Doubles as the dispatch-time activation lookup (user_id, plugin_install_id).
138
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_user_plugin_activations
139
+ ON public.user_plugin_activations (user_id, plugin_install_id);
140
+
141
+ -- activatedUserCount: count of 'active' activations per install.
142
+ CREATE INDEX IF NOT EXISTS idx_user_plugin_activations_install
143
+ ON public.user_plugin_activations (plugin_install_id);
144
+
145
+ -- ---------------------------------------------------------------------------
146
+ -- user_plugin_activation_tokens — one token record per resource indicator
147
+ -- ---------------------------------------------------------------------------
148
+
149
+ CREATE TABLE IF NOT EXISTS public.user_plugin_activation_tokens (
150
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
151
+ activation_id uuid NOT NULL,
152
+ resource_indicator text NOT NULL,
153
+ secret_ref text NOT NULL,
154
+ status text NOT NULL DEFAULT 'active',
155
+ expires_at timestamptz,
156
+ created_at timestamptz NOT NULL DEFAULT now(),
157
+ updated_at timestamptz NOT NULL DEFAULT now(),
158
+ -- Explicit short name: the drizzle-derived name exceeds Postgres's 63-char
159
+ -- identifier limit (matches the foreignKey() name in src/schema/plugins.ts).
160
+ CONSTRAINT user_plugin_activation_tokens_activation_id_fk
161
+ FOREIGN KEY (activation_id)
162
+ REFERENCES public.user_plugin_activations(id)
163
+ ON DELETE CASCADE,
164
+ CONSTRAINT user_plugin_activation_tokens_status_allowed
165
+ CHECK (status IN ('active', 'expired', 'revoked'))
166
+ );
167
+
168
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_user_plugin_activation_tokens_resource
169
+ ON public.user_plugin_activation_tokens (activation_id, resource_indicator);
170
+
171
+ -- ---------------------------------------------------------------------------
172
+ -- tenant_mcp_servers.plugin_install_id — plugin ownership marker
173
+ -- ---------------------------------------------------------------------------
174
+
175
+ ALTER TABLE public.tenant_mcp_servers
176
+ ADD COLUMN IF NOT EXISTS plugin_install_id uuid;
177
+
178
+ DO $$
179
+ BEGIN
180
+ IF NOT EXISTS (
181
+ SELECT 1 FROM pg_constraint
182
+ WHERE conname = 'tenant_mcp_servers_plugin_install_id_plugin_installs_id_fk'
183
+ AND conrelid = 'public.tenant_mcp_servers'::regclass
184
+ ) THEN
185
+ ALTER TABLE public.tenant_mcp_servers
186
+ ADD CONSTRAINT tenant_mcp_servers_plugin_install_id_plugin_installs_id_fk
187
+ FOREIGN KEY (plugin_install_id)
188
+ REFERENCES public.plugin_installs(id)
189
+ ON DELETE SET NULL;
190
+ END IF;
191
+ END $$;
192
+
193
+ SELECT pg_advisory_unlock(hashtext('migration:0159_application_plugins'));