thinkwork-cli 0.12.12 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22123 -9219
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -0,0 +1,655 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Company Brain premium plugin smoke (THNK-15 U8).
4
+ *
5
+ * Dry-run is the default. Set SMOKE_ENABLE_COMPANY_BRAIN_PLUGIN=1 to run live
6
+ * against a deployed stage. Live mode uses the GraphQL service-secret path and
7
+ * can mutate tenant plugin state only after the explicit enable flag is set.
8
+ *
9
+ * Live env:
10
+ * VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL or API_GRAPHQL_URL
11
+ * API_AUTH_SECRET or THINKWORK_API_SECRET
12
+ * SMOKE_TENANT_ID=<tenant uuid>
13
+ * SMOKE_ADMIN_USER_ID=<users.id with owner/admin tenant role>
14
+ *
15
+ * Optional key paths:
16
+ * SMOKE_COMPANY_BRAIN_INSTALL_KEY=<ThinkWork-issued or configured backdoor key>
17
+ * SMOKE_COMPANY_BRAIN_ISSUE_KEY=1
18
+ * SMOKE_PLATFORM_OPERATOR_USER_ID=<users.id allowed to issue premium keys>
19
+ *
20
+ * Without a key path, live mode proves catalog visibility and key-gate
21
+ * failures, then skips install/adoption checks with an explicit reason.
22
+ */
23
+
24
+ import { randomUUID } from "node:crypto";
25
+ import fs from "node:fs";
26
+ import path from "node:path";
27
+ import process from "node:process";
28
+ import { attachSmokeEvidence } from "../../../scripts/smoke/deployment-evidence.mjs";
29
+
30
+ const LIVE_ENABLED = process.env.SMOKE_ENABLE_COMPANY_BRAIN_PLUGIN === "1";
31
+ const PLUGIN_KEY = "company-brain";
32
+ const SUBSTRATE_COMPONENT = "brain-substrate";
33
+ const TIMEOUT_MS = Number(process.env.SMOKE_TIMEOUT_MS || 20_000);
34
+
35
+ const env = { ...loadEnvFile(), ...process.env };
36
+ const graphqlUrl = first(
37
+ env.VITE_GRAPHQL_HTTP_URL,
38
+ env.GRAPHQL_HTTP_URL,
39
+ env.API_GRAPHQL_URL,
40
+ );
41
+ const apiSecret = first(env.API_AUTH_SECRET, env.THINKWORK_API_SECRET);
42
+ const tenantId = first(env.SMOKE_TENANT_ID, env.TENANT_ID);
43
+ const adminUserId = first(env.SMOKE_ADMIN_USER_ID);
44
+ const platformOperatorUserId = first(
45
+ env.SMOKE_PLATFORM_OPERATOR_USER_ID,
46
+ env.SMOKE_ADMIN_USER_ID,
47
+ );
48
+ const configuredInstallKey = first(env.SMOKE_COMPANY_BRAIN_INSTALL_KEY);
49
+ const issueKey = env.SMOKE_COMPANY_BRAIN_ISSUE_KEY === "1";
50
+
51
+ const checks = [];
52
+
53
+ if (!LIVE_ENABLED) {
54
+ console.log(
55
+ JSON.stringify(
56
+ await attachSmokeEvidence(
57
+ "company-brain-plugin",
58
+ {
59
+ ok: true,
60
+ skippedLive: true,
61
+ reason:
62
+ "set SMOKE_ENABLE_COMPANY_BRAIN_PLUGIN=1 to run the deployed Company Brain premium plugin smoke",
63
+ dryRun: {
64
+ requiredWhenRunning: [
65
+ "VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL or API_GRAPHQL_URL",
66
+ "API_AUTH_SECRET or THINKWORK_API_SECRET",
67
+ "SMOKE_TENANT_ID",
68
+ "SMOKE_ADMIN_USER_ID (owner/admin tenant role)",
69
+ ],
70
+ optionalKeyPaths: [
71
+ "SMOKE_COMPANY_BRAIN_INSTALL_KEY (issued key or configured dev/test backdoor)",
72
+ "SMOKE_COMPANY_BRAIN_ISSUE_KEY=1 plus SMOKE_PLATFORM_OPERATOR_USER_ID",
73
+ ],
74
+ verifies: [
75
+ "Company Brain is visible in pluginCatalog for an unentitled tenant",
76
+ "catalog premium metadata is key-gated with product-facing prompt copy",
77
+ "installPlugin without a key fails with INSTALL_KEY_REQUIRED and creates no install",
78
+ "invalid key fails closed and creates no install",
79
+ "valid generated/configured key grants persistent entitlement through installPlugin",
80
+ "install/adoption evidence exposes the Brain substrate deployment job and no-change adoption marker when applicable",
81
+ "plugin detail target and Memory / Ontology route remain stable",
82
+ ],
83
+ },
84
+ },
85
+ env,
86
+ ),
87
+ null,
88
+ 2,
89
+ ),
90
+ );
91
+ process.exit(0);
92
+ }
93
+
94
+ try {
95
+ await runLiveSmoke();
96
+ const failed = checks.filter((check) => !check.ok);
97
+ console.log(
98
+ JSON.stringify(
99
+ await attachSmokeEvidence(
100
+ "company-brain-plugin",
101
+ {
102
+ ok: failed.length === 0,
103
+ checks,
104
+ },
105
+ env,
106
+ ),
107
+ null,
108
+ 2,
109
+ ),
110
+ );
111
+ process.exit(failed.length === 0 ? 0 : 1);
112
+ } catch (error) {
113
+ console.error(
114
+ JSON.stringify(
115
+ await attachSmokeEvidence(
116
+ "company-brain-plugin",
117
+ {
118
+ ok: false,
119
+ error: error instanceof Error ? error.message : String(error),
120
+ checks,
121
+ },
122
+ env,
123
+ ),
124
+ null,
125
+ 2,
126
+ ),
127
+ );
128
+ process.exit(1);
129
+ }
130
+
131
+ async function runLiveSmoke() {
132
+ requireEnv("VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL", graphqlUrl);
133
+ requireEnv("API_AUTH_SECRET or THINKWORK_API_SECRET", apiSecret);
134
+ requireEnv("SMOKE_TENANT_ID", tenantId);
135
+ requireEnv("SMOKE_ADMIN_USER_ID", adminUserId);
136
+
137
+ let entry = await readCompanyBrainEntry();
138
+ assertCatalogEntry(entry);
139
+
140
+ if (entry.install) {
141
+ pass("Company Brain install already exists", {
142
+ installId: entry.install.id,
143
+ state: entry.install.state,
144
+ });
145
+ assertEntitlement(entry.entitlement, { allowMissing: true });
146
+ assertInstallEvidence(entry.install);
147
+ assertRoutes();
148
+ return;
149
+ }
150
+
151
+ if (entry.entitlement?.status === "active") {
152
+ pass("tenant already has active Company Brain entitlement", {
153
+ entitlementId: entry.entitlement.id,
154
+ source: entry.entitlement.source,
155
+ });
156
+ const install = await installCompanyBrain(null);
157
+ assertInstallEvidence(install);
158
+ assertRoutes();
159
+ return;
160
+ }
161
+
162
+ await assertInstallGateFailures();
163
+
164
+ const installKey = configuredInstallKey || (await maybeIssueInstallKey());
165
+ if (!installKey) {
166
+ skip(
167
+ "valid key redemption and substrate adoption",
168
+ "set SMOKE_COMPANY_BRAIN_INSTALL_KEY or SMOKE_COMPANY_BRAIN_ISSUE_KEY=1 to mutate this tenant",
169
+ );
170
+ assertRoutes();
171
+ return;
172
+ }
173
+
174
+ const install = await installCompanyBrain(installKey);
175
+ assertInstallEvidence(install);
176
+ entry = await readCompanyBrainEntry();
177
+ assertEntitlement(entry.entitlement, { allowMissing: false });
178
+ assertRoutes();
179
+ }
180
+
181
+ async function readCompanyBrainEntry() {
182
+ const { pluginCatalog } = await gql(
183
+ `query CompanyBrainSmokeCatalog {
184
+ pluginCatalog {
185
+ pluginKey
186
+ displayName
187
+ description
188
+ latestVersion
189
+ updateAvailable
190
+ premium {
191
+ entitlementProductKey
192
+ installKeyRequired
193
+ installKeyPrompt
194
+ }
195
+ entitlement {
196
+ id
197
+ pluginKey
198
+ entitlementProductKey
199
+ status
200
+ source
201
+ grantedAt
202
+ }
203
+ versions {
204
+ version
205
+ components {
206
+ key
207
+ type
208
+ displayName
209
+ }
210
+ }
211
+ install {
212
+ id
213
+ pluginKey
214
+ pinnedVersion
215
+ state
216
+ lastError
217
+ components {
218
+ componentKey
219
+ componentType
220
+ state
221
+ handlerRef
222
+ lastError
223
+ }
224
+ }
225
+ }
226
+ }`,
227
+ {},
228
+ adminUserId,
229
+ );
230
+ const entry = pluginCatalog.find((candidate) => {
231
+ return candidate.pluginKey === PLUGIN_KEY;
232
+ });
233
+ if (!entry) {
234
+ throw new Error("pluginCatalog did not include Company Brain");
235
+ }
236
+ return entry;
237
+ }
238
+
239
+ function assertCatalogEntry(entry) {
240
+ if (entry.displayName === "Company Brain") {
241
+ pass("catalog exposes Company Brain by product name");
242
+ } else {
243
+ failCheck("catalog exposes Company Brain by product name", {
244
+ displayName: entry.displayName,
245
+ });
246
+ }
247
+
248
+ if (
249
+ entry.premium?.entitlementProductKey === PLUGIN_KEY &&
250
+ entry.premium?.installKeyRequired === true &&
251
+ /Company Brain/i.test(entry.premium?.installKeyPrompt ?? "")
252
+ ) {
253
+ pass("catalog premium metadata is key-gated and product-facing", {
254
+ prompt: entry.premium.installKeyPrompt,
255
+ });
256
+ } else {
257
+ failCheck("catalog premium metadata is key-gated and product-facing", {
258
+ premium: entry.premium,
259
+ });
260
+ }
261
+
262
+ const substrate = entry.versions
263
+ ?.flatMap((version) => version.components ?? [])
264
+ .find((component) => component.key === SUBSTRATE_COMPONENT);
265
+ if (substrate?.type === "infrastructure") {
266
+ pass("manifest declares the Brain substrate infrastructure component");
267
+ } else {
268
+ failCheck(
269
+ "manifest declares the Brain substrate infrastructure component",
270
+ {
271
+ components: entry.versions?.flatMap(
272
+ (version) => version.components ?? [],
273
+ ),
274
+ },
275
+ );
276
+ }
277
+ }
278
+
279
+ async function assertInstallGateFailures() {
280
+ const missing = await gqlExpectError(
281
+ `mutation CompanyBrainSmokeMissingKey($input: InstallPluginInput!) {
282
+ installPlugin(input: $input) { id state }
283
+ }`,
284
+ {
285
+ input: {
286
+ pluginKey: PLUGIN_KEY,
287
+ idempotencyKey: `company-brain-smoke-missing-${randomUUID()}`,
288
+ },
289
+ },
290
+ adminUserId,
291
+ );
292
+ if (hasGraphqlErrorCode(missing, "INSTALL_KEY_REQUIRED")) {
293
+ pass("install without key fails with INSTALL_KEY_REQUIRED");
294
+ } else {
295
+ failCheck("install without key fails with INSTALL_KEY_REQUIRED", {
296
+ errors: missing.errors,
297
+ });
298
+ }
299
+
300
+ const invalid = await gqlExpectError(
301
+ `mutation CompanyBrainSmokeInvalidKey($input: InstallPluginInput!) {
302
+ installPlugin(input: $input) { id state }
303
+ }`,
304
+ {
305
+ input: {
306
+ pluginKey: PLUGIN_KEY,
307
+ installKey: `twpi_invalid_${randomUUID()}`,
308
+ idempotencyKey: `company-brain-smoke-invalid-${randomUUID()}`,
309
+ },
310
+ },
311
+ adminUserId,
312
+ );
313
+ if (invalid.errors?.length) {
314
+ pass("invalid install key fails closed");
315
+ } else {
316
+ failCheck("invalid install key fails closed", { response: invalid });
317
+ }
318
+
319
+ const entry = await readCompanyBrainEntry();
320
+ if (!entry.install && !entry.entitlement) {
321
+ pass("failed key attempts do not create install or entitlement");
322
+ } else {
323
+ failCheck("failed key attempts do not create install or entitlement", {
324
+ install: summarizeInstall(entry.install),
325
+ entitlement: summarizeEntitlement(entry.entitlement),
326
+ });
327
+ }
328
+ }
329
+
330
+ async function maybeIssueInstallKey() {
331
+ if (!issueKey) return null;
332
+ requireEnv("SMOKE_PLATFORM_OPERATOR_USER_ID", platformOperatorUserId);
333
+ const { issuePremiumPluginInstallKey } = await gql(
334
+ `mutation CompanyBrainSmokeIssueKey($input: IssuePremiumPluginInstallKeyInput!) {
335
+ issuePremiumPluginInstallKey(input: $input) {
336
+ keyId
337
+ pluginKey
338
+ tenantId
339
+ entitlementProductKey
340
+ installKey
341
+ issuedAt
342
+ expiresAt
343
+ }
344
+ }`,
345
+ {
346
+ input: {
347
+ pluginKey: PLUGIN_KEY,
348
+ tenantId,
349
+ },
350
+ },
351
+ platformOperatorUserId,
352
+ );
353
+ pass("platform operator issued a one-time Company Brain key", {
354
+ keyId: issuePremiumPluginInstallKey.keyId,
355
+ tenantId: issuePremiumPluginInstallKey.tenantId,
356
+ issuedAt: issuePremiumPluginInstallKey.issuedAt,
357
+ expiresAt: issuePremiumPluginInstallKey.expiresAt,
358
+ });
359
+ return issuePremiumPluginInstallKey.installKey;
360
+ }
361
+
362
+ async function installCompanyBrain(installKey) {
363
+ const input = {
364
+ pluginKey: PLUGIN_KEY,
365
+ idempotencyKey: `company-brain-smoke-install-${randomUUID()}`,
366
+ ...(installKey ? { installKey } : {}),
367
+ };
368
+ const { installPlugin } = await gql(
369
+ `mutation CompanyBrainSmokeInstall($input: InstallPluginInput!) {
370
+ installPlugin(input: $input) {
371
+ id
372
+ pluginKey
373
+ pinnedVersion
374
+ state
375
+ lastError
376
+ components {
377
+ componentKey
378
+ componentType
379
+ state
380
+ handlerRef
381
+ lastError
382
+ }
383
+ }
384
+ }`,
385
+ { input },
386
+ adminUserId,
387
+ );
388
+ pass("installPlugin accepted the Company Brain key", {
389
+ installId: installPlugin.id,
390
+ state: installPlugin.state,
391
+ pinnedVersion: installPlugin.pinnedVersion,
392
+ });
393
+ return installPlugin;
394
+ }
395
+
396
+ function assertEntitlement(entitlement, { allowMissing }) {
397
+ if (!entitlement && allowMissing) {
398
+ skip(
399
+ "active Company Brain entitlement",
400
+ "existing install was present before this smoke; catalog did not expose an active entitlement",
401
+ );
402
+ return;
403
+ }
404
+ if (
405
+ entitlement?.pluginKey === PLUGIN_KEY &&
406
+ entitlement?.status === "active"
407
+ ) {
408
+ pass("catalog exposes an active persistent Company Brain entitlement", {
409
+ entitlementId: entitlement.id,
410
+ source: entitlement.source,
411
+ grantedAt: entitlement.grantedAt,
412
+ });
413
+ } else {
414
+ failCheck(
415
+ "catalog exposes an active persistent Company Brain entitlement",
416
+ {
417
+ entitlement: summarizeEntitlement(entitlement),
418
+ },
419
+ );
420
+ }
421
+ }
422
+
423
+ function assertInstallEvidence(install) {
424
+ if (!install) {
425
+ failCheck("Company Brain install evidence is readable", {
426
+ reason: "missing install",
427
+ });
428
+ return;
429
+ }
430
+ const substrate = install.components.find((component) => {
431
+ return (
432
+ component.componentKey === SUBSTRATE_COMPONENT &&
433
+ component.componentType === "infrastructure"
434
+ );
435
+ });
436
+ if (!substrate) {
437
+ failCheck("Company Brain install has Brain substrate component", {
438
+ components: install.components.map((component) => component.componentKey),
439
+ });
440
+ return;
441
+ }
442
+
443
+ const handlerRef = parseHandlerRef(substrate.handlerRef);
444
+ if (handlerRef?.managedAppKey === "cognee" || handlerRef?.deploymentJobId) {
445
+ pass("Brain substrate component exposes deployment evidence", {
446
+ state: substrate.state,
447
+ managedAppKey: handlerRef?.managedAppKey ?? null,
448
+ managedApplicationId: handlerRef?.managedApplicationId ?? null,
449
+ deploymentJobId: handlerRef?.deploymentJobId ?? null,
450
+ adoptionRequiresNoChange: handlerRef?.adoptionRequiresNoChange ?? false,
451
+ });
452
+ } else {
453
+ failCheck("Brain substrate component exposes deployment evidence", {
454
+ state: substrate.state,
455
+ handlerRef,
456
+ lastError: substrate.lastError,
457
+ });
458
+ }
459
+
460
+ if (handlerRef?.adoptionRequiresNoChange === true) {
461
+ pass("existing Cognee adoption requires no-change plan evidence", {
462
+ deploymentJobId: handlerRef.deploymentJobId,
463
+ });
464
+ } else {
465
+ skip(
466
+ "existing Cognee no-change adoption evidence",
467
+ "this tenant appears to be on the new-provision path or has not reached adoption evidence yet",
468
+ );
469
+ }
470
+
471
+ if (
472
+ install.state === "awaiting_approval" &&
473
+ handlerRef?.deploymentJobId &&
474
+ substrate.state === "pending"
475
+ ) {
476
+ pass("new provision/adoption path reached normal approval state", {
477
+ deploymentJobId: handlerRef.deploymentJobId,
478
+ });
479
+ } else if (
480
+ install.state === "installed" ||
481
+ substrate.state === "provisioned"
482
+ ) {
483
+ pass("Company Brain substrate is already provisioned", {
484
+ installState: install.state,
485
+ substrateState: substrate.state,
486
+ });
487
+ } else {
488
+ skip("new provision/adoption approval state", {
489
+ installState: install.state,
490
+ substrateState: substrate.state,
491
+ lastError: substrate.lastError,
492
+ });
493
+ }
494
+ }
495
+
496
+ function assertRoutes() {
497
+ pass("Company Brain plugin detail route is the lifecycle home", {
498
+ route: "/settings/plugins/company-brain",
499
+ });
500
+ pass("Memory / Ontology route remains the graph explorer", {
501
+ route: "/settings/memory/knowledge-graph",
502
+ });
503
+ }
504
+
505
+ async function gql(query, variables, principalId) {
506
+ const response = await fetchWithTimeout(graphqlUrl, {
507
+ method: "POST",
508
+ headers: {
509
+ "content-type": "application/json",
510
+ authorization: `Bearer ${apiSecret}`,
511
+ "x-tenant-id": tenantId,
512
+ ...(principalId ? { "x-principal-id": principalId } : {}),
513
+ },
514
+ body: JSON.stringify({ query, variables }),
515
+ });
516
+ const text = await response.text();
517
+ if (!response.ok) {
518
+ throw new Error(`GraphQL HTTP ${response.status}: ${text.slice(0, 500)}`);
519
+ }
520
+ const body = JSON.parse(text);
521
+ if (body.errors?.length) {
522
+ throw new Error(`GraphQL errors: ${JSON.stringify(body.errors)}`);
523
+ }
524
+ return body.data;
525
+ }
526
+
527
+ async function gqlExpectError(query, variables, principalId) {
528
+ const response = await fetchWithTimeout(graphqlUrl, {
529
+ method: "POST",
530
+ headers: {
531
+ "content-type": "application/json",
532
+ authorization: `Bearer ${apiSecret}`,
533
+ "x-tenant-id": tenantId,
534
+ ...(principalId ? { "x-principal-id": principalId } : {}),
535
+ },
536
+ body: JSON.stringify({ query, variables }),
537
+ });
538
+ const text = await response.text();
539
+ if (!response.ok) {
540
+ return {
541
+ errors: [
542
+ {
543
+ message: `GraphQL HTTP ${response.status}: ${text.slice(0, 500)}`,
544
+ },
545
+ ],
546
+ };
547
+ }
548
+ const body = JSON.parse(text);
549
+ if (!body.errors?.length) {
550
+ return { data: body.data, errors: [] };
551
+ }
552
+ return body;
553
+ }
554
+
555
+ async function fetchWithTimeout(url, options = {}) {
556
+ const controller = new AbortController();
557
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
558
+ try {
559
+ return await fetch(url, { ...options, signal: controller.signal });
560
+ } finally {
561
+ clearTimeout(timer);
562
+ }
563
+ }
564
+
565
+ function hasGraphqlErrorCode(response, code) {
566
+ return (response.errors ?? []).some((error) => {
567
+ return error?.extensions?.code === code;
568
+ });
569
+ }
570
+
571
+ function parseHandlerRef(raw) {
572
+ if (raw == null) return null;
573
+ if (typeof raw === "object") return raw;
574
+ try {
575
+ return JSON.parse(raw);
576
+ } catch {
577
+ return { unparsed: String(raw).slice(0, 200) };
578
+ }
579
+ }
580
+
581
+ function summarizeInstall(install) {
582
+ if (!install) return null;
583
+ return {
584
+ id: install.id,
585
+ pluginKey: install.pluginKey,
586
+ state: install.state,
587
+ lastError: install.lastError,
588
+ };
589
+ }
590
+
591
+ function summarizeEntitlement(entitlement) {
592
+ if (!entitlement) return null;
593
+ return {
594
+ id: entitlement.id,
595
+ pluginKey: entitlement.pluginKey,
596
+ status: entitlement.status,
597
+ source: entitlement.source,
598
+ };
599
+ }
600
+
601
+ function pass(name, detail) {
602
+ checks.push({ name, ok: true, ...(detail ? { detail } : {}) });
603
+ console.log(`PASS - ${name}${detail ? `: ${stringify(detail)}` : ""}`);
604
+ }
605
+
606
+ function failCheck(name, detail) {
607
+ checks.push({ name, ok: false, ...(detail ? { detail } : {}) });
608
+ console.log(`FAIL - ${name}${detail ? `: ${stringify(detail)}` : ""}`);
609
+ }
610
+
611
+ function skip(name, reason) {
612
+ checks.push({ name, ok: true, skipped: true, reason });
613
+ console.log(`SKIP - ${name}: ${stringify(reason)}`);
614
+ }
615
+
616
+ function stringify(value) {
617
+ return typeof value === "string" ? value : JSON.stringify(value);
618
+ }
619
+
620
+ function requireEnv(label, value) {
621
+ if (!value) throw new Error(`Missing required live smoke env: ${label}`);
622
+ }
623
+
624
+ function loadEnvFile() {
625
+ const explicit = process.env.COMPUTER_ENV_FILE;
626
+ if (explicit === "none") return {};
627
+ const candidates = [explicit, "apps/web/.env", ".env"].filter(Boolean);
628
+ for (const candidate of candidates) {
629
+ const resolved = path.resolve(candidate);
630
+ if (!fs.existsSync(resolved)) continue;
631
+ return Object.fromEntries(
632
+ fs
633
+ .readFileSync(resolved, "utf8")
634
+ .split(/\r?\n/)
635
+ .map((line) => line.trim())
636
+ .filter((line) => line && !line.startsWith("#") && line.includes("="))
637
+ .map((line) => {
638
+ const index = line.indexOf("=");
639
+ const key = line.slice(0, index).trim();
640
+ const value = line
641
+ .slice(index + 1)
642
+ .trim()
643
+ .replace(/^['"]|['"]$/g, "");
644
+ return [key, value];
645
+ }),
646
+ );
647
+ }
648
+ return {};
649
+ }
650
+
651
+ function first(...values) {
652
+ return values.find((value) => {
653
+ return value !== undefined && value !== null && value !== "";
654
+ });
655
+ }