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,197 @@
1
+ -- Purpose: attach threads to Spaces and add human/agent thread participants.
2
+ -- Plan: docs/plans/2026-05-19-003-feat-spaces-customer-onboarding-v1-plan.md (U3)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0106_space_threads_participants.sql
4
+ -- creates-column: public.threads.space_id
5
+ -- creates: public.idx_threads_tenant_space_updated
6
+ -- creates: public.thread_participants
7
+ -- creates: public.uq_thread_participants_user
8
+ -- creates: public.uq_thread_participants_agent
9
+ -- creates: public.idx_thread_participants_thread
10
+ -- creates: public.idx_thread_participants_space
11
+ -- creates-function: public.enforce_thread_participant_tenant
12
+ -- creates-function: public.enforce_thread_space_tenant
13
+ -- creates-trigger: public.thread_participants.thread_participants_tenant_guard
14
+ -- creates-trigger: public.threads.threads_space_tenant_guard
15
+ -- creates-constraint: public.threads.threads_space_id_spaces_id_fk
16
+ -- creates-constraint: public.thread_participants.thread_participants_tenant_id_tenants_id_fk
17
+ -- creates-constraint: public.thread_participants.thread_participants_thread_id_threads_id_fk
18
+ -- creates-constraint: public.thread_participants.thread_participants_space_id_spaces_id_fk
19
+ -- creates-constraint: public.thread_participants.thread_participants_user_id_users_id_fk
20
+ -- creates-constraint: public.thread_participants.thread_participants_agent_id_agents_id_fk
21
+ -- creates-constraint: public.thread_participants.thread_participants_type_allowed
22
+ -- creates-constraint: public.thread_participants.thread_participants_target_matches_type
23
+ -- creates-constraint: public.thread_participants.thread_participants_notification_preference_allowed
24
+
25
+ \set ON_ERROR_STOP on
26
+
27
+ BEGIN;
28
+
29
+ SET LOCAL lock_timeout = '5s';
30
+ SET LOCAL statement_timeout = '120s';
31
+
32
+ ALTER TABLE public.threads
33
+ ADD COLUMN IF NOT EXISTS space_id uuid;
34
+
35
+ DO $$
36
+ BEGIN
37
+ ALTER TABLE public.threads
38
+ ADD CONSTRAINT threads_space_id_spaces_id_fk
39
+ FOREIGN KEY (space_id)
40
+ REFERENCES public.spaces(id)
41
+ ON DELETE SET NULL;
42
+ EXCEPTION
43
+ WHEN duplicate_object THEN NULL;
44
+ END $$;
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_threads_tenant_space_updated
47
+ ON public.threads (tenant_id, space_id, updated_at DESC)
48
+ WHERE space_id IS NOT NULL;
49
+
50
+ CREATE OR REPLACE FUNCTION public.enforce_thread_space_tenant()
51
+ RETURNS trigger
52
+ LANGUAGE plpgsql
53
+ AS $$
54
+ DECLARE
55
+ target_tenant_id uuid;
56
+ BEGIN
57
+ IF NEW.space_id IS NULL THEN
58
+ RETURN NEW;
59
+ END IF;
60
+
61
+ SELECT tenant_id INTO target_tenant_id
62
+ FROM public.spaces
63
+ WHERE id = NEW.space_id;
64
+
65
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
66
+ RAISE EXCEPTION 'thread space tenant mismatch for space %', NEW.space_id
67
+ USING ERRCODE = '23514';
68
+ END IF;
69
+
70
+ RETURN NEW;
71
+ END;
72
+ $$;
73
+
74
+ DROP TRIGGER IF EXISTS threads_space_tenant_guard
75
+ ON public.threads;
76
+
77
+ CREATE TRIGGER threads_space_tenant_guard
78
+ BEFORE INSERT OR UPDATE OF tenant_id, space_id
79
+ ON public.threads
80
+ FOR EACH ROW
81
+ EXECUTE FUNCTION public.enforce_thread_space_tenant();
82
+
83
+ CREATE TABLE IF NOT EXISTS public.thread_participants (
84
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
85
+ tenant_id uuid NOT NULL,
86
+ thread_id uuid NOT NULL,
87
+ space_id uuid,
88
+ participant_type text NOT NULL,
89
+ user_id uuid,
90
+ agent_id uuid,
91
+ role text NOT NULL DEFAULT 'member',
92
+ source text NOT NULL DEFAULT 'manual',
93
+ notification_preference text NOT NULL DEFAULT 'subscribed',
94
+ created_at timestamptz NOT NULL DEFAULT now(),
95
+ updated_at timestamptz NOT NULL DEFAULT now(),
96
+ CONSTRAINT thread_participants_tenant_id_tenants_id_fk
97
+ FOREIGN KEY (tenant_id)
98
+ REFERENCES public.tenants(id)
99
+ ON DELETE CASCADE,
100
+ CONSTRAINT thread_participants_thread_id_threads_id_fk
101
+ FOREIGN KEY (thread_id)
102
+ REFERENCES public.threads(id)
103
+ ON DELETE CASCADE,
104
+ CONSTRAINT thread_participants_space_id_spaces_id_fk
105
+ FOREIGN KEY (space_id)
106
+ REFERENCES public.spaces(id)
107
+ ON DELETE SET NULL,
108
+ CONSTRAINT thread_participants_user_id_users_id_fk
109
+ FOREIGN KEY (user_id)
110
+ REFERENCES public.users(id)
111
+ ON DELETE CASCADE,
112
+ CONSTRAINT thread_participants_agent_id_agents_id_fk
113
+ FOREIGN KEY (agent_id)
114
+ REFERENCES public.agents(id)
115
+ ON DELETE CASCADE,
116
+ CONSTRAINT thread_participants_type_allowed
117
+ CHECK (participant_type IN ('user', 'agent')),
118
+ CONSTRAINT thread_participants_target_matches_type
119
+ CHECK (
120
+ (participant_type = 'user' AND user_id IS NOT NULL AND agent_id IS NULL)
121
+ OR
122
+ (participant_type = 'agent' AND agent_id IS NOT NULL AND user_id IS NULL)
123
+ ),
124
+ CONSTRAINT thread_participants_notification_preference_allowed
125
+ CHECK (notification_preference IN ('subscribed', 'mentions', 'muted'))
126
+ );
127
+
128
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_thread_participants_user
129
+ ON public.thread_participants (tenant_id, thread_id, user_id)
130
+ WHERE user_id IS NOT NULL;
131
+
132
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_thread_participants_agent
133
+ ON public.thread_participants (tenant_id, thread_id, agent_id)
134
+ WHERE agent_id IS NOT NULL;
135
+
136
+ CREATE INDEX IF NOT EXISTS idx_thread_participants_thread
137
+ ON public.thread_participants (thread_id);
138
+
139
+ CREATE INDEX IF NOT EXISTS idx_thread_participants_space
140
+ ON public.thread_participants (tenant_id, space_id);
141
+
142
+ CREATE OR REPLACE FUNCTION public.enforce_thread_participant_tenant()
143
+ RETURNS trigger
144
+ LANGUAGE plpgsql
145
+ AS $$
146
+ DECLARE
147
+ target_tenant_id uuid;
148
+ target_space_id uuid;
149
+ BEGIN
150
+ SELECT tenant_id, space_id INTO target_tenant_id, target_space_id
151
+ FROM public.threads
152
+ WHERE id = NEW.thread_id;
153
+
154
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
155
+ RAISE EXCEPTION 'thread participant tenant mismatch for thread %', NEW.thread_id
156
+ USING ERRCODE = '23514';
157
+ END IF;
158
+
159
+ IF NEW.space_id IS DISTINCT FROM target_space_id THEN
160
+ RAISE EXCEPTION 'thread participant space mismatch for thread %', NEW.thread_id
161
+ USING ERRCODE = '23514';
162
+ END IF;
163
+
164
+ IF NEW.participant_type = 'user' THEN
165
+ SELECT tenant_id INTO target_tenant_id
166
+ FROM public.users
167
+ WHERE id = NEW.user_id;
168
+
169
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
170
+ RAISE EXCEPTION 'thread participant tenant mismatch for user %', NEW.user_id
171
+ USING ERRCODE = '23514';
172
+ END IF;
173
+ ELSIF NEW.participant_type = 'agent' THEN
174
+ SELECT tenant_id INTO target_tenant_id
175
+ FROM public.agents
176
+ WHERE id = NEW.agent_id;
177
+
178
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
179
+ RAISE EXCEPTION 'thread participant tenant mismatch for agent %', NEW.agent_id
180
+ USING ERRCODE = '23514';
181
+ END IF;
182
+ END IF;
183
+
184
+ RETURN NEW;
185
+ END;
186
+ $$;
187
+
188
+ DROP TRIGGER IF EXISTS thread_participants_tenant_guard
189
+ ON public.thread_participants;
190
+
191
+ CREATE TRIGGER thread_participants_tenant_guard
192
+ BEFORE INSERT OR UPDATE
193
+ ON public.thread_participants
194
+ FOR EACH ROW
195
+ EXECUTE FUNCTION public.enforce_thread_participant_tenant();
196
+
197
+ COMMIT;
@@ -0,0 +1,245 @@
1
+ -- Purpose: add ThinkWork-side linked task mirror tables for Space Threads.
2
+ -- Plan: docs/plans/2026-05-19-003-feat-spaces-customer-onboarding-v1-plan.md (U4)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0107_linked_task_mirror.sql
4
+ -- creates: public.linked_tasks
5
+ -- creates: public.linked_task_events
6
+ -- creates: public.uq_linked_tasks_external
7
+ -- creates: public.uq_linked_tasks_checklist_item
8
+ -- creates: public.idx_linked_tasks_thread
9
+ -- creates: public.idx_linked_tasks_space
10
+ -- creates: public.uq_linked_task_events_external
11
+ -- creates: public.idx_linked_task_events_task
12
+ -- creates: public.idx_linked_task_events_thread
13
+ -- creates-function: public.enforce_linked_task_tenant
14
+ -- creates-function: public.enforce_linked_task_event_tenant
15
+ -- creates-trigger: public.linked_tasks.linked_tasks_tenant_guard
16
+ -- creates-trigger: public.linked_task_events.linked_task_events_tenant_guard
17
+ -- creates-constraint: public.linked_tasks.linked_tasks_tenant_id_tenants_id_fk
18
+ -- creates-constraint: public.linked_tasks.linked_tasks_space_id_spaces_id_fk
19
+ -- creates-constraint: public.linked_tasks.linked_tasks_thread_id_threads_id_fk
20
+ -- creates-constraint: public.linked_tasks.linked_tasks_checklist_item_id_space_checklist_items_id_fk
21
+ -- creates-constraint: public.linked_tasks.linked_tasks_provider_allowed
22
+ -- creates-constraint: public.linked_tasks.linked_tasks_status_allowed
23
+ -- creates-constraint: public.linked_tasks.linked_tasks_sync_status_allowed
24
+ -- creates-constraint: public.linked_task_events.linked_task_events_tenant_id_tenants_id_fk
25
+ -- creates-constraint: public.linked_task_events.linked_task_events_linked_task_id_linked_tasks_id_fk
26
+ -- creates-constraint: public.linked_task_events.linked_task_events_space_id_spaces_id_fk
27
+ -- creates-constraint: public.linked_task_events.linked_task_events_thread_id_threads_id_fk
28
+ -- creates-constraint: public.linked_task_events.linked_task_events_provider_allowed
29
+ -- creates-constraint: public.linked_task_events.linked_task_events_type_allowed
30
+ -- creates-constraint: public.linked_task_events.linked_task_events_previous_status_allowed
31
+ -- creates-constraint: public.linked_task_events.linked_task_events_new_status_allowed
32
+
33
+ \set ON_ERROR_STOP on
34
+
35
+ BEGIN;
36
+
37
+ SET LOCAL lock_timeout = '5s';
38
+ SET LOCAL statement_timeout = '120s';
39
+
40
+ CREATE TABLE IF NOT EXISTS public.linked_tasks (
41
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
42
+ tenant_id uuid NOT NULL,
43
+ space_id uuid NOT NULL,
44
+ thread_id uuid NOT NULL,
45
+ checklist_item_id uuid,
46
+ provider text NOT NULL DEFAULT 'lastmile',
47
+ external_task_id text NOT NULL,
48
+ external_task_url text,
49
+ title text NOT NULL,
50
+ required boolean NOT NULL DEFAULT true,
51
+ role_key text,
52
+ assignee_display text,
53
+ assignee_external_id text,
54
+ status text NOT NULL DEFAULT 'unknown',
55
+ blocked boolean NOT NULL DEFAULT false,
56
+ sync_status text NOT NULL DEFAULT 'pending',
57
+ last_synced_at timestamptz,
58
+ metadata jsonb,
59
+ created_at timestamptz NOT NULL DEFAULT now(),
60
+ updated_at timestamptz NOT NULL DEFAULT now(),
61
+ CONSTRAINT linked_tasks_tenant_id_tenants_id_fk
62
+ FOREIGN KEY (tenant_id)
63
+ REFERENCES public.tenants(id)
64
+ ON DELETE CASCADE,
65
+ CONSTRAINT linked_tasks_space_id_spaces_id_fk
66
+ FOREIGN KEY (space_id)
67
+ REFERENCES public.spaces(id)
68
+ ON DELETE CASCADE,
69
+ CONSTRAINT linked_tasks_thread_id_threads_id_fk
70
+ FOREIGN KEY (thread_id)
71
+ REFERENCES public.threads(id)
72
+ ON DELETE CASCADE,
73
+ CONSTRAINT linked_tasks_checklist_item_id_space_checklist_items_id_fk
74
+ FOREIGN KEY (checklist_item_id)
75
+ REFERENCES public.space_checklist_items(id)
76
+ ON DELETE SET NULL,
77
+ CONSTRAINT linked_tasks_provider_allowed
78
+ CHECK (provider IN ('lastmile')),
79
+ CONSTRAINT linked_tasks_status_allowed
80
+ CHECK (status IN ('unknown', 'todo', 'in_progress', 'completed', 'blocked', 'cancelled')),
81
+ CONSTRAINT linked_tasks_sync_status_allowed
82
+ CHECK (sync_status IN ('pending', 'synced', 'warning', 'error'))
83
+ );
84
+
85
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_linked_tasks_external
86
+ ON public.linked_tasks (tenant_id, provider, external_task_id);
87
+
88
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_linked_tasks_checklist_item
89
+ ON public.linked_tasks (tenant_id, thread_id, checklist_item_id)
90
+ WHERE checklist_item_id IS NOT NULL;
91
+
92
+ CREATE INDEX IF NOT EXISTS idx_linked_tasks_thread
93
+ ON public.linked_tasks (tenant_id, thread_id);
94
+
95
+ CREATE INDEX IF NOT EXISTS idx_linked_tasks_space
96
+ ON public.linked_tasks (tenant_id, space_id);
97
+
98
+ CREATE TABLE IF NOT EXISTS public.linked_task_events (
99
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
100
+ tenant_id uuid NOT NULL,
101
+ linked_task_id uuid NOT NULL,
102
+ space_id uuid NOT NULL,
103
+ thread_id uuid NOT NULL,
104
+ provider text NOT NULL DEFAULT 'lastmile',
105
+ event_type text NOT NULL,
106
+ external_event_id text,
107
+ previous_status text,
108
+ new_status text,
109
+ message text,
110
+ metadata jsonb,
111
+ occurred_at timestamptz NOT NULL DEFAULT now(),
112
+ created_at timestamptz NOT NULL DEFAULT now(),
113
+ CONSTRAINT linked_task_events_tenant_id_tenants_id_fk
114
+ FOREIGN KEY (tenant_id)
115
+ REFERENCES public.tenants(id)
116
+ ON DELETE CASCADE,
117
+ CONSTRAINT linked_task_events_linked_task_id_linked_tasks_id_fk
118
+ FOREIGN KEY (linked_task_id)
119
+ REFERENCES public.linked_tasks(id)
120
+ ON DELETE CASCADE,
121
+ CONSTRAINT linked_task_events_space_id_spaces_id_fk
122
+ FOREIGN KEY (space_id)
123
+ REFERENCES public.spaces(id)
124
+ ON DELETE CASCADE,
125
+ CONSTRAINT linked_task_events_thread_id_threads_id_fk
126
+ FOREIGN KEY (thread_id)
127
+ REFERENCES public.threads(id)
128
+ ON DELETE CASCADE,
129
+ CONSTRAINT linked_task_events_provider_allowed
130
+ CHECK (provider IN ('lastmile')),
131
+ CONSTRAINT linked_task_events_type_allowed
132
+ CHECK (event_type IN ('created', 'completed', 'blocked', 'reassigned', 'due_date_changed', 'sync_failed', 'writeback_posted')),
133
+ CONSTRAINT linked_task_events_previous_status_allowed
134
+ CHECK (previous_status IS NULL OR previous_status IN ('unknown', 'todo', 'in_progress', 'completed', 'blocked', 'cancelled')),
135
+ CONSTRAINT linked_task_events_new_status_allowed
136
+ CHECK (new_status IS NULL OR new_status IN ('unknown', 'todo', 'in_progress', 'completed', 'blocked', 'cancelled'))
137
+ );
138
+
139
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_linked_task_events_external
140
+ ON public.linked_task_events (tenant_id, provider, external_event_id)
141
+ WHERE external_event_id IS NOT NULL;
142
+
143
+ CREATE INDEX IF NOT EXISTS idx_linked_task_events_task
144
+ ON public.linked_task_events (linked_task_id);
145
+
146
+ CREATE INDEX IF NOT EXISTS idx_linked_task_events_thread
147
+ ON public.linked_task_events (tenant_id, thread_id);
148
+
149
+ CREATE OR REPLACE FUNCTION public.enforce_linked_task_tenant()
150
+ RETURNS trigger
151
+ LANGUAGE plpgsql
152
+ AS $$
153
+ DECLARE
154
+ target_tenant_id uuid;
155
+ target_space_id uuid;
156
+ BEGIN
157
+ SELECT tenant_id, space_id INTO target_tenant_id, target_space_id
158
+ FROM public.threads
159
+ WHERE id = NEW.thread_id;
160
+
161
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
162
+ RAISE EXCEPTION 'linked task tenant mismatch for thread %', NEW.thread_id
163
+ USING ERRCODE = '23514';
164
+ END IF;
165
+
166
+ IF target_space_id IS NULL OR target_space_id <> NEW.space_id THEN
167
+ RAISE EXCEPTION 'linked task space mismatch for thread %', NEW.thread_id
168
+ USING ERRCODE = '23514';
169
+ END IF;
170
+
171
+ SELECT tenant_id INTO target_tenant_id
172
+ FROM public.spaces
173
+ WHERE id = NEW.space_id;
174
+
175
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
176
+ RAISE EXCEPTION 'linked task tenant mismatch for space %', NEW.space_id
177
+ USING ERRCODE = '23514';
178
+ END IF;
179
+
180
+ IF NEW.checklist_item_id IS NOT NULL THEN
181
+ SELECT tenant_id, space_id INTO target_tenant_id, target_space_id
182
+ FROM public.space_checklist_items
183
+ WHERE id = NEW.checklist_item_id;
184
+
185
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
186
+ RAISE EXCEPTION 'linked task tenant mismatch for checklist item %', NEW.checklist_item_id
187
+ USING ERRCODE = '23514';
188
+ END IF;
189
+
190
+ IF target_space_id <> NEW.space_id THEN
191
+ RAISE EXCEPTION 'linked task space mismatch for checklist item %', NEW.checklist_item_id
192
+ USING ERRCODE = '23514';
193
+ END IF;
194
+ END IF;
195
+
196
+ RETURN NEW;
197
+ END;
198
+ $$;
199
+
200
+ DROP TRIGGER IF EXISTS linked_tasks_tenant_guard
201
+ ON public.linked_tasks;
202
+
203
+ CREATE TRIGGER linked_tasks_tenant_guard
204
+ BEFORE INSERT OR UPDATE
205
+ ON public.linked_tasks
206
+ FOR EACH ROW
207
+ EXECUTE FUNCTION public.enforce_linked_task_tenant();
208
+
209
+ CREATE OR REPLACE FUNCTION public.enforce_linked_task_event_tenant()
210
+ RETURNS trigger
211
+ LANGUAGE plpgsql
212
+ AS $$
213
+ DECLARE
214
+ target_tenant_id uuid;
215
+ target_space_id uuid;
216
+ target_thread_id uuid;
217
+ BEGIN
218
+ SELECT tenant_id, space_id, thread_id INTO target_tenant_id, target_space_id, target_thread_id
219
+ FROM public.linked_tasks
220
+ WHERE id = NEW.linked_task_id;
221
+
222
+ IF target_tenant_id IS NULL OR target_tenant_id <> NEW.tenant_id THEN
223
+ RAISE EXCEPTION 'linked task event tenant mismatch for linked task %', NEW.linked_task_id
224
+ USING ERRCODE = '23514';
225
+ END IF;
226
+
227
+ IF target_space_id <> NEW.space_id OR target_thread_id <> NEW.thread_id THEN
228
+ RAISE EXCEPTION 'linked task event parent mismatch for linked task %', NEW.linked_task_id
229
+ USING ERRCODE = '23514';
230
+ END IF;
231
+
232
+ RETURN NEW;
233
+ END;
234
+ $$;
235
+
236
+ DROP TRIGGER IF EXISTS linked_task_events_tenant_guard
237
+ ON public.linked_task_events;
238
+
239
+ CREATE TRIGGER linked_task_events_tenant_guard
240
+ BEFORE INSERT OR UPDATE
241
+ ON public.linked_task_events
242
+ FOR EACH ROW
243
+ EXECUTE FUNCTION public.enforce_linked_task_event_tenant();
244
+
245
+ COMMIT;
@@ -0,0 +1,95 @@
1
+ -- Purpose: add structured message mentions for collaborative Space Threads.
2
+ -- Plan: docs/plans/2026-05-19-003-feat-spaces-customer-onboarding-v1-plan.md (U10)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0108_message_mentions.sql
4
+ -- creates: public.message_mentions
5
+ -- creates: public.uq_message_mentions_target
6
+ -- creates: public.idx_message_mentions_thread
7
+ -- creates: public.idx_message_mentions_target
8
+ -- creates-function: public.enforce_message_mention_tenant
9
+ -- creates-trigger: public.message_mentions.message_mentions_tenant_guard
10
+ -- creates-constraint: public.message_mentions.message_mentions_tenant_id_tenants_id_fk
11
+ -- creates-constraint: public.message_mentions.message_mentions_thread_id_threads_id_fk
12
+ -- creates-constraint: public.message_mentions.message_mentions_message_id_messages_id_fk
13
+ -- creates-constraint: public.message_mentions.message_mentions_target_type_allowed
14
+
15
+ \set ON_ERROR_STOP on
16
+
17
+ BEGIN;
18
+
19
+ SET LOCAL lock_timeout = '5s';
20
+ SET LOCAL statement_timeout = '120s';
21
+
22
+ CREATE TABLE IF NOT EXISTS public.message_mentions (
23
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
24
+ tenant_id uuid NOT NULL,
25
+ thread_id uuid NOT NULL,
26
+ message_id uuid NOT NULL,
27
+ target_type text NOT NULL,
28
+ target_id uuid NOT NULL,
29
+ display_name text NOT NULL,
30
+ raw_text text,
31
+ start_offset integer,
32
+ end_offset integer,
33
+ metadata jsonb,
34
+ created_at timestamptz NOT NULL DEFAULT now(),
35
+ CONSTRAINT message_mentions_tenant_id_tenants_id_fk
36
+ FOREIGN KEY (tenant_id)
37
+ REFERENCES public.tenants(id)
38
+ ON DELETE CASCADE,
39
+ CONSTRAINT message_mentions_thread_id_threads_id_fk
40
+ FOREIGN KEY (thread_id)
41
+ REFERENCES public.threads(id)
42
+ ON DELETE CASCADE,
43
+ CONSTRAINT message_mentions_message_id_messages_id_fk
44
+ FOREIGN KEY (message_id)
45
+ REFERENCES public.messages(id)
46
+ ON DELETE CASCADE,
47
+ CONSTRAINT message_mentions_target_type_allowed
48
+ CHECK (target_type IN ('user', 'agent', 'agent_profile'))
49
+ );
50
+
51
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_message_mentions_target
52
+ ON public.message_mentions (message_id, target_type, target_id);
53
+
54
+ CREATE INDEX IF NOT EXISTS idx_message_mentions_thread
55
+ ON public.message_mentions (tenant_id, thread_id);
56
+
57
+ CREATE INDEX IF NOT EXISTS idx_message_mentions_target
58
+ ON public.message_mentions (tenant_id, target_type, target_id);
59
+
60
+ CREATE OR REPLACE FUNCTION public.enforce_message_mention_tenant()
61
+ RETURNS trigger
62
+ LANGUAGE plpgsql
63
+ AS $$
64
+ DECLARE
65
+ message_tenant uuid;
66
+ message_thread uuid;
67
+ BEGIN
68
+ SELECT tenant_id, thread_id
69
+ INTO message_tenant, message_thread
70
+ FROM public.messages
71
+ WHERE id = NEW.message_id;
72
+
73
+ IF message_tenant IS NULL THEN
74
+ RAISE EXCEPTION 'message_mentions.message_id % does not reference an existing message', NEW.message_id;
75
+ END IF;
76
+
77
+ IF message_tenant <> NEW.tenant_id THEN
78
+ RAISE EXCEPTION 'message_mentions tenant mismatch: mention %, message %', NEW.tenant_id, message_tenant;
79
+ END IF;
80
+
81
+ IF message_thread <> NEW.thread_id THEN
82
+ RAISE EXCEPTION 'message_mentions thread mismatch: mention %, message %', NEW.thread_id, message_thread;
83
+ END IF;
84
+
85
+ RETURN NEW;
86
+ END;
87
+ $$;
88
+
89
+ DROP TRIGGER IF EXISTS message_mentions_tenant_guard ON public.message_mentions;
90
+ CREATE TRIGGER message_mentions_tenant_guard
91
+ BEFORE INSERT OR UPDATE ON public.message_mentions
92
+ FOR EACH ROW
93
+ EXECUTE FUNCTION public.enforce_message_mention_tenant();
94
+
95
+ COMMIT;