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.
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 +22157 -9229
  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,30 @@
1
+ # SendGrid Plugin
2
+
3
+ The SendGrid plugin is the package-owned source boundary for SendGrid-backed
4
+ tenant invitation email. It declares SendGrid as a standalone email provider so
5
+ operators can install and inspect it from Settings -> Plugins instead of finding
6
+ SendGrid hidden inside the Resend channel package.
7
+
8
+ Shared platform code owns credential storage, authenticated-domain discovery,
9
+ readiness checks, provider selection, and invitation delivery. This package owns
10
+ the catalog identity and provider capability contract.
11
+
12
+ ## Owned Source
13
+
14
+ - `src/manifest.ts` declares the catalog manifest and email-channel capability.
15
+ - `src/provider-contract.ts` holds SendGrid provider metadata and the shared
16
+ settings surface identity.
17
+ - `test/manifest.test.ts` validates provider scope, settings surface, and
18
+ package descriptor boundaries.
19
+
20
+ ## Verification Notes
21
+
22
+ Package-local verification:
23
+
24
+ ```bash
25
+ pnpm --filter @thinkwork/plugin-sendgrid test
26
+ pnpm --filter @thinkwork/plugin-sendgrid typecheck
27
+ pnpm --filter @thinkwork/plugin-catalog test
28
+ pnpm --filter @thinkwork/plugin-catalog typecheck
29
+ node scripts/verify-plugin-source-boundary.mjs
30
+ ```
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@thinkwork/plugin-sendgrid",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./manifest": "./src/manifest.ts",
10
+ "./provider-contract": "./src/provider-contract.ts"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc --build",
14
+ "typecheck": "tsc --noEmit",
15
+ "test": "vitest run"
16
+ },
17
+ "devDependencies": {
18
+ "@thinkwork/plugin-catalog": "workspace:*",
19
+ "typescript": "^5.5.0",
20
+ "vitest": "^2.0.0"
21
+ }
22
+ }
@@ -0,0 +1,36 @@
1
+ import { sendgridManifest } from "./manifest";
2
+
3
+ export const sendgridPluginPackage = {
4
+ packageKey: "sendgrid",
5
+ sourceRoot: "plugins/sendgrid",
6
+ manifest: sendgridManifest,
7
+ ownedSources: [
8
+ {
9
+ kind: "manifest",
10
+ path: "plugins/sendgrid/src/manifest.ts",
11
+ description:
12
+ "SendGrid Email catalog manifest and provider capability contract.",
13
+ },
14
+ {
15
+ kind: "api",
16
+ path: "plugins/sendgrid/src/provider-contract.ts",
17
+ description:
18
+ "SendGrid Email provider keys and package-local channel contract metadata.",
19
+ },
20
+ {
21
+ kind: "tests",
22
+ path: "plugins/sendgrid/test",
23
+ description:
24
+ "SendGrid Email package-local manifest and provider scope tests.",
25
+ },
26
+ {
27
+ kind: "docs",
28
+ path: "plugins/sendgrid/README.md",
29
+ description: "SendGrid Email package ownership and verification notes.",
30
+ },
31
+ ],
32
+ compatibilityLinks: [],
33
+ } as const;
34
+
35
+ export { sendgridManifest };
36
+ export * from "./provider-contract";
@@ -0,0 +1,37 @@
1
+ import type { PluginManifest } from "@thinkwork/plugin-catalog/contracts";
2
+
3
+ import {
4
+ SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
5
+ SENDGRID_SETTINGS_SURFACE,
6
+ sendGridEmailChannelProviders,
7
+ } from "./provider-contract";
8
+
9
+ export const sendgridManifest = {
10
+ pluginKey: "sendgrid",
11
+ displayName: "SendGrid Email",
12
+ description:
13
+ "SendGrid email provider for tenant member invitations with authenticated-domain readiness.",
14
+ versions: [
15
+ {
16
+ version: "0.1.0",
17
+ requiredOauthScopes: [],
18
+ capabilities: [
19
+ {
20
+ type: "email-channel",
21
+ key: SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
22
+ displayName: "SendGrid invitation email",
23
+ providers: sendGridEmailChannelProviders,
24
+ settingsSurface: SENDGRID_SETTINGS_SURFACE,
25
+ },
26
+ ],
27
+ components: [
28
+ {
29
+ type: "ui-surface",
30
+ key: "settings",
31
+ displayName: "SendGrid Email settings",
32
+ intendedMount: SENDGRID_SETTINGS_SURFACE,
33
+ },
34
+ ],
35
+ },
36
+ ],
37
+ } satisfies PluginManifest;
@@ -0,0 +1,14 @@
1
+ import type { EmailChannelProviderOption } from "@thinkwork/plugin-catalog/contracts";
2
+
3
+ export const SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY =
4
+ "sendgrid-email-provider" as const;
5
+ export const SENDGRID_SETTINGS_SURFACE =
6
+ "settings.plugins.email-channel" as const;
7
+
8
+ export const sendGridEmailChannelProviders = [
9
+ {
10
+ key: "sendgrid",
11
+ displayName: "SendGrid",
12
+ recommended: true,
13
+ },
14
+ ] satisfies EmailChannelProviderOption[];
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ validatePluginManifest,
5
+ type EmailChannelCapability,
6
+ type PluginManifest,
7
+ } from "@thinkwork/plugin-catalog/contracts";
8
+ import { defineFirstPartyPluginPackage } from "@thinkwork/plugin-catalog/plugin-package";
9
+
10
+ import { sendgridPluginPackage } from "../src";
11
+ import { sendgridManifest } from "../src/manifest";
12
+ import {
13
+ SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
14
+ SENDGRID_SETTINGS_SURFACE,
15
+ sendGridEmailChannelProviders,
16
+ } from "../src/provider-contract";
17
+
18
+ function emailCapability(
19
+ manifest: PluginManifest = sendgridManifest as PluginManifest,
20
+ ): EmailChannelCapability {
21
+ const capability = manifest.versions[0].capabilities?.find(
22
+ (candidate) => candidate.type === "email-channel",
23
+ );
24
+ if (capability?.type !== "email-channel") {
25
+ throw new Error(
26
+ "SendGrid manifest is missing its email-channel capability",
27
+ );
28
+ }
29
+ return capability;
30
+ }
31
+
32
+ describe("SendGrid plugin manifest", () => {
33
+ it("validates as a standalone email provider plugin", () => {
34
+ const validated = validatePluginManifest(sendgridManifest);
35
+
36
+ expect(validated.pluginKey).toBe("sendgrid");
37
+ expect(validated.displayName).toBe("SendGrid Email");
38
+ expect(validated.versions[0].requiredOauthScopes).toEqual([]);
39
+ expect(validated.versions[0].components).toEqual([
40
+ {
41
+ type: "ui-surface",
42
+ key: "settings",
43
+ displayName: "SendGrid Email settings",
44
+ intendedMount: SENDGRID_SETTINGS_SURFACE,
45
+ },
46
+ ]);
47
+ });
48
+
49
+ it("declares only the SendGrid provider option", () => {
50
+ expect(sendGridEmailChannelProviders).toEqual([
51
+ {
52
+ key: "sendgrid",
53
+ displayName: "SendGrid",
54
+ recommended: true,
55
+ },
56
+ ]);
57
+
58
+ const capability = emailCapability();
59
+ expect(capability).toMatchObject({
60
+ type: "email-channel",
61
+ key: SENDGRID_EMAIL_CHANNEL_CAPABILITY_KEY,
62
+ settingsSurface: SENDGRID_SETTINGS_SURFACE,
63
+ });
64
+ expect(capability.providers).toEqual(sendGridEmailChannelProviders);
65
+ });
66
+
67
+ it("defines a first-party package boundary under plugins/sendgrid", () => {
68
+ const defined = defineFirstPartyPluginPackage(sendgridPluginPackage);
69
+
70
+ expect(defined.packageKey).toBe("sendgrid");
71
+ expect(defined.sourceRoot).toBe("plugins/sendgrid");
72
+ expect(defined.ownedSources).toContainEqual({
73
+ kind: "manifest",
74
+ path: "plugins/sendgrid/src/manifest.ts",
75
+ description:
76
+ "SendGrid Email catalog manifest and provider capability contract.",
77
+ });
78
+ expect(defined.compatibilityLinks).toEqual([]);
79
+ });
80
+ });
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "."
6
+ },
7
+ "include": ["./**/*.ts"]
8
+ }
@@ -0,0 +1,78 @@
1
+ # Twenty Plugin
2
+
3
+ Twenty CRM is a first-party application plugin package for the THNK-31
4
+ `plugins/<plugin-key>/` source boundary. It owns the Twenty catalog manifest,
5
+ managed-app/MCP smoke contracts, package tests, and migration notes for the
6
+ remaining infrastructure and activation source.
7
+
8
+ ## Package Contract
9
+
10
+ - `package.json` exposes `@thinkwork/plugin-twenty`.
11
+ - `src/index.ts` exports `twentyPluginPackage` with owned source descriptors
12
+ and compatibility links.
13
+ - `src/manifest.ts` owns the Twenty catalog manifest.
14
+ - `src/deployment/managed-app.ts` owns the Twenty managed-app deployment
15
+ adapter.
16
+ - `src/api/cutover.ts` owns the Twenty MCP cutover orchestration contract.
17
+ - The latest manifest version also declares the `client-engagement`
18
+ `ui-surface` component. Updating an installed Twenty plugin to that version
19
+ records a provisioned no-op UI component; the day-to-day app launches from the
20
+ main ThinkWork `Apps` surface, not from Settings.
21
+ - `twenty-app/` owns the native Twenty app source package. It installs as an
22
+ application named `ThinkWork` and exposes a logic function named
23
+ `ThinkWork Webhook` as a workflow action. Its native Settings tab includes
24
+ a `ThinkWork Webhook` configuration form that saves the app's webhook URL and
25
+ trigger-stage application variables.
26
+ - `terraform/twenty/` owns the Twenty managed-app Terraform module.
27
+ - `smoke/` owns Twenty managed-app and MCP OAuth smoke scripts.
28
+ - `test/manifest.test.ts` keeps Twenty endpoint, OAuth, infrastructure, and
29
+ managed-app input contracts aligned, including the presence of the native
30
+ Twenty app package.
31
+
32
+ ## Verification
33
+
34
+ ```bash
35
+ pnpm --filter @thinkwork/plugin-twenty test
36
+ pnpm --filter @thinkwork/plugin-twenty typecheck
37
+ ```
38
+
39
+ The native Twenty app is intentionally a nested Twenty/Yarn project, not a
40
+ pnpm workspace package. See `twenty-app/README.md` for dry-run and sync
41
+ instructions, or use `plugins/twenty/scripts/sync-thinkwork-app.mjs` from the
42
+ guarded deploy workflow path.
43
+
44
+ The workflow wiring is also explicit and guarded. The target Twenty workflow
45
+ must call the native `ThinkWork -> ThinkWork Webhook` action instead of the
46
+ built-in `HTTP_REQUEST` action, with the webhook URL and trigger stage coming
47
+ from the installed ThinkWork app settings.
48
+
49
+ ## Client Engagement App Surface
50
+
51
+ Twenty contributes the first ThinkWork plugin app: **Client Engagement**. The
52
+ surface is declared in the plugin manifest as a trusted bundled React app with
53
+ route segment `client-engagement` and app key `twenty-client-engagement`.
54
+
55
+ Operational split:
56
+
57
+ - Settings remains the install, update, infrastructure, MCP, and reconnect
58
+ surface. Operators install or update Twenty from Settings, and users reconnect
59
+ OAuth there when readiness requires it.
60
+ - Apps is the usage surface. When the installed Twenty plugin includes the
61
+ provisioned `client-engagement` `ui-surface` component, the main shell shows
62
+ `Apps`, and selecting Client Engagement opens
63
+ `/apps/twenty/client-engagement`.
64
+ - CRM-owned records load through ThinkWork GraphQL resolvers that call the
65
+ authenticated Twenty plugin path on the server. Browser code must not receive
66
+ MCP bearer tokens, tenant-wide CRM credentials, or raw MCP endpoint secrets.
67
+ - ThinkWork-owned engagement fields persist through plugin app overlay state,
68
+ not browser `localStorage`.
69
+
70
+ Readiness expectations:
71
+
72
+ - If the app surface is not installed, it does not appear in Apps.
73
+ - If Twenty is installed but the runtime/MCP component is unavailable, the app
74
+ route renders a readiness message with an operator settings action.
75
+ - If the current user has not connected or needs to reconnect Twenty, the app
76
+ route renders a plugin settings action.
77
+ - Updating an older Twenty install to the latest manifest version is the
78
+ supported path for enabling the Client Engagement app on existing tenants.
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@thinkwork/plugin-twenty",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./manifest": "./src/manifest.ts",
10
+ "./api/cutover": "./src/api/cutover.ts",
11
+ "./deployment/managed-app": "./src/deployment/managed-app.ts"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc --build",
15
+ "typecheck": "tsc --noEmit",
16
+ "test": "vitest run"
17
+ },
18
+ "dependencies": {
19
+ "graphql": "^16.10.0"
20
+ },
21
+ "devDependencies": {
22
+ "@thinkwork/deployment-runner": "workspace:*",
23
+ "@thinkwork/plugin-catalog": "workspace:*",
24
+ "typescript": "^5.5.0",
25
+ "vitest": "^2.0.0"
26
+ }
27
+ }
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import {
4
+ buildTwentyRemoteConfig,
5
+ dryRunTwentyCommand,
6
+ } from "../sync-thinkwork-app.mjs";
7
+
8
+ describe("sync-thinkwork-app", () => {
9
+ it("builds a Twenty remote config from an empty config file", () => {
10
+ const config = buildTwentyRemoteConfig(
11
+ {},
12
+ {
13
+ remoteName: "thinkwork-crm",
14
+ url: "https://crm.thinkwork.ai",
15
+ apiKey: "test-key",
16
+ },
17
+ );
18
+
19
+ expect(config).toEqual({
20
+ version: 1,
21
+ defaultRemote: "thinkwork-crm",
22
+ remotes: {
23
+ "thinkwork-crm": {
24
+ apiUrl: "https://crm.thinkwork.ai",
25
+ apiKey: "test-key",
26
+ },
27
+ },
28
+ });
29
+ });
30
+
31
+ it("preserves existing Twenty remotes while selecting the ThinkWork remote", () => {
32
+ const config = buildTwentyRemoteConfig(
33
+ {
34
+ version: 1,
35
+ defaultRemote: "local",
36
+ remotes: {
37
+ local: {
38
+ apiUrl: "http://localhost:2020",
39
+ },
40
+ },
41
+ },
42
+ {
43
+ remoteName: "thinkwork-crm",
44
+ url: "https://crm.thinkwork.ai",
45
+ apiKey: "test-key",
46
+ },
47
+ );
48
+
49
+ expect(config.defaultRemote).toBe("thinkwork-crm");
50
+ expect(config.remotes.local).toEqual({
51
+ apiUrl: "http://localhost:2020",
52
+ });
53
+ expect(config.remotes["thinkwork-crm"]).toEqual({
54
+ apiUrl: "https://crm.thinkwork.ai",
55
+ apiKey: "test-key",
56
+ });
57
+ });
58
+
59
+ it("validates remote auth in dry-run mode without calling unsupported sync dry-run", () => {
60
+ expect(dryRunTwentyCommand("thinkwork-crm")).toEqual([
61
+ "twenty",
62
+ "--remote",
63
+ "thinkwork-crm",
64
+ "remote:status",
65
+ ]);
66
+ });
67
+ });
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import process from "node:process";
7
+ import { pathToFileURL } from "node:url";
8
+
9
+ const DEFAULT_REMOTE = "thinkwork-crm";
10
+ const DEFAULT_APP_DIR = "plugins/twenty/twenty-app";
11
+
12
+ function parseArgs(argv) {
13
+ const args = {
14
+ appDir: process.env.TWENTY_THINKWORK_APP_DIR || DEFAULT_APP_DIR,
15
+ remoteName: process.env.TWENTY_THINKWORK_APP_REMOTE_NAME || DEFAULT_REMOTE,
16
+ dryRun: process.env.TWENTY_THINKWORK_APP_SYNC_DRY_RUN !== "0",
17
+ };
18
+
19
+ for (let index = 0; index < argv.length; index += 1) {
20
+ const arg = argv[index];
21
+ if (arg === "--app-dir") {
22
+ args.appDir = requireValue(argv, ++index, arg);
23
+ } else if (arg === "--remote-name") {
24
+ args.remoteName = requireValue(argv, ++index, arg);
25
+ } else if (arg === "--url") {
26
+ args.url = requireValue(argv, ++index, arg);
27
+ } else if (arg === "--api-key") {
28
+ args.apiKey = requireValue(argv, ++index, arg);
29
+ } else if (arg === "--dry-run") {
30
+ args.dryRun = true;
31
+ } else if (arg === "--apply") {
32
+ args.dryRun = false;
33
+ } else {
34
+ throw new Error(`Unknown argument: ${arg}`);
35
+ }
36
+ }
37
+
38
+ args.url ||= process.env.TWENTY_PUBLIC_URL;
39
+ args.apiKey ||=
40
+ process.env.TWENTY_DEPLOY_API_KEY || process.env.TWENTY_APP_SYNC_API_KEY;
41
+ return args;
42
+ }
43
+
44
+ function requireValue(argv, index, flag) {
45
+ const value = argv[index];
46
+ if (!value || value.startsWith("--")) {
47
+ throw new Error(`${flag} requires a value.`);
48
+ }
49
+ return value;
50
+ }
51
+
52
+ function validateUrl(url) {
53
+ if (!url) {
54
+ throw new Error("Set TWENTY_PUBLIC_URL or pass --url.");
55
+ }
56
+ const parsed = new URL(url);
57
+ if (parsed.protocol !== "https:" && parsed.hostname !== "localhost") {
58
+ throw new Error(`Twenty URL must be HTTPS or localhost, got ${url}.`);
59
+ }
60
+ return parsed.toString().replace(/\/$/, "");
61
+ }
62
+
63
+ function run(command, args, options) {
64
+ const result = spawnSync(command, args, {
65
+ cwd: options.cwd,
66
+ env: {
67
+ ...process.env,
68
+ YARN_ENABLE_IMMUTABLE_INSTALLS: "false",
69
+ },
70
+ stdio: "inherit",
71
+ });
72
+ if (result.error) throw result.error;
73
+ if (result.status !== 0) {
74
+ throw new Error(`${command} ${args.join(" ")} exited ${result.status}.`);
75
+ }
76
+ }
77
+
78
+ function readTwentyConfig(configPath) {
79
+ if (!fs.existsSync(configPath)) {
80
+ return {};
81
+ }
82
+
83
+ const rawConfig = fs.readFileSync(configPath, "utf8");
84
+ if (rawConfig.trim() === "") {
85
+ return {};
86
+ }
87
+
88
+ return JSON.parse(rawConfig);
89
+ }
90
+
91
+ export function buildTwentyRemoteConfig(
92
+ existingConfig,
93
+ { remoteName, url, apiKey },
94
+ ) {
95
+ return {
96
+ ...existingConfig,
97
+ version: existingConfig.version ?? 1,
98
+ defaultRemote: remoteName,
99
+ remotes: {
100
+ ...existingConfig.remotes,
101
+ [remoteName]: {
102
+ apiUrl: url,
103
+ apiKey,
104
+ },
105
+ },
106
+ };
107
+ }
108
+
109
+ function writeTwentyRemoteConfig({ remoteName, url, apiKey }) {
110
+ const configDir = path.join(os.homedir(), ".twenty");
111
+ const configPath = path.join(configDir, "config.json");
112
+ fs.mkdirSync(configDir, { recursive: true });
113
+ const existingConfig = readTwentyConfig(configPath);
114
+ fs.writeFileSync(
115
+ configPath,
116
+ JSON.stringify(
117
+ buildTwentyRemoteConfig(existingConfig, { remoteName, url, apiKey }),
118
+ null,
119
+ 2,
120
+ ),
121
+ );
122
+ }
123
+
124
+ export function dryRunTwentyCommand(remoteName) {
125
+ return ["twenty", "--remote", remoteName, "remote:status"];
126
+ }
127
+
128
+ function main() {
129
+ const args = parseArgs(process.argv.slice(2));
130
+ const url = validateUrl(args.url);
131
+ if (!args.apiKey) {
132
+ throw new Error(
133
+ "Set TWENTY_DEPLOY_API_KEY, TWENTY_APP_SYNC_API_KEY, or pass --api-key.",
134
+ );
135
+ }
136
+
137
+ console.log(
138
+ JSON.stringify(
139
+ {
140
+ app: "ThinkWork",
141
+ remoteName: args.remoteName,
142
+ url,
143
+ mode: args.dryRun ? "dry-run" : "apply",
144
+ note: args.dryRun
145
+ ? "Dry run validates the package and Twenty remote credentials without deploying or installing."
146
+ : "Apply deploys the private app package to Twenty and installs it into the target workspace.",
147
+ },
148
+ null,
149
+ 2,
150
+ ),
151
+ );
152
+
153
+ run("corepack", ["enable"], { cwd: args.appDir });
154
+ run("yarn", ["install"], { cwd: args.appDir });
155
+ writeTwentyRemoteConfig({
156
+ remoteName: args.remoteName,
157
+ url,
158
+ apiKey: args.apiKey,
159
+ });
160
+
161
+ if (args.dryRun) {
162
+ run("yarn", dryRunTwentyCommand(args.remoteName), {
163
+ cwd: args.appDir,
164
+ });
165
+ return;
166
+ }
167
+
168
+ run(
169
+ "yarn",
170
+ ["twenty", "app:publish", "--private", "--remote", args.remoteName],
171
+ { cwd: args.appDir },
172
+ );
173
+ run("yarn", ["twenty", "app:install", "--remote", args.remoteName], {
174
+ cwd: args.appDir,
175
+ });
176
+ }
177
+
178
+ if (import.meta.url === pathToFileURL(process.argv[1]).href) {
179
+ try {
180
+ main();
181
+ } catch (error) {
182
+ console.error(error instanceof Error ? error.message : String(error));
183
+ process.exit(1);
184
+ }
185
+ }