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,403 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
InfrastructureComponent,
|
|
3
|
+
McpServerComponent,
|
|
4
|
+
PluginManifest,
|
|
5
|
+
SkillsComponent,
|
|
6
|
+
UiSurfaceComponent,
|
|
7
|
+
} from "@thinkwork/plugin-catalog/contracts";
|
|
8
|
+
import {
|
|
9
|
+
N8N_APP_DESCRIPTION,
|
|
10
|
+
N8N_APP_DISPLAY_NAME,
|
|
11
|
+
N8N_APP_ICON,
|
|
12
|
+
N8N_APP_KEY,
|
|
13
|
+
N8N_APP_ROUTE_SEGMENT,
|
|
14
|
+
N8N_APP_SURFACE_KEY,
|
|
15
|
+
} from "../n8n-app/src/application-config";
|
|
16
|
+
|
|
17
|
+
export const N8N_PLUGIN_KEY = "n8n";
|
|
18
|
+
export const N8N_PLUGIN_VERSION = "0.2.0";
|
|
19
|
+
export const N8N_PLUGIN_LEGACY_VERSION = "0.1.0";
|
|
20
|
+
export const N8N_MCP_ENDPOINT_PATH = "/mcp-server/http";
|
|
21
|
+
export const N8N_AGENT_STEP_BRIDGE_ENDPOINT_PATH =
|
|
22
|
+
"/api/integrations/n8n/agent-steps";
|
|
23
|
+
export const N8N_SERVICE_CREDENTIAL_KIND = "n8n-mcp-access-token";
|
|
24
|
+
export const N8N_SERVICE_CREDENTIAL_SECRET_JSON_KEY =
|
|
25
|
+
"N8N_MCP_SERVICE_CREDENTIAL";
|
|
26
|
+
export const N8N_AGENT_STEP_BRIDGE_CREDENTIAL_KIND =
|
|
27
|
+
"n8n-agent-step-bridge-token";
|
|
28
|
+
export const N8N_AGENT_STEP_BRIDGE_CREDENTIAL_SECRET_JSON_KEY =
|
|
29
|
+
"THINKWORK_N8N_AGENT_STEP_BRIDGE_TOKEN";
|
|
30
|
+
export const N8N_WORKFLOW_OPERATOR_SKILL_SLUG = "n8n-workflow-operator";
|
|
31
|
+
|
|
32
|
+
export const N8N_WORKFLOW_OPERATOR_SKILL_MD = `---
|
|
33
|
+
name: n8n-workflow-operator
|
|
34
|
+
description: Create, update, validate, test, and debug n8n workflows through ThinkWork's managed n8n MCP tools. Use when a request names n8n, workflows, executions, Code node packages, workflow migration, automation drafts, or asks to create an automation from a thread.
|
|
35
|
+
license: Apache-2.0
|
|
36
|
+
compatibility: ThinkWork n8n plugin with managed n8n MCP tools and a tenant n8n instance.
|
|
37
|
+
metadata:
|
|
38
|
+
thinkwork-plugin: n8n
|
|
39
|
+
skill-format: agentskills
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# n8n Workflow Operator
|
|
43
|
+
|
|
44
|
+
Use n8n as a shared tenant automation runtime. Read live workflow and node
|
|
45
|
+
state, make draft-safe changes, validate the result, and leave production
|
|
46
|
+
activation to the shared native n8n operator unless the human explicitly says
|
|
47
|
+
otherwise.
|
|
48
|
+
|
|
49
|
+
## First Move
|
|
50
|
+
|
|
51
|
+
1. Use this skill before any n8n workflow create, update, validation, test, or
|
|
52
|
+
debug action.
|
|
53
|
+
2. Use the n8n MCP tools provided by the installed ThinkWork n8n plugin. The
|
|
54
|
+
plugin uses a tenant service credential, not per-user n8n activation.
|
|
55
|
+
3. If n8n tools are missing, report that the operator must install the n8n
|
|
56
|
+
plugin, deploy the managed app, enable instance-level MCP in n8n, and enable
|
|
57
|
+
MCP access on the workflow, project, or folder.
|
|
58
|
+
4. Trust live MCP tool descriptions and node schemas over memory. n8n changes
|
|
59
|
+
quickly; if a live tool or schema disagrees with this skill, follow the live
|
|
60
|
+
tool and report the drift in the handoff.
|
|
61
|
+
|
|
62
|
+
## Authoring Loop
|
|
63
|
+
|
|
64
|
+
For requests such as "create a workflow", "edit this workflow", or "make a
|
|
65
|
+
smoke test":
|
|
66
|
+
|
|
67
|
+
1. Classify the pattern: manual trigger, webhook, schedule, HTTP API
|
|
68
|
+
integration, database sync, AI agent, or batch processing.
|
|
69
|
+
2. Read [MCP tooling](references/mcp-tooling.md), then discover live node
|
|
70
|
+
schemas before configuring nodes.
|
|
71
|
+
3. Read [workflow authoring](references/workflow-authoring.md), then create or
|
|
72
|
+
update an inactive draft. Use UUID-shaped node ids, current \`typeVersion\`
|
|
73
|
+
values, and no placeholder credentials or secrets.
|
|
74
|
+
4. Validate iteratively. Treat validation errors as normal feedback: fix the
|
|
75
|
+
specific field, then validate again.
|
|
76
|
+
5. Fetch the workflow after every create or update and inspect \`connections\` so
|
|
77
|
+
silently dropped or wrong wires are caught before handoff.
|
|
78
|
+
6. Test only when safe. n8n test runs execute real HTTP calls, writes, sends,
|
|
79
|
+
and other side effects.
|
|
80
|
+
7. Finish with [validation and handoff](references/validation-and-handoff.md).
|
|
81
|
+
|
|
82
|
+
## ThinkWork Agent-Step Bridge
|
|
83
|
+
|
|
84
|
+
1. For n8n-to-ThinkWork agent work, use the v1 agent-step bridge with stock
|
|
85
|
+
HTTP Request and Wait nodes. Do not suggest a custom ThinkWork n8n node in
|
|
86
|
+
v1.
|
|
87
|
+
2. The HTTP Request node calls ThinkWork's
|
|
88
|
+
\`/api/integrations/n8n/agent-steps\` endpoint with the separate inbound
|
|
89
|
+
bridge credential. Do not reuse the native n8n MCP service credential.
|
|
90
|
+
3. The workflow must pass target Space, target agent, instructions, structured
|
|
91
|
+
input, workflow id/name, execution id, step id, correlation id, optional
|
|
92
|
+
request id, optional timeout, and the current Wait-node resume URL from
|
|
93
|
+
\`$execution.resumeUrl\`.
|
|
94
|
+
4. The Wait node should use On webhook call. Downstream nodes should branch on
|
|
95
|
+
the resumed payload's \`status\` and read \`output\`, \`error\`, \`summary\`,
|
|
96
|
+
and \`links\`; they should not scrape ThinkWork thread pages.
|
|
97
|
+
5. Explain idempotency as workflow id + execution id + correlation id + step
|
|
98
|
+
id. Retrying the same bridge step should recover or replay the existing
|
|
99
|
+
ThinkWork thread rather than creating a duplicate.
|
|
100
|
+
|
|
101
|
+
## Stop Conditions
|
|
102
|
+
|
|
103
|
+
Stop before writing when multiple workflows match, the workflow/project/folder
|
|
104
|
+
does not have MCP access enabled, credentials are unknown, a test would touch
|
|
105
|
+
production side effects, the user asks for production activation without using
|
|
106
|
+
the native n8n operator account, or the live MCP tool surface conflicts with
|
|
107
|
+
the requested action.
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
export const N8N_WORKFLOW_OPERATOR_MCP_TOOLING_REFERENCE_MD = `# MCP Tooling
|
|
111
|
+
|
|
112
|
+
Use live n8n MCP tools as the source of truth for tool names, argument shapes,
|
|
113
|
+
node schemas, and current \`typeVersion\` values.
|
|
114
|
+
|
|
115
|
+
## Tool Selection
|
|
116
|
+
|
|
117
|
+
1. Search for nodes before configuring them.
|
|
118
|
+
2. Read the node schema before setting parameters. Standard detail is enough for
|
|
119
|
+
most nodes; use deeper docs only when the required field is unclear.
|
|
120
|
+
3. Validate nodes or workflows as soon as the tool surface supports it.
|
|
121
|
+
4. Prefer partial workflow updates for edits to existing workflows. Include a
|
|
122
|
+
short intent when the tool accepts one.
|
|
123
|
+
5. Fetch the workflow after create/update and inspect \`connections\`.
|
|
124
|
+
|
|
125
|
+
## Node Type Formats
|
|
126
|
+
|
|
127
|
+
Use the form expected by the tool being called:
|
|
128
|
+
|
|
129
|
+
1. Node discovery and node validation tools use short forms, for example
|
|
130
|
+
\`nodes-base.httpRequest\`.
|
|
131
|
+
2. Workflow JSON uses full forms, for example
|
|
132
|
+
\`n8n-nodes-base.httpRequest\`.
|
|
133
|
+
3. If a tool returns both forms, carry both forward instead of reconstructing
|
|
134
|
+
from memory.
|
|
135
|
+
|
|
136
|
+
## Credentials And Secrets
|
|
137
|
+
|
|
138
|
+
1. Never emit fake credential ids such as \`REPLACE_ME\`.
|
|
139
|
+
2. If the real credential id is unknown, omit the \`credentials\` block so the
|
|
140
|
+
native UI can show a usable selector.
|
|
141
|
+
3. Never put tokens, API keys, or passwords in Set nodes, Code nodes,
|
|
142
|
+
expressions, or plain text fields. Use the n8n credential system.
|
|
143
|
+
4. The ThinkWork agent-step bridge credential is separate from the n8n MCP
|
|
144
|
+
service credential.
|
|
145
|
+
|
|
146
|
+
## Shortened Tool Names
|
|
147
|
+
|
|
148
|
+
The ThinkWork runtime may expose long MCP tool names in shortened form. Choose
|
|
149
|
+
tools by descriptions and parameter schemas, not memorized exact names.
|
|
150
|
+
`;
|
|
151
|
+
|
|
152
|
+
export const N8N_WORKFLOW_OPERATOR_WORKFLOW_AUTHORING_REFERENCE_MD = `# Workflow Authoring
|
|
153
|
+
|
|
154
|
+
Build the smallest inactive draft that proves the requested automation shape,
|
|
155
|
+
then validate and verify it before handoff.
|
|
156
|
+
|
|
157
|
+
## Pattern Choice
|
|
158
|
+
|
|
159
|
+
1. Manual trigger: use for user-triggered smoke tests and safe demos.
|
|
160
|
+
2. Webhook: use when an external system pushes an event.
|
|
161
|
+
3. Schedule: use for recurring fetch, report, and maintenance workflows.
|
|
162
|
+
4. HTTP API integration: use for read/write calls to external REST APIs.
|
|
163
|
+
5. Database sync: use for ETL and record reconciliation.
|
|
164
|
+
6. AI agent: use when the workflow needs model reasoning or n8n agent tools.
|
|
165
|
+
7. Batch processing: use when item count, pagination, or rate limits matter.
|
|
166
|
+
|
|
167
|
+
## Construction Rules
|
|
168
|
+
|
|
169
|
+
1. Prefer HTTP Request nodes over Code nodes for ordinary GET/POST calls.
|
|
170
|
+
2. Prefer expressions in the consuming field for simple data mapping.
|
|
171
|
+
3. Use \`{{ ... }}\` expressions in n8n fields. Use direct JavaScript only inside
|
|
172
|
+
Code nodes.
|
|
173
|
+
4. Avoid Set/Edit Fields nodes that feed a single consumer; inline the
|
|
174
|
+
expression at the consuming field.
|
|
175
|
+
5. For webhook workflows, user payload fields are under \`$json.body\`, not at
|
|
176
|
+
the root.
|
|
177
|
+
6. For branchy workflows, reference upstream nodes by name instead of relying on
|
|
178
|
+
ambiguous \`$json\` at branch convergence.
|
|
179
|
+
7. Search for existing workflows or templates before creating a larger reusable
|
|
180
|
+
workflow from scratch.
|
|
181
|
+
|
|
182
|
+
## Draft Safety
|
|
183
|
+
|
|
184
|
+
1. Keep created workflows inactive unless the human explicitly completes
|
|
185
|
+
production activation in the native n8n UI.
|
|
186
|
+
2. Prefer disabled copies or disposable draft workflows for edits.
|
|
187
|
+
3. Run only read-only or low-risk test executions without additional
|
|
188
|
+
confirmation.
|
|
189
|
+
4. Do not trigger a production webhook, schedule, message send, database write,
|
|
190
|
+
or destructive external side effect as a smoke test.
|
|
191
|
+
|
|
192
|
+
## Code Nodes
|
|
193
|
+
|
|
194
|
+
Use Code nodes only for multi-item aggregation, allowlisted package use, or
|
|
195
|
+
logic that cannot be expressed in fields. For Code nodes, use only packages
|
|
196
|
+
declared in the Plugin Detail n8n custom package settings.
|
|
197
|
+
`;
|
|
198
|
+
|
|
199
|
+
export const N8N_WORKFLOW_OPERATOR_VALIDATION_AND_HANDOFF_REFERENCE_MD = `# Validation And Handoff
|
|
200
|
+
|
|
201
|
+
Validation passing is necessary, not sufficient. A workflow can validate and
|
|
202
|
+
still have wrong wires, missing branches, or unsafe runtime behavior.
|
|
203
|
+
|
|
204
|
+
## Validation Loop
|
|
205
|
+
|
|
206
|
+
1. Validate configured nodes when available.
|
|
207
|
+
2. Create or update the inactive workflow.
|
|
208
|
+
3. Validate the complete workflow.
|
|
209
|
+
4. Fix one concrete error at a time, then validate again.
|
|
210
|
+
5. Treat warnings as context-sensitive. Production workflows should address
|
|
211
|
+
missing error handling, retry, rate-limit, and credential warnings unless
|
|
212
|
+
there is a clear reason to accept them.
|
|
213
|
+
|
|
214
|
+
## Verify After Write
|
|
215
|
+
|
|
216
|
+
After every create or update:
|
|
217
|
+
|
|
218
|
+
1. Fetch the workflow by id.
|
|
219
|
+
2. Confirm workflow id, name, active state, tags, project or folder, trigger
|
|
220
|
+
nodes, credential references, and MCP access state.
|
|
221
|
+
3. Inspect \`connections\` directly. Confirm each expected branch, error output,
|
|
222
|
+
and merge input is wired to the intended node.
|
|
223
|
+
4. If multiple workflows match, stop and ask for the exact workflow id or URL.
|
|
224
|
+
|
|
225
|
+
## Test Evidence
|
|
226
|
+
|
|
227
|
+
1. Ask before any test that can create records, call external APIs, send
|
|
228
|
+
messages, or mutate production systems.
|
|
229
|
+
2. Prefer disposable inputs and read-only endpoints.
|
|
230
|
+
3. Record execution ids, failure messages, validation errors, and evidence
|
|
231
|
+
links in the handoff.
|
|
232
|
+
|
|
233
|
+
## Handoff Checklist
|
|
234
|
+
|
|
235
|
+
Include workflow id, workflow name, draft/test status, package requirements,
|
|
236
|
+
credential assumptions, MCP access state, validation result, connection
|
|
237
|
+
verification result, test evidence, and the native n8n UI action required from
|
|
238
|
+
the shared operator.
|
|
239
|
+
`;
|
|
240
|
+
|
|
241
|
+
const N8N_INFRA_COMPONENT: InfrastructureComponent = {
|
|
242
|
+
type: "infrastructure",
|
|
243
|
+
key: "runtime",
|
|
244
|
+
managedAppKey: N8N_PLUGIN_KEY,
|
|
245
|
+
terraformInputs: {
|
|
246
|
+
imageUri: {
|
|
247
|
+
description: "Thin ThinkWork n8n wrapper image URI pinned with @sha256.",
|
|
248
|
+
type: "string",
|
|
249
|
+
},
|
|
250
|
+
databaseAdminSecretArn: {
|
|
251
|
+
description:
|
|
252
|
+
"Secrets Manager ARN for an admin database credential allowed to create the n8n database and role.",
|
|
253
|
+
type: "string",
|
|
254
|
+
},
|
|
255
|
+
databaseUrlSecretArn: {
|
|
256
|
+
description:
|
|
257
|
+
"Secrets Manager ARN containing the least-privilege n8n PostgreSQL connection URL.",
|
|
258
|
+
type: "string",
|
|
259
|
+
},
|
|
260
|
+
encryptionKeySecretArn: {
|
|
261
|
+
description: "Secrets Manager ARN containing N8N_ENCRYPTION_KEY.",
|
|
262
|
+
type: "string",
|
|
263
|
+
},
|
|
264
|
+
operatorSecretArn: {
|
|
265
|
+
description:
|
|
266
|
+
"Secrets Manager ARN containing the shared native n8n operator account credential.",
|
|
267
|
+
type: "string",
|
|
268
|
+
},
|
|
269
|
+
serviceCredentialSecretArn: {
|
|
270
|
+
description:
|
|
271
|
+
"Secrets Manager ARN containing the tenant service credential used by the native n8n MCP integration.",
|
|
272
|
+
type: "string",
|
|
273
|
+
},
|
|
274
|
+
agentStepBridgeCredentialSecretArn: {
|
|
275
|
+
description:
|
|
276
|
+
"Secrets Manager ARN containing the inbound credential used by n8n workflows to call the ThinkWork agent-step bridge.",
|
|
277
|
+
type: "string",
|
|
278
|
+
},
|
|
279
|
+
storageBucketName: {
|
|
280
|
+
description: "S3 bucket name used for n8n binary data and runtime files.",
|
|
281
|
+
type: "string",
|
|
282
|
+
},
|
|
283
|
+
publicUrl: {
|
|
284
|
+
description: "Public HTTPS origin for n8n.",
|
|
285
|
+
type: "string",
|
|
286
|
+
},
|
|
287
|
+
certificateArn: {
|
|
288
|
+
description: "ACM certificate ARN for the n8n public HTTPS listener.",
|
|
289
|
+
type: "string",
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const N8N_MCP_COMPONENT: McpServerComponent = {
|
|
295
|
+
type: "mcp-server",
|
|
296
|
+
key: "workflow-management",
|
|
297
|
+
displayName: "n8n workflow management",
|
|
298
|
+
description:
|
|
299
|
+
"Native instance-level n8n MCP for workflow inspection, draft-safe edits, and low-risk test evidence through the tenant n8n runtime.",
|
|
300
|
+
endpointFrom: {
|
|
301
|
+
managedApp: N8N_PLUGIN_KEY,
|
|
302
|
+
configKey: "publicUrl",
|
|
303
|
+
path: N8N_MCP_ENDPOINT_PATH,
|
|
304
|
+
},
|
|
305
|
+
auth: {
|
|
306
|
+
mode: "tenant-service-credential",
|
|
307
|
+
credentialKind: N8N_SERVICE_CREDENTIAL_KIND,
|
|
308
|
+
secretRefConfigKey: "serviceCredentialSecretArn",
|
|
309
|
+
headers: [
|
|
310
|
+
{
|
|
311
|
+
name: "Authorization",
|
|
312
|
+
secretJsonKey: N8N_SERVICE_CREDENTIAL_SECRET_JSON_KEY,
|
|
313
|
+
valuePrefix: "Bearer ",
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
toolNotes: [
|
|
318
|
+
"n8n v1 uses one tenant service credential and a shared native n8n operator account; it does not support per-user n8n activation.",
|
|
319
|
+
"The n8n agent-step bridge uses a separate inbound tenant credential for workflow HTTP Request nodes; do not reuse the MCP service credential for bridge calls.",
|
|
320
|
+
"Operators must enable instance-level MCP in n8n and enable MCP access on the workflow, project, or folder before agents can inspect it.",
|
|
321
|
+
"Agents may inspect, draft, and test low-risk workflows, but production activation, publish, and unpublish stay in the native n8n UI.",
|
|
322
|
+
],
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const N8N_PACKAGE_SETTINGS_COMPONENT: UiSurfaceComponent = {
|
|
326
|
+
type: "ui-surface",
|
|
327
|
+
key: "package-settings",
|
|
328
|
+
displayName: "n8n custom package settings",
|
|
329
|
+
intendedMount: "settings.plugins.detail",
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const N8N_WORKFLOW_OPERATIONS_APP_COMPONENT: UiSurfaceComponent = {
|
|
333
|
+
type: "ui-surface",
|
|
334
|
+
key: N8N_APP_SURFACE_KEY,
|
|
335
|
+
displayName: N8N_APP_DISPLAY_NAME,
|
|
336
|
+
intendedMount: "apps.main",
|
|
337
|
+
launch: {
|
|
338
|
+
schemaVersion: 1,
|
|
339
|
+
type: "app",
|
|
340
|
+
appKey: N8N_APP_KEY,
|
|
341
|
+
routeSegment: N8N_APP_ROUTE_SEGMENT,
|
|
342
|
+
mount: "main-shell",
|
|
343
|
+
runtime: "trusted-bundled-react",
|
|
344
|
+
description: N8N_APP_DESCRIPTION,
|
|
345
|
+
icon: N8N_APP_ICON,
|
|
346
|
+
entitlementProductKey: N8N_APP_KEY,
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
const N8N_SKILLS_COMPONENT: SkillsComponent = {
|
|
351
|
+
type: "skills",
|
|
352
|
+
key: "workflow-operator-instructions",
|
|
353
|
+
skills: [
|
|
354
|
+
{
|
|
355
|
+
slug: N8N_WORKFLOW_OPERATOR_SKILL_SLUG,
|
|
356
|
+
skillMd: N8N_WORKFLOW_OPERATOR_SKILL_MD,
|
|
357
|
+
supportingFiles: [
|
|
358
|
+
{
|
|
359
|
+
path: "references/mcp-tooling.md",
|
|
360
|
+
content: N8N_WORKFLOW_OPERATOR_MCP_TOOLING_REFERENCE_MD,
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
path: "references/workflow-authoring.md",
|
|
364
|
+
content: N8N_WORKFLOW_OPERATOR_WORKFLOW_AUTHORING_REFERENCE_MD,
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
path: "references/validation-and-handoff.md",
|
|
368
|
+
content: N8N_WORKFLOW_OPERATOR_VALIDATION_AND_HANDOFF_REFERENCE_MD,
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
},
|
|
372
|
+
],
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
export const n8nManifest: PluginManifest = {
|
|
376
|
+
pluginKey: N8N_PLUGIN_KEY,
|
|
377
|
+
displayName: "n8n",
|
|
378
|
+
description:
|
|
379
|
+
"Self-hosted n8n workflow automation runtime with queue-mode workers, custom Code node packages, and native n8n MCP access for agents.",
|
|
380
|
+
versions: [
|
|
381
|
+
{
|
|
382
|
+
version: N8N_PLUGIN_LEGACY_VERSION,
|
|
383
|
+
requiredOauthScopes: [],
|
|
384
|
+
components: [
|
|
385
|
+
N8N_INFRA_COMPONENT,
|
|
386
|
+
N8N_MCP_COMPONENT,
|
|
387
|
+
N8N_PACKAGE_SETTINGS_COMPONENT,
|
|
388
|
+
N8N_SKILLS_COMPONENT,
|
|
389
|
+
],
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
version: N8N_PLUGIN_VERSION,
|
|
393
|
+
requiredOauthScopes: [],
|
|
394
|
+
components: [
|
|
395
|
+
N8N_INFRA_COMPONENT,
|
|
396
|
+
N8N_MCP_COMPONENT,
|
|
397
|
+
N8N_PACKAGE_SETTINGS_COMPONENT,
|
|
398
|
+
N8N_WORKFLOW_OPERATIONS_APP_COMPONENT,
|
|
399
|
+
N8N_SKILLS_COMPONENT,
|
|
400
|
+
],
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
2
|
+
import { bytesToHex } from "@noble/hashes/utils.js";
|
|
3
|
+
|
|
4
|
+
export const N8N_PACKAGE_CONFIG_SCHEMA_VERSION = 1;
|
|
5
|
+
|
|
6
|
+
export interface NormalizedN8nPackage {
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
spec: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface NormalizedN8nPackageConfig {
|
|
13
|
+
schemaVersion: typeof N8N_PACKAGE_CONFIG_SCHEMA_VERSION;
|
|
14
|
+
packages: NormalizedN8nPackage[];
|
|
15
|
+
packageNames: string[];
|
|
16
|
+
packageSpecs: string[];
|
|
17
|
+
allowExternal: string;
|
|
18
|
+
digest: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function normalizeN8nPackageConfig(
|
|
22
|
+
value: unknown,
|
|
23
|
+
): NormalizedN8nPackageConfig {
|
|
24
|
+
const specs = packageSpecsFrom(value);
|
|
25
|
+
const byName = new Map<string, NormalizedN8nPackage>();
|
|
26
|
+
|
|
27
|
+
for (const rawSpec of specs) {
|
|
28
|
+
const parsed = parseExactPublicNpmSpec(rawSpec);
|
|
29
|
+
const existing = byName.get(parsed.name);
|
|
30
|
+
if (existing) {
|
|
31
|
+
if (existing.version !== parsed.version) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`n8n custom package ${parsed.name} declares multiple versions: ${existing.version} and ${parsed.version}`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
byName.set(parsed.name, parsed);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const packages = [...byName.values()].sort((left, right) =>
|
|
42
|
+
left.name.localeCompare(right.name),
|
|
43
|
+
);
|
|
44
|
+
const digestPayload = {
|
|
45
|
+
schemaVersion: N8N_PACKAGE_CONFIG_SCHEMA_VERSION,
|
|
46
|
+
packages: packages.map(({ name, version }) => ({ name, version })),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
schemaVersion: N8N_PACKAGE_CONFIG_SCHEMA_VERSION,
|
|
51
|
+
packages,
|
|
52
|
+
packageNames: packages.map((entry) => entry.name),
|
|
53
|
+
packageSpecs: packages.map((entry) => entry.spec),
|
|
54
|
+
allowExternal: packages.map((entry) => entry.name).join(","),
|
|
55
|
+
digest: sha256Hex(canonicalJson(digestPayload)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function assertN8nPackageConfigDigest(args: {
|
|
60
|
+
expectedDigest?: unknown;
|
|
61
|
+
actualDigest: string;
|
|
62
|
+
fieldName: string;
|
|
63
|
+
}): void {
|
|
64
|
+
if (args.expectedDigest === undefined || args.expectedDigest === null) return;
|
|
65
|
+
if (typeof args.expectedDigest !== "string" || !args.expectedDigest.trim()) {
|
|
66
|
+
throw new Error(`${args.fieldName} must be a sha256 hex digest`);
|
|
67
|
+
}
|
|
68
|
+
if (!/^[a-f0-9]{64}$/i.test(args.expectedDigest)) {
|
|
69
|
+
throw new Error(`${args.fieldName} must be a sha256 hex digest`);
|
|
70
|
+
}
|
|
71
|
+
if (args.expectedDigest.toLowerCase() !== args.actualDigest.toLowerCase()) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
`${args.fieldName} must match normalized n8n package config digest ${args.actualDigest}`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function packageSpecsFrom(value: unknown): string[] {
|
|
79
|
+
if (value === undefined || value === null) return [];
|
|
80
|
+
const rawSpecs = Array.isArray(value)
|
|
81
|
+
? value
|
|
82
|
+
: typeof value === "object" && !Array.isArray(value)
|
|
83
|
+
? (value as Record<string, unknown>).customPackageSpecs
|
|
84
|
+
: value;
|
|
85
|
+
if (rawSpecs === undefined || rawSpecs === null) return [];
|
|
86
|
+
if (!Array.isArray(rawSpecs)) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
"n8n customPackageSpecs must be an array of exact package specs",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return rawSpecs.map((entry, index) => {
|
|
92
|
+
if (typeof entry !== "string" || !entry.trim()) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`n8n customPackageSpecs[${index}] must be a non-empty string`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
return entry.trim();
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function parseExactPublicNpmSpec(spec: string): NormalizedN8nPackage {
|
|
102
|
+
rejectUnsafeSpecShape(spec);
|
|
103
|
+
const versionSeparatorIndex = spec.lastIndexOf("@");
|
|
104
|
+
if (versionSeparatorIndex <= 0) {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`n8n custom package "${spec}" must include an exact public npm version like lodash@4.17.21`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const name = spec.slice(0, versionSeparatorIndex);
|
|
111
|
+
const version = spec.slice(versionSeparatorIndex + 1);
|
|
112
|
+
assertPublicPackageName(name, spec);
|
|
113
|
+
assertExactSemver(version, spec);
|
|
114
|
+
return { name, version, spec: `${name}@${version}` };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function rejectUnsafeSpecShape(spec: string): void {
|
|
118
|
+
if (/\s/.test(spec)) {
|
|
119
|
+
throw new Error(`n8n custom package "${spec}" must not contain whitespace`);
|
|
120
|
+
}
|
|
121
|
+
if (
|
|
122
|
+
/^(?:git\+|git:|ssh:|http:|https:|file:|workspace:|link:|portal:|npm:)/i.test(
|
|
123
|
+
spec,
|
|
124
|
+
) ||
|
|
125
|
+
spec.includes("://")
|
|
126
|
+
) {
|
|
127
|
+
throw new Error(
|
|
128
|
+
`n8n custom package "${spec}" must be an exact public npm package spec, not a URL, path, alias, or workspace reference`,
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
if (
|
|
132
|
+
spec.startsWith("./") ||
|
|
133
|
+
spec.startsWith("../") ||
|
|
134
|
+
spec.startsWith("/") ||
|
|
135
|
+
spec.endsWith(".tgz")
|
|
136
|
+
) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`n8n custom package "${spec}" must be resolved from the public npm registry`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function assertPublicPackageName(name: string, spec: string): void {
|
|
144
|
+
const packagePart = "[a-z0-9][a-z0-9._~-]*";
|
|
145
|
+
const unscoped = new RegExp(`^${packagePart}$`);
|
|
146
|
+
const scoped = new RegExp(`^@${packagePart}/${packagePart}$`);
|
|
147
|
+
if (
|
|
148
|
+
name.length > 214 ||
|
|
149
|
+
name.startsWith(".") ||
|
|
150
|
+
name.startsWith("_") ||
|
|
151
|
+
(!unscoped.test(name) && !scoped.test(name))
|
|
152
|
+
) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
`n8n custom package "${spec}" has an invalid npm package name`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function assertExactSemver(version: string, spec: string): void {
|
|
160
|
+
if (
|
|
161
|
+
!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*)?(?:\+[0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*)?$/.test(
|
|
162
|
+
version,
|
|
163
|
+
)
|
|
164
|
+
) {
|
|
165
|
+
throw new Error(
|
|
166
|
+
`n8n custom package "${spec}" must pin an exact semver version; ranges, tags, and wildcards are not allowed`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function sha256Hex(value: string): string {
|
|
172
|
+
return bytesToHex(sha256(new TextEncoder().encode(value)));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function canonicalJson(value: unknown): string {
|
|
176
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
177
|
+
if (Array.isArray(value)) {
|
|
178
|
+
return `[${value.map((entry) => canonicalJson(entry)).join(",")}]`;
|
|
179
|
+
}
|
|
180
|
+
const entries = Object.entries(value as Record<string, unknown>).sort(
|
|
181
|
+
([left], [right]) => left.localeCompare(right),
|
|
182
|
+
);
|
|
183
|
+
return `{${entries
|
|
184
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`)
|
|
185
|
+
.join(",")}}`;
|
|
186
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: n8n-workflow-operator
|
|
3
|
+
description: Create, update, validate, test, and debug n8n workflows through ThinkWork's managed n8n MCP tools. Use when a request names n8n, workflows, executions, Code node packages, workflow migration, automation drafts, or asks to create an automation from a thread.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
compatibility: ThinkWork n8n plugin with managed n8n MCP tools and a tenant n8n instance.
|
|
6
|
+
metadata:
|
|
7
|
+
thinkwork-plugin: n8n
|
|
8
|
+
skill-format: agentskills
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# n8n Workflow Operator
|
|
12
|
+
|
|
13
|
+
Use n8n as a shared tenant automation runtime. Read live workflow and node
|
|
14
|
+
state, make draft-safe changes, validate the result, and leave production
|
|
15
|
+
activation to the shared native n8n operator unless the human explicitly says
|
|
16
|
+
otherwise.
|
|
17
|
+
|
|
18
|
+
## First Move
|
|
19
|
+
|
|
20
|
+
1. Use this skill before any n8n workflow create, update, validation, test, or
|
|
21
|
+
debug action.
|
|
22
|
+
2. Use the n8n MCP tools provided by the installed ThinkWork n8n plugin. The
|
|
23
|
+
plugin uses a tenant service credential, not per-user n8n activation.
|
|
24
|
+
3. If n8n tools are missing, report that the operator must install the n8n
|
|
25
|
+
plugin, deploy the managed app, enable instance-level MCP in n8n, and enable
|
|
26
|
+
MCP access on the workflow, project, or folder.
|
|
27
|
+
4. Trust live MCP tool descriptions and node schemas over memory. n8n changes
|
|
28
|
+
quickly; if a live tool or schema disagrees with this skill, follow the live
|
|
29
|
+
tool and report the drift in the handoff.
|
|
30
|
+
|
|
31
|
+
## Authoring Loop
|
|
32
|
+
|
|
33
|
+
For requests such as "create a workflow", "edit this workflow", or "make a
|
|
34
|
+
smoke test":
|
|
35
|
+
|
|
36
|
+
1. Classify the pattern: manual trigger, webhook, schedule, HTTP API
|
|
37
|
+
integration, database sync, AI agent, or batch processing.
|
|
38
|
+
2. Read [MCP tooling](references/mcp-tooling.md), then discover live node
|
|
39
|
+
schemas before configuring nodes.
|
|
40
|
+
3. Read [workflow authoring](references/workflow-authoring.md), then create or
|
|
41
|
+
update an inactive draft. Use UUID-shaped node ids, current `typeVersion`
|
|
42
|
+
values, and no placeholder credentials or secrets.
|
|
43
|
+
4. Validate iteratively. Treat validation errors as normal feedback: fix the
|
|
44
|
+
specific field, then validate again.
|
|
45
|
+
5. Fetch the workflow after every create or update and inspect `connections` so
|
|
46
|
+
silently dropped or wrong wires are caught before handoff.
|
|
47
|
+
6. Test only when safe. n8n test runs execute real HTTP calls, writes, sends,
|
|
48
|
+
and other side effects.
|
|
49
|
+
7. Finish with [validation and handoff](references/validation-and-handoff.md).
|
|
50
|
+
|
|
51
|
+
## ThinkWork Agent-Step Bridge
|
|
52
|
+
|
|
53
|
+
1. For n8n-to-ThinkWork agent work, use the v1 agent-step bridge with stock
|
|
54
|
+
HTTP Request and Wait nodes. Do not suggest a custom ThinkWork n8n node in
|
|
55
|
+
v1.
|
|
56
|
+
2. The HTTP Request node calls ThinkWork's
|
|
57
|
+
`/api/integrations/n8n/agent-steps` endpoint with the separate inbound
|
|
58
|
+
bridge credential. Do not reuse the native n8n MCP service credential.
|
|
59
|
+
3. The workflow must pass target Space, target agent, instructions, structured
|
|
60
|
+
input, workflow id/name, execution id, step id, correlation id, optional
|
|
61
|
+
request id, optional timeout, and the current Wait-node resume URL from
|
|
62
|
+
`$execution.resumeUrl`.
|
|
63
|
+
4. The Wait node should use On webhook call. Downstream nodes should branch on
|
|
64
|
+
the resumed payload's `status` and read `output`, `error`, `summary`,
|
|
65
|
+
and `links`; they should not scrape ThinkWork thread pages.
|
|
66
|
+
5. Explain idempotency as workflow id + execution id + correlation id + step
|
|
67
|
+
id. Retrying the same bridge step should recover or replay the existing
|
|
68
|
+
ThinkWork thread rather than creating a duplicate.
|
|
69
|
+
|
|
70
|
+
## Stop Conditions
|
|
71
|
+
|
|
72
|
+
Stop before writing when multiple workflows match, the workflow/project/folder
|
|
73
|
+
does not have MCP access enabled, credentials are unknown, a test would touch
|
|
74
|
+
production side effects, the user asks for production activation without using
|
|
75
|
+
the native n8n operator account, or the live MCP tool surface conflicts with
|
|
76
|
+
the requested action.
|