thinkwork-cli 0.12.12 → 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.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22123 -9219
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,624 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * n8n native MCP smoke.
4
+ *
5
+ * Dry-run is the default. Set SMOKE_ENABLE_N8N_MCP=1 after the n8n plugin is
6
+ * installed, deployed, and assigned to a ThinkWork agent.
7
+ *
8
+ * ThinkWork proxy mode (preferred end-to-end path):
9
+ * SMOKE_N8N_THINKWORK_PROXY=1
10
+ * SMOKE_API_BASE_URL or VITE_API_URL
11
+ * SMOKE_COGNITO_ID_TOKEN=<operator/user Cognito id token>
12
+ * SMOKE_AGENT_ID=<agent id assigned to n8n MCP>
13
+ * SMOKE_N8N_MCP_SERVER=n8n--workflow-management
14
+ *
15
+ * Direct n8n MCP mode (diagnostic only):
16
+ * SMOKE_N8N_MCP_URL=https://n8n.example.com/mcp-server/http
17
+ * SMOKE_N8N_MCP_SERVICE_TOKEN=<tenant service credential token>
18
+ *
19
+ * Optional GraphQL install check:
20
+ * SMOKE_N8N_INSTALL_ID=<plugin install id>
21
+ * SMOKE_TENANT_ID=<tenant-id>
22
+ * VITE_GRAPHQL_HTTP_URL, GRAPHQL_HTTP_URL, or API_GRAPHQL_URL
23
+ * API_AUTH_SECRET, THINKWORK_API_SECRET, VITE_GRAPHQL_API_KEY, or GRAPHQL_API_KEY
24
+ */
25
+
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import process from "node:process";
29
+ import { attachSmokeEvidence } from "../../../scripts/smoke/deployment-evidence.mjs";
30
+
31
+ const LIVE_ENABLED = process.env.SMOKE_ENABLE_N8N_MCP === "1";
32
+ const VIA_THINKWORK = process.env.SMOKE_N8N_THINKWORK_PROXY === "1";
33
+ const TIMEOUT_MS = Number(process.env.SMOKE_TIMEOUT_MS || 20_000);
34
+ const MCP_PROTOCOL_VERSION = "2025-03-26";
35
+
36
+ const env = {
37
+ ...loadEnvFile(),
38
+ ...process.env,
39
+ };
40
+
41
+ const n8nUrl = first(env.SMOKE_N8N_URL);
42
+ const directMcpUrl = first(
43
+ env.SMOKE_N8N_MCP_URL,
44
+ n8nUrl ? new URL("/mcp-server/http", n8nUrl).toString() : undefined,
45
+ );
46
+ const serviceToken = first(
47
+ env.SMOKE_N8N_MCP_SERVICE_TOKEN,
48
+ env.N8N_MCP_SERVICE_CREDENTIAL,
49
+ );
50
+ const apiBaseUrl = first(
51
+ env.SMOKE_API_BASE_URL,
52
+ env.VITE_API_URL,
53
+ env.API_BASE_URL,
54
+ );
55
+ const idToken = first(
56
+ env.SMOKE_COGNITO_ID_TOKEN,
57
+ env.COGNITO_ID_TOKEN,
58
+ env.THINKWORK_ID_TOKEN,
59
+ );
60
+ const agentId = first(env.SMOKE_AGENT_ID, env.AGENT_ID);
61
+ const serverName = first(env.SMOKE_N8N_MCP_SERVER, "n8n--workflow-management");
62
+ const graphQlUrl = first(
63
+ env.VITE_GRAPHQL_HTTP_URL,
64
+ env.GRAPHQL_HTTP_URL,
65
+ env.API_GRAPHQL_URL,
66
+ );
67
+ const apiSecret = first(env.API_AUTH_SECRET, env.THINKWORK_API_SECRET);
68
+ const apiKey = first(
69
+ env.VITE_GRAPHQL_API_KEY,
70
+ env.APPSYNC_API_KEY,
71
+ env.GRAPHQL_API_KEY,
72
+ );
73
+ const tenantId = first(env.SMOKE_TENANT_ID, env.TENANT_ID);
74
+ const installId = first(env.SMOKE_N8N_INSTALL_ID);
75
+ const requiredTools = csv(
76
+ first(env.SMOKE_N8N_REQUIRED_TOOLS) ?? "list_workflows,get_workflow",
77
+ );
78
+ const workflowListTool = first(env.SMOKE_N8N_WORKFLOW_LIST_TOOL);
79
+ const workflowListArgs = parseJsonEnv(
80
+ "SMOKE_N8N_WORKFLOW_LIST_ARGS",
81
+ env.SMOKE_N8N_WORKFLOW_LIST_ARGS,
82
+ {},
83
+ );
84
+ const workflowGetTool = first(env.SMOKE_N8N_WORKFLOW_GET_TOOL);
85
+ const workflowId = first(env.SMOKE_N8N_WORKFLOW_ID);
86
+ const workflowGetArgs = parseJsonEnv(
87
+ "SMOKE_N8N_WORKFLOW_GET_ARGS",
88
+ env.SMOKE_N8N_WORKFLOW_GET_ARGS,
89
+ workflowId ? { id: workflowId } : {},
90
+ );
91
+ const checks = [];
92
+
93
+ if (!LIVE_ENABLED) {
94
+ console.log(
95
+ JSON.stringify(
96
+ await attachSmokeEvidence(
97
+ "n8n-mcp",
98
+ {
99
+ ok: true,
100
+ skippedLive: true,
101
+ reason: "set SMOKE_ENABLE_N8N_MCP=1 to run the n8n native MCP smoke",
102
+ dryRun: {
103
+ preferredMode:
104
+ "ThinkWork proxy mode proves the installed plugin MCP path through an assigned agent",
105
+ directMode: "direct n8n MCP mode is diagnostic only",
106
+ requiredWhenRunning: [
107
+ "n8n plugin installed through Settings -> Plugins",
108
+ "n8n runtime deployed and instance-level MCP enabled",
109
+ "MCP access enabled on the workflow, project, or folder",
110
+ "n8n MCP server assigned to SMOKE_AGENT_ID for ThinkWork proxy mode",
111
+ ],
112
+ optionalGraphqlEnv: [
113
+ "SMOKE_N8N_INSTALL_ID",
114
+ "SMOKE_TENANT_ID",
115
+ "VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL or API_GRAPHQL_URL",
116
+ "API_AUTH_SECRET or THINKWORK_API_SECRET or VITE_GRAPHQL_API_KEY or GRAPHQL_API_KEY",
117
+ ],
118
+ verifies: [
119
+ "plugin install is n8n and has provisioned MCP/infrastructure components when SMOKE_N8N_INSTALL_ID is set",
120
+ "tools/list exposes native n8n workflow tools",
121
+ "a low-risk workflow list call succeeds when a list tool is available",
122
+ "a specific workflow read succeeds when SMOKE_N8N_WORKFLOW_ID and get tool are configured",
123
+ "production publish, unpublish, and activation are never called by this smoke",
124
+ ],
125
+ },
126
+ },
127
+ env,
128
+ ),
129
+ null,
130
+ 2,
131
+ ),
132
+ );
133
+ process.exit(0);
134
+ }
135
+
136
+ try {
137
+ const result = await runLiveSmoke();
138
+ const failed = checks.filter((check) => !check.ok);
139
+ const payload = {
140
+ ok: failed.length === 0,
141
+ mode: VIA_THINKWORK ? "thinkwork" : "direct",
142
+ checks,
143
+ ...result,
144
+ };
145
+ console.log(
146
+ JSON.stringify(await attachSmokeEvidence("n8n-mcp", payload, env), null, 2),
147
+ );
148
+ process.exit(failed.length === 0 ? 0 : 1);
149
+ } catch (error) {
150
+ console.error(
151
+ JSON.stringify(
152
+ {
153
+ ok: false,
154
+ mode: VIA_THINKWORK ? "thinkwork" : "direct",
155
+ error: error instanceof Error ? error.message : String(error),
156
+ checks,
157
+ },
158
+ null,
159
+ 2,
160
+ ),
161
+ );
162
+ process.exit(1);
163
+ }
164
+
165
+ async function runLiveSmoke() {
166
+ const install = installId
167
+ ? await readGraphqlInstall().catch((error) => ({
168
+ error: error instanceof Error ? error.message : String(error),
169
+ }))
170
+ : { skipped: true, reason: "SMOKE_N8N_INSTALL_ID not set" };
171
+ validateInstall(install);
172
+
173
+ const client = VIA_THINKWORK ? makeThinkWorkClient() : makeDirectMcpClient();
174
+ const tools = await client.listTools();
175
+ assertWorkflowTools(tools);
176
+
177
+ const listTool =
178
+ workflowListTool ??
179
+ findTool(tools, [
180
+ /^list[_-]?workflows?$/i,
181
+ /^search[_-]?workflows?$/i,
182
+ /^find[_-]?workflows?$/i,
183
+ /^workflows?[_-]?(list|search|find)$/i,
184
+ ]);
185
+ const workflowList = listTool
186
+ ? await callReadTool(client, listTool, workflowListArgs, "workflow list")
187
+ : skip(
188
+ "workflow list",
189
+ "no workflow-like list tool was found; set SMOKE_N8N_WORKFLOW_LIST_TOOL",
190
+ );
191
+
192
+ const getTool =
193
+ workflowGetTool ??
194
+ findTool(tools, [
195
+ /^get[_-]?workflow$/i,
196
+ /^read[_-]?workflow$/i,
197
+ /^retrieve[_-]?workflow$/i,
198
+ ]);
199
+ const workflowRead =
200
+ workflowId && getTool
201
+ ? await callReadTool(client, getTool, workflowGetArgs, "workflow read")
202
+ : skip(
203
+ "workflow read",
204
+ "set SMOKE_N8N_WORKFLOW_ID and SMOKE_N8N_WORKFLOW_GET_TOOL to inspect a disposable workflow",
205
+ );
206
+
207
+ return {
208
+ install,
209
+ toolCount: tools.length,
210
+ availableTools: summarizeTools(tools),
211
+ workflowList: previewObject(workflowList),
212
+ workflowRead: previewObject(workflowRead),
213
+ activationGuardrail:
214
+ "Smoke is read-only by default and does not publish, unpublish, activate, or deactivate production workflows.",
215
+ };
216
+ }
217
+
218
+ function validateInstall(install) {
219
+ if (install.skipped) {
220
+ skip("GraphQL plugin install check", install.reason);
221
+ return;
222
+ }
223
+ if (install.error) {
224
+ failCheck("GraphQL plugin install check", install);
225
+ return;
226
+ }
227
+ if (!install.pluginInstall) {
228
+ failCheck("GraphQL plugin install check", {
229
+ reason: `pluginInstall ${installId} was not found`,
230
+ });
231
+ return;
232
+ }
233
+ const row = install.pluginInstall;
234
+ const componentStates = Object.fromEntries(
235
+ row.components.map((component) => [
236
+ `${component.componentType}:${component.componentKey}`,
237
+ component.state,
238
+ ]),
239
+ );
240
+ const required = ["mcp-server:workflow-management", "infrastructure:runtime"];
241
+ const missing = required.filter((key) => !componentStates[key]);
242
+ if (row.pluginKey !== "n8n" || missing.length > 0) {
243
+ failCheck("GraphQL plugin install check", {
244
+ pluginKey: row.pluginKey,
245
+ state: row.state,
246
+ missing,
247
+ componentStates,
248
+ });
249
+ return;
250
+ }
251
+ pass("GraphQL plugin install check", {
252
+ id: row.id,
253
+ state: row.state,
254
+ componentStates,
255
+ });
256
+ }
257
+
258
+ function assertWorkflowTools(tools) {
259
+ const names = new Set(tools.map(toolName).filter(Boolean));
260
+ const present = requiredTools.filter((tool) => names.has(tool));
261
+ const hasWorkflowNamedTool = [...names].some((name) =>
262
+ /workflow/i.test(name),
263
+ );
264
+ if (present.length === 0 && !hasWorkflowNamedTool) {
265
+ failCheck("n8n MCP exposes workflow tools", {
266
+ requiredTools,
267
+ available: [...names].sort().slice(0, 80),
268
+ });
269
+ return;
270
+ }
271
+ pass("n8n MCP exposes workflow tools", {
272
+ matched: present.length > 0 ? present : ["workflow-named tool"],
273
+ available: [...names].sort().slice(0, 80),
274
+ });
275
+ }
276
+
277
+ async function callReadTool(client, tool, args, label) {
278
+ const result = await client.call(tool, args);
279
+ pass(label, { tool, preview: preview(result) });
280
+ return result;
281
+ }
282
+
283
+ function makeDirectMcpClient() {
284
+ requireEnv("SMOKE_N8N_MCP_URL or SMOKE_N8N_URL", directMcpUrl);
285
+ requireEnv("SMOKE_N8N_MCP_SERVICE_TOKEN", serviceToken);
286
+ return {
287
+ async listTools() {
288
+ return mcpRequest("tools/list", {}, directMcpUrl, {
289
+ authorization: `Bearer ${serviceToken}`,
290
+ }).then((result) => result.tools ?? []);
291
+ },
292
+ async call(tool, args) {
293
+ return mcpRequest(
294
+ "tools/call",
295
+ { name: tool, arguments: args },
296
+ directMcpUrl,
297
+ { authorization: `Bearer ${serviceToken}` },
298
+ ).then(parseMcpToolResult);
299
+ },
300
+ };
301
+ }
302
+
303
+ function makeThinkWorkClient() {
304
+ requireEnv("SMOKE_API_BASE_URL or VITE_API_URL", apiBaseUrl);
305
+ requireEnv("SMOKE_COGNITO_ID_TOKEN", idToken);
306
+ requireEnv("SMOKE_AGENT_ID", agentId);
307
+ return {
308
+ async listTools() {
309
+ const response = await api("/api/mcp/tools/list", { agentId });
310
+ return (response.tools ?? []).filter(
311
+ (tool) => tool.server === serverName,
312
+ );
313
+ },
314
+ async call(tool, args) {
315
+ const response = await api("/api/mcp/tools/call", {
316
+ agentId,
317
+ server: serverName,
318
+ tool,
319
+ arguments: args,
320
+ });
321
+ if (response.isError) {
322
+ throw new Error(
323
+ `n8n tool ${tool} returned isError=true: ${JSON.stringify(response.content ?? []).slice(0, 800)}`,
324
+ );
325
+ }
326
+ return parseMcpProxyContent(response);
327
+ },
328
+ };
329
+ }
330
+
331
+ async function mcpRequest(method, params, url, headers) {
332
+ let id = 1;
333
+ let sessionId = null;
334
+ const initialize = await jsonRpc(url, headers, {
335
+ jsonrpc: "2.0",
336
+ id: id++,
337
+ method: "initialize",
338
+ params: {
339
+ protocolVersion: MCP_PROTOCOL_VERSION,
340
+ capabilities: {},
341
+ clientInfo: { name: "thinkwork-n8n-smoke", version: "1.0.0" },
342
+ },
343
+ });
344
+ sessionId = initialize.sessionId;
345
+ await jsonRpc(
346
+ url,
347
+ headers,
348
+ {
349
+ jsonrpc: "2.0",
350
+ method: "notifications/initialized",
351
+ params: {},
352
+ },
353
+ sessionId,
354
+ );
355
+ const response = await jsonRpc(
356
+ url,
357
+ headers,
358
+ { jsonrpc: "2.0", id: id++, method, params },
359
+ sessionId,
360
+ );
361
+ if (response.body.error) {
362
+ throw new Error(
363
+ `${method} JSON-RPC error: ${JSON.stringify(response.body.error)}`,
364
+ );
365
+ }
366
+ return response.body.result ?? {};
367
+ }
368
+
369
+ async function jsonRpc(url, authHeaders, body, sessionId = null) {
370
+ const response = await fetchWithTimeout(url, {
371
+ method: "POST",
372
+ headers: {
373
+ accept: "application/json, text/event-stream",
374
+ "content-type": "application/json",
375
+ "MCP-Protocol-Version": MCP_PROTOCOL_VERSION,
376
+ ...(sessionId ? { "mcp-session-id": sessionId } : {}),
377
+ ...authHeaders,
378
+ },
379
+ body: JSON.stringify(body),
380
+ });
381
+ const text = await response.text();
382
+ if (!response.ok) {
383
+ throw new Error(`MCP HTTP ${response.status}: ${text.slice(0, 500)}`);
384
+ }
385
+ if (!("id" in body)) return { body: {}, sessionId };
386
+ return {
387
+ body: parseMcpResponse(text, response.headers.get("content-type")),
388
+ sessionId: response.headers.get("mcp-session-id") ?? sessionId,
389
+ };
390
+ }
391
+
392
+ function parseMcpResponse(text, contentType) {
393
+ if (contentType?.includes("text/event-stream")) {
394
+ const data = text
395
+ .split(/\r?\n/)
396
+ .filter((line) => line.startsWith("data:"))
397
+ .map((line) => line.slice(5).trim())
398
+ .join("\n");
399
+ return data ? JSON.parse(data) : {};
400
+ }
401
+ return text ? JSON.parse(text) : {};
402
+ }
403
+
404
+ async function api(pathname, body) {
405
+ const url = new URL(pathname, apiBaseUrl).toString();
406
+ const response = await fetchWithTimeout(url, {
407
+ method: "POST",
408
+ headers: {
409
+ authorization: `Bearer ${idToken}`,
410
+ "content-type": "application/json",
411
+ },
412
+ body: JSON.stringify(body),
413
+ });
414
+ const text = await response.text();
415
+ if (!response.ok) {
416
+ throw new Error(`HTTP ${response.status} ${url}: ${text.slice(0, 500)}`);
417
+ }
418
+ return text ? JSON.parse(text) : {};
419
+ }
420
+
421
+ async function readGraphqlInstall() {
422
+ requireEnv("VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL", graphQlUrl);
423
+ requireEnv("SMOKE_TENANT_ID", tenantId);
424
+ if (!apiSecret && !apiKey) {
425
+ throw new Error(
426
+ "Missing API_AUTH_SECRET/THINKWORK_API_SECRET or GraphQL API key",
427
+ );
428
+ }
429
+ const data = await gql(
430
+ `query N8nMcpSmokeInstall($id: ID!) {
431
+ pluginInstall(id: $id) {
432
+ id
433
+ pluginKey
434
+ state
435
+ components {
436
+ componentKey
437
+ componentType
438
+ state
439
+ handlerRef
440
+ lastError
441
+ }
442
+ }
443
+ }`,
444
+ { id: installId },
445
+ );
446
+ return { pluginInstall: data.pluginInstall };
447
+ }
448
+
449
+ async function gql(query, variables) {
450
+ const headers = {
451
+ "content-type": "application/json",
452
+ "x-tenant-id": tenantId,
453
+ };
454
+ if (apiSecret) headers.authorization = `Bearer ${apiSecret}`;
455
+ if (apiKey) headers["x-api-key"] = apiKey;
456
+
457
+ const response = await fetchWithTimeout(graphQlUrl, {
458
+ method: "POST",
459
+ headers,
460
+ body: JSON.stringify({ query, variables }),
461
+ });
462
+ const text = await response.text();
463
+ if (!response.ok) {
464
+ throw new Error(`GraphQL HTTP ${response.status}: ${text.slice(0, 500)}`);
465
+ }
466
+ const body = JSON.parse(text);
467
+ if (body.errors?.length) {
468
+ throw new Error(`GraphQL errors: ${JSON.stringify(body.errors)}`);
469
+ }
470
+ return body.data;
471
+ }
472
+
473
+ function parseMcpProxyContent(response) {
474
+ if (response.structuredContent)
475
+ return unwrapToolPayload(response.structuredContent);
476
+ const text = response.content?.find?.((item) => item.type === "text")?.text;
477
+ if (!text) return response;
478
+ try {
479
+ return unwrapToolPayload(JSON.parse(text));
480
+ } catch {
481
+ return { text };
482
+ }
483
+ }
484
+
485
+ function parseMcpToolResult(result) {
486
+ if (result.structuredContent)
487
+ return unwrapToolPayload(result.structuredContent);
488
+ const text = result.content?.find?.((item) => item.type === "text")?.text;
489
+ if (!text) return result;
490
+ try {
491
+ return unwrapToolPayload(JSON.parse(text));
492
+ } catch {
493
+ return { text };
494
+ }
495
+ }
496
+
497
+ function unwrapToolPayload(value) {
498
+ if (
499
+ value &&
500
+ typeof value === "object" &&
501
+ !Array.isArray(value) &&
502
+ Object.prototype.hasOwnProperty.call(value, "result")
503
+ ) {
504
+ return value.result;
505
+ }
506
+ return value;
507
+ }
508
+
509
+ async function fetchWithTimeout(url, options = {}) {
510
+ const controller = new AbortController();
511
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
512
+ try {
513
+ return await fetch(url, { ...options, signal: controller.signal });
514
+ } finally {
515
+ clearTimeout(timer);
516
+ }
517
+ }
518
+
519
+ function findTool(tools, patterns) {
520
+ for (const pattern of patterns) {
521
+ const match = tools.find((tool) => pattern.test(toolName(tool)));
522
+ if (match) return toolName(match);
523
+ }
524
+ return null;
525
+ }
526
+
527
+ function summarizeTools(tools) {
528
+ return tools
529
+ .map((tool) => ({
530
+ name: toolName(tool),
531
+ server: tool.server,
532
+ description: tool.description
533
+ ? String(tool.description).slice(0, 160)
534
+ : undefined,
535
+ }))
536
+ .sort((a, b) => String(a.name).localeCompare(String(b.name)));
537
+ }
538
+
539
+ function toolName(tool) {
540
+ return String(tool?.name ?? tool?.tool ?? "");
541
+ }
542
+
543
+ function pass(name, detail) {
544
+ checks.push({ name, ok: true, ...(detail ? { detail } : {}) });
545
+ console.log(`PASS - ${name}${detail ? `: ${JSON.stringify(detail)}` : ""}`);
546
+ }
547
+
548
+ function failCheck(name, detail) {
549
+ checks.push({ name, ok: false, ...(detail ? { detail } : {}) });
550
+ console.log(`FAIL - ${name}${detail ? `: ${JSON.stringify(detail)}` : ""}`);
551
+ }
552
+
553
+ function skip(name, reason) {
554
+ checks.push({ name, ok: true, skipped: true, reason });
555
+ console.log(`SKIP - ${name}: ${reason}`);
556
+ return { skipped: true, reason };
557
+ }
558
+
559
+ function parseJsonEnv(name, value, fallback) {
560
+ if (!value) return fallback;
561
+ try {
562
+ return JSON.parse(value);
563
+ } catch (error) {
564
+ throw new Error(
565
+ `${name} must be valid JSON: ${error instanceof Error ? error.message : String(error)}`,
566
+ );
567
+ }
568
+ }
569
+
570
+ function csv(value) {
571
+ return String(value ?? "")
572
+ .split(",")
573
+ .map((entry) => entry.trim())
574
+ .filter(Boolean);
575
+ }
576
+
577
+ function requireEnv(label, value) {
578
+ if (!value) {
579
+ throw new Error(`Missing required live smoke env: ${label}`);
580
+ }
581
+ }
582
+
583
+ function first(...values) {
584
+ return values.find(
585
+ (value) => value !== undefined && value !== null && value !== "",
586
+ );
587
+ }
588
+
589
+ function preview(value) {
590
+ return JSON.stringify(value ?? null).slice(0, 1_500);
591
+ }
592
+
593
+ function previewObject(value) {
594
+ if (value?.skipped) return value;
595
+ return { preview: preview(value) };
596
+ }
597
+
598
+ function loadEnvFile() {
599
+ const explicit = process.env.COMPUTER_ENV_FILE;
600
+ if (explicit === "none") return {};
601
+ const candidates = [explicit, "apps/web/.env", ".env"].filter(Boolean);
602
+
603
+ for (const candidate of candidates) {
604
+ const resolved = path.resolve(candidate);
605
+ if (!fs.existsSync(resolved)) continue;
606
+ return Object.fromEntries(
607
+ fs
608
+ .readFileSync(resolved, "utf8")
609
+ .split(/\r?\n/)
610
+ .map((line) => line.trim())
611
+ .filter((line) => line && !line.startsWith("#") && line.includes("="))
612
+ .map((line) => {
613
+ const index = line.indexOf("=");
614
+ const key = line.slice(0, index).trim();
615
+ const value = line
616
+ .slice(index + 1)
617
+ .trim()
618
+ .replace(/^['"]|['"]$/g, "");
619
+ return [key, value];
620
+ }),
621
+ );
622
+ }
623
+ return {};
624
+ }