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,361 @@
1
+ -- Purpose: backfill legacy Agent Templates into Agent-owned runtime fields and Space context modules.
2
+ -- Plan: docs/plans/2026-05-20-003-spaces-as-agent-contextual-workrooms-template-removal-plan.md (U5)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0114_migrate_templates_to_agents_and_spaces.sql
4
+ -- creates: public.idx_spaces_migrated_template
5
+
6
+ \set ON_ERROR_STOP on
7
+
8
+ BEGIN;
9
+
10
+ SET LOCAL lock_timeout = '5s';
11
+ SET LOCAL statement_timeout = '180s';
12
+
13
+ CREATE INDEX IF NOT EXISTS idx_spaces_migrated_template
14
+ ON public.spaces (tenant_id, template_key)
15
+ WHERE template_key LIKE 'agent-template:%';
16
+
17
+ -- Every tenant gets a contextual default Space. This is distinct from the
18
+ -- legacy "general" thread bucket and becomes the baseline Space for
19
+ -- template-free agents during the hard-cut migration.
20
+ INSERT INTO public.spaces (
21
+ tenant_id,
22
+ slug,
23
+ name,
24
+ description,
25
+ prompt,
26
+ status,
27
+ kind,
28
+ icon,
29
+ category,
30
+ template_key,
31
+ config,
32
+ context_config,
33
+ connected_data_config,
34
+ tool_policy,
35
+ mcp_policy,
36
+ agent_availability_policy
37
+ )
38
+ SELECT
39
+ t.id,
40
+ 'default',
41
+ 'Default',
42
+ 'Default contextual workspace for tenant agents.',
43
+ 'Use this Space for baseline agent context that should be available when no specialized Space applies.',
44
+ 'active',
45
+ 'custom',
46
+ 'folder',
47
+ 'default',
48
+ 'default',
49
+ jsonb_build_object(
50
+ 'workflow', 'default',
51
+ 'version', 1,
52
+ 'source', 'template_migration',
53
+ 'migration', '0114_migrate_templates_to_agents_and_spaces'
54
+ ),
55
+ jsonb_build_object(
56
+ 'source', 'template_migration',
57
+ 'workspaceSourcePrefix', format('tenants/%s/spaces/default/', t.slug),
58
+ 'legacyDefaultsPrefix', format('tenants/%s/agents/_catalog/defaults/workspace/', t.slug)
59
+ ),
60
+ '{}'::jsonb,
61
+ jsonb_build_object('source', 'template_migration'),
62
+ jsonb_build_object('source', 'template_migration'),
63
+ jsonb_build_object(
64
+ 'source', 'template_migration',
65
+ 'autoSubscribeAssignedAgents', true
66
+ )
67
+ FROM public.tenants t
68
+ ON CONFLICT (tenant_id, slug)
69
+ DO UPDATE SET
70
+ status = 'active',
71
+ kind = COALESCE(public.spaces.kind, EXCLUDED.kind),
72
+ icon = COALESCE(public.spaces.icon, EXCLUDED.icon),
73
+ category = COALESCE(public.spaces.category, EXCLUDED.category),
74
+ template_key = COALESCE(public.spaces.template_key, EXCLUDED.template_key),
75
+ config = COALESCE(public.spaces.config, '{}'::jsonb) || EXCLUDED.config,
76
+ context_config = COALESCE(public.spaces.context_config, '{}'::jsonb) || EXCLUDED.context_config,
77
+ connected_data_config = COALESCE(public.spaces.connected_data_config, EXCLUDED.connected_data_config),
78
+ tool_policy = COALESCE(public.spaces.tool_policy, '{}'::jsonb) || EXCLUDED.tool_policy,
79
+ mcp_policy = COALESCE(public.spaces.mcp_policy, '{}'::jsonb) || EXCLUDED.mcp_policy,
80
+ agent_availability_policy = COALESCE(public.spaces.agent_availability_policy, '{}'::jsonb) || EXCLUDED.agent_availability_policy,
81
+ updated_at = now();
82
+
83
+ -- Copy durable runtime and built-in policy fields from linked Templates onto
84
+ -- Agents. Runtime is intentionally overwritten because old agent rows default
85
+ -- to "strands" even when their Template selected a different runtime.
86
+ UPDATE public.agents a
87
+ SET
88
+ runtime = COALESCE(t.runtime, a.runtime, 'strands'),
89
+ model = COALESCE(a.model, t.model),
90
+ guardrail_id = COALESCE(a.guardrail_id, t.guardrail_id),
91
+ blocked_tools = COALESCE(t.blocked_tools, a.blocked_tools),
92
+ sandbox = COALESCE(t.sandbox, a.sandbox),
93
+ browser = COALESCE(t.browser, a.browser),
94
+ web_search = COALESCE(t.web_search, a.web_search),
95
+ send_email = COALESCE(t.send_email, a.send_email),
96
+ context_engine = COALESCE(t.context_engine, a.context_engine),
97
+ updated_at = now()
98
+ FROM public.agent_templates t
99
+ WHERE a.template_id = t.id;
100
+
101
+ -- Materialize a Space for every meaningful tenant-scoped, non-default Agent
102
+ -- Template so Template context can be reviewed and carried forward as Space
103
+ -- context. Default templates feed the tenant "default" Space above.
104
+ INSERT INTO public.spaces (
105
+ tenant_id,
106
+ slug,
107
+ name,
108
+ description,
109
+ prompt,
110
+ status,
111
+ kind,
112
+ icon,
113
+ category,
114
+ template_key,
115
+ config,
116
+ context_config,
117
+ connected_data_config,
118
+ tool_policy,
119
+ mcp_policy,
120
+ agent_availability_policy
121
+ )
122
+ SELECT
123
+ t.tenant_id,
124
+ 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g'),
125
+ t.name,
126
+ t.description,
127
+ COALESCE(t.config->>'systemPrompt', t.description),
128
+ 'active',
129
+ 'custom',
130
+ COALESCE(t.icon, 'folder'),
131
+ COALESCE(t.category, 'template'),
132
+ 'agent-template:' || t.slug,
133
+ jsonb_build_object(
134
+ 'workflow', 'template_migration',
135
+ 'version', 1,
136
+ 'source', 'template_migration',
137
+ 'migration', '0114_migrate_templates_to_agents_and_spaces',
138
+ 'legacyTemplateId', t.id::text,
139
+ 'legacyTemplateSlug', t.slug,
140
+ 'legacyTemplateKind', t.template_kind,
141
+ 'legacyTemplateSource', t.source
142
+ ),
143
+ jsonb_strip_nulls(jsonb_build_object(
144
+ 'source', 'template_migration',
145
+ 'sourceKind', 'agent_template',
146
+ 'legacyTemplateId', t.id::text,
147
+ 'legacyTemplateSlug', t.slug,
148
+ 'workspaceSourcePrefix', format('tenants/%s/spaces/%s/', tenant.slug, 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')),
149
+ 'legacyTemplatePrefix', format('tenants/%s/agents/_catalog/%s/workspace/', tenant.slug, t.slug),
150
+ 'legacyDefaultsPrefix', format('tenants/%s/agents/_catalog/defaults/workspace/', tenant.slug),
151
+ 'skills', CASE WHEN jsonb_typeof(t.skills) = 'array' THEN t.skills ELSE '[]'::jsonb END,
152
+ 'knowledgeBaseIds', CASE WHEN jsonb_typeof(t.knowledge_base_ids) = 'array' THEN t.knowledge_base_ids ELSE '[]'::jsonb END
153
+ )),
154
+ '{}'::jsonb,
155
+ jsonb_strip_nulls(jsonb_build_object(
156
+ 'source', 'template_migration',
157
+ 'blockedTools', t.blocked_tools,
158
+ 'builtIns', jsonb_strip_nulls(jsonb_build_object(
159
+ 'sandbox', t.sandbox,
160
+ 'browser', t.browser,
161
+ 'webSearch', t.web_search,
162
+ 'sendEmail', t.send_email,
163
+ 'contextEngine', t.context_engine
164
+ ))
165
+ )),
166
+ jsonb_build_object(
167
+ 'source', 'template_migration',
168
+ 'bindingSource', 'agent_template_mcp_servers'
169
+ ),
170
+ jsonb_build_object(
171
+ 'source', 'template_migration',
172
+ 'legacyTemplateId', t.id::text,
173
+ 'autoSubscribeAssignedAgents', true
174
+ )
175
+ FROM public.agent_templates t
176
+ JOIN public.tenants tenant
177
+ ON tenant.id = t.tenant_id
178
+ WHERE t.tenant_id IS NOT NULL
179
+ AND t.template_kind = 'agent'
180
+ AND t.slug <> 'default'
181
+ ON CONFLICT (tenant_id, slug)
182
+ DO UPDATE SET
183
+ template_key = EXCLUDED.template_key,
184
+ config = COALESCE(public.spaces.config, '{}'::jsonb) || EXCLUDED.config,
185
+ context_config = COALESCE(public.spaces.context_config, '{}'::jsonb) || EXCLUDED.context_config,
186
+ tool_policy = COALESCE(public.spaces.tool_policy, '{}'::jsonb) || EXCLUDED.tool_policy,
187
+ mcp_policy = COALESCE(public.spaces.mcp_policy, '{}'::jsonb) || EXCLUDED.mcp_policy,
188
+ agent_availability_policy = COALESCE(public.spaces.agent_availability_policy, '{}'::jsonb) || EXCLUDED.agent_availability_policy,
189
+ updated_at = now();
190
+
191
+ -- Existing Agents should keep their skill, KB, and MCP behavior even after
192
+ -- Templates stop being a live configuration concept.
193
+ INSERT INTO public.agent_skills (
194
+ agent_id,
195
+ tenant_id,
196
+ skill_id,
197
+ config,
198
+ permissions,
199
+ rate_limit_rpm,
200
+ model_override,
201
+ enabled
202
+ )
203
+ SELECT
204
+ a.id,
205
+ a.tenant_id,
206
+ skill.skill_id,
207
+ skill.config,
208
+ skill.permissions,
209
+ skill.rate_limit_rpm,
210
+ skill.model_override,
211
+ COALESCE(skill.enabled, true)
212
+ FROM public.agents a
213
+ JOIN public.agent_templates t
214
+ ON t.id = a.template_id
215
+ CROSS JOIN LATERAL jsonb_to_recordset(
216
+ CASE WHEN jsonb_typeof(t.skills) = 'array' THEN t.skills ELSE '[]'::jsonb END
217
+ ) AS skill(
218
+ skill_id text,
219
+ config jsonb,
220
+ permissions jsonb,
221
+ rate_limit_rpm integer,
222
+ model_override text,
223
+ enabled boolean
224
+ )
225
+ WHERE skill.skill_id IS NOT NULL
226
+ ON CONFLICT (agent_id, skill_id)
227
+ DO NOTHING;
228
+
229
+ INSERT INTO public.agent_knowledge_bases (
230
+ agent_id,
231
+ tenant_id,
232
+ knowledge_base_id,
233
+ enabled
234
+ )
235
+ SELECT
236
+ a.id,
237
+ a.tenant_id,
238
+ kb.knowledge_base_id::uuid,
239
+ true
240
+ FROM public.agents a
241
+ JOIN public.agent_templates t
242
+ ON t.id = a.template_id
243
+ CROSS JOIN LATERAL jsonb_array_elements_text(
244
+ CASE WHEN jsonb_typeof(t.knowledge_base_ids) = 'array' THEN t.knowledge_base_ids ELSE '[]'::jsonb END
245
+ ) AS kb(knowledge_base_id)
246
+ WHERE kb.knowledge_base_id ~* '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
247
+ ON CONFLICT (agent_id, knowledge_base_id)
248
+ DO NOTHING;
249
+
250
+ INSERT INTO public.agent_mcp_servers (
251
+ agent_id,
252
+ tenant_id,
253
+ mcp_server_id,
254
+ enabled,
255
+ config
256
+ )
257
+ SELECT
258
+ a.id,
259
+ a.tenant_id,
260
+ atm.mcp_server_id,
261
+ COALESCE(atm.enabled, true),
262
+ atm.config
263
+ FROM public.agents a
264
+ JOIN public.agent_template_mcp_servers atm
265
+ ON atm.template_id = a.template_id
266
+ ON CONFLICT (agent_id, mcp_server_id)
267
+ DO NOTHING;
268
+
269
+ -- Make Agents available inside their migrated Template Space. Agents that
270
+ -- were already template-free go to the tenant default Space so every Agent
271
+ -- has at least one contextual workroom.
272
+ WITH agent_target_spaces AS (
273
+ SELECT
274
+ a.tenant_id,
275
+ a.id AS agent_id,
276
+ COALESCE(template_space.id, default_space.id) AS space_id,
277
+ t.id AS legacy_template_id,
278
+ t.slug AS legacy_template_slug
279
+ FROM public.agents a
280
+ LEFT JOIN public.agent_templates t
281
+ ON t.id = a.template_id
282
+ JOIN public.spaces default_space
283
+ ON default_space.tenant_id = a.tenant_id
284
+ AND default_space.slug = 'default'
285
+ LEFT JOIN public.spaces template_space
286
+ ON template_space.tenant_id = a.tenant_id
287
+ AND template_space.slug = 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')
288
+ AND t.slug <> 'default'
289
+ )
290
+ INSERT INTO public.space_agent_assignments (
291
+ tenant_id,
292
+ space_id,
293
+ agent_id,
294
+ local_role,
295
+ local_instructions,
296
+ auto_subscribe,
297
+ allowed_capabilities,
298
+ allowed_tools,
299
+ status
300
+ )
301
+ SELECT
302
+ ats.tenant_id,
303
+ ats.space_id,
304
+ ats.agent_id,
305
+ 'agent',
306
+ CASE
307
+ WHEN ats.legacy_template_slug IS NULL THEN 'Assigned by Template removal migration as a template-free agent.'
308
+ ELSE format('Assigned by Template removal migration from legacy template %s.', ats.legacy_template_slug)
309
+ END,
310
+ true,
311
+ NULL,
312
+ NULL,
313
+ 'active'
314
+ FROM agent_target_spaces ats
315
+ WHERE ats.space_id IS NOT NULL
316
+ ON CONFLICT (tenant_id, space_id, agent_id)
317
+ DO NOTHING;
318
+
319
+ -- Move Template MCP bindings onto the migrated Space that represents that
320
+ -- context. The agent-level copy above preserves existing runtime behavior;
321
+ -- this Space-level copy is the new contextual source of truth.
322
+ WITH template_target_spaces AS (
323
+ SELECT
324
+ t.id AS template_id,
325
+ t.tenant_id,
326
+ CASE
327
+ WHEN t.slug = 'default' THEN default_space.id
328
+ ELSE template_space.id
329
+ END AS space_id
330
+ FROM public.agent_templates t
331
+ JOIN public.spaces default_space
332
+ ON default_space.tenant_id = t.tenant_id
333
+ AND default_space.slug = 'default'
334
+ LEFT JOIN public.spaces template_space
335
+ ON template_space.tenant_id = t.tenant_id
336
+ AND template_space.slug = 'template-' || regexp_replace(lower(t.slug), '[^a-z0-9]+', '-', 'g')
337
+ WHERE t.tenant_id IS NOT NULL
338
+ AND t.template_kind = 'agent'
339
+ )
340
+ INSERT INTO public.space_mcp_servers (
341
+ tenant_id,
342
+ space_id,
343
+ mcp_server_id,
344
+ enabled,
345
+ config
346
+ )
347
+ SELECT
348
+ tts.tenant_id,
349
+ tts.space_id,
350
+ atm.mcp_server_id,
351
+ COALESCE(atm.enabled, true),
352
+ COALESCE(atm.config, '{}'::jsonb)
353
+ || jsonb_build_object('source', 'template_migration', 'legacyTemplateId', atm.template_id::text)
354
+ FROM template_target_spaces tts
355
+ JOIN public.agent_template_mcp_servers atm
356
+ ON atm.template_id = tts.template_id
357
+ WHERE tts.space_id IS NOT NULL
358
+ ON CONFLICT (space_id, mcp_server_id)
359
+ DO NOTHING;
360
+
361
+ COMMIT;
@@ -0,0 +1,69 @@
1
+ -- Purpose: remove remaining Computer/Evaluation dependencies on Agent Templates.
2
+ -- Plan: docs/plans/2026-05-20-003-spaces-as-agent-contextual-workrooms-template-removal-plan.md (U10)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0115_remove_computer_eval_template_dependencies.sql
4
+ -- creates-column: public.eval_test_cases.agent_id
5
+ -- creates-constraint: public.eval_test_cases.eval_test_cases_agent_id_agents_id_fk
6
+
7
+ \set ON_ERROR_STOP on
8
+
9
+ BEGIN;
10
+
11
+ SET LOCAL lock_timeout = '5s';
12
+ SET LOCAL statement_timeout = '120s';
13
+
14
+ ALTER TABLE public.eval_test_cases
15
+ ADD COLUMN IF NOT EXISTS agent_id uuid;
16
+
17
+ WITH ranked_agents AS (
18
+ SELECT
19
+ tc.id AS test_case_id,
20
+ a.id AS agent_id,
21
+ row_number() OVER (
22
+ PARTITION BY tc.id
23
+ ORDER BY
24
+ CASE WHEN a.type = 'eval' THEN 0 ELSE 1 END,
25
+ CASE WHEN a.source = 'system' THEN 0 ELSE 1 END,
26
+ a.created_at DESC
27
+ ) AS rn
28
+ FROM public.eval_test_cases tc
29
+ JOIN public.agents a
30
+ ON a.template_id = tc.agent_template_id
31
+ AND a.tenant_id = tc.tenant_id
32
+ WHERE tc.agent_id IS NULL
33
+ AND tc.agent_template_id IS NOT NULL
34
+ AND a.status <> 'archived'
35
+ )
36
+ UPDATE public.eval_test_cases tc
37
+ SET agent_id = ranked_agents.agent_id
38
+ FROM ranked_agents
39
+ WHERE ranked_agents.test_case_id = tc.id
40
+ AND ranked_agents.rn = 1;
41
+
42
+ DO $$
43
+ BEGIN
44
+ IF NOT EXISTS (
45
+ SELECT 1
46
+ FROM pg_constraint
47
+ WHERE conname = 'eval_test_cases_agent_id_agents_id_fk'
48
+ AND conrelid = 'public.eval_test_cases'::regclass
49
+ ) THEN
50
+ ALTER TABLE public.eval_test_cases
51
+ ADD CONSTRAINT eval_test_cases_agent_id_agents_id_fk
52
+ FOREIGN KEY (agent_id)
53
+ REFERENCES public.agents(id);
54
+ END IF;
55
+ END
56
+ $$;
57
+
58
+ DROP INDEX IF EXISTS public.idx_computers_template;
59
+
60
+ ALTER TABLE public.computers
61
+ DROP COLUMN IF EXISTS template_id;
62
+
63
+ ALTER TABLE public.eval_runs
64
+ DROP COLUMN IF EXISTS agent_template_id;
65
+
66
+ ALTER TABLE public.eval_test_cases
67
+ DROP COLUMN IF EXISTS agent_template_id;
68
+
69
+ COMMIT;
@@ -0,0 +1,126 @@
1
+ -- Purpose: backfill user Thread participants for per-user Thread visibility.
2
+ -- Context: a user may read a Thread only when they started it (`threads.user_id`)
3
+ -- or were mentioned in it (`message_mentions target_type='user'`).
4
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0116_backfill_thread_participants_access.sql
5
+ -- creates: public.view_thread_participants_access_backfilled
6
+
7
+ \set ON_ERROR_STOP on
8
+
9
+ BEGIN;
10
+
11
+ SELECT pg_advisory_xact_lock(hashtext('thread_participants_access_backfill_0116'));
12
+
13
+ SET LOCAL lock_timeout = '5s';
14
+ SET LOCAL statement_timeout = '180s';
15
+
16
+ DO $$
17
+ BEGIN
18
+ IF to_regclass('public.thread_participants') IS NULL THEN
19
+ RAISE EXCEPTION 'pre-flight: public.thread_participants does not exist';
20
+ END IF;
21
+ IF to_regclass('public.threads') IS NULL THEN
22
+ RAISE EXCEPTION 'pre-flight: public.threads does not exist';
23
+ END IF;
24
+ IF to_regclass('public.message_mentions') IS NULL THEN
25
+ RAISE EXCEPTION 'pre-flight: public.message_mentions does not exist';
26
+ END IF;
27
+ END $$;
28
+
29
+ -- Threads started by a user. Preserve legacy thread-level read state so
30
+ -- existing owners do not suddenly see old conversations as unread.
31
+ INSERT INTO public.thread_participants (
32
+ tenant_id,
33
+ thread_id,
34
+ space_id,
35
+ participant_type,
36
+ user_id,
37
+ role,
38
+ source,
39
+ notification_preference,
40
+ last_read_at,
41
+ created_at,
42
+ updated_at
43
+ )
44
+ SELECT
45
+ t.tenant_id,
46
+ t.id,
47
+ t.space_id,
48
+ 'user',
49
+ t.user_id,
50
+ CASE
51
+ WHEN t.created_by_id = t.user_id::text THEN 'requester'
52
+ ELSE 'member'
53
+ END,
54
+ 'thread_owner_backfill',
55
+ 'subscribed',
56
+ t.last_read_at,
57
+ COALESCE(t.created_at, now()),
58
+ now()
59
+ FROM public.threads t
60
+ JOIN public.users u
61
+ ON u.id = t.user_id
62
+ AND u.tenant_id = t.tenant_id
63
+ WHERE t.user_id IS NOT NULL
64
+ AND t.space_id IS NOT NULL
65
+ ON CONFLICT (tenant_id, thread_id, user_id)
66
+ WHERE user_id IS NOT NULL
67
+ DO UPDATE SET
68
+ role = CASE
69
+ WHEN public.thread_participants.role = 'member'
70
+ AND EXCLUDED.role = 'requester'
71
+ THEN 'requester'
72
+ ELSE public.thread_participants.role
73
+ END,
74
+ last_read_at = COALESCE(public.thread_participants.last_read_at, EXCLUDED.last_read_at),
75
+ updated_at = now();
76
+
77
+ -- Users mentioned in any existing message become Thread participants.
78
+ -- Mention rows are the durable record that grants access to non-owners.
79
+ INSERT INTO public.thread_participants (
80
+ tenant_id,
81
+ thread_id,
82
+ space_id,
83
+ participant_type,
84
+ user_id,
85
+ role,
86
+ source,
87
+ notification_preference,
88
+ created_at,
89
+ updated_at
90
+ )
91
+ SELECT
92
+ mm.tenant_id,
93
+ mm.thread_id,
94
+ t.space_id,
95
+ 'user',
96
+ mm.target_id,
97
+ 'member',
98
+ 'mention_backfill',
99
+ 'subscribed',
100
+ MIN(mm.created_at),
101
+ now()
102
+ FROM public.message_mentions mm
103
+ JOIN public.threads t
104
+ ON t.id = mm.thread_id
105
+ AND t.tenant_id = mm.tenant_id
106
+ JOIN public.users u
107
+ ON u.id = mm.target_id
108
+ AND u.tenant_id = mm.tenant_id
109
+ WHERE mm.target_type = 'user'
110
+ AND t.space_id IS NOT NULL
111
+ GROUP BY mm.tenant_id, mm.thread_id, t.space_id, mm.target_id
112
+ ON CONFLICT (tenant_id, thread_id, user_id)
113
+ WHERE user_id IS NOT NULL
114
+ DO NOTHING;
115
+
116
+ CREATE OR REPLACE VIEW public.view_thread_participants_access_backfilled AS
117
+ SELECT
118
+ COUNT(*) FILTER (WHERE source = 'thread_owner_backfill')::int AS owner_backfill_rows,
119
+ COUNT(*) FILTER (WHERE source = 'mention_backfill')::int AS mention_backfill_rows,
120
+ now() AS checked_at
121
+ FROM public.thread_participants;
122
+
123
+ COMMENT ON VIEW public.view_thread_participants_access_backfilled IS
124
+ 'Drift marker and summary for 0116_backfill_thread_participants_access.sql.';
125
+
126
+ COMMIT;
@@ -0,0 +1,40 @@
1
+ -- Purpose: add tenant-public/private access semantics to Spaces.
2
+ -- Plan: docs/plans/2026-05-21-001-feat-public-private-space-access-plan.md (U1)
3
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0117_space_access_mode.sql
4
+ -- creates-column: public.spaces.access_mode
5
+ -- creates-constraint: public.spaces.spaces_access_mode_allowed
6
+
7
+ \set ON_ERROR_STOP on
8
+
9
+ BEGIN;
10
+
11
+ SET LOCAL lock_timeout = '5s';
12
+ SET LOCAL statement_timeout = '120s';
13
+
14
+ ALTER TABLE public.spaces
15
+ ADD COLUMN IF NOT EXISTS access_mode text;
16
+
17
+ UPDATE public.spaces
18
+ SET access_mode = 'public'
19
+ WHERE access_mode IS NULL;
20
+
21
+ ALTER TABLE public.spaces
22
+ ALTER COLUMN access_mode SET DEFAULT 'public',
23
+ ALTER COLUMN access_mode SET NOT NULL;
24
+
25
+ DO $$
26
+ BEGIN
27
+ IF NOT EXISTS (
28
+ SELECT 1
29
+ FROM pg_constraint
30
+ WHERE conname = 'spaces_access_mode_allowed'
31
+ AND conrelid = 'public.spaces'::regclass
32
+ ) THEN
33
+ ALTER TABLE public.spaces
34
+ ADD CONSTRAINT spaces_access_mode_allowed
35
+ CHECK (access_mode IN ('public','private'));
36
+ END IF;
37
+ END;
38
+ $$;
39
+
40
+ COMMIT;
@@ -0,0 +1,41 @@
1
+ -- Purpose: normalize tenant_members.principal_type to lowercase and prevent
2
+ -- future drift. Two writers (inviteMember mutation, REST POST /tenants/:id/invite)
3
+ -- wrote 'USER' (uppercase) while every reader gate filters on 'user' (lowercase).
4
+ -- The mismatch made invited users invisible to canReadTenantSpaces /
5
+ -- requester-context / auth-me role / etc. — the public/private space change
6
+ -- exposed it because invited users still saw nothing after spaces were
7
+ -- marked public.
8
+ -- Apply manually: psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f packages/database-pg/drizzle/0118_normalize_tenant_member_principal_type.sql
9
+ -- creates-constraint: public.tenant_members.tenant_members_principal_type_lowercase_chk
10
+
11
+ \set ON_ERROR_STOP on
12
+
13
+ BEGIN;
14
+
15
+ SET LOCAL lock_timeout = '5s';
16
+ SET LOCAL statement_timeout = '120s';
17
+
18
+ -- Backfill existing rows. tenant_members is small (< 1000 rows in any
19
+ -- realistic tenant), so a plain UPDATE under the statement_timeout is safe.
20
+ UPDATE public.tenant_members
21
+ SET principal_type = lower(principal_type)
22
+ WHERE principal_type <> lower(principal_type);
23
+
24
+ -- Lock the canonical shape so neither writer (nor any future one) can
25
+ -- reintroduce the case mismatch silently.
26
+ DO $$
27
+ BEGIN
28
+ IF NOT EXISTS (
29
+ SELECT 1
30
+ FROM pg_constraint
31
+ WHERE conname = 'tenant_members_principal_type_lowercase_chk'
32
+ AND conrelid = 'public.tenant_members'::regclass
33
+ ) THEN
34
+ ALTER TABLE public.tenant_members
35
+ ADD CONSTRAINT tenant_members_principal_type_lowercase_chk
36
+ CHECK (principal_type = lower(principal_type));
37
+ END IF;
38
+ END;
39
+ $$;
40
+
41
+ COMMIT;