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
@@ -9,12 +9,19 @@
9
9
  locals {
10
10
  create = var.create_cognito
11
11
  create_pre_signup = local.create && var.pre_signup_lambda_zip != ""
12
+ create_custom_auth = local.create && var.custom_auth_lambda_zip != ""
12
13
 
13
- user_pool_id = local.create ? aws_cognito_user_pool.main[0].id : var.existing_user_pool_id
14
- user_pool_arn = local.create ? aws_cognito_user_pool.main[0].arn : var.existing_user_pool_arn
15
- admin_client_id = local.create ? aws_cognito_user_pool_client.admin[0].id : var.existing_admin_client_id
14
+ user_pool_id = local.create ? aws_cognito_user_pool.main[0].id : var.existing_user_pool_id
15
+ user_pool_arn = local.create ? aws_cognito_user_pool.main[0].arn : var.existing_user_pool_arn
16
+ admin_client_id = local.create ? aws_cognito_user_pool_client.admin[0].id : var.existing_admin_client_id
16
17
  mobile_client_id = local.create ? aws_cognito_user_pool_client.mobile[0].id : var.existing_mobile_client_id
17
- identity_pool_id = local.create ? aws_cognito_identity_pool.main[0].id : var.existing_identity_pool_id
18
+ identity_pool_id = local.create ? aws_cognito_identity_pool.main[0].id : var.existing_identity_pool_id
19
+ oidc_identity_providers = {
20
+ for provider in var.oidc_identity_providers : provider.provider_name => provider
21
+ }
22
+ saml_identity_providers = {
23
+ for provider in var.saml_identity_providers : provider.provider_name => provider
24
+ }
18
25
  }
19
26
 
20
27
  data "aws_caller_identity" "current" {}
@@ -84,6 +91,64 @@ resource "aws_lambda_permission" "cognito_pre_signup" {
84
91
  source_arn = aws_cognito_user_pool.main[0].arn
85
92
  }
86
93
 
94
+ ################################################################################
95
+ # Custom Auth Challenge Lambda
96
+ ################################################################################
97
+
98
+ resource "aws_iam_role" "custom_auth" {
99
+ count = local.create_custom_auth ? 1 : 0
100
+ name = "thinkwork-${var.stage}-cognito-custom-auth-role"
101
+
102
+ assume_role_policy = jsonencode({
103
+ Version = "2012-10-17"
104
+ Statement = [{
105
+ Effect = "Allow"
106
+ Principal = { Service = "lambda.amazonaws.com" }
107
+ Action = "sts:AssumeRole"
108
+ }]
109
+ })
110
+ }
111
+
112
+ resource "aws_iam_role_policy_attachment" "custom_auth_basic" {
113
+ count = local.create_custom_auth ? 1 : 0
114
+ role = aws_iam_role.custom_auth[0].name
115
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
116
+ }
117
+
118
+ resource "aws_lambda_function" "custom_auth" {
119
+ count = local.create_custom_auth ? 1 : 0
120
+ function_name = "thinkwork-${var.stage}-cognito-custom-auth"
121
+ filename = var.custom_auth_lambda_zip
122
+ handler = "index.handler"
123
+ runtime = "nodejs20.x"
124
+ timeout = 10
125
+ role = aws_iam_role.custom_auth[0].arn
126
+
127
+ environment {
128
+ variables = {
129
+ API_AUTH_SECRET = var.api_auth_secret
130
+ }
131
+ }
132
+
133
+ source_code_hash = filebase64sha256(var.custom_auth_lambda_zip)
134
+
135
+ lifecycle {
136
+ precondition {
137
+ condition = var.api_auth_secret != ""
138
+ error_message = "custom_auth_lambda_zip requires api_auth_secret so Cognito custom-auth challenges can be verified."
139
+ }
140
+ }
141
+ }
142
+
143
+ resource "aws_lambda_permission" "cognito_custom_auth" {
144
+ count = local.create_custom_auth ? 1 : 0
145
+ statement_id = "AllowCognitoInvoke"
146
+ action = "lambda:InvokeFunction"
147
+ function_name = aws_lambda_function.custom_auth[0].function_name
148
+ principal = "cognito-idp.amazonaws.com"
149
+ source_arn = aws_cognito_user_pool.main[0].arn
150
+ }
151
+
87
152
  ################################################################################
88
153
  # User Pool
89
154
  ################################################################################
@@ -95,6 +160,23 @@ resource "aws_cognito_user_pool" "main" {
95
160
  username_attributes = ["email"]
96
161
  auto_verified_attributes = ["email"]
97
162
 
163
+ email_configuration {
164
+ email_sending_account = var.email_source_arn != "" ? "DEVELOPER" : "COGNITO_DEFAULT"
165
+ source_arn = var.email_source_arn != "" ? var.email_source_arn : null
166
+ from_email_address = var.from_email_address != "" ? var.from_email_address : null
167
+ reply_to_email_address = var.reply_to_email_address != "" ? var.reply_to_email_address : null
168
+ }
169
+
170
+ admin_create_user_config {
171
+ allow_admin_create_user_only = false
172
+
173
+ invite_message_template {
174
+ email_subject = var.invite_email_subject
175
+ email_message = var.invite_email_message
176
+ sms_message = var.invite_sms_message
177
+ }
178
+ }
179
+
98
180
  schema {
99
181
  name = "email"
100
182
  attribute_data_type = "String"
@@ -136,9 +218,12 @@ resource "aws_cognito_user_pool" "main" {
136
218
  }
137
219
 
138
220
  dynamic "lambda_config" {
139
- for_each = local.create_pre_signup ? [1] : []
221
+ for_each = local.create_pre_signup || local.create_custom_auth ? [1] : []
140
222
  content {
141
- pre_sign_up = aws_lambda_function.pre_signup[0].arn
223
+ pre_sign_up = local.create_pre_signup ? aws_lambda_function.pre_signup[0].arn : null
224
+ define_auth_challenge = local.create_custom_auth ? aws_lambda_function.custom_auth[0].arn : null
225
+ create_auth_challenge = local.create_custom_auth ? aws_lambda_function.custom_auth[0].arn : null
226
+ verify_auth_challenge_response = local.create_custom_auth ? aws_lambda_function.custom_auth[0].arn : null
142
227
  }
143
228
  }
144
229
 
@@ -148,6 +233,11 @@ resource "aws_cognito_user_pool" "main" {
148
233
 
149
234
  lifecycle {
150
235
  ignore_changes = [schema]
236
+
237
+ precondition {
238
+ condition = var.from_email_address == "" || var.email_source_arn != ""
239
+ error_message = "from_email_address requires email_source_arn so Cognito can use a verified SES identity."
240
+ }
151
241
  }
152
242
  }
153
243
 
@@ -191,7 +281,57 @@ resource "aws_cognito_identity_provider" "google" {
191
281
  }
192
282
 
193
283
  locals {
194
- identity_providers = var.google_oauth_client_id != "" ? ["Google", "COGNITO"] : ["COGNITO"]
284
+ identity_providers = concat(
285
+ var.google_oauth_client_id != "" ? ["Google"] : [],
286
+ keys(local.oidc_identity_providers),
287
+ keys(local.saml_identity_providers),
288
+ ["COGNITO"]
289
+ )
290
+ }
291
+
292
+ resource "aws_cognito_identity_provider" "oidc" {
293
+ for_each = local.create ? local.oidc_identity_providers : {}
294
+
295
+ user_pool_id = aws_cognito_user_pool.main[0].id
296
+ provider_name = each.value.provider_name
297
+ provider_type = "OIDC"
298
+
299
+ provider_details = merge(
300
+ {
301
+ client_id = each.value.client_id
302
+ client_secret = each.value.client_secret
303
+ authorize_scopes = each.value.authorize_scopes
304
+ oidc_issuer = each.value.issuer_url
305
+ token_request_method = "POST"
306
+ attributes_request_method = "GET"
307
+ },
308
+ each.value.authorize_url != "" ? { authorize_url = each.value.authorize_url } : {},
309
+ each.value.token_url != "" ? { token_url = each.value.token_url } : {},
310
+ each.value.attributes_url != "" ? { attributes_url = each.value.attributes_url } : {},
311
+ each.value.jwks_uri != "" ? { jwks_uri = each.value.jwks_uri } : {}
312
+ )
313
+
314
+ attribute_mapping = {
315
+ email = each.value.attribute_mapping.email
316
+ name = each.value.attribute_mapping.name
317
+ username = each.value.attribute_mapping.username
318
+ }
319
+ }
320
+
321
+ resource "aws_cognito_identity_provider" "saml" {
322
+ for_each = local.create ? local.saml_identity_providers : {}
323
+
324
+ user_pool_id = aws_cognito_user_pool.main[0].id
325
+ provider_name = each.value.provider_name
326
+ provider_type = "SAML"
327
+ idp_identifiers = each.value.idp_identifiers
328
+ provider_details = { MetadataURL = each.value.metadata_url }
329
+
330
+ attribute_mapping = {
331
+ email = each.value.attribute_mapping.email
332
+ name = each.value.attribute_mapping.name
333
+ username = each.value.attribute_mapping.username
334
+ }
195
335
  }
196
336
 
197
337
  ################################################################################
@@ -207,10 +347,17 @@ resource "aws_cognito_user_pool_client" "admin" {
207
347
  allowed_oauth_flows = ["code"]
208
348
  allowed_oauth_scopes = ["openid", "email", "profile"]
209
349
 
350
+ explicit_auth_flows = [
351
+ "ALLOW_CUSTOM_AUTH",
352
+ "ALLOW_REFRESH_TOKEN_AUTH",
353
+ "ALLOW_USER_PASSWORD_AUTH",
354
+ "ALLOW_USER_SRP_AUTH",
355
+ ]
356
+
210
357
  supported_identity_providers = local.identity_providers
211
358
 
212
- callback_urls = var.admin_callback_urls
213
- logout_urls = var.admin_logout_urls
359
+ callback_urls = distinct(concat(var.admin_callback_urls, var.desktop_callback_urls))
360
+ logout_urls = distinct(concat(var.admin_logout_urls, var.desktop_callback_urls))
214
361
 
215
362
  access_token_validity = 1
216
363
  id_token_validity = 1
@@ -235,7 +382,11 @@ resource "aws_cognito_user_pool_client" "admin" {
235
382
  "custom:tenant_id",
236
383
  ]
237
384
 
238
- depends_on = [aws_cognito_identity_provider.google]
385
+ depends_on = [
386
+ aws_cognito_identity_provider.google,
387
+ aws_cognito_identity_provider.oidc,
388
+ aws_cognito_identity_provider.saml,
389
+ ]
239
390
  }
240
391
 
241
392
  ################################################################################
@@ -248,6 +399,7 @@ resource "aws_cognito_user_pool_client" "mobile" {
248
399
  user_pool_id = aws_cognito_user_pool.main[0].id
249
400
 
250
401
  explicit_auth_flows = [
402
+ "ALLOW_CUSTOM_AUTH",
251
403
  "ALLOW_USER_PASSWORD_AUTH",
252
404
  "ALLOW_USER_SRP_AUTH",
253
405
  "ALLOW_REFRESH_TOKEN_AUTH",
@@ -285,7 +437,11 @@ resource "aws_cognito_user_pool_client" "mobile" {
285
437
  "custom:tenant_id",
286
438
  ]
287
439
 
288
- depends_on = [aws_cognito_identity_provider.google]
440
+ depends_on = [
441
+ aws_cognito_identity_provider.google,
442
+ aws_cognito_identity_provider.oidc,
443
+ aws_cognito_identity_provider.saml,
444
+ ]
289
445
  }
290
446
 
291
447
  ################################################################################
@@ -27,3 +27,8 @@ output "auth_domain" {
27
27
  description = "Cognito hosted UI domain (only available when create_cognito = true)"
28
28
  value = local.create ? aws_cognito_user_pool_domain.main[0].domain : null
29
29
  }
30
+
31
+ output "identity_provider_names" {
32
+ description = "Supported Cognito identity providers for created app clients."
33
+ value = local.identity_providers
34
+ }
@@ -58,6 +58,57 @@ variable "user_pool_name" {
58
58
  default = ""
59
59
  }
60
60
 
61
+ variable "email_source_arn" {
62
+ description = "SES identity ARN Cognito should use for user-pool emails. Leave empty to use Cognito's default sender."
63
+ type = string
64
+ default = ""
65
+ }
66
+
67
+ variable "from_email_address" {
68
+ description = "Optional Cognito From header, for example 'ThinkWork <noreply@example.com>'. Requires email_source_arn when set."
69
+ type = string
70
+ default = ""
71
+ }
72
+
73
+ variable "reply_to_email_address" {
74
+ description = "Optional Cognito Reply-To address for user-pool emails."
75
+ type = string
76
+ default = ""
77
+ }
78
+
79
+ variable "invite_email_subject" {
80
+ description = "Subject line for Cognito AdminCreateUser invitation emails."
81
+ type = string
82
+ default = "You're invited to ThinkWork"
83
+ }
84
+
85
+ variable "invite_email_message" {
86
+ description = "HTML invitation body for Cognito AdminCreateUser emails. Must include {username} and {####} so Cognito can send the temporary password."
87
+ type = string
88
+ default = <<-EOT
89
+ <p>You have been invited to ThinkWork.</p>
90
+ <p>Username: <strong>{username}</strong></p>
91
+ <p>Temporary password: <strong>{####}</strong></p>
92
+ <p>Sign in to your ThinkWork environment to finish setup.</p>
93
+ EOT
94
+
95
+ validation {
96
+ condition = strcontains(var.invite_email_message, "{username}") && strcontains(var.invite_email_message, "{####}")
97
+ error_message = "invite_email_message must include Cognito placeholders {username} and {####}."
98
+ }
99
+ }
100
+
101
+ variable "invite_sms_message" {
102
+ description = "SMS invitation body for Cognito AdminCreateUser messages. Must include {username} and {####} so Cognito can send the temporary password."
103
+ type = string
104
+ default = "Your ThinkWork username is {username} and temporary password is {####}."
105
+
106
+ validation {
107
+ condition = strcontains(var.invite_sms_message, "{username}") && strcontains(var.invite_sms_message, "{####}")
108
+ error_message = "invite_sms_message must include Cognito placeholders {username} and {####}."
109
+ }
110
+ }
111
+
61
112
  variable "identity_pool_name" {
62
113
  description = "Override the identity pool name (defaults to thinkwork-<stage>-identity-pool)"
63
114
  type = string
@@ -77,12 +128,61 @@ variable "google_oauth_client_secret" {
77
128
  default = ""
78
129
  }
79
130
 
131
+ variable "oidc_identity_providers" {
132
+ description = "Additional Cognito OIDC identity providers. Secrets should be sourced from Secrets Manager/SSM by the caller, not committed to tfvars."
133
+ type = list(object({
134
+ provider_name = string
135
+ client_id = string
136
+ client_secret = string
137
+ issuer_url = string
138
+ authorize_scopes = optional(string, "openid email profile")
139
+ authorize_url = optional(string, "")
140
+ token_url = optional(string, "")
141
+ attributes_url = optional(string, "")
142
+ jwks_uri = optional(string, "")
143
+ attribute_mapping = optional(object({
144
+ email = optional(string, "email")
145
+ name = optional(string, "name")
146
+ username = optional(string, "sub")
147
+ }), {})
148
+ }))
149
+ default = []
150
+ }
151
+
152
+ variable "saml_identity_providers" {
153
+ description = "Additional Cognito SAML identity providers. Metadata URLs must be public HTTPS endpoints validated before Terraform."
154
+ type = list(object({
155
+ provider_name = string
156
+ metadata_url = string
157
+ idp_identifiers = optional(list(string), [])
158
+ attribute_mapping = optional(object({
159
+ email = optional(string, "email")
160
+ name = optional(string, "name")
161
+ username = optional(string, "NameID")
162
+ }), {})
163
+ }))
164
+ default = []
165
+ }
166
+
80
167
  variable "pre_signup_lambda_zip" {
81
168
  description = "Path to the pre-signup Lambda zip file"
82
169
  type = string
83
170
  default = ""
84
171
  }
85
172
 
173
+ variable "custom_auth_lambda_zip" {
174
+ description = "Path to the Cognito custom-auth challenge Lambda zip file"
175
+ type = string
176
+ default = ""
177
+ }
178
+
179
+ variable "api_auth_secret" {
180
+ description = "Shared signing secret used by the custom-auth challenge Lambda"
181
+ type = string
182
+ sensitive = true
183
+ default = ""
184
+ }
185
+
86
186
  # ---------------------------------------------------------------------------
87
187
  # Callback URLs (configurable per deployment)
88
188
  # ---------------------------------------------------------------------------
@@ -106,6 +206,16 @@ variable "admin_logout_urls" {
106
206
  ]
107
207
  }
108
208
 
209
+ variable "desktop_callback_urls" {
210
+ description = "OAuth callback and logout URLs for the desktop client that reuses the ThinkworkAdmin public Cognito client."
211
+ type = list(string)
212
+ default = [
213
+ "thinkwork://oauth/callback",
214
+ "thinkwork-dev://oauth/callback",
215
+ "thinkwork-canary://oauth/callback",
216
+ ]
217
+ }
218
+
109
219
  variable "mobile_callback_urls" {
110
220
  description = "OAuth callback URLs for the mobile client. Host apps that embed the SDK register their own deep-link here. Proper per-host app client isolation is 0.3.0 work — this is the stopgap capture of the drift from the CLI-applied URIs."
111
221
  type = list(string)
@@ -6,9 +6,12 @@
6
6
  ################################################################################
7
7
 
8
8
  locals {
9
- vpc_id = var.create_vpc ? aws_vpc.main[0].id : var.existing_vpc_id
10
- public_subnet_ids = var.create_vpc ? [aws_subnet.public[0].id, aws_subnet.public[1].id] : var.existing_public_subnet_ids
11
- private_subnet_ids = var.create_vpc ? [aws_subnet.private[0].id, aws_subnet.private[1].id] : var.existing_private_subnet_ids
9
+ vpc_id = var.create_vpc ? aws_vpc.main[0].id : var.existing_vpc_id
10
+ public_subnet_ids = var.create_vpc ? [aws_subnet.public[0].id, aws_subnet.public[1].id] : var.existing_public_subnet_ids
11
+ private_subnet_ids = var.create_vpc ? [aws_subnet.private[0].id, aws_subnet.private[1].id] : var.existing_private_subnet_ids
12
+ public_route_table_ids = var.create_vpc ? aws_route_table.public[*].id : var.existing_public_route_table_ids
13
+ private_route_table_ids = var.create_vpc ? aws_route_table.private[*].id : var.existing_private_route_table_ids
14
+ nat_gateway_enabled = var.enable_nat_gateway && length(local.public_subnet_ids) > 0 && length(local.private_route_table_ids) > 0
12
15
  }
13
16
 
14
17
  ################################################################################
@@ -122,6 +125,45 @@ resource "aws_route_table_association" "private" {
122
125
  route_table_id = aws_route_table.private[count.index].id
123
126
  }
124
127
 
128
+ ################################################################################
129
+ # Optional NAT Gateway
130
+ ################################################################################
131
+
132
+ resource "aws_eip" "nat" {
133
+ count = local.nat_gateway_enabled ? 1 : 0
134
+
135
+ domain = "vpc"
136
+
137
+ tags = {
138
+ Name = "thinkwork-${var.stage}-nat-eip"
139
+ }
140
+ }
141
+
142
+ resource "aws_nat_gateway" "main" {
143
+ count = local.nat_gateway_enabled ? 1 : 0
144
+
145
+ allocation_id = aws_eip.nat[0].id
146
+ subnet_id = local.public_subnet_ids[0]
147
+
148
+ tags = {
149
+ Name = "thinkwork-${var.stage}-nat"
150
+ }
151
+
152
+ depends_on = [aws_internet_gateway.main]
153
+ }
154
+
155
+ resource "aws_route" "private_nat" {
156
+ # Keyed by static index, not route-table ID: created-in-this-apply IDs are
157
+ # unknown at plan time and break the FIRST apply in a fresh account
158
+ # ("Invalid for_each argument" — THINK-118 harness cycle 4). Existing states
159
+ # re-address these routes on the next apply (brief default-route recreate).
160
+ count = local.nat_gateway_enabled ? (var.create_vpc ? length(var.availability_zones) : length(var.existing_private_route_table_ids)) : 0
161
+
162
+ route_table_id = local.private_route_table_ids[count.index]
163
+ destination_cidr_block = "0.0.0.0/0"
164
+ nat_gateway_id = aws_nat_gateway.main[0].id
165
+ }
166
+
125
167
  ################################################################################
126
168
  # Default Route Table
127
169
  ################################################################################
@@ -12,3 +12,23 @@ output "private_subnet_ids" {
12
12
  description = "IDs of the private subnets (created or existing)"
13
13
  value = local.private_subnet_ids
14
14
  }
15
+
16
+ output "public_route_table_ids" {
17
+ description = "IDs of the public route tables (created or existing)"
18
+ value = local.public_route_table_ids
19
+ }
20
+
21
+ output "private_route_table_ids" {
22
+ description = "IDs of the private route tables (created or existing)"
23
+ value = local.private_route_table_ids
24
+ }
25
+
26
+ output "nat_gateway_id" {
27
+ description = "NAT Gateway ID when enable_nat_gateway is true and route tables are available"
28
+ value = local.nat_gateway_enabled ? aws_nat_gateway.main[0].id : null
29
+ }
30
+
31
+ output "vpc_cidr_block" {
32
+ description = "The VPC's CIDR block (for endpoint/SG rules that must admit the whole VPC)"
33
+ value = var.cidr_block
34
+ }
@@ -27,6 +27,24 @@ variable "existing_private_subnet_ids" {
27
27
  default = []
28
28
  }
29
29
 
30
+ variable "existing_public_route_table_ids" {
31
+ description = "IDs of existing public route tables (recommended when create_vpc = false)"
32
+ type = list(string)
33
+ default = []
34
+ }
35
+
36
+ variable "existing_private_route_table_ids" {
37
+ description = "IDs of existing private route tables (recommended when create_vpc = false)"
38
+ type = list(string)
39
+ default = []
40
+ }
41
+
42
+ variable "enable_nat_gateway" {
43
+ description = "Create a NAT Gateway and default routes from private route tables for private subnet egress."
44
+ type = bool
45
+ default = false
46
+ }
47
+
30
48
  variable "cidr_block" {
31
49
  description = "CIDR block for the VPC (only used when create_vpc = true)"
32
50
  type = string
@@ -0,0 +1,71 @@
1
+ # `thinkwork` — Composite Root Module
2
+
3
+ Wires the three tiers (foundation → data → app) together with sensible defaults.
4
+ Published to the Terraform Registry as `thinkwork-ai/thinkwork/aws`.
5
+
6
+ For advanced composition, use the sub-modules directly:
7
+
8
+ ```hcl
9
+ source = "thinkwork-ai/thinkwork/aws//modules/foundation/vpc"
10
+ ```
11
+
12
+ ## Breaking change — required provider alias
13
+
14
+ **As of the customer-domain namespace feature**, this module unconditionally declares:
15
+
16
+ ```hcl
17
+ configuration_aliases = [aws.us_east_1]
18
+ ```
19
+
20
+ Every root module that calls `thinkwork-ai/thinkwork/aws` **must** declare the aliased
21
+ provider and pass it through, even when `customer_domain` is left empty:
22
+
23
+ ```hcl
24
+ provider "aws" {
25
+ alias = "us_east_1"
26
+ region = "us-east-1"
27
+ }
28
+
29
+ module "thinkwork" {
30
+ source = "thinkwork-ai/thinkwork/aws"
31
+
32
+ providers = {
33
+ aws.us_east_1 = aws.us_east_1
34
+ }
35
+
36
+ # ... other inputs ...
37
+ }
38
+ ```
39
+
40
+ **Rationale:** CloudFront ACM certificates must be created in `us-east-1` regardless
41
+ of the deployment region. Because `configuration_aliases` is declared unconditionally,
42
+ Terraform validates the alias at `init`/`plan` time for all callers — not only those
43
+ who set `customer_domain`.
44
+
45
+ ## Usage
46
+
47
+ See `terraform/examples/greenfield/` for a full working example.
48
+
49
+ ## Inputs
50
+
51
+ See `variables.tf` for the full list with descriptions and defaults. Key optional
52
+ feature flags:
53
+
54
+ | Variable | Default | Purpose |
55
+ | -------------------------------- | ------- | ------------------------------------------------------------------ |
56
+ | `customer_domain` | `""` | Customer-namespace domain (e.g. `tei.thinkwork.ai`). Empty = skip. |
57
+ | `customer_domain_delegated` | `false` | Phase-two gate — flip once NS delegation resolves. |
58
+ | `customer_domain_legacy_retired` | `false` | Retirement gate — removes legacy Cognito callbacks after cutover. |
59
+ | `enable_hindsight` | `true` | Provisions Hindsight canonical user and Space memory. |
60
+ | `enable_cognee` | `false` | Provisions optional Cognee Brain ontology/graph infrastructure. |
61
+ | `www_domain` | `""` | Public website apex domain. Empty = CloudFront URL only. |
62
+
63
+ ## Outputs
64
+
65
+ See `outputs.tf` for the full list. Key customer-domain outputs:
66
+
67
+ | Output | Purpose |
68
+ | --------------------------------- | --------------------------------------------------------------------- |
69
+ | `customer_domain_name_servers` | Route53 NS records to publish via `claim --set-targets` (phase two). |
70
+ | `customer_domain_zone_id` | Route53 hosted zone ID for the customer domain. |
71
+ | `customer_domain_certificate_arn` | Validated ACM cert ARN (populated after `customer_domain_delegated`). |