thinkwork-cli 0.12.12 → 0.12.16

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 (475) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
  4. package/dist/cli.js +23823 -10151
  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/0197_rcm_context_columns.sql +28 -0
  218. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  219. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  220. package/dist/drizzle/meta/_journal.json +160 -0
  221. package/dist/plugins/README.md +162 -0
  222. package/dist/plugins/catalog/package.json +40 -0
  223. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  224. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  225. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  226. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  227. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  229. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  230. package/dist/plugins/catalog/src/catalog.ts +434 -0
  231. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  232. package/dist/plugins/catalog/src/index.ts +4 -0
  233. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  234. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  235. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  236. package/dist/plugins/catalog/tsconfig.json +8 -0
  237. package/dist/plugins/company-brain/README.md +37 -0
  238. package/dist/plugins/company-brain/package.json +33 -0
  239. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  240. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  241. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  244. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  245. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  246. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  247. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  248. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  249. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  250. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  251. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  252. package/dist/plugins/company-brain/src/index.ts +62 -0
  253. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  254. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  255. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  256. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  257. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  258. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  259. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  260. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  261. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  262. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  263. package/dist/plugins/company-brain/tsconfig.json +8 -0
  264. package/dist/plugins/company-data/README.md +49 -0
  265. package/dist/plugins/company-data/package.json +21 -0
  266. package/dist/plugins/company-data/src/index.ts +30 -0
  267. package/dist/plugins/company-data/src/manifest.ts +26 -0
  268. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  269. package/dist/plugins/company-data/tsconfig.json +8 -0
  270. package/dist/plugins/company-etl/README.md +46 -0
  271. package/dist/plugins/company-etl/package.json +21 -0
  272. package/dist/plugins/company-etl/src/index.ts +29 -0
  273. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  274. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  275. package/dist/plugins/company-etl/tsconfig.json +8 -0
  276. package/dist/plugins/email-channel/README.md +41 -0
  277. package/dist/plugins/email-channel/package.json +22 -0
  278. package/dist/plugins/email-channel/src/index.ts +36 -0
  279. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  280. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  281. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  282. package/dist/plugins/email-channel/tsconfig.json +8 -0
  283. package/dist/plugins/lastmile/README.md +50 -0
  284. package/dist/plugins/lastmile/package.json +23 -0
  285. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  286. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  287. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  288. package/dist/plugins/lastmile/src/index.ts +46 -0
  289. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  290. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  291. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  292. package/dist/plugins/lastmile/tsconfig.json +8 -0
  293. package/dist/plugins/n8n/README.md +201 -0
  294. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  295. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  296. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  297. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  298. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  299. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  300. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  301. package/dist/plugins/n8n/package.json +35 -0
  302. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  304. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  305. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  306. package/dist/plugins/n8n/runtime/package.json +7 -0
  307. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  308. package/dist/plugins/n8n/smoke/README.md +95 -0
  309. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  310. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  311. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  312. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  313. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  314. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  315. package/dist/plugins/n8n/src/index.ts +79 -0
  316. package/dist/plugins/n8n/src/manifest.ts +403 -0
  317. package/dist/plugins/n8n/src/package-config.ts +186 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  321. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  322. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  323. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  324. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  326. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  327. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  328. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  329. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  330. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  331. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  332. package/dist/plugins/n8n/tsconfig.json +8 -0
  333. package/dist/plugins/sendgrid/README.md +30 -0
  334. package/dist/plugins/sendgrid/package.json +22 -0
  335. package/dist/plugins/sendgrid/src/index.ts +36 -0
  336. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  337. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  338. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  339. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  340. package/dist/plugins/twenty/README.md +78 -0
  341. package/dist/plugins/twenty/package.json +27 -0
  342. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  343. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  344. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  345. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  346. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  347. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  348. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  349. package/dist/plugins/twenty/src/index.ts +55 -0
  350. package/dist/plugins/twenty/src/manifest.ts +259 -0
  351. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  352. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  353. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  354. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  355. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  356. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  357. package/dist/plugins/twenty/tsconfig.json +9 -0
  358. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  359. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  360. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  361. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  362. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  363. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  364. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  365. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  366. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  367. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  368. package/dist/plugins/workos-auth/package.json +22 -0
  369. package/dist/plugins/workos-auth/src/index.ts +30 -0
  370. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  371. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  372. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  373. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  374. package/dist/scripts/bootstrap-workspace.sh +162 -0
  375. package/dist/scripts/post-deploy.sh +290 -0
  376. package/dist/terraform/examples/greenfield/main.tf +903 -75
  377. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  381. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  382. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  383. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  384. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  385. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  386. package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
  387. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  388. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  389. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  390. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  391. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  392. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  399. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  400. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  401. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  402. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  403. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  404. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  405. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  406. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  407. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  408. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  409. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  411. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  412. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  413. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  414. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  415. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  416. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  417. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  418. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  420. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  421. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  422. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  423. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  424. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  425. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  426. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  427. package/dist/terraform/modules/thinkwork/README.md +71 -0
  428. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  429. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  430. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  431. package/dist/terraform/schema.graphql +82 -9
  432. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  433. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  434. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  435. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  436. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  437. package/dist/workspace-defaults/files/SPACE.md +62 -0
  438. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  439. package/dist/workspace-defaults/files/USER.md +40 -0
  440. package/dist/workspace-defaults/files/mcp.json +3 -0
  441. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  442. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  443. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  444. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  446. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  447. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  466. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  467. package/package.json +2 -1
  468. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  469. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  470. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  471. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  472. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  473. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  474. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  475. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,483 @@
1
+ ################################################################################
2
+ # Customer Domain — App Module (<name>.thinkwork.ai)
3
+ #
4
+ # Owns the customer-account half of the customer-domain namespace: a Route53
5
+ # hosted zone for the NS-delegated subdomain plus, once delegation has
6
+ # resolved, the ACM certificate and web alias records that put the end-user
7
+ # app on https://<name>.thinkwork.ai.
8
+ #
9
+ # Responsibilities:
10
+ # 1. Route53 hosted zone for the customer domain whenever one is configured
11
+ # (pre-delegation: the zone exists but nothing resolves to it). The four
12
+ # name servers are surfaced as outputs so the shared claim tool can run
13
+ # its phase-two `claim --set-targets <ns...>` against the Cloudflare
14
+ # apex zone.
15
+ # 2. CAA record `0 issue "amazon.com"` published with the zone, so the
16
+ # delegated subtree can only ever obtain Amazon-issued (ACM)
17
+ # certificates.
18
+ # 3. Gated on customer_domain_delegated: ACM certificate in us-east-1
19
+ # (CloudFront requires us-east-1 certs; provided via the aws.us_east_1
20
+ # provider alias), DNS validation records written into this module's
21
+ # own zone (single apply once delegation resolves), and a validation
22
+ # waiter with an explicit fail-fast timeout — a pre-delegation gate
23
+ # flip must fail in minutes, not hang a CodeBuild run for hours.
24
+ # 4. Gated on customer_domain_delegated: A/AAAA alias records pointing the
25
+ # customer domain at the end-user app CloudFront distribution.
26
+ # 5. SES send + receive for the customer domain (gated only on
27
+ # customer_domain being set, NOT on delegation): domain identity, DKIM,
28
+ # custom MAIL FROM, inbound MX, DMARC, and a domain-level receipt rule
29
+ # routing inbound mail to the S3 bucket + email-inbound Lambda.
30
+ #
31
+ # SES verification timing: the identity and its DNS records are created as
32
+ # soon as customer_domain is set — intentionally pre-delegation, so the
33
+ # records are already in place the instant the NS hop lands. SES's pending
34
+ # verification attempt expires after ~72 hours, however. If delegation lands
35
+ # later than that, re-trigger verification before any consumer gates on the
36
+ # identity (e.g. before switching cognito_email_source_arn):
37
+ #
38
+ # terraform taint 'module.customer_domain.aws_ses_domain_identity.customer[0]'
39
+ # terraform apply
40
+ #
41
+ # (or `terraform apply -replace=...` of the same address). The full
42
+ # procedure lives in the claim runbook:
43
+ # docs/runbooks/customer-domain-claim-runbook.md.
44
+ #
45
+ # Receipt rule-set semantics (KTD6): SES allows exactly ONE active receipt
46
+ # rule set per account/region, and the semantics differ by account kind:
47
+ # - Customer accounts: no other Terraform-managed rule set exists (the
48
+ # deployment controller threads zero ses_* vars), so THIS module is the
49
+ # single owner — it creates its own rule set and activates it when
50
+ # manage_active_rule_set is true (the default the thinkwork module
51
+ # computes when the ses-email module is disabled).
52
+ # - SaaS account: the ses-email module owns the active rule set
53
+ # (thinkwork-<stage>-email-rules). If both modules are ever enabled in
54
+ # one account, this module still creates its (distinctly named) rule
55
+ # set but must NOT activate it — the caller passes
56
+ # manage_active_rule_set = false so activation never flips away from
57
+ # the ses-email set and silently drops inbound mail for the SaaS
58
+ # tenant identities.
59
+ #
60
+ # Cycle avoidance: every resource count gates on plain bool/string vars,
61
+ # never on downstream CloudFront outputs — the app distribution consumes
62
+ # this module's certificate, so the certificate (and everything its count
63
+ # depends on) must not depend on distribution outputs. Only the alias
64
+ # records' *attributes* reference the distribution domain, which keeps the
65
+ # resource graph acyclic: cert → distribution → alias records.
66
+ ################################################################################
67
+
68
+ terraform {
69
+ required_providers {
70
+ aws = {
71
+ source = "hashicorp/aws"
72
+ version = "~> 5.0"
73
+
74
+ # CloudFront only accepts certificates from us-east-1. Callers must
75
+ # pass an aliased us-east-1 provider:
76
+ # providers = { aws.us_east_1 = aws.us_east_1 }
77
+ configuration_aliases = [aws.us_east_1]
78
+ }
79
+ }
80
+ }
81
+
82
+ variable "stage" {
83
+ description = "Deployment stage"
84
+ type = string
85
+ }
86
+
87
+ variable "customer_domain" {
88
+ description = "Customer domain to host in this account (e.g. tei.thinkwork.ai). Leave empty to create nothing."
89
+ type = string
90
+ default = ""
91
+ }
92
+
93
+ variable "customer_domain_delegated" {
94
+ description = "Set true once the parent zone's NS records point at this zone (claim tool phase two). Gates the ACM certificate, its validation, and the web alias records."
95
+ type = bool
96
+ default = false
97
+ }
98
+
99
+ variable "app_distribution_domain_name" {
100
+ description = "CloudFront distribution domain name of the end-user app (e.g. dxxxx.cloudfront.net). Target of the A/AAAA alias records. May be unknown at plan time — it never drives a resource count."
101
+ type = string
102
+ default = ""
103
+ }
104
+
105
+ variable "region" {
106
+ description = "AWS region of the stack (determines the SES inbound SMTP endpoint and the MAIL FROM feedback MX target)."
107
+ type = string
108
+ default = "us-east-1"
109
+ }
110
+
111
+ variable "account_id" {
112
+ description = "AWS account ID (source_account on the SES → email-inbound Lambda invoke permission)."
113
+ type = string
114
+ default = ""
115
+ }
116
+
117
+ variable "inbound_bucket_name" {
118
+ description = "S3 bucket that SES writes raw inbound .eml files into. Its policy must already allow ses.amazonaws.com PutObject."
119
+ type = string
120
+ default = ""
121
+ }
122
+
123
+ variable "email_inbound_fn_arn" {
124
+ description = "ARN of the email-inbound Lambda. If empty, the receipt rule is still created but without a Lambda action."
125
+ type = string
126
+ default = ""
127
+ }
128
+
129
+ variable "email_inbound_fn_name" {
130
+ description = "Function name of the email-inbound Lambda (for the Lambda invoke permission)."
131
+ type = string
132
+ default = ""
133
+ }
134
+
135
+ variable "enable_email_inbound_lambda_action" {
136
+ description = "Attach the email-inbound Lambda action and invoke permission to the customer-domain receipt rule."
137
+ type = bool
138
+ default = false
139
+ }
140
+
141
+ variable "manage_active_rule_set" {
142
+ description = "Activate this module's receipt rule set. Only ONE rule set can be active per region per AWS account (KTD6): true in customer accounts (where this module is the sole rule-set owner), false whenever the ses-email module is enabled in the same account — its thinkwork-<stage>-email-rules set must stay active."
143
+ type = bool
144
+ default = true
145
+ }
146
+
147
+ locals {
148
+ zone_enabled = var.customer_domain != ""
149
+ cert_enabled = local.zone_enabled && var.customer_domain_delegated
150
+
151
+ # SES resources gate on the same condition as the zone: the identity (and
152
+ # all its DNS records) intentionally exist pre-delegation so verification
153
+ # can succeed the moment the NS hop resolves. See the ~72h verification
154
+ # expiry note in the module header.
155
+ ses_enabled = local.zone_enabled
156
+
157
+ name_id = replace(var.customer_domain, ".", "-")
158
+
159
+ # Custom MAIL FROM subdomain. Lives under the customer domain so the
160
+ # envelope sender (Return-Path) aligns with the From domain for SPF.
161
+ mail_from_domain = "mail.${var.customer_domain}"
162
+
163
+ inbound_smtp = "inbound-smtp.${var.region}.amazonaws.com"
164
+
165
+ # Distinct from ses-email's thinkwork-<stage>-email-rules so the two
166
+ # modules can never collide on rule-set NAME even when both are enabled
167
+ # in one account (KTD6 — activation is what's mutually exclusive).
168
+ rule_set_name = "thinkwork-${var.stage}-customer-domain-email-rules"
169
+
170
+ has_lambda = local.ses_enabled && var.enable_email_inbound_lambda_action && var.email_inbound_fn_arn != "" && var.email_inbound_fn_name != ""
171
+ has_bucket = var.inbound_bucket_name != ""
172
+
173
+ # Universal hosted zone ID for CloudFront distributions — a documented AWS
174
+ # constant, identical for every distribution in every account.
175
+ cloudfront_hosted_zone_id = "Z2FDTNDATAQYW2"
176
+ }
177
+
178
+ ################################################################################
179
+ # Hosted zone + CAA (created with the zone, pre-delegation)
180
+ ################################################################################
181
+
182
+ resource "aws_route53_zone" "customer" {
183
+ count = local.zone_enabled ? 1 : 0
184
+
185
+ name = var.customer_domain
186
+ comment = "thinkwork-${var.stage} customer domain"
187
+
188
+ tags = {
189
+ Name = "thinkwork-${var.stage}-customer-domain-zone"
190
+ }
191
+ }
192
+
193
+ # Published at zone creation so that from the instant delegation resolves,
194
+ # only Amazon's CAs may issue certificates for the delegated subtree.
195
+ # Per ACM docs, `issue "amazon.com"` authorizes all four Amazon CA domains.
196
+ resource "aws_route53_record" "caa" {
197
+ count = local.zone_enabled ? 1 : 0
198
+
199
+ zone_id = aws_route53_zone.customer[0].zone_id
200
+ name = var.customer_domain
201
+ type = "CAA"
202
+ ttl = 300
203
+ records = ["0 issue \"amazon.com\""]
204
+ }
205
+
206
+ ################################################################################
207
+ # ACM certificate (us-east-1) + DNS validation in our own zone
208
+ #
209
+ # Validation records live in this module's zone, so once the NS hop resolves
210
+ # the certificate validates in the same apply that creates it (no second
211
+ # out-of-band step beyond flipping customer_domain_delegated).
212
+ ################################################################################
213
+
214
+ resource "aws_acm_certificate" "customer" {
215
+ count = local.cert_enabled ? 1 : 0
216
+ provider = aws.us_east_1
217
+
218
+ domain_name = var.customer_domain
219
+ validation_method = "DNS"
220
+
221
+ lifecycle {
222
+ create_before_destroy = true
223
+ }
224
+
225
+ tags = {
226
+ Name = "thinkwork-${var.stage}-${local.name_id}"
227
+ }
228
+ }
229
+
230
+ resource "aws_route53_record" "acm_validation" {
231
+ for_each = {
232
+ for dvo in(local.cert_enabled ? aws_acm_certificate.customer[0].domain_validation_options : []) :
233
+ dvo.domain_name => {
234
+ name = dvo.resource_record_name
235
+ record = dvo.resource_record_value
236
+ type = dvo.resource_record_type
237
+ }
238
+ }
239
+
240
+ zone_id = aws_route53_zone.customer[0].zone_id
241
+ name = each.value.name
242
+ type = each.value.type
243
+ ttl = 60
244
+ records = [each.value.record]
245
+ allow_overwrite = true
246
+ }
247
+
248
+ resource "aws_acm_certificate_validation" "customer" {
249
+ count = local.cert_enabled ? 1 : 0
250
+ provider = aws.us_east_1
251
+
252
+ certificate_arn = aws_acm_certificate.customer[0].arn
253
+ validation_record_fqdns = [for r in aws_route53_record.acm_validation : r.fqdn]
254
+
255
+ # Fail fast (KTD3): the default validation timeout is far too generous for
256
+ # a gate that should only ever be flipped after delegation resolved. If
257
+ # validation hasn't succeeded in 30 minutes the NS hop almost certainly
258
+ # hasn't landed — fail the apply instead of hanging the deploy runner.
259
+ timeouts {
260
+ create = "30m"
261
+ }
262
+ }
263
+
264
+ ################################################################################
265
+ # Web alias records → end-user app CloudFront distribution
266
+ #
267
+ # Counts gate on the same plain bool as the certificate (never on the
268
+ # distribution output, which is unknown at plan time on greenfield).
269
+ ################################################################################
270
+
271
+ resource "aws_route53_record" "app_alias_a" {
272
+ count = local.cert_enabled ? 1 : 0
273
+
274
+ zone_id = aws_route53_zone.customer[0].zone_id
275
+ name = var.customer_domain
276
+ type = "A"
277
+
278
+ allow_overwrite = true
279
+
280
+ alias {
281
+ name = var.app_distribution_domain_name
282
+ zone_id = local.cloudfront_hosted_zone_id
283
+ evaluate_target_health = false
284
+ }
285
+ }
286
+
287
+ resource "aws_route53_record" "app_alias_aaaa" {
288
+ count = local.cert_enabled ? 1 : 0
289
+
290
+ zone_id = aws_route53_zone.customer[0].zone_id
291
+ name = var.customer_domain
292
+ type = "AAAA"
293
+
294
+ allow_overwrite = true
295
+
296
+ alias {
297
+ name = var.app_distribution_domain_name
298
+ zone_id = local.cloudfront_hosted_zone_id
299
+ evaluate_target_health = false
300
+ }
301
+ }
302
+
303
+ ################################################################################
304
+ # SES identity — send (DKIM + custom MAIL FROM) for the customer domain
305
+ #
306
+ # Everything here gates on ses_enabled (= customer_domain set), NOT on the
307
+ # delegation gate: the DNS answers only become publicly resolvable once the
308
+ # NS hop lands, and SES verification flips to Success on its next poll after
309
+ # that (subject to the ~72h expiry documented in the header).
310
+ ################################################################################
311
+
312
+ resource "aws_ses_domain_identity" "customer" {
313
+ count = local.ses_enabled ? 1 : 0
314
+ domain = var.customer_domain
315
+ }
316
+
317
+ resource "aws_route53_record" "ses_verification" {
318
+ count = local.ses_enabled ? 1 : 0
319
+ zone_id = aws_route53_zone.customer[0].zone_id
320
+ name = "_amazonses.${var.customer_domain}"
321
+ type = "TXT"
322
+ ttl = 600
323
+ records = [aws_ses_domain_identity.customer[0].verification_token]
324
+ }
325
+
326
+ resource "aws_ses_domain_dkim" "customer" {
327
+ count = local.ses_enabled ? 1 : 0
328
+ domain = aws_ses_domain_identity.customer[0].domain
329
+ }
330
+
331
+ # Plan-time-known count (3 DKIM tokens always) — never derived from the
332
+ # dkim_tokens attribute, which is unknown until apply.
333
+ resource "aws_route53_record" "dkim" {
334
+ count = local.ses_enabled ? 3 : 0
335
+ zone_id = aws_route53_zone.customer[0].zone_id
336
+ name = "${aws_ses_domain_dkim.customer[0].dkim_tokens[count.index]}._domainkey.${var.customer_domain}"
337
+ type = "CNAME"
338
+ ttl = 600
339
+ records = ["${aws_ses_domain_dkim.customer[0].dkim_tokens[count.index]}.dkim.amazonses.com"]
340
+ }
341
+
342
+ # Custom MAIL FROM so the envelope sender (Return-Path) lives under the
343
+ # customer domain instead of amazonses.com — SPF-aligned DMARC passes.
344
+ resource "aws_ses_domain_mail_from" "customer" {
345
+ count = local.ses_enabled ? 1 : 0
346
+ domain = aws_ses_domain_identity.customer[0].domain
347
+ mail_from_domain = local.mail_from_domain
348
+
349
+ # Fall back to amazonses.com if the MAIL FROM MX ever fails to resolve
350
+ # (e.g. pre-delegation) rather than rejecting the send outright.
351
+ behavior_on_mx_failure = "UseDefaultValue"
352
+ }
353
+
354
+ resource "aws_route53_record" "mail_from_mx" {
355
+ count = local.ses_enabled ? 1 : 0
356
+ zone_id = aws_route53_zone.customer[0].zone_id
357
+ name = local.mail_from_domain
358
+ type = "MX"
359
+ ttl = 600
360
+ records = ["10 feedback-smtp.${var.region}.amazonses.com"]
361
+ }
362
+
363
+ resource "aws_route53_record" "mail_from_spf" {
364
+ count = local.ses_enabled ? 1 : 0
365
+ zone_id = aws_route53_zone.customer[0].zone_id
366
+ name = local.mail_from_domain
367
+ type = "TXT"
368
+ ttl = 600
369
+ records = ["v=spf1 include:amazonses.com ~all"]
370
+ }
371
+
372
+ # DMARC: monitoring-only to start (p=none). Tightening to quarantine/reject
373
+ # is a deliberate later step once sending reputation is established.
374
+ # Precondition pinned in the plan (resolved 2026-06-12): the thinkwork.ai
375
+ # apex publishes NO DMARC record, so no sp= policy overrides this one.
376
+ resource "aws_route53_record" "dmarc" {
377
+ count = local.ses_enabled ? 1 : 0
378
+ zone_id = aws_route53_zone.customer[0].zone_id
379
+ name = "_dmarc.${var.customer_domain}"
380
+ type = "TXT"
381
+ ttl = 600
382
+ records = ["v=DMARC1; p=none"]
383
+ }
384
+
385
+ ################################################################################
386
+ # SES receive — inbound MX + receipt rule set → S3 + email-inbound Lambda
387
+ #
388
+ # KTD6 (see header): in customer accounts this module is the single owner of
389
+ # rule-set mutation — it creates AND activates its own rule set. In any
390
+ # account where the ses-email module is enabled, the caller passes
391
+ # manage_active_rule_set = false so the ses-email set stays active.
392
+ ################################################################################
393
+
394
+ resource "aws_route53_record" "inbound_mx" {
395
+ count = local.ses_enabled ? 1 : 0
396
+ zone_id = aws_route53_zone.customer[0].zone_id
397
+ name = var.customer_domain
398
+ type = "MX"
399
+ ttl = 600
400
+ records = ["10 ${local.inbound_smtp}"]
401
+ }
402
+
403
+ resource "aws_ses_receipt_rule_set" "customer" {
404
+ count = local.ses_enabled ? 1 : 0
405
+ rule_set_name = local.rule_set_name
406
+ }
407
+
408
+ resource "aws_ses_active_receipt_rule_set" "customer" {
409
+ count = local.ses_enabled && var.manage_active_rule_set ? 1 : 0
410
+ rule_set_name = aws_ses_receipt_rule_set.customer[0].rule_set_name
411
+ }
412
+
413
+ # Distinct statement_id from ses-email's AllowSESInvokeEmailInbound so the
414
+ # two permissions can coexist on the same function in a shared account.
415
+ resource "aws_lambda_permission" "ses_invoke_email_inbound" {
416
+ count = local.has_lambda ? 1 : 0
417
+ statement_id = "AllowSESInvokeEmailInboundCustomerDomain"
418
+ action = "lambda:InvokeFunction"
419
+ function_name = var.email_inbound_fn_name
420
+ principal = "ses.amazonaws.com"
421
+ source_account = var.account_id
422
+ }
423
+
424
+ # Domain-level recipient: matches every address at the customer domain
425
+ # (agent@tei.thinkwork.ai, space addresses, …) — routing past this point is
426
+ # the email-inbound Lambda's lookup logic, not per-address SES rules.
427
+ resource "aws_ses_receipt_rule" "inbound" {
428
+ count = local.ses_enabled ? 1 : 0
429
+ name = "thinkwork-${var.stage}-customer-domain-inbound-email"
430
+ rule_set_name = aws_ses_receipt_rule_set.customer[0].rule_set_name
431
+ recipients = [var.customer_domain]
432
+ enabled = true
433
+ scan_enabled = true
434
+
435
+ dynamic "s3_action" {
436
+ for_each = local.has_bucket ? [1] : []
437
+ content {
438
+ bucket_name = var.inbound_bucket_name
439
+ object_key_prefix = "email/inbound/"
440
+ position = 1
441
+ }
442
+ }
443
+
444
+ dynamic "lambda_action" {
445
+ for_each = local.has_lambda ? [1] : []
446
+ content {
447
+ function_arn = var.email_inbound_fn_arn
448
+ invocation_type = "Event"
449
+ position = local.has_bucket ? 2 : 1
450
+ }
451
+ }
452
+
453
+ depends_on = [aws_lambda_permission.ses_invoke_email_inbound]
454
+ }
455
+
456
+ ################################################################################
457
+ # Outputs
458
+ ################################################################################
459
+
460
+ output "zone_id" {
461
+ description = "Route53 hosted zone ID for the customer domain (empty when no domain is configured)"
462
+ value = local.zone_enabled ? aws_route53_zone.customer[0].zone_id : ""
463
+ }
464
+
465
+ output "name_servers" {
466
+ description = "The four Route53 name servers for the customer zone — phase-two input for the claim tool's `claim --set-targets` (empty when no domain is configured)"
467
+ value = local.zone_enabled ? aws_route53_zone.customer[0].name_servers : []
468
+ }
469
+
470
+ output "certificate_arn" {
471
+ description = "Validated ACM certificate ARN for the customer domain (us-east-1; empty until customer_domain_delegated is true and validation succeeds)"
472
+ value = local.cert_enabled ? aws_acm_certificate_validation.customer[0].certificate_arn : ""
473
+ }
474
+
475
+ output "ses_identity_arn" {
476
+ description = "SES domain identity ARN for the customer domain (empty when no domain is configured). Candidate cognito_email_source_arn value — switching Cognito email to it is an operator action taken only after the identity verifies and SES production access is granted (R11), never automatic."
477
+ value = local.ses_enabled ? aws_ses_domain_identity.customer[0].arn : ""
478
+ }
479
+
480
+ output "rule_set_name" {
481
+ description = "SES receipt rule set name owned by this module (empty when no domain is configured). Active only when manage_active_rule_set is true — see the KTD6 note in the module header."
482
+ value = local.ses_enabled ? aws_ses_receipt_rule_set.customer[0].rule_set_name : ""
483
+ }
@@ -0,0 +1,47 @@
1
+ # Deployment Control Plane
2
+
3
+ AWS-native substrate for GitHub-free ThinkWork deployments.
4
+
5
+ This module provisions the durable control plane for customer-owned deployments:
6
+
7
+ - Step Functions state machine for deployment orchestration.
8
+ - CodeBuild project with a release-pinned Terraform runner.
9
+ - S3 evidence bucket for logs, plans, approvals, and smoke artifacts.
10
+ - CloudWatch log groups for runner and state-machine history.
11
+ - AppConfig application/environment/profile for non-secret deployment config.
12
+ - SSM parameters for stable selected-release metadata.
13
+ - Secrets Manager placeholder containers for bootstrap-managed secrets.
14
+
15
+ The runner accepts Step Functions input and writes evidence to
16
+ `sessions/<session>/<action>/deployment-evidence.json`. For platform
17
+ deployment actions it downloads the selected release manifest, stages release
18
+ Lambda artifacts into the customer-owned artifact bucket, runs Terraform
19
+ against the ThinkWork composite module, publishes static site bundles, and
20
+ writes deployment profile pointers under `/thinkwork/<stage>/deployment`.
21
+
22
+ For routine web-only redeploys, use controller action `web`. The runner
23
+ downloads and verifies the selected release manifest, materializes only the
24
+ `web` static-site artifact, reads the existing app bucket/distribution outputs
25
+ from Terraform state, syncs the web bundle, invalidates CloudFront, and records
26
+ evidence. It does not run Terraform init/plan/apply, stage Lambda artifacts,
27
+ copy runtime images, run database migrations, or update AgentCore runtimes.
28
+
29
+ Full deploy/update plans fail closed when they would delete customer-domain
30
+ resources or remove web CloudFront aliases unless
31
+ `allowCustomerDomainRemoval=true` is set for an intentional reviewed retirement.
32
+
33
+ Platform deploys stay on the root Terraform state key:
34
+ `thinkwork/<stage>/terraform.tfstate`.
35
+
36
+ Targeted managed-application operations are controller-owned. Before the
37
+ managed-app state migration, they continue to use the root backend so existing
38
+ state remains authoritative. After a reviewed `terraform state mv`/import
39
+ migration for an app, set `THINKWORK_MANAGED_APP_STATE_ISOLATION=true` or pass
40
+ `features.managedAppStateIsolation=true` for that app operation. The runner
41
+ then uses `thinkwork/<stage>/managed-apps/<appKey>/terraform.tfstate` and the
42
+ default Terraform workspace, giving the app an independent S3 object and lock
43
+ scope.
44
+
45
+ Do not enable per-app state isolation for a live app until its resources have
46
+ been moved out of root state and the per-app plan is verified no-op. Otherwise
47
+ Terraform will see an empty app state and attempt to recreate resources.
@@ -0,0 +1,24 @@
1
+ version: 0.2
2
+
3
+ phases:
4
+ install:
5
+ commands:
6
+ - |
7
+ if ! command -v terraform >/dev/null 2>&1; then
8
+ curl -fsSLo /tmp/terraform.zip https://releases.hashicorp.com/terraform/1.8.5/terraform_1.8.5_linux_amd64.zip
9
+ unzip -oq /tmp/terraform.zip -d /usr/local/bin
10
+ fi
11
+ if ! command -v psql >/dev/null 2>&1; then
12
+ if command -v apt-get >/dev/null 2>&1; then
13
+ apt-get update
14
+ apt-get install -y postgresql-client
15
+ elif command -v yum >/dev/null 2>&1; then
16
+ yum install -y postgresql15
17
+ fi
18
+ fi
19
+ - terraform version
20
+ - psql --version
21
+ build:
22
+ commands:
23
+ - aws s3 cp "$THINKWORK_RUNNER_SCRIPT_S3_URI" /tmp/thinkwork-runner.py
24
+ - python3 /tmp/thinkwork-runner.py