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
@@ -191,15 +191,46 @@ if [[ -n "$execution_role_arn" ]]; then
191
191
  role_arg="--memory-execution-role-arn $execution_role_arn"
192
192
  fi
193
193
 
194
- create_output="$(
195
- aws bedrock-agentcore-control create-memory \
196
- --region "$region" \
197
- --name "$name" \
198
- --memory-strategies "$strategies_json" \
199
- --event-expiry-duration 365 \
200
- $role_arg \
201
- --output json
202
- )"
194
+ # CreateMemory validates the execution role's trust policy at call time. When
195
+ # Terraform created that role moments earlier in the same apply, IAM has not
196
+ # propagated yet and the API rejects it with ValidationException "Please
197
+ # provide a role with a valid trust policy" — empirically for ~20s after role
198
+ # creation (harness cycle-5 ledger entry). Retry that specific error with a
199
+ # bounded backoff; every other error fails immediately.
200
+ create_output=""
201
+ create_status=1
202
+ err_file="$(mktemp)"
203
+ trap 'rm -f "$err_file"' EXIT
204
+ for attempt in $(seq 1 12); do
205
+ set +e
206
+ create_output="$(
207
+ aws bedrock-agentcore-control create-memory \
208
+ --region "$region" \
209
+ --name "$name" \
210
+ --memory-strategies "$strategies_json" \
211
+ --event-expiry-duration 365 \
212
+ $role_arg \
213
+ --output json 2>"$err_file"
214
+ )"
215
+ create_status=$?
216
+ set -e
217
+ if [[ $create_status -eq 0 ]]; then
218
+ break
219
+ fi
220
+ if grep -qi "valid trust policy" "$err_file"; then
221
+ echo "[create_or_find_memory] attempt $attempt: execution role not yet visible to AgentCore (IAM propagation); retrying in 15s" >&2
222
+ sleep 15
223
+ continue
224
+ fi
225
+ cat "$err_file" >&2
226
+ exit "$create_status"
227
+ done
228
+
229
+ if [[ $create_status -ne 0 ]]; then
230
+ echo "[create_or_find_memory] create-memory still failing after $attempt attempts:" >&2
231
+ cat "$err_file" >&2
232
+ exit "$create_status"
233
+ fi
203
234
 
204
235
  new_id="$(echo "$create_output" | jq -r '.memory.id // .id')"
205
236
 
@@ -0,0 +1,61 @@
1
+ # `agentcore-pi` — Pi agent runtime
2
+
3
+ Provisions the **Pi** agent runtime as a Lambda+LWA function (Plan §005 U2).
4
+
5
+ This module owns the dedicated Pi Lambda + log group + IAM role + event-invoke config. Shared AgentCore platform resources live in `../agentcore-platform`.
6
+
7
+ ## Resources owned
8
+
9
+ - `aws_iam_role.agentcore_pi` (`thinkwork-${stage}-agentcore-pi-role`) — assumed by Lambda + Bedrock AgentCore Runtime principals.
10
+ - `aws_iam_role_policy.agentcore_pi` — baseline permissions (S3 skill catalog, Bedrock model invoke, AgentCore Memory + Code Interpreter, CloudWatch Logs, X-Ray ingestion, ECR pull, SSM parameter access, memory-retain Lambda invoke). Forward-compat additions for U4-U8: Aurora Data API + Secrets Manager scoped to `thinkwork-${stage}-*`.
11
+ - `aws_iam_role_policy_attachment.agentcore_pi_vpc_access` — attached when Pi needs private-network access for Company Brain/Cognee direct MCP or the OKF EFS mount.
12
+ - `aws_iam_role_policy.agentcore_pi_dlq_send` — `sqs:SendMessage` against the shared async DLQ (injected via `var.async_dlq_arn`).
13
+ - `aws_cloudwatch_log_group.agentcore_pi` (`/thinkwork/${stage}/agentcore-pi`).
14
+ - `aws_lambda_function.agentcore_pi` (`thinkwork-${stage}-agentcore-pi`) — `package_type = "Image"`, pulls `${ecr_repository_url}:pi-latest`.
15
+ - `aws_lambda_function_event_invoke_config.agentcore_pi` — `MaximumRetryAttempts=0`, on-failure → shared DLQ.
16
+
17
+ ## Resources NOT owned (injected via inputs)
18
+
19
+ - **ECR repository** — shared AgentCore image repository (`thinkwork-${stage}-agentcore`). Pi pulls the `pi-latest` / `${sha}-pi` image tags from this repo. Owned by `../agentcore-platform`; URL injected via `var.ecr_repository_url`.
20
+ - **Async DLQ** — shared AgentCore async failure queue. Owned by `../agentcore-platform`; ARN injected via `var.async_dlq_arn`.
21
+
22
+ ## State migration
23
+
24
+ The dedicated runtime previously shipped as Flue. The migration renamed that module and runtime identity back to Pi via `moved {}` blocks declared in the parent composition (`terraform/modules/thinkwork/main.tf`):
25
+
26
+ ```hcl
27
+ moved {
28
+ from = module.agentcore_flue.aws_lambda_function.agentcore_flue
29
+ to = module.agentcore_pi.aws_lambda_function.agentcore_pi
30
+ }
31
+ # (and the analogous moves for the log group + event-invoke config + IAM role)
32
+ ```
33
+
34
+ The Lambda function name changes from `thinkwork-${stage}-agentcore-flue` to `thinkwork-${stage}-agentcore-pi`, so apply the runtime/data migration as part of the same release window.
35
+
36
+ ## Inputs
37
+
38
+ | Variable | Required | Purpose |
39
+ | --------------------- | -------- | ------------------------------------------------------------------------------ |
40
+ | `stage` | yes | Deployment stage (e.g., `dev`, `prod`). |
41
+ | `account_id` | yes | AWS account ID (used in IAM resource ARNs). |
42
+ | `region` | yes | AWS region. |
43
+ | `bucket_name` | yes | Primary S3 bucket for skills + workspace files. |
44
+ | `ecr_repository_url` | yes | Shared ECR repo URL from `module.agentcore_platform.ecr_repository_url`. |
45
+ | `async_dlq_arn` | yes | Shared async DLQ ARN from `module.agentcore_platform.agentcore_async_dlq_arn`. |
46
+ | `hindsight_endpoint` | no | Hindsight API endpoint when enabled; empty disables Hindsight tools. |
47
+ | `agentcore_memory_id` | no | AgentCore Memory resource ID for auto-retention. |
48
+ | `api_endpoint` | no | API Gateway base URL for the `/api/skills/complete` callback. |
49
+ | `api_auth_secret` | no | Service-auth bearer for the same callback. |
50
+ | `memory_engine` | no | `hindsight` or `agentcore`; surfaced as `MEMORY_ENGINE` env var. |
51
+ | `cognee_subnet_ids` | no | Private subnets for direct Company Brain/Cognee MCP access. |
52
+ | `cognee_security_group_ids` | no | Security groups allowed to reach the internal Company Brain/Cognee endpoint. |
53
+
54
+ ## Outputs
55
+
56
+ | Output | Purpose |
57
+ | --------------------- | ------------------------------------------------------------------------------------------ |
58
+ | `pi_function_name` | Direct SDK invoke target (passed to `chat-agent-invoke` as `AGENTCORE_PI_FUNCTION_NAME`). |
59
+ | `pi_function_arn` | Granted to `chat-agent-invoke`'s `lambda:InvokeFunction` policy. |
60
+ | `pi_runtime_role_arn` | Assumed by the Bedrock AgentCore Runtime when Pi is invoked via the Bedrock control plane. |
61
+ | `pi_log_group_name` | Scrubber + operator inspection target. |
@@ -0,0 +1,453 @@
1
+ ################################################################################
2
+ # AgentCore Pi — App Module
3
+ #
4
+ # Plan §005 U2 — provisions the Pi agent runtime as a Lambda+LWA function.
5
+ #
6
+ # Layout note: this module owns the IAM role, log group, Lambda function, and
7
+ # event-invoke config that are unique to Pi. Shared AgentCore platform
8
+ # resources are injected via input variables; the IAM policy here grants
9
+ # `sqs:SendMessage` against the shared DLQ ARN.
10
+ #
11
+ # State migration: the resources here previously lived inside `module.agentcore`
12
+ # (the legacy runtime module) under the address `aws_*.agentcore_pi`. The
13
+ # parent module's `moved {}` blocks realign state across modules without
14
+ # destroy+create on the underlying AWS resources.
15
+ ################################################################################
16
+
17
+ # memory-retain Lambda name + ARN are constructed locally rather than
18
+ # taken as inputs to avoid a circular dependency: the lambda-api module
19
+ # already consumes this module's output (agentcore_pi_function_name/arn).
20
+ locals {
21
+ memory_retain_fn_name = "thinkwork-${var.stage}-api-memory-retain"
22
+ memory_retain_fn_arn = "arn:aws:lambda:${var.region}:${var.account_id}:function:${local.memory_retain_fn_name}"
23
+ chat_agent_finalize_fn_name = "thinkwork-${var.stage}-api-chat-agent-finalize"
24
+ chat_agent_finalize_fn_arn = "arn:aws:lambda:${var.region}:${var.account_id}:function:${local.chat_agent_finalize_fn_name}"
25
+ chat_agent_activity_fn_name = "thinkwork-${var.stage}-api-chat-agent-activity"
26
+ chat_agent_activity_fn_arn = "arn:aws:lambda:${var.region}:${var.account_id}:function:${local.chat_agent_activity_fn_name}"
27
+ pi_image_uri = "${var.ecr_repository_url}:pi-latest"
28
+ cognee_vpc_enabled = length(var.cognee_subnet_ids) > 0 && length(var.cognee_security_group_ids) > 0
29
+ okf_efs_vpc_enabled = var.okf_efs_enabled && length(var.okf_efs_subnet_ids) > 0 && length(var.okf_efs_security_group_ids) > 0
30
+ private_vpc_enabled = local.cognee_vpc_enabled || local.okf_efs_vpc_enabled
31
+ private_subnet_ids = distinct(concat(var.cognee_subnet_ids, var.okf_efs_subnet_ids))
32
+ private_security_group_ids = distinct(concat(
33
+ var.cognee_security_group_ids,
34
+ var.okf_efs_security_group_ids,
35
+ ))
36
+ okf_efs_mount_enabled = local.okf_efs_vpc_enabled && var.okf_efs_file_system_arn != "" && var.okf_efs_read_access_point_arn != ""
37
+ okf_efs_iam_statements = local.okf_efs_mount_enabled ? [
38
+ {
39
+ Sid = "OkfWikiEfsReadOnlyMount"
40
+ Effect = "Allow"
41
+ Action = ["elasticfilesystem:ClientMount"]
42
+ Resource = var.okf_efs_file_system_arn
43
+ Condition = {
44
+ StringEquals = {
45
+ "elasticfilesystem:AccessPointArn" = var.okf_efs_read_access_point_arn
46
+ }
47
+ }
48
+ },
49
+ ] : []
50
+ }
51
+
52
+ ################################################################################
53
+ # Execution Role
54
+ ################################################################################
55
+
56
+ resource "aws_iam_role" "agentcore_pi" {
57
+ name = "thinkwork-${var.stage}-agentcore-pi-role"
58
+
59
+ assume_role_policy = jsonencode({
60
+ Version = "2012-10-17"
61
+ Statement = [{
62
+ Effect = "Allow"
63
+ Principal = { Service = ["ecs-tasks.amazonaws.com", "lambda.amazonaws.com", "bedrock-agentcore.amazonaws.com"] }
64
+ Action = "sts:AssumeRole"
65
+ }]
66
+ })
67
+
68
+ tags = {
69
+ Name = "thinkwork-${var.stage}-agentcore-pi-role"
70
+ }
71
+ }
72
+
73
+ resource "aws_iam_role_policy" "agentcore_pi" {
74
+ name = "agentcore-pi-permissions"
75
+ role = aws_iam_role.agentcore_pi.id
76
+
77
+ policy = jsonencode({
78
+ Version = "2012-10-17"
79
+ Statement = concat([
80
+ {
81
+ Sid = "S3Access"
82
+ Effect = "Allow"
83
+ Action = ["s3:GetObject", "s3:PutObject", "s3:ListBucket"]
84
+ Resource = [
85
+ "arn:aws:s3:::${var.bucket_name}",
86
+ "arn:aws:s3:::${var.bucket_name}/*",
87
+ ]
88
+ },
89
+ {
90
+ # Eval datasets hold red-team answer keys and flagged-thread
91
+ # snapshots (PII) — never agent-readable. The grant above is
92
+ # bucket-wide, so application-level path resolution alone is one
93
+ # bug away from exposing them to the agent under test; this Deny
94
+ # is the enforcement layer (Evaluations Trust Core U4 KTD). Run
95
+ # snapshots live under the same prefix
96
+ # (tenants/<slug>/eval-datasets/.runs/<run-id>/) so they are
97
+ # covered by construction.
98
+ Sid = "DenyEvalDatasetPrefix"
99
+ Effect = "Deny"
100
+ Action = ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"]
101
+ Resource = [
102
+ "arn:aws:s3:::${var.bucket_name}/tenants/*/eval-datasets/*",
103
+ ]
104
+ },
105
+ {
106
+ # Bedrock invoke spans foundation models, inference profiles, and
107
+ # cross-region routing. The original
108
+ # `arn:aws:bedrock:${region}::foundation-model/*` only covered
109
+ # foundation models in the primary region — but a
110
+ # `us.anthropic.claude-sonnet-...` inference profile (the default
111
+ # routing path used by chat-agent-invoke) lives at
112
+ # `arn:aws:bedrock:${region}:${account}:inference-profile/*` AND
113
+ # dispatches the actual InvokeModel call to the foundation model
114
+ # in whatever region the profile resolves to (us-east-1,
115
+ # us-east-2, us-west-2). The narrow ARN caused every agent turn
116
+ # to fail with AccessDenied silently inside pi-ai's Bedrock
117
+ # provider, surfacing as an empty assistant message with zero
118
+ # token usage. Inference profiles and their routed foundation-model
119
+ # calls require broad model resource scope.
120
+ Sid = "BedrockInvoke"
121
+ Effect = "Allow"
122
+ Action = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream", "bedrock:InvokeAgent"]
123
+ Resource = "*"
124
+ },
125
+ {
126
+ # Some Bedrock Marketplace-backed models require the invoking role to
127
+ # view/accept the model subscription before Converse can stream. Without
128
+ # these actions Bedrock returns an assistant error with zero token usage.
129
+ Sid = "MarketplaceModelAccess"
130
+ Effect = "Allow"
131
+ Action = ["aws-marketplace:ViewSubscriptions", "aws-marketplace:Subscribe"]
132
+ Resource = "*"
133
+ },
134
+ {
135
+ # Automatic memory retention — every agent turn calls CreateEvent
136
+ # to feed AgentCore's background strategies. Also needs read access
137
+ # so the recall() tool can fetch previously extracted records and
138
+ # so forget() can soft-archive old records.
139
+ Sid = "AgentCoreMemoryReadWrite"
140
+ Effect = "Allow"
141
+ Action = [
142
+ "bedrock-agentcore:CreateEvent",
143
+ "bedrock-agentcore:ListEvents",
144
+ "bedrock-agentcore:GetEvent",
145
+ "bedrock-agentcore:ListMemoryRecords",
146
+ "bedrock-agentcore:RetrieveMemoryRecords",
147
+ "bedrock-agentcore:GetMemoryRecord",
148
+ "bedrock-agentcore:BatchCreateMemoryRecords",
149
+ "bedrock-agentcore:BatchUpdateMemoryRecords",
150
+ ]
151
+ Resource = "*"
152
+ },
153
+ {
154
+ # Browser Automation (browser_automation tool). Pi can open managed
155
+ # AgentCore Browser sessions when the built-in browser capability is
156
+ # enabled for an agent.
157
+ Sid = "AgentCoreBrowser"
158
+ Effect = "Allow"
159
+ Action = [
160
+ "bedrock-agentcore:StartBrowserSession",
161
+ "bedrock-agentcore:StopBrowserSession",
162
+ "bedrock-agentcore:GetBrowserSession",
163
+ "bedrock-agentcore:ListBrowserSessions",
164
+ "bedrock-agentcore:InvokeBrowser",
165
+ "bedrock-agentcore:UpdateBrowserStream",
166
+ ]
167
+ Resource = [
168
+ "arn:aws:bedrock-agentcore:${var.region}:aws:browser/aws.browser.v1",
169
+ "arn:aws:bedrock-agentcore:${var.region}:${var.account_id}:browser/*",
170
+ ]
171
+ },
172
+ {
173
+ # AgentCore Code Interpreter — Pi's primary sandbox per the FR-9a
174
+ # integration spike (`packages/pi-aws/connectors/agentcore-
175
+ # codeinterpreter.ts`). Per-tenant interpreters live under
176
+ # `code-interpreter-custom/*`; sessions are started, exec'd against,
177
+ # and stopped per Pi invocation.
178
+ Sid = "AgentCoreCodeInterpreter"
179
+ Effect = "Allow"
180
+ Action = [
181
+ "bedrock-agentcore:StartCodeInterpreterSession",
182
+ "bedrock-agentcore:StopCodeInterpreterSession",
183
+ "bedrock-agentcore:InvokeCodeInterpreter",
184
+ "bedrock-agentcore:GetCodeInterpreterSession",
185
+ "bedrock-agentcore:ListCodeInterpreterSessions",
186
+ "bedrock-agentcore:GetCodeInterpreter",
187
+ ]
188
+ Resource = "arn:aws:bedrock-agentcore:${var.region}:${var.account_id}:code-interpreter-custom/*"
189
+ },
190
+ {
191
+ Sid = "CloudWatchLogs"
192
+ Effect = "Allow"
193
+ Action = [
194
+ "logs:CreateLogGroup",
195
+ "logs:CreateLogStream",
196
+ "logs:DescribeLogGroups",
197
+ "logs:DescribeLogStreams",
198
+ "logs:PutLogEvents",
199
+ ]
200
+ # Lambda log group + AgentCore Runtime container log groups + the
201
+ # account-wide aws/spans log group (CloudWatch Transaction Search
202
+ # destination — required for AgentCore Evaluations to read spans).
203
+ Resource = [
204
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/lambda/thinkwork-${var.stage}-*",
205
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/lambda/thinkwork-${var.stage}-*:*",
206
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/bedrock-agentcore/runtimes/*",
207
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/bedrock-agentcore/runtimes/*:*",
208
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:aws/spans",
209
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:aws/spans:*",
210
+ ]
211
+ },
212
+ {
213
+ # X-Ray ingestion — ADOT exporters publish spans here, which then
214
+ # flow to aws/spans via the Transaction Search policy. AgentCore
215
+ # Evaluations queries those spans by session.id when scoring runs.
216
+ Sid = "XRayIngest"
217
+ Effect = "Allow"
218
+ Action = [
219
+ "xray:PutTraceSegments",
220
+ "xray:PutTelemetryRecords",
221
+ "xray:GetSamplingRules",
222
+ "xray:GetSamplingTargets",
223
+ ]
224
+ Resource = [
225
+ "arn:aws:xray:${var.region}:${var.account_id}:*",
226
+ "*",
227
+ ]
228
+ },
229
+ {
230
+ Sid = "ECRPull"
231
+ Effect = "Allow"
232
+ Action = ["ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage"]
233
+ Resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/thinkwork-${var.stage}-*"
234
+ },
235
+ {
236
+ Sid = "ECRAuth"
237
+ Effect = "Allow"
238
+ Action = ["ecr:GetAuthorizationToken"]
239
+ Resource = "*"
240
+ },
241
+ {
242
+ Sid = "SSMParameterAccess"
243
+ Effect = "Allow"
244
+ Action = ["ssm:GetParameter", "ssm:PutParameter"]
245
+ Resource = "arn:aws:ssm:${var.region}:${var.account_id}:parameter/thinkwork/${var.stage}/agentcore/*"
246
+ },
247
+ {
248
+ # Invoke API Lambdas from Pi's private VPC. Memory retain is queued
249
+ # async; chat activity/finalize are RequestResponse callbacks because
250
+ # public API Gateway endpoints are not reachable reliably from this VPC.
251
+ Sid = "ApiLambdaInvoke"
252
+ Effect = "Allow"
253
+ Action = ["lambda:InvokeFunction"]
254
+ Resource = [
255
+ local.memory_retain_fn_arn,
256
+ local.chat_agent_finalize_fn_arn,
257
+ local.chat_agent_activity_fn_arn,
258
+ ]
259
+ },
260
+ {
261
+ # Aurora Data API — U4 SessionStore and Hindsight exact-memory recall
262
+ # read/write via the RDS Data API rather than long-lived Postgres
263
+ # connections. Cover both the canonical cluster name and suffixed
264
+ # replacement names.
265
+ Sid = "AuroraDataAPI"
266
+ Effect = "Allow"
267
+ Action = [
268
+ "rds-data:ExecuteStatement",
269
+ "rds-data:BatchExecuteStatement",
270
+ "rds-data:BeginTransaction",
271
+ "rds-data:CommitTransaction",
272
+ "rds-data:RollbackTransaction",
273
+ ]
274
+ Resource = [
275
+ "arn:aws:rds:${var.region}:${var.account_id}:cluster:thinkwork-${var.stage}-db",
276
+ "arn:aws:rds:${var.region}:${var.account_id}:cluster:thinkwork-${var.stage}-db-*",
277
+ ]
278
+ },
279
+ {
280
+ # Secrets Manager — Pi resolves db credentials and other runtime
281
+ # secrets at invocation time per `feedback_completion_callback_
282
+ # snapshot_pattern`. Scoped to `/thinkwork/${stage}/*` per the
283
+ # existing convention.
284
+ Sid = "SecretsManagerRead"
285
+ Effect = "Allow"
286
+ Action = [
287
+ "secretsmanager:GetSecretValue",
288
+ "secretsmanager:DescribeSecret",
289
+ ]
290
+ Resource = "arn:aws:secretsmanager:${var.region}:${var.account_id}:secret:thinkwork-${var.stage}-*"
291
+ },
292
+ ], local.okf_efs_iam_statements)
293
+ })
294
+ }
295
+
296
+ resource "aws_iam_role_policy_attachment" "agentcore_pi_vpc_access" {
297
+ count = local.private_vpc_enabled ? 1 : 0
298
+
299
+ role = aws_iam_role.agentcore_pi.name
300
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
301
+ }
302
+
303
+ resource "aws_iam_role_policy" "agentcore_pi_dlq_send" {
304
+ name = "agentcore-pi-dlq-send"
305
+ role = aws_iam_role.agentcore_pi.id
306
+
307
+ policy = jsonencode({
308
+ Version = "2012-10-17"
309
+ Statement = [{
310
+ Effect = "Allow"
311
+ Action = ["sqs:SendMessage"]
312
+ Resource = var.async_dlq_arn
313
+ }]
314
+ })
315
+ }
316
+
317
+ ################################################################################
318
+ # CloudWatch Log Group
319
+ ################################################################################
320
+
321
+ resource "aws_cloudwatch_log_group" "agentcore_pi" {
322
+ name = "/thinkwork/${var.stage}/agentcore-pi"
323
+ retention_in_days = 30
324
+
325
+ tags = {
326
+ Name = "thinkwork-${var.stage}-agentcore-pi-logs"
327
+ }
328
+ }
329
+
330
+ ################################################################################
331
+ # Lambda Container Image
332
+ ################################################################################
333
+
334
+ resource "terraform_data" "seed_pi_image" {
335
+ count = var.source_image_uri != "" ? 1 : 0
336
+
337
+ triggers_replace = {
338
+ source_image_uri = var.source_image_uri
339
+ target_image_uri = local.pi_image_uri
340
+ }
341
+
342
+ provisioner "local-exec" {
343
+ interpreter = ["/bin/bash", "-c"]
344
+ command = <<-EOT
345
+ set -euo pipefail
346
+ repo_root="${abspath("${path.module}/../../../..")}"
347
+ aws ecr get-login-password --region ${var.region} | docker login --username AWS --password-stdin ${var.account_id}.dkr.ecr.${var.region}.amazonaws.com
348
+ if docker pull "${var.source_image_uri}"; then
349
+ source_id="$(docker image inspect --format '{{.Id}}' "${var.source_image_uri}")"
350
+ docker tag "$source_id" "${local.pi_image_uri}"
351
+ else
352
+ dockerfile="$repo_root/packages/agentcore-pi/agent-container/Dockerfile"
353
+ if [[ ! -f "$dockerfile" ]]; then
354
+ echo "ERROR: could not pull ${var.source_image_uri} and there is no repo checkout at $repo_root to build from." >&2
355
+ echo "The pinned release image must be pullable by this machine (public registry, or docker login to its registry)." >&2
356
+ echo "Alternatively set agentcore_pi_source_image_uri in terraform.tfvars to an image this AWS account can pull." >&2
357
+ exit 1
358
+ fi
359
+ echo "Unable to pull release image ${var.source_image_uri}; building Pi image from $repo_root"
360
+ docker build \
361
+ --platform linux/amd64 \
362
+ -f "$dockerfile" \
363
+ -t "${local.pi_image_uri}" \
364
+ "$repo_root"
365
+ fi
366
+ docker push "${local.pi_image_uri}"
367
+ EOT
368
+ }
369
+ }
370
+
371
+ resource "aws_lambda_function" "agentcore_pi" {
372
+ function_name = "thinkwork-${var.stage}-agentcore-pi"
373
+ role = aws_iam_role.agentcore_pi.arn
374
+ package_type = "Image"
375
+ image_uri = local.pi_image_uri
376
+ timeout = 900
377
+ memory_size = 2048
378
+
379
+ depends_on = [terraform_data.seed_pi_image]
380
+
381
+ environment {
382
+ variables = {
383
+ PORT = "8080"
384
+ AWS_LWA_PORT = "8080"
385
+ AGENTCORE_MEMORY_ID = var.agentcore_memory_id
386
+ AGENTCORE_FILES_BUCKET = var.bucket_name
387
+ MEMORY_ENGINE = var.memory_engine
388
+ REQUESTER_IDLE_MEMORY_LEARNING_ENABLED = tostring(var.requester_idle_memory_learning_enabled)
389
+ MEMORY_RETAIN_FN_NAME = local.memory_retain_fn_name
390
+ CHAT_AGENT_FINALIZE_FN_NAME = local.chat_agent_finalize_fn_name
391
+ CHAT_AGENT_ACTIVITY_FN_NAME = local.chat_agent_activity_fn_name
392
+ HINDSIGHT_ENDPOINT = var.hindsight_endpoint
393
+ THINKWORK_API_URL = var.api_endpoint
394
+ API_AUTH_SECRET = var.api_auth_secret
395
+ # Plan §005 U4 — AuroraSessionStore uses the RDS Data API to persist
396
+ # Pi's SessionData blobs against threads.session_data. Empty during
397
+ # the first greenfield apply (DB cluster doesn't exist yet); the
398
+ # constructor fail-closes if either is missing at runtime.
399
+ DB_CLUSTER_ARN = var.db_cluster_arn
400
+ DB_SECRET_ARN = var.db_secret_arn
401
+ OKF_WIKI_NAVIGATOR_ENABLED = tostring(local.okf_efs_mount_enabled)
402
+ OKF_WIKI_ROOT = var.okf_efs_mount_path
403
+ }
404
+ }
405
+
406
+ dynamic "vpc_config" {
407
+ for_each = local.private_vpc_enabled ? [1] : []
408
+
409
+ content {
410
+ subnet_ids = local.private_subnet_ids
411
+ security_group_ids = local.private_security_group_ids
412
+ }
413
+ }
414
+
415
+ dynamic "file_system_config" {
416
+ for_each = local.okf_efs_vpc_enabled ? [1] : []
417
+
418
+ content {
419
+ arn = var.okf_efs_read_access_point_arn
420
+ local_mount_path = var.okf_efs_mount_path
421
+ }
422
+ }
423
+
424
+ logging_config {
425
+ log_group = aws_cloudwatch_log_group.agentcore_pi.name
426
+ log_format = "Text"
427
+ }
428
+
429
+ tags = {
430
+ Name = "thinkwork-${var.stage}-agentcore-pi"
431
+ }
432
+ }
433
+
434
+ ################################################################################
435
+ # Async-invoke hardening — MaximumRetryAttempts=0 + DLQ
436
+ #
437
+ # AWS Lambda async-invoke defaults to 2 retries; the agent loop is not
438
+ # idempotent (Bedrock tokens get re-burned, partial deliverables can
439
+ # overwrite the first), so retries are disabled and failed invokes land in
440
+ # the shared DLQ for operator visibility.
441
+ ################################################################################
442
+
443
+ resource "aws_lambda_function_event_invoke_config" "agentcore_pi" {
444
+ function_name = aws_lambda_function.agentcore_pi.function_name
445
+ maximum_retry_attempts = 0
446
+ maximum_event_age_in_seconds = 3600
447
+
448
+ destination_config {
449
+ on_failure {
450
+ destination = var.async_dlq_arn
451
+ }
452
+ }
453
+ }
@@ -0,0 +1,38 @@
1
+ ################################################################################
2
+ # AgentCore Pi — App Module (outputs)
3
+ ################################################################################
4
+
5
+ output "agentcore_pi_function_name" {
6
+ description = "Pi AgentCore Lambda function name (for direct SDK invoke from chat-agent-invoke)"
7
+ value = aws_lambda_function.agentcore_pi.function_name
8
+ }
9
+
10
+ output "agentcore_pi_function_arn" {
11
+ description = "Pi AgentCore Lambda function ARN (for IAM policy on callers; used to grant lambda:InvokeFunction)"
12
+ value = aws_lambda_function.agentcore_pi.arn
13
+ }
14
+
15
+ output "agentcore_pi_runtime_role_arn" {
16
+ description = "IAM role ARN for the Pi agent runtime (assumed by Lambda + Bedrock AgentCore Runtime principals)"
17
+ value = aws_iam_role.agentcore_pi.arn
18
+ }
19
+
20
+ output "agentcore_pi_log_group_name" {
21
+ description = "CloudWatch log group name for the Pi Lambda. Useful for log scrubbing and operator inspection."
22
+ value = aws_cloudwatch_log_group.agentcore_pi.name
23
+ }
24
+
25
+ output "okf_wiki_mount_enabled" {
26
+ description = "Whether the OKF wiki EFS view is mounted into the Pi Lambda."
27
+ value = local.okf_efs_mount_enabled
28
+ }
29
+
30
+ output "okf_wiki_mount_path" {
31
+ description = "Pi local mount path for the OKF wiki EFS view."
32
+ value = var.okf_efs_mount_path
33
+ }
34
+
35
+ output "okf_wiki_read_access_point_arn" {
36
+ description = "EFS access point ARN mounted by Pi for read-only OKF wiki traversal."
37
+ value = var.okf_efs_read_access_point_arn
38
+ }