thinkwork-cli 0.12.11 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22157 -9229
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,587 @@
1
+ -- Purpose: add tenant-scoped business ontology definitions, suggestion change sets, and reprocess job state.
2
+ -- Plan: docs/plans/2026-05-17-002-feat-business-ontology-change-sets-plan.md (U1)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0098_business_ontology.sql
4
+ -- creates: ontology.versions
5
+ -- creates: ontology.entity_types
6
+ -- creates: ontology.relationship_types
7
+ -- creates: ontology.facet_templates
8
+ -- creates: ontology.external_mappings
9
+ -- creates: ontology.change_sets
10
+ -- creates: ontology.change_set_items
11
+ -- creates: ontology.evidence_examples
12
+ -- creates: ontology.suggestion_scan_jobs
13
+ -- creates: ontology.reprocess_jobs
14
+ -- creates: ontology.uq_ontology_versions_tenant_version
15
+ -- creates: ontology.uq_ontology_versions_tenant_active
16
+ -- creates: ontology.uq_ontology_entity_types_tenant_slug
17
+ -- creates: ontology.uq_ontology_relationship_types_tenant_slug
18
+ -- creates: ontology.uq_ontology_facet_templates_entity_slug
19
+ -- creates: ontology.uq_ontology_external_mappings_subject_uri
20
+ -- creates: ontology.uq_ontology_suggestion_scan_jobs_dedupe
21
+ -- creates: ontology.uq_ontology_reprocess_jobs_dedupe
22
+ -- creates-constraint: ontology.versions.ontology_versions_tenant_id_tenants_id_fk
23
+ -- creates-constraint: ontology.versions.ontology_versions_status_allowed
24
+ -- creates-constraint: ontology.entity_types.ontology_entity_types_lifecycle_allowed
25
+ -- creates-constraint: ontology.relationship_types.ontology_relationship_types_lifecycle_allowed
26
+ -- creates-constraint: ontology.external_mappings.ontology_external_mappings_kind_allowed
27
+ -- creates-constraint: ontology.change_sets.ontology_change_sets_status_allowed
28
+ -- creates-constraint: ontology.suggestion_scan_jobs.ontology_suggestion_scan_jobs_status_allowed
29
+ -- creates-constraint: ontology.reprocess_jobs.ontology_reprocess_jobs_status_allowed
30
+
31
+ \set ON_ERROR_STOP on
32
+
33
+ BEGIN;
34
+
35
+ SET LOCAL lock_timeout = '5s';
36
+ SET LOCAL statement_timeout = '120s';
37
+
38
+ CREATE SCHEMA IF NOT EXISTS ontology;
39
+
40
+ CREATE TABLE IF NOT EXISTS ontology.versions (
41
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
42
+ tenant_id uuid NOT NULL,
43
+ version_number integer NOT NULL,
44
+ status text NOT NULL DEFAULT 'active',
45
+ source_change_set_id uuid,
46
+ activated_at timestamptz,
47
+ created_at timestamptz NOT NULL DEFAULT now(),
48
+ CONSTRAINT ontology_versions_tenant_id_tenants_id_fk
49
+ FOREIGN KEY (tenant_id)
50
+ REFERENCES public.tenants(id)
51
+ ON DELETE CASCADE,
52
+ CONSTRAINT ontology_versions_status_allowed
53
+ CHECK (status IN ('active', 'superseded'))
54
+ );
55
+
56
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_versions_tenant_version
57
+ ON ontology.versions (tenant_id, version_number);
58
+
59
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_versions_tenant_active
60
+ ON ontology.versions (tenant_id)
61
+ WHERE status = 'active';
62
+
63
+ CREATE INDEX IF NOT EXISTS idx_ontology_versions_tenant_created
64
+ ON ontology.versions (tenant_id, created_at);
65
+
66
+ CREATE TABLE IF NOT EXISTS ontology.entity_types (
67
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
68
+ tenant_id uuid NOT NULL,
69
+ version_id uuid,
70
+ slug text NOT NULL,
71
+ name text NOT NULL,
72
+ description text,
73
+ broad_type text NOT NULL DEFAULT 'entity',
74
+ aliases text[] NOT NULL DEFAULT ARRAY[]::text[],
75
+ properties_schema jsonb NOT NULL DEFAULT '{}'::jsonb,
76
+ guidance_notes text,
77
+ lifecycle_status text NOT NULL DEFAULT 'proposed',
78
+ proposed_by_user_id uuid,
79
+ approved_by_user_id uuid,
80
+ approved_at timestamptz,
81
+ deprecated_at timestamptz,
82
+ rejected_at timestamptz,
83
+ created_at timestamptz NOT NULL DEFAULT now(),
84
+ updated_at timestamptz NOT NULL DEFAULT now(),
85
+ CONSTRAINT ontology_entity_types_tenant_id_tenants_id_fk
86
+ FOREIGN KEY (tenant_id)
87
+ REFERENCES public.tenants(id)
88
+ ON DELETE CASCADE,
89
+ CONSTRAINT ontology_entity_types_version_id_versions_id_fk
90
+ FOREIGN KEY (version_id)
91
+ REFERENCES ontology.versions(id)
92
+ ON DELETE SET NULL,
93
+ CONSTRAINT ontology_entity_types_proposed_by_user_id_users_id_fk
94
+ FOREIGN KEY (proposed_by_user_id)
95
+ REFERENCES public.users(id)
96
+ ON DELETE SET NULL,
97
+ CONSTRAINT ontology_entity_types_approved_by_user_id_users_id_fk
98
+ FOREIGN KEY (approved_by_user_id)
99
+ REFERENCES public.users(id)
100
+ ON DELETE SET NULL,
101
+ CONSTRAINT ontology_entity_types_lifecycle_allowed
102
+ CHECK (lifecycle_status IN ('proposed', 'approved', 'deprecated', 'rejected'))
103
+ );
104
+
105
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_entity_types_tenant_slug
106
+ ON ontology.entity_types (tenant_id, slug);
107
+
108
+ CREATE INDEX IF NOT EXISTS idx_ontology_entity_types_tenant_status
109
+ ON ontology.entity_types (tenant_id, lifecycle_status);
110
+
111
+ CREATE INDEX IF NOT EXISTS idx_ontology_entity_types_broad_type
112
+ ON ontology.entity_types (broad_type);
113
+
114
+ CREATE TABLE IF NOT EXISTS ontology.relationship_types (
115
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
116
+ tenant_id uuid NOT NULL,
117
+ version_id uuid,
118
+ slug text NOT NULL,
119
+ name text NOT NULL,
120
+ description text,
121
+ inverse_name text,
122
+ source_entity_type_id uuid,
123
+ target_entity_type_id uuid,
124
+ source_type_slugs text[] NOT NULL DEFAULT ARRAY[]::text[],
125
+ target_type_slugs text[] NOT NULL DEFAULT ARRAY[]::text[],
126
+ aliases text[] NOT NULL DEFAULT ARRAY[]::text[],
127
+ guidance_notes text,
128
+ lifecycle_status text NOT NULL DEFAULT 'proposed',
129
+ proposed_by_user_id uuid,
130
+ approved_by_user_id uuid,
131
+ approved_at timestamptz,
132
+ deprecated_at timestamptz,
133
+ rejected_at timestamptz,
134
+ created_at timestamptz NOT NULL DEFAULT now(),
135
+ updated_at timestamptz NOT NULL DEFAULT now(),
136
+ CONSTRAINT ontology_relationship_types_tenant_id_tenants_id_fk
137
+ FOREIGN KEY (tenant_id)
138
+ REFERENCES public.tenants(id)
139
+ ON DELETE CASCADE,
140
+ CONSTRAINT ontology_relationship_types_version_id_versions_id_fk
141
+ FOREIGN KEY (version_id)
142
+ REFERENCES ontology.versions(id)
143
+ ON DELETE SET NULL,
144
+ CONSTRAINT ontology_relationship_types_source_entity_type_id_fk
145
+ FOREIGN KEY (source_entity_type_id)
146
+ REFERENCES ontology.entity_types(id)
147
+ ON DELETE SET NULL,
148
+ CONSTRAINT ontology_relationship_types_target_entity_type_id_fk
149
+ FOREIGN KEY (target_entity_type_id)
150
+ REFERENCES ontology.entity_types(id)
151
+ ON DELETE SET NULL,
152
+ CONSTRAINT ontology_relationship_types_proposed_by_user_id_users_id_fk
153
+ FOREIGN KEY (proposed_by_user_id)
154
+ REFERENCES public.users(id)
155
+ ON DELETE SET NULL,
156
+ CONSTRAINT ontology_relationship_types_approved_by_user_id_users_id_fk
157
+ FOREIGN KEY (approved_by_user_id)
158
+ REFERENCES public.users(id)
159
+ ON DELETE SET NULL,
160
+ CONSTRAINT ontology_relationship_types_lifecycle_allowed
161
+ CHECK (lifecycle_status IN ('proposed', 'approved', 'deprecated', 'rejected'))
162
+ );
163
+
164
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_relationship_types_tenant_slug
165
+ ON ontology.relationship_types (tenant_id, slug);
166
+
167
+ CREATE INDEX IF NOT EXISTS idx_ontology_relationship_types_tenant_status
168
+ ON ontology.relationship_types (tenant_id, lifecycle_status);
169
+
170
+ CREATE INDEX IF NOT EXISTS idx_ontology_relationship_types_source
171
+ ON ontology.relationship_types (source_entity_type_id);
172
+
173
+ CREATE INDEX IF NOT EXISTS idx_ontology_relationship_types_target
174
+ ON ontology.relationship_types (target_entity_type_id);
175
+
176
+ CREATE TABLE IF NOT EXISTS ontology.facet_templates (
177
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
178
+ tenant_id uuid NOT NULL,
179
+ entity_type_id uuid NOT NULL,
180
+ slug text NOT NULL,
181
+ heading text NOT NULL,
182
+ facet_type text NOT NULL DEFAULT 'compiled',
183
+ position integer NOT NULL DEFAULT 0,
184
+ source_priority jsonb NOT NULL DEFAULT '[]'::jsonb,
185
+ prompt text,
186
+ guidance_notes text,
187
+ lifecycle_status text NOT NULL DEFAULT 'approved',
188
+ created_at timestamptz NOT NULL DEFAULT now(),
189
+ updated_at timestamptz NOT NULL DEFAULT now(),
190
+ CONSTRAINT ontology_facet_templates_tenant_id_tenants_id_fk
191
+ FOREIGN KEY (tenant_id)
192
+ REFERENCES public.tenants(id)
193
+ ON DELETE CASCADE,
194
+ CONSTRAINT ontology_facet_templates_entity_type_id_entity_types_id_fk
195
+ FOREIGN KEY (entity_type_id)
196
+ REFERENCES ontology.entity_types(id)
197
+ ON DELETE CASCADE,
198
+ CONSTRAINT ontology_facet_templates_lifecycle_allowed
199
+ CHECK (lifecycle_status IN ('proposed', 'approved', 'deprecated', 'rejected'))
200
+ );
201
+
202
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_facet_templates_entity_slug
203
+ ON ontology.facet_templates (entity_type_id, slug);
204
+
205
+ CREATE INDEX IF NOT EXISTS idx_ontology_facet_templates_tenant
206
+ ON ontology.facet_templates (tenant_id);
207
+
208
+ CREATE TABLE IF NOT EXISTS ontology.external_mappings (
209
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
210
+ tenant_id uuid NOT NULL,
211
+ subject_kind text NOT NULL,
212
+ subject_id uuid NOT NULL,
213
+ mapping_kind text NOT NULL,
214
+ vocabulary text NOT NULL,
215
+ external_uri text NOT NULL,
216
+ external_label text,
217
+ notes text,
218
+ created_at timestamptz NOT NULL DEFAULT now(),
219
+ updated_at timestamptz NOT NULL DEFAULT now(),
220
+ CONSTRAINT ontology_external_mappings_tenant_id_tenants_id_fk
221
+ FOREIGN KEY (tenant_id)
222
+ REFERENCES public.tenants(id)
223
+ ON DELETE CASCADE,
224
+ CONSTRAINT ontology_external_mappings_subject_allowed
225
+ CHECK (subject_kind IN ('entity_type', 'relationship_type', 'facet_template')),
226
+ CONSTRAINT ontology_external_mappings_kind_allowed
227
+ CHECK (mapping_kind IN ('exact', 'close', 'broad', 'narrow', 'related'))
228
+ );
229
+
230
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_external_mappings_subject_uri
231
+ ON ontology.external_mappings (subject_kind, subject_id, vocabulary, external_uri);
232
+
233
+ CREATE INDEX IF NOT EXISTS idx_ontology_external_mappings_tenant_kind
234
+ ON ontology.external_mappings (tenant_id, subject_kind);
235
+
236
+ CREATE TABLE IF NOT EXISTS ontology.change_sets (
237
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
238
+ tenant_id uuid NOT NULL,
239
+ title text NOT NULL,
240
+ summary text,
241
+ status text NOT NULL DEFAULT 'draft',
242
+ confidence numeric(5, 4),
243
+ observed_frequency integer NOT NULL DEFAULT 0,
244
+ expected_impact jsonb NOT NULL DEFAULT '{}'::jsonb,
245
+ proposed_by text NOT NULL DEFAULT 'suggestion_engine',
246
+ proposed_by_user_id uuid,
247
+ approved_by_user_id uuid,
248
+ approved_at timestamptz,
249
+ rejected_by_user_id uuid,
250
+ rejected_at timestamptz,
251
+ applied_version_id uuid,
252
+ created_at timestamptz NOT NULL DEFAULT now(),
253
+ updated_at timestamptz NOT NULL DEFAULT now(),
254
+ CONSTRAINT ontology_change_sets_tenant_id_tenants_id_fk
255
+ FOREIGN KEY (tenant_id)
256
+ REFERENCES public.tenants(id)
257
+ ON DELETE CASCADE,
258
+ CONSTRAINT ontology_change_sets_proposed_by_user_id_users_id_fk
259
+ FOREIGN KEY (proposed_by_user_id)
260
+ REFERENCES public.users(id)
261
+ ON DELETE SET NULL,
262
+ CONSTRAINT ontology_change_sets_approved_by_user_id_users_id_fk
263
+ FOREIGN KEY (approved_by_user_id)
264
+ REFERENCES public.users(id)
265
+ ON DELETE SET NULL,
266
+ CONSTRAINT ontology_change_sets_rejected_by_user_id_users_id_fk
267
+ FOREIGN KEY (rejected_by_user_id)
268
+ REFERENCES public.users(id)
269
+ ON DELETE SET NULL,
270
+ CONSTRAINT ontology_change_sets_applied_version_id_versions_id_fk
271
+ FOREIGN KEY (applied_version_id)
272
+ REFERENCES ontology.versions(id)
273
+ ON DELETE SET NULL,
274
+ CONSTRAINT ontology_change_sets_status_allowed
275
+ CHECK (status IN ('draft', 'pending_review', 'approved', 'rejected', 'applied'))
276
+ );
277
+
278
+ CREATE INDEX IF NOT EXISTS idx_ontology_change_sets_tenant_status
279
+ ON ontology.change_sets (tenant_id, status);
280
+
281
+ CREATE INDEX IF NOT EXISTS idx_ontology_change_sets_applied_version
282
+ ON ontology.change_sets (applied_version_id);
283
+
284
+ CREATE TABLE IF NOT EXISTS ontology.change_set_items (
285
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
286
+ tenant_id uuid NOT NULL,
287
+ change_set_id uuid NOT NULL,
288
+ item_type text NOT NULL,
289
+ action text NOT NULL,
290
+ status text NOT NULL DEFAULT 'pending_review',
291
+ target_kind text,
292
+ target_slug text,
293
+ title text NOT NULL,
294
+ description text,
295
+ proposed_value jsonb NOT NULL DEFAULT '{}'::jsonb,
296
+ edited_value jsonb,
297
+ confidence numeric(5, 4),
298
+ position integer NOT NULL DEFAULT 0,
299
+ created_at timestamptz NOT NULL DEFAULT now(),
300
+ updated_at timestamptz NOT NULL DEFAULT now(),
301
+ CONSTRAINT ontology_change_set_items_tenant_id_tenants_id_fk
302
+ FOREIGN KEY (tenant_id)
303
+ REFERENCES public.tenants(id)
304
+ ON DELETE CASCADE,
305
+ CONSTRAINT ontology_change_set_items_change_set_id_change_sets_id_fk
306
+ FOREIGN KEY (change_set_id)
307
+ REFERENCES ontology.change_sets(id)
308
+ ON DELETE CASCADE,
309
+ CONSTRAINT ontology_change_set_items_type_allowed
310
+ CHECK (item_type IN ('entity_type', 'relationship_type', 'facet_template', 'external_mapping')),
311
+ CONSTRAINT ontology_change_set_items_action_allowed
312
+ CHECK (action IN ('create', 'update', 'deprecate', 'reject')),
313
+ CONSTRAINT ontology_change_set_items_status_allowed
314
+ CHECK (status IN ('pending_review', 'approved', 'rejected', 'applied'))
315
+ );
316
+
317
+ CREATE INDEX IF NOT EXISTS idx_ontology_change_set_items_change_set
318
+ ON ontology.change_set_items (change_set_id);
319
+
320
+ CREATE INDEX IF NOT EXISTS idx_ontology_change_set_items_tenant_status
321
+ ON ontology.change_set_items (tenant_id, status);
322
+
323
+ CREATE TABLE IF NOT EXISTS ontology.evidence_examples (
324
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
325
+ tenant_id uuid NOT NULL,
326
+ change_set_id uuid NOT NULL,
327
+ item_id uuid,
328
+ source_kind text NOT NULL,
329
+ source_ref text,
330
+ source_label text,
331
+ quote text NOT NULL,
332
+ metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
333
+ observed_at timestamptz,
334
+ created_at timestamptz NOT NULL DEFAULT now(),
335
+ CONSTRAINT ontology_evidence_examples_tenant_id_tenants_id_fk
336
+ FOREIGN KEY (tenant_id)
337
+ REFERENCES public.tenants(id)
338
+ ON DELETE CASCADE,
339
+ CONSTRAINT ontology_evidence_examples_change_set_id_change_sets_id_fk
340
+ FOREIGN KEY (change_set_id)
341
+ REFERENCES ontology.change_sets(id)
342
+ ON DELETE CASCADE,
343
+ CONSTRAINT ontology_evidence_examples_item_id_change_set_items_id_fk
344
+ FOREIGN KEY (item_id)
345
+ REFERENCES ontology.change_set_items(id)
346
+ ON DELETE SET NULL
347
+ );
348
+
349
+ CREATE INDEX IF NOT EXISTS idx_ontology_evidence_change_set
350
+ ON ontology.evidence_examples (change_set_id);
351
+
352
+ CREATE INDEX IF NOT EXISTS idx_ontology_evidence_item
353
+ ON ontology.evidence_examples (item_id);
354
+
355
+ CREATE INDEX IF NOT EXISTS idx_ontology_evidence_tenant_source
356
+ ON ontology.evidence_examples (tenant_id, source_kind);
357
+
358
+ CREATE TABLE IF NOT EXISTS ontology.suggestion_scan_jobs (
359
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
360
+ tenant_id uuid NOT NULL,
361
+ status text NOT NULL DEFAULT 'pending',
362
+ trigger text NOT NULL DEFAULT 'manual',
363
+ dedupe_key text,
364
+ started_at timestamptz,
365
+ finished_at timestamptz,
366
+ error text,
367
+ result jsonb NOT NULL DEFAULT '{}'::jsonb,
368
+ metrics jsonb NOT NULL DEFAULT '{}'::jsonb,
369
+ created_at timestamptz NOT NULL DEFAULT now(),
370
+ updated_at timestamptz NOT NULL DEFAULT now(),
371
+ CONSTRAINT ontology_suggestion_scan_jobs_tenant_id_tenants_id_fk
372
+ FOREIGN KEY (tenant_id)
373
+ REFERENCES public.tenants(id)
374
+ ON DELETE CASCADE,
375
+ CONSTRAINT ontology_suggestion_scan_jobs_status_allowed
376
+ CHECK (status IN ('pending', 'running', 'succeeded', 'failed', 'canceled'))
377
+ );
378
+
379
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_suggestion_scan_jobs_dedupe
380
+ ON ontology.suggestion_scan_jobs (tenant_id, dedupe_key)
381
+ WHERE dedupe_key IS NOT NULL;
382
+
383
+ CREATE INDEX IF NOT EXISTS idx_ontology_suggestion_scan_jobs_tenant_status
384
+ ON ontology.suggestion_scan_jobs (tenant_id, status);
385
+
386
+ CREATE TABLE IF NOT EXISTS ontology.reprocess_jobs (
387
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
388
+ tenant_id uuid NOT NULL,
389
+ change_set_id uuid,
390
+ ontology_version_id uuid,
391
+ dedupe_key text,
392
+ status text NOT NULL DEFAULT 'pending',
393
+ attempt integer NOT NULL DEFAULT 0,
394
+ claimed_at timestamptz,
395
+ started_at timestamptz,
396
+ finished_at timestamptz,
397
+ input jsonb NOT NULL DEFAULT '{}'::jsonb,
398
+ impact jsonb NOT NULL DEFAULT '{}'::jsonb,
399
+ metrics jsonb NOT NULL DEFAULT '{}'::jsonb,
400
+ error text,
401
+ created_at timestamptz NOT NULL DEFAULT now(),
402
+ updated_at timestamptz NOT NULL DEFAULT now(),
403
+ CONSTRAINT ontology_reprocess_jobs_tenant_id_tenants_id_fk
404
+ FOREIGN KEY (tenant_id)
405
+ REFERENCES public.tenants(id)
406
+ ON DELETE CASCADE,
407
+ CONSTRAINT ontology_reprocess_jobs_change_set_id_change_sets_id_fk
408
+ FOREIGN KEY (change_set_id)
409
+ REFERENCES ontology.change_sets(id)
410
+ ON DELETE SET NULL,
411
+ CONSTRAINT ontology_reprocess_jobs_ontology_version_id_versions_id_fk
412
+ FOREIGN KEY (ontology_version_id)
413
+ REFERENCES ontology.versions(id)
414
+ ON DELETE SET NULL,
415
+ CONSTRAINT ontology_reprocess_jobs_status_allowed
416
+ CHECK (status IN ('pending', 'running', 'succeeded', 'failed', 'canceled'))
417
+ );
418
+
419
+ CREATE UNIQUE INDEX IF NOT EXISTS uq_ontology_reprocess_jobs_dedupe
420
+ ON ontology.reprocess_jobs (tenant_id, dedupe_key)
421
+ WHERE dedupe_key IS NOT NULL;
422
+
423
+ CREATE INDEX IF NOT EXISTS idx_ontology_reprocess_jobs_tenant_status
424
+ ON ontology.reprocess_jobs (tenant_id, status);
425
+
426
+ CREATE INDEX IF NOT EXISTS idx_ontology_reprocess_jobs_change_set
427
+ ON ontology.reprocess_jobs (change_set_id);
428
+
429
+ INSERT INTO ontology.versions (tenant_id, version_number, status, activated_at)
430
+ SELECT tenants.id, 1, 'active', now()
431
+ FROM public.tenants
432
+ ON CONFLICT (tenant_id, version_number) DO NOTHING;
433
+
434
+ WITH seed(slug, name, broad_type, description, guidance_notes, aliases) AS (
435
+ VALUES
436
+ ('customer', 'Customer', 'organization', 'An account, buyer, prospect, or commercial organization the company serves.', 'Compile customer pages from relationship, opportunity, commitment, risk, support, and recent activity evidence.', ARRAY['account', 'client', 'buyer']::text[]),
437
+ ('person', 'Person', 'person', 'A human stakeholder connected to a customer, partner, vendor, or internal initiative.', 'Use only business-relevant facts and relationship context.', ARRAY['contact', 'stakeholder']::text[]),
438
+ ('opportunity', 'Opportunity', 'commercial_event', 'A potential or active revenue motion with a customer or prospect.', 'Track stage, mutual plan, blockers, next steps, and linked people.', ARRAY['deal', 'pipeline item']::text[]),
439
+ ('order', 'Order', 'commercial_record', 'A committed transaction, purchase order, subscription, or contract record.', 'Prefer source-system facts over conversational inference.', ARRAY['contract', 'purchase']::text[]),
440
+ ('support_case', 'Support Case', 'service_record', 'A customer issue, escalation, defect, or help request.', 'Compile active symptoms, owner, severity, customer impact, and resolution trail.', ARRAY['ticket', 'case', 'escalation']::text[]),
441
+ ('commitment', 'Commitment', 'promise', 'A promise, follow-up, delivery obligation, or action item owed by or to the company.', 'Capture owner, due date, recipient, current status, and source evidence.', ARRAY['promise', 'follow up', 'action item']::text[]),
442
+ ('risk', 'Risk', 'risk', 'A business risk, objection, blocker, competitor threat, or delivery concern.', 'Separate observed evidence from speculative impact.', ARRAY['blocker', 'concern', 'threat']::text[]),
443
+ ('decision', 'Decision', 'decision', 'A durable decision with rationale, tradeoffs, and affected business objects.', 'Prefer the most recent explicit decision evidence and preserve rationale.', ARRAY['choice', 'approval']::text[])
444
+ )
445
+ INSERT INTO ontology.entity_types (
446
+ tenant_id,
447
+ version_id,
448
+ slug,
449
+ name,
450
+ broad_type,
451
+ description,
452
+ guidance_notes,
453
+ aliases,
454
+ lifecycle_status,
455
+ approved_at
456
+ )
457
+ SELECT
458
+ tenants.id,
459
+ versions.id,
460
+ seed.slug,
461
+ seed.name,
462
+ seed.broad_type,
463
+ seed.description,
464
+ seed.guidance_notes,
465
+ seed.aliases,
466
+ 'approved',
467
+ now()
468
+ FROM public.tenants
469
+ JOIN ontology.versions
470
+ ON versions.tenant_id = tenants.id
471
+ AND versions.version_number = 1
472
+ CROSS JOIN seed
473
+ ON CONFLICT (tenant_id, slug) DO NOTHING;
474
+
475
+ WITH seed(slug, name, inverse_name, source_slug, target_slug, description, source_type_slugs, target_type_slugs) AS (
476
+ VALUES
477
+ ('has_stakeholder', 'Has stakeholder', 'Stakeholder of', 'customer', 'person', 'Connects a customer or opportunity to an involved person.', ARRAY['customer', 'opportunity']::text[], ARRAY['person']::text[]),
478
+ ('has_opportunity', 'Has opportunity', 'Opportunity for', 'customer', 'opportunity', 'Connects a customer or prospect to a revenue opportunity.', ARRAY['customer']::text[], ARRAY['opportunity']::text[]),
479
+ ('has_commitment', 'Has commitment', 'Commitment for', 'customer', 'commitment', 'Connects an entity to a promise, follow-up, or obligation.', ARRAY['customer', 'opportunity', 'support_case']::text[], ARRAY['commitment']::text[]),
480
+ ('has_risk', 'Has risk', 'Risk for', 'customer', 'risk', 'Connects an entity to a business risk or blocker.', ARRAY['customer', 'opportunity', 'support_case']::text[], ARRAY['risk']::text[]),
481
+ ('has_support_case', 'Has support case', 'Support case for', 'customer', 'support_case', 'Connects a customer to active or historical support work.', ARRAY['customer']::text[], ARRAY['support_case']::text[])
482
+ )
483
+ INSERT INTO ontology.relationship_types (
484
+ tenant_id,
485
+ version_id,
486
+ slug,
487
+ name,
488
+ inverse_name,
489
+ source_entity_type_id,
490
+ target_entity_type_id,
491
+ source_type_slugs,
492
+ target_type_slugs,
493
+ description,
494
+ lifecycle_status,
495
+ approved_at
496
+ )
497
+ SELECT
498
+ source_type.tenant_id,
499
+ source_type.version_id,
500
+ seed.slug,
501
+ seed.name,
502
+ seed.inverse_name,
503
+ source_type.id,
504
+ target_type.id,
505
+ seed.source_type_slugs,
506
+ seed.target_type_slugs,
507
+ seed.description,
508
+ 'approved',
509
+ now()
510
+ FROM seed
511
+ JOIN ontology.entity_types source_type
512
+ ON source_type.slug = seed.source_slug
513
+ JOIN ontology.entity_types target_type
514
+ ON target_type.tenant_id = source_type.tenant_id
515
+ AND target_type.slug = seed.target_slug
516
+ ON CONFLICT (tenant_id, slug) DO NOTHING;
517
+
518
+ WITH seed(entity_slug, slug, heading, facet_type, position, prompt) AS (
519
+ VALUES
520
+ ('customer', 'overview', 'Overview', 'compiled', 10, 'Summarize the customer, relationship state, and current business context.'),
521
+ ('customer', 'stakeholders', 'Stakeholders', 'relationship', 20, 'List the important people, roles, sentiment, and relationship notes.'),
522
+ ('customer', 'opportunities', 'Opportunities', 'operational', 30, 'Summarize open and recently changed opportunities.'),
523
+ ('customer', 'commitments', 'Commitments', 'operational', 40, 'Track promises, owners, due dates, and fulfillment status.'),
524
+ ('customer', 'risks', 'Risks', 'operational', 50, 'Capture blockers, objections, delivery risks, and escalation signals.'),
525
+ ('opportunity', 'overview', 'Overview', 'compiled', 10, 'Summarize business outcome, stage, buyer context, and next milestone.'),
526
+ ('opportunity', 'mutual_plan', 'Mutual Plan', 'operational', 20, 'Capture milestones, responsibilities, dates, and open dependencies.'),
527
+ ('support_case', 'overview', 'Overview', 'compiled', 10, 'Summarize customer impact, status, owner, and latest update.'),
528
+ ('commitment', 'status', 'Status', 'operational', 10, 'Capture owner, recipient, due date, evidence, and completion state.'),
529
+ ('risk', 'assessment', 'Assessment', 'compiled', 10, 'Separate risk evidence, likelihood, impact, mitigation, and owner.')
530
+ )
531
+ INSERT INTO ontology.facet_templates (
532
+ tenant_id,
533
+ entity_type_id,
534
+ slug,
535
+ heading,
536
+ facet_type,
537
+ position,
538
+ prompt,
539
+ lifecycle_status
540
+ )
541
+ SELECT
542
+ entity_types.tenant_id,
543
+ entity_types.id,
544
+ seed.slug,
545
+ seed.heading,
546
+ seed.facet_type,
547
+ seed.position,
548
+ seed.prompt,
549
+ 'approved'
550
+ FROM seed
551
+ JOIN ontology.entity_types
552
+ ON entity_types.slug = seed.entity_slug
553
+ ON CONFLICT (entity_type_id, slug) DO NOTHING;
554
+
555
+ WITH seed(entity_slug, mapping_kind, vocabulary, external_uri, external_label, notes) AS (
556
+ VALUES
557
+ ('customer', 'broad', 'schema.org', 'https://schema.org/Organization', 'Organization', 'Customer is tenant-specific and can include prospects or accounts, so this mapping stays broad.'),
558
+ ('person', 'close', 'schema.org', 'https://schema.org/Person', 'Person', 'Business person records may omit personal details by policy.'),
559
+ ('opportunity', 'related', 'schema.org', 'https://schema.org/Offer', 'Offer', 'Opportunity is a sales-process object, not a public offer.'),
560
+ ('order', 'close', 'schema.org', 'https://schema.org/Order', 'Order', 'Commercial order records should prefer source-system identifiers.'),
561
+ ('decision', 'related', 'prov-o', 'http://www.w3.org/ns/prov#Activity', 'Activity', 'Decisions are durable outcomes with provenance, not generic activities.')
562
+ )
563
+ INSERT INTO ontology.external_mappings (
564
+ tenant_id,
565
+ subject_kind,
566
+ subject_id,
567
+ mapping_kind,
568
+ vocabulary,
569
+ external_uri,
570
+ external_label,
571
+ notes
572
+ )
573
+ SELECT
574
+ entity_types.tenant_id,
575
+ 'entity_type',
576
+ entity_types.id,
577
+ seed.mapping_kind,
578
+ seed.vocabulary,
579
+ seed.external_uri,
580
+ seed.external_label,
581
+ seed.notes
582
+ FROM seed
583
+ JOIN ontology.entity_types
584
+ ON entity_types.slug = seed.entity_slug
585
+ ON CONFLICT (subject_kind, subject_id, vocabulary, external_uri) DO NOTHING;
586
+
587
+ COMMIT;