thinkwork-cli 0.12.12 → 0.12.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. package/README.md +42 -38
  2. package/dist/{api-client-ASJWIG3Z.js → api-client-JUBCQQDF.js} +1 -1
  3. package/dist/{chunk-JEHV35EU.js → chunk-STY44FQO.js} +353 -30
  4. package/dist/cli.js +23823 -10151
  5. package/dist/commands/enterprise/templates/deploy-repo/.github/workflows/deploy.yml +17 -6
  6. package/dist/commands/enterprise/templates/deploy-repo/docs/runbook.md +81 -9
  7. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +183 -21
  8. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +1 -2
  9. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +286 -0
  10. package/dist/drizzle/0000_petite_marvel_apes.sql +1188 -0
  11. package/dist/drizzle/0001_milky_surge.sql +103 -0
  12. package/dist/drizzle/0002_aberrant_mattie_franklin.sql +41 -0
  13. package/dist/drizzle/0003_exotic_ogun.sql +3 -0
  14. package/dist/drizzle/0004_glamorous_magneto.sql +2 -0
  15. package/dist/drizzle/0005_ancient_nocturne.sql +2 -0
  16. package/dist/drizzle/0006_new_colonel_america.sql +2 -0
  17. package/dist/drizzle/0007_unique_external_task_id.sql +31 -0
  18. package/dist/drizzle/0008_external_task_id_column.sql +43 -0
  19. package/dist/drizzle/0009_evaluations.sql +64 -0
  20. package/dist/drizzle/0010_eval_agent_template.sql +2 -0
  21. package/dist/drizzle/0011_eval_run_template.sql +2 -0
  22. package/dist/drizzle/0012_eval_seed_unique.sql +16 -0
  23. package/dist/drizzle/0013_motionless_white_queen.sql +140 -0
  24. package/dist/drizzle/0014_wiki_aggregation.sql +11 -0
  25. package/dist/drizzle/0015_pg_trgm_alias_title_indexes.sql +9 -0
  26. package/dist/drizzle/0016_wiki_schema_drops.sql +24 -0
  27. package/dist/drizzle/0017_wiki_places.sql +46 -0
  28. package/dist/drizzle/0018_agent_workspace_overlay.sql +26 -0
  29. package/dist/drizzle/0018_cool_firebird.sql +24 -0
  30. package/dist/drizzle/0018_skill_runs.sql +84 -0
  31. package/dist/drizzle/0019_condemned_dragon_man.sql +95 -0
  32. package/dist/drizzle/0019_webhook_skill_runs.sql +58 -0
  33. package/dist/drizzle/0020_crazy_the_anarchist.sql +9 -0
  34. package/dist/drizzle/0020_mutation_idempotency.sql +64 -0
  35. package/dist/drizzle/0021_crm_work_links.sql +76 -0
  36. package/dist/drizzle/0021_skill_runs_completion_hmac.sql +33 -0
  37. package/dist/drizzle/0022_add_billing_tables.sql +70 -0
  38. package/dist/drizzle/0022_seed_thinkwork_admin_permissions.sql +160 -0
  39. package/dist/drizzle/0022_stripe_billing_indexes.sql +48 -0
  40. package/dist/drizzle/0023_tenants_deactivation.sql +27 -0
  41. package/dist/drizzle/0024_tenant_mcp_admin_keys.sql +63 -0
  42. package/dist/drizzle/0025_v1_agent_architecture.sql +182 -0
  43. package/dist/drizzle/0026_thread_turns_add_kind.sql +28 -0
  44. package/dist/drizzle/0027_capability_catalog_and_manifests.sql +219 -0
  45. package/dist/drizzle/0028_aws_s3_extension.sql +26 -0
  46. package/dist/drizzle/0029_collapse_execution_types.sql +42 -0
  47. package/dist/drizzle/0030_retire_composition_primitives.sql +48 -0
  48. package/dist/drizzle/0031_thread_cleanup_drops.sql +131 -0
  49. package/dist/drizzle/0032_add_browser_automation_template_config.sql +24 -0
  50. package/dist/drizzle/0033_agent_operation_leases.sql +32 -0
  51. package/dist/drizzle/0034_agent_workspace_events.sql +116 -0
  52. package/dist/drizzle/0035_workspace_review_decisions.sql +19 -0
  53. package/dist/drizzle/0036_user_scoped_memory_wiki.sql +152 -0
  54. package/dist/drizzle/0037_user_profile_operating_model.sql +34 -0
  55. package/dist/drizzle/0042_agent_runtime_selector.sql +41 -0
  56. package/dist/drizzle/0043_wiki_search_tsv_tokenization.sql +48 -0
  57. package/dist/drizzle/0044_add_web_search_template_config.sql +7 -0
  58. package/dist/drizzle/0045_add_send_email_template_config.sql +7 -0
  59. package/dist/drizzle/0046_tenant_mcp_context_tools.sql +26 -0
  60. package/dist/drizzle/0047_add_context_engine_template_config.sql +7 -0
  61. package/dist/drizzle/0048_tenant_context_provider_settings.sql +22 -0
  62. package/dist/drizzle/0050_brain_v0_entity_subtype.sql +29 -0
  63. package/dist/drizzle/0051_brain_v0_tenant_entity_pages.sql +170 -0
  64. package/dist/drizzle/0052_brain_v0_external_refs.sql +41 -0
  65. package/dist/drizzle/0053_brain_v0_unresolved_mentions_subtype.sql +48 -0
  66. package/dist/drizzle/0054_wiki_compile_jobs_input.sql +28 -0
  67. package/dist/drizzle/0055_routines_stepfunctions_substrate.sql +202 -0
  68. package/dist/drizzle/0056_routine_step_events_dedup_idx.sql +25 -0
  69. package/dist/drizzle/0057_archive_legacy_python_routines.sql +36 -0
  70. package/dist/drizzle/0058_routines_visibility_and_owning_agent.sql +61 -0
  71. package/dist/drizzle/0061_routine_execution_asl_version_id.sql +29 -0
  72. package/dist/drizzle/0062_migrate_pi_to_flue.sql +110 -0
  73. package/dist/drizzle/0063_threads_session_data.sql +23 -0
  74. package/dist/drizzle/0064_tenant_credentials.sql +65 -0
  75. package/dist/drizzle/0067_thinkwork_computers_phase_one.sql +174 -0
  76. package/dist/drizzle/0068_drop_system_workflows_and_activation.sql +115 -0
  77. package/dist/drizzle/0069_compliance_schema.sql +364 -0
  78. package/dist/drizzle/0070_compliance_aurora_roles.sql +171 -0
  79. package/dist/drizzle/0072_threads_computer_ownership.sql +24 -0
  80. package/dist/drizzle/0073_compliance_tenant_anchor_state.sql +105 -0
  81. package/dist/drizzle/0074_compliance_event_hash_index.sql +49 -0
  82. package/dist/drizzle/0075_scheduled_jobs_computer_ownership.sql +27 -0
  83. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +69 -0
  84. package/dist/drizzle/0077_computers_primary_agent_id.sql +38 -0
  85. package/dist/drizzle/0078_tenant_customize_catalog.sql +46 -0
  86. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +53 -0
  87. package/dist/drizzle/0081_routines_catalog_slug.sql +42 -0
  88. package/dist/drizzle/0082_messages_parts_jsonb.sql +52 -0
  89. package/dist/drizzle/0083_computer_runbooks.sql +103 -0
  90. package/dist/drizzle/0084_artifacts_favorited_at.sql +32 -0
  91. package/dist/drizzle/0085_seed_thinkwork_computer_default_template.sql +46 -0
  92. package/dist/drizzle/0086_update_default_template_models.sql +19 -0
  93. package/dist/drizzle/0087_retire_oss_connectors.sql +77 -0
  94. package/dist/drizzle/0088_compliance_event_types_finance_pilot.sql +37 -0
  95. package/dist/drizzle/0089_remove_maniflow_eval_seeds.sql +81 -0
  96. package/dist/drizzle/0089_wiki_schema_extraction.sql +315 -0
  97. package/dist/drizzle/0090_brain_schema_extraction.sql +274 -0
  98. package/dist/drizzle/0091_drop_wiki_brain_compat_views.sql +118 -0
  99. package/dist/drizzle/0092_finish_oss_connector_retirement.sql +97 -0
  100. package/dist/drizzle/0093_eval_runs_scheduled_job_id.sql +23 -0
  101. package/dist/drizzle/0094_slack_workspace_app.sql +140 -0
  102. package/dist/drizzle/0095_eval_runs_computer_id.sql +22 -0
  103. package/dist/drizzle/0096_true_redteam_eval_seed_cleanup.sql +67 -0
  104. package/dist/drizzle/0097_shared_computers.sql +191 -0
  105. package/dist/drizzle/0098_business_ontology.sql +587 -0
  106. package/dist/drizzle/0099_thread_idle_learning.sql +145 -0
  107. package/dist/drizzle/0100_ontology_gated_brain_dynamic_subtypes.sql +7 -0
  108. package/dist/drizzle/0101_ontology_gated_unresolved_mentions_dynamic_subtypes.sql +7 -0
  109. package/dist/drizzle/0102_wiki_brain_owner_repair.sql +87 -0
  110. package/dist/drizzle/0103_brain_section_source_trigger_repair.sql +75 -0
  111. package/dist/drizzle/0104_expand_seed_ontology_for_user_memory.sql +166 -0
  112. package/dist/drizzle/0105_spaces_domain.sql +349 -0
  113. package/dist/drizzle/0106_expand_seed_ontology_for_triples.sql +173 -0
  114. package/dist/drizzle/0106_space_threads_participants.sql +197 -0
  115. package/dist/drizzle/0107_linked_task_mirror.sql +245 -0
  116. package/dist/drizzle/0108_message_mentions.sql +95 -0
  117. package/dist/drizzle/0109_space_owned_threads.sql +217 -0
  118. package/dist/drizzle/0110_thread_participant_read_state.sql +21 -0
  119. package/dist/drizzle/0111_agents_tenant_name_unique.sql +38 -0
  120. package/dist/drizzle/0112_recast_spaces_as_contextual_workrooms.sql +138 -0
  121. package/dist/drizzle/0113_agents_own_runtime_fields.sql +48 -0
  122. package/dist/drizzle/0114_migrate_templates_to_agents_and_spaces.sql +361 -0
  123. package/dist/drizzle/0115_remove_computer_eval_template_dependencies.sql +69 -0
  124. package/dist/drizzle/0116_backfill_thread_participants_access.sql +126 -0
  125. package/dist/drizzle/0117_space_access_mode.sql +40 -0
  126. package/dist/drizzle/0118_normalize_tenant_member_principal_type.sql +41 -0
  127. package/dist/drizzle/0119_space_knowledge_bases.sql +126 -0
  128. package/dist/drizzle/0120_space_automations.sql +58 -0
  129. package/dist/drizzle/0121_drop_computer_runbooks.sql +26 -0
  130. package/dist/drizzle/0122_space_email_triggers.sql +24 -0
  131. package/dist/drizzle/0123_single_platform_agent_and_overrides.sql +58 -0
  132. package/dist/drizzle/0124_thread_turns_finalized_at.sql +17 -0
  133. package/dist/drizzle/0125_drop_space_agent_assignments.sql +42 -0
  134. package/dist/drizzle/0126_migrate_flue_to_pi.sql +42 -0
  135. package/dist/drizzle/0127_runtime_type_observability.sql +28 -0
  136. package/dist/drizzle/0128_drop_eval_test_cases_agent_id.sql +37 -0
  137. package/dist/drizzle/0129_drop_code_factory_tables.sql +43 -0
  138. package/dist/drizzle/0129_eval_results_system_prompt.sql +30 -0
  139. package/dist/drizzle/0130_drop_teams_and_team_id_columns.sql +54 -0
  140. package/dist/drizzle/0131_drop_skill_catalog_and_tenant_skills.sql +33 -0
  141. package/dist/drizzle/0132_drop_computer_tables.sql +31 -0
  142. package/dist/drizzle/0133_drop_seed_view_tombstones.sql +79 -0
  143. package/dist/drizzle/0133_thread_turns_system_prompt.sql +22 -0
  144. package/dist/drizzle/0134_drop_dead_agent_runtime_tables.sql +53 -0
  145. package/dist/drizzle/0135_native_checklist_linked_tasks.sql +48 -0
  146. package/dist/drizzle/0136_goal_ledger.sql +55 -0
  147. package/dist/drizzle/0136_space_email_trigger_status.sql +66 -0
  148. package/dist/drizzle/0137_thread_participant_pins.sql +25 -0
  149. package/dist/drizzle/0138_users_cognito_sub.sql +30 -0
  150. package/dist/drizzle/0139_mobile_turn_client_id.sql +23 -0
  151. package/dist/drizzle/0140_workspace_folder_names.sql +36 -0
  152. package/dist/drizzle/0141_eval_runs_desktop_pi_provenance.sql +31 -0
  153. package/dist/drizzle/0142_pi_only_agent_runtime.sql +61 -0
  154. package/dist/drizzle/0143_add_web_extract_builtin_config.sql +28 -0
  155. package/dist/drizzle/0144_skill_catalog_index.sql +40 -0
  156. package/dist/drizzle/0145_knowledge_graph_thread_ingest.sql +512 -0
  157. package/dist/drizzle/0146_knowledge_graph_source_scope.sql +413 -0
  158. package/dist/drizzle/0147_knowledge_graph_scope_trigger_qualification.sql +211 -0
  159. package/dist/drizzle/0148_user_cost_attribution.sql +171 -0
  160. package/dist/drizzle/0149_managed_mcp_servers.sql +64 -0
  161. package/dist/drizzle/0149_user_model_approvals.sql +89 -0
  162. package/dist/drizzle/0150_bootstrap_first_admin_claim.sql +11 -0
  163. package/dist/drizzle/0151_managed_deployments.sql +91 -0
  164. package/dist/drizzle/0152_agent_profiles.sql +81 -0
  165. package/dist/drizzle/0153_message_mentions_agent_profile.sql +9 -0
  166. package/dist/drizzle/0154_customer_deployment_sessions.sql +61 -0
  167. package/dist/drizzle/0155_tenant_model_catalog.sql +152 -0
  168. package/dist/drizzle/0156_bootstrap_credential_leases.sql +52 -0
  169. package/dist/drizzle/0157_knowledge_graph_observations_source.sql +79 -0
  170. package/dist/drizzle/0158_pending_user_questions.sql +80 -0
  171. package/dist/drizzle/0158_wiki_tenant_scope.sql +38 -0
  172. package/dist/drizzle/0159_agent_profiles_space_local.sql +49 -0
  173. package/dist/drizzle/0159_application_plugins.sql +193 -0
  174. package/dist/drizzle/0159_eval_scoring_version.sql +46 -0
  175. package/dist/drizzle/0160_compliance_event_types_plugins.sql +37 -0
  176. package/dist/drizzle/0160_eval_datasets.sql +75 -0
  177. package/dist/drizzle/0160_eval_results_thread_turn.sql +35 -0
  178. package/dist/drizzle/0161_eval_run_pinning.sql +54 -0
  179. package/dist/drizzle/0161_tenant_mcp_servers_plugin_source.sql +62 -0
  180. package/dist/drizzle/0162_eval_result_override.sql +49 -0
  181. package/dist/drizzle/0163_eval_replay_tool_allowlist.sql +50 -0
  182. package/dist/drizzle/0164_eval_replay_tool_override_mode.sql +52 -0
  183. package/dist/drizzle/0165_plugin_premium_entitlements.sql +153 -0
  184. package/dist/drizzle/0166_company_brain_substrate_contract.sql +386 -0
  185. package/dist/drizzle/0167_company_brain_artifact_manifest_runtime.sql +85 -0
  186. package/dist/drizzle/0168_eval_skill_gate.sql +44 -0
  187. package/dist/drizzle/0169_release_update_jobs.sql +67 -0
  188. package/dist/drizzle/0170_email_channel_plugin.sql +291 -0
  189. package/dist/drizzle/0171_linked_task_external_providers.sql +30 -0
  190. package/dist/drizzle/0172_email_channel_sendgrid_provider.sql +8 -0
  191. package/dist/drizzle/0173_auth_provider_resources.sql +83 -0
  192. package/dist/drizzle/0174_workos_auth_bridges.sql +37 -0
  193. package/dist/drizzle/0175_workos_auth_sessions.sql +38 -0
  194. package/dist/drizzle/0176_n8n_agent_step_runs.sql +107 -0
  195. package/dist/drizzle/0177_workflow_control_plane.sql +281 -0
  196. package/dist/drizzle/0178_workflow_backfill_existing_routines.sql +525 -0
  197. package/dist/drizzle/0179_tenant_goal_budget_settings.sql +21 -0
  198. package/dist/drizzle/0180_skill_drafts.sql +89 -0
  199. package/dist/drizzle/0181_skill_draft_publish_status.sql +21 -0
  200. package/dist/drizzle/0182_agent_loops.sql +260 -0
  201. package/dist/drizzle/0183_okf_artifact_manifests.sql +52 -0
  202. package/dist/drizzle/0184_skill_catalog_trust_cache.sql +35 -0
  203. package/dist/drizzle/0185_agent_loop_space.sql +16 -0
  204. package/dist/drizzle/0186_tenant_mcp_runtime_metadata.sql +10 -0
  205. package/dist/drizzle/0187_native_work_items.sql +220 -0
  206. package/dist/drizzle/0188_company_etl_plugin_rename.sql +99 -0
  207. package/dist/drizzle/0189_trace_cost_substrate.sql +247 -0
  208. package/dist/drizzle/0190_billing_export_reconciliation.sql +101 -0
  209. package/dist/drizzle/0191_open_engine_work_item_queue.sql +66 -0
  210. package/dist/drizzle/0192_work_item_labels.sql +44 -0
  211. package/dist/drizzle/0193_work_item_documents.sql +31 -0
  212. package/dist/drizzle/0194_memory_retain_attempts.sql +103 -0
  213. package/dist/drizzle/0194_work_item_comments.sql +35 -0
  214. package/dist/drizzle/0195_plugin_app_overlays.sql +45 -0
  215. package/dist/drizzle/0196_pi_extensions.sql +118 -0
  216. package/dist/drizzle/0197_eval_profiles.sql +150 -0
  217. package/dist/drizzle/0197_rcm_context_columns.sql +28 -0
  218. package/dist/drizzle/0198_eval_runs_unstable.sql +27 -0
  219. package/dist/drizzle/0199_eval_runs_cost_partial.sql +27 -0
  220. package/dist/drizzle/meta/_journal.json +160 -0
  221. package/dist/plugins/README.md +162 -0
  222. package/dist/plugins/catalog/package.json +40 -0
  223. package/dist/plugins/catalog/scripts/build-catalog.ts +120 -0
  224. package/dist/plugins/catalog/scripts/generate-plugin-registry.ts +144 -0
  225. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +86 -0
  226. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +308 -0
  227. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +861 -0
  228. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +124 -0
  229. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +120 -0
  230. package/dist/plugins/catalog/src/catalog.ts +434 -0
  231. package/dist/plugins/catalog/src/contracts.ts +1498 -0
  232. package/dist/plugins/catalog/src/index.ts +4 -0
  233. package/dist/plugins/catalog/src/plugin-package.ts +171 -0
  234. package/dist/plugins/catalog/src/registry/generated-first-party.ts +76 -0
  235. package/dist/plugins/catalog/src/registry/index.ts +1 -0
  236. package/dist/plugins/catalog/tsconfig.json +8 -0
  237. package/dist/plugins/company-brain/README.md +37 -0
  238. package/dist/plugins/company-brain/package.json +33 -0
  239. package/dist/plugins/company-brain/runtime/cognee/Dockerfile +11 -0
  240. package/dist/plugins/company-brain/smoke/cognee-managed-app-smoke.mjs +458 -0
  241. package/dist/plugins/company-brain/smoke/cognee-memory-cutover-smoke.mjs +539 -0
  242. package/dist/plugins/company-brain/smoke/company-brain-context-engine-smoke.mjs +312 -0
  243. package/dist/plugins/company-brain/smoke/company-brain-operations-smoke.mjs +449 -0
  244. package/dist/plugins/company-brain/smoke/company-brain-plugin-smoke.mjs +655 -0
  245. package/dist/plugins/company-brain/smoke/hindsight-memory-isolation-smoke.mjs +474 -0
  246. package/dist/plugins/company-brain/src/api/cognee-client.ts +896 -0
  247. package/dist/plugins/company-brain/src/api/cognee-cluster-identity.ts +49 -0
  248. package/dist/plugins/company-brain/src/api/cognee-memory-scope.ts +84 -0
  249. package/dist/plugins/company-brain/src/api/context-engine-provider.ts +888 -0
  250. package/dist/plugins/company-brain/src/api/migration.ts +665 -0
  251. package/dist/plugins/company-brain/src/deployment/cognee-managed-app.ts +396 -0
  252. package/dist/plugins/company-brain/src/index.ts +62 -0
  253. package/dist/plugins/company-brain/src/manifest.ts +112 -0
  254. package/dist/plugins/company-brain/terraform/cognee/README.md +263 -0
  255. package/dist/plugins/company-brain/terraform/cognee/main.tf +766 -0
  256. package/dist/plugins/company-brain/terraform/cognee/outputs.tf +144 -0
  257. package/dist/plugins/company-brain/terraform/cognee/variables.tf +402 -0
  258. package/dist/plugins/company-brain/test/api/cognee-client.test.ts +562 -0
  259. package/dist/plugins/company-brain/test/api/cognee-memory-scope.test.ts +74 -0
  260. package/dist/plugins/company-brain/test/api/context-engine-provider.test.ts +447 -0
  261. package/dist/plugins/company-brain/test/api/migration.test.ts +465 -0
  262. package/dist/plugins/company-brain/test/manifest.test.ts +95 -0
  263. package/dist/plugins/company-brain/tsconfig.json +8 -0
  264. package/dist/plugins/company-data/README.md +49 -0
  265. package/dist/plugins/company-data/package.json +21 -0
  266. package/dist/plugins/company-data/src/index.ts +30 -0
  267. package/dist/plugins/company-data/src/manifest.ts +26 -0
  268. package/dist/plugins/company-data/test/manifest.test.ts +116 -0
  269. package/dist/plugins/company-data/tsconfig.json +8 -0
  270. package/dist/plugins/company-etl/README.md +46 -0
  271. package/dist/plugins/company-etl/package.json +21 -0
  272. package/dist/plugins/company-etl/src/index.ts +29 -0
  273. package/dist/plugins/company-etl/src/manifest.ts +26 -0
  274. package/dist/plugins/company-etl/test/manifest.test.ts +108 -0
  275. package/dist/plugins/company-etl/tsconfig.json +8 -0
  276. package/dist/plugins/email-channel/README.md +41 -0
  277. package/dist/plugins/email-channel/package.json +22 -0
  278. package/dist/plugins/email-channel/src/index.ts +36 -0
  279. package/dist/plugins/email-channel/src/manifest.ts +44 -0
  280. package/dist/plugins/email-channel/src/provider-contract.ts +36 -0
  281. package/dist/plugins/email-channel/test/manifest.test.ts +119 -0
  282. package/dist/plugins/email-channel/tsconfig.json +8 -0
  283. package/dist/plugins/lastmile/README.md +50 -0
  284. package/dist/plugins/lastmile/package.json +23 -0
  285. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +661 -0
  286. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +572 -0
  287. package/dist/plugins/lastmile/src/discovery.fixture.ts +64 -0
  288. package/dist/plugins/lastmile/src/index.ts +46 -0
  289. package/dist/plugins/lastmile/src/manifest.ts +139 -0
  290. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +266 -0
  291. package/dist/plugins/lastmile/test/discovery.test.ts +88 -0
  292. package/dist/plugins/lastmile/tsconfig.json +8 -0
  293. package/dist/plugins/n8n/README.md +201 -0
  294. package/dist/plugins/n8n/n8n-app/README.md +33 -0
  295. package/dist/plugins/n8n/n8n-app/package.json +23 -0
  296. package/dist/plugins/n8n/n8n-app/src/application-config.ts +45 -0
  297. package/dist/plugins/n8n/n8n-app/src/front-components/thinkwork-workflows.front-component.tsx +970 -0
  298. package/dist/plugins/n8n/n8n-app/src/lib/n8n-app-data.ts +190 -0
  299. package/dist/plugins/n8n/n8n-app/src/vite-env.d.ts +7 -0
  300. package/dist/plugins/n8n/n8n-app/tsconfig.json +15 -0
  301. package/dist/plugins/n8n/package.json +35 -0
  302. package/dist/plugins/n8n/runtime/Dockerfile +18 -0
  303. package/dist/plugins/n8n/runtime/n8n-task-runners.json +14 -0
  304. package/dist/plugins/n8n/runtime/n8n-task-runners.json.template +14 -0
  305. package/dist/plugins/n8n/runtime/package-lock.json +13 -0
  306. package/dist/plugins/n8n/runtime/package.json +7 -0
  307. package/dist/plugins/n8n/scripts/sync-thinkwork-app.mjs +268 -0
  308. package/dist/plugins/n8n/smoke/README.md +95 -0
  309. package/dist/plugins/n8n/smoke/n8n-agent-step-bridge-smoke.mjs +866 -0
  310. package/dist/plugins/n8n/smoke/n8n-integrated-app-smoke.mjs +262 -0
  311. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +409 -0
  312. package/dist/plugins/n8n/smoke/n8n-mcp-smoke.mjs +624 -0
  313. package/dist/plugins/n8n/src/deployment/image-build.ts +172 -0
  314. package/dist/plugins/n8n/src/deployment/managed-app.ts +429 -0
  315. package/dist/plugins/n8n/src/index.ts +79 -0
  316. package/dist/plugins/n8n/src/manifest.ts +403 -0
  317. package/dist/plugins/n8n/src/package-config.ts +186 -0
  318. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/SKILL.md +76 -0
  319. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  320. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  321. package/dist/plugins/n8n/src/skills/n8n-workflow-operator/references/workflow-authoring.md +45 -0
  322. package/dist/plugins/n8n/terraform/n8n/README.md +113 -0
  323. package/dist/plugins/n8n/terraform/n8n/main.tf +918 -0
  324. package/dist/plugins/n8n/terraform/n8n/outputs.tf +124 -0
  325. package/dist/plugins/n8n/terraform/n8n/scripts/sync-database.py +250 -0
  326. package/dist/plugins/n8n/terraform/n8n/scripts/test_sync_database.py +55 -0
  327. package/dist/plugins/n8n/terraform/n8n/variables.tf +354 -0
  328. package/dist/plugins/n8n/test/image-build.test.ts +118 -0
  329. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +353 -0
  330. package/dist/plugins/n8n/test/manifest.test.ts +278 -0
  331. package/dist/plugins/n8n/test/package-config.test.ts +57 -0
  332. package/dist/plugins/n8n/tsconfig.json +8 -0
  333. package/dist/plugins/sendgrid/README.md +30 -0
  334. package/dist/plugins/sendgrid/package.json +22 -0
  335. package/dist/plugins/sendgrid/src/index.ts +36 -0
  336. package/dist/plugins/sendgrid/src/manifest.ts +37 -0
  337. package/dist/plugins/sendgrid/src/provider-contract.ts +14 -0
  338. package/dist/plugins/sendgrid/test/manifest.test.ts +80 -0
  339. package/dist/plugins/sendgrid/tsconfig.json +8 -0
  340. package/dist/plugins/twenty/README.md +78 -0
  341. package/dist/plugins/twenty/package.json +27 -0
  342. package/dist/plugins/twenty/scripts/__tests__/sync-thinkwork-app.test.mjs +67 -0
  343. package/dist/plugins/twenty/scripts/sync-thinkwork-app.mjs +185 -0
  344. package/dist/plugins/twenty/scripts/wire-thinkwork-workflow.mjs +658 -0
  345. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +359 -0
  346. package/dist/plugins/twenty/smoke/twenty-mcp-oauth-smoke.mjs +574 -0
  347. package/dist/plugins/twenty/src/api/cutover.ts +209 -0
  348. package/dist/plugins/twenty/src/deployment/managed-app.ts +253 -0
  349. package/dist/plugins/twenty/src/index.ts +55 -0
  350. package/dist/plugins/twenty/src/manifest.ts +259 -0
  351. package/dist/plugins/twenty/terraform/twenty/README.md +97 -0
  352. package/dist/plugins/twenty/terraform/twenty/main.tf +829 -0
  353. package/dist/plugins/twenty/terraform/twenty/outputs.tf +79 -0
  354. package/dist/plugins/twenty/terraform/twenty/variables.tf +268 -0
  355. package/dist/plugins/twenty/test/api/cutover.test.ts +183 -0
  356. package/dist/plugins/twenty/test/manifest.test.ts +463 -0
  357. package/dist/plugins/twenty/tsconfig.json +9 -0
  358. package/dist/plugins/twenty/twenty-app/.nvmrc +1 -0
  359. package/dist/plugins/twenty/twenty-app/README.md +148 -0
  360. package/dist/plugins/twenty/twenty-app/package.json +30 -0
  361. package/dist/plugins/twenty/twenty-app/src/application-config.ts +44 -0
  362. package/dist/plugins/twenty/twenty-app/src/constants/universal-identifiers.ts +18 -0
  363. package/dist/plugins/twenty/twenty-app/src/default-role.ts +24 -0
  364. package/dist/plugins/twenty/twenty-app/src/front-components/thinkwork-settings.front-component.tsx +299 -0
  365. package/dist/plugins/twenty/twenty-app/src/logic-functions/thinkwork-webhook.logic-function.ts +354 -0
  366. package/dist/plugins/twenty/twenty-app/tsconfig.json +14 -0
  367. package/dist/plugins/twenty/twenty-app/yarn.lock +4144 -0
  368. package/dist/plugins/workos-auth/package.json +22 -0
  369. package/dist/plugins/workos-auth/src/index.ts +30 -0
  370. package/dist/plugins/workos-auth/src/manifest.ts +40 -0
  371. package/dist/plugins/workos-auth/src/provider-contract.ts +39 -0
  372. package/dist/plugins/workos-auth/test/manifest.test.ts +94 -0
  373. package/dist/plugins/workos-auth/tsconfig.json +8 -0
  374. package/dist/scripts/bootstrap-workspace.sh +162 -0
  375. package/dist/scripts/post-deploy.sh +290 -0
  376. package/dist/terraform/examples/greenfield/main.tf +903 -75
  377. package/dist/terraform/examples/greenfield/terraform.tfvars.example +67 -8
  378. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +2 -2
  379. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +8 -9
  380. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +227 -0
  381. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +277 -0
  382. package/dist/terraform/modules/app/agentcore-memory/README.md +6 -6
  383. package/dist/terraform/modules/app/agentcore-memory/main.tf +1 -1
  384. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +40 -9
  385. package/dist/terraform/modules/app/agentcore-pi/README.md +61 -0
  386. package/dist/terraform/modules/app/agentcore-pi/main.tf +466 -0
  387. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +38 -0
  388. package/dist/terraform/modules/app/agentcore-pi/variables.tf +145 -0
  389. package/dist/terraform/modules/app/agentcore-platform/main.tf +83 -0
  390. package/dist/terraform/modules/app/agentcore-runtime/main.tf +9 -11
  391. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +5 -1
  392. package/dist/terraform/modules/app/customer-domain/main.tf +483 -0
  393. package/dist/terraform/modules/app/deployment-control-plane/README.md +47 -0
  394. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +24 -0
  395. package/dist/terraform/modules/app/deployment-control-plane/main.tf +614 -0
  396. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +54 -0
  397. package/dist/terraform/modules/app/deployment-control-plane/runner.py +4720 -0
  398. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +3026 -0
  399. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +96 -0
  400. package/dist/terraform/modules/app/hindsight-memory/README.md +25 -23
  401. package/dist/terraform/modules/app/hindsight-memory/main.tf +26 -2
  402. package/dist/terraform/modules/app/lambda-api/eval-fanout.tf +17 -50
  403. package/dist/terraform/modules/app/lambda-api/handlers.tf +1290 -679
  404. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +933 -0
  405. package/dist/terraform/modules/app/lambda-api/main.tf +14 -527
  406. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +3 -19
  407. package/dist/terraform/modules/app/lambda-api/outputs.tf +50 -6
  408. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +163 -0
  409. package/dist/terraform/modules/app/lambda-api/slack-app-secrets.tf +3 -1
  410. package/dist/terraform/modules/app/lambda-api/stripe-secrets.tf +3 -1
  411. package/dist/terraform/modules/app/lambda-api/variables.tf +240 -53
  412. package/dist/terraform/modules/app/lambda-api/workspace-events.tf +2 -25
  413. package/dist/terraform/modules/app/ses-email/main.tf +143 -30
  414. package/dist/terraform/modules/app/static-site/main.tf +4 -3
  415. package/dist/terraform/modules/app/www-dns/main.tf +45 -5
  416. package/dist/terraform/modules/app/www-dns/outputs.tf +10 -0
  417. package/dist/terraform/modules/app/www-dns/variables.tf +24 -0
  418. package/dist/terraform/modules/data/aurora-postgres/main.tf +15 -1
  419. package/dist/terraform/modules/data/compliance-exports-bucket/main.tf +1 -1
  420. package/dist/terraform/modules/data/compliance-exports-bucket/variables.tf +6 -0
  421. package/dist/terraform/modules/foundation/cognito/main.tf +167 -11
  422. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  423. package/dist/terraform/modules/foundation/cognito/variables.tf +110 -0
  424. package/dist/terraform/modules/foundation/vpc/main.tf +45 -3
  425. package/dist/terraform/modules/foundation/vpc/outputs.tf +20 -0
  426. package/dist/terraform/modules/foundation/vpc/variables.tf +18 -0
  427. package/dist/terraform/modules/thinkwork/README.md +71 -0
  428. package/dist/terraform/modules/thinkwork/main.tf +1325 -174
  429. package/dist/terraform/modules/thinkwork/outputs.tf +457 -24
  430. package/dist/terraform/modules/thinkwork/variables.tf +1169 -93
  431. package/dist/terraform/schema.graphql +82 -9
  432. package/dist/workspace-defaults/files/AGENTS.md +344 -0
  433. package/dist/workspace-defaults/files/CONTEXT.md +8 -0
  434. package/dist/workspace-defaults/files/GUARDRAILS.md +51 -0
  435. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +65 -0
  436. package/dist/workspace-defaults/files/ROUTER.md +24 -0
  437. package/dist/workspace-defaults/files/SPACE.md +62 -0
  438. package/dist/workspace-defaults/files/TOOLS.md +65 -0
  439. package/dist/workspace-defaults/files/USER.md +40 -0
  440. package/dist/workspace-defaults/files/mcp.json +3 -0
  441. package/dist/workspace-defaults/files/memory/contacts.md +13 -0
  442. package/dist/workspace-defaults/files/memory/lessons.md +13 -0
  443. package/dist/workspace-defaults/files/memory/preferences.md +12 -0
  444. package/dist/workspace-defaults/files/skills/.gitkeep +1 -0
  445. package/dist/workspace-defaults/files/skills/artifact-builder/SKILL.md +79 -0
  446. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +166 -0
  447. package/dist/workspace-defaults/files/skills/automation-loop-designer/SKILL.md +120 -0
  448. package/dist/workspace-defaults/files/skills/skill-creator/LICENSE.txt +202 -0
  449. package/dist/workspace-defaults/files/skills/skill-creator/SKILL.md +485 -0
  450. package/dist/workspace-defaults/files/skills/skill-creator/UPSTREAM.json +124 -0
  451. package/dist/workspace-defaults/files/skills/skill-creator/agents/analyzer.md +274 -0
  452. package/dist/workspace-defaults/files/skills/skill-creator/agents/comparator.md +202 -0
  453. package/dist/workspace-defaults/files/skills/skill-creator/agents/grader.md +223 -0
  454. package/dist/workspace-defaults/files/skills/skill-creator/assets/eval_review.html +146 -0
  455. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  456. package/dist/workspace-defaults/files/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  457. package/dist/workspace-defaults/files/skills/skill-creator/references/schemas.md +430 -0
  458. package/dist/workspace-defaults/files/skills/skill-creator/scripts/__init__.py +0 -0
  459. package/dist/workspace-defaults/files/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  460. package/dist/workspace-defaults/files/skills/skill-creator/scripts/generate_report.py +326 -0
  461. package/dist/workspace-defaults/files/skills/skill-creator/scripts/improve_description.py +247 -0
  462. package/dist/workspace-defaults/files/skills/skill-creator/scripts/package_skill.py +136 -0
  463. package/dist/workspace-defaults/files/skills/skill-creator/scripts/quick_validate.py +103 -0
  464. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_eval.py +310 -0
  465. package/dist/workspace-defaults/files/skills/skill-creator/scripts/run_loop.py +328 -0
  466. package/dist/workspace-defaults/files/skills/skill-creator/scripts/utils.py +47 -0
  467. package/package.json +2 -1
  468. package/dist/terraform/modules/app/agentcore-flue/README.md +0 -58
  469. package/dist/terraform/modules/app/agentcore-flue/main.tf +0 -323
  470. package/dist/terraform/modules/app/agentcore-flue/outputs.tf +0 -23
  471. package/dist/terraform/modules/app/agentcore-flue/variables.tf +0 -97
  472. package/dist/terraform/modules/app/computer-runtime/README.md +0 -15
  473. package/dist/terraform/modules/app/computer-runtime/main.tf +0 -406
  474. package/dist/terraform/modules/app/computer-runtime/outputs.tf +0 -75
  475. package/dist/terraform/modules/app/computer-runtime/variables.tf +0 -66
@@ -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,466 @@
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
+ manifest_log_fn_name = "thinkwork-${var.stage}-api-manifest-log"
28
+ manifest_log_fn_arn = "arn:aws:lambda:${var.region}:${var.account_id}:function:${local.manifest_log_fn_name}"
29
+ pi_image_uri = "${var.ecr_repository_url}:pi-latest"
30
+ cognee_vpc_enabled = length(var.cognee_subnet_ids) > 0 && length(var.cognee_security_group_ids) > 0
31
+ okf_efs_vpc_enabled = var.okf_efs_enabled && length(var.okf_efs_subnet_ids) > 0 && length(var.okf_efs_security_group_ids) > 0
32
+ private_vpc_enabled = local.cognee_vpc_enabled || local.okf_efs_vpc_enabled
33
+ private_subnet_ids = distinct(concat(var.cognee_subnet_ids, var.okf_efs_subnet_ids))
34
+ private_security_group_ids = distinct(concat(
35
+ var.cognee_security_group_ids,
36
+ var.okf_efs_security_group_ids,
37
+ ))
38
+ okf_efs_mount_enabled = local.okf_efs_vpc_enabled && var.okf_efs_file_system_arn != "" && var.okf_efs_read_access_point_arn != ""
39
+ okf_efs_iam_statements = local.okf_efs_mount_enabled ? [
40
+ {
41
+ Sid = "OkfWikiEfsReadOnlyMount"
42
+ Effect = "Allow"
43
+ Action = ["elasticfilesystem:ClientMount"]
44
+ Resource = var.okf_efs_file_system_arn
45
+ Condition = {
46
+ StringEquals = {
47
+ "elasticfilesystem:AccessPointArn" = var.okf_efs_read_access_point_arn
48
+ }
49
+ }
50
+ },
51
+ ] : []
52
+ }
53
+
54
+ ################################################################################
55
+ # Execution Role
56
+ ################################################################################
57
+
58
+ resource "aws_iam_role" "agentcore_pi" {
59
+ name = "thinkwork-${var.stage}-agentcore-pi-role"
60
+
61
+ assume_role_policy = jsonencode({
62
+ Version = "2012-10-17"
63
+ Statement = [{
64
+ Effect = "Allow"
65
+ Principal = { Service = ["ecs-tasks.amazonaws.com", "lambda.amazonaws.com", "bedrock-agentcore.amazonaws.com"] }
66
+ Action = "sts:AssumeRole"
67
+ }]
68
+ })
69
+
70
+ tags = {
71
+ Name = "thinkwork-${var.stage}-agentcore-pi-role"
72
+ }
73
+ }
74
+
75
+ resource "aws_iam_role_policy" "agentcore_pi" {
76
+ name = "agentcore-pi-permissions"
77
+ role = aws_iam_role.agentcore_pi.id
78
+
79
+ policy = jsonencode({
80
+ Version = "2012-10-17"
81
+ Statement = concat([
82
+ {
83
+ Sid = "S3Access"
84
+ Effect = "Allow"
85
+ Action = ["s3:GetObject", "s3:PutObject", "s3:ListBucket"]
86
+ Resource = [
87
+ "arn:aws:s3:::${var.bucket_name}",
88
+ "arn:aws:s3:::${var.bucket_name}/*",
89
+ ]
90
+ },
91
+ {
92
+ # Eval datasets hold red-team answer keys and flagged-thread
93
+ # snapshots (PII) — never agent-readable. The grant above is
94
+ # bucket-wide, so application-level path resolution alone is one
95
+ # bug away from exposing them to the agent under test; this Deny
96
+ # is the enforcement layer (Evaluations Trust Core U4 KTD). Run
97
+ # snapshots live under the same prefix
98
+ # (tenants/<slug>/eval-datasets/.runs/<run-id>/) so they are
99
+ # covered by construction.
100
+ Sid = "DenyEvalDatasetPrefix"
101
+ Effect = "Deny"
102
+ Action = ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"]
103
+ Resource = [
104
+ "arn:aws:s3:::${var.bucket_name}/tenants/*/eval-datasets/*",
105
+ ]
106
+ },
107
+ {
108
+ # Bedrock invoke spans foundation models, inference profiles, and
109
+ # cross-region routing. The original
110
+ # `arn:aws:bedrock:${region}::foundation-model/*` only covered
111
+ # foundation models in the primary region — but a
112
+ # `us.anthropic.claude-sonnet-...` inference profile (the default
113
+ # routing path used by chat-agent-invoke) lives at
114
+ # `arn:aws:bedrock:${region}:${account}:inference-profile/*` AND
115
+ # dispatches the actual InvokeModel call to the foundation model
116
+ # in whatever region the profile resolves to (us-east-1,
117
+ # us-east-2, us-west-2). The narrow ARN caused every agent turn
118
+ # to fail with AccessDenied silently inside pi-ai's Bedrock
119
+ # provider, surfacing as an empty assistant message with zero
120
+ # token usage. Inference profiles and their routed foundation-model
121
+ # calls require broad model resource scope.
122
+ Sid = "BedrockInvoke"
123
+ Effect = "Allow"
124
+ Action = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream", "bedrock:InvokeAgent"]
125
+ Resource = "*"
126
+ },
127
+ {
128
+ # Some Bedrock Marketplace-backed models require the invoking role to
129
+ # view/accept the model subscription before Converse can stream. Without
130
+ # these actions Bedrock returns an assistant error with zero token usage.
131
+ Sid = "MarketplaceModelAccess"
132
+ Effect = "Allow"
133
+ Action = ["aws-marketplace:ViewSubscriptions", "aws-marketplace:Subscribe"]
134
+ Resource = "*"
135
+ },
136
+ {
137
+ # Automatic memory retention — every agent turn calls CreateEvent
138
+ # to feed AgentCore's background strategies. Also needs read access
139
+ # so the recall() tool can fetch previously extracted records and
140
+ # so forget() can soft-archive old records.
141
+ Sid = "AgentCoreMemoryReadWrite"
142
+ Effect = "Allow"
143
+ Action = [
144
+ "bedrock-agentcore:CreateEvent",
145
+ "bedrock-agentcore:ListEvents",
146
+ "bedrock-agentcore:GetEvent",
147
+ "bedrock-agentcore:ListMemoryRecords",
148
+ "bedrock-agentcore:RetrieveMemoryRecords",
149
+ "bedrock-agentcore:GetMemoryRecord",
150
+ "bedrock-agentcore:BatchCreateMemoryRecords",
151
+ "bedrock-agentcore:BatchUpdateMemoryRecords",
152
+ ]
153
+ Resource = "*"
154
+ },
155
+ {
156
+ # Browser Automation (browser_automation tool). Pi can open managed
157
+ # AgentCore Browser sessions when the built-in browser capability is
158
+ # enabled for an agent.
159
+ Sid = "AgentCoreBrowser"
160
+ Effect = "Allow"
161
+ Action = [
162
+ "bedrock-agentcore:StartBrowserSession",
163
+ "bedrock-agentcore:StopBrowserSession",
164
+ "bedrock-agentcore:GetBrowserSession",
165
+ "bedrock-agentcore:ListBrowserSessions",
166
+ "bedrock-agentcore:InvokeBrowser",
167
+ "bedrock-agentcore:UpdateBrowserStream",
168
+ ]
169
+ Resource = [
170
+ "arn:aws:bedrock-agentcore:${var.region}:aws:browser/aws.browser.v1",
171
+ "arn:aws:bedrock-agentcore:${var.region}:${var.account_id}:browser/*",
172
+ ]
173
+ },
174
+ {
175
+ # AgentCore Code Interpreter — Pi's primary sandbox per the FR-9a
176
+ # integration spike (`packages/pi-aws/connectors/agentcore-
177
+ # codeinterpreter.ts`). Per-tenant interpreters live under
178
+ # `code-interpreter-custom/*`; sessions are started, exec'd against,
179
+ # and stopped per Pi invocation.
180
+ Sid = "AgentCoreCodeInterpreter"
181
+ Effect = "Allow"
182
+ Action = [
183
+ "bedrock-agentcore:StartCodeInterpreterSession",
184
+ "bedrock-agentcore:StopCodeInterpreterSession",
185
+ "bedrock-agentcore:InvokeCodeInterpreter",
186
+ "bedrock-agentcore:GetCodeInterpreterSession",
187
+ "bedrock-agentcore:ListCodeInterpreterSessions",
188
+ "bedrock-agentcore:GetCodeInterpreter",
189
+ ]
190
+ Resource = "arn:aws:bedrock-agentcore:${var.region}:${var.account_id}:code-interpreter-custom/*"
191
+ },
192
+ {
193
+ Sid = "CloudWatchLogs"
194
+ Effect = "Allow"
195
+ Action = [
196
+ "logs:CreateLogGroup",
197
+ "logs:CreateLogStream",
198
+ "logs:DescribeLogGroups",
199
+ "logs:DescribeLogStreams",
200
+ "logs:PutLogEvents",
201
+ ]
202
+ # Lambda log group + AgentCore Runtime container log groups + the
203
+ # account-wide aws/spans log group (CloudWatch Transaction Search
204
+ # destination — required for AgentCore Evaluations to read spans).
205
+ Resource = [
206
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/lambda/thinkwork-${var.stage}-*",
207
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/lambda/thinkwork-${var.stage}-*:*",
208
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/bedrock-agentcore/runtimes/*",
209
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:/aws/bedrock-agentcore/runtimes/*:*",
210
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:aws/spans",
211
+ "arn:aws:logs:${var.region}:${var.account_id}:log-group:aws/spans:*",
212
+ ]
213
+ },
214
+ {
215
+ # X-Ray ingestion — ADOT exporters publish spans here, which then
216
+ # flow to aws/spans via the Transaction Search policy. AgentCore
217
+ # Evaluations queries those spans by session.id when scoring runs.
218
+ Sid = "XRayIngest"
219
+ Effect = "Allow"
220
+ Action = [
221
+ "xray:PutTraceSegments",
222
+ "xray:PutTelemetryRecords",
223
+ "xray:GetSamplingRules",
224
+ "xray:GetSamplingTargets",
225
+ ]
226
+ Resource = [
227
+ "arn:aws:xray:${var.region}:${var.account_id}:*",
228
+ "*",
229
+ ]
230
+ },
231
+ {
232
+ Sid = "ECRPull"
233
+ Effect = "Allow"
234
+ Action = ["ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage"]
235
+ Resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/thinkwork-${var.stage}-*"
236
+ },
237
+ {
238
+ Sid = "ECRAuth"
239
+ Effect = "Allow"
240
+ Action = ["ecr:GetAuthorizationToken"]
241
+ Resource = "*"
242
+ },
243
+ {
244
+ Sid = "SSMParameterAccess"
245
+ Effect = "Allow"
246
+ Action = ["ssm:GetParameter", "ssm:PutParameter"]
247
+ Resource = "arn:aws:ssm:${var.region}:${var.account_id}:parameter/thinkwork/${var.stage}/agentcore/*"
248
+ },
249
+ {
250
+ # Invoke API Lambdas from Pi's private VPC. Memory retain is queued
251
+ # async; chat activity/finalize and the per-turn capability-manifest
252
+ # POST are RequestResponse callbacks because public API Gateway
253
+ # endpoints are not reachable reliably from this VPC.
254
+ Sid = "ApiLambdaInvoke"
255
+ Effect = "Allow"
256
+ Action = ["lambda:InvokeFunction"]
257
+ Resource = [
258
+ local.memory_retain_fn_arn,
259
+ local.chat_agent_finalize_fn_arn,
260
+ local.chat_agent_activity_fn_arn,
261
+ local.manifest_log_fn_arn,
262
+ ]
263
+ },
264
+ {
265
+ # Aurora Data API — U4 SessionStore and Hindsight exact-memory recall
266
+ # read/write via the RDS Data API rather than long-lived Postgres
267
+ # connections. Cover both the canonical cluster name and suffixed
268
+ # replacement names.
269
+ Sid = "AuroraDataAPI"
270
+ Effect = "Allow"
271
+ Action = [
272
+ "rds-data:ExecuteStatement",
273
+ "rds-data:BatchExecuteStatement",
274
+ "rds-data:BeginTransaction",
275
+ "rds-data:CommitTransaction",
276
+ "rds-data:RollbackTransaction",
277
+ ]
278
+ Resource = [
279
+ "arn:aws:rds:${var.region}:${var.account_id}:cluster:thinkwork-${var.stage}-db",
280
+ "arn:aws:rds:${var.region}:${var.account_id}:cluster:thinkwork-${var.stage}-db-*",
281
+ ]
282
+ },
283
+ {
284
+ # Secrets Manager — Pi resolves db credentials and other runtime
285
+ # secrets at invocation time per `feedback_completion_callback_
286
+ # snapshot_pattern`. Scoped to `/thinkwork/${stage}/*` per the
287
+ # existing convention.
288
+ Sid = "SecretsManagerRead"
289
+ Effect = "Allow"
290
+ Action = [
291
+ "secretsmanager:GetSecretValue",
292
+ "secretsmanager:DescribeSecret",
293
+ ]
294
+ Resource = "arn:aws:secretsmanager:${var.region}:${var.account_id}:secret:thinkwork-${var.stage}-*"
295
+ },
296
+ ], local.okf_efs_iam_statements)
297
+ })
298
+ }
299
+
300
+ resource "aws_iam_role_policy_attachment" "agentcore_pi_vpc_access" {
301
+ count = local.private_vpc_enabled ? 1 : 0
302
+
303
+ role = aws_iam_role.agentcore_pi.name
304
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
305
+ }
306
+
307
+ resource "aws_iam_role_policy" "agentcore_pi_dlq_send" {
308
+ name = "agentcore-pi-dlq-send"
309
+ role = aws_iam_role.agentcore_pi.id
310
+
311
+ policy = jsonencode({
312
+ Version = "2012-10-17"
313
+ Statement = [{
314
+ Effect = "Allow"
315
+ Action = ["sqs:SendMessage"]
316
+ Resource = var.async_dlq_arn
317
+ }]
318
+ })
319
+ }
320
+
321
+ ################################################################################
322
+ # CloudWatch Log Group
323
+ ################################################################################
324
+
325
+ resource "aws_cloudwatch_log_group" "agentcore_pi" {
326
+ name = "/thinkwork/${var.stage}/agentcore-pi"
327
+ retention_in_days = 30
328
+
329
+ tags = {
330
+ Name = "thinkwork-${var.stage}-agentcore-pi-logs"
331
+ }
332
+ }
333
+
334
+ ################################################################################
335
+ # Lambda Container Image
336
+ ################################################################################
337
+
338
+ resource "terraform_data" "seed_pi_image" {
339
+ count = var.source_image_uri != "" ? 1 : 0
340
+
341
+ triggers_replace = {
342
+ source_image_uri = var.source_image_uri
343
+ target_image_uri = local.pi_image_uri
344
+ }
345
+
346
+ provisioner "local-exec" {
347
+ interpreter = ["/bin/bash", "-c"]
348
+ command = <<-EOT
349
+ set -euo pipefail
350
+ repo_root="${abspath("${path.module}/../../../..")}"
351
+ aws ecr get-login-password --region ${var.region} | docker login --username AWS --password-stdin ${var.account_id}.dkr.ecr.${var.region}.amazonaws.com
352
+ if docker pull "${var.source_image_uri}"; then
353
+ source_id="$(docker image inspect --format '{{.Id}}' "${var.source_image_uri}")"
354
+ docker tag "$source_id" "${local.pi_image_uri}"
355
+ else
356
+ # Unreachable source must not fail a stack whose target tag is already
357
+ # seeded (rerun after a partial deploy, or a registry that went
358
+ # private) — the Lambda only consumes the target ECR tag.
359
+ repo_name="$(basename "${var.ecr_repository_url}")"
360
+ if aws ecr describe-images --repository-name "$repo_name" --image-ids imageTag=pi-latest --region ${var.region} >/dev/null 2>&1; then
361
+ echo "WARN: could not pull ${var.source_image_uri}; ${local.pi_image_uri} is already seeded — keeping the existing image."
362
+ exit 0
363
+ fi
364
+ dockerfile="$repo_root/packages/agentcore-pi/agent-container/Dockerfile"
365
+ if [[ ! -f "$dockerfile" ]]; then
366
+ echo "ERROR: could not pull ${var.source_image_uri} and there is no repo checkout at $repo_root to build from." >&2
367
+ echo "The pinned release image must be pullable by this machine (public registry, or docker login to its registry)." >&2
368
+ echo "Alternatively set agentcore_pi_source_image_uri in terraform.tfvars to an image this AWS account can pull." >&2
369
+ exit 1
370
+ fi
371
+ echo "Unable to pull release image ${var.source_image_uri}; building Pi image from $repo_root"
372
+ docker build \
373
+ --platform linux/amd64 \
374
+ -f "$dockerfile" \
375
+ -t "${local.pi_image_uri}" \
376
+ "$repo_root"
377
+ fi
378
+ docker push "${local.pi_image_uri}"
379
+ EOT
380
+ }
381
+ }
382
+
383
+ resource "aws_lambda_function" "agentcore_pi" {
384
+ function_name = "thinkwork-${var.stage}-agentcore-pi"
385
+ role = aws_iam_role.agentcore_pi.arn
386
+ package_type = "Image"
387
+ image_uri = local.pi_image_uri
388
+ timeout = 900
389
+ memory_size = 2048
390
+
391
+ depends_on = [terraform_data.seed_pi_image]
392
+
393
+ environment {
394
+ variables = {
395
+ PORT = "8080"
396
+ AWS_LWA_PORT = "8080"
397
+ AGENTCORE_MEMORY_ID = var.agentcore_memory_id
398
+ AGENTCORE_FILES_BUCKET = var.bucket_name
399
+ MEMORY_ENGINE = var.memory_engine
400
+ REQUESTER_IDLE_MEMORY_LEARNING_ENABLED = tostring(var.requester_idle_memory_learning_enabled)
401
+ MEMORY_RETAIN_FN_NAME = local.memory_retain_fn_name
402
+ CHAT_AGENT_FINALIZE_FN_NAME = local.chat_agent_finalize_fn_name
403
+ CHAT_AGENT_ACTIVITY_FN_NAME = local.chat_agent_activity_fn_name
404
+ MANIFEST_LOG_FUNCTION_NAME = local.manifest_log_fn_name
405
+ HINDSIGHT_ENDPOINT = var.hindsight_endpoint
406
+ THINKWORK_API_URL = var.api_endpoint
407
+ API_AUTH_SECRET = var.api_auth_secret
408
+ # Plan §005 U4 — AuroraSessionStore uses the RDS Data API to persist
409
+ # Pi's SessionData blobs against threads.session_data. Empty during
410
+ # the first greenfield apply (DB cluster doesn't exist yet); the
411
+ # constructor fail-closes if either is missing at runtime.
412
+ DB_CLUSTER_ARN = var.db_cluster_arn
413
+ DB_SECRET_ARN = var.db_secret_arn
414
+ OKF_WIKI_NAVIGATOR_ENABLED = tostring(local.okf_efs_mount_enabled)
415
+ OKF_WIKI_ROOT = var.okf_efs_mount_path
416
+ }
417
+ }
418
+
419
+ dynamic "vpc_config" {
420
+ for_each = local.private_vpc_enabled ? [1] : []
421
+
422
+ content {
423
+ subnet_ids = local.private_subnet_ids
424
+ security_group_ids = local.private_security_group_ids
425
+ }
426
+ }
427
+
428
+ dynamic "file_system_config" {
429
+ for_each = local.okf_efs_vpc_enabled ? [1] : []
430
+
431
+ content {
432
+ arn = var.okf_efs_read_access_point_arn
433
+ local_mount_path = var.okf_efs_mount_path
434
+ }
435
+ }
436
+
437
+ logging_config {
438
+ log_group = aws_cloudwatch_log_group.agentcore_pi.name
439
+ log_format = "Text"
440
+ }
441
+
442
+ tags = {
443
+ Name = "thinkwork-${var.stage}-agentcore-pi"
444
+ }
445
+ }
446
+
447
+ ################################################################################
448
+ # Async-invoke hardening — MaximumRetryAttempts=0 + DLQ
449
+ #
450
+ # AWS Lambda async-invoke defaults to 2 retries; the agent loop is not
451
+ # idempotent (Bedrock tokens get re-burned, partial deliverables can
452
+ # overwrite the first), so retries are disabled and failed invokes land in
453
+ # the shared DLQ for operator visibility.
454
+ ################################################################################
455
+
456
+ resource "aws_lambda_function_event_invoke_config" "agentcore_pi" {
457
+ function_name = aws_lambda_function.agentcore_pi.function_name
458
+ maximum_retry_attempts = 0
459
+ maximum_event_age_in_seconds = 3600
460
+
461
+ destination_config {
462
+ on_failure {
463
+ destination = var.async_dlq_arn
464
+ }
465
+ }
466
+ }
@@ -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
+ }