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,260 @@
1
+ -- AgentLoop foundation schema.
2
+ -- Plan: docs/plans/2026-06-22-001-feat-agent-loop-foundation-plan.md (U1).
3
+ -- Apply manually (no CI migration runner):
4
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0182_agent_loops.sql
5
+ --
6
+ -- Pre-flight:
7
+ -- SELECT to_regclass('public.tenants') AS tenants;
8
+ -- SELECT to_regclass('public.users') AS users;
9
+ -- SELECT to_regclass('public.agents') AS agents;
10
+ -- SELECT to_regclass('public.scheduled_jobs') AS scheduled_jobs;
11
+ --
12
+ -- creates: public.agent_loops
13
+ -- creates: public.agent_loop_versions
14
+ -- creates: public.agent_loop_runs
15
+ -- creates: public.agent_loop_iterations
16
+ -- creates: public.agent_loop_judgments
17
+ -- creates: public.agent_loop_evidence
18
+ -- creates: public.agent_loops_tenant_slug_uidx
19
+ -- creates: public.agent_loops_tenant_lifecycle_idx
20
+ -- creates: public.agent_loops_tenant_enabled_idx
21
+ -- creates: public.agent_loops_tenant_last_run_idx
22
+ -- creates: public.agent_loop_versions_loop_version_uidx
23
+ -- creates: public.agent_loop_versions_tenant_loop_idx
24
+ -- creates: public.agent_loop_runs_tenant_status_idx
25
+ -- creates: public.agent_loop_runs_loop_created_idx
26
+ -- creates: public.agent_loop_runs_tenant_correlation_idx
27
+ -- creates: public.agent_loop_runs_tenant_idempotency_uidx
28
+ -- creates: public.agent_loop_iterations_run_number_uidx
29
+ -- creates: public.agent_loop_iterations_tenant_status_idx
30
+ -- creates: public.agent_loop_iterations_wakeup_idx
31
+ -- creates: public.agent_loop_iterations_thread_turn_idx
32
+ -- creates: public.agent_loop_judgments_run_idx
33
+ -- creates: public.agent_loop_judgments_iteration_idx
34
+ -- creates: public.agent_loop_judgments_tenant_outcome_idx
35
+ -- creates: public.agent_loop_evidence_run_idx
36
+ -- creates: public.agent_loop_evidence_loop_idx
37
+ -- creates: public.agent_loop_evidence_iteration_idx
38
+ -- creates: public.agent_loop_evidence_source_idx
39
+ -- creates: public.idx_scheduled_jobs_agent_loop
40
+ -- creates-column: public.scheduled_jobs.agent_loop_id
41
+ -- creates-constraint: public.agent_loops.agent_loops_lifecycle_status_check
42
+ -- creates-constraint: public.agent_loops.agent_loops_trigger_family_check
43
+ -- creates-constraint: public.agent_loop_versions.agent_loop_versions_status_check
44
+ -- creates-constraint: public.agent_loop_runs.agent_loop_runs_status_check
45
+ -- creates-constraint: public.agent_loop_runs.agent_loop_runs_trigger_family_check
46
+ -- creates-constraint: public.agent_loop_iterations.agent_loop_iterations_status_check
47
+ -- creates-constraint: public.agent_loop_judgments.agent_loop_judgments_mode_check
48
+ -- creates-constraint: public.agent_loop_judgments.agent_loop_judgments_outcome_check
49
+ -- creates-constraint: public.agent_loop_evidence.agent_loop_evidence_redaction_state_check
50
+
51
+ DO $$
52
+ BEGIN
53
+ IF to_regclass('public.tenants') IS NULL THEN
54
+ RAISE EXCEPTION 'tenants not found; apply core tenant migrations first';
55
+ END IF;
56
+ IF to_regclass('public.users') IS NULL THEN
57
+ RAISE EXCEPTION 'users not found; apply core user migrations first';
58
+ END IF;
59
+ IF to_regclass('public.agents') IS NULL THEN
60
+ RAISE EXCEPTION 'agents not found; apply agent migrations first';
61
+ END IF;
62
+ IF to_regclass('public.scheduled_jobs') IS NULL THEN
63
+ RAISE EXCEPTION 'scheduled_jobs not found; apply scheduled job migrations first';
64
+ END IF;
65
+ IF to_regclass('public.agent_wakeup_requests') IS NULL THEN
66
+ RAISE EXCEPTION 'agent_wakeup_requests not found; apply wakeup queue migrations first';
67
+ END IF;
68
+ IF to_regclass('public.thread_turns') IS NULL THEN
69
+ RAISE EXCEPTION 'thread_turns not found; apply scheduled job execution migrations first';
70
+ END IF;
71
+ END $$;
72
+
73
+ CREATE TABLE IF NOT EXISTS public.agent_loops (
74
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
75
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
76
+ name text NOT NULL,
77
+ slug text NOT NULL,
78
+ description text,
79
+ lifecycle_status text NOT NULL DEFAULT 'draft',
80
+ enabled boolean NOT NULL DEFAULT true,
81
+ owner_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
82
+ owner_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
83
+ primary_trigger_family text NOT NULL DEFAULT 'manual',
84
+ current_version_id uuid,
85
+ current_version_number integer,
86
+ last_run_id uuid,
87
+ last_run_status text,
88
+ last_run_at timestamp with time zone,
89
+ last_run_summary jsonb NOT NULL DEFAULT '{}'::jsonb,
90
+ accepted_run_count integer NOT NULL DEFAULT 0,
91
+ rejected_run_count integer NOT NULL DEFAULT 0,
92
+ escalated_run_count integer NOT NULL DEFAULT 0,
93
+ total_cost_usd_cents bigint NOT NULL DEFAULT 0,
94
+ cost_per_accepted_run_usd_cents bigint,
95
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
96
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
97
+ CONSTRAINT agent_loops_lifecycle_status_check CHECK (lifecycle_status IN ('draft', 'active', 'paused', 'archived')),
98
+ CONSTRAINT agent_loops_trigger_family_check CHECK (primary_trigger_family IN ('manual', 'schedule', 'api', 'webhook', 'app_event', 'n8n'))
99
+ );
100
+
101
+ CREATE UNIQUE INDEX IF NOT EXISTS agent_loops_tenant_slug_uidx
102
+ ON public.agent_loops (tenant_id, slug);
103
+ CREATE INDEX IF NOT EXISTS agent_loops_tenant_lifecycle_idx
104
+ ON public.agent_loops (tenant_id, lifecycle_status);
105
+ CREATE INDEX IF NOT EXISTS agent_loops_tenant_enabled_idx
106
+ ON public.agent_loops (tenant_id, enabled);
107
+ CREATE INDEX IF NOT EXISTS agent_loops_tenant_last_run_idx
108
+ ON public.agent_loops (tenant_id, last_run_at);
109
+
110
+ CREATE TABLE IF NOT EXISTS public.agent_loop_versions (
111
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
112
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
113
+ agent_loop_id uuid NOT NULL REFERENCES public.agent_loops(id) ON DELETE CASCADE,
114
+ version_number integer NOT NULL,
115
+ version_status text NOT NULL DEFAULT 'draft',
116
+ trigger_spec jsonb NOT NULL,
117
+ goal_spec jsonb NOT NULL,
118
+ worker_spec jsonb NOT NULL,
119
+ judge_spec jsonb NOT NULL,
120
+ loop_policy jsonb NOT NULL,
121
+ evidence_policy jsonb NOT NULL DEFAULT '{"redactionState":"summary_only","retainRawEvidence":false}'::jsonb,
122
+ source_metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
123
+ created_by_actor_type text,
124
+ created_by_actor_id uuid,
125
+ published_at timestamp with time zone,
126
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
127
+ CONSTRAINT agent_loop_versions_status_check CHECK (version_status IN ('draft', 'active', 'superseded', 'archived'))
128
+ );
129
+
130
+ CREATE UNIQUE INDEX IF NOT EXISTS agent_loop_versions_loop_version_uidx
131
+ ON public.agent_loop_versions (agent_loop_id, version_number);
132
+ CREATE INDEX IF NOT EXISTS agent_loop_versions_tenant_loop_idx
133
+ ON public.agent_loop_versions (tenant_id, agent_loop_id);
134
+
135
+ CREATE TABLE IF NOT EXISTS public.agent_loop_runs (
136
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
137
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
138
+ agent_loop_id uuid NOT NULL REFERENCES public.agent_loops(id) ON DELETE CASCADE,
139
+ agent_loop_version_id uuid REFERENCES public.agent_loop_versions(id) ON DELETE SET NULL,
140
+ status text NOT NULL DEFAULT 'queued',
141
+ trigger_family text NOT NULL,
142
+ trigger_source text,
143
+ scheduled_job_id uuid,
144
+ actor_type text,
145
+ actor_id uuid,
146
+ idempotency_key text,
147
+ correlation_id text,
148
+ current_iteration integer NOT NULL DEFAULT 0,
149
+ terminal_reason text,
150
+ policy_snapshot jsonb NOT NULL DEFAULT '{}'::jsonb,
151
+ input_summary jsonb,
152
+ output_summary jsonb,
153
+ started_at timestamp with time zone,
154
+ finished_at timestamp with time zone,
155
+ last_event_at timestamp with time zone,
156
+ error_code text,
157
+ error_message text,
158
+ total_cost_usd_cents bigint,
159
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
160
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
161
+ CONSTRAINT agent_loop_runs_status_check CHECK (status IN ('queued', 'running', 'waiting_for_human', 'completed', 'failed', 'budget_stopped', 'escalated', 'canceled', 'skipped')),
162
+ CONSTRAINT agent_loop_runs_trigger_family_check CHECK (trigger_family IN ('manual', 'schedule', 'api', 'webhook', 'app_event', 'n8n'))
163
+ );
164
+
165
+ CREATE INDEX IF NOT EXISTS agent_loop_runs_tenant_status_idx
166
+ ON public.agent_loop_runs (tenant_id, status);
167
+ CREATE INDEX IF NOT EXISTS agent_loop_runs_loop_created_idx
168
+ ON public.agent_loop_runs (agent_loop_id, created_at);
169
+ CREATE INDEX IF NOT EXISTS agent_loop_runs_tenant_correlation_idx
170
+ ON public.agent_loop_runs (tenant_id, correlation_id);
171
+ CREATE UNIQUE INDEX IF NOT EXISTS agent_loop_runs_tenant_idempotency_uidx
172
+ ON public.agent_loop_runs (tenant_id, idempotency_key)
173
+ WHERE idempotency_key IS NOT NULL;
174
+
175
+ CREATE TABLE IF NOT EXISTS public.agent_loop_iterations (
176
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
177
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
178
+ agent_loop_run_id uuid NOT NULL REFERENCES public.agent_loop_runs(id) ON DELETE CASCADE,
179
+ iteration_number integer NOT NULL,
180
+ status text NOT NULL DEFAULT 'queued',
181
+ goal_mode_action text,
182
+ agent_wakeup_request_id uuid REFERENCES public.agent_wakeup_requests(id) ON DELETE SET NULL,
183
+ thread_turn_id uuid REFERENCES public.thread_turns(id) ON DELETE SET NULL,
184
+ input_summary jsonb,
185
+ output_summary jsonb,
186
+ started_at timestamp with time zone,
187
+ finished_at timestamp with time zone,
188
+ error_code text,
189
+ error_message text,
190
+ total_cost_usd_cents bigint,
191
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
192
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
193
+ CONSTRAINT agent_loop_iterations_status_check CHECK (status IN ('queued', 'running', 'completed', 'failed', 'budget_stopped', 'waiting_for_human', 'canceled'))
194
+ );
195
+
196
+ CREATE UNIQUE INDEX IF NOT EXISTS agent_loop_iterations_run_number_uidx
197
+ ON public.agent_loop_iterations (agent_loop_run_id, iteration_number);
198
+ CREATE INDEX IF NOT EXISTS agent_loop_iterations_tenant_status_idx
199
+ ON public.agent_loop_iterations (tenant_id, status);
200
+ CREATE INDEX IF NOT EXISTS agent_loop_iterations_wakeup_idx
201
+ ON public.agent_loop_iterations (agent_wakeup_request_id);
202
+ CREATE INDEX IF NOT EXISTS agent_loop_iterations_thread_turn_idx
203
+ ON public.agent_loop_iterations (thread_turn_id);
204
+
205
+ CREATE TABLE IF NOT EXISTS public.agent_loop_judgments (
206
+ id bigserial PRIMARY KEY,
207
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
208
+ agent_loop_run_id uuid NOT NULL REFERENCES public.agent_loop_runs(id) ON DELETE CASCADE,
209
+ agent_loop_iteration_id uuid REFERENCES public.agent_loop_iterations(id) ON DELETE CASCADE,
210
+ judge_mode text NOT NULL,
211
+ outcome text NOT NULL,
212
+ confidence integer,
213
+ rationale text,
214
+ terminal_reason text,
215
+ structured_output jsonb NOT NULL DEFAULT '{}'::jsonb,
216
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
217
+ CONSTRAINT agent_loop_judgments_mode_check CHECK (judge_mode IN ('self_check', 'human_approval', 'model_judge', 'reviewer_agent', 'eval_threshold', 'external_callback')),
218
+ CONSTRAINT agent_loop_judgments_outcome_check CHECK (outcome IN ('complete', 'continue', 'failed', 'budget_stopped', 'needs_human_approval', 'escalated'))
219
+ );
220
+
221
+ CREATE INDEX IF NOT EXISTS agent_loop_judgments_run_idx
222
+ ON public.agent_loop_judgments (agent_loop_run_id);
223
+ CREATE INDEX IF NOT EXISTS agent_loop_judgments_iteration_idx
224
+ ON public.agent_loop_judgments (agent_loop_iteration_id);
225
+ CREATE INDEX IF NOT EXISTS agent_loop_judgments_tenant_outcome_idx
226
+ ON public.agent_loop_judgments (tenant_id, outcome);
227
+
228
+ CREATE TABLE IF NOT EXISTS public.agent_loop_evidence (
229
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
230
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
231
+ agent_loop_id uuid NOT NULL REFERENCES public.agent_loops(id) ON DELETE CASCADE,
232
+ agent_loop_run_id uuid REFERENCES public.agent_loop_runs(id) ON DELETE CASCADE,
233
+ agent_loop_iteration_id uuid REFERENCES public.agent_loop_iterations(id) ON DELETE SET NULL,
234
+ agent_loop_judgment_id bigint REFERENCES public.agent_loop_judgments(id) ON DELETE SET NULL,
235
+ evidence_type text NOT NULL,
236
+ source_system text NOT NULL,
237
+ source_id text,
238
+ uri text,
239
+ summary jsonb NOT NULL DEFAULT '{}'::jsonb,
240
+ redaction_state text NOT NULL DEFAULT 'summary_only',
241
+ sensitivity text,
242
+ retention_expires_at timestamp with time zone,
243
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
244
+ CONSTRAINT agent_loop_evidence_redaction_state_check CHECK (redaction_state IN ('summary_only', 'redacted', 'offloaded', 'raw_allowed'))
245
+ );
246
+
247
+ CREATE INDEX IF NOT EXISTS agent_loop_evidence_run_idx
248
+ ON public.agent_loop_evidence (agent_loop_run_id);
249
+ CREATE INDEX IF NOT EXISTS agent_loop_evidence_loop_idx
250
+ ON public.agent_loop_evidence (agent_loop_id);
251
+ CREATE INDEX IF NOT EXISTS agent_loop_evidence_iteration_idx
252
+ ON public.agent_loop_evidence (agent_loop_iteration_id);
253
+ CREATE INDEX IF NOT EXISTS agent_loop_evidence_source_idx
254
+ ON public.agent_loop_evidence (tenant_id, source_system, source_id);
255
+
256
+ ALTER TABLE public.scheduled_jobs
257
+ ADD COLUMN IF NOT EXISTS agent_loop_id uuid;
258
+
259
+ CREATE INDEX IF NOT EXISTS idx_scheduled_jobs_agent_loop
260
+ ON public.scheduled_jobs (agent_loop_id);
@@ -0,0 +1,52 @@
1
+ -- Purpose: widen brain.artifact_manifests so OKF bundle versions and current
2
+ -- manifest pointers can be recorded as generated projection evidence.
3
+ -- Plan: docs/plans/2026-06-22-002-feat-okf-wiki-navigator-plan.md U1
4
+ -- Apply manually (no CI migration runner):
5
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0183_okf_artifact_manifests.sql
6
+ -- Pre-flight:
7
+ -- SELECT to_regclass('brain.artifact_manifests');
8
+ -- creates-constraint: brain.artifact_manifests.brain_artifact_manifests_kind_allowed
9
+ -- creates-constraint: brain.artifact_manifests.brain_artifact_manifests_source_kind_allowed
10
+
11
+ \set ON_ERROR_STOP on
12
+
13
+ SET lock_timeout = '5s';
14
+ SET statement_timeout = '15min';
15
+
16
+ DO $$
17
+ BEGIN
18
+ IF to_regclass('brain.artifact_manifests') IS NULL THEN
19
+ RAISE EXCEPTION 'brain.artifact_manifests not found; apply Company Brain artifact manifest migrations first';
20
+ END IF;
21
+ END $$;
22
+
23
+ SELECT pg_advisory_lock(hashtext('migration:0183_okf_artifact_manifests'));
24
+
25
+ ALTER TABLE brain.artifact_manifests
26
+ DROP CONSTRAINT IF EXISTS brain_artifact_manifests_kind_allowed;
27
+
28
+ ALTER TABLE brain.artifact_manifests
29
+ ADD CONSTRAINT brain_artifact_manifests_kind_allowed
30
+ CHECK (
31
+ manifest_kind IN (
32
+ 'source_artifact',
33
+ 'ingestion_manifest',
34
+ 'migration_snapshot',
35
+ 'vault_projection',
36
+ 'export',
37
+ 'okf_bundle',
38
+ 'okf_current_manifest'
39
+ )
40
+ );
41
+
42
+ ALTER TABLE brain.artifact_manifests
43
+ DROP CONSTRAINT IF EXISTS brain_artifact_manifests_source_kind_allowed;
44
+
45
+ ALTER TABLE brain.artifact_manifests
46
+ ADD CONSTRAINT brain_artifact_manifests_source_kind_allowed
47
+ CHECK (
48
+ source_kind IS NULL
49
+ OR source_kind IN ('thread', 'wiki', 'brain', 'observations', 'okf')
50
+ );
51
+
52
+ SELECT pg_advisory_unlock(hashtext('migration:0183_okf_artifact_manifests'));
@@ -0,0 +1,35 @@
1
+ -- Purpose: cache the latest skill trust report on the per-tenant S3 catalog
2
+ -- index so the Skill Detail trust sheet can render the last report without
3
+ -- rerunning SkillSpector on every open.
4
+ -- Apply manually:
5
+ -- psql "$DATABASE_URL" -f packages/database-pg/drizzle/0184_skill_catalog_trust_cache.sql
6
+ -- Pre-flight:
7
+ -- SELECT to_regclass('public.skill_catalog');
8
+ -- creates-column: public.skill_catalog.trust_report
9
+ -- creates-column: public.skill_catalog.trust_report_content_sha
10
+ -- creates-column: public.skill_catalog.trust_report_pipeline_version
11
+ -- creates-column: public.skill_catalog.trust_report_updated_at
12
+ -- creates-column: public.skill_catalog.signature_status
13
+ -- creates-column: public.skill_catalog.signature_payload
14
+ -- creates-column: public.skill_catalog.signed_content_sha
15
+ -- creates-column: public.skill_catalog.signed_payload_hash
16
+ -- creates-column: public.skill_catalog.signed_at
17
+ -- creates-column: public.skill_catalog.signed_by_user_id
18
+
19
+ BEGIN;
20
+
21
+ SELECT pg_advisory_xact_lock(hashtext('migration:0184_skill_catalog_trust_cache'));
22
+
23
+ ALTER TABLE public.skill_catalog
24
+ ADD COLUMN IF NOT EXISTS trust_report jsonb,
25
+ ADD COLUMN IF NOT EXISTS trust_report_content_sha text,
26
+ ADD COLUMN IF NOT EXISTS trust_report_pipeline_version text,
27
+ ADD COLUMN IF NOT EXISTS trust_report_updated_at timestamptz,
28
+ ADD COLUMN IF NOT EXISTS signature_status text,
29
+ ADD COLUMN IF NOT EXISTS signature_payload jsonb,
30
+ ADD COLUMN IF NOT EXISTS signed_content_sha text,
31
+ ADD COLUMN IF NOT EXISTS signed_payload_hash text,
32
+ ADD COLUMN IF NOT EXISTS signed_at timestamptz,
33
+ ADD COLUMN IF NOT EXISTS signed_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL;
34
+
35
+ COMMIT;
@@ -0,0 +1,16 @@
1
+ -- 0185_agent_loop_space.sql
2
+ --
3
+ -- Adds the explicit Space an Automation/AgentLoop should run in. Existing
4
+ -- loops keep falling back to the default Agent space until configured.
5
+ --
6
+ -- Manual application:
7
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0185_agent_loop_space.sql
8
+ --
9
+ -- creates-column: public.agent_loops.space_id
10
+ -- creates: public.agent_loops_tenant_space_idx
11
+
12
+ ALTER TABLE public.agent_loops
13
+ ADD COLUMN IF NOT EXISTS space_id uuid REFERENCES public.spaces(id) ON DELETE SET NULL;
14
+
15
+ CREATE INDEX IF NOT EXISTS agent_loops_tenant_space_idx
16
+ ON public.agent_loops (tenant_id, space_id);
@@ -0,0 +1,10 @@
1
+ -- Purpose: Store non-secret runtime metadata for MCP dispatch without mixing
2
+ -- plugin-provided link hints into auth_config or approval hashes.
3
+ --
4
+ -- creates-column: public.tenant_mcp_servers.runtime_metadata
5
+
6
+ ALTER TABLE public.tenant_mcp_servers
7
+ ADD COLUMN IF NOT EXISTS runtime_metadata jsonb;
8
+
9
+ COMMENT ON COLUMN public.tenant_mcp_servers.runtime_metadata IS
10
+ 'Non-secret runtime metadata for MCP dispatch, such as plugin record-link hints.';
@@ -0,0 +1,220 @@
1
+ -- 0187_native_work_items.sql
2
+ --
3
+ -- Purpose: create the native Work Item substrate for ThinkWork-owned task state.
4
+ -- Plan: THNK-69 Native work item tracking capability.
5
+ -- Apply manually:
6
+ -- psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0187_native_work_items.sql
7
+ --
8
+ -- creates: public.work_item_statuses
9
+ -- creates: public.work_items
10
+ -- creates: public.work_item_thread_links
11
+ -- creates: public.work_item_events
12
+ -- creates: public.work_item_saved_views
13
+ -- creates: public.work_item_external_refs
14
+ -- creates: public.uq_work_item_statuses_space_name
15
+ -- creates: public.uq_work_item_statuses_space_default
16
+ -- creates: public.idx_work_item_statuses_space_order
17
+ -- creates: public.idx_work_items_space_status
18
+ -- creates: public.idx_work_items_space_due
19
+ -- creates: public.idx_work_items_owner_user
20
+ -- creates: public.idx_work_items_owner_agent
21
+ -- creates: public.idx_work_items_template_source
22
+ -- creates: public.uq_work_item_thread_links_pair
23
+ -- creates: public.idx_work_item_thread_links_thread
24
+ -- creates: public.idx_work_item_thread_links_space
25
+ -- creates: public.idx_work_item_events_item_created
26
+ -- creates: public.idx_work_item_events_thread
27
+ -- creates: public.uq_work_item_saved_views_user_name
28
+ -- creates: public.uq_work_item_saved_views_user_default
29
+ -- creates: public.idx_work_item_saved_views_user
30
+ -- creates: public.idx_work_item_saved_views_space
31
+ -- creates: public.uq_work_item_external_refs_provider
32
+ -- creates: public.idx_work_item_external_refs_item
33
+ -- creates-constraint: public.work_item_statuses.work_item_statuses_category_allowed
34
+ -- creates-constraint: public.work_items.work_items_priority_allowed
35
+ -- creates-constraint: public.work_item_thread_links.work_item_thread_links_relationship_allowed
36
+ -- creates-constraint: public.work_item_events.work_item_events_type_allowed
37
+ -- creates-constraint: public.work_item_saved_views.work_item_saved_views_type_allowed
38
+ -- creates-constraint: public.work_item_saved_views.work_item_saved_views_owner_required
39
+ -- creates-constraint: public.work_item_external_refs.work_item_external_refs_provider_allowed
40
+
41
+ \set ON_ERROR_STOP on
42
+
43
+ BEGIN;
44
+
45
+ SET LOCAL lock_timeout = '5s';
46
+ SET LOCAL statement_timeout = '120s';
47
+
48
+ CREATE TABLE IF NOT EXISTS public.work_item_statuses (
49
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
50
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
51
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
52
+ name text NOT NULL,
53
+ description text,
54
+ color text,
55
+ icon text,
56
+ category text NOT NULL DEFAULT 'todo',
57
+ is_active boolean NOT NULL DEFAULT true,
58
+ is_final boolean NOT NULL DEFAULT false,
59
+ is_default boolean NOT NULL DEFAULT false,
60
+ display_order integer NOT NULL DEFAULT 0,
61
+ created_at timestamptz NOT NULL DEFAULT now(),
62
+ updated_at timestamptz NOT NULL DEFAULT now(),
63
+ CONSTRAINT work_item_statuses_category_allowed
64
+ CHECK (category IN ('todo', 'active', 'blocked', 'done', 'skipped'))
65
+ );
66
+
67
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_statuses_space_name
68
+ ON public.work_item_statuses (tenant_id, space_id, name);
69
+
70
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_statuses_space_default
71
+ ON public.work_item_statuses (tenant_id, space_id)
72
+ WHERE is_default = true;
73
+
74
+ CREATE INDEX IF NOT EXISTS idx_work_item_statuses_space_order
75
+ ON public.work_item_statuses (tenant_id, space_id, display_order);
76
+
77
+ CREATE TABLE IF NOT EXISTS public.work_items (
78
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
79
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
80
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
81
+ status_id uuid REFERENCES public.work_item_statuses(id) ON DELETE RESTRICT,
82
+ title text NOT NULL,
83
+ notes text,
84
+ priority text NOT NULL DEFAULT 'normal',
85
+ owner_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
86
+ owner_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
87
+ due_at timestamptz,
88
+ required boolean NOT NULL DEFAULT true,
89
+ applicable boolean NOT NULL DEFAULT true,
90
+ blocked boolean NOT NULL DEFAULT false,
91
+ completed_at timestamptz,
92
+ completed_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
93
+ completed_by_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
94
+ created_by_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
95
+ created_by_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
96
+ template_source_id uuid REFERENCES public.space_checklist_items(id) ON DELETE SET NULL,
97
+ metadata jsonb,
98
+ created_at timestamptz NOT NULL DEFAULT now(),
99
+ updated_at timestamptz NOT NULL DEFAULT now(),
100
+ archived_at timestamptz,
101
+ CONSTRAINT work_items_priority_allowed
102
+ CHECK (priority IN ('low', 'normal', 'high', 'urgent'))
103
+ );
104
+
105
+ CREATE INDEX IF NOT EXISTS idx_work_items_space_status
106
+ ON public.work_items (tenant_id, space_id, status_id);
107
+
108
+ CREATE INDEX IF NOT EXISTS idx_work_items_space_due
109
+ ON public.work_items (tenant_id, space_id, due_at);
110
+
111
+ CREATE INDEX IF NOT EXISTS idx_work_items_owner_user
112
+ ON public.work_items (tenant_id, owner_user_id, archived_at);
113
+
114
+ CREATE INDEX IF NOT EXISTS idx_work_items_owner_agent
115
+ ON public.work_items (tenant_id, owner_agent_id, archived_at);
116
+
117
+ CREATE INDEX IF NOT EXISTS idx_work_items_template_source
118
+ ON public.work_items (tenant_id, template_source_id);
119
+
120
+ CREATE TABLE IF NOT EXISTS public.work_item_thread_links (
121
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
122
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
123
+ work_item_id uuid NOT NULL REFERENCES public.work_items(id) ON DELETE CASCADE,
124
+ thread_id uuid NOT NULL REFERENCES public.threads(id) ON DELETE CASCADE,
125
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
126
+ relationship text NOT NULL DEFAULT 'primary',
127
+ created_at timestamptz NOT NULL DEFAULT now(),
128
+ CONSTRAINT work_item_thread_links_relationship_allowed
129
+ CHECK (relationship IN ('primary', 'mentioned', 'evidence', 'follow_up'))
130
+ );
131
+
132
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_thread_links_pair
133
+ ON public.work_item_thread_links (tenant_id, work_item_id, thread_id);
134
+
135
+ CREATE INDEX IF NOT EXISTS idx_work_item_thread_links_thread
136
+ ON public.work_item_thread_links (tenant_id, thread_id);
137
+
138
+ CREATE INDEX IF NOT EXISTS idx_work_item_thread_links_space
139
+ ON public.work_item_thread_links (tenant_id, space_id);
140
+
141
+ CREATE TABLE IF NOT EXISTS public.work_item_events (
142
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
143
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
144
+ space_id uuid NOT NULL REFERENCES public.spaces(id) ON DELETE CASCADE,
145
+ work_item_id uuid NOT NULL REFERENCES public.work_items(id) ON DELETE CASCADE,
146
+ thread_id uuid REFERENCES public.threads(id) ON DELETE SET NULL,
147
+ actor_user_id uuid REFERENCES public.users(id) ON DELETE SET NULL,
148
+ actor_agent_id uuid REFERENCES public.agents(id) ON DELETE SET NULL,
149
+ event_type text NOT NULL,
150
+ previous_status_id uuid REFERENCES public.work_item_statuses(id) ON DELETE SET NULL,
151
+ new_status_id uuid REFERENCES public.work_item_statuses(id) ON DELETE SET NULL,
152
+ message text,
153
+ metadata jsonb,
154
+ created_at timestamptz NOT NULL DEFAULT now(),
155
+ CONSTRAINT work_item_events_type_allowed
156
+ CHECK (event_type IN ('created', 'updated', 'status_changed', 'completed', 'blocked', 'unblocked', 'assigned', 'due_date_changed', 'applicability_changed', 'linked_thread', 'agent_action'))
157
+ );
158
+
159
+ CREATE INDEX IF NOT EXISTS idx_work_item_events_item_created
160
+ ON public.work_item_events (tenant_id, work_item_id, created_at);
161
+
162
+ CREATE INDEX IF NOT EXISTS idx_work_item_events_thread
163
+ ON public.work_item_events (tenant_id, thread_id);
164
+
165
+ CREATE TABLE IF NOT EXISTS public.work_item_saved_views (
166
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
167
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
168
+ user_id uuid REFERENCES public.users(id) ON DELETE CASCADE,
169
+ space_id uuid REFERENCES public.spaces(id) ON DELETE CASCADE,
170
+ name text NOT NULL,
171
+ view_type text NOT NULL DEFAULT 'list',
172
+ filters jsonb,
173
+ grouping jsonb,
174
+ sorting jsonb,
175
+ view_config jsonb,
176
+ is_private boolean NOT NULL DEFAULT true,
177
+ is_default boolean NOT NULL DEFAULT false,
178
+ is_favorite boolean NOT NULL DEFAULT false,
179
+ created_at timestamptz NOT NULL DEFAULT now(),
180
+ updated_at timestamptz NOT NULL DEFAULT now(),
181
+ CONSTRAINT work_item_saved_views_type_allowed
182
+ CHECK (view_type IN ('list', 'board')),
183
+ CONSTRAINT work_item_saved_views_owner_required
184
+ CHECK (user_id IS NOT NULL OR is_private = false)
185
+ );
186
+
187
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_saved_views_user_name
188
+ ON public.work_item_saved_views (tenant_id, user_id, name);
189
+
190
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_saved_views_user_default
191
+ ON public.work_item_saved_views (tenant_id, user_id)
192
+ WHERE is_default = true;
193
+
194
+ CREATE INDEX IF NOT EXISTS idx_work_item_saved_views_user
195
+ ON public.work_item_saved_views (tenant_id, user_id, is_favorite);
196
+
197
+ CREATE INDEX IF NOT EXISTS idx_work_item_saved_views_space
198
+ ON public.work_item_saved_views (tenant_id, space_id);
199
+
200
+ CREATE TABLE IF NOT EXISTS public.work_item_external_refs (
201
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
202
+ tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
203
+ work_item_id uuid NOT NULL REFERENCES public.work_items(id) ON DELETE CASCADE,
204
+ provider text NOT NULL,
205
+ external_id text NOT NULL,
206
+ external_url text,
207
+ metadata jsonb,
208
+ created_at timestamptz NOT NULL DEFAULT now(),
209
+ updated_at timestamptz NOT NULL DEFAULT now(),
210
+ CONSTRAINT work_item_external_refs_provider_allowed
211
+ CHECK (provider IN ('thinkwork', 'lastmile', 'linear', 'plane', 'twenty'))
212
+ );
213
+
214
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_work_item_external_refs_provider
215
+ ON public.work_item_external_refs (tenant_id, provider, external_id);
216
+
217
+ CREATE INDEX IF NOT EXISTS idx_work_item_external_refs_item
218
+ ON public.work_item_external_refs (tenant_id, work_item_id);
219
+
220
+ COMMIT;