thinkwork-cli 0.12.12 → 0.12.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
  4. package/dist/cli.js +23823 -10151
  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/0197_rcm_context_columns.sql +28 -0
  218. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  219. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  220. package/dist/drizzle/meta/_journal.json +160 -0
  221. package/dist/plugins/README.md +162 -0
  222. package/dist/plugins/catalog/package.json +40 -0
  223. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  224. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  225. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  226. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  227. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  229. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  230. package/dist/plugins/catalog/src/catalog.ts +434 -0
  231. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  232. package/dist/plugins/catalog/src/index.ts +4 -0
  233. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  234. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  235. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  236. package/dist/plugins/catalog/tsconfig.json +8 -0
  237. package/dist/plugins/company-brain/README.md +37 -0
  238. package/dist/plugins/company-brain/package.json +33 -0
  239. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  240. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  241. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  244. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  245. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  246. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  247. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  248. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  249. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  250. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  251. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  252. package/dist/plugins/company-brain/src/index.ts +62 -0
  253. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  254. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  255. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  256. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  257. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  258. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  259. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  260. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  261. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  262. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  263. package/dist/plugins/company-brain/tsconfig.json +8 -0
  264. package/dist/plugins/company-data/README.md +49 -0
  265. package/dist/plugins/company-data/package.json +21 -0
  266. package/dist/plugins/company-data/src/index.ts +30 -0
  267. package/dist/plugins/company-data/src/manifest.ts +26 -0
  268. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  269. package/dist/plugins/company-data/tsconfig.json +8 -0
  270. package/dist/plugins/company-etl/README.md +46 -0
  271. package/dist/plugins/company-etl/package.json +21 -0
  272. package/dist/plugins/company-etl/src/index.ts +29 -0
  273. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  274. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  275. package/dist/plugins/company-etl/tsconfig.json +8 -0
  276. package/dist/plugins/email-channel/README.md +41 -0
  277. package/dist/plugins/email-channel/package.json +22 -0
  278. package/dist/plugins/email-channel/src/index.ts +36 -0
  279. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  280. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  281. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  282. package/dist/plugins/email-channel/tsconfig.json +8 -0
  283. package/dist/plugins/lastmile/README.md +50 -0
  284. package/dist/plugins/lastmile/package.json +23 -0
  285. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  286. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  287. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  288. package/dist/plugins/lastmile/src/index.ts +46 -0
  289. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  290. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  291. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  292. package/dist/plugins/lastmile/tsconfig.json +8 -0
  293. package/dist/plugins/n8n/README.md +201 -0
  294. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  295. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  296. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  297. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  298. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  299. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  300. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  301. package/dist/plugins/n8n/package.json +35 -0
  302. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  304. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  305. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  306. package/dist/plugins/n8n/runtime/package.json +7 -0
  307. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  308. package/dist/plugins/n8n/smoke/README.md +95 -0
  309. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  310. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  311. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  312. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  313. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  314. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  315. package/dist/plugins/n8n/src/index.ts +79 -0
  316. package/dist/plugins/n8n/src/manifest.ts +403 -0
  317. package/dist/plugins/n8n/src/package-config.ts +186 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  321. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  322. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  323. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  324. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  326. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  327. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  328. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  329. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  330. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  331. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  332. package/dist/plugins/n8n/tsconfig.json +8 -0
  333. package/dist/plugins/sendgrid/README.md +30 -0
  334. package/dist/plugins/sendgrid/package.json +22 -0
  335. package/dist/plugins/sendgrid/src/index.ts +36 -0
  336. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  337. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  338. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  339. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  340. package/dist/plugins/twenty/README.md +78 -0
  341. package/dist/plugins/twenty/package.json +27 -0
  342. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  343. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  344. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  345. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  346. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  347. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  348. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  349. package/dist/plugins/twenty/src/index.ts +55 -0
  350. package/dist/plugins/twenty/src/manifest.ts +259 -0
  351. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  352. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  353. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  354. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  355. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  356. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  357. package/dist/plugins/twenty/tsconfig.json +9 -0
  358. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  359. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  360. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  361. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  362. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  363. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  364. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  365. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  366. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  367. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  368. package/dist/plugins/workos-auth/package.json +22 -0
  369. package/dist/plugins/workos-auth/src/index.ts +30 -0
  370. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  371. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  372. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  373. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  374. package/dist/scripts/bootstrap-workspace.sh +162 -0
  375. package/dist/scripts/post-deploy.sh +290 -0
  376. package/dist/terraform/examples/greenfield/main.tf +903 -75
  377. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  381. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  382. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  383. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  384. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  385. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  386. package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
  387. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  388. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  389. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  390. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  391. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  392. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  399. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  400. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  401. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  402. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  403. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  404. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  405. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  406. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  407. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  408. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  409. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  411. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  412. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  413. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  414. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  415. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  416. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  417. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  418. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  420. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  421. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  422. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  423. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  424. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  425. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  426. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  427. package/dist/terraform/modules/thinkwork/README.md +71 -0
  428. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  429. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  430. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  431. package/dist/terraform/schema.graphql +82 -9
  432. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  433. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  434. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  435. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  436. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  437. package/dist/workspace-defaults/files/SPACE.md +62 -0
  438. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  439. package/dist/workspace-defaults/files/USER.md +40 -0
  440. package/dist/workspace-defaults/files/mcp.json +3 -0
  441. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  442. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  443. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  444. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  446. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  447. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  466. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  467. package/package.json +2 -1
  468. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  469. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  470. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  471. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  472. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  473. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  474. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  475. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,274 @@
1
+ -- 0090_brain_schema_extraction.sql
2
+ --
3
+ -- Phase B of the wiki + brain schema extraction (PR 2 of 3-PR arc).
4
+ -- Moves 6 brain tables from public.* into the new `brain.*` Postgres schema,
5
+ -- drops the redundant `tenant_entity_` prefix from internal table names,
6
+ -- renames indexes/constraints to match, and creates compat views in public.*
7
+ -- so old bundled Lambda code keeps reading during the deploy bridge window.
8
+ --
9
+ -- Tables moved:
10
+ -- public.tenant_entity_pages → brain.pages
11
+ -- public.tenant_entity_page_sections → brain.page_sections
12
+ -- public.tenant_entity_page_links → brain.page_links
13
+ -- public.tenant_entity_page_aliases → brain.page_aliases
14
+ -- public.tenant_entity_section_sources → brain.section_sources
15
+ -- public.tenant_entity_external_refs → brain.external_refs
16
+ --
17
+ -- FK constraints follow their parent tables automatically (Postgres preserves
18
+ -- them across SET SCHEMA). Cross-schema FKs to public.tenants continue to
19
+ -- work — see Key Technical Decisions in the wiki+brain plan for the rationale.
20
+ -- FK constraint names retain their original tenant_entity_* prefix — a
21
+ -- cosmetic cleanup can come later. No FK-rename markers below.
22
+ --
23
+ -- Compat views: each table also gets a view in public.* aliasing the new
24
+ -- location. Old bundled Lambdas continue reading via public.tenant_entity_*
25
+ -- during the deploy bridge window; new Lambdas read brain.* directly. PR 3
26
+ -- (cleanup) drops the views once deploys stabilize. The brain.pages compat
27
+ -- view enumerates columns explicitly, omitting the GENERATED ALWAYS
28
+ -- search_tsv (mirror of 0089's wiki.pages view fix from PR 1 review).
29
+ --
30
+ -- Note on external_refs_kind_allowed_v2: the constraint name retains the
31
+ -- _v2 suffix from the public-schema days (0088 renamed it; 0087 is queued
32
+ -- to rename it back and tighten the value set). This migration only moves
33
+ -- the constraint with the table — no name/definition changes. The follow-up
34
+ -- cleanup migration can rename and tighten in lock step with 0087.
35
+ --
36
+ -- Plan reference: docs/plans/2026-05-16-001-refactor-wiki-brain-schema-extraction-plan.md
37
+ -- Origin brainstorm: docs/brainstorms/2026-05-16-wiki-brain-schema-extraction-requirements.md
38
+ -- Pattern doc: docs/solutions/database-issues/feature-schema-extraction-pattern.md
39
+ -- Prior PR: 0089_wiki_schema_extraction.sql (wiki side, PR 1 of 3)
40
+ --
41
+ -- Apply manually:
42
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0090_brain_schema_extraction.sql
43
+ -- Then verify:
44
+ -- pnpm db:migrate-manual
45
+ -- psql -c "\dt brain.*" -- 6 tables expected
46
+ -- psql -c "\dv public.tenant_entity_*" -- 6 compat views expected
47
+ -- psql -c "\dt public.tenant_entity_*" -- 0 tables expected
48
+ --
49
+ -- Inverse runbook (rollback): drop the views, then SET SCHEMA back, then
50
+ -- RENAME back. Indexes and constraints follow their parent table's schema
51
+ -- automatically. After SET SCHEMA moves the table to public, its indexes
52
+ -- live in public — so ALTER INDEX statements must qualify with `public.`,
53
+ -- not `brain.`.
54
+ -- DROP VIEW IF EXISTS public.tenant_entity_pages, public.tenant_entity_page_sections, ...;
55
+ -- ALTER TABLE brain.pages SET SCHEMA public; -- indexes move to public too
56
+ -- ALTER TABLE public.pages RENAME TO tenant_entity_pages;
57
+ -- ALTER INDEX public.idx_pages_tenant_type_status RENAME TO idx_tenant_entity_pages_tenant_type_status; -- × 19 indexes
58
+ -- ... (× 6 tables, parent-last)
59
+ -- DROP SCHEMA brain;
60
+ --
61
+ -- Markers (consumed by scripts/db-migrate-manual.sh):
62
+ --
63
+ -- creates: brain.pages
64
+ -- creates: brain.page_sections
65
+ -- creates: brain.page_links
66
+ -- creates: brain.page_aliases
67
+ -- creates: brain.section_sources
68
+ -- creates: brain.external_refs
69
+ -- creates: brain.uq_pages_tenant_type_subtype_slug
70
+ -- creates: brain.idx_pages_tenant_type_status
71
+ -- creates: brain.idx_pages_subtype
72
+ -- creates: brain.idx_pages_last_compiled
73
+ -- creates: brain.idx_pages_search_tsv
74
+ -- creates: brain.idx_pages_parent
75
+ -- creates: brain.idx_pages_title_trgm
76
+ -- creates: brain.uq_page_sections_page_slug
77
+ -- creates: brain.idx_page_sections_page_position
78
+ -- creates: brain.uq_page_links_from_to_kind
79
+ -- creates: brain.idx_page_links_to
80
+ -- creates: brain.idx_page_links_kind
81
+ -- creates: brain.uq_page_aliases_page_alias
82
+ -- creates: brain.idx_page_aliases_alias
83
+ -- creates: brain.idx_page_aliases_alias_trgm
84
+ -- creates: brain.uq_section_sources_section_kind_ref
85
+ -- creates: brain.idx_section_sources_tenant_kind_ref
86
+ -- creates: brain.uq_external_refs_source
87
+ -- creates: brain.idx_external_refs_tenant_source
88
+ -- creates-constraint: brain.pages.pages_type_allowed
89
+ -- creates-constraint: brain.pages.pages_entity_subtype_allowed
90
+ -- creates-constraint: brain.page_sections.page_sections_facet_type_allowed
91
+ -- creates-constraint: brain.external_refs.external_refs_kind_allowed
92
+ -- creates-constraint: brain.external_refs.external_refs_ttl_positive
93
+ -- creates: public.tenant_entity_pages
94
+ -- creates: public.tenant_entity_page_sections
95
+ -- creates: public.tenant_entity_page_links
96
+ -- creates: public.tenant_entity_page_aliases
97
+ -- creates: public.tenant_entity_section_sources
98
+ -- creates: public.tenant_entity_external_refs
99
+
100
+ \set ON_ERROR_STOP on
101
+
102
+ BEGIN;
103
+
104
+ -- Set timeouts BEFORE acquiring the advisory lock so the lock acquisition
105
+ -- itself is bounded. Mirror of 0089's pattern.
106
+ SET LOCAL lock_timeout = '30s';
107
+ SET LOCAL statement_timeout = '300s';
108
+
109
+ -- Serialize concurrent application attempts.
110
+ SELECT pg_advisory_xact_lock(hashtext('brain_schema_extraction'));
111
+
112
+ -- Refuse to apply against an unexpected DB.
113
+ DO $$
114
+ BEGIN
115
+ IF current_database() != 'thinkwork' THEN
116
+ RAISE EXCEPTION 'wrong database: %, expected thinkwork', current_database();
117
+ END IF;
118
+ END $$;
119
+
120
+ -- Dev-state-verification: 0090 depends on 0089's state. If dev was reseeded
121
+ -- after 0089 but before 0090, refuse to proceed — re-apply 0089 first.
122
+ DO $$
123
+ BEGIN
124
+ IF to_regclass('wiki.pages') IS NULL THEN
125
+ RAISE EXCEPTION 'pre-flight: wiki.pages does not exist — 0089 (wiki schema extraction) must be applied first';
126
+ END IF;
127
+ END $$;
128
+
129
+ -- Pre-flight invariants: symmetric checks for all 6 tables.
130
+ DO $$
131
+ BEGIN
132
+ IF to_regclass('public.tenant_entity_pages') IS NULL THEN
133
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_pages does not exist';
134
+ END IF;
135
+ IF to_regclass('brain.pages') IS NOT NULL THEN
136
+ RAISE EXCEPTION 'pre-flight: brain.pages already exists — refusing to re-apply';
137
+ END IF;
138
+ IF to_regclass('public.tenant_entity_page_sections') IS NULL THEN
139
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_page_sections does not exist';
140
+ END IF;
141
+ IF to_regclass('brain.page_sections') IS NOT NULL THEN
142
+ RAISE EXCEPTION 'pre-flight: brain.page_sections already exists — refusing to re-apply';
143
+ END IF;
144
+ IF to_regclass('public.tenant_entity_page_links') IS NULL THEN
145
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_page_links does not exist';
146
+ END IF;
147
+ IF to_regclass('brain.page_links') IS NOT NULL THEN
148
+ RAISE EXCEPTION 'pre-flight: brain.page_links already exists — refusing to re-apply';
149
+ END IF;
150
+ IF to_regclass('public.tenant_entity_page_aliases') IS NULL THEN
151
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_page_aliases does not exist';
152
+ END IF;
153
+ IF to_regclass('brain.page_aliases') IS NOT NULL THEN
154
+ RAISE EXCEPTION 'pre-flight: brain.page_aliases already exists — refusing to re-apply';
155
+ END IF;
156
+ IF to_regclass('public.tenant_entity_section_sources') IS NULL THEN
157
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_section_sources does not exist';
158
+ END IF;
159
+ IF to_regclass('brain.section_sources') IS NOT NULL THEN
160
+ RAISE EXCEPTION 'pre-flight: brain.section_sources already exists — refusing to re-apply';
161
+ END IF;
162
+ IF to_regclass('public.tenant_entity_external_refs') IS NULL THEN
163
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_external_refs does not exist';
164
+ END IF;
165
+ IF to_regclass('brain.external_refs') IS NOT NULL THEN
166
+ RAISE EXCEPTION 'pre-flight: brain.external_refs already exists — refusing to re-apply';
167
+ END IF;
168
+ END $$;
169
+
170
+ CREATE SCHEMA IF NOT EXISTS brain;
171
+ COMMENT ON SCHEMA brain IS 'Tenant-shared structured-knowledge entity pages (Customer/Opportunity/Order/Person) and their provenance. Extracted from public.* on 2026-05-16 as PR 2 of the wiki+brain schema extraction arc.';
172
+
173
+ -- ── Move and rename tables ─────────────────────────────────────────────
174
+ -- FK-leaf-first ordering. Postgres preserves FKs across SET SCHEMA
175
+ -- automatically; ordering matters only for operator mental model.
176
+
177
+ ALTER TABLE public.tenant_entity_external_refs SET SCHEMA brain;
178
+ ALTER TABLE brain.tenant_entity_external_refs RENAME TO external_refs;
179
+
180
+ ALTER TABLE public.tenant_entity_section_sources SET SCHEMA brain;
181
+ ALTER TABLE brain.tenant_entity_section_sources RENAME TO section_sources;
182
+
183
+ ALTER TABLE public.tenant_entity_page_links SET SCHEMA brain;
184
+ ALTER TABLE brain.tenant_entity_page_links RENAME TO page_links;
185
+
186
+ ALTER TABLE public.tenant_entity_page_aliases SET SCHEMA brain;
187
+ ALTER TABLE brain.tenant_entity_page_aliases RENAME TO page_aliases;
188
+
189
+ ALTER TABLE public.tenant_entity_page_sections SET SCHEMA brain;
190
+ ALTER TABLE brain.tenant_entity_page_sections RENAME TO page_sections;
191
+
192
+ ALTER TABLE public.tenant_entity_pages SET SCHEMA brain;
193
+ ALTER TABLE brain.tenant_entity_pages RENAME TO pages;
194
+
195
+ -- ── Rename indexes to drop tenant_entity_ prefix ───────────────────────
196
+
197
+ ALTER INDEX brain.uq_tenant_entity_pages_tenant_type_subtype_slug RENAME TO uq_pages_tenant_type_subtype_slug;
198
+ ALTER INDEX brain.idx_tenant_entity_pages_tenant_type_status RENAME TO idx_pages_tenant_type_status;
199
+ ALTER INDEX brain.idx_tenant_entity_pages_subtype RENAME TO idx_pages_subtype;
200
+ ALTER INDEX brain.idx_tenant_entity_pages_last_compiled RENAME TO idx_pages_last_compiled;
201
+ ALTER INDEX brain.idx_tenant_entity_pages_search_tsv RENAME TO idx_pages_search_tsv;
202
+ ALTER INDEX brain.idx_tenant_entity_pages_parent RENAME TO idx_pages_parent;
203
+ ALTER INDEX brain.idx_tenant_entity_pages_title_trgm RENAME TO idx_pages_title_trgm;
204
+
205
+ ALTER INDEX brain.uq_tenant_entity_page_sections_page_slug RENAME TO uq_page_sections_page_slug;
206
+ ALTER INDEX brain.idx_tenant_entity_page_sections_page_position RENAME TO idx_page_sections_page_position;
207
+
208
+ ALTER INDEX brain.uq_tenant_entity_page_links_from_to_kind RENAME TO uq_page_links_from_to_kind;
209
+ ALTER INDEX brain.idx_tenant_entity_page_links_to RENAME TO idx_page_links_to;
210
+ ALTER INDEX brain.idx_tenant_entity_page_links_kind RENAME TO idx_page_links_kind;
211
+
212
+ ALTER INDEX brain.uq_tenant_entity_page_aliases_page_alias RENAME TO uq_page_aliases_page_alias;
213
+ ALTER INDEX brain.idx_tenant_entity_page_aliases_alias RENAME TO idx_page_aliases_alias;
214
+ ALTER INDEX brain.idx_tenant_entity_page_aliases_alias_trgm RENAME TO idx_page_aliases_alias_trgm;
215
+
216
+ ALTER INDEX brain.uq_tenant_entity_section_sources_section_kind_ref RENAME TO uq_section_sources_section_kind_ref;
217
+ ALTER INDEX brain.idx_tenant_entity_section_sources_tenant_kind_ref RENAME TO idx_section_sources_tenant_kind_ref;
218
+
219
+ ALTER INDEX brain.uq_tenant_entity_external_refs_source RENAME TO uq_external_refs_source;
220
+ ALTER INDEX brain.idx_tenant_entity_external_refs_tenant_source RENAME TO idx_external_refs_tenant_source;
221
+
222
+ -- ── Rename named CHECK constraints to drop tenant_entity_ prefix ───────
223
+
224
+ ALTER TABLE brain.pages RENAME CONSTRAINT tenant_entity_pages_type_allowed TO pages_type_allowed;
225
+ ALTER TABLE brain.pages RENAME CONSTRAINT tenant_entity_pages_entity_subtype_allowed TO pages_entity_subtype_allowed;
226
+ ALTER TABLE brain.page_sections RENAME CONSTRAINT tenant_entity_page_sections_facet_type_allowed TO page_sections_facet_type_allowed;
227
+
228
+ -- external_refs constraint: absorb 0087's tracker cleanup. Whatever the
229
+ -- existing constraint name is (_v2 or _kind_allowed — depends on whether
230
+ -- 0087 has applied yet), delete tracker rows and replace with the final
231
+ -- constraint named external_refs_kind_allowed (no _v2) excluding tracker_*.
232
+ -- This matches what brain.ts declares as the canonical Drizzle source.
233
+ DELETE FROM brain.external_refs
234
+ WHERE source_kind IN ('tracker_issue', 'tracker_ticket');
235
+
236
+ ALTER TABLE brain.external_refs
237
+ DROP CONSTRAINT IF EXISTS tenant_entity_external_refs_kind_allowed_v2;
238
+ ALTER TABLE brain.external_refs
239
+ DROP CONSTRAINT IF EXISTS tenant_entity_external_refs_kind_allowed;
240
+
241
+ ALTER TABLE brain.external_refs
242
+ ADD CONSTRAINT external_refs_kind_allowed CHECK (
243
+ source_kind IN (
244
+ 'erp_customer',
245
+ 'crm_opportunity',
246
+ 'erp_order',
247
+ 'crm_person',
248
+ 'support_case',
249
+ 'bedrock_kb'
250
+ )
251
+ );
252
+
253
+ ALTER TABLE brain.external_refs RENAME CONSTRAINT tenant_entity_external_refs_ttl_positive TO external_refs_ttl_positive;
254
+
255
+ -- ── Compat views in public.* ────────────────────────────────────────────
256
+ -- Old bundled Lambda code references public.tenant_entity_*. The views
257
+ -- resolve to the new schema-qualified tables. brain.pages has a
258
+ -- GENERATED ALWAYS search_tsv column, so its compat view enumerates
259
+ -- columns explicitly to allow INSERTs that don't name search_tsv to
260
+ -- succeed (Postgres regenerates search_tsv on write through the view).
261
+ -- The remaining 5 tables have no generated columns; SELECT * is fine.
262
+
263
+ CREATE VIEW public.tenant_entity_pages AS
264
+ SELECT id, tenant_id, type, entity_subtype, slug, title, summary,
265
+ body_md, status, parent_page_id, hubness_score, tags,
266
+ last_compiled_at, created_at, updated_at
267
+ FROM brain.pages;
268
+ CREATE VIEW public.tenant_entity_page_sections AS SELECT * FROM brain.page_sections;
269
+ CREATE VIEW public.tenant_entity_page_links AS SELECT * FROM brain.page_links;
270
+ CREATE VIEW public.tenant_entity_page_aliases AS SELECT * FROM brain.page_aliases;
271
+ CREATE VIEW public.tenant_entity_section_sources AS SELECT * FROM brain.section_sources;
272
+ CREATE VIEW public.tenant_entity_external_refs AS SELECT * FROM brain.external_refs;
273
+
274
+ COMMIT;
@@ -0,0 +1,118 @@
1
+ -- 0091_drop_wiki_brain_compat_views.sql
2
+ --
3
+ -- Phase C / PR 3 of 3 in the wiki+brain schema extraction arc. Drops the
4
+ -- 15 compatibility views in `public.*` that 0089 (wiki) and 0090 (brain)
5
+ -- created as a deploy bridge. The views protected old bundled Lambda
6
+ -- READ paths during the brief window between psql apply and Lambda
7
+ -- redeploy completing; now that both PRs have merged + stabilized in
8
+ -- prod, no consumer reads through these names anymore and the views
9
+ -- can come down.
10
+ --
11
+ -- Views dropped:
12
+ -- public.wiki_pages, public.wiki_page_sections, public.wiki_page_links,
13
+ -- public.wiki_page_aliases, public.wiki_unresolved_mentions,
14
+ -- public.wiki_section_sources, public.wiki_compile_jobs,
15
+ -- public.wiki_compile_cursors, public.wiki_places,
16
+ -- public.tenant_entity_pages, public.tenant_entity_page_sections,
17
+ -- public.tenant_entity_page_links, public.tenant_entity_page_aliases,
18
+ -- public.tenant_entity_section_sources, public.tenant_entity_external_refs
19
+ --
20
+ -- Pre-merge consumer survey: verified zero production code references
21
+ -- these names (excludes the legitimate test fixture in
22
+ -- packages/database-pg/__tests__/schema-customize-retirement.test.ts
23
+ -- which only grep-checks 0087's literal text, and excludes historical
24
+ -- migration files 0036/0051/0087 which document past state).
25
+ --
26
+ -- Plan reference: docs/plans/2026-05-16-001-refactor-wiki-brain-schema-extraction-plan.md
27
+ -- Origin brainstorm: docs/brainstorms/2026-05-16-wiki-brain-schema-extraction-requirements.md
28
+ -- Pattern doc: docs/solutions/database-issues/feature-schema-extraction-pattern.md
29
+ -- Wiki PR (merged): #1251
30
+ -- Brain PR (merged): #1259
31
+ --
32
+ -- Apply manually:
33
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0091_drop_wiki_brain_compat_views.sql
34
+ -- Then verify:
35
+ -- pnpm db:migrate-manual packages/database-pg/drizzle/0091_drop_wiki_brain_compat_views.sql
36
+ -- psql -c "\dv public.wiki_*" -- 0 views expected
37
+ -- psql -c "\dv public.tenant_entity_*" -- 0 views expected
38
+ -- psql -c "\dt wiki.*" -- 9 tables still present
39
+ -- psql -c "\dt brain.*" -- 6 tables still present
40
+ --
41
+ -- Inverse runbook (rollback): re-create each view. Mirror of 0089/0090's
42
+ -- CREATE VIEW statements — see those migration headers for the column
43
+ -- enumeration on public.wiki_pages and public.tenant_entity_pages views
44
+ -- (both omit the GENERATED ALWAYS search_tsv column).
45
+ --
46
+ -- Markers (consumed by scripts/db-migrate-manual.sh):
47
+ --
48
+ -- drops: public.wiki_pages
49
+ -- drops: public.wiki_page_sections
50
+ -- drops: public.wiki_page_links
51
+ -- drops: public.wiki_page_aliases
52
+ -- drops: public.wiki_unresolved_mentions
53
+ -- drops: public.wiki_section_sources
54
+ -- drops: public.wiki_compile_jobs
55
+ -- drops: public.wiki_compile_cursors
56
+ -- drops: public.wiki_places
57
+ -- drops: public.tenant_entity_pages
58
+ -- drops: public.tenant_entity_page_sections
59
+ -- drops: public.tenant_entity_page_links
60
+ -- drops: public.tenant_entity_page_aliases
61
+ -- drops: public.tenant_entity_section_sources
62
+ -- drops: public.tenant_entity_external_refs
63
+
64
+ \set ON_ERROR_STOP on
65
+
66
+ BEGIN;
67
+
68
+ -- Set timeouts before any potentially blocking operation. DROP VIEW is
69
+ -- fast but takes ACCESS EXCLUSIVE on the view's name — and any query in
70
+ -- flight against the view holds an ACCESS SHARE that briefly blocks the
71
+ -- DROP. Bounded waits ensure the migration fails fast if a long-running
72
+ -- query holds a lock.
73
+ SET LOCAL lock_timeout = '30s';
74
+ SET LOCAL statement_timeout = '60s';
75
+
76
+ -- Serialize concurrent application attempts.
77
+ SELECT pg_advisory_xact_lock(hashtext('drop_wiki_brain_compat_views'));
78
+
79
+ -- Refuse to apply against an unexpected DB.
80
+ DO $$
81
+ BEGIN
82
+ IF current_database() != 'thinkwork' THEN
83
+ RAISE EXCEPTION 'wrong database: %, expected thinkwork', current_database();
84
+ END IF;
85
+ END $$;
86
+
87
+ -- Pre-flight: wiki.* and brain.* must exist (0089 + 0090 must have applied)
88
+ -- before it makes sense to drop their compat views.
89
+ DO $$
90
+ BEGIN
91
+ IF to_regclass('wiki.pages') IS NULL THEN
92
+ RAISE EXCEPTION 'pre-flight: wiki.pages does not exist — 0089 must apply before 0091';
93
+ END IF;
94
+ IF to_regclass('brain.pages') IS NULL THEN
95
+ RAISE EXCEPTION 'pre-flight: brain.pages does not exist — 0090 must apply before 0091';
96
+ END IF;
97
+ END $$;
98
+
99
+ -- Drop the wiki compat views (9). IF EXISTS so re-running is safe.
100
+ DROP VIEW IF EXISTS public.wiki_pages;
101
+ DROP VIEW IF EXISTS public.wiki_page_sections;
102
+ DROP VIEW IF EXISTS public.wiki_page_links;
103
+ DROP VIEW IF EXISTS public.wiki_page_aliases;
104
+ DROP VIEW IF EXISTS public.wiki_unresolved_mentions;
105
+ DROP VIEW IF EXISTS public.wiki_section_sources;
106
+ DROP VIEW IF EXISTS public.wiki_compile_jobs;
107
+ DROP VIEW IF EXISTS public.wiki_compile_cursors;
108
+ DROP VIEW IF EXISTS public.wiki_places;
109
+
110
+ -- Drop the brain compat views (6).
111
+ DROP VIEW IF EXISTS public.tenant_entity_pages;
112
+ DROP VIEW IF EXISTS public.tenant_entity_page_sections;
113
+ DROP VIEW IF EXISTS public.tenant_entity_page_links;
114
+ DROP VIEW IF EXISTS public.tenant_entity_page_aliases;
115
+ DROP VIEW IF EXISTS public.tenant_entity_section_sources;
116
+ DROP VIEW IF EXISTS public.tenant_entity_external_refs;
117
+
118
+ COMMIT;
@@ -0,0 +1,97 @@
1
+ -- 0092_finish_oss_connector_retirement.sql
2
+ --
3
+ -- Finishes the OSS connector framework retirement that 0087 started.
4
+ -- 0087 was authored but never applied to dev — the code-side retirement
5
+ -- (Drizzle schemas removed, lib/connectors/* deleted, handler retired,
6
+ -- resolvers gone) shipped via separate PRs, but the DROP TABLE side
7
+ -- never ran because 0087 had downstream-rendered itself unable to apply
8
+ -- as-written after 0090 moved tenant_entity_external_refs into the
9
+ -- brain schema (0087's ALTER TABLE public.tenant_entity_external_refs
10
+ -- statements would now fail because that table no longer exists in
11
+ -- public.*).
12
+ --
13
+ -- This migration does ONLY the table-drop portion of 0087. The
14
+ -- tenant_entity_external_refs constraint work (DELETE tracker rows +
15
+ -- DROP + re-ADD constraint) is already done by 0090's bundled
16
+ -- cleanup — see 0090's header for that history.
17
+ --
18
+ -- Tables dropped (4):
19
+ -- public.connector_executions (33 rows in dev as of 2026-05-16, all stale)
20
+ -- public.connectors (1 row in dev, stale)
21
+ -- public.tenant_connector_catalog (20 rows, stale)
22
+ -- public.computer_delegations (10 rows, stale)
23
+ --
24
+ -- Indexes drop automatically with their parent tables (CASCADE). The
25
+ -- 14 index-drop markers in 0087's header resolve to DROPPED naturally
26
+ -- once the parent tables are gone.
27
+ --
28
+ -- The only inbound FK to any of these tables is
29
+ -- connector_executions.connector_id -> connectors.id, which is in the
30
+ -- drop set itself. No external tables reference these — DROP CASCADE is
31
+ -- safe.
32
+ --
33
+ -- Plan reference: docs/plans/2026-05-14-001-refactor-retire-oss-symphony-connectors-plan.md
34
+ -- Prior migration: 0087_retire_oss_connectors.sql (authored but never applied to dev — superseded by this file's table-drop scope)
35
+ -- Wiki+brain arc: PRs #1251, #1259, #1264
36
+ --
37
+ -- Apply manually:
38
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0092_finish_oss_connector_retirement.sql
39
+ -- Then verify:
40
+ -- pnpm db:migrate-manual packages/database-pg/drizzle/0092_finish_oss_connector_retirement.sql
41
+ -- psql -c "\dt public.connectors" -- 0 rows expected
42
+ -- psql -c "\dt public.connector_executions" -- 0 rows expected
43
+ -- psql -c "\dt public.tenant_connector_catalog" -- 0 rows expected
44
+ -- psql -c "\dt public.computer_delegations" -- 0 rows expected
45
+ --
46
+ -- No rollback documented — the OSS connector framework is retired in
47
+ -- application code (origin/main has no schema files, no lib code, no
48
+ -- handlers, no resolvers referencing these tables). Recreating the
49
+ -- tables without recreating the framework would leave dead schema
50
+ -- behind. If a true rollback is needed, revert at the application
51
+ -- layer first.
52
+ --
53
+ -- Markers (consumed by scripts/db-migrate-manual.sh):
54
+ --
55
+ -- drops: public.connector_executions
56
+ -- drops: public.connectors
57
+ -- drops: public.tenant_connector_catalog
58
+ -- drops: public.computer_delegations
59
+
60
+ \set ON_ERROR_STOP on
61
+
62
+ BEGIN;
63
+
64
+ -- Timeouts before any potentially blocking operation. DROP TABLE takes
65
+ -- ACCESS EXCLUSIVE on the table; bounded waits ensure the migration
66
+ -- fails fast if anything is actively reading.
67
+ SET LOCAL lock_timeout = '30s';
68
+ SET LOCAL statement_timeout = '60s';
69
+
70
+ SELECT pg_advisory_xact_lock(hashtext('finish_oss_connector_retirement'));
71
+
72
+ -- Refuse to apply against an unexpected DB.
73
+ DO $$
74
+ BEGIN
75
+ IF current_database() != 'thinkwork' THEN
76
+ RAISE EXCEPTION 'wrong database: %, expected thinkwork', current_database();
77
+ END IF;
78
+ END $$;
79
+
80
+ -- Pre-flight: confirm we're on a DB that still has the tables.
81
+ -- (Idempotent — if a re-run finds the tables already gone, the
82
+ -- DROP TABLE IF EXISTS statements will no-op cleanly.)
83
+ DO $$
84
+ BEGIN
85
+ IF to_regclass('public.tenant_entity_external_refs') IS NOT NULL THEN
86
+ RAISE EXCEPTION 'pre-flight: public.tenant_entity_external_refs still exists — 0090 (brain schema extraction) must apply first';
87
+ END IF;
88
+ END $$;
89
+
90
+ -- Leaf-first DROP order: connector_executions references connectors via
91
+ -- FK, so drop it first. CASCADE handles internal index drops + the FK.
92
+ DROP TABLE IF EXISTS public.connector_executions CASCADE;
93
+ DROP TABLE IF EXISTS public.connectors CASCADE;
94
+ DROP TABLE IF EXISTS public.tenant_connector_catalog CASCADE;
95
+ DROP TABLE IF EXISTS public.computer_delegations CASCADE;
96
+
97
+ COMMIT;
@@ -0,0 +1,23 @@
1
+ -- Purpose: link scheduled evaluation runs back to the scheduled job that created them.
2
+ -- Plan: docs/plans/2026-05-16-002-feat-evals-overhaul-redteam-library-and-substrate-fix-plan.md (U11)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0093_eval_runs_scheduled_job_id.sql
4
+ -- creates-column: public.eval_runs.scheduled_job_id
5
+ -- creates-constraint: public.eval_runs.eval_runs_scheduled_job_id_scheduled_jobs_id_fk
6
+ -- creates: public.idx_eval_runs_scheduled_job_id
7
+
8
+ ALTER TABLE public.eval_runs
9
+ ADD COLUMN IF NOT EXISTS scheduled_job_id uuid;
10
+
11
+ DO $$
12
+ BEGIN
13
+ ALTER TABLE public.eval_runs
14
+ ADD CONSTRAINT eval_runs_scheduled_job_id_scheduled_jobs_id_fk
15
+ FOREIGN KEY (scheduled_job_id)
16
+ REFERENCES public.scheduled_jobs(id)
17
+ ON DELETE SET NULL;
18
+ EXCEPTION
19
+ WHEN duplicate_object THEN NULL;
20
+ END $$;
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_scheduled_job_id
23
+ ON public.eval_runs(scheduled_job_id);
@@ -0,0 +1,140 @@
1
+ -- Purpose: add Slack workspace app persistence for installs, user links, and Slack thread mapping.
2
+ -- Plan: docs/plans/2026-05-16-004-feat-thinkwork-computer-slack-workspace-app-plan.md (U1)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0094_slack_workspace_app.sql
4
+ -- creates: public.slack_workspaces
5
+ -- creates: public.slack_user_links
6
+ -- creates: public.slack_threads
7
+ -- creates: public.uq_slack_workspaces_team
8
+ -- creates: public.uq_slack_workspaces_tenant_team
9
+ -- creates: public.idx_slack_workspaces_tenant_status
10
+ -- creates: public.uq_slack_user_links_team_user
11
+ -- creates: public.idx_slack_user_links_tenant_user
12
+ -- creates: public.idx_slack_user_links_user
13
+ -- creates: public.uq_slack_threads_team_channel_root
14
+ -- creates: public.idx_slack_threads_thread
15
+ -- creates: public.idx_slack_threads_tenant_team
16
+ -- creates-constraint: public.slack_workspaces.slack_workspaces_tenant_id_tenants_id_fk
17
+ -- creates-constraint: public.slack_workspaces.slack_workspaces_installed_by_user_id_users_id_fk
18
+ -- creates-constraint: public.slack_workspaces.slack_workspaces_status_allowed
19
+ -- creates-constraint: public.slack_user_links.slack_user_links_tenant_id_tenants_id_fk
20
+ -- creates-constraint: public.slack_user_links.slack_user_links_slack_team_id_slack_workspaces_slack_team_id_fk
21
+ -- creates-constraint: public.slack_user_links.slack_user_links_user_id_users_id_fk
22
+ -- creates-constraint: public.slack_user_links.slack_user_links_status_allowed
23
+ -- creates-constraint: public.slack_threads.slack_threads_tenant_id_tenants_id_fk
24
+ -- creates-constraint: public.slack_threads.slack_threads_slack_team_id_slack_workspaces_slack_team_id_fk
25
+ -- creates-constraint: public.slack_threads.slack_threads_thread_id_threads_id_fk
26
+
27
+ \set ON_ERROR_STOP on
28
+
29
+ BEGIN;
30
+
31
+ SET LOCAL lock_timeout = '5s';
32
+ SET LOCAL statement_timeout = '120s';
33
+
34
+ CREATE TABLE IF NOT EXISTS public.slack_workspaces (
35
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
36
+ tenant_id uuid NOT NULL,
37
+ slack_team_id text NOT NULL,
38
+ slack_team_name text,
39
+ bot_user_id text NOT NULL,
40
+ bot_token_secret_path text NOT NULL,
41
+ app_id text NOT NULL,
42
+ installed_by_user_id uuid,
43
+ status text NOT NULL DEFAULT 'active',
44
+ installed_at timestamptz NOT NULL DEFAULT now(),
45
+ uninstalled_at timestamptz,
46
+ created_at timestamptz NOT NULL DEFAULT now(),
47
+ updated_at timestamptz NOT NULL DEFAULT now(),
48
+ CONSTRAINT slack_workspaces_tenant_id_tenants_id_fk
49
+ FOREIGN KEY (tenant_id)
50
+ REFERENCES public.tenants(id)
51
+ ON DELETE CASCADE,
52
+ CONSTRAINT slack_workspaces_installed_by_user_id_users_id_fk
53
+ FOREIGN KEY (installed_by_user_id)
54
+ REFERENCES public.users(id)
55
+ ON DELETE SET NULL,
56
+ CONSTRAINT slack_workspaces_status_allowed
57
+ CHECK (status IN ('active','uninstalled','revoked'))
58
+ );
59
+
60
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_slack_workspaces_team
61
+ ON public.slack_workspaces (slack_team_id);
62
+
63
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_slack_workspaces_tenant_team
64
+ ON public.slack_workspaces (tenant_id, slack_team_id);
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_slack_workspaces_tenant_status
67
+ ON public.slack_workspaces (tenant_id, status);
68
+
69
+ CREATE TABLE IF NOT EXISTS public.slack_user_links (
70
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
71
+ tenant_id uuid NOT NULL,
72
+ slack_team_id text NOT NULL,
73
+ slack_user_id text NOT NULL,
74
+ user_id uuid NOT NULL,
75
+ slack_user_name text,
76
+ slack_user_email text,
77
+ status text NOT NULL DEFAULT 'active',
78
+ linked_at timestamptz NOT NULL DEFAULT now(),
79
+ unlinked_at timestamptz,
80
+ created_at timestamptz NOT NULL DEFAULT now(),
81
+ updated_at timestamptz NOT NULL DEFAULT now(),
82
+ CONSTRAINT slack_user_links_tenant_id_tenants_id_fk
83
+ FOREIGN KEY (tenant_id)
84
+ REFERENCES public.tenants(id)
85
+ ON DELETE CASCADE,
86
+ CONSTRAINT slack_user_links_slack_team_id_slack_workspaces_slack_team_id_fk
87
+ FOREIGN KEY (slack_team_id)
88
+ REFERENCES public.slack_workspaces(slack_team_id)
89
+ ON DELETE RESTRICT,
90
+ CONSTRAINT slack_user_links_user_id_users_id_fk
91
+ FOREIGN KEY (user_id)
92
+ REFERENCES public.users(id)
93
+ ON DELETE RESTRICT,
94
+ CONSTRAINT slack_user_links_status_allowed
95
+ CHECK (status IN ('active','unlinked','orphaned','suspended'))
96
+ );
97
+
98
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_slack_user_links_team_user
99
+ ON public.slack_user_links (slack_team_id, slack_user_id);
100
+
101
+ CREATE INDEX IF NOT EXISTS idx_slack_user_links_tenant_user
102
+ ON public.slack_user_links (tenant_id, user_id);
103
+
104
+ CREATE INDEX IF NOT EXISTS idx_slack_user_links_user
105
+ ON public.slack_user_links (user_id);
106
+
107
+ CREATE TABLE IF NOT EXISTS public.slack_threads (
108
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
109
+ tenant_id uuid NOT NULL,
110
+ slack_team_id text NOT NULL,
111
+ channel_id text NOT NULL,
112
+ root_thread_ts text,
113
+ thread_id uuid NOT NULL,
114
+ created_at timestamptz NOT NULL DEFAULT now(),
115
+ updated_at timestamptz NOT NULL DEFAULT now(),
116
+ CONSTRAINT slack_threads_tenant_id_tenants_id_fk
117
+ FOREIGN KEY (tenant_id)
118
+ REFERENCES public.tenants(id)
119
+ ON DELETE CASCADE,
120
+ CONSTRAINT slack_threads_slack_team_id_slack_workspaces_slack_team_id_fk
121
+ FOREIGN KEY (slack_team_id)
122
+ REFERENCES public.slack_workspaces(slack_team_id)
123
+ ON DELETE RESTRICT,
124
+ CONSTRAINT slack_threads_thread_id_threads_id_fk
125
+ FOREIGN KEY (thread_id)
126
+ REFERENCES public.threads(id)
127
+ ON DELETE CASCADE
128
+ );
129
+
130
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_slack_threads_team_channel_root
131
+ ON public.slack_threads (slack_team_id, channel_id, root_thread_ts)
132
+ NULLS NOT DISTINCT;
133
+
134
+ CREATE INDEX IF NOT EXISTS idx_slack_threads_thread
135
+ ON public.slack_threads (thread_id);
136
+
137
+ CREATE INDEX IF NOT EXISTS idx_slack_threads_tenant_team
138
+ ON public.slack_threads (tenant_id, slack_team_id);
139
+
140
+ COMMIT;
@@ -0,0 +1,22 @@
1
+ -- Purpose: persist the running Computer selected for an eval run.
2
+ -- Plan: docs/plans/2026-05-16-002-feat-evals-overhaul-redteam-library-and-substrate-fix-plan.md (follow-up)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0095_eval_runs_computer_id.sql
4
+ -- creates-column: public.eval_runs.computer_id
5
+ -- creates-constraint: public.eval_runs.eval_runs_computer_id_computers_id_fk
6
+ -- creates: public.idx_eval_runs_tenant_computer_created
7
+
8
+ ALTER TABLE public.eval_runs
9
+ ADD COLUMN IF NOT EXISTS computer_id uuid;
10
+
11
+ DO $$
12
+ BEGIN
13
+ ALTER TABLE public.eval_runs
14
+ ADD CONSTRAINT eval_runs_computer_id_computers_id_fk
15
+ FOREIGN KEY (computer_id)
16
+ REFERENCES public.computers(id);
17
+ EXCEPTION
18
+ WHEN duplicate_object THEN NULL;
19
+ END $$;
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_tenant_computer_created
22
+ ON public.eval_runs(tenant_id, computer_id, created_at);