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.
- package/README.md +42 -38
- package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
- package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
- package/dist/cli.js +23823 -10151
- package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
- package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
- package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
- package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
- package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
- package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
- package/dist/drizzle/0001_milky_surge.sql +103 -0
- package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
- package/dist/drizzle/0003_exotic_ogun.sql +3 -0
- package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
- package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
- package/dist/drizzle/0006_new_colonel_america.sql +2 -0
- package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
- package/dist/drizzle/0008_external_task_id_column.sql +43 -0
- package/dist/drizzle/0009_evaluations.sql +64 -0
- package/dist/drizzle/0010_eval_agent_template.sql +2 -0
- package/dist/drizzle/0011_eval_run_template.sql +2 -0
- package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
- package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
- package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
- package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
- package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
- package/dist/drizzle/0017_wiki_places.sql +46 -0
- package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
- package/dist/drizzle/0018_cool_firebird.sql +24 -0
- package/dist/drizzle/0018_skill_runs.sql +84 -0
- package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
- package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
- package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
- package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
- package/dist/drizzle/0021_crm_work_links.sql +76 -0
- package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
- package/dist/drizzle/0022_add_billing_tables.sql +70 -0
- package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
- package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
- package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
- package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
- package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
- package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
- package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
- package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
- package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
- package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
- package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
- package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
- package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
- package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
- package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
- package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
- package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
- package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
- package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
- package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
- package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
- package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
- package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
- package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
- package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
- package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
- package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
- package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
- package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
- package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
- package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
- package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
- package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
- package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
- package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
- package/dist/drizzle/0063_threads_session_data.sql +23 -0
- package/dist/drizzle/0064_tenant_credentials.sql +65 -0
- package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
- package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
- package/dist/drizzle/0069_compliance_schema.sql +364 -0
- package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
- package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
- package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
- package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
- package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
- package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
- package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
- package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
- package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
- package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
- package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
- package/dist/drizzle/0083_computer_runbooks.sql +103 -0
- package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
- package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
- package/dist/drizzle/0086_update_default_template_models.sql +19 -0
- package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
- package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
- package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
- package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
- package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
- package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
- package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
- package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
- package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
- package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
- package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
- package/dist/drizzle/0097_shared_computers.sql +191 -0
- package/dist/drizzle/0098_business_ontology.sql +587 -0
- package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
- package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
- package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
- package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
- package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
- package/dist/drizzle/0105_spaces_domain.sql +349 -0
- package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
- package/dist/drizzle/0106_space_threads_participants.sql +197 -0
- package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
- package/dist/drizzle/0108_message_mentions.sql +95 -0
- package/dist/drizzle/0109_space_owned_threads.sql +217 -0
- package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
- package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
- package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
- package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
- package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
- package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
- package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
- package/dist/drizzle/0117_space_access_mode.sql +40 -0
- package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
- package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
- package/dist/drizzle/0120_space_automations.sql +58 -0
- package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
- package/dist/drizzle/0122_space_email_triggers.sql +24 -0
- package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
- package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
- package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
- package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
- package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
- package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
- package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
- package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
- package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
- package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
- package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
- package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
- package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
- package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
- package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
- package/dist/drizzle/0136_goal_ledger.sql +55 -0
- package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
- package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
- package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
- package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
- package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
- package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
- package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
- package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
- package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
- package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
- package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
- package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
- package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
- package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
- package/dist/drizzle/0149_user_model_approvals.sql +89 -0
- package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
- package/dist/drizzle/0151_managed_deployments.sql +91 -0
- package/dist/drizzle/0152_agent_profiles.sql +81 -0
- package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
- package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
- package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
- package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
- package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
- package/dist/drizzle/0158_pending_user_questions.sql +80 -0
- package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
- package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
- package/dist/drizzle/0159_application_plugins.sql +193 -0
- package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
- package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
- package/dist/drizzle/0160_eval_datasets.sql +75 -0
- package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
- package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
- package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
- package/dist/drizzle/0162_eval_result_override.sql +49 -0
- package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
- package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
- package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
- package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
- package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
- package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
- package/dist/drizzle/0169_release_update_jobs.sql +67 -0
- package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
- package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
- package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
- package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
- package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
- package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
- package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
- package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
- package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
- package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
- package/dist/drizzle/0180_skill_drafts.sql +89 -0
- package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
- package/dist/drizzle/0182_agent_loops.sql +260 -0
- package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
- package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
- package/dist/drizzle/0185_agent_loop_space.sql +16 -0
- package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
- package/dist/drizzle/0187_native_work_items.sql +220 -0
- package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
- package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
- package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
- package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
- package/dist/drizzle/0192_work_item_labels.sql +44 -0
- package/dist/drizzle/0193_work_item_documents.sql +31 -0
- package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
- package/dist/drizzle/0194_work_item_comments.sql +35 -0
- package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
- package/dist/drizzle/0196_pi_extensions.sql +118 -0
- package/dist/drizzle/0197_eval_profiles.sql +150 -0
- package/dist/drizzle/0197_rcm_context_columns.sql +28 -0
- package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
- package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
- package/dist/drizzle/meta/_journal.json +160 -0
- package/dist/plugins/README.md +162 -0
- package/dist/plugins/catalog/package.json +40 -0
- package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
- package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
- package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
- package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
- package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
- package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
- package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
- package/dist/plugins/catalog/src/catalog.ts +434 -0
- package/dist/plugins/catalog/src/contracts.ts +1498 -0
- package/dist/plugins/catalog/src/index.ts +4 -0
- package/dist/plugins/catalog/src/plugin-package.ts +171 -0
- package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
- package/dist/plugins/catalog/src/registry/index.ts +1 -0
- package/dist/plugins/catalog/tsconfig.json +8 -0
- package/dist/plugins/company-brain/README.md +37 -0
- package/dist/plugins/company-brain/package.json +33 -0
- package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
- package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
- package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
- package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
- package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
- package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
- package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
- package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
- package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
- package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
- package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
- package/dist/plugins/company-brain/src/api/migration.ts +665 -0
- package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
- package/dist/plugins/company-brain/src/index.ts +62 -0
- package/dist/plugins/company-brain/src/manifest.ts +112 -0
- package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
- package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
- package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
- package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
- package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
- package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
- package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
- package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
- package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
- package/dist/plugins/company-brain/tsconfig.json +8 -0
- package/dist/plugins/company-data/README.md +49 -0
- package/dist/plugins/company-data/package.json +21 -0
- package/dist/plugins/company-data/src/index.ts +30 -0
- package/dist/plugins/company-data/src/manifest.ts +26 -0
- package/dist/plugins/company-data/test/manifest.test.ts +116 -0
- package/dist/plugins/company-data/tsconfig.json +8 -0
- package/dist/plugins/company-etl/README.md +46 -0
- package/dist/plugins/company-etl/package.json +21 -0
- package/dist/plugins/company-etl/src/index.ts +29 -0
- package/dist/plugins/company-etl/src/manifest.ts +26 -0
- package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
- package/dist/plugins/company-etl/tsconfig.json +8 -0
- package/dist/plugins/email-channel/README.md +41 -0
- package/dist/plugins/email-channel/package.json +22 -0
- package/dist/plugins/email-channel/src/index.ts +36 -0
- package/dist/plugins/email-channel/src/manifest.ts +44 -0
- package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
- package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
- package/dist/plugins/email-channel/tsconfig.json +8 -0
- package/dist/plugins/lastmile/README.md +50 -0
- package/dist/plugins/lastmile/package.json +23 -0
- package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
- package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
- package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
- package/dist/plugins/lastmile/src/index.ts +46 -0
- package/dist/plugins/lastmile/src/manifest.ts +139 -0
- package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
- package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
- package/dist/plugins/lastmile/tsconfig.json +8 -0
- package/dist/plugins/n8n/README.md +201 -0
- package/dist/plugins/n8n/n8n-app/README.md +33 -0
- package/dist/plugins/n8n/n8n-app/package.json +23 -0
- package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
- package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
- package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
- package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
- package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
- package/dist/plugins/n8n/package.json +35 -0
- package/dist/plugins/n8n/runtime/Dockerfile +18 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
- package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
- package/dist/plugins/n8n/runtime/package-lock.json +13 -0
- package/dist/plugins/n8n/runtime/package.json +7 -0
- package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
- package/dist/plugins/n8n/smoke/README.md +95 -0
- package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
- package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
- package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
- package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
- package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
- package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
- package/dist/plugins/n8n/src/index.ts +79 -0
- package/dist/plugins/n8n/src/manifest.ts +403 -0
- package/dist/plugins/n8n/src/package-config.ts +186 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
- package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
- package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
- package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
- package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
- package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
- package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
- package/dist/plugins/n8n/test/image-build.test.ts +118 -0
- package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
- package/dist/plugins/n8n/test/manifest.test.ts +278 -0
- package/dist/plugins/n8n/test/package-config.test.ts +57 -0
- package/dist/plugins/n8n/tsconfig.json +8 -0
- package/dist/plugins/sendgrid/README.md +30 -0
- package/dist/plugins/sendgrid/package.json +22 -0
- package/dist/plugins/sendgrid/src/index.ts +36 -0
- package/dist/plugins/sendgrid/src/manifest.ts +37 -0
- package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
- package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
- package/dist/plugins/sendgrid/tsconfig.json +8 -0
- package/dist/plugins/twenty/README.md +78 -0
- package/dist/plugins/twenty/package.json +27 -0
- package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
- package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
- package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
- package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
- package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
- package/dist/plugins/twenty/src/api/cutover.ts +209 -0
- package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
- package/dist/plugins/twenty/src/index.ts +55 -0
- package/dist/plugins/twenty/src/manifest.ts +259 -0
- package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
- package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
- package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
- package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
- package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
- package/dist/plugins/twenty/test/manifest.test.ts +463 -0
- package/dist/plugins/twenty/tsconfig.json +9 -0
- package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
- package/dist/plugins/twenty/twenty-app/README.md +148 -0
- package/dist/plugins/twenty/twenty-app/package.json +30 -0
- package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
- package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
- package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
- package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
- package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
- package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
- package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
- package/dist/plugins/workos-auth/package.json +22 -0
- package/dist/plugins/workos-auth/src/index.ts +30 -0
- package/dist/plugins/workos-auth/src/manifest.ts +40 -0
- package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
- package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
- package/dist/plugins/workos-auth/tsconfig.json +8 -0
- package/dist/scripts/bootstrap-workspace.sh +162 -0
- package/dist/scripts/post-deploy.sh +290 -0
- package/dist/terraform/examples/greenfield/main.tf +903 -75
- package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
- package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
- package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
- package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
- package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
- package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
- package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
- package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
- package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
- package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
- package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
- package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
- package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
- package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
- package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
- package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
- package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
- package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
- package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
- package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
- package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
- package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
- package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
- package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
- package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
- package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
- package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
- package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
- package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
- package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
- package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
- package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
- package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
- package/dist/terraform/modules/app/ses-email/main.tf +143 -30
- package/dist/terraform/modules/app/static-site/main.tf +4 -3
- package/dist/terraform/modules/app/www-dns/main.tf +45 -5
- package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
- package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
- package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
- package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
- package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
- package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
- package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
- package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
- package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
- package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
- package/dist/terraform/modules/thinkwork/README.md +71 -0
- package/dist/terraform/modules/thinkwork/main.tf +1325 -174
- package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
- package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
- package/dist/terraform/schema.graphql +82 -9
- package/dist/workspace-defaults/files/AGENTS.md +344 -0
- package/dist/workspace-defaults/files/CONTEXT.md +8 -0
- package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
- package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
- package/dist/workspace-defaults/files/ROUTER.md +24 -0
- package/dist/workspace-defaults/files/SPACE.md +62 -0
- package/dist/workspace-defaults/files/TOOLS.md +65 -0
- package/dist/workspace-defaults/files/USER.md +40 -0
- package/dist/workspace-defaults/files/mcp.json +3 -0
- package/dist/workspace-defaults/files/memory/contacts.md +13 -0
- package/dist/workspace-defaults/files/memory/lessons.md +13 -0
- package/dist/workspace-defaults/files/memory/preferences.md +12 -0
- package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
- package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
- package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
- package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
- package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
- package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
- package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
- package/package.json +2 -1
- package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
- package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
- package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
- package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
- package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
- package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
- package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
- 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
|