thinkwork-cli 0.12.11 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22157 -9229
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,48 @@
1
+ -- Hand-rolled indexes for Stripe billing tables that drizzle-kit cannot
2
+ -- express (partial unique indexes + CHECK constraints).
3
+ --
4
+ -- Apply manually (matches 0018/0019/0020/0021 convention):
5
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0022_stripe_billing_indexes.sql
6
+ --
7
+ -- Drift detection:
8
+ -- pnpm db:migrate-manual
9
+ --
10
+ -- Pre-migration invariants:
11
+ -- - 0022_add_billing_tables.sql has been applied (tenants.pending_owner_email
12
+ -- exists; stripe_subscriptions exists).
13
+ -- - No collisions: a pre-existing partial unique index with the same name
14
+ -- would cause this script to fail (safe — intent is clear).
15
+ --
16
+ -- What this script enforces:
17
+ -- 1. At most one tenant per pending_owner_email (only rows where the column
18
+ -- is non-null participate — freshly-claimed tenants don't collide).
19
+ -- 2. At most one "active-ish" subscription per tenant. active / trialing /
20
+ -- past_due all count as active-ish; canceled/unpaid/incomplete do not.
21
+ -- 3. stripe_subscriptions.status is one of the Stripe-documented values.
22
+ -- Kept as a CHECK (not an enum) so Stripe API changes don't require a
23
+ -- migration — the set is wide enough to cover all current states.
24
+ --
25
+ -- creates: public.tenants_pending_owner_email_uidx
26
+ -- creates: public.stripe_subscriptions_active_uidx
27
+ -- creates-check: public.stripe_subscriptions.status
28
+
29
+ CREATE UNIQUE INDEX IF NOT EXISTS "tenants_pending_owner_email_uidx"
30
+ ON "tenants" (lower("pending_owner_email"))
31
+ WHERE "pending_owner_email" IS NOT NULL;
32
+
33
+ CREATE UNIQUE INDEX IF NOT EXISTS "stripe_subscriptions_active_uidx"
34
+ ON "stripe_subscriptions" ("tenant_id")
35
+ WHERE "status" IN ('active', 'trialing', 'past_due');
36
+
37
+ ALTER TABLE "stripe_subscriptions"
38
+ ADD CONSTRAINT "stripe_subscriptions_status_allowed"
39
+ CHECK ("status" IN (
40
+ 'incomplete',
41
+ 'incomplete_expired',
42
+ 'trialing',
43
+ 'active',
44
+ 'past_due',
45
+ 'canceled',
46
+ 'unpaid',
47
+ 'paused'
48
+ ));
@@ -0,0 +1,27 @@
1
+ -- Tenant soft-delete columns.
2
+ --
3
+ -- Set by the stripe-webhook Lambda when customer.subscription.deleted
4
+ -- fires. A separate scheduled sweeper (future PR) hard-deletes rows where
5
+ -- deactivated_at < now() - 30 days.
6
+ --
7
+ -- See docs/plans/2026-04-23-001-feat-stripe-upgrade-and-cancel-soft-delete-plan.md
8
+ -- (Unit 1).
9
+ --
10
+ -- Apply manually (matches the 0018+ hand-rolled convention):
11
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0023_tenants_deactivation.sql
12
+ --
13
+ -- Drift detection:
14
+ -- pnpm db:migrate-manual
15
+ --
16
+ -- Pre-migration invariants:
17
+ -- - tenants exists.
18
+ -- - tenants.deactivated_at + tenants.deactivation_reason do not yet exist.
19
+ --
20
+ -- creates-column: public.tenants.deactivated_at
21
+ -- creates-column: public.tenants.deactivation_reason
22
+
23
+ ALTER TABLE "tenants"
24
+ ADD COLUMN IF NOT EXISTS "deactivated_at" timestamp with time zone;
25
+
26
+ ALTER TABLE "tenants"
27
+ ADD COLUMN IF NOT EXISTS "deactivation_reason" text;
@@ -0,0 +1,63 @@
1
+ -- tenant_mcp_admin_keys — per-tenant Bearer tokens for the admin-ops MCP server.
2
+ --
3
+ -- Replaces the shared API_AUTH_SECRET for MCP admin-ops calls. Each tenant
4
+ -- has one or more tokens; the admin-ops Lambda hashes the incoming Bearer
5
+ -- with SHA-256 and looks it up here to resolve the caller's tenant. Raw
6
+ -- tokens are never stored — only the hash + metadata.
7
+ --
8
+ -- See docs/plans/2026-04-22-shared-admin-ops-library-requirements.md and
9
+ -- PR following up on #480 (admin-ops shared package + MCP Lambda).
10
+ --
11
+ -- Apply manually (matches the 0018+ hand-rolled convention):
12
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0024_tenant_mcp_admin_keys.sql
13
+ --
14
+ -- Drift detection:
15
+ -- pnpm db:migrate-manual
16
+ --
17
+ -- Pre-migration invariants:
18
+ -- - tenants exists.
19
+ -- - tenant_mcp_admin_keys does not yet exist.
20
+ -- SELECT to_regclass('public.tenant_mcp_admin_keys'); -- must be NULL
21
+ --
22
+ -- creates: public.tenant_mcp_admin_keys
23
+ -- creates: public.uq_tenant_mcp_admin_keys_hash
24
+ -- creates: public.uq_tenant_mcp_admin_keys_active_name
25
+ -- creates: public.idx_tenant_mcp_admin_keys_tenant
26
+
27
+ CREATE TABLE "tenant_mcp_admin_keys" (
28
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
29
+ "tenant_id" uuid NOT NULL REFERENCES "tenants"("id") ON DELETE CASCADE,
30
+ -- SHA-256 hex digest of the raw token. 64 chars; bytea would be smaller
31
+ -- but text keeps psql/Postgres tooling friendly and there are few rows.
32
+ "key_hash" text NOT NULL,
33
+ -- Human label ("default", "ci", "ops-laptop-eric"). Unique per tenant
34
+ -- among non-revoked rows so operators can re-create a revoked "default".
35
+ "name" text NOT NULL,
36
+ "created_at" timestamptz NOT NULL DEFAULT now(),
37
+ -- Who created the key. Nullable for break-glass bootstrap via apikey
38
+ -- where no human-user row is attributable.
39
+ "created_by_user_id" uuid,
40
+ -- Bumped on every successful auth by the admin-ops Lambda. Async,
41
+ -- best-effort (failure to update does not block the request).
42
+ "last_used_at" timestamptz,
43
+ -- Soft-delete. NULL = active. Set to now() on revoke; row retained for
44
+ -- audit + to prevent hash reuse. A scheduled GC (future PR) hard-deletes
45
+ -- rows with revoked_at < now() - 90 days.
46
+ "revoked_at" timestamptz
47
+ );
48
+
49
+ -- Global uniqueness on hash — different tenants cannot share a token value
50
+ -- (collision probability with SHA-256 is negligible, but makes the lookup
51
+ -- path a single-row read regardless of how tenants are partitioned).
52
+ CREATE UNIQUE INDEX "uq_tenant_mcp_admin_keys_hash"
53
+ ON "tenant_mcp_admin_keys" ("key_hash");
54
+
55
+ -- Per-tenant uniqueness on name among active rows. Partial index so a
56
+ -- revoked "default" does not block creating a fresh "default".
57
+ CREATE UNIQUE INDEX "uq_tenant_mcp_admin_keys_active_name"
58
+ ON "tenant_mcp_admin_keys" ("tenant_id", "name")
59
+ WHERE "revoked_at" IS NULL;
60
+
61
+ -- Supports listing a tenant's keys ordered by created_at.
62
+ CREATE INDEX "idx_tenant_mcp_admin_keys_tenant"
63
+ ON "tenant_mcp_admin_keys" ("tenant_id", "created_at" DESC);
@@ -0,0 +1,182 @@
1
+ -- V1 agent-architecture — additive schema (U3 of plan #007).
2
+ --
3
+ -- Ships the persistence layer the V1 plan needs in Phase 1. Strictly additive:
4
+ -- no column drops, no existing-data rewrites (except column defaults on new
5
+ -- columns). U6 drops `skill_catalog.execution` + `mode` via a separate later
6
+ -- migration once the runtime cutover is complete.
7
+ --
8
+ -- See docs/plans/2026-04-23-007-feat-v1-agent-architecture-final-call-plan.md
9
+ -- §Implementation Units → U3.
10
+ --
11
+ -- Apply manually (matches the 0018+ hand-rolled convention):
12
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0025_v1_agent_architecture.sql
13
+ --
14
+ -- Drift detection:
15
+ -- pnpm db:migrate-manual
16
+ --
17
+ -- Pre-migration invariants (enforced by the to_regclass guards below):
18
+ -- - tenants exists
19
+ -- - tenant_mcp_servers exists
20
+ -- - plugin_uploads does NOT yet exist
21
+ -- SELECT to_regclass('public.plugin_uploads'); -- must be NULL
22
+ --
23
+ -- creates: public.plugin_uploads
24
+ -- creates: public.idx_plugin_uploads_tenant
25
+ -- creates: public.idx_plugin_uploads_status
26
+ -- creates-column: public.plugin_uploads.id
27
+ -- creates-column: public.tenant_mcp_servers.status
28
+ -- creates-column: public.tenant_mcp_servers.url_hash
29
+ -- creates-column: public.tenant_mcp_servers.approved_by
30
+ -- creates-column: public.tenant_mcp_servers.approved_at
31
+ -- creates-column: public.tenants.disabled_builtin_tools
32
+
33
+ -- ---------------------------------------------------------------------------
34
+ -- Pre-flight: fail loudly on missing pre-state. Without these guards a
35
+ -- partially-migrated DB can silently absorb a migration meant for a later
36
+ -- snapshot. Pattern mirrors 0023 / 0024.
37
+ -- ---------------------------------------------------------------------------
38
+
39
+ DO $$
40
+ BEGIN
41
+ IF to_regclass('public.tenants') IS NULL THEN
42
+ RAISE EXCEPTION '0025: public.tenants is missing — refusing to apply';
43
+ END IF;
44
+ IF to_regclass('public.tenant_mcp_servers') IS NULL THEN
45
+ RAISE EXCEPTION '0025: public.tenant_mcp_servers is missing — refusing to apply';
46
+ END IF;
47
+ END
48
+ $$;
49
+
50
+ -- ---------------------------------------------------------------------------
51
+ -- tenants.disabled_builtin_tools — per-tenant kill switches (plan R6, R7).
52
+ --
53
+ -- JSONB array of built-in tool slugs the tenant has disabled globally. Empty
54
+ -- array = all built-ins available (subject to template blocks). Runtime
55
+ -- honors at session construction; template blocks intersect (narrow-only) —
56
+ -- a template cannot unblock what the tenant disabled.
57
+ --
58
+ -- Admin UI to edit this column defers per §Scope Boundaries → Deferred to
59
+ -- Follow-Up Work; until then operators flip the column via DB mutation.
60
+ -- ---------------------------------------------------------------------------
61
+
62
+ ALTER TABLE "tenants"
63
+ ADD COLUMN IF NOT EXISTS "disabled_builtin_tools" jsonb NOT NULL DEFAULT '[]'::jsonb;
64
+
65
+ -- ---------------------------------------------------------------------------
66
+ -- tenant_mcp_servers — admin-approval gate for bundled MCP endpoints (plan R8).
67
+ --
68
+ -- Mirrors the existing user_mcp_tokens.status pattern: an MCP server shipped
69
+ -- inside an uploaded plugin registers as 'pending' and requires admin action
70
+ -- before any agent can invoke it. Existing rows default to 'approved' so this
71
+ -- migration cannot accidentally revoke working integrations (plan: "No
72
+ -- existing agent loses MCP").
73
+ --
74
+ -- url_hash pins (url, auth_config) at approval time; any mutation to either
75
+ -- field MUST revert status to 'pending' (enforced in the API resolver in
76
+ -- U11, not at the DB layer — keeps the invariant debuggable from the
77
+ -- application).
78
+ -- ---------------------------------------------------------------------------
79
+
80
+ ALTER TABLE "tenant_mcp_servers"
81
+ ADD COLUMN IF NOT EXISTS "status" text NOT NULL DEFAULT 'approved';
82
+
83
+ ALTER TABLE "tenant_mcp_servers"
84
+ ADD COLUMN IF NOT EXISTS "url_hash" text;
85
+
86
+ ALTER TABLE "tenant_mcp_servers"
87
+ ADD COLUMN IF NOT EXISTS "approved_by" uuid;
88
+
89
+ ALTER TABLE "tenant_mcp_servers"
90
+ ADD COLUMN IF NOT EXISTS "approved_at" timestamp with time zone;
91
+
92
+ -- Narrow the status column domain. CHECK rather than a pgEnum because:
93
+ -- (a) enums ship with their own migration headaches (renames are fiddly),
94
+ -- (b) the set is small and unlikely to grow,
95
+ -- (c) pattern-matches existing text-column invariants in this schema
96
+ -- (compliance_tier, billing statuses, etc).
97
+ DO $$
98
+ BEGIN
99
+ IF NOT EXISTS (
100
+ SELECT 1 FROM pg_constraint
101
+ WHERE conname = 'tenant_mcp_servers_status_allowed'
102
+ AND conrelid = 'public.tenant_mcp_servers'::regclass
103
+ ) THEN
104
+ ALTER TABLE "tenant_mcp_servers"
105
+ ADD CONSTRAINT "tenant_mcp_servers_status_allowed"
106
+ CHECK ("status" IN ('pending', 'approved', 'rejected'));
107
+ END IF;
108
+ END
109
+ $$;
110
+
111
+ -- ---------------------------------------------------------------------------
112
+ -- plugin_uploads — audit of tenant self-serve plugin uploads (plan R1, R2).
113
+ --
114
+ -- Every POST /api/plugins/upload writes a row in phase 1 of the three-phase
115
+ -- saga (plan §U10 Approach). Survives saga failures as the durable audit of
116
+ -- what was attempted; a background sweeper reaps orphaned staging > 1h.
117
+ --
118
+ -- Columns:
119
+ -- - id: server-generated PK
120
+ -- - tenant_id: owning tenant (FK to tenants)
121
+ -- - uploaded_by: the admin user who initiated the upload
122
+ -- - uploaded_at: wall-clock timestamp of phase-1 insert
123
+ -- - bundle_sha256: content hash of the zip; lets the saga detect
124
+ -- idempotent re-uploads without re-running phases 2/3
125
+ -- - plugin_name: parsed from plugin.json (`name`)
126
+ -- - plugin_version: parsed from plugin.json (`version`) when present
127
+ -- - status: 'staging' | 'installed' | 'failed'
128
+ -- - s3_staging_prefix: intermediate upload key before phase-2 rename
129
+ -- - error_message: populated on failure, null on success
130
+ -- ---------------------------------------------------------------------------
131
+
132
+ CREATE TABLE IF NOT EXISTS "plugin_uploads" (
133
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
134
+ "tenant_id" uuid NOT NULL REFERENCES "tenants"("id") ON DELETE CASCADE,
135
+ "uploaded_by" uuid,
136
+ "uploaded_at" timestamp with time zone NOT NULL DEFAULT now(),
137
+ "bundle_sha256" text NOT NULL,
138
+ "plugin_name" text NOT NULL,
139
+ "plugin_version" text,
140
+ "status" text NOT NULL DEFAULT 'staging',
141
+ "s3_staging_prefix" text,
142
+ "error_message" text
143
+ );
144
+
145
+ -- Status domain. Same rationale as tenant_mcp_servers above.
146
+ DO $$
147
+ BEGIN
148
+ IF NOT EXISTS (
149
+ SELECT 1 FROM pg_constraint
150
+ WHERE conname = 'plugin_uploads_status_allowed'
151
+ AND conrelid = 'public.plugin_uploads'::regclass
152
+ ) THEN
153
+ ALTER TABLE "plugin_uploads"
154
+ ADD CONSTRAINT "plugin_uploads_status_allowed"
155
+ CHECK ("status" IN ('staging', 'installed', 'failed'));
156
+ END IF;
157
+ END
158
+ $$;
159
+
160
+ CREATE INDEX IF NOT EXISTS "idx_plugin_uploads_tenant"
161
+ ON "plugin_uploads" ("tenant_id");
162
+
163
+ -- Partial index on status — the sweeper that reaps orphan staging rows > 1h
164
+ -- old scans `WHERE status = 'staging'`, a tiny fraction of total rows.
165
+ CREATE INDEX IF NOT EXISTS "idx_plugin_uploads_status"
166
+ ON "plugin_uploads" ("status", "uploaded_at")
167
+ WHERE "status" = 'staging';
168
+
169
+ -- ---------------------------------------------------------------------------
170
+ -- Slug renames — per U1 census bucket `needs-explicit-migration`.
171
+ --
172
+ -- The U1 census (docs/plans/2026-04-23-007-feat-v1-agent-architecture-final-
173
+ -- call-plan.census.md) reports zero slugs in this bucket as of 2026-04-24,
174
+ -- so this block is intentionally empty. The comment stays so a future run
175
+ -- that does require slug renames has the pattern documented inline rather
176
+ -- than rediscovered from the plan:
177
+ --
178
+ -- UPDATE "skill_catalog" SET "slug" = "slug" || '-legacy'
179
+ -- WHERE "slug" IN ('<old1>', '<old2>');
180
+ -- UPDATE "agent_skills" SET "skill_id" = "skill_id" || '-legacy'
181
+ -- WHERE "skill_id" IN ('<old1>', '<old2>');
182
+ -- ---------------------------------------------------------------------------
@@ -0,0 +1,28 @@
1
+ -- thread_turns.kind column.
2
+ --
3
+ -- Adds a `kind` field to distinguish agent-turn rows (default) from
4
+ -- system events (escalate/delegate) that U2 of the thread-detail cleanup
5
+ -- plan writes in place of the dropped thread_comments table. Prerequisite
6
+ -- for U2 — without this column the escalate/delegate refactor can't land.
7
+ --
8
+ -- See docs/plans/2026-04-24-002-refactor-thread-detail-pre-launch-cleanup-plan.md
9
+ -- (Unit U12 — prerequisite migration).
10
+ --
11
+ -- Apply manually (matches the 0018+ hand-rolled convention):
12
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0026_thread_turns_add_kind.sql
13
+ --
14
+ -- Drift detection:
15
+ -- pnpm db:migrate-manual
16
+ --
17
+ -- Pre-migration invariants:
18
+ -- - thread_turns exists.
19
+ -- - thread_turns.kind does not yet exist.
20
+ --
21
+ -- creates-column: public.thread_turns.kind
22
+ -- creates: public.idx_thread_turns_kind
23
+
24
+ ALTER TABLE "thread_turns"
25
+ ADD COLUMN IF NOT EXISTS "kind" text NOT NULL DEFAULT 'agent_turn';
26
+
27
+ CREATE INDEX IF NOT EXISTS "idx_thread_turns_kind"
28
+ ON "thread_turns" ("kind");
@@ -0,0 +1,219 @@
1
+ -- Resolved Capability Manifest schema — U15 part 1/3 of plan #007.
2
+ --
3
+ -- Lands two tables inert (no runtime capture yet):
4
+ -- capability_catalog — unified skill / tool / mcp-server registry
5
+ -- resolved_capability_manifests — append-only per-session audit
6
+ --
7
+ -- Plus a conservative backfill:
8
+ -- - Every existing skill_catalog row becomes a capability_catalog row
9
+ -- with type='skill', source='builtin'.
10
+ -- - Six built-in tools are seeded with type='tool', source='builtin'
11
+ -- (execute_code, web_search, recall, reflect, artifacts, Skill).
12
+ --
13
+ -- U15 part 2 wires container-sources/capability_manifest.py + POST to
14
+ -- /api/runtime/manifests. Part 3 flips SI-7 enforcement on at
15
+ -- Agent(tools=...) construction.
16
+ --
17
+ -- Apply manually (matches the 0018+ hand-rolled convention):
18
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0027_capability_catalog_and_manifests.sql
19
+ --
20
+ -- Drift detection: pnpm db:migrate-manual
21
+ --
22
+ -- creates: public.capability_catalog
23
+ -- creates: public.resolved_capability_manifests
24
+ -- creates: public.uq_capability_catalog_type_source_slug
25
+ -- creates: public.idx_capability_catalog_type
26
+ -- creates: public.idx_capability_catalog_source
27
+ -- creates: public.idx_rcm_tenant
28
+ -- creates: public.idx_rcm_agent
29
+ -- creates: public.idx_rcm_template
30
+ -- creates: public.idx_rcm_created_at
31
+
32
+ -- ---------------------------------------------------------------------------
33
+ -- Pre-flight guards — fail loudly on a partially-migrated DB.
34
+ -- ---------------------------------------------------------------------------
35
+
36
+ DO $$
37
+ BEGIN
38
+ IF to_regclass('public.tenants') IS NULL THEN
39
+ RAISE EXCEPTION '0027: public.tenants is missing — refusing to apply';
40
+ END IF;
41
+ IF to_regclass('public.agents') IS NULL THEN
42
+ RAISE EXCEPTION '0027: public.agents is missing — refusing to apply';
43
+ END IF;
44
+ IF to_regclass('public.skill_catalog') IS NULL THEN
45
+ RAISE EXCEPTION '0027: public.skill_catalog is missing — refusing to apply (U3 / migration 0025 must land first)';
46
+ END IF;
47
+ END
48
+ $$;
49
+
50
+ -- ---------------------------------------------------------------------------
51
+ -- capability_catalog — unified capability registry (plan §U15).
52
+ -- ---------------------------------------------------------------------------
53
+
54
+ CREATE TABLE IF NOT EXISTS "capability_catalog" (
55
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
56
+ "slug" text NOT NULL,
57
+ "type" text NOT NULL,
58
+ "source" text NOT NULL,
59
+ "implementation_ref" jsonb,
60
+ "spec" jsonb,
61
+ "created_at" timestamp with time zone NOT NULL DEFAULT now(),
62
+ "updated_at" timestamp with time zone NOT NULL DEFAULT now()
63
+ );
64
+
65
+ -- Domain constraint on type. CHECK rather than pgEnum for the same
66
+ -- reasons cited in 0025 (portable, no enum-rename grief, small set).
67
+ DO $$
68
+ BEGIN
69
+ IF NOT EXISTS (
70
+ SELECT 1 FROM pg_constraint
71
+ WHERE conname = 'capability_catalog_type_allowed'
72
+ AND conrelid = 'public.capability_catalog'::regclass
73
+ ) THEN
74
+ ALTER TABLE "capability_catalog"
75
+ ADD CONSTRAINT "capability_catalog_type_allowed"
76
+ CHECK ("type" IN ('skill', 'tool', 'mcp-server'));
77
+ END IF;
78
+ END
79
+ $$;
80
+
81
+ DO $$
82
+ BEGIN
83
+ IF NOT EXISTS (
84
+ SELECT 1 FROM pg_constraint
85
+ WHERE conname = 'capability_catalog_source_allowed'
86
+ AND conrelid = 'public.capability_catalog'::regclass
87
+ ) THEN
88
+ ALTER TABLE "capability_catalog"
89
+ ADD CONSTRAINT "capability_catalog_source_allowed"
90
+ CHECK ("source" IN ('builtin', 'tenant-library', 'community'));
91
+ END IF;
92
+ END
93
+ $$;
94
+
95
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_capability_catalog_type_source_slug"
96
+ ON "capability_catalog" ("type", "source", "slug");
97
+
98
+ CREATE INDEX IF NOT EXISTS "idx_capability_catalog_type"
99
+ ON "capability_catalog" ("type");
100
+
101
+ CREATE INDEX IF NOT EXISTS "idx_capability_catalog_source"
102
+ ON "capability_catalog" ("source");
103
+
104
+ -- ---------------------------------------------------------------------------
105
+ -- resolved_capability_manifests — per-session audit (plan §U15).
106
+ -- ---------------------------------------------------------------------------
107
+
108
+ CREATE TABLE IF NOT EXISTS "resolved_capability_manifests" (
109
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
110
+ "session_id" text NOT NULL,
111
+ "agent_id" uuid REFERENCES "agents"("id") ON DELETE SET NULL,
112
+ "template_id" uuid,
113
+ "user_id" uuid,
114
+ "tenant_id" uuid NOT NULL REFERENCES "tenants"("id") ON DELETE CASCADE,
115
+ "manifest_json" jsonb NOT NULL,
116
+ "created_at" timestamp with time zone NOT NULL DEFAULT now()
117
+ );
118
+
119
+ CREATE INDEX IF NOT EXISTS "idx_rcm_tenant"
120
+ ON "resolved_capability_manifests" ("tenant_id");
121
+
122
+ CREATE INDEX IF NOT EXISTS "idx_rcm_agent"
123
+ ON "resolved_capability_manifests" ("agent_id");
124
+
125
+ CREATE INDEX IF NOT EXISTS "idx_rcm_template"
126
+ ON "resolved_capability_manifests" ("template_id");
127
+
128
+ -- created_at index powers the 30-day TTL sweep + admin "last N manifests"
129
+ -- queries — both are ORDER BY created_at DESC LIMIT N.
130
+ CREATE INDEX IF NOT EXISTS "idx_rcm_created_at"
131
+ ON "resolved_capability_manifests" ("created_at" DESC);
132
+
133
+ -- ---------------------------------------------------------------------------
134
+ -- Backfill: every skill_catalog row becomes a capability_catalog row.
135
+ -- Idempotent via ON CONFLICT on the (type, source, slug) unique index —
136
+ -- re-running the migration is a no-op on already-seeded installations.
137
+ -- ---------------------------------------------------------------------------
138
+
139
+ INSERT INTO "capability_catalog" ("slug", "type", "source", "implementation_ref", "spec", "created_at", "updated_at")
140
+ SELECT
141
+ sc."slug",
142
+ 'skill' AS "type",
143
+ CASE sc."source"
144
+ WHEN 'builtin' THEN 'builtin'
145
+ WHEN 'community' THEN 'community'
146
+ ELSE 'tenant-library'
147
+ END AS "source",
148
+ NULL::jsonb AS "implementation_ref",
149
+ jsonb_build_object(
150
+ 'display_name', sc."display_name",
151
+ 'description', sc."description",
152
+ 'category', sc."category",
153
+ 'version', sc."version",
154
+ 'execution', sc."execution",
155
+ 'mode', sc."mode"
156
+ ) AS "spec",
157
+ sc."created_at",
158
+ sc."updated_at"
159
+ FROM "skill_catalog" sc
160
+ ON CONFLICT ("type", "source", "slug") DO NOTHING;
161
+
162
+ -- ---------------------------------------------------------------------------
163
+ -- Seed: six built-in tools the Strands container currently hard-codes.
164
+ -- implementation_ref points at the Python module that owns the tool. U15
165
+ -- part 3 enforces SI-7 — the runtime will refuse to register a built-in
166
+ -- that is not present in this table.
167
+ -- ---------------------------------------------------------------------------
168
+
169
+ INSERT INTO "capability_catalog" ("slug", "type", "source", "implementation_ref", "spec")
170
+ VALUES
171
+ (
172
+ 'execute_code', 'tool', 'builtin',
173
+ jsonb_build_object('module_path', 'sandbox_tool', 'class_name', 'ExecuteCodeTool'),
174
+ jsonb_build_object(
175
+ 'display_name', 'Execute Code',
176
+ 'description', 'Run Python / bash / node in the per-session AgentCore Code Sandbox.'
177
+ )
178
+ ),
179
+ (
180
+ 'web_search', 'tool', 'builtin',
181
+ jsonb_build_object('module_path', 'strands_tools', 'class_name', 'web_search'),
182
+ jsonb_build_object(
183
+ 'display_name', 'Web Search',
184
+ 'description', 'Query the web via the managed Strands search tool.'
185
+ )
186
+ ),
187
+ (
188
+ 'recall', 'tool', 'builtin',
189
+ jsonb_build_object('module_path', 'memory_tools', 'class_name', 'recall'),
190
+ jsonb_build_object(
191
+ 'display_name', 'Recall',
192
+ 'description', 'Read from the agent''s memory engine (managed / Hindsight).'
193
+ )
194
+ ),
195
+ (
196
+ 'reflect', 'tool', 'builtin',
197
+ jsonb_build_object('module_path', 'memory_tools', 'class_name', 'reflect'),
198
+ jsonb_build_object(
199
+ 'display_name', 'Reflect',
200
+ 'description', 'Write a reflective note into the agent''s memory engine.'
201
+ )
202
+ ),
203
+ (
204
+ 'artifacts', 'tool', 'builtin',
205
+ jsonb_build_object('module_path', 'artifact_tools', 'class_name', 'ArtifactsTool'),
206
+ jsonb_build_object(
207
+ 'display_name', 'Artifacts',
208
+ 'description', 'Emit a structured artifact for the admin UI to render.'
209
+ )
210
+ ),
211
+ (
212
+ 'Skill', 'tool', 'builtin',
213
+ jsonb_build_object('module_path', 'skill_meta_tool', 'class_name', 'Skill'),
214
+ jsonb_build_object(
215
+ 'display_name', 'Skill (meta-tool)',
216
+ 'description', 'Invoke any skill available in the session allowlist.'
217
+ )
218
+ )
219
+ ON CONFLICT ("type", "source", "slug") DO NOTHING;
@@ -0,0 +1,26 @@
1
+ -- aws_s3 Aurora extension bootstrap.
2
+ --
3
+ -- Enables `aws_s3.query_export_to_s3(...)` and its supporting helpers for
4
+ -- destructive-migration pre-drop snapshots (see U5 of the thread-detail
5
+ -- cleanup plan) and any future caller that wants direct SQL → S3 exports.
6
+ --
7
+ -- Requires: Aurora cluster with an IAM role associated that grants s3
8
+ -- PutObject on the target bucket. The role is provisioned by U13 (see
9
+ -- terraform/modules/data/aurora-postgres — aws_rds_cluster_role_association
10
+ -- with feature_name = "s3Export"). Without the role association this
11
+ -- extension installs successfully but calls to query_export_to_s3 fail at
12
+ -- runtime with an AccessDenied-style error.
13
+ --
14
+ -- Apply manually (matches the 0018+ hand-rolled convention):
15
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0028_aws_s3_extension.sql
16
+ --
17
+ -- Drift detection:
18
+ -- pnpm db:migrate-manual (reporter now recognizes `-- creates-extension:`)
19
+ --
20
+ -- Pre-migration invariants:
21
+ -- - Caller has rds_superuser on the cluster (required for CREATE EXTENSION).
22
+ -- - Aurora Postgres engine version supports aws_s3 (14.9+ / 15.2+).
23
+ --
24
+ -- creates-extension: aws_s3
25
+
26
+ CREATE EXTENSION IF NOT EXISTS aws_s3 CASCADE;
@@ -0,0 +1,42 @@
1
+ -- V1 agent-architecture — column drop (U6 of plan #007).
2
+ --
3
+ -- Drops the legacy `skill_catalog.execution` and `skill_catalog.mode` columns
4
+ -- plus the `idx_skill_catalog_execution` index. The runtime no longer branches
5
+ -- on these fields: the `composition` + `declarative` execution types were
6
+ -- deleted in U6, and the remaining `script` / `context` distinction is read
7
+ -- from each skill's on-disk `skill.yaml` by the runtime —
8
+ -- never from the catalog table.
9
+ --
10
+ -- See docs/plans/2026-04-23-007-feat-v1-agent-architecture-final-call-plan.md
11
+ -- §Implementation Units → U6.
12
+ --
13
+ -- Apply manually (matches the 0018+ hand-rolled convention):
14
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0029_collapse_execution_types.sql
15
+ --
16
+ -- Drift detection:
17
+ -- pnpm db:migrate-manual
18
+ --
19
+ -- Pre-migration invariants:
20
+ -- - skill_catalog exists
21
+ -- - no TypeScript / Python code reads the execution or mode columns
22
+ -- on the skill_catalog table (enforced by U6 PR's grep-for-zero
23
+ -- check, see the plan's §U6 verification block).
24
+ --
25
+ -- drops-column: public.skill_catalog.execution
26
+ -- drops-column: public.skill_catalog.mode
27
+
28
+ DO $$
29
+ BEGIN
30
+ IF to_regclass('public.skill_catalog') IS NULL THEN
31
+ RAISE EXCEPTION 'skill_catalog table missing — cannot drop execution/mode columns on a fresh stage';
32
+ END IF;
33
+ END $$;
34
+
35
+ -- The runtime cutover (PR #U6) ships before this migration. Once deployed
36
+ -- the columns are unread; the drop is a pure cleanup.
37
+ ALTER TABLE skill_catalog DROP COLUMN IF EXISTS execution;
38
+ ALTER TABLE skill_catalog DROP COLUMN IF EXISTS mode;
39
+
40
+ -- The execution-keyed index tracked skill_catalog.execution and is dead once
41
+ -- that column is gone. DROP IF EXISTS keeps the migration idempotent.
42
+ DROP INDEX IF EXISTS idx_skill_catalog_execution;