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
|
@@ -26,6 +26,7 @@ on:
|
|
|
26
26
|
- all
|
|
27
27
|
- foundation
|
|
28
28
|
- artifacts
|
|
29
|
+
- web
|
|
29
30
|
- overlays
|
|
30
31
|
- smokes
|
|
31
32
|
run_smokes:
|
|
@@ -105,24 +106,29 @@ jobs:
|
|
|
105
106
|
terraform_wrapper: false
|
|
106
107
|
|
|
107
108
|
- name: Prepare release artifacts
|
|
108
|
-
if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts') }}
|
|
109
|
+
if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web') }}
|
|
109
110
|
shell: bash
|
|
110
111
|
run: |
|
|
111
112
|
set -euo pipefail
|
|
113
|
+
PREPARE_ARGS=()
|
|
114
|
+
if [ "$COMPONENT" = "web" ]; then
|
|
115
|
+
PREPARE_ARGS+=(--artifact-type static-site --artifact-name web)
|
|
116
|
+
fi
|
|
112
117
|
node scripts/apply-release.mjs prepare \
|
|
113
118
|
--manifest "$RELEASE_MANIFEST" \
|
|
114
119
|
--work-dir "$RELEASE_DIR" \
|
|
115
120
|
--artifact-bucket "${{ steps.lock.outputs.artifact_bucket }}" \
|
|
116
|
-
--lambda-prefix "${{ steps.lock.outputs.lambda_prefix }}"
|
|
121
|
+
--lambda-prefix "${{ steps.lock.outputs.lambda_prefix }}" \
|
|
122
|
+
"${PREPARE_ARGS[@]}"
|
|
117
123
|
|
|
118
124
|
- name: Terraform init
|
|
119
|
-
if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'smokes' }}
|
|
125
|
+
if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web' || github.event.inputs.component == 'smokes' }}
|
|
120
126
|
working-directory: terraform
|
|
121
127
|
shell: bash
|
|
122
128
|
run: terraform init -backend-config="backend-${STAGE}.hcl"
|
|
123
129
|
|
|
124
130
|
- name: Select Terraform workspace
|
|
125
|
-
if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'smokes' }}
|
|
131
|
+
if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web' || github.event.inputs.component == 'smokes' }}
|
|
126
132
|
working-directory: terraform
|
|
127
133
|
shell: bash
|
|
128
134
|
run: |
|
|
@@ -187,14 +193,19 @@ jobs:
|
|
|
187
193
|
--region "${{ vars.AWS_REGION }}"
|
|
188
194
|
|
|
189
195
|
- name: Sync static site bundles
|
|
190
|
-
if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts') }}
|
|
196
|
+
if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web') }}
|
|
191
197
|
shell: bash
|
|
192
198
|
run: |
|
|
193
199
|
set -euo pipefail
|
|
200
|
+
STATIC_ARGS=()
|
|
201
|
+
if [ "$COMPONENT" = "web" ]; then
|
|
202
|
+
STATIC_ARGS+=(--artifact-name web)
|
|
203
|
+
fi
|
|
194
204
|
node scripts/apply-release.mjs sync-static \
|
|
195
205
|
--manifest "$RELEASE_MANIFEST" \
|
|
196
206
|
--work-dir "$RELEASE_DIR" \
|
|
197
|
-
--terraform-dir terraform
|
|
207
|
+
--terraform-dir terraform \
|
|
208
|
+
"${STATIC_ARGS[@]}"
|
|
198
209
|
|
|
199
210
|
- name: Apply customer overlay contract
|
|
200
211
|
if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'overlays') }}
|
|
@@ -5,12 +5,22 @@
|
|
|
5
5
|
This repository deploys a pinned ThinkWork release into the customer AWS
|
|
6
6
|
account. It is a deployment repository, not a source fork.
|
|
7
7
|
|
|
8
|
+
> Legacy compatibility: new customer-owned deployments should use the
|
|
9
|
+
> GitHub-free AWS control-plane bootstrap. This generated repository runbook is
|
|
10
|
+
> retained for existing customers that still operate through GitHub Actions.
|
|
11
|
+
|
|
8
12
|
The exact operational path is:
|
|
9
13
|
|
|
10
14
|
```text
|
|
11
15
|
bootstrap -> workflow dispatch -> CI deploy -> overlay apply -> smoke summary
|
|
12
16
|
```
|
|
13
17
|
|
|
18
|
+
The GitHub-free operational path is:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
bootstrap -> customer AWS Step Functions -> CodeBuild deploy -> smoke evidence
|
|
22
|
+
```
|
|
23
|
+
|
|
14
24
|
## First-Time Setup
|
|
15
25
|
|
|
16
26
|
Run these commands from an operator machine with temporary customer AWS admin
|
|
@@ -148,18 +158,58 @@ one-line flow into explicit steps.
|
|
|
148
158
|
-f run_smokes=false
|
|
149
159
|
```
|
|
150
160
|
|
|
151
|
-
|
|
152
|
-
|
|
161
|
+
Prefer `thinkwork destroy`; use direct `gh workflow run` only as a
|
|
162
|
+
troubleshooting fallback.
|
|
163
|
+
|
|
164
|
+
## GitHub-Free Bootstrap Smoke
|
|
165
|
+
|
|
166
|
+
When operating a GitHub-free customer deployment, run the foundation smoke from
|
|
167
|
+
the ThinkWork release workspace or support checkout after bootstrap:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
node scripts/smoke/foundation-bootstrap-smoke.mjs
|
|
171
|
+
|
|
172
|
+
SMOKE_ENABLE_FOUNDATION_BOOTSTRAP=1 \
|
|
173
|
+
SMOKE_TERRAFORM_DIR=terraform/examples/greenfield \
|
|
174
|
+
SMOKE_EVIDENCE_FILE=deploy-artifacts/foundation-smoke.json \
|
|
175
|
+
node scripts/smoke/foundation-bootstrap-smoke.mjs
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Set `SMOKE_EVIDENCE_S3_URI=s3://<evidence-bucket>/<prefix>` to upload the
|
|
179
|
+
evidence envelope. The evidence must include release/manifest identifiers,
|
|
180
|
+
deployment job identifiers when available, endpoint status, and smoke results.
|
|
181
|
+
It must not include secrets.
|
|
182
|
+
|
|
183
|
+
## Managed Application Smokes
|
|
184
|
+
|
|
185
|
+
Run managed-app smokes after deploy, destroy, park, or release upgrade jobs:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
SMOKE_ENABLE_COGNEE_MANAGED_APP=1 \
|
|
189
|
+
SMOKE_TENANT_ID=<tenant-id> \
|
|
190
|
+
SMOKE_EVIDENCE_FILE=deploy-artifacts/cognee-smoke.json \
|
|
191
|
+
node plugins/company-brain/smoke/cognee-managed-app-smoke.mjs
|
|
192
|
+
|
|
193
|
+
SMOKE_ENABLE_TWENTY_MANAGED_APP=1 \
|
|
194
|
+
SMOKE_TENANT_ID=<tenant-id> \
|
|
195
|
+
SMOKE_EVIDENCE_FILE=deploy-artifacts/twenty-smoke.json \
|
|
196
|
+
node plugins/twenty/smoke/twenty-managed-app-smoke.mjs
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Cognee and Twenty smokes skip with explicit evidence when the app is not
|
|
200
|
+
enabled, unprovisioned, or parked. A skipped smoke is valid evidence only when
|
|
201
|
+
that app state is intentional for the stage.
|
|
153
202
|
|
|
154
203
|
## Workflow Components
|
|
155
204
|
|
|
156
|
-
| Component | What it does
|
|
157
|
-
| ------------ |
|
|
158
|
-
| `all` | First deploy and normal release upgrades: release artifact prep, Terraform apply, runtime image copy, AgentCore update, static sync, overlays, smokes.
|
|
159
|
-
| `foundation` | Terraform apply and artifact/runtime/static sync without overlays.
|
|
160
|
-
| `artifacts` | Re-copy pinned Lambda/static/runtime artifacts without Terraform apply.
|
|
161
|
-
| `
|
|
162
|
-
| `
|
|
205
|
+
| Component | What it does |
|
|
206
|
+
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
207
|
+
| `all` | First deploy and normal release upgrades: release artifact prep, Terraform apply, runtime image copy, AgentCore update, static sync, overlays, smokes. |
|
|
208
|
+
| `foundation` | Terraform apply and artifact/runtime/static sync without overlays. |
|
|
209
|
+
| `artifacts` | Re-copy pinned Lambda/static/runtime artifacts without Terraform apply. |
|
|
210
|
+
| `web` | Sync only the pinned end-user web static bundle and invalidate its CloudFront distribution. Does not apply Terraform, copy lambdas, or update runtimes. |
|
|
211
|
+
| `overlays` | Apply only `customer/` evals, skills, workspace defaults, seeds, and branding records. |
|
|
212
|
+
| `smokes` | Run smoke checks against an already-deployed stage. |
|
|
163
213
|
|
|
164
214
|
Set workflow `operation=destroy` to remove the selected stage stack. Destroy
|
|
165
215
|
always uses Terraform for the whole stage; component-specific destroy is not
|
|
@@ -223,6 +273,17 @@ supported.
|
|
|
223
273
|
thinkwork deploy --customer {{CUSTOMER_SLUG}} --stage dev --component all
|
|
224
274
|
```
|
|
225
275
|
|
|
276
|
+
For a web-application-only redeploy after updating `thinkwork.lock`, use:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
thinkwork deploy --customer {{CUSTOMER_SLUG}} --stage dev --component web --no-run-smokes
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
This path reads existing Terraform outputs for the web bucket and CloudFront
|
|
283
|
+
distribution, syncs only the `web` static release artifact, and invalidates the
|
|
284
|
+
web distribution. It intentionally skips Terraform apply, Lambda artifact
|
|
285
|
+
promotion, runtime image copy, AgentCore updates, overlays, and database work.
|
|
286
|
+
|
|
226
287
|
3. Deploy to production after dev passes.
|
|
227
288
|
|
|
228
289
|
## Secrets
|
|
@@ -237,6 +298,17 @@ Never commit secrets. Supported secret homes are:
|
|
|
237
298
|
Do not store plaintext secrets in `terraform/stages/*.tfvars`, `.env`,
|
|
238
299
|
`customer/`, or runbook files.
|
|
239
300
|
|
|
301
|
+
## GitHub-Free Failure Triage
|
|
302
|
+
|
|
303
|
+
| Failure | First response |
|
|
304
|
+
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
305
|
+
| Manifest verification failed | Stop before mutation. Fetch a trusted release manifest and compare the expected SHA-256. |
|
|
306
|
+
| Plan failed | Inspect the CodeBuild log and Terraform plan artifact linked from the deployment job. |
|
|
307
|
+
| Apply failed | Inspect Step Functions event history, then CodeBuild logs. Retry only after preserving evidence. |
|
|
308
|
+
| Smoke failed | Attach the smoke evidence JSON to the deployment job/support case and inspect endpoint-specific details. |
|
|
309
|
+
| First-admin claim mismatch | Verify Cognito email verification and the bootstrap first-admin email. |
|
|
310
|
+
| Deployment profile import blocked | Confirm required profile fields, TLS URLs, signature trust, and that the user signed out before replacing profiles. |
|
|
311
|
+
|
|
240
312
|
## Rollback
|
|
241
313
|
|
|
242
314
|
To roll back application code, restore `thinkwork.lock` to the previously
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// thinkwork-managed: enterprise-deploy-template
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
|
-
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
5
5
|
import { dirname, join } from "node:path";
|
|
6
6
|
import { execFileSync } from "node:child_process";
|
|
7
7
|
|
|
@@ -52,8 +52,20 @@ async function validateManifest() {
|
|
|
52
52
|
`Release manifest version ${manifest.release?.version} does not match lock ${expectedRelease}`,
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
|
+
const hasBundle = (manifest.artifactBundles ?? []).length > 0;
|
|
56
|
+
for (const bundle of manifest.artifactBundles ?? []) {
|
|
57
|
+
if (!bundle.url || !bundle.sha256 || !bundle.fileName) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Release artifact bundle ${bundle.name} is missing url, sha256, or fileName`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
55
63
|
for (const artifact of manifest.artifacts ?? []) {
|
|
56
|
-
if (
|
|
64
|
+
if (
|
|
65
|
+
(!hasBundle && !artifact.url) ||
|
|
66
|
+
!artifact.sha256 ||
|
|
67
|
+
!artifact.fileName
|
|
68
|
+
) {
|
|
57
69
|
throw new Error(
|
|
58
70
|
`Release artifact ${artifact.name} is missing url, sha256, or fileName`,
|
|
59
71
|
);
|
|
@@ -67,13 +79,17 @@ async function prepareArtifacts() {
|
|
|
67
79
|
const workDir = required("--work-dir");
|
|
68
80
|
const artifactBucket = required("--artifact-bucket");
|
|
69
81
|
const lambdaPrefix = required("--lambda-prefix").replace(/^\/+|\/+$/g, "");
|
|
82
|
+
const artifactType = optional("--artifact-type");
|
|
83
|
+
const artifactName = optional("--artifact-name");
|
|
70
84
|
const downloadDir = join(workDir, "downloads");
|
|
71
85
|
await mkdir(downloadDir, { recursive: true });
|
|
86
|
+
const bundle = await prepareArtifactBundle(manifest, downloadDir);
|
|
72
87
|
|
|
73
88
|
const prepared = [];
|
|
74
89
|
for (const artifact of manifest.artifacts ?? []) {
|
|
75
|
-
|
|
76
|
-
|
|
90
|
+
if (artifactType && artifact.type !== artifactType) continue;
|
|
91
|
+
if (artifactName && artifact.name !== artifactName) continue;
|
|
92
|
+
const localPath = await prepareArtifact(artifact, downloadDir, bundle);
|
|
77
93
|
prepared.push({ ...artifact, localPath });
|
|
78
94
|
if (artifact.type === "lambda") {
|
|
79
95
|
run("aws", [
|
|
@@ -84,6 +100,11 @@ async function prepareArtifacts() {
|
|
|
84
100
|
]);
|
|
85
101
|
}
|
|
86
102
|
}
|
|
103
|
+
if ((artifactType || artifactName) && prepared.length === 0) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`No release artifacts matched${artifactType ? ` type=${artifactType}` : ""}${artifactName ? ` name=${artifactName}` : ""}`,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
87
108
|
|
|
88
109
|
await writeJson(join(workDir, "prepared-artifacts.json"), {
|
|
89
110
|
release: manifest.release,
|
|
@@ -91,6 +112,35 @@ async function prepareArtifacts() {
|
|
|
91
112
|
});
|
|
92
113
|
}
|
|
93
114
|
|
|
115
|
+
async function prepareArtifactBundle(manifest, downloadDir) {
|
|
116
|
+
const bundle = (manifest.artifactBundles ?? [])[0];
|
|
117
|
+
if (!bundle) return null;
|
|
118
|
+
|
|
119
|
+
const localPath = join(downloadDir, bundle.fileName);
|
|
120
|
+
await downloadAndVerify(bundle, localPath);
|
|
121
|
+
|
|
122
|
+
const extractDir = join(downloadDir, "platform-artifacts");
|
|
123
|
+
await rm(extractDir, { recursive: true, force: true });
|
|
124
|
+
await mkdir(extractDir, { recursive: true });
|
|
125
|
+
run("tar", ["-xzf", localPath, "-C", extractDir]);
|
|
126
|
+
|
|
127
|
+
return { ...bundle, localPath, extractDir };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function prepareArtifact(artifact, downloadDir, bundle) {
|
|
131
|
+
if (artifact.url) {
|
|
132
|
+
const localPath = join(downloadDir, artifact.fileName);
|
|
133
|
+
await downloadAndVerify(artifact, localPath);
|
|
134
|
+
return localPath;
|
|
135
|
+
}
|
|
136
|
+
if (!bundle) {
|
|
137
|
+
throw new Error(`Release artifact ${artifact.name} is missing url`);
|
|
138
|
+
}
|
|
139
|
+
const localPath = join(bundle.extractDir, artifact.relativePath);
|
|
140
|
+
await verifyExistingArtifact(artifact, localPath);
|
|
141
|
+
return localPath;
|
|
142
|
+
}
|
|
143
|
+
|
|
94
144
|
async function copyRuntimeImages() {
|
|
95
145
|
const manifest = await readManifest(required("--manifest"));
|
|
96
146
|
const workDir = required("--work-dir");
|
|
@@ -138,16 +188,25 @@ async function updateAgentCoreRuntimes() {
|
|
|
138
188
|
"text",
|
|
139
189
|
]);
|
|
140
190
|
|
|
141
|
-
for (const runtime of ["strands", "
|
|
191
|
+
for (const runtime of ["strands", "pi"]) {
|
|
142
192
|
const image = copied.find(
|
|
143
193
|
(item) => item.runtime === runtime && item.architecture === "arm64",
|
|
144
194
|
);
|
|
145
195
|
if (!image) continue;
|
|
196
|
+
if (runtime === "pi") {
|
|
197
|
+
updates.push(
|
|
198
|
+
updatePiLambdaRuntime({
|
|
199
|
+
stage,
|
|
200
|
+
region,
|
|
201
|
+
imageUri: image.stageUri,
|
|
202
|
+
}),
|
|
203
|
+
);
|
|
204
|
+
}
|
|
146
205
|
const runtimeId = findAgentCoreRuntimeId({ stage, runtime, region });
|
|
147
206
|
if (!runtimeId) {
|
|
148
|
-
if (runtime === "
|
|
207
|
+
if (runtime === "pi") {
|
|
149
208
|
updates.push(
|
|
150
|
-
|
|
209
|
+
createPiAgentCoreRuntime({
|
|
151
210
|
stage,
|
|
152
211
|
region,
|
|
153
212
|
accountId,
|
|
@@ -175,6 +234,87 @@ async function updateAgentCoreRuntimes() {
|
|
|
175
234
|
await writeJson(join(workDir, "runtime-updates.json"), updates);
|
|
176
235
|
}
|
|
177
236
|
|
|
237
|
+
function updatePiLambdaRuntime({ stage, region, imageUri }) {
|
|
238
|
+
const functionName = `thinkwork-${stage}-agentcore-pi`;
|
|
239
|
+
const expectedDigest = resolveEcrImageDigest({ imageUri, region });
|
|
240
|
+
run("aws", [
|
|
241
|
+
"lambda",
|
|
242
|
+
"update-function-code",
|
|
243
|
+
"--region",
|
|
244
|
+
region,
|
|
245
|
+
"--function-name",
|
|
246
|
+
functionName,
|
|
247
|
+
"--image-uri",
|
|
248
|
+
imageUri,
|
|
249
|
+
]);
|
|
250
|
+
run("aws", [
|
|
251
|
+
"lambda",
|
|
252
|
+
"wait",
|
|
253
|
+
"function-updated",
|
|
254
|
+
"--region",
|
|
255
|
+
region,
|
|
256
|
+
"--function-name",
|
|
257
|
+
functionName,
|
|
258
|
+
]);
|
|
259
|
+
|
|
260
|
+
const fn = awsJson([
|
|
261
|
+
"lambda",
|
|
262
|
+
"get-function",
|
|
263
|
+
"--region",
|
|
264
|
+
region,
|
|
265
|
+
"--function-name",
|
|
266
|
+
functionName,
|
|
267
|
+
"--output",
|
|
268
|
+
"json",
|
|
269
|
+
]);
|
|
270
|
+
const resolvedImageUri = fn.Code?.ResolvedImageUri ?? "";
|
|
271
|
+
if (!resolvedImageUri.endsWith(`@${expectedDigest}`)) {
|
|
272
|
+
throw new Error(
|
|
273
|
+
`${functionName} resolved ${resolvedImageUri || "(missing)"} instead of ${expectedDigest}`,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
runtime: "pi-lambda",
|
|
279
|
+
status: "updated",
|
|
280
|
+
image: imageUri,
|
|
281
|
+
resolvedImageUri,
|
|
282
|
+
functionName,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function resolveEcrImageDigest({ imageUri, region }) {
|
|
287
|
+
const parsed = parseEcrImageUri(imageUri);
|
|
288
|
+
const image = awsJson([
|
|
289
|
+
"ecr",
|
|
290
|
+
"describe-images",
|
|
291
|
+
"--region",
|
|
292
|
+
region,
|
|
293
|
+
"--repository-name",
|
|
294
|
+
parsed.repositoryName,
|
|
295
|
+
"--image-ids",
|
|
296
|
+
`imageTag=${parsed.tag}`,
|
|
297
|
+
"--query",
|
|
298
|
+
"imageDetails[0]",
|
|
299
|
+
"--output",
|
|
300
|
+
"json",
|
|
301
|
+
]);
|
|
302
|
+
if (!image?.imageDigest) {
|
|
303
|
+
throw new Error(`Could not resolve ECR image digest for ${imageUri}`);
|
|
304
|
+
}
|
|
305
|
+
return image.imageDigest;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function parseEcrImageUri(imageUri) {
|
|
309
|
+
const match = imageUri.match(
|
|
310
|
+
/^[^.]+\.dkr\.ecr\.[^.]+\.amazonaws\.com\/(.+):([^:@]+)$/,
|
|
311
|
+
);
|
|
312
|
+
if (!match) {
|
|
313
|
+
throw new Error(`Expected tagged ECR image URI, got ${imageUri}`);
|
|
314
|
+
}
|
|
315
|
+
return { repositoryName: match[1], tag: match[2] };
|
|
316
|
+
}
|
|
317
|
+
|
|
178
318
|
function findAgentCoreRuntimeId({ stage, runtime, region }) {
|
|
179
319
|
const parameterValue = awsText([
|
|
180
320
|
"ssm",
|
|
@@ -204,11 +344,11 @@ function findAgentCoreRuntimeId({ stage, runtime, region }) {
|
|
|
204
344
|
return listed && listed !== "None" ? listed : "";
|
|
205
345
|
}
|
|
206
346
|
|
|
207
|
-
function
|
|
347
|
+
function createPiAgentCoreRuntime({ stage, region, accountId, imageUri }) {
|
|
208
348
|
if (!accountId) {
|
|
209
|
-
throw new Error("AWS account ID is required to create the
|
|
349
|
+
throw new Error("AWS account ID is required to create the Pi runtime");
|
|
210
350
|
}
|
|
211
|
-
const runtimeNameValue = `thinkwork_${stage}
|
|
351
|
+
const runtimeNameValue = `thinkwork_${stage}_pi`;
|
|
212
352
|
const runtimeId = awsText([
|
|
213
353
|
"bedrock-agentcore-control",
|
|
214
354
|
"create-agent-runtime",
|
|
@@ -219,7 +359,7 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
|
|
|
219
359
|
"--agent-runtime-artifact",
|
|
220
360
|
`containerConfiguration={containerUri=${imageUri}}`,
|
|
221
361
|
"--role-arn",
|
|
222
|
-
canonicalAgentCoreRoleArn({ stage, runtime: "
|
|
362
|
+
canonicalAgentCoreRoleArn({ stage, runtime: "pi", accountId }),
|
|
223
363
|
"--network-configuration",
|
|
224
364
|
"networkMode=PUBLIC",
|
|
225
365
|
"--protocol-configuration",
|
|
@@ -236,7 +376,7 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
|
|
|
236
376
|
"ssm",
|
|
237
377
|
"put-parameter",
|
|
238
378
|
"--name",
|
|
239
|
-
`/thinkwork/${stage}/agentcore/runtime-id-
|
|
379
|
+
`/thinkwork/${stage}/agentcore/runtime-id-pi`,
|
|
240
380
|
"--value",
|
|
241
381
|
runtimeId,
|
|
242
382
|
"--type",
|
|
@@ -245,9 +385,9 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
|
|
|
245
385
|
"--region",
|
|
246
386
|
region,
|
|
247
387
|
]);
|
|
248
|
-
waitForAgentCoreRuntime({ runtime: "
|
|
388
|
+
waitForAgentCoreRuntime({ runtime: "pi", runtimeId, region, imageUri });
|
|
249
389
|
return {
|
|
250
|
-
runtime: "
|
|
390
|
+
runtime: "pi",
|
|
251
391
|
status: "created",
|
|
252
392
|
image: imageUri,
|
|
253
393
|
runtimeId,
|
|
@@ -369,8 +509,8 @@ function waitForAgentCoreRuntime({
|
|
|
369
509
|
|
|
370
510
|
function canonicalAgentCoreRoleArn({ stage, runtime, accountId }) {
|
|
371
511
|
const roleName =
|
|
372
|
-
runtime === "
|
|
373
|
-
? `thinkwork-${stage}-agentcore-
|
|
512
|
+
runtime === "pi"
|
|
513
|
+
? `thinkwork-${stage}-agentcore-pi-role`
|
|
374
514
|
: `thinkwork-${stage}-agentcore-role`;
|
|
375
515
|
return `arn:aws:iam::${accountId}:role/${roleName}`;
|
|
376
516
|
}
|
|
@@ -379,6 +519,7 @@ async function syncStaticSites() {
|
|
|
379
519
|
const manifest = await readManifest(required("--manifest"));
|
|
380
520
|
const workDir = required("--work-dir");
|
|
381
521
|
const terraformDir = required("--terraform-dir");
|
|
522
|
+
const artifactName = optional("--artifact-name");
|
|
382
523
|
const prepared = await readJson(join(workDir, "prepared-artifacts.json"), {
|
|
383
524
|
artifacts: [],
|
|
384
525
|
});
|
|
@@ -388,7 +529,8 @@ async function syncStaticSites() {
|
|
|
388
529
|
const synced = [];
|
|
389
530
|
|
|
390
531
|
for (const artifact of manifest.artifacts?.filter(
|
|
391
|
-
(item) =>
|
|
532
|
+
(item) =>
|
|
533
|
+
item.type === "static-site" && (!artifactName || item.name === artifactName),
|
|
392
534
|
) ?? []) {
|
|
393
535
|
const localPath = downloadByName.get(artifact.name);
|
|
394
536
|
if (!localPath) {
|
|
@@ -398,19 +540,21 @@ async function syncStaticSites() {
|
|
|
398
540
|
await rm(extractDir, { recursive: true, force: true });
|
|
399
541
|
await mkdir(extractDir, { recursive: true });
|
|
400
542
|
run("tar", ["-xzf", localPath, "-C", extractDir]);
|
|
543
|
+
const terraformOutputPrefix =
|
|
544
|
+
artifact.name === "spaces" ? "computer" : artifact.name;
|
|
401
545
|
const bucket = terraformOutput(
|
|
402
546
|
terraformDir,
|
|
403
|
-
`${
|
|
547
|
+
`${terraformOutputPrefix}_bucket_name`,
|
|
404
548
|
);
|
|
405
549
|
if (!bucket) {
|
|
406
550
|
throw new Error(
|
|
407
|
-
`Terraform output ${
|
|
551
|
+
`Terraform output ${terraformOutputPrefix}_bucket_name is missing`,
|
|
408
552
|
);
|
|
409
553
|
}
|
|
410
554
|
run("aws", ["s3", "sync", "--delete", extractDir, `s3://${bucket}/`]);
|
|
411
555
|
const distributionId = terraformOutput(
|
|
412
556
|
terraformDir,
|
|
413
|
-
`${
|
|
557
|
+
`${terraformOutputPrefix}_distribution_id`,
|
|
414
558
|
);
|
|
415
559
|
if (distributionId) {
|
|
416
560
|
run("aws", [
|
|
@@ -491,9 +635,27 @@ async function downloadAndVerify(artifact, localPath) {
|
|
|
491
635
|
}
|
|
492
636
|
}
|
|
493
637
|
|
|
638
|
+
async function verifyExistingArtifact(artifact, localPath) {
|
|
639
|
+
try {
|
|
640
|
+
const fileStat = await stat(localPath);
|
|
641
|
+
if (!fileStat.isFile()) {
|
|
642
|
+
throw new Error(`not a file`);
|
|
643
|
+
}
|
|
644
|
+
} catch {
|
|
645
|
+
throw new Error(
|
|
646
|
+
`Bundled release artifact ${artifact.name} is missing at ${artifact.relativePath}`,
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
const actual = await sha256File(localPath);
|
|
650
|
+
if (actual !== artifact.sha256) {
|
|
651
|
+
throw new Error(`Checksum mismatch for ${artifact.name}: got ${actual}`);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
|
|
494
655
|
function terraformOutputs(terraformDir) {
|
|
495
656
|
const names = [
|
|
496
657
|
"api_endpoint",
|
|
658
|
+
"app_url",
|
|
497
659
|
"admin_url",
|
|
498
660
|
"computer_url",
|
|
499
661
|
"docs_url",
|
|
@@ -565,7 +727,7 @@ async function sha256File(path) {
|
|
|
565
727
|
}
|
|
566
728
|
|
|
567
729
|
function runtimeName(name) {
|
|
568
|
-
if (name.includes("
|
|
730
|
+
if (name.includes("pi")) return "pi";
|
|
569
731
|
if (name.includes("strands")) return "strands";
|
|
570
732
|
return name;
|
|
571
733
|
}
|