thinkwork-cli 0.12.11 → 0.12.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -38
- package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
- package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
- package/dist/cli.js +22157 -9229
- 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/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 +453 -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 +1 -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,354 @@
|
|
|
1
|
+
variable "stage" {
|
|
2
|
+
description = "Deployment stage (for example dev or prod)."
|
|
3
|
+
type = string
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
variable "vpc_id" {
|
|
7
|
+
description = "VPC ID for n8n networking."
|
|
8
|
+
type = string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
variable "subnet_ids" {
|
|
12
|
+
description = "Public subnet IDs for the n8n public ALB and phase-1 ECS task egress pattern."
|
|
13
|
+
type = list(string)
|
|
14
|
+
|
|
15
|
+
validation {
|
|
16
|
+
condition = length(var.subnet_ids) > 0
|
|
17
|
+
error_message = "subnet_ids must include at least one public subnet for the n8n ALB and ECS tasks."
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
variable "cache_subnet_ids" {
|
|
22
|
+
description = "Private subnet IDs for the n8n managed Valkey/Redis subnet group. Leave empty to reuse subnet_ids in isolated fixtures only."
|
|
23
|
+
type = list(string)
|
|
24
|
+
default = []
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
variable "db_security_group_id" {
|
|
28
|
+
description = "Security group ID for the shared PostgreSQL database instance."
|
|
29
|
+
type = string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
variable "database_host" {
|
|
33
|
+
description = "Hostname for the existing ThinkWork PostgreSQL instance."
|
|
34
|
+
type = string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
variable "database_port" {
|
|
38
|
+
description = "PostgreSQL port for n8n's dedicated database."
|
|
39
|
+
type = number
|
|
40
|
+
default = 5432
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
variable "database_name" {
|
|
44
|
+
description = "Dedicated PostgreSQL database name for n8n."
|
|
45
|
+
type = string
|
|
46
|
+
default = "thinkwork_n8n"
|
|
47
|
+
|
|
48
|
+
validation {
|
|
49
|
+
condition = can(regex("^[A-Za-z_][A-Za-z0-9_]{0,62}$", var.database_name))
|
|
50
|
+
error_message = "database_name must be a valid PostgreSQL identifier."
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
variable "database_username" {
|
|
55
|
+
description = "Dedicated PostgreSQL username for n8n. Do not use the shared Aurora admin/master user."
|
|
56
|
+
type = string
|
|
57
|
+
default = "thinkwork_n8n"
|
|
58
|
+
|
|
59
|
+
validation {
|
|
60
|
+
condition = !contains(["postgres", "thinkwork_admin", "rdsadmin"], lower(var.database_username))
|
|
61
|
+
error_message = "database_username must be a dedicated least-privilege n8n database user."
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
variable "database_admin_secret_arn" {
|
|
66
|
+
description = "Secrets Manager ARN for an admin database credential used by the managed-app setup step to create/drop the n8n database and role."
|
|
67
|
+
type = string
|
|
68
|
+
default = ""
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
variable "database_url_secret_arn" {
|
|
72
|
+
description = "Secrets Manager ARN containing n8n's least-privilege database secret. Runtime injection expects JSON fields DATABASE_URL and DB_POSTGRESDB_PASSWORD."
|
|
73
|
+
type = string
|
|
74
|
+
default = ""
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
variable "public_url" {
|
|
78
|
+
description = "Public HTTPS origin for n8n, for example https://n8n.example.com."
|
|
79
|
+
type = string
|
|
80
|
+
|
|
81
|
+
validation {
|
|
82
|
+
condition = can(regex("^https://[^/]+$", var.public_url))
|
|
83
|
+
error_message = "public_url must be an HTTPS origin without a path, for example https://n8n.example.com."
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
variable "certificate_arn" {
|
|
88
|
+
description = "ACM certificate ARN used by the public HTTPS ALB listener."
|
|
89
|
+
type = string
|
|
90
|
+
|
|
91
|
+
validation {
|
|
92
|
+
condition = can(regex("^arn:aws(-[a-z]+)?:acm:[^:]+:[0-9]{12}:certificate/.+", var.certificate_arn))
|
|
93
|
+
error_message = "certificate_arn must be an ACM certificate ARN."
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
variable "image_uri" {
|
|
98
|
+
description = "Thin ThinkWork n8n wrapper image URI pinned to a reviewed immutable digest."
|
|
99
|
+
type = string
|
|
100
|
+
|
|
101
|
+
validation {
|
|
102
|
+
condition = can(regex("@sha256:[0-9a-f]{64}$", var.image_uri))
|
|
103
|
+
error_message = "image_uri must be pinned to an immutable sha256 image digest."
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
variable "runtime_enabled" {
|
|
108
|
+
description = "Whether the n8n main and worker services should run. Set false to park runtime while retaining data resources."
|
|
109
|
+
type = bool
|
|
110
|
+
default = true
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
variable "main_desired_count" {
|
|
114
|
+
description = "Desired n8n main service task count when runtime_enabled is true."
|
|
115
|
+
type = number
|
|
116
|
+
default = 1
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
variable "worker_desired_count" {
|
|
120
|
+
description = "Desired n8n worker service task count when runtime_enabled is true."
|
|
121
|
+
type = number
|
|
122
|
+
default = 1
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
variable "worker_concurrency" {
|
|
126
|
+
description = "n8n worker execution concurrency."
|
|
127
|
+
type = number
|
|
128
|
+
default = 10
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
variable "cpu" {
|
|
132
|
+
description = "Fargate task CPU units for each n8n task."
|
|
133
|
+
type = number
|
|
134
|
+
default = 1024
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
variable "memory" {
|
|
138
|
+
description = "Fargate task memory in MB for each n8n task."
|
|
139
|
+
type = number
|
|
140
|
+
default = 2048
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
variable "cpu_architecture" {
|
|
144
|
+
description = "Fargate CPU architecture for n8n tasks."
|
|
145
|
+
type = string
|
|
146
|
+
default = "X86_64"
|
|
147
|
+
|
|
148
|
+
validation {
|
|
149
|
+
condition = contains(["X86_64", "ARM64"], var.cpu_architecture)
|
|
150
|
+
error_message = "cpu_architecture must be X86_64 or ARM64."
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
variable "container_port" {
|
|
155
|
+
description = "n8n HTTP container port."
|
|
156
|
+
type = number
|
|
157
|
+
default = 5678
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
variable "health_check_path" {
|
|
161
|
+
description = "HTTP path used by ALB and container health checks."
|
|
162
|
+
type = string
|
|
163
|
+
default = "/healthz"
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
variable "health_check_grace_period_seconds" {
|
|
167
|
+
description = "Seconds ECS ignores failing load balancer health checks while n8n starts."
|
|
168
|
+
type = number
|
|
169
|
+
default = 300
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
variable "wait_for_steady_state" {
|
|
173
|
+
description = "Whether Terraform waits for the n8n ECS services to reach steady state."
|
|
174
|
+
type = bool
|
|
175
|
+
default = true
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
variable "log_retention_days" {
|
|
179
|
+
description = "CloudWatch log retention for n8n services."
|
|
180
|
+
type = number
|
|
181
|
+
default = 14
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
variable "encryption_key_secret_arn" {
|
|
185
|
+
description = "Secrets Manager ARN containing N8N_ENCRYPTION_KEY."
|
|
186
|
+
type = string
|
|
187
|
+
default = ""
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
variable "operator_secret_arn" {
|
|
191
|
+
description = "Secrets Manager ARN containing the shared native n8n operator credential. Expected JSON fields are N8N_OPERATOR_EMAIL and N8N_OPERATOR_PASSWORD."
|
|
192
|
+
type = string
|
|
193
|
+
default = ""
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
variable "service_credential_secret_arn" {
|
|
197
|
+
description = "Secrets Manager ARN containing the tenant service credential used by the native n8n MCP integration."
|
|
198
|
+
type = string
|
|
199
|
+
default = ""
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
variable "agent_step_bridge_credential_secret_arn" {
|
|
203
|
+
description = "Secrets Manager ARN containing the inbound credential used by n8n workflows to call the ThinkWork agent-step bridge."
|
|
204
|
+
type = string
|
|
205
|
+
default = ""
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
variable "create_secret_placeholders" {
|
|
209
|
+
description = "Create operator-owned Secrets Manager placeholder containers for missing n8n secrets. Placeholder values are generated once and ignored after creation so rotation survives Terraform applies."
|
|
210
|
+
type = bool
|
|
211
|
+
default = false
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
variable "operator_email" {
|
|
215
|
+
description = "Default email stored in the generated operator placeholder secret when create_secret_placeholders is true."
|
|
216
|
+
type = string
|
|
217
|
+
default = "operator+n8n@thinkwork.ai"
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
variable "kms_key_arns" {
|
|
221
|
+
description = "Optional KMS key ARNs needed to decrypt injected secrets."
|
|
222
|
+
type = list(string)
|
|
223
|
+
default = []
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
variable "storage_bucket_name" {
|
|
227
|
+
description = "S3 bucket name used for n8n managed exports, evidence, package artifacts, and future enterprise S3 storage mode."
|
|
228
|
+
type = string
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
variable "create_storage_bucket" {
|
|
232
|
+
description = "Create the S3 bucket named by storage_bucket_name. Set false to use an existing retained bucket."
|
|
233
|
+
type = bool
|
|
234
|
+
default = true
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
variable "storage_prefix" {
|
|
238
|
+
description = "S3 prefix reserved for n8n managed artifacts and optional storage mode objects."
|
|
239
|
+
type = string
|
|
240
|
+
default = "managed-apps/n8n"
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
variable "execution_data_storage_mode" {
|
|
244
|
+
description = "n8n execution data storage mode. OSS queue-mode defaults to database; s3 is reserved for a licensed enterprise deployment."
|
|
245
|
+
type = string
|
|
246
|
+
default = "database"
|
|
247
|
+
|
|
248
|
+
validation {
|
|
249
|
+
condition = contains(["database", "s3"], var.execution_data_storage_mode)
|
|
250
|
+
error_message = "execution_data_storage_mode must be database or s3."
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
variable "binary_data_mode" {
|
|
255
|
+
description = "n8n binary data mode. OSS queue-mode defaults to n8n's built-in default; s3 is reserved for a licensed enterprise deployment."
|
|
256
|
+
type = string
|
|
257
|
+
default = "default"
|
|
258
|
+
|
|
259
|
+
validation {
|
|
260
|
+
condition = contains(["default", "filesystem", "s3"], var.binary_data_mode)
|
|
261
|
+
error_message = "binary_data_mode must be default, filesystem, or s3."
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
variable "task_runners_enabled" {
|
|
266
|
+
description = "Enable n8n task runners for code-node execution."
|
|
267
|
+
type = bool
|
|
268
|
+
default = true
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
variable "package_config_digest" {
|
|
272
|
+
description = "Digest of the reviewed custom-package configuration injected into the n8n wrapper image."
|
|
273
|
+
type = string
|
|
274
|
+
default = ""
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
variable "custom_package_specs" {
|
|
278
|
+
description = "Pinned public npm package specs approved for n8n code nodes. U4 builds these into the wrapper image."
|
|
279
|
+
type = list(string)
|
|
280
|
+
default = []
|
|
281
|
+
|
|
282
|
+
validation {
|
|
283
|
+
condition = alltrue([
|
|
284
|
+
for spec in var.custom_package_specs :
|
|
285
|
+
can(regex("^(@[^/]+/[^@]+|[^@]+)@[0-9][0-9A-Za-z.+-]*$", spec))
|
|
286
|
+
])
|
|
287
|
+
error_message = "custom_package_specs must contain exact public npm specs such as lodash@4.17.21 or @scope/package@1.2.3."
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
variable "queue_mode" {
|
|
292
|
+
description = "n8n queue mode toggle. THNK-50 requires queue mode; this variable remains explicit so managed-app plans can record it."
|
|
293
|
+
type = bool
|
|
294
|
+
default = true
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
variable "cache_engine" {
|
|
298
|
+
description = "ElastiCache engine for n8n queue mode. Prefer valkey; redis is available as a compatibility fallback."
|
|
299
|
+
type = string
|
|
300
|
+
default = "valkey"
|
|
301
|
+
|
|
302
|
+
validation {
|
|
303
|
+
condition = contains(["valkey", "redis"], var.cache_engine)
|
|
304
|
+
error_message = "cache_engine must be valkey or redis."
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
variable "cache_engine_version" {
|
|
309
|
+
description = "ElastiCache engine version for the selected cache engine."
|
|
310
|
+
type = string
|
|
311
|
+
default = "8.0"
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
variable "cache_parameter_group_family" {
|
|
315
|
+
description = "ElastiCache parameter group family matching cache_engine/cache_engine_version."
|
|
316
|
+
type = string
|
|
317
|
+
default = "valkey8"
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
variable "cache_node_type" {
|
|
321
|
+
description = "ElastiCache node type for the n8n queue."
|
|
322
|
+
type = string
|
|
323
|
+
default = "cache.t4g.micro"
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
variable "cache_port" {
|
|
327
|
+
description = "ElastiCache Redis-compatible port."
|
|
328
|
+
type = number
|
|
329
|
+
default = 6379
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
variable "cache_num_cache_clusters" {
|
|
333
|
+
description = "Number of cache nodes in the n8n replication group. Use 1 for the smallest v1 deployment."
|
|
334
|
+
type = number
|
|
335
|
+
default = 1
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
variable "cache_transit_encryption_enabled" {
|
|
339
|
+
description = "Enable in-transit encryption for the n8n cache."
|
|
340
|
+
type = bool
|
|
341
|
+
default = true
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
variable "allowed_public_cidr_blocks" {
|
|
345
|
+
description = "CIDR blocks allowed to reach the public n8n HTTPS ALB."
|
|
346
|
+
type = list(string)
|
|
347
|
+
default = ["0.0.0.0/0"]
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
variable "enable_http_redirect" {
|
|
351
|
+
description = "Create a port 80 listener that redirects HTTP to HTTPS."
|
|
352
|
+
type = bool
|
|
353
|
+
default = true
|
|
354
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { buildN8nPackageImageBuildContract } from "../src/deployment/image-build";
|
|
4
|
+
import { normalizeN8nPackageConfig } from "../src/package-config";
|
|
5
|
+
|
|
6
|
+
const baseImageUri = `public.ecr.aws/thinkwork/n8n@sha256:${"1".repeat(64)}`;
|
|
7
|
+
const packageImageUri = `123456789012.dkr.ecr.us-east-1.amazonaws.com/thinkwork/n8n@sha256:${"2".repeat(64)}`;
|
|
8
|
+
|
|
9
|
+
describe("n8n package image build contract", () => {
|
|
10
|
+
it("requires digest-pinned output images tied to the normalized package digest", () => {
|
|
11
|
+
const packageConfig = normalizeN8nPackageConfig([
|
|
12
|
+
"zod@3.25.76",
|
|
13
|
+
"lodash@4.17.21",
|
|
14
|
+
]);
|
|
15
|
+
const contract = buildN8nPackageImageBuildContract({
|
|
16
|
+
tenantId: "tenant-1",
|
|
17
|
+
pluginVersion: "1.2.3",
|
|
18
|
+
baseImageUri,
|
|
19
|
+
taskRunnersEnabled: true,
|
|
20
|
+
customPackageSpecs: ["lodash@4.17.21", "zod@3.25.76"],
|
|
21
|
+
packageConfigDigest: packageConfig.digest,
|
|
22
|
+
packageImageConfigDigest: packageConfig.digest,
|
|
23
|
+
packageImageUri,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
expect(contract.required).toBe(true);
|
|
27
|
+
expect(contract.outputImageUri).toBe(packageImageUri);
|
|
28
|
+
expect(contract.outputImageDigest).toBe("2".repeat(64));
|
|
29
|
+
expect(contract.packageConfig.digest).toBe(packageConfig.digest);
|
|
30
|
+
expect(contract.nodeFunctionAllowExternal).toBe("lodash,zod");
|
|
31
|
+
expect(contract.idempotencyKey).toMatch(/^[a-f0-9]{64}$/);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("changes the idempotency key when package config changes", () => {
|
|
35
|
+
const first = buildN8nPackageImageBuildContract({
|
|
36
|
+
tenantId: "tenant-1",
|
|
37
|
+
pluginVersion: "1.2.3",
|
|
38
|
+
baseImageUri,
|
|
39
|
+
taskRunnersEnabled: true,
|
|
40
|
+
customPackageSpecs: ["lodash@4.17.21"],
|
|
41
|
+
packageImageUri,
|
|
42
|
+
});
|
|
43
|
+
const second = buildN8nPackageImageBuildContract({
|
|
44
|
+
tenantId: "tenant-1",
|
|
45
|
+
pluginVersion: "1.2.3",
|
|
46
|
+
baseImageUri,
|
|
47
|
+
taskRunnersEnabled: true,
|
|
48
|
+
customPackageSpecs: ["date-fns@4.1.0"],
|
|
49
|
+
packageImageUri,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
expect(first.idempotencyKey).not.toBe(second.idempotencyKey);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("rejects missing or mismatched package image approvals before apply", () => {
|
|
56
|
+
const packageConfig = normalizeN8nPackageConfig(["lodash@4.17.21"]);
|
|
57
|
+
|
|
58
|
+
expect(() =>
|
|
59
|
+
buildN8nPackageImageBuildContract({
|
|
60
|
+
tenantId: "tenant-1",
|
|
61
|
+
pluginVersion: "1.2.3",
|
|
62
|
+
baseImageUri,
|
|
63
|
+
taskRunnersEnabled: true,
|
|
64
|
+
customPackageSpecs: ["lodash@4.17.21"],
|
|
65
|
+
packageConfigDigest: packageConfig.digest,
|
|
66
|
+
}),
|
|
67
|
+
).toThrow(/packageImageUri is required/);
|
|
68
|
+
|
|
69
|
+
expect(() =>
|
|
70
|
+
buildN8nPackageImageBuildContract({
|
|
71
|
+
tenantId: "tenant-1",
|
|
72
|
+
pluginVersion: "1.2.3",
|
|
73
|
+
baseImageUri,
|
|
74
|
+
taskRunnersEnabled: true,
|
|
75
|
+
customPackageSpecs: ["lodash@4.17.21"],
|
|
76
|
+
packageConfigDigest: "0".repeat(64),
|
|
77
|
+
packageImageUri,
|
|
78
|
+
}),
|
|
79
|
+
).toThrow(/packageConfigDigest must match/);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("keeps runtime secrets out of image build inputs", () => {
|
|
83
|
+
const contract = buildN8nPackageImageBuildContract({
|
|
84
|
+
tenantId: "tenant-1",
|
|
85
|
+
pluginVersion: "1.2.3",
|
|
86
|
+
baseImageUri,
|
|
87
|
+
taskRunnersEnabled: true,
|
|
88
|
+
customPackageSpecs: ["lodash@4.17.21"],
|
|
89
|
+
packageImageUri,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
expect(contract.security.runtimeSecretsIncluded).toBe(false);
|
|
93
|
+
expect(contract.security.buildSecretKeys).toEqual([]);
|
|
94
|
+
expect(JSON.stringify(contract)).not.toMatch(
|
|
95
|
+
/DATABASE_URL|N8N_ENCRYPTION_KEY|OPERATOR_PASSWORD|SERVICE_CREDENTIAL/,
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("ships runtime templates for n8n module resolution and task-runner allow lists", () => {
|
|
100
|
+
const dockerfile = readFileSync("runtime/Dockerfile", "utf8");
|
|
101
|
+
const taskRunnerConfig = readFileSync(
|
|
102
|
+
"runtime/n8n-task-runners.json",
|
|
103
|
+
"utf8",
|
|
104
|
+
);
|
|
105
|
+
const taskRunnerTemplate = readFileSync(
|
|
106
|
+
"runtime/n8n-task-runners.json.template",
|
|
107
|
+
"utf8",
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
expect(dockerfile).toContain(
|
|
111
|
+
"/usr/local/lib/node_modules/n8n/node_modules",
|
|
112
|
+
);
|
|
113
|
+
expect(dockerfile).toContain("if [ -d node_modules ]");
|
|
114
|
+
expect(taskRunnerConfig).toContain("NODE_FUNCTION_ALLOW_EXTERNAL");
|
|
115
|
+
expect(taskRunnerTemplate).toContain("NODE_FUNCTION_ALLOW_EXTERNAL");
|
|
116
|
+
expect(taskRunnerTemplate).toContain("{{NODE_FUNCTION_ALLOW_EXTERNAL}}");
|
|
117
|
+
});
|
|
118
|
+
});
|