thinkwork-cli 0.12.11 → 0.12.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-4VT3FWOH.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-H7AB42ES.js} +340 -30
  4. package/dist/cli.js +22157 -9229
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  218. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  219. package/dist/drizzle/meta/_journal.json +160 -0
  220. package/dist/plugins/README.md +162 -0
  221. package/dist/plugins/catalog/package.json +40 -0
  222. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  223. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  224. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  225. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  226. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  227. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  229. package/dist/plugins/catalog/src/catalog.ts +434 -0
  230. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  231. package/dist/plugins/catalog/src/index.ts +4 -0
  232. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  233. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  234. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  235. package/dist/plugins/catalog/tsconfig.json +8 -0
  236. package/dist/plugins/company-brain/README.md +37 -0
  237. package/dist/plugins/company-brain/package.json +33 -0
  238. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  239. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  240. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  241. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  244. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  245. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  246. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  247. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  248. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  249. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  250. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  251. package/dist/plugins/company-brain/src/index.ts +62 -0
  252. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  253. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  254. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  255. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  256. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  257. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  258. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  259. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  260. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  261. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  262. package/dist/plugins/company-brain/tsconfig.json +8 -0
  263. package/dist/plugins/company-data/README.md +49 -0
  264. package/dist/plugins/company-data/package.json +21 -0
  265. package/dist/plugins/company-data/src/index.ts +30 -0
  266. package/dist/plugins/company-data/src/manifest.ts +26 -0
  267. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  268. package/dist/plugins/company-data/tsconfig.json +8 -0
  269. package/dist/plugins/company-etl/README.md +46 -0
  270. package/dist/plugins/company-etl/package.json +21 -0
  271. package/dist/plugins/company-etl/src/index.ts +29 -0
  272. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  273. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  274. package/dist/plugins/company-etl/tsconfig.json +8 -0
  275. package/dist/plugins/email-channel/README.md +41 -0
  276. package/dist/plugins/email-channel/package.json +22 -0
  277. package/dist/plugins/email-channel/src/index.ts +36 -0
  278. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  279. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  280. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  281. package/dist/plugins/email-channel/tsconfig.json +8 -0
  282. package/dist/plugins/lastmile/README.md +50 -0
  283. package/dist/plugins/lastmile/package.json +23 -0
  284. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  285. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  286. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  287. package/dist/plugins/lastmile/src/index.ts +46 -0
  288. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  289. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  290. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  291. package/dist/plugins/lastmile/tsconfig.json +8 -0
  292. package/dist/plugins/n8n/README.md +201 -0
  293. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  294. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  295. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  296. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  297. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  298. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  299. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  300. package/dist/plugins/n8n/package.json +35 -0
  301. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  302. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  304. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  305. package/dist/plugins/n8n/runtime/package.json +7 -0
  306. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  307. package/dist/plugins/n8n/smoke/README.md +95 -0
  308. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  309. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  310. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  311. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  312. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  313. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  314. package/dist/plugins/n8n/src/index.ts +79 -0
  315. package/dist/plugins/n8n/src/manifest.ts +403 -0
  316. package/dist/plugins/n8n/src/package-config.ts +186 -0
  317. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  321. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  322. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  323. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  324. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  326. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  327. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  328. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  329. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  330. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  331. package/dist/plugins/n8n/tsconfig.json +8 -0
  332. package/dist/plugins/sendgrid/README.md +30 -0
  333. package/dist/plugins/sendgrid/package.json +22 -0
  334. package/dist/plugins/sendgrid/src/index.ts +36 -0
  335. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  336. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  337. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  338. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  339. package/dist/plugins/twenty/README.md +78 -0
  340. package/dist/plugins/twenty/package.json +27 -0
  341. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  342. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  343. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  344. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  345. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  346. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  347. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  348. package/dist/plugins/twenty/src/index.ts +55 -0
  349. package/dist/plugins/twenty/src/manifest.ts +259 -0
  350. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  351. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  352. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  353. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  354. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  355. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  356. package/dist/plugins/twenty/tsconfig.json +9 -0
  357. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  358. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  359. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  360. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  361. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  362. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  363. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  364. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  365. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  366. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  367. package/dist/plugins/workos-auth/package.json +22 -0
  368. package/dist/plugins/workos-auth/src/index.ts +30 -0
  369. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  370. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  371. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  372. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  373. package/dist/scripts/bootstrap-workspace.sh +162 -0
  374. package/dist/scripts/post-deploy.sh +290 -0
  375. package/dist/terraform/examples/greenfield/main.tf +903 -75
  376. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  377. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  381. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  382. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  383. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  384. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  385. package/dist/terraform/modules/app/agentcore-pi/main.tf +453 -0
  386. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  387. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  388. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  389. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  390. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  391. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  392. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  399. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  400. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  401. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  402. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  403. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  404. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  405. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  406. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  407. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  408. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  409. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  411. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  412. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  413. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  414. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  415. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  416. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  417. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  418. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  420. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  421. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  422. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  423. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  424. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  425. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  426. package/dist/terraform/modules/thinkwork/README.md +71 -0
  427. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  428. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  429. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  430. package/dist/terraform/schema.graphql +82 -9
  431. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  432. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  433. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  434. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  435. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  436. package/dist/workspace-defaults/files/SPACE.md +62 -0
  437. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  438. package/dist/workspace-defaults/files/USER.md +40 -0
  439. package/dist/workspace-defaults/files/mcp.json +3 -0
  440. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  441. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  442. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  443. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  444. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  446. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  447. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  466. package/package.json +1 -1
  467. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  468. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  469. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  470. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  471. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  472. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  473. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  474. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -26,6 +26,7 @@ on:
26
26
  - all
27
27
  - foundation
28
28
  - artifacts
29
+ - web
29
30
  - overlays
30
31
  - smokes
31
32
  run_smokes:
@@ -105,24 +106,29 @@ jobs:
105
106
  terraform_wrapper: false
106
107
 
107
108
  - name: Prepare release artifacts
108
- if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts') }}
109
+ if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web') }}
109
110
  shell: bash
110
111
  run: |
111
112
  set -euo pipefail
113
+ PREPARE_ARGS=()
114
+ if [ "$COMPONENT" = "web" ]; then
115
+ PREPARE_ARGS+=(--artifact-type static-site --artifact-name web)
116
+ fi
112
117
  node scripts/apply-release.mjs prepare \
113
118
  --manifest "$RELEASE_MANIFEST" \
114
119
  --work-dir "$RELEASE_DIR" \
115
120
  --artifact-bucket "${{ steps.lock.outputs.artifact_bucket }}" \
116
- --lambda-prefix "${{ steps.lock.outputs.lambda_prefix }}"
121
+ --lambda-prefix "${{ steps.lock.outputs.lambda_prefix }}" \
122
+ "${PREPARE_ARGS[@]}"
117
123
 
118
124
  - name: Terraform init
119
- if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'smokes' }}
125
+ if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web' || github.event.inputs.component == 'smokes' }}
120
126
  working-directory: terraform
121
127
  shell: bash
122
128
  run: terraform init -backend-config="backend-${STAGE}.hcl"
123
129
 
124
130
  - name: Select Terraform workspace
125
- if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'smokes' }}
131
+ if: ${{ github.event.inputs.operation == 'destroy' || github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web' || github.event.inputs.component == 'smokes' }}
126
132
  working-directory: terraform
127
133
  shell: bash
128
134
  run: |
@@ -187,14 +193,19 @@ jobs:
187
193
  --region "${{ vars.AWS_REGION }}"
188
194
 
189
195
  - name: Sync static site bundles
190
- if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts') }}
196
+ if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'foundation' || github.event.inputs.component == 'artifacts' || github.event.inputs.component == 'web') }}
191
197
  shell: bash
192
198
  run: |
193
199
  set -euo pipefail
200
+ STATIC_ARGS=()
201
+ if [ "$COMPONENT" = "web" ]; then
202
+ STATIC_ARGS+=(--artifact-name web)
203
+ fi
194
204
  node scripts/apply-release.mjs sync-static \
195
205
  --manifest "$RELEASE_MANIFEST" \
196
206
  --work-dir "$RELEASE_DIR" \
197
- --terraform-dir terraform
207
+ --terraform-dir terraform \
208
+ "${STATIC_ARGS[@]}"
198
209
 
199
210
  - name: Apply customer overlay contract
200
211
  if: ${{ github.event.inputs.operation == 'deploy' && (github.event.inputs.component == 'all' || github.event.inputs.component == 'overlays') }}
@@ -5,12 +5,22 @@
5
5
  This repository deploys a pinned ThinkWork release into the customer AWS
6
6
  account. It is a deployment repository, not a source fork.
7
7
 
8
+ > Legacy compatibility: new customer-owned deployments should use the
9
+ > GitHub-free AWS control-plane bootstrap. This generated repository runbook is
10
+ > retained for existing customers that still operate through GitHub Actions.
11
+
8
12
  The exact operational path is:
9
13
 
10
14
  ```text
11
15
  bootstrap -> workflow dispatch -> CI deploy -> overlay apply -> smoke summary
12
16
  ```
13
17
 
18
+ The GitHub-free operational path is:
19
+
20
+ ```text
21
+ bootstrap -> customer AWS Step Functions -> CodeBuild deploy -> smoke evidence
22
+ ```
23
+
14
24
  ## First-Time Setup
15
25
 
16
26
  Run these commands from an operator machine with temporary customer AWS admin
@@ -148,18 +158,58 @@ one-line flow into explicit steps.
148
158
  -f run_smokes=false
149
159
  ```
150
160
 
151
- Prefer `thinkwork destroy`; use direct `gh workflow run` only as a
152
- troubleshooting fallback.
161
+ Prefer `thinkwork destroy`; use direct `gh workflow run` only as a
162
+ troubleshooting fallback.
163
+
164
+ ## GitHub-Free Bootstrap Smoke
165
+
166
+ When operating a GitHub-free customer deployment, run the foundation smoke from
167
+ the ThinkWork release workspace or support checkout after bootstrap:
168
+
169
+ ```bash
170
+ node scripts/smoke/foundation-bootstrap-smoke.mjs
171
+
172
+ SMOKE_ENABLE_FOUNDATION_BOOTSTRAP=1 \
173
+ SMOKE_TERRAFORM_DIR=terraform/examples/greenfield \
174
+ SMOKE_EVIDENCE_FILE=deploy-artifacts/foundation-smoke.json \
175
+ node scripts/smoke/foundation-bootstrap-smoke.mjs
176
+ ```
177
+
178
+ Set `SMOKE_EVIDENCE_S3_URI=s3://<evidence-bucket>/<prefix>` to upload the
179
+ evidence envelope. The evidence must include release/manifest identifiers,
180
+ deployment job identifiers when available, endpoint status, and smoke results.
181
+ It must not include secrets.
182
+
183
+ ## Managed Application Smokes
184
+
185
+ Run managed-app smokes after deploy, destroy, park, or release upgrade jobs:
186
+
187
+ ```bash
188
+ SMOKE_ENABLE_COGNEE_MANAGED_APP=1 \
189
+ SMOKE_TENANT_ID=<tenant-id> \
190
+ SMOKE_EVIDENCE_FILE=deploy-artifacts/cognee-smoke.json \
191
+ node plugins/company-brain/smoke/cognee-managed-app-smoke.mjs
192
+
193
+ SMOKE_ENABLE_TWENTY_MANAGED_APP=1 \
194
+ SMOKE_TENANT_ID=<tenant-id> \
195
+ SMOKE_EVIDENCE_FILE=deploy-artifacts/twenty-smoke.json \
196
+ node plugins/twenty/smoke/twenty-managed-app-smoke.mjs
197
+ ```
198
+
199
+ Cognee and Twenty smokes skip with explicit evidence when the app is not
200
+ enabled, unprovisioned, or parked. A skipped smoke is valid evidence only when
201
+ that app state is intentional for the stage.
153
202
 
154
203
  ## Workflow Components
155
204
 
156
- | Component | What it does |
157
- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
158
- | `all` | First deploy and normal release upgrades: release artifact prep, Terraform apply, runtime image copy, AgentCore update, static sync, overlays, smokes. |
159
- | `foundation` | Terraform apply and artifact/runtime/static sync without overlays. |
160
- | `artifacts` | Re-copy pinned Lambda/static/runtime artifacts without Terraform apply. |
161
- | `overlays` | Apply only `customer/` evals, skills, workspace defaults, seeds, and branding records. |
162
- | `smokes` | Run smoke checks against an already-deployed stage. |
205
+ | Component | What it does |
206
+ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
207
+ | `all` | First deploy and normal release upgrades: release artifact prep, Terraform apply, runtime image copy, AgentCore update, static sync, overlays, smokes. |
208
+ | `foundation` | Terraform apply and artifact/runtime/static sync without overlays. |
209
+ | `artifacts` | Re-copy pinned Lambda/static/runtime artifacts without Terraform apply. |
210
+ | `web` | Sync only the pinned end-user web static bundle and invalidate its CloudFront distribution. Does not apply Terraform, copy lambdas, or update runtimes. |
211
+ | `overlays` | Apply only `customer/` evals, skills, workspace defaults, seeds, and branding records. |
212
+ | `smokes` | Run smoke checks against an already-deployed stage. |
163
213
 
164
214
  Set workflow `operation=destroy` to remove the selected stage stack. Destroy
165
215
  always uses Terraform for the whole stage; component-specific destroy is not
@@ -223,6 +273,17 @@ supported.
223
273
  thinkwork deploy --customer {{CUSTOMER_SLUG}} --stage dev --component all
224
274
  ```
225
275
 
276
+ For a web-application-only redeploy after updating `thinkwork.lock`, use:
277
+
278
+ ```bash
279
+ thinkwork deploy --customer {{CUSTOMER_SLUG}} --stage dev --component web --no-run-smokes
280
+ ```
281
+
282
+ This path reads existing Terraform outputs for the web bucket and CloudFront
283
+ distribution, syncs only the `web` static release artifact, and invalidates the
284
+ web distribution. It intentionally skips Terraform apply, Lambda artifact
285
+ promotion, runtime image copy, AgentCore updates, overlays, and database work.
286
+
226
287
  3. Deploy to production after dev passes.
227
288
 
228
289
  ## Secrets
@@ -237,6 +298,17 @@ Never commit secrets. Supported secret homes are:
237
298
  Do not store plaintext secrets in `terraform/stages/*.tfvars`, `.env`,
238
299
  `customer/`, or runbook files.
239
300
 
301
+ ## GitHub-Free Failure Triage
302
+
303
+ | Failure | First response |
304
+ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
305
+ | Manifest verification failed | Stop before mutation. Fetch a trusted release manifest and compare the expected SHA-256. |
306
+ | Plan failed | Inspect the CodeBuild log and Terraform plan artifact linked from the deployment job. |
307
+ | Apply failed | Inspect Step Functions event history, then CodeBuild logs. Retry only after preserving evidence. |
308
+ | Smoke failed | Attach the smoke evidence JSON to the deployment job/support case and inspect endpoint-specific details. |
309
+ | First-admin claim mismatch | Verify Cognito email verification and the bootstrap first-admin email. |
310
+ | Deployment profile import blocked | Confirm required profile fields, TLS URLs, signature trust, and that the user signed out before replacing profiles. |
311
+
240
312
  ## Rollback
241
313
 
242
314
  To roll back application code, restore `thinkwork.lock` to the previously
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // thinkwork-managed: enterprise-deploy-template
3
3
  import { createHash } from "node:crypto";
4
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
+ import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
5
5
  import { dirname, join } from "node:path";
6
6
  import { execFileSync } from "node:child_process";
7
7
 
@@ -52,8 +52,20 @@ async function validateManifest() {
52
52
  `Release manifest version ${manifest.release?.version} does not match lock ${expectedRelease}`,
53
53
  );
54
54
  }
55
+ const hasBundle = (manifest.artifactBundles ?? []).length > 0;
56
+ for (const bundle of manifest.artifactBundles ?? []) {
57
+ if (!bundle.url || !bundle.sha256 || !bundle.fileName) {
58
+ throw new Error(
59
+ `Release artifact bundle ${bundle.name} is missing url, sha256, or fileName`,
60
+ );
61
+ }
62
+ }
55
63
  for (const artifact of manifest.artifacts ?? []) {
56
- if (!artifact.url || !artifact.sha256 || !artifact.fileName) {
64
+ if (
65
+ (!hasBundle && !artifact.url) ||
66
+ !artifact.sha256 ||
67
+ !artifact.fileName
68
+ ) {
57
69
  throw new Error(
58
70
  `Release artifact ${artifact.name} is missing url, sha256, or fileName`,
59
71
  );
@@ -67,13 +79,17 @@ async function prepareArtifacts() {
67
79
  const workDir = required("--work-dir");
68
80
  const artifactBucket = required("--artifact-bucket");
69
81
  const lambdaPrefix = required("--lambda-prefix").replace(/^\/+|\/+$/g, "");
82
+ const artifactType = optional("--artifact-type");
83
+ const artifactName = optional("--artifact-name");
70
84
  const downloadDir = join(workDir, "downloads");
71
85
  await mkdir(downloadDir, { recursive: true });
86
+ const bundle = await prepareArtifactBundle(manifest, downloadDir);
72
87
 
73
88
  const prepared = [];
74
89
  for (const artifact of manifest.artifacts ?? []) {
75
- const localPath = join(downloadDir, artifact.fileName);
76
- await downloadAndVerify(artifact, localPath);
90
+ if (artifactType && artifact.type !== artifactType) continue;
91
+ if (artifactName && artifact.name !== artifactName) continue;
92
+ const localPath = await prepareArtifact(artifact, downloadDir, bundle);
77
93
  prepared.push({ ...artifact, localPath });
78
94
  if (artifact.type === "lambda") {
79
95
  run("aws", [
@@ -84,6 +100,11 @@ async function prepareArtifacts() {
84
100
  ]);
85
101
  }
86
102
  }
103
+ if ((artifactType || artifactName) && prepared.length === 0) {
104
+ throw new Error(
105
+ `No release artifacts matched${artifactType ? ` type=${artifactType}` : ""}${artifactName ? ` name=${artifactName}` : ""}`,
106
+ );
107
+ }
87
108
 
88
109
  await writeJson(join(workDir, "prepared-artifacts.json"), {
89
110
  release: manifest.release,
@@ -91,6 +112,35 @@ async function prepareArtifacts() {
91
112
  });
92
113
  }
93
114
 
115
+ async function prepareArtifactBundle(manifest, downloadDir) {
116
+ const bundle = (manifest.artifactBundles ?? [])[0];
117
+ if (!bundle) return null;
118
+
119
+ const localPath = join(downloadDir, bundle.fileName);
120
+ await downloadAndVerify(bundle, localPath);
121
+
122
+ const extractDir = join(downloadDir, "platform-artifacts");
123
+ await rm(extractDir, { recursive: true, force: true });
124
+ await mkdir(extractDir, { recursive: true });
125
+ run("tar", ["-xzf", localPath, "-C", extractDir]);
126
+
127
+ return { ...bundle, localPath, extractDir };
128
+ }
129
+
130
+ async function prepareArtifact(artifact, downloadDir, bundle) {
131
+ if (artifact.url) {
132
+ const localPath = join(downloadDir, artifact.fileName);
133
+ await downloadAndVerify(artifact, localPath);
134
+ return localPath;
135
+ }
136
+ if (!bundle) {
137
+ throw new Error(`Release artifact ${artifact.name} is missing url`);
138
+ }
139
+ const localPath = join(bundle.extractDir, artifact.relativePath);
140
+ await verifyExistingArtifact(artifact, localPath);
141
+ return localPath;
142
+ }
143
+
94
144
  async function copyRuntimeImages() {
95
145
  const manifest = await readManifest(required("--manifest"));
96
146
  const workDir = required("--work-dir");
@@ -138,16 +188,25 @@ async function updateAgentCoreRuntimes() {
138
188
  "text",
139
189
  ]);
140
190
 
141
- for (const runtime of ["strands", "flue"]) {
191
+ for (const runtime of ["strands", "pi"]) {
142
192
  const image = copied.find(
143
193
  (item) => item.runtime === runtime && item.architecture === "arm64",
144
194
  );
145
195
  if (!image) continue;
196
+ if (runtime === "pi") {
197
+ updates.push(
198
+ updatePiLambdaRuntime({
199
+ stage,
200
+ region,
201
+ imageUri: image.stageUri,
202
+ }),
203
+ );
204
+ }
146
205
  const runtimeId = findAgentCoreRuntimeId({ stage, runtime, region });
147
206
  if (!runtimeId) {
148
- if (runtime === "flue") {
207
+ if (runtime === "pi") {
149
208
  updates.push(
150
- createFlueAgentCoreRuntime({
209
+ createPiAgentCoreRuntime({
151
210
  stage,
152
211
  region,
153
212
  accountId,
@@ -175,6 +234,87 @@ async function updateAgentCoreRuntimes() {
175
234
  await writeJson(join(workDir, "runtime-updates.json"), updates);
176
235
  }
177
236
 
237
+ function updatePiLambdaRuntime({ stage, region, imageUri }) {
238
+ const functionName = `thinkwork-${stage}-agentcore-pi`;
239
+ const expectedDigest = resolveEcrImageDigest({ imageUri, region });
240
+ run("aws", [
241
+ "lambda",
242
+ "update-function-code",
243
+ "--region",
244
+ region,
245
+ "--function-name",
246
+ functionName,
247
+ "--image-uri",
248
+ imageUri,
249
+ ]);
250
+ run("aws", [
251
+ "lambda",
252
+ "wait",
253
+ "function-updated",
254
+ "--region",
255
+ region,
256
+ "--function-name",
257
+ functionName,
258
+ ]);
259
+
260
+ const fn = awsJson([
261
+ "lambda",
262
+ "get-function",
263
+ "--region",
264
+ region,
265
+ "--function-name",
266
+ functionName,
267
+ "--output",
268
+ "json",
269
+ ]);
270
+ const resolvedImageUri = fn.Code?.ResolvedImageUri ?? "";
271
+ if (!resolvedImageUri.endsWith(`@${expectedDigest}`)) {
272
+ throw new Error(
273
+ `${functionName} resolved ${resolvedImageUri || "(missing)"} instead of ${expectedDigest}`,
274
+ );
275
+ }
276
+
277
+ return {
278
+ runtime: "pi-lambda",
279
+ status: "updated",
280
+ image: imageUri,
281
+ resolvedImageUri,
282
+ functionName,
283
+ };
284
+ }
285
+
286
+ function resolveEcrImageDigest({ imageUri, region }) {
287
+ const parsed = parseEcrImageUri(imageUri);
288
+ const image = awsJson([
289
+ "ecr",
290
+ "describe-images",
291
+ "--region",
292
+ region,
293
+ "--repository-name",
294
+ parsed.repositoryName,
295
+ "--image-ids",
296
+ `imageTag=${parsed.tag}`,
297
+ "--query",
298
+ "imageDetails[0]",
299
+ "--output",
300
+ "json",
301
+ ]);
302
+ if (!image?.imageDigest) {
303
+ throw new Error(`Could not resolve ECR image digest for ${imageUri}`);
304
+ }
305
+ return image.imageDigest;
306
+ }
307
+
308
+ function parseEcrImageUri(imageUri) {
309
+ const match = imageUri.match(
310
+ /^[^.]+\.dkr\.ecr\.[^.]+\.amazonaws\.com\/(.+):([^:@]+)$/,
311
+ );
312
+ if (!match) {
313
+ throw new Error(`Expected tagged ECR image URI, got ${imageUri}`);
314
+ }
315
+ return { repositoryName: match[1], tag: match[2] };
316
+ }
317
+
178
318
  function findAgentCoreRuntimeId({ stage, runtime, region }) {
179
319
  const parameterValue = awsText([
180
320
  "ssm",
@@ -204,11 +344,11 @@ function findAgentCoreRuntimeId({ stage, runtime, region }) {
204
344
  return listed && listed !== "None" ? listed : "";
205
345
  }
206
346
 
207
- function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
347
+ function createPiAgentCoreRuntime({ stage, region, accountId, imageUri }) {
208
348
  if (!accountId) {
209
- throw new Error("AWS account ID is required to create the Flue runtime");
349
+ throw new Error("AWS account ID is required to create the Pi runtime");
210
350
  }
211
- const runtimeNameValue = `thinkwork_${stage}_flue`;
351
+ const runtimeNameValue = `thinkwork_${stage}_pi`;
212
352
  const runtimeId = awsText([
213
353
  "bedrock-agentcore-control",
214
354
  "create-agent-runtime",
@@ -219,7 +359,7 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
219
359
  "--agent-runtime-artifact",
220
360
  `containerConfiguration={containerUri=${imageUri}}`,
221
361
  "--role-arn",
222
- canonicalAgentCoreRoleArn({ stage, runtime: "flue", accountId }),
362
+ canonicalAgentCoreRoleArn({ stage, runtime: "pi", accountId }),
223
363
  "--network-configuration",
224
364
  "networkMode=PUBLIC",
225
365
  "--protocol-configuration",
@@ -236,7 +376,7 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
236
376
  "ssm",
237
377
  "put-parameter",
238
378
  "--name",
239
- `/thinkwork/${stage}/agentcore/runtime-id-flue`,
379
+ `/thinkwork/${stage}/agentcore/runtime-id-pi`,
240
380
  "--value",
241
381
  runtimeId,
242
382
  "--type",
@@ -245,9 +385,9 @@ function createFlueAgentCoreRuntime({ stage, region, accountId, imageUri }) {
245
385
  "--region",
246
386
  region,
247
387
  ]);
248
- waitForAgentCoreRuntime({ runtime: "flue", runtimeId, region, imageUri });
388
+ waitForAgentCoreRuntime({ runtime: "pi", runtimeId, region, imageUri });
249
389
  return {
250
- runtime: "flue",
390
+ runtime: "pi",
251
391
  status: "created",
252
392
  image: imageUri,
253
393
  runtimeId,
@@ -369,8 +509,8 @@ function waitForAgentCoreRuntime({
369
509
 
370
510
  function canonicalAgentCoreRoleArn({ stage, runtime, accountId }) {
371
511
  const roleName =
372
- runtime === "flue"
373
- ? `thinkwork-${stage}-agentcore-flue-role`
512
+ runtime === "pi"
513
+ ? `thinkwork-${stage}-agentcore-pi-role`
374
514
  : `thinkwork-${stage}-agentcore-role`;
375
515
  return `arn:aws:iam::${accountId}:role/${roleName}`;
376
516
  }
@@ -379,6 +519,7 @@ async function syncStaticSites() {
379
519
  const manifest = await readManifest(required("--manifest"));
380
520
  const workDir = required("--work-dir");
381
521
  const terraformDir = required("--terraform-dir");
522
+ const artifactName = optional("--artifact-name");
382
523
  const prepared = await readJson(join(workDir, "prepared-artifacts.json"), {
383
524
  artifacts: [],
384
525
  });
@@ -388,7 +529,8 @@ async function syncStaticSites() {
388
529
  const synced = [];
389
530
 
390
531
  for (const artifact of manifest.artifacts?.filter(
391
- (item) => item.type === "static-site",
532
+ (item) =>
533
+ item.type === "static-site" && (!artifactName || item.name === artifactName),
392
534
  ) ?? []) {
393
535
  const localPath = downloadByName.get(artifact.name);
394
536
  if (!localPath) {
@@ -398,19 +540,21 @@ async function syncStaticSites() {
398
540
  await rm(extractDir, { recursive: true, force: true });
399
541
  await mkdir(extractDir, { recursive: true });
400
542
  run("tar", ["-xzf", localPath, "-C", extractDir]);
543
+ const terraformOutputPrefix =
544
+ artifact.name === "spaces" ? "computer" : artifact.name;
401
545
  const bucket = terraformOutput(
402
546
  terraformDir,
403
- `${artifact.name}_bucket_name`,
547
+ `${terraformOutputPrefix}_bucket_name`,
404
548
  );
405
549
  if (!bucket) {
406
550
  throw new Error(
407
- `Terraform output ${artifact.name}_bucket_name is missing`,
551
+ `Terraform output ${terraformOutputPrefix}_bucket_name is missing`,
408
552
  );
409
553
  }
410
554
  run("aws", ["s3", "sync", "--delete", extractDir, `s3://${bucket}/`]);
411
555
  const distributionId = terraformOutput(
412
556
  terraformDir,
413
- `${artifact.name}_distribution_id`,
557
+ `${terraformOutputPrefix}_distribution_id`,
414
558
  );
415
559
  if (distributionId) {
416
560
  run("aws", [
@@ -491,9 +635,27 @@ async function downloadAndVerify(artifact, localPath) {
491
635
  }
492
636
  }
493
637
 
638
+ async function verifyExistingArtifact(artifact, localPath) {
639
+ try {
640
+ const fileStat = await stat(localPath);
641
+ if (!fileStat.isFile()) {
642
+ throw new Error(`not a file`);
643
+ }
644
+ } catch {
645
+ throw new Error(
646
+ `Bundled release artifact ${artifact.name} is missing at ${artifact.relativePath}`,
647
+ );
648
+ }
649
+ const actual = await sha256File(localPath);
650
+ if (actual !== artifact.sha256) {
651
+ throw new Error(`Checksum mismatch for ${artifact.name}: got ${actual}`);
652
+ }
653
+ }
654
+
494
655
  function terraformOutputs(terraformDir) {
495
656
  const names = [
496
657
  "api_endpoint",
658
+ "app_url",
497
659
  "admin_url",
498
660
  "computer_url",
499
661
  "docs_url",
@@ -565,7 +727,7 @@ async function sha256File(path) {
565
727
  }
566
728
 
567
729
  function runtimeName(name) {
568
- if (name.includes("flue")) return "flue";
730
+ if (name.includes("pi")) return "pi";
569
731
  if (name.includes("strands")) return "strands";
570
732
  return name;
571
733
  }
@@ -12,8 +12,7 @@ try {
12
12
  const outputPath = required("--summary");
13
13
  const targets = [
14
14
  ["api_endpoint", "api"],
15
- ["admin_url", "admin"],
16
- ["computer_url", "computer"],
15
+ ["app_url", "web"],
17
16
  ["docs_url", "docs"],
18
17
  ]
19
18
  .map(([output, name]) => ({