thinkwork-cli 0.12.12 → 0.12.16

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 (475) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
  4. package/dist/cli.js +23823 -10151
  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/0197_rcm_context_columns.sql +28 -0
  218. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  219. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  220. package/dist/drizzle/meta/_journal.json +160 -0
  221. package/dist/plugins/README.md +162 -0
  222. package/dist/plugins/catalog/package.json +40 -0
  223. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  224. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  225. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  226. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  227. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  229. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  230. package/dist/plugins/catalog/src/catalog.ts +434 -0
  231. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  232. package/dist/plugins/catalog/src/index.ts +4 -0
  233. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  234. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  235. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  236. package/dist/plugins/catalog/tsconfig.json +8 -0
  237. package/dist/plugins/company-brain/README.md +37 -0
  238. package/dist/plugins/company-brain/package.json +33 -0
  239. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  240. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  241. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  244. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  245. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  246. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  247. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  248. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  249. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  250. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  251. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  252. package/dist/plugins/company-brain/src/index.ts +62 -0
  253. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  254. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  255. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  256. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  257. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  258. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  259. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  260. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  261. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  262. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  263. package/dist/plugins/company-brain/tsconfig.json +8 -0
  264. package/dist/plugins/company-data/README.md +49 -0
  265. package/dist/plugins/company-data/package.json +21 -0
  266. package/dist/plugins/company-data/src/index.ts +30 -0
  267. package/dist/plugins/company-data/src/manifest.ts +26 -0
  268. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  269. package/dist/plugins/company-data/tsconfig.json +8 -0
  270. package/dist/plugins/company-etl/README.md +46 -0
  271. package/dist/plugins/company-etl/package.json +21 -0
  272. package/dist/plugins/company-etl/src/index.ts +29 -0
  273. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  274. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  275. package/dist/plugins/company-etl/tsconfig.json +8 -0
  276. package/dist/plugins/email-channel/README.md +41 -0
  277. package/dist/plugins/email-channel/package.json +22 -0
  278. package/dist/plugins/email-channel/src/index.ts +36 -0
  279. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  280. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  281. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  282. package/dist/plugins/email-channel/tsconfig.json +8 -0
  283. package/dist/plugins/lastmile/README.md +50 -0
  284. package/dist/plugins/lastmile/package.json +23 -0
  285. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  286. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  287. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  288. package/dist/plugins/lastmile/src/index.ts +46 -0
  289. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  290. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  291. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  292. package/dist/plugins/lastmile/tsconfig.json +8 -0
  293. package/dist/plugins/n8n/README.md +201 -0
  294. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  295. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  296. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  297. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  298. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  299. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  300. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  301. package/dist/plugins/n8n/package.json +35 -0
  302. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  304. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  305. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  306. package/dist/plugins/n8n/runtime/package.json +7 -0
  307. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  308. package/dist/plugins/n8n/smoke/README.md +95 -0
  309. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  310. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  311. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  312. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  313. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  314. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  315. package/dist/plugins/n8n/src/index.ts +79 -0
  316. package/dist/plugins/n8n/src/manifest.ts +403 -0
  317. package/dist/plugins/n8n/src/package-config.ts +186 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  321. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  322. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  323. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  324. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  326. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  327. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  328. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  329. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  330. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  331. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  332. package/dist/plugins/n8n/tsconfig.json +8 -0
  333. package/dist/plugins/sendgrid/README.md +30 -0
  334. package/dist/plugins/sendgrid/package.json +22 -0
  335. package/dist/plugins/sendgrid/src/index.ts +36 -0
  336. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  337. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  338. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  339. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  340. package/dist/plugins/twenty/README.md +78 -0
  341. package/dist/plugins/twenty/package.json +27 -0
  342. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  343. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  344. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  345. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  346. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  347. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  348. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  349. package/dist/plugins/twenty/src/index.ts +55 -0
  350. package/dist/plugins/twenty/src/manifest.ts +259 -0
  351. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  352. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  353. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  354. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  355. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  356. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  357. package/dist/plugins/twenty/tsconfig.json +9 -0
  358. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  359. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  360. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  361. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  362. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  363. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  364. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  365. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  366. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  367. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  368. package/dist/plugins/workos-auth/package.json +22 -0
  369. package/dist/plugins/workos-auth/src/index.ts +30 -0
  370. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  371. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  372. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  373. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  374. package/dist/scripts/bootstrap-workspace.sh +162 -0
  375. package/dist/scripts/post-deploy.sh +290 -0
  376. package/dist/terraform/examples/greenfield/main.tf +903 -75
  377. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  381. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  382. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  383. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  384. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  385. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  386. package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
  387. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  388. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  389. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  390. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  391. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  392. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  399. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  400. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  401. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  402. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  403. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  404. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  405. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  406. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  407. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  408. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  409. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  411. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  412. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  413. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  414. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  415. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  416. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  417. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  418. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  420. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  421. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  422. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  423. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  424. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  425. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  426. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  427. package/dist/terraform/modules/thinkwork/README.md +71 -0
  428. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  429. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  430. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  431. package/dist/terraform/schema.graphql +82 -9
  432. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  433. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  434. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  435. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  436. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  437. package/dist/workspace-defaults/files/SPACE.md +62 -0
  438. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  439. package/dist/workspace-defaults/files/USER.md +40 -0
  440. package/dist/workspace-defaults/files/mcp.json +3 -0
  441. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  442. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  443. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  444. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  446. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  447. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  466. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  467. package/package.json +2 -1
  468. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  469. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  470. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  471. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  472. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  473. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  474. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  475. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,160 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "7",
8
+ "when": 1775838985185,
9
+ "tag": "0000_petite_marvel_apes",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "7",
15
+ "when": 1776000847373,
16
+ "tag": "0001_milky_surge",
17
+ "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "7",
22
+ "when": 1776170219841,
23
+ "tag": "0002_aberrant_mattie_franklin",
24
+ "breakpoints": true
25
+ },
26
+ {
27
+ "idx": 3,
28
+ "version": "7",
29
+ "when": 1776181409083,
30
+ "tag": "0003_exotic_ogun",
31
+ "breakpoints": true
32
+ },
33
+ {
34
+ "idx": 4,
35
+ "version": "7",
36
+ "when": 1776249324500,
37
+ "tag": "0004_glamorous_magneto",
38
+ "breakpoints": true
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "version": "7",
43
+ "when": 1776271655486,
44
+ "tag": "0005_ancient_nocturne",
45
+ "breakpoints": true
46
+ },
47
+ {
48
+ "idx": 6,
49
+ "version": "7",
50
+ "when": 1776276212924,
51
+ "tag": "0006_new_colonel_america",
52
+ "breakpoints": true
53
+ },
54
+ {
55
+ "idx": 7,
56
+ "version": "7",
57
+ "when": 1776376500000,
58
+ "tag": "0007_unique_external_task_id",
59
+ "breakpoints": true
60
+ },
61
+ {
62
+ "idx": 8,
63
+ "version": "7",
64
+ "when": 1776381000000,
65
+ "tag": "0008_external_task_id_column",
66
+ "breakpoints": true
67
+ },
68
+ {
69
+ "idx": 9,
70
+ "version": "7",
71
+ "when": 1776427997385,
72
+ "tag": "0009_evaluations",
73
+ "breakpoints": true
74
+ },
75
+ {
76
+ "idx": 10,
77
+ "version": "7",
78
+ "when": 1776437157851,
79
+ "tag": "0010_eval_agent_template",
80
+ "breakpoints": true
81
+ },
82
+ {
83
+ "idx": 11,
84
+ "version": "7",
85
+ "when": 1776439772657,
86
+ "tag": "0011_eval_run_template",
87
+ "breakpoints": true
88
+ },
89
+ {
90
+ "idx": 12,
91
+ "version": "7",
92
+ "when": 1776537470281,
93
+ "tag": "0013_motionless_white_queen",
94
+ "breakpoints": true
95
+ },
96
+ {
97
+ "idx": 13,
98
+ "version": "7",
99
+ "when": 1776604237639,
100
+ "tag": "0014_wiki_aggregation",
101
+ "breakpoints": true
102
+ },
103
+ {
104
+ "idx": 14,
105
+ "version": "7",
106
+ "when": 1776694413971,
107
+ "tag": "0015_pg_trgm_alias_title_indexes",
108
+ "breakpoints": true
109
+ },
110
+ {
111
+ "idx": 15,
112
+ "version": "7",
113
+ "when": 1776771920106,
114
+ "tag": "0016_wiki_schema_drops",
115
+ "breakpoints": true
116
+ },
117
+ {
118
+ "idx": 16,
119
+ "version": "7",
120
+ "when": 1776790755231,
121
+ "tag": "0017_wiki_places",
122
+ "breakpoints": true
123
+ },
124
+ {
125
+ "idx": 17,
126
+ "version": "7",
127
+ "when": 1776799778139,
128
+ "tag": "0018_agent_workspace_overlay",
129
+ "breakpoints": true
130
+ },
131
+ {
132
+ "idx": 18,
133
+ "version": "7",
134
+ "when": 1776865933950,
135
+ "tag": "0018_cool_firebird",
136
+ "breakpoints": true
137
+ },
138
+ {
139
+ "idx": 19,
140
+ "version": "7",
141
+ "when": 1776878985543,
142
+ "tag": "0019_condemned_dragon_man",
143
+ "breakpoints": true
144
+ },
145
+ {
146
+ "idx": 20,
147
+ "version": "7",
148
+ "when": 1776881659765,
149
+ "tag": "0020_crazy_the_anarchist",
150
+ "breakpoints": true
151
+ },
152
+ {
153
+ "idx": 21,
154
+ "version": "7",
155
+ "when": 1781781055116,
156
+ "tag": "0021_crm_work_links",
157
+ "breakpoints": true
158
+ }
159
+ ]
160
+ }
@@ -0,0 +1,162 @@
1
+ # ThinkWork Plugin Packages
2
+
3
+ `plugins/<plugin-key>/` is the canonical ownership boundary for first-party
4
+ ThinkWork application plugin source. A maintainer should be able to open one
5
+ plugin package and understand the plugin-specific manifest, skills, deployment
6
+ shape, runtime assets, UI surfaces, smoke coverage, tests, and operating notes
7
+ without hunting through shared platform packages.
8
+
9
+ Shared packages still own generic infrastructure: manifest validation, catalog
10
+ build/signing, GraphQL transport, install and activation state machines,
11
+ deployment-runner orchestration, common web shell code, database schema, and
12
+ common test harnesses. Plugin packages own the product-specific source that
13
+ plugs into those contracts.
14
+
15
+ The generic catalog/contract package lives at `plugins/catalog` and is still
16
+ published inside the workspace as `@thinkwork/plugin-catalog`. It is not a
17
+ first-party application plugin; registry generation skips it and discovers only
18
+ real `plugins/<plugin-key>/` application packages.
19
+
20
+ ## Package Contract
21
+
22
+ Each plugin package should include the pieces that apply to that plugin:
23
+
24
+ - `package.json` and `tsconfig.json` so the package participates in the pnpm
25
+ workspace.
26
+ - `src/index.ts` exporting a `FirstPartyPluginPackage` descriptor with
27
+ `packageKey`, `sourceRoot`, the validated manifest, owned source descriptors,
28
+ and temporary compatibility links.
29
+ - `src/manifest.ts` for the versioned catalog manifest.
30
+ - `src/api/` for plugin-specific API/runtime hooks.
31
+ - `src/deployment/` for managed-application adapters.
32
+ - `src/web/` for plugin-specific operator UI panels rendered by shared hosts.
33
+ - `terraform/<managed-app-key>/` for plugin-owned Terraform source.
34
+ - `runtime/` for plugin-owned Dockerfiles or runtime assets.
35
+ - `smoke/` for live or dry-run smoke validation scripts.
36
+ - `test/` for package-local contract and parity tests.
37
+ - `README.md` for review, operation, migration debt, and verification notes.
38
+
39
+ The descriptor is intentionally machine-readable so docs, release tooling,
40
+ source-boundary checks, and plugin-builder output can agree on the same package
41
+ shape.
42
+
43
+ ## Temporary Compatibility Links
44
+
45
+ During THNK-31 migration, a plugin README and descriptor may reference legacy
46
+ paths outside `plugins/<plugin-key>/` only when the path is documented as
47
+ migration debt. Each compatibility link must explain why it remains outside the
48
+ package and which implementation unit or release pass removes it.
49
+
50
+ Compatibility links are not ownership claims. They are breadcrumbs that keep
51
+ review honest while source moves behind the package boundary.
52
+
53
+ ## Shared Platform Code
54
+
55
+ Do not move generic platform code into a plugin package just because a plugin
56
+ uses it. Keep shared contracts and orchestration in the owning workspace package
57
+ and expose a generic extension point when plugin-specific behavior needs to be
58
+ called from shared code.
59
+
60
+ ## Verification
61
+
62
+ For package-local changes, run the plugin package test or typecheck command:
63
+
64
+ ```bash
65
+ pnpm --filter @thinkwork/plugin-<key> test
66
+ pnpm --filter @thinkwork/plugin-<key> typecheck
67
+ ```
68
+
69
+ For catalog contract changes, also run:
70
+
71
+ ```bash
72
+ pnpm --filter @thinkwork/plugin-catalog test
73
+ pnpm --filter @thinkwork/plugin-catalog typecheck
74
+ ```
75
+
76
+ ## Signed Catalog Publication
77
+
78
+ The authored source of truth stays in root `plugins/*` packages. The runtime
79
+ freshness channel is a signed JSON artifact produced from that source by the
80
+ `Plugin Catalog` GitHub Actions workflow.
81
+
82
+ On pull requests that touch `plugins/**`, the workflow:
83
+
84
+ - checks the generated first-party plugin registry;
85
+ - runs the catalog package tests and typecheck;
86
+ - builds a signed catalog with an ephemeral ed25519 key; and
87
+ - verifies the signed JSON before the PR can merge.
88
+
89
+ On pushes to `main`, the workflow publishes a stable GitHub Release asset only
90
+ when catalog-affecting source changed under `plugins/catalog/**`,
91
+ `plugins/<plugin-key>/src/**`, or `plugins/<plugin-key>/package.json`. Docs-only
92
+ changes under plugin folders leave the previous catalog asset in place. A manual
93
+ workflow dispatch can force a publish when an operator needs to republish the
94
+ current `main` catalog.
95
+
96
+ The stable channel is:
97
+
98
+ - release tag: `plugin-catalog-main`;
99
+ - asset: `thinkwork-plugin-catalog-main.json`;
100
+ - private signing secret: `PLUGIN_CATALOG_SIGNING_KEY`; and
101
+ - signed provenance: repository, ref, source commit SHA, generated timestamp,
102
+ catalog digest, and per-version payload digests.
103
+
104
+ The signing key is used only by GitHub Actions. Deployed ThinkWork stages should
105
+ trust the matching public key through runtime configuration and continue to read
106
+ catalog data through ThinkWork GraphQL, not browser-side GitHub calls.
107
+
108
+ ## Runtime Freshness Model
109
+
110
+ Plugin authors change source under `plugins/<plugin-key>/`. The release path
111
+ turns that source into a signed catalog artifact; the deployed API fetches that
112
+ artifact from GitHub, verifies the signature and payload digests, and caches
113
+ only verified snapshots. The browser never fetches GitHub directly, and the API
114
+ never compiles or evaluates plugin TypeScript from GitHub.
115
+
116
+ ThinkWork has four distinct catalog states to keep straight during review:
117
+
118
+ | Layer | Owner | What changes it |
119
+ | ------------------ | ---------------------------------------- | ---------------------------------------------------------------------------------------- |
120
+ | Authored source | `plugins/*` package maintainers | Pull requests that edit manifests, package metadata, skills, adapters, or runtime source |
121
+ | Signed artifact | GitHub Actions `Plugin Catalog` workflow | Merge to `main` with catalog-affecting plugin source, or manual workflow dispatch |
122
+ | API verified cache | Deployed GraphQL API | TTL refresh, conditional GitHub revalidation, or operator `refreshPluginCatalog` |
123
+ | Installed pin | Tenant plugin install state | `installPlugin` or `upgradePlugin` mutations through ThinkWork |
124
+
125
+ Settings -> Plugins reads `pluginCatalog` plus `pluginCatalogMetadata` through
126
+ GraphQL. Operators see the installed pinned version next to the latest verified
127
+ catalog version, the source repository/tag/commit, generated and fetched
128
+ timestamps, stale fallback status, and a `Refresh catalog` action. That action
129
+ calls `refreshPluginCatalog`; it bypasses the API freshness TTL but still uses
130
+ the same signature/digest verification and stale-safe fallback path.
131
+
132
+ If GitHub is unavailable, rate limited, returns a malformed artifact, or serves
133
+ an artifact with a bad signature, the API must not trust it. A previously
134
+ verified snapshot may be served as stale fallback; otherwise the catalog fails
135
+ closed and installed plugin state remains in Aurora.
136
+
137
+ ## Release And Verification Checklist
138
+
139
+ When a plugin version bump should become visible without a full app deploy:
140
+
141
+ 1. Land the plugin source change under `plugins/*` on `main`.
142
+ 2. Confirm the `Plugin Catalog` workflow published
143
+ `thinkwork-plugin-catalog-main.json` on release tag `plugin-catalog-main`.
144
+ 3. Verify the signed artifact with the deployed trusted public key, or at least
145
+ confirm the artifact metadata contains the expected repository, ref, source
146
+ commit SHA, generated timestamp, catalog digest, and version payload digest.
147
+ 4. In a GitHub-backed stage, refresh the API cache by waiting for TTL or using
148
+ the operator `Refresh catalog` action in Settings -> Plugins.
149
+ 5. Confirm Settings -> Plugins shows the expected latest version, source
150
+ metadata, stale/fallback state when applicable, and update availability for
151
+ tenants with an older installed pin.
152
+ 6. Install or upgrade through ThinkWork. Do not substitute a direct Terraform
153
+ apply, vendor cloud login, local Docker Compose run, or manual catalog edit.
154
+ 7. Run the package-owned smoke for the plugin after install/upgrade. For
155
+ LastMile, that means proving `lastmile--crm`, `lastmile--tasks`, and
156
+ `lastmile--routing` through ThinkWork's MCP proxy.
157
+
158
+ Before closing a migration slice, run the source-boundary check:
159
+
160
+ ```bash
161
+ node scripts/verify-plugin-source-boundary.mjs
162
+ ```
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@thinkwork/plugin-catalog",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./catalog": "./src/catalog.ts",
10
+ "./contracts": "./src/contracts.ts",
11
+ "./plugin-package": "./src/plugin-package.ts",
12
+ "./plugins": "./src/registry/index.ts",
13
+ "./registry": "./src/registry/index.ts"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc --build",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run",
19
+ "generate:plugins": "tsx scripts/generate-plugin-registry.ts",
20
+ "check:plugins": "tsx scripts/generate-plugin-registry.ts --check",
21
+ "build:catalog": "tsx scripts/generate-plugin-registry.ts --check && tsx scripts/build-catalog.ts"
22
+ },
23
+ "dependencies": {
24
+ "@thinkwork/plugin-company-brain": "workspace:*",
25
+ "@thinkwork/plugin-company-data": "workspace:*",
26
+ "@thinkwork/plugin-company-etl": "workspace:*",
27
+ "@thinkwork/plugin-email-channel": "workspace:*",
28
+ "@thinkwork/plugin-lastmile": "workspace:*",
29
+ "@thinkwork/plugin-n8n": "workspace:*",
30
+ "@thinkwork/plugin-sendgrid": "workspace:*",
31
+ "@thinkwork/plugin-twenty": "workspace:*",
32
+ "@thinkwork/plugin-workos-auth": "workspace:*"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.6.0",
36
+ "tsx": "^4.21.0",
37
+ "typescript": "^5.5.0",
38
+ "vitest": "^2.0.0"
39
+ }
40
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Build the signed plugin catalog JSON from manifests discovered through the
3
+ * generated `plugins/*` package registry.
4
+ *
5
+ * Signing key input (ed25519 PKCS#8 PEM), in precedence order:
6
+ * 1. `--key <path>` — file containing the private key PEM
7
+ * 2. `PLUGIN_CATALOG_SIGNING_KEY` env var — the PEM content itself
8
+ *
9
+ * Output defaults to `dist/catalog.json` (override with `--out <path>`).
10
+ * Source provenance can be passed explicitly or inherited from GitHub Actions:
11
+ * --source-repository / PLUGIN_CATALOG_SOURCE_REPOSITORY / GITHUB_REPOSITORY
12
+ * --source-ref / PLUGIN_CATALOG_SOURCE_REF / GITHUB_REF_NAME / GITHUB_REF
13
+ * --source-commit / PLUGIN_CATALOG_SOURCE_COMMIT_SHA / GITHUB_SHA
14
+ *
15
+ * Usage: pnpm --filter @thinkwork/plugin-catalog build:catalog -- --key signing-key.pem
16
+ */
17
+
18
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
19
+ import { dirname } from "node:path";
20
+ import { fileURLToPath, pathToFileURL } from "node:url";
21
+
22
+ import {
23
+ buildPluginCatalog,
24
+ signPluginCatalog,
25
+ type PluginCatalogSourceProvenance,
26
+ } from "../src/catalog";
27
+ import type { PluginManifest } from "../src/contracts";
28
+ import { allPluginManifests } from "../src/registry";
29
+
30
+ export function buildSignedCatalogJson(options: {
31
+ manifests: readonly PluginManifest[];
32
+ privateKeyPem: string;
33
+ generatedAt?: Date | string;
34
+ source?: PluginCatalogSourceProvenance;
35
+ }): string {
36
+ const catalog = buildPluginCatalog({
37
+ manifests: options.manifests,
38
+ generatedAt: options.generatedAt,
39
+ source: options.source,
40
+ });
41
+ const document = signPluginCatalog({
42
+ catalog,
43
+ privateKeyPem: options.privateKeyPem,
44
+ signedAt: options.generatedAt,
45
+ });
46
+ return `${JSON.stringify(document, null, 2)}\n`;
47
+ }
48
+
49
+ function readArg(argv: string[], flag: string): string | undefined {
50
+ const index = argv.indexOf(flag);
51
+ if (index === -1) return undefined;
52
+ const value = argv[index + 1];
53
+ if (!value) {
54
+ throw new Error(`${flag} requires a value`);
55
+ }
56
+ return value;
57
+ }
58
+
59
+ function readSourceProvenance(
60
+ argv: string[],
61
+ ): PluginCatalogSourceProvenance | undefined {
62
+ const repository =
63
+ readArg(argv, "--source-repository") ??
64
+ process.env.PLUGIN_CATALOG_SOURCE_REPOSITORY ??
65
+ process.env.GITHUB_REPOSITORY;
66
+ const ref =
67
+ readArg(argv, "--source-ref") ??
68
+ process.env.PLUGIN_CATALOG_SOURCE_REF ??
69
+ process.env.GITHUB_REF_NAME ??
70
+ process.env.GITHUB_REF;
71
+ const commitSha =
72
+ readArg(argv, "--source-commit") ??
73
+ process.env.PLUGIN_CATALOG_SOURCE_COMMIT_SHA ??
74
+ process.env.GITHUB_SHA;
75
+
76
+ const values = [repository, ref, commitSha].filter(Boolean);
77
+ if (values.length === 0) return undefined;
78
+ if (!repository || !ref || !commitSha) {
79
+ throw new Error(
80
+ "Catalog source provenance requires repository, ref, and commit SHA. " +
81
+ "Pass --source-repository, --source-ref, and --source-commit or set the matching env vars.",
82
+ );
83
+ }
84
+ return { repository, ref, commitSha };
85
+ }
86
+
87
+ function main(): void {
88
+ const argv = process.argv.slice(2);
89
+ const keyPath = readArg(argv, "--key");
90
+ const privateKeyPem = keyPath
91
+ ? readFileSync(keyPath, "utf8")
92
+ : process.env.PLUGIN_CATALOG_SIGNING_KEY;
93
+ if (!privateKeyPem) {
94
+ console.error(
95
+ "Missing signing key: pass --key <pem-file> or set PLUGIN_CATALOG_SIGNING_KEY",
96
+ );
97
+ process.exit(1);
98
+ }
99
+
100
+ const outPath =
101
+ readArg(argv, "--out") ??
102
+ fileURLToPath(new URL("../dist/catalog.json", import.meta.url));
103
+ const json = buildSignedCatalogJson({
104
+ manifests: allPluginManifests,
105
+ privateKeyPem,
106
+ source: readSourceProvenance(argv),
107
+ });
108
+ mkdirSync(dirname(outPath), { recursive: true });
109
+ writeFileSync(outPath, json, "utf8");
110
+ console.log(
111
+ `Wrote signed catalog (${allPluginManifests.length} plugin${allPluginManifests.length === 1 ? "" : "s"}) to ${outPath}`,
112
+ );
113
+ }
114
+
115
+ if (
116
+ process.argv[1] &&
117
+ import.meta.url === pathToFileURL(process.argv[1]).href
118
+ ) {
119
+ main();
120
+ }
@@ -0,0 +1,144 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+
5
+ export interface PluginRegistryEntry {
6
+ packageKey: string;
7
+ packageName: string;
8
+ exportName: string;
9
+ manifestExportName: string;
10
+ rawExportName: string;
11
+ }
12
+
13
+ const GENERATED_PATH = new URL(
14
+ "../src/registry/generated-first-party.ts",
15
+ import.meta.url,
16
+ );
17
+
18
+ export function discoverPluginRegistryEntries({
19
+ repoRoot = resolve(fileURLToPath(new URL("../../..", import.meta.url))),
20
+ } = {}): PluginRegistryEntry[] {
21
+ const pluginsRoot = resolve(repoRoot, "plugins");
22
+ return readdirSync(pluginsRoot, { withFileTypes: true })
23
+ .filter((entry) => entry.isDirectory())
24
+ .map((entry) => {
25
+ const packageKey = entry.name;
26
+ const packageJsonPath = resolve(pluginsRoot, packageKey, "package.json");
27
+ if (!existsSync(packageJsonPath)) return null;
28
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")) as {
29
+ name?: string;
30
+ thinkworkPlugin?: {
31
+ catalogPublication?: string;
32
+ };
33
+ };
34
+ if (!packageJson.name?.startsWith("@thinkwork/plugin-")) return null;
35
+ if (packageJson.name === "@thinkwork/plugin-catalog") return null;
36
+ if (packageJson.thinkworkPlugin?.catalogPublication === "deferred") {
37
+ return null;
38
+ }
39
+ const exportName = `${camelCase(packageKey)}PluginPackage`;
40
+ return {
41
+ packageKey,
42
+ packageName: packageJson.name,
43
+ exportName,
44
+ manifestExportName: `${camelCase(packageKey)}Manifest`,
45
+ rawExportName: `raw${pascalCase(packageKey)}PluginPackage`,
46
+ };
47
+ })
48
+ .filter((entry): entry is PluginRegistryEntry => entry !== null)
49
+ .sort((a, b) => a.packageKey.localeCompare(b.packageKey));
50
+ }
51
+
52
+ export function renderPluginRegistry(entries: readonly PluginRegistryEntry[]) {
53
+ const imports = entries
54
+ .map(
55
+ (entry) =>
56
+ `import { ${entry.exportName} as ${entry.rawExportName} } from "${entry.packageName}";`,
57
+ )
58
+ .join("\n");
59
+ const packages = entries
60
+ .map(
61
+ (entry) =>
62
+ `export const ${entry.exportName} = defineFirstPartyPluginPackage(
63
+ ${entry.rawExportName},
64
+ );`,
65
+ )
66
+ .join("\n");
67
+ const manifests = entries
68
+ .map(
69
+ (entry) =>
70
+ `export const ${entry.manifestExportName} = ${entry.exportName}.manifest;`,
71
+ )
72
+ .join("\n");
73
+ const packageList = entries
74
+ .map((entry) => ` ${entry.exportName},`)
75
+ .join("\n");
76
+
77
+ return `// Generated by plugins/catalog/scripts/generate-plugin-registry.ts.
78
+ // Do not edit by hand. Update plugins/*/package.json, then run:
79
+ // pnpm --filter @thinkwork/plugin-catalog generate:plugins
80
+
81
+ import { defineFirstPartyPluginPackage } from "../plugin-package";
82
+ ${imports}
83
+
84
+ ${packages}
85
+
86
+ ${manifests}
87
+
88
+ export const firstPartyPluginPackages = [
89
+ ${packageList}
90
+ ] as const;
91
+
92
+ /**
93
+ * Every repo-authored manifest published to the catalog.
94
+ */
95
+ export const allPluginManifests = firstPartyPluginPackages
96
+ .map((pluginPackage) => pluginPackage.manifest)
97
+ .sort((a, b) => {
98
+ const byName = a.displayName.localeCompare(b.displayName, undefined, {
99
+ sensitivity: "base",
100
+ });
101
+ return byName === 0 ? a.pluginKey.localeCompare(b.pluginKey) : byName;
102
+ });
103
+ `;
104
+ }
105
+
106
+ export function expectedPluginRegistry({
107
+ repoRoot,
108
+ }: { repoRoot?: string } = {}) {
109
+ return renderPluginRegistry(discoverPluginRegistryEntries({ repoRoot }));
110
+ }
111
+
112
+ function camelCase(value: string) {
113
+ return value.replace(/-([a-z0-9])/g, (_match, char: string) =>
114
+ char.toUpperCase(),
115
+ );
116
+ }
117
+
118
+ function pascalCase(value: string) {
119
+ const camel = camelCase(value);
120
+ return `${camel[0]?.toUpperCase() ?? ""}${camel.slice(1)}`;
121
+ }
122
+
123
+ function main() {
124
+ const generatedPath = fileURLToPath(GENERATED_PATH);
125
+ const expected = expectedPluginRegistry();
126
+ if (process.argv.includes("--check")) {
127
+ const actual = readFileSync(generatedPath, "utf8");
128
+ if (actual !== expected) {
129
+ throw new Error(
130
+ `${generatedPath} is stale; run pnpm --filter @thinkwork/plugin-catalog generate:plugins`,
131
+ );
132
+ }
133
+ return;
134
+ }
135
+ writeFileSync(generatedPath, expected, "utf8");
136
+ console.log(`Wrote ${generatedPath}`);
137
+ }
138
+
139
+ if (
140
+ process.argv[1] &&
141
+ import.meta.url === pathToFileURL(process.argv[1]).href
142
+ ) {
143
+ main();
144
+ }