thinkwork-cli 0.12.12 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22123 -9219
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,291 @@
1
+ -- Purpose: add provider-neutral Email Channel plugin state, policy, ledger, and SES compatibility tables.
2
+ -- Plan: docs/plans/2026-06-17-003-feat-email-channel-plugin-plan.md (U2)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0170_email_channel_plugin.sql
4
+ -- creates: public.email_provider_installs
5
+ -- creates: public.email_domains
6
+ -- creates: public.email_readiness_checks
7
+ -- creates: public.email_space_policies
8
+ -- creates: public.email_space_sender_allowlists
9
+ -- creates: public.email_conversations
10
+ -- creates: public.email_body_objects
11
+ -- creates: public.email_ledger_events
12
+ -- creates: public.email_provider_events
13
+ -- creates: public.email_ses_compatibility_mappings
14
+ -- creates: public.uq_email_provider_installs_tenant_provider
15
+ -- creates: public.uq_email_provider_installs_active
16
+ -- creates: public.idx_email_provider_installs_tenant
17
+ -- creates: public.idx_email_provider_installs_provider_status
18
+ -- creates: public.uq_email_domains_tenant_domain
19
+ -- creates: public.idx_email_domains_provider
20
+ -- creates: public.idx_email_domains_tenant_status
21
+ -- creates: public.uq_email_readiness_check_scope
22
+ -- creates: public.idx_email_readiness_provider
23
+ -- creates: public.idx_email_readiness_tenant_status
24
+ -- creates: public.uq_email_space_policies_space
25
+ -- creates: public.idx_email_space_policies_provider
26
+ -- creates: public.uq_email_sender_allowlist_value
27
+ -- creates: public.idx_email_sender_allowlist_space
28
+ -- creates: public.idx_email_conversations_tenant_status
29
+ -- creates: public.idx_email_conversations_space
30
+ -- creates: public.idx_email_conversations_thread
31
+ -- creates: public.uq_email_conversations_thread_participants
32
+ -- creates: public.idx_email_body_objects_conversation
33
+ -- creates: public.idx_email_body_objects_retention
34
+ -- creates: public.idx_email_ledger_tenant_created
35
+ -- creates: public.idx_email_ledger_conversation
36
+ -- creates: public.idx_email_ledger_space
37
+ -- creates: public.idx_email_ledger_provider_message
38
+ -- creates: public.uq_email_provider_events_provider_event
39
+ -- creates: public.idx_email_provider_events_message
40
+ -- creates: public.idx_email_provider_events_type_created
41
+ -- creates: public.uq_email_ses_mapping_token
42
+ -- creates: public.idx_email_ses_mapping_message
43
+ -- creates: public.idx_email_ses_mapping_conversation
44
+
45
+ \set ON_ERROR_STOP on
46
+
47
+ BEGIN;
48
+
49
+ SET LOCAL lock_timeout = '5s';
50
+ SET LOCAL statement_timeout = '120s';
51
+
52
+ CREATE TABLE IF NOT EXISTS public.email_provider_installs (
53
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
54
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
55
+ provider text NOT NULL,
56
+ display_name text,
57
+ status text NOT NULL DEFAULT 'pending',
58
+ active_for_production boolean NOT NULL DEFAULT false,
59
+ credential_secret_ref text,
60
+ webhook_secret_ref text,
61
+ default_from_email text,
62
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
63
+ created_at timestamptz NOT NULL DEFAULT now(),
64
+ updated_at timestamptz NOT NULL DEFAULT now(),
65
+ CONSTRAINT email_provider_installs_provider_allowed CHECK (provider IN ('resend', 'ses')),
66
+ CONSTRAINT email_provider_installs_status_allowed CHECK (status IN ('pending', 'ready', 'failed', 'disabled'))
67
+ );
68
+
69
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_provider_installs_active
70
+ ON public.email_provider_installs (tenant_id)
71
+ WHERE active_for_production = true;
72
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_provider_installs_tenant_provider
73
+ ON public.email_provider_installs (tenant_id, provider);
74
+ CREATE INDEX IF NOT EXISTS idx_email_provider_installs_tenant
75
+ ON public.email_provider_installs (tenant_id);
76
+ CREATE INDEX IF NOT EXISTS idx_email_provider_installs_provider_status
77
+ ON public.email_provider_installs (tenant_id, provider, status);
78
+
79
+ CREATE TABLE IF NOT EXISTS public.email_domains (
80
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
81
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
82
+ provider_install_id uuid NOT NULL REFERENCES public.email_provider_installs(id) ON DELETE CASCADE,
83
+ domain text NOT NULL,
84
+ ownership_type text NOT NULL,
85
+ status text NOT NULL DEFAULT 'pending',
86
+ sending_verified_at timestamptz,
87
+ inbound_verified_at timestamptz,
88
+ dns_records jsonb NOT NULL DEFAULT '{}'::jsonb,
89
+ provider_metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
90
+ created_at timestamptz NOT NULL DEFAULT now(),
91
+ updated_at timestamptz NOT NULL DEFAULT now(),
92
+ CONSTRAINT email_domains_ownership_allowed CHECK (ownership_type IN ('thinkwork_owned', 'customer_owned')),
93
+ CONSTRAINT email_domains_status_allowed CHECK (status IN ('pending', 'verified', 'failed', 'disabled'))
94
+ );
95
+
96
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_domains_tenant_domain
97
+ ON public.email_domains (tenant_id, domain);
98
+ CREATE INDEX IF NOT EXISTS idx_email_domains_provider
99
+ ON public.email_domains (provider_install_id);
100
+ CREATE INDEX IF NOT EXISTS idx_email_domains_tenant_status
101
+ ON public.email_domains (tenant_id, status);
102
+
103
+ CREATE TABLE IF NOT EXISTS public.email_readiness_checks (
104
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
105
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
106
+ provider_install_id uuid NOT NULL REFERENCES public.email_provider_installs(id) ON DELETE CASCADE,
107
+ domain_id uuid REFERENCES public.email_domains(id) ON DELETE CASCADE,
108
+ check_key text NOT NULL,
109
+ status text NOT NULL DEFAULT 'pending',
110
+ last_checked_at timestamptz,
111
+ failure_code text,
112
+ failure_message text,
113
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
114
+ created_at timestamptz NOT NULL DEFAULT now(),
115
+ updated_at timestamptz NOT NULL DEFAULT now(),
116
+ CONSTRAINT email_readiness_check_key_allowed CHECK (check_key IN ('credentials', 'sending_domain', 'inbound_receiving', 'webhook_signature', 'provider_events', 'loop_test')),
117
+ CONSTRAINT email_readiness_status_allowed CHECK (status IN ('pending', 'pass', 'fail', 'blocked'))
118
+ );
119
+
120
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_readiness_check_scope
121
+ ON public.email_readiness_checks (
122
+ tenant_id,
123
+ provider_install_id,
124
+ COALESCE(domain_id, '00000000-0000-0000-0000-000000000000'::uuid),
125
+ check_key
126
+ );
127
+ CREATE INDEX IF NOT EXISTS idx_email_readiness_provider
128
+ ON public.email_readiness_checks (provider_install_id);
129
+ CREATE INDEX IF NOT EXISTS idx_email_readiness_tenant_status
130
+ ON public.email_readiness_checks (tenant_id, status);
131
+
132
+ CREATE TABLE IF NOT EXISTS public.email_space_policies (
133
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
134
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
135
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
136
+ provider_install_id uuid REFERENCES public.email_provider_installs(id) ON DELETE SET NULL,
137
+ enabled boolean NOT NULL DEFAULT false,
138
+ registered_users_allowed boolean NOT NULL DEFAULT true,
139
+ private_space_membership_required boolean NOT NULL DEFAULT true,
140
+ outside_sender_default text NOT NULL DEFAULT 'deny',
141
+ first_send_review_required boolean NOT NULL DEFAULT true,
142
+ policy jsonb NOT NULL DEFAULT '{}'::jsonb,
143
+ created_at timestamptz NOT NULL DEFAULT now(),
144
+ updated_at timestamptz NOT NULL DEFAULT now(),
145
+ CONSTRAINT email_space_policies_outside_default_allowed CHECK (outside_sender_default IN ('deny', 'allowlist'))
146
+ );
147
+
148
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_space_policies_space
149
+ ON public.email_space_policies (tenant_id, space_id);
150
+ CREATE INDEX IF NOT EXISTS idx_email_space_policies_provider
151
+ ON public.email_space_policies (provider_install_id);
152
+
153
+ CREATE TABLE IF NOT EXISTS public.email_space_sender_allowlists (
154
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
155
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
156
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
157
+ value_type text NOT NULL,
158
+ value text NOT NULL,
159
+ reason text,
160
+ created_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
161
+ created_at timestamptz NOT NULL DEFAULT now(),
162
+ CONSTRAINT email_sender_allowlist_type_allowed CHECK (value_type IN ('email', 'domain'))
163
+ );
164
+
165
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_sender_allowlist_value
166
+ ON public.email_space_sender_allowlists (tenant_id, space_id, value_type, value);
167
+ CREATE INDEX IF NOT EXISTS idx_email_sender_allowlist_space
168
+ ON public.email_space_sender_allowlists (tenant_id, space_id);
169
+
170
+ CREATE TABLE IF NOT EXISTS public.email_conversations (
171
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
172
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
173
+ space_id uuid REFERENCES public.spaces(id) ON DELETE SET NULL,
174
+ thread_id uuid REFERENCES public.threads(id) ON DELETE SET NULL,
175
+ provider_install_id uuid REFERENCES public.email_provider_installs(id) ON DELETE SET NULL,
176
+ subject text,
177
+ status text NOT NULL DEFAULT 'pending_approval',
178
+ approved_at timestamptz,
179
+ approved_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
180
+ last_message_at timestamptz,
181
+ participant_hash text NOT NULL,
182
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
183
+ created_at timestamptz NOT NULL DEFAULT now(),
184
+ updated_at timestamptz NOT NULL DEFAULT now(),
185
+ CONSTRAINT email_conversations_status_allowed CHECK (status IN ('pending_approval', 'approved', 'closed', 'blocked'))
186
+ );
187
+
188
+ CREATE INDEX IF NOT EXISTS idx_email_conversations_tenant_status
189
+ ON public.email_conversations (tenant_id, status);
190
+ CREATE INDEX IF NOT EXISTS idx_email_conversations_space
191
+ ON public.email_conversations (tenant_id, space_id);
192
+ CREATE INDEX IF NOT EXISTS idx_email_conversations_thread
193
+ ON public.email_conversations (thread_id);
194
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_conversations_thread_participants
195
+ ON public.email_conversations (tenant_id, thread_id, participant_hash)
196
+ WHERE thread_id IS NOT NULL;
197
+
198
+ CREATE TABLE IF NOT EXISTS public.email_body_objects (
199
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
200
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
201
+ conversation_id uuid REFERENCES public.email_conversations(id) ON DELETE CASCADE,
202
+ direction text NOT NULL,
203
+ content_hash text NOT NULL,
204
+ object_ref text NOT NULL,
205
+ retention_until timestamptz NOT NULL,
206
+ redacted_at timestamptz,
207
+ redacted_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
208
+ redaction_reason text,
209
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
210
+ created_at timestamptz NOT NULL DEFAULT now(),
211
+ CONSTRAINT email_body_objects_direction_allowed CHECK (direction IN ('inbound', 'outbound'))
212
+ );
213
+
214
+ CREATE INDEX IF NOT EXISTS idx_email_body_objects_conversation
215
+ ON public.email_body_objects (conversation_id);
216
+ CREATE INDEX IF NOT EXISTS idx_email_body_objects_retention
217
+ ON public.email_body_objects (tenant_id, retention_until);
218
+
219
+ CREATE TABLE IF NOT EXISTS public.email_ledger_events (
220
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
221
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
222
+ conversation_id uuid REFERENCES public.email_conversations(id) ON DELETE SET NULL,
223
+ space_id uuid REFERENCES public.spaces(id) ON DELETE SET NULL,
224
+ thread_id uuid REFERENCES public.threads(id) ON DELETE SET NULL,
225
+ message_id uuid REFERENCES public.messages(id) ON DELETE SET NULL,
226
+ inbox_item_id uuid REFERENCES public.inbox_items(id) ON DELETE SET NULL,
227
+ provider_install_id uuid REFERENCES public.email_provider_installs(id) ON DELETE SET NULL,
228
+ event_type text NOT NULL,
229
+ provider_message_id text,
230
+ provider_event_id text,
231
+ actor_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
232
+ body_object_id uuid REFERENCES public.email_body_objects(id) ON DELETE SET NULL,
233
+ subject text,
234
+ from_email text,
235
+ to_emails jsonb NOT NULL DEFAULT '[]'::jsonb,
236
+ reason_code text,
237
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
238
+ created_at timestamptz NOT NULL DEFAULT now(),
239
+ CONSTRAINT email_ledger_events_type_allowed CHECK (event_type IN ('draft_created', 'approval_requested', 'approval_approved', 'approval_denied', 'send_blocked', 'send_attempted', 'send_succeeded', 'send_failed', 'inbound_received', 'inbound_authorized', 'inbound_rejected', 'provider_event', 'readiness_check', 'body_retained', 'body_redacted'))
240
+ );
241
+
242
+ CREATE INDEX IF NOT EXISTS idx_email_ledger_tenant_created
243
+ ON public.email_ledger_events (tenant_id, created_at);
244
+ CREATE INDEX IF NOT EXISTS idx_email_ledger_conversation
245
+ ON public.email_ledger_events (conversation_id);
246
+ CREATE INDEX IF NOT EXISTS idx_email_ledger_space
247
+ ON public.email_ledger_events (tenant_id, space_id);
248
+ CREATE INDEX IF NOT EXISTS idx_email_ledger_provider_message
249
+ ON public.email_ledger_events (tenant_id, provider_message_id);
250
+
251
+ CREATE TABLE IF NOT EXISTS public.email_provider_events (
252
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
253
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
254
+ provider_install_id uuid NOT NULL REFERENCES public.email_provider_installs(id) ON DELETE CASCADE,
255
+ ledger_event_id uuid REFERENCES public.email_ledger_events(id) ON DELETE SET NULL,
256
+ provider_event_id text NOT NULL,
257
+ provider_message_id text,
258
+ event_type text NOT NULL,
259
+ occurred_at timestamptz,
260
+ payload_metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
261
+ created_at timestamptz NOT NULL DEFAULT now(),
262
+ CONSTRAINT email_provider_events_type_allowed CHECK (event_type IN ('sent', 'delivered', 'delayed', 'failed', 'bounced', 'complained', 'opened', 'clicked', 'received'))
263
+ );
264
+
265
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_provider_events_provider_event
266
+ ON public.email_provider_events (provider_install_id, provider_event_id);
267
+ CREATE INDEX IF NOT EXISTS idx_email_provider_events_message
268
+ ON public.email_provider_events (tenant_id, provider_message_id);
269
+ CREATE INDEX IF NOT EXISTS idx_email_provider_events_type_created
270
+ ON public.email_provider_events (provider_install_id, event_type, created_at);
271
+
272
+ CREATE TABLE IF NOT EXISTS public.email_ses_compatibility_mappings (
273
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
274
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
275
+ provider_install_id uuid NOT NULL REFERENCES public.email_provider_installs(id) ON DELETE CASCADE,
276
+ reply_token_id uuid REFERENCES public.email_reply_tokens(id) ON DELETE SET NULL,
277
+ conversation_id uuid REFERENCES public.email_conversations(id) ON DELETE SET NULL,
278
+ ses_message_id text,
279
+ legacy_thread_id uuid REFERENCES public.threads(id) ON DELETE SET NULL,
280
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
281
+ created_at timestamptz NOT NULL DEFAULT now()
282
+ );
283
+
284
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_email_ses_mapping_token
285
+ ON public.email_ses_compatibility_mappings (reply_token_id);
286
+ CREATE INDEX IF NOT EXISTS idx_email_ses_mapping_message
287
+ ON public.email_ses_compatibility_mappings (tenant_id, ses_message_id);
288
+ CREATE INDEX IF NOT EXISTS idx_email_ses_mapping_conversation
289
+ ON public.email_ses_compatibility_mappings (conversation_id);
290
+
291
+ COMMIT;
@@ -0,0 +1,30 @@
1
+ -- Purpose: allow Twenty task-event server-contract smoke without native Twenty app install.
2
+ -- Plan: THNK-33 Twenty Server Contract Verification (server_contract_verified only)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0171_linked_task_external_providers.sql
4
+ -- creates-constraint: public.linked_tasks.linked_tasks_provider_allowed
5
+ -- creates-constraint: public.linked_task_events.linked_task_events_provider_allowed
6
+ -- creates-constraint: public.linked_task_events.linked_task_events_type_allowed
7
+
8
+ \set ON_ERROR_STOP on
9
+
10
+ BEGIN;
11
+
12
+ SET LOCAL lock_timeout = '5s';
13
+ SET LOCAL statement_timeout = '120s';
14
+
15
+ ALTER TABLE public.linked_tasks
16
+ DROP CONSTRAINT IF EXISTS linked_tasks_provider_allowed,
17
+ ADD CONSTRAINT linked_tasks_provider_allowed
18
+ CHECK (provider IN ('lastmile', 'thinkwork', 'twenty'));
19
+
20
+ ALTER TABLE public.linked_task_events
21
+ DROP CONSTRAINT IF EXISTS linked_task_events_provider_allowed,
22
+ ADD CONSTRAINT linked_task_events_provider_allowed
23
+ CHECK (provider IN ('lastmile', 'thinkwork', 'twenty'));
24
+
25
+ ALTER TABLE public.linked_task_events
26
+ DROP CONSTRAINT IF EXISTS linked_task_events_type_allowed,
27
+ ADD CONSTRAINT linked_task_events_type_allowed
28
+ CHECK (event_type IN ('created', 'status_changed', 'completed', 'blocked', 'reassigned', 'due_date_changed', 'comment_added', 'sync_failed', 'writeback_posted'));
29
+
30
+ COMMIT;
@@ -0,0 +1,8 @@
1
+ -- creates-constraint: public.email_provider_installs.email_provider_installs_provider_allowed
2
+
3
+ ALTER TABLE public.email_provider_installs
4
+ DROP CONSTRAINT IF EXISTS email_provider_installs_provider_allowed;
5
+
6
+ ALTER TABLE public.email_provider_installs
7
+ ADD CONSTRAINT email_provider_installs_provider_allowed
8
+ CHECK (provider IN ('resend', 'sendgrid', 'ses'));
@@ -0,0 +1,83 @@
1
+ -- creates: public.auth_provider_resources
2
+ -- creates: public.tenant_auth_provider_references
3
+ -- creates: public.uq_auth_provider_resources_cognito_idp
4
+ -- creates: public.idx_auth_provider_resources_provider_status
5
+ -- creates: public.uq_tenant_auth_provider_references_install_resource
6
+ -- creates: public.idx_tenant_auth_provider_references_tenant_status
7
+ -- creates: public.idx_tenant_auth_provider_references_resource
8
+
9
+ ALTER TABLE public.plugin_components
10
+ DROP CONSTRAINT IF EXISTS plugin_components_type_allowed;
11
+
12
+ ALTER TABLE public.plugin_components
13
+ ADD CONSTRAINT plugin_components_type_allowed
14
+ CHECK (component_type IN ('mcp-server', 'skills', 'infrastructure', 'ui-surface', 'auth-provider'));
15
+
16
+ CREATE TABLE IF NOT EXISTS public.auth_provider_resources (
17
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
18
+ provider_key text NOT NULL,
19
+ display_name text NOT NULL,
20
+ cognito_user_pool_id text NOT NULL,
21
+ cognito_app_client_ids jsonb DEFAULT '[]'::jsonb NOT NULL,
22
+ cognito_identity_provider_name text NOT NULL,
23
+ issuer_url text NOT NULL,
24
+ client_id text NOT NULL,
25
+ client_secret_ref text NOT NULL,
26
+ authorize_scopes text DEFAULT 'openid profile email' NOT NULL,
27
+ public_option_mode text DEFAULT 'single_sso' NOT NULL,
28
+ provider_options jsonb DEFAULT '[]'::jsonb NOT NULL,
29
+ validation_status text DEFAULT 'unconfigured' NOT NULL,
30
+ public_options_published boolean DEFAULT false NOT NULL,
31
+ last_validated_at timestamp with time zone,
32
+ last_error_code text,
33
+ diagnostics jsonb DEFAULT '{}'::jsonb NOT NULL,
34
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
35
+ updated_at timestamp with time zone DEFAULT now() NOT NULL,
36
+ CONSTRAINT auth_provider_resources_validation_status_allowed
37
+ CHECK (validation_status IN ('unconfigured', 'validating', 'valid', 'partially_valid', 'invalid', 'rotating_secret', 'disabled')),
38
+ CONSTRAINT auth_provider_resources_public_option_mode_allowed
39
+ CHECK (public_option_mode IN ('single_sso', 'provider_specific')),
40
+ CONSTRAINT auth_provider_resources_no_public_without_valid
41
+ CHECK (public_options_published = false OR validation_status IN ('valid', 'partially_valid'))
42
+ );
43
+
44
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_auth_provider_resources_cognito_idp
45
+ ON public.auth_provider_resources (
46
+ provider_key,
47
+ cognito_user_pool_id,
48
+ cognito_identity_provider_name
49
+ );
50
+
51
+ CREATE INDEX IF NOT EXISTS idx_auth_provider_resources_provider_status
52
+ ON public.auth_provider_resources (provider_key, validation_status);
53
+
54
+ CREATE TABLE IF NOT EXISTS public.tenant_auth_provider_references (
55
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
56
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
57
+ plugin_install_id uuid NOT NULL REFERENCES public.plugin_installs(id) ON DELETE CASCADE,
58
+ auth_provider_resource_id uuid NOT NULL REFERENCES public.auth_provider_resources(id) ON DELETE CASCADE,
59
+ status text DEFAULT 'disabled' NOT NULL,
60
+ hostnames jsonb DEFAULT '[]'::jsonb NOT NULL,
61
+ public_option_label text DEFAULT 'Continue with SSO' NOT NULL,
62
+ enabled_at timestamp with time zone,
63
+ disabled_at timestamp with time zone,
64
+ last_error_code text,
65
+ metadata jsonb DEFAULT '{}'::jsonb NOT NULL,
66
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
67
+ updated_at timestamp with time zone DEFAULT now() NOT NULL,
68
+ CONSTRAINT tenant_auth_provider_references_status_allowed
69
+ CHECK (status IN ('disabled', 'enabled', 'invalid', 'decommissioning'))
70
+ );
71
+
72
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_tenant_auth_provider_references_install_resource
73
+ ON public.tenant_auth_provider_references (
74
+ tenant_id,
75
+ plugin_install_id,
76
+ auth_provider_resource_id
77
+ );
78
+
79
+ CREATE INDEX IF NOT EXISTS idx_tenant_auth_provider_references_tenant_status
80
+ ON public.tenant_auth_provider_references (tenant_id, status);
81
+
82
+ CREATE INDEX IF NOT EXISTS idx_tenant_auth_provider_references_resource
83
+ ON public.tenant_auth_provider_references (auth_provider_resource_id);
@@ -0,0 +1,37 @@
1
+ -- THNK-43 U2: short-lived WorkOS primary-auth bridge records.
2
+ -- creates: public.workos_auth_bridges
3
+ -- creates: public.uq_workos_auth_bridges_code_digest
4
+ -- creates: public.idx_workos_auth_bridges_tenant_status
5
+ -- creates: public.idx_workos_auth_bridges_reference
6
+
7
+ CREATE TABLE IF NOT EXISTS workos_auth_bridges (
8
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
9
+ tenant_id uuid NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
10
+ tenant_auth_provider_reference_id uuid NOT NULL REFERENCES tenant_auth_provider_references(id) ON DELETE CASCADE,
11
+ auth_provider_resource_id uuid NOT NULL REFERENCES auth_provider_resources(id) ON DELETE CASCADE,
12
+ bridge_code_digest text NOT NULL,
13
+ workos_user_id text NOT NULL,
14
+ workos_session_id text NOT NULL,
15
+ workos_email text NOT NULL,
16
+ workos_email_verified boolean NOT NULL DEFAULT false,
17
+ workos_profile jsonb NOT NULL DEFAULT '{}'::jsonb,
18
+ state_nonce text NOT NULL,
19
+ redirect_uri text NOT NULL,
20
+ return_to text NOT NULL,
21
+ status text NOT NULL DEFAULT 'pending',
22
+ expires_at timestamptz NOT NULL,
23
+ consumed_at timestamptz,
24
+ created_at timestamptz NOT NULL DEFAULT now(),
25
+ updated_at timestamptz NOT NULL DEFAULT now(),
26
+ CONSTRAINT workos_auth_bridges_status_allowed
27
+ CHECK (status IN ('pending', 'consumed', 'expired'))
28
+ );
29
+
30
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_workos_auth_bridges_code_digest
31
+ ON workos_auth_bridges (bridge_code_digest);
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_workos_auth_bridges_tenant_status
34
+ ON workos_auth_bridges (tenant_id, status, expires_at);
35
+
36
+ CREATE INDEX IF NOT EXISTS idx_workos_auth_bridges_reference
37
+ ON workos_auth_bridges (tenant_auth_provider_reference_id);
@@ -0,0 +1,38 @@
1
+ -- 0175_workos_auth_sessions.sql
2
+ -- creates-column: public.workos_auth_bridges.workos_session_expires_at
3
+ -- creates: public.workos_auth_sessions
4
+ -- creates: public.idx_workos_auth_sessions_cognito_active
5
+ -- creates: public.idx_workos_auth_sessions_user_active
6
+ -- creates: public.idx_workos_auth_sessions_workos_session
7
+
8
+ ALTER TABLE workos_auth_bridges
9
+ ADD COLUMN IF NOT EXISTS workos_session_expires_at timestamptz;
10
+
11
+ CREATE TABLE IF NOT EXISTS workos_auth_sessions (
12
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
13
+ tenant_id uuid NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
14
+ user_id uuid NOT NULL REFERENCES users(id) ON DELETE CASCADE,
15
+ tenant_auth_provider_reference_id uuid NOT NULL REFERENCES tenant_auth_provider_references(id) ON DELETE CASCADE,
16
+ auth_provider_resource_id uuid NOT NULL REFERENCES auth_provider_resources(id) ON DELETE CASCADE,
17
+ cognito_principal_id text NOT NULL,
18
+ cognito_username text NOT NULL,
19
+ workos_user_id text NOT NULL,
20
+ workos_session_id text NOT NULL,
21
+ workos_email text NOT NULL,
22
+ status text NOT NULL DEFAULT 'active',
23
+ expires_at timestamptz NOT NULL,
24
+ logged_out_at timestamptz,
25
+ created_at timestamptz NOT NULL DEFAULT now(),
26
+ updated_at timestamptz NOT NULL DEFAULT now(),
27
+ CONSTRAINT workos_auth_sessions_status_allowed
28
+ CHECK (status IN ('active', 'logged_out', 'expired'))
29
+ );
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_workos_auth_sessions_cognito_active
32
+ ON workos_auth_sessions (cognito_principal_id, status, expires_at);
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_workos_auth_sessions_user_active
35
+ ON workos_auth_sessions (tenant_id, user_id, status, expires_at);
36
+
37
+ CREATE INDEX IF NOT EXISTS idx_workos_auth_sessions_workos_session
38
+ ON workos_auth_sessions (workos_session_id);
@@ -0,0 +1,107 @@
1
+ -- n8n agent-step bridge run ledger.
2
+ --
3
+ -- Apply manually before deploying bridge endpoint code:
4
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0176_n8n_agent_step_runs.sql
5
+ --
6
+ -- creates: public.n8n_agent_step_runs
7
+ -- creates: public.n8n_agent_step_runs_tenant_idempotency_uidx
8
+ -- creates: public.n8n_agent_step_runs_tenant_status_idx
9
+ -- creates: public.n8n_agent_step_runs_thread_idx
10
+ -- creates: public.n8n_agent_step_runs_n8n_execution_idx
11
+ -- creates: public.n8n_agent_step_runs_due_expiry_idx
12
+ -- creates: public.n8n_agent_step_runs_resume_pending_idx
13
+ -- creates-constraint: public.n8n_agent_step_runs.n8n_agent_step_runs_status_check
14
+ -- creates-constraint: public.n8n_agent_step_runs.n8n_agent_step_runs_resume_status_check
15
+ -- creates-constraint: public.n8n_agent_step_runs.n8n_agent_step_runs_timeout_bounds_check
16
+ -- creates-constraint: public.n8n_agent_step_runs.n8n_agent_step_runs_terminal_state_check
17
+
18
+ CREATE TABLE IF NOT EXISTS "n8n_agent_step_runs" (
19
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
20
+ "tenant_id" uuid NOT NULL REFERENCES "tenants"("id") ON DELETE cascade,
21
+ "plugin_install_id" uuid REFERENCES "plugin_installs"("id") ON DELETE set null,
22
+ "managed_application_id" uuid REFERENCES "managed_applications"("id") ON DELETE set null,
23
+ "space_id" uuid NOT NULL REFERENCES "spaces"("id") ON DELETE restrict,
24
+ "agent_id" uuid REFERENCES "agents"("id") ON DELETE set null,
25
+ "thread_id" uuid REFERENCES "threads"("id") ON DELETE set null,
26
+ "thread_turn_id" uuid REFERENCES "thread_turns"("id") ON DELETE set null,
27
+ "opening_message_id" uuid REFERENCES "messages"("id") ON DELETE set null,
28
+ "status" text NOT NULL DEFAULT 'accepted',
29
+ "resume_status" text NOT NULL DEFAULT 'not_ready',
30
+ "workflow_id" text NOT NULL,
31
+ "workflow_name" text,
32
+ "execution_id" text NOT NULL,
33
+ "step_id" text NOT NULL,
34
+ "correlation_id" text NOT NULL,
35
+ "request_id" text,
36
+ "idempotency_key" text NOT NULL,
37
+ "instructions_preview" text,
38
+ "input_preview" text,
39
+ "request_metadata" jsonb NOT NULL DEFAULT '{}'::jsonb,
40
+ "resume_url_secret_ref" text,
41
+ "resume_url_host" text,
42
+ "resume_url_path" text,
43
+ "timeout_seconds" integer NOT NULL,
44
+ "expires_at" timestamp with time zone NOT NULL,
45
+ "result_payload" jsonb,
46
+ "output_payload" jsonb,
47
+ "error_payload" jsonb,
48
+ "summary" text,
49
+ "links" jsonb,
50
+ "resume_attempt_count" integer NOT NULL DEFAULT 0,
51
+ "next_resume_attempt_at" timestamp with time zone,
52
+ "last_resume_attempt_at" timestamp with time zone,
53
+ "last_resume_http_status" integer,
54
+ "last_resume_error" text,
55
+ "resumed_at" timestamp with time zone,
56
+ "terminal_at" timestamp with time zone,
57
+ "accepted_at" timestamp with time zone NOT NULL DEFAULT now(),
58
+ "created_at" timestamp with time zone NOT NULL DEFAULT now(),
59
+ "updated_at" timestamp with time zone NOT NULL DEFAULT now(),
60
+ CONSTRAINT "n8n_agent_step_runs_status_check"
61
+ CHECK ("status" IN (
62
+ 'accepted',
63
+ 'waiting',
64
+ 'awaiting_human',
65
+ 'resume_pending',
66
+ 'resuming',
67
+ 'resumed',
68
+ 'resume_failed',
69
+ 'failed',
70
+ 'expired'
71
+ )),
72
+ CONSTRAINT "n8n_agent_step_runs_resume_status_check"
73
+ CHECK ("resume_status" IN (
74
+ 'not_ready',
75
+ 'pending',
76
+ 'resuming',
77
+ 'resumed',
78
+ 'failed'
79
+ )),
80
+ CONSTRAINT "n8n_agent_step_runs_timeout_bounds_check"
81
+ CHECK ("timeout_seconds" BETWEEN 300 AND 604800),
82
+ CONSTRAINT "n8n_agent_step_runs_terminal_state_check"
83
+ CHECK (
84
+ "status" NOT IN ('resumed', 'resume_failed', 'failed', 'expired')
85
+ OR "terminal_at" IS NOT NULL
86
+ )
87
+ );
88
+
89
+ CREATE UNIQUE INDEX IF NOT EXISTS "n8n_agent_step_runs_tenant_idempotency_uidx"
90
+ ON "n8n_agent_step_runs" ("tenant_id", "idempotency_key");
91
+
92
+ CREATE INDEX IF NOT EXISTS "n8n_agent_step_runs_tenant_status_idx"
93
+ ON "n8n_agent_step_runs" ("tenant_id", "status");
94
+
95
+ CREATE INDEX IF NOT EXISTS "n8n_agent_step_runs_thread_idx"
96
+ ON "n8n_agent_step_runs" ("tenant_id", "thread_id");
97
+
98
+ CREATE INDEX IF NOT EXISTS "n8n_agent_step_runs_n8n_execution_idx"
99
+ ON "n8n_agent_step_runs" ("tenant_id", "workflow_id", "execution_id");
100
+
101
+ CREATE INDEX IF NOT EXISTS "n8n_agent_step_runs_due_expiry_idx"
102
+ ON "n8n_agent_step_runs" ("tenant_id", "expires_at")
103
+ WHERE "status" IN ('accepted', 'waiting', 'awaiting_human');
104
+
105
+ CREATE INDEX IF NOT EXISTS "n8n_agent_step_runs_resume_pending_idx"
106
+ ON "n8n_agent_step_runs" ("tenant_id", "next_resume_attempt_at")
107
+ WHERE "status" = 'resume_pending';