thinkwork-cli 0.13.1 → 1.0.0

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 (262) hide show
  1. package/README.md +3 -14
  2. package/dist/{api-client-4DZ266J5.js → api-client-4P4JZOBX.js} +3 -1
  3. package/dist/bowser-6Z6JFAIR.js +2822 -0
  4. package/dist/{chunk-Y2WHJECR.js → chunk-4OMDWYZQ.js} +5 -44
  5. package/dist/chunk-AD2NIWB5.js +6516 -0
  6. package/dist/chunk-DV3MRBR5.js +43 -0
  7. package/dist/chunk-EI5ZX7CN.js +522 -0
  8. package/dist/chunk-EUJ7X6YD.js +126 -0
  9. package/dist/chunk-GG5WKBOX.js +436 -0
  10. package/dist/chunk-I64EZSU5.js +358 -0
  11. package/dist/chunk-KMIJ5KGT.js +128 -0
  12. package/dist/chunk-MWQ7RO76.js +137 -0
  13. package/dist/chunk-OCPHU34C.js +996 -0
  14. package/dist/chunk-OLUQ4U2Z.js +1728 -0
  15. package/dist/chunk-XYM7PE2A.js +2264 -0
  16. package/dist/chunk-YQCYD6NE.js +3299 -0
  17. package/dist/cli.js +49156 -31257
  18. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +0 -1
  19. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +0 -1
  20. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +0 -14
  21. package/dist/dist-es-2OTNTL4N.js +315 -0
  22. package/dist/dist-es-2XVAH4BQ.js +14726 -0
  23. package/dist/dist-es-3DPDUJAH.js +2000 -0
  24. package/dist/dist-es-BNZTBBVC.js +176 -0
  25. package/dist/dist-es-CD2RBDAC.js +88 -0
  26. package/dist/dist-es-I4FW57PS.js +88 -0
  27. package/dist/dist-es-KL7Y5NB2.js +377 -0
  28. package/dist/dist-es-KVFWJNDY.js +318 -0
  29. package/dist/dist-es-PS73DWNL.js +70 -0
  30. package/dist/dist-es-S3NZQFGT.js +170 -0
  31. package/dist/dist-es-SGCA4P32.js +48 -0
  32. package/dist/dist-es-WBM6J4RA.js +70 -0
  33. package/dist/dist-es-ZGVADYIF.js +485 -0
  34. package/dist/dist-es-ZKC2QKD2.js +377 -0
  35. package/dist/drizzle/0076_scheduled_jobs_marco_backfill.sql +2 -1
  36. package/dist/drizzle/0079_seed_tenant_customize_catalog.sql +1 -0
  37. package/dist/drizzle/0090_brain_schema_extraction.sql +10 -0
  38. package/dist/drizzle/0132_drop_computer_tables.sql +3 -0
  39. package/dist/drizzle/0160_compliance_event_types_plugins.sql +2 -0
  40. package/dist/drizzle/0214_think137_drop_judge_evidence_roi.sql +1 -0
  41. package/dist/drizzle/0216_drop_agent_loop_versions_goal_worker_policy.sql +1 -0
  42. package/dist/drizzle/0227_analyst_reader_role.sql +17 -20
  43. package/dist/drizzle/0230_analyst_rls.sql +28 -36
  44. package/dist/drizzle/0250_kg_schema_extraction.sql +27 -0
  45. package/dist/drizzle/0251_brain_stragglers.sql +21 -0
  46. package/dist/drizzle/0253_drop_brain_substrate.sql +2 -0
  47. package/dist/drizzle/0257_agents_runtime_allow_harness.sql +24 -0
  48. package/dist/drizzle/0261_native_auth_control_plane.sql +332 -0
  49. package/dist/drizzle/0262_auth_subscription_tickets.sql +59 -0
  50. package/dist/drizzle/0263_agentcore_runtime_identifier.sql +69 -0
  51. package/dist/drizzle/0263_drop_workos_auth_runtime.sql +236 -0
  52. package/dist/drizzle/0264_auth_enrollment_attempt_limits.sql +15 -0
  53. package/dist/drizzle/0265_eval_runs_requester_identity.sql +28 -0
  54. package/dist/drizzle/0265_require_fully_valid_auth_publication.sql +27 -0
  55. package/dist/drizzle/0266_auth_identity_recovery_grants.sql +9 -0
  56. package/dist/drizzle/0266_eval_profiles_runtime_type.sql +12 -0
  57. package/dist/drizzle/0267_ontology_candidate_rejections.sql +53 -0
  58. package/dist/drizzle/0268_identity_crosswalk_routing.sql +182 -0
  59. package/dist/drizzle/0269_ontology_system_map.sql +31 -0
  60. package/dist/drizzle/0270_tool_execution_ledger.sql +115 -0
  61. package/dist/drizzle/0271_ontology_twin_declarations.sql +47 -0
  62. package/dist/drizzle/0272_identity_graph_projection_cursor.sql +23 -0
  63. package/dist/drizzle/0273_twin_materialization_suggestions.sql +29 -0
  64. package/dist/drizzle/0274_tenant_mcp_twin_keys.sql +59 -0
  65. package/dist/drizzle/0275_identity_bulk_rebuild_fence.sql +30 -0
  66. package/dist/drizzle/0276_tool_execution_ledger_allow_cascade_delete.sql +18 -0
  67. package/dist/drizzle/0277_knowledge_base_sources.sql +107 -0
  68. package/dist/drizzle/0278_kb_page_transcription.sql +55 -0
  69. package/dist/drizzle/0279_mcp_servers_off_plugin_provenance.sql +93 -0
  70. package/dist/drizzle/0280_work_item_external_refs_drop_plane_provider.sql +46 -0
  71. package/dist/drizzle/0281_tenant_mcp_twin_keys_expiry_suffix.sql +9 -0
  72. package/dist/drizzle/0282_tenant_mcp_twin_keys_grants.sql +24 -0
  73. package/dist/drizzle/0283_agents_agentcore_runtime_dispatch.sql +13 -0
  74. package/dist/drizzle/0284_user_brain_claims.sql +69 -0
  75. package/dist/drizzle/0285_tenant_mcp_twin_keys_trusted_subsystem.sql +30 -0
  76. package/dist/drizzle/0286_brain_analytics_key.sql +26 -0
  77. package/dist/drizzle/0287_brain_subject.sql +25 -0
  78. package/dist/drizzle/0288_multi_lane_identities.sql +25 -0
  79. package/dist/event-streams-7JNLJEEL.js +894 -0
  80. package/dist/event-streams-KDF5RWR6.js +1515 -0
  81. package/dist/loadSso-ETCXTR4I.js +576 -0
  82. package/dist/loadSso-UBD7KUHE.js +583 -0
  83. package/dist/plugins/README.md +2 -2
  84. package/dist/plugins/catalog/package.json +1 -5
  85. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +6 -4
  86. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +21 -21
  87. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +102 -94
  88. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +7 -8
  89. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +0 -20
  90. package/dist/plugins/catalog/src/contracts.ts +17 -179
  91. package/dist/plugins/catalog/src/registry/generated-first-party.ts +0 -24
  92. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +1 -1
  93. package/dist/plugins/twenty/package.json +2 -1
  94. package/dist/plugins/twenty/scripts/LAMBDA_DEPLOY.md +114 -0
  95. package/dist/plugins/twenty/scripts/build-lambda.sh +29 -0
  96. package/dist/plugins/twenty/scripts/configure-product-views.ts +195 -0
  97. package/dist/plugins/twenty/scripts/lambda-handler.ts +49 -0
  98. package/dist/plugins/twenty/scripts/lib/__tests__/load-attachments.test.ts +38 -0
  99. package/dist/plugins/twenty/scripts/lib/__tests__/load-records.test.ts +145 -2
  100. package/dist/plugins/twenty/scripts/lib/__tests__/mappers.test.ts +397 -151
  101. package/dist/plugins/twenty/scripts/lib/__tests__/members-ensure.test.ts +28 -129
  102. package/dist/plugins/twenty/scripts/lib/__tests__/provision-members-db.test.ts +10 -0
  103. package/dist/plugins/twenty/scripts/lib/__tests__/schema-ensure.test.ts +13 -8
  104. package/dist/plugins/twenty/scripts/lib/lastmile-reader.ts +222 -2
  105. package/dist/plugins/twenty/scripts/lib/load-attachments.ts +29 -0
  106. package/dist/plugins/twenty/scripts/lib/load-records.ts +160 -43
  107. package/dist/plugins/twenty/scripts/lib/mappers.ts +368 -152
  108. package/dist/plugins/twenty/scripts/lib/members-ensure.ts +43 -268
  109. package/dist/plugins/twenty/scripts/lib/provision-members-db.ts +57 -0
  110. package/dist/plugins/twenty/scripts/lib/schema-ensure.ts +136 -31
  111. package/dist/plugins/twenty/scripts/migrate-lastmile.ts +254 -152
  112. package/dist/plugins/twenty/scripts/provision-twenty-members.ts +44 -1
  113. package/dist/plugins/twenty/scripts/purge-lastmile-import.ts +178 -0
  114. package/dist/plugins/twenty/scripts/restructure-products.ts +312 -0
  115. package/dist/plugins/twenty/scripts/retag-stage-values.ts +362 -0
  116. package/dist/plugins/twenty/test/manifest.test.ts +2 -4
  117. package/dist/scripts/post-deploy.sh +79 -1
  118. package/dist/signin-5QZNRSOO.js +821 -0
  119. package/dist/sso-oidc-XK673P54.js +837 -0
  120. package/dist/sts-OXI2UALF.js +1113 -0
  121. package/dist/sts-SQW4NBK3.js +1117 -0
  122. package/dist/terraform/examples/greenfield/main.tf +391 -176
  123. package/dist/terraform/examples/greenfield/terraform.tfvars.example +26 -8
  124. package/dist/terraform/modules/app/agentcore-admin/main.tf +47 -0
  125. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +39 -47
  126. package/dist/terraform/modules/app/agentcore-code-interpreter/main.tf +13 -66
  127. package/dist/terraform/modules/app/agentcore-identity/main.tf +253 -0
  128. package/dist/terraform/modules/app/agentcore-identity/outputs.tf +51 -0
  129. package/dist/terraform/modules/app/agentcore-identity/scripts/bootstrap_twenty_oauth_client.sh +239 -0
  130. package/dist/terraform/modules/app/agentcore-identity/scripts/delete_identity.sh +22 -0
  131. package/dist/terraform/modules/app/agentcore-identity/scripts/delete_twenty_identity.sh +16 -0
  132. package/dist/terraform/modules/app/agentcore-identity/scripts/delete_workload_identity.sh +19 -0
  133. package/dist/terraform/modules/app/agentcore-identity/scripts/ensure_workload_identity.sh +29 -0
  134. package/dist/terraform/modules/app/agentcore-identity/scripts/read_identity.sh +55 -0
  135. package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_identity.sh +73 -0
  136. package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_identity.sh +45 -0
  137. package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_provider.mjs +123 -0
  138. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/after.tf +15 -0
  139. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/before.tf +7 -0
  140. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-after.tf +8 -0
  141. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-before.tf +9 -0
  142. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-after.tf +3 -0
  143. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-before.tf +3 -0
  144. package/dist/terraform/modules/app/agentcore-identity/variables.tf +60 -0
  145. package/dist/terraform/modules/app/agentcore-memory/README.md +46 -9
  146. package/dist/terraform/modules/app/agentcore-memory/main.tf +27 -10
  147. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +156 -24
  148. package/dist/terraform/modules/app/agentcore-pi/README.md +1 -3
  149. package/dist/terraform/modules/app/agentcore-pi/main.tf +42 -52
  150. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +3 -3
  151. package/dist/terraform/modules/app/agentcore-pi/scripts/reconcile_pi_runtime.mjs +175 -0
  152. package/dist/terraform/modules/app/agentcore-pi/variables.tf +35 -28
  153. package/dist/terraform/modules/app/agentcore-platform/main.tf +68 -0
  154. package/dist/terraform/modules/app/agentcore-runtime/main.tf +4 -20
  155. package/dist/terraform/modules/app/appsync-subscriptions/main.tf +127 -21
  156. package/dist/terraform/modules/app/appsync-subscriptions/outputs.tf +0 -6
  157. package/dist/terraform/modules/app/appsync-subscriptions/variables.tf +5 -0
  158. package/dist/terraform/modules/app/capability-broker/main.tf +2 -2
  159. package/dist/terraform/modules/app/capability-broker/variables.tf +11 -0
  160. package/dist/terraform/modules/app/deployment-control-plane/README.md +264 -0
  161. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +4 -1
  162. package/dist/terraform/modules/app/deployment-control-plane/main.tf +94 -0
  163. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +5 -0
  164. package/dist/terraform/modules/app/deployment-control-plane/runner.py +3689 -233
  165. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +2579 -140
  166. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +33 -0
  167. package/dist/terraform/modules/app/lambda-api/auth-state.tf +72 -0
  168. package/dist/terraform/modules/app/lambda-api/chat-latency-observability.tf +466 -0
  169. package/dist/terraform/modules/app/lambda-api/dispatch-dlq.tf +55 -0
  170. package/dist/terraform/modules/app/lambda-api/handlers.tf +531 -619
  171. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +350 -241
  172. package/dist/terraform/modules/app/lambda-api/main.tf +75 -13
  173. package/dist/terraform/modules/app/lambda-api/memory-alarms.tf +3 -28
  174. package/dist/terraform/modules/app/lambda-api/oauth-secrets.tf +1 -2
  175. package/dist/terraform/modules/app/lambda-api/outputs.tf +17 -10
  176. package/dist/terraform/modules/app/lambda-api/runtime-config.tf +3 -21
  177. package/dist/terraform/modules/app/lambda-api/turn-assertion.tf +45 -0
  178. package/dist/terraform/modules/app/lambda-api/variables.tf +307 -121
  179. package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/README.md +1 -1
  180. package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/main.tf +18 -18
  181. package/dist/terraform/modules/app/sandbox-log-scrubber/README.md +11 -10
  182. package/dist/terraform/modules/app/sandbox-log-scrubber/main.tf +5 -5
  183. package/dist/terraform/modules/app/static-site/main.tf +1 -1
  184. package/dist/terraform/modules/app/www-dns/main.tf +9 -27
  185. package/dist/terraform/modules/app/www-dns/variables.tf +4 -10
  186. package/dist/terraform/modules/data/aurora-postgres/README.md +34 -0
  187. package/dist/terraform/modules/data/aurora-postgres/alarms.tf +82 -0
  188. package/dist/terraform/modules/data/aurora-postgres/main.tf +27 -57
  189. package/dist/terraform/modules/data/aurora-postgres/outputs.tf +0 -9
  190. package/dist/terraform/modules/data/aurora-postgres/variables.tf +41 -0
  191. package/dist/terraform/modules/data/s3-buckets/main.tf +5 -6
  192. package/dist/terraform/modules/foundation/cognito/main.tf +367 -72
  193. package/dist/terraform/modules/foundation/cognito/outputs.tf +47 -0
  194. package/dist/terraform/modules/foundation/cognito/variables.tf +131 -9
  195. package/dist/terraform/modules/thinkwork/README.md +5 -1
  196. package/dist/terraform/modules/thinkwork/main.tf +459 -234
  197. package/dist/terraform/modules/thinkwork/outputs.tf +44 -62
  198. package/dist/terraform/modules/thinkwork/variables.tf +353 -89
  199. package/dist/terraform/schema.graphql +69 -36
  200. package/dist/workspace-defaults/files/INSTRUCTIONS.md +9 -11
  201. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +38 -35
  202. package/dist/workspace-defaults/files/ROUTER.md +1 -1
  203. package/dist/workspace-defaults/files/TOOLS.md +9 -39
  204. package/dist/workspace-defaults/files/USER.md +1 -0
  205. package/dist/workspace-defaults/files/agents/analyst/INSTRUCTIONS.md +6 -3
  206. package/dist/workspace-defaults/files/catalog-skills/brain-brief-builder/SKILL.md +165 -0
  207. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/SKILL.md +75 -0
  208. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  209. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  210. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/workflow-authoring.md +46 -0
  211. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +1 -1
  212. package/dist/workspace-defaults/files/skills/document-composer/SKILL.md +22 -3
  213. package/package.json +3 -2
  214. package/dist/drizzle/0261_thread_turns_origin_turn_index.sql +0 -11
  215. package/dist/plugins/company-data/README.md +0 -49
  216. package/dist/plugins/company-data/package.json +0 -21
  217. package/dist/plugins/company-data/src/index.ts +0 -30
  218. package/dist/plugins/company-data/src/manifest.ts +0 -26
  219. package/dist/plugins/company-data/test/manifest.test.ts +0 -116
  220. package/dist/plugins/company-data/tsconfig.json +0 -8
  221. package/dist/plugins/company-etl/README.md +0 -46
  222. package/dist/plugins/company-etl/package.json +0 -21
  223. package/dist/plugins/company-etl/src/index.ts +0 -29
  224. package/dist/plugins/company-etl/src/manifest.ts +0 -26
  225. package/dist/plugins/company-etl/test/manifest.test.ts +0 -108
  226. package/dist/plugins/company-etl/tsconfig.json +0 -8
  227. package/dist/plugins/lastmile/README.md +0 -50
  228. package/dist/plugins/lastmile/package.json +0 -23
  229. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +0 -661
  230. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +0 -572
  231. package/dist/plugins/lastmile/src/discovery.fixture.ts +0 -64
  232. package/dist/plugins/lastmile/src/index.ts +0 -46
  233. package/dist/plugins/lastmile/src/manifest.ts +0 -139
  234. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +0 -266
  235. package/dist/plugins/lastmile/test/discovery.test.ts +0 -88
  236. package/dist/plugins/lastmile/tsconfig.json +0 -8
  237. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +0 -409
  238. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +0 -359
  239. package/dist/plugins/workos-auth/package.json +0 -22
  240. package/dist/plugins/workos-auth/src/index.ts +0 -30
  241. package/dist/plugins/workos-auth/src/manifest.ts +0 -40
  242. package/dist/plugins/workos-auth/src/provider-contract.ts +0 -39
  243. package/dist/plugins/workos-auth/test/manifest.test.ts +0 -94
  244. package/dist/plugins/workos-auth/tsconfig.json +0 -8
  245. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +0 -61
  246. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +0 -227
  247. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +0 -277
  248. package/dist/terraform/modules/app/agentcore-code-interpreter/scripts/build_and_push_sandbox_base.sh +0 -70
  249. package/dist/terraform/modules/app/agentcore-harness/main.tf +0 -101
  250. package/dist/terraform/modules/app/agentcore-harness/outputs.tf +0 -9
  251. package/dist/terraform/modules/app/agentcore-harness/variables.tf +0 -25
  252. package/dist/terraform/modules/app/hindsight-memory/README.md +0 -89
  253. package/dist/terraform/modules/app/hindsight-memory/main.tf +0 -411
  254. package/dist/terraform/modules/data/bedrock-knowledge-base/main.tf +0 -102
  255. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/outputs.tf +0 -0
  256. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/sync-database.py +0 -0
  257. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/test_sync_database.py +0 -0
  258. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/variables.tf +0 -0
  259. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/README.md +0 -0
  260. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/main.tf +0 -0
  261. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/outputs.tf +0 -0
  262. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/variables.tf +0 -0
@@ -19,18 +19,19 @@
19
19
  data "aws_caller_identity" "current" {}
20
20
 
21
21
  locals {
22
- okf_efs_vpc_enabled = length(var.okf_efs_subnet_ids) > 0 && length(var.okf_efs_security_group_ids) > 0
23
- # Handlers that open direct Postgres connections to registered analyst data
24
- # sources. VPC-attaching them (analyst_egress_subnet_ids) gives their egress
25
- # the NAT gateway's stable EIP, which external databases behind an IP
26
- # allowlist can admit a non-VPC Lambda egresses from the shared AWS pool
27
- # and can never satisfy such an allowlist.
28
- analyst_vpc_enabled = length(var.analyst_egress_subnet_ids) > 0 && length(var.analyst_egress_security_group_ids) > 0
29
- analyst_vpc_handlers = toset([
30
- "graphql-http",
31
- "analyst-query-broker",
32
- "analyst-connection-reconciler",
33
- ])
22
+ # Company Brain U5: the identity-graph-projector attaches to the VPC only
23
+ # when both Neptune network inputs are present (disjoint from the two
24
+ # block above a function takes at most one vpc_config).
25
+ neptune_vpc_enabled = length(var.neptune_subnet_ids) > 0 && length(var.neptune_security_group_ids) > 0
26
+ # THINK-1082: any VPC attachment in this module (Neptune projector or the
27
+ # whole-module lambdas_in_vpc lane) needs the ENI grant on the shared role.
28
+ lambda_vpc_enabled = local.neptune_vpc_enabled || var.lambdas_in_vpc
29
+ # lambdas_in_vpc needs both network inputs; checked as a precondition on the
30
+ # handler functions because cross-variable validation is not available at
31
+ # the repo's Terraform floor (1.8.5).
32
+ lambda_vpc_inputs_complete = !var.lambdas_in_vpc || (
33
+ length(var.vpc_subnet_ids) > 0 && length(var.vpc_security_group_ids) > 0
34
+ )
34
35
  # Constructed rather than read from aws_apigatewayv2_stage.default.invoke_url
35
36
  # (the two are identical for an HTTP API's $default stage). Reading it off
36
37
  # the stage made every Lambda's env depend on the stage, which forbids the
@@ -73,6 +74,14 @@ resource "aws_apigatewayv2_stage" "default" {
73
74
  throttling_burst_limit = 20
74
75
  }
75
76
 
77
+ # Session revocation is authenticated and independently rate-limited in the
78
+ # handler per principal. This edge throttle also bounds aggregate abuse.
79
+ route_settings {
80
+ route_key = "POST /api/auth/revoke"
81
+ throttling_rate_limit = 5
82
+ throttling_burst_limit = 10
83
+ }
84
+
76
85
  # UpdateStage 404s ("Unable to find Route by key … within the provided
77
86
  # RouteSettings") if the stage update races the route creation — Terraform
78
87
  # sees no reference edge between route_settings.route_key and the route
@@ -186,13 +195,50 @@ resource "aws_iam_role_policy_attachment" "lambda_basic" {
186
195
  # aggregate hit IAM's 10,240-byte cap on 2026-06-11 (#2378/#2379). New grants
187
196
  # go into the grouped managed policies, never inline.
188
197
 
198
+ # Every VPC-attached handler on the shared Lambda role needs the ENI
199
+ # create/describe/delete grant, or its invocations fail before the handler
200
+ # runs. This was gated on the OKF EFS mount alone, which was true by accident:
201
+ # okf-efs-refresh was simply the first VPC-attached handler. The
202
+ # Neptune-attached identity-graph-projector shares this role and had been
203
+ # riding that gate. Gate on the surviving VPC consumer instead — the OKF
204
+ # mount is gone as of the wiki-removal arc U3.
205
+ # THINK-1082: also gated on lambdas_in_vpc — every handler attaches then.
189
206
  resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
190
- count = local.okf_efs_vpc_enabled ? 1 : 0
207
+ count = local.lambda_vpc_enabled ? 1 : 0
191
208
 
192
209
  role = aws_iam_role.lambda.name
193
210
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
194
211
  }
195
212
 
213
+ # THINK-1082: compliance-anchor and compliance-export-runner run on sibling
214
+ # roles owned by the compliance bucket modules (not aws_iam_role.lambda). They
215
+ # carry a database connection too, so when lambdas_in_vpc attaches them the
216
+ # ENI grant has to land on those roles as well.
217
+ resource "aws_iam_role_policy_attachment" "compliance_anchor_vpc_access" {
218
+ count = var.lambdas_in_vpc && local.deploy_lambda_handlers ? 1 : 0
219
+
220
+ role = var.compliance_anchor_lambda_role_name
221
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
222
+ }
223
+
224
+ resource "aws_iam_role_policy_attachment" "compliance_export_runner_vpc_access" {
225
+ count = var.lambdas_in_vpc && local.deploy_lambda_handlers ? 1 : 0
226
+
227
+ role = var.compliance_exports_runner_role_name
228
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
229
+ }
230
+
231
+ # memory-retraction-drainer runs on its own role (handlers.tf) — the first
232
+ # McPherson VPC cut-over (2026-08-25) failed on exactly this function:
233
+ # "The provided execution role does not have permissions to call
234
+ # CreateNetworkInterface on EC2".
235
+ resource "aws_iam_role_policy_attachment" "memory_retraction_drainer_vpc_access" {
236
+ count = var.lambdas_in_vpc && local.deploy_lambda_handlers ? 1 : 0
237
+
238
+ role = aws_iam_role.memory_retraction_drainer.name
239
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
240
+ }
241
+
196
242
  ################################################################################
197
243
  # Placeholder Lambda — proves the infrastructure works
198
244
  #
@@ -256,3 +302,19 @@ resource "aws_lambda_permission" "placeholder_apigw" {
256
302
  principal = "apigateway.amazonaws.com"
257
303
  source_arn = "${aws_apigatewayv2_api.main.execution_arn}/*/*"
258
304
  }
305
+ resource "terraform_data" "auth_migration_recovery_deadline_guard" {
306
+ input = {
307
+ phase = var.auth_retirement_phase
308
+ deadline = var.auth_migration_recovery_deadline
309
+ }
310
+
311
+ lifecycle {
312
+ precondition {
313
+ condition = var.auth_retirement_phase != "coexistence" || (
314
+ trimspace(var.auth_migration_recovery_deadline) != "" &&
315
+ can(timecmp(var.auth_migration_recovery_deadline, var.auth_migration_recovery_deadline))
316
+ )
317
+ error_message = "auth_migration_recovery_deadline must be an RFC3339 timestamp when auth_retirement_phase is coexistence."
318
+ }
319
+ }
320
+ }
@@ -2,9 +2,7 @@
2
2
  #
3
3
  # Alarms here fire from metrics that EXIST without any log-group management:
4
4
  # - AWS/Lambda Errors for the memory-stage worker and the retraction drainer
5
- # (handler crashes, including ones that never reach a log line);
6
- # - the wiki-compile DLQ depth (the only memory-path Lambda with an
7
- # on_failure destination).
5
+ # (handler crashes, including ones that never reach a log line).
8
6
  #
9
7
  # DELIBERATELY NOT HERE — log-metric filters over the drainer's structured
10
8
  # summary line and the worker's "status=failed" line. They require the
@@ -18,8 +16,8 @@
18
16
  # packages/api/scripts/external-memory-readiness.ts (which reports due,
19
17
  # failed, and dead-lettered attempts directly from the ledger).
20
18
  #
21
- # Also runbook-only (no metric exists): source checkpoint age, graph-to-wiki
22
- # lag, evidence lag, deferred identity count/age.
19
+ # Also runbook-only (no metric exists): source checkpoint age, evidence lag,
20
+ # deferred identity count/age.
23
21
  #
24
22
  # alarm_actions are empty: the only SNS topic in this module
25
23
  # (aws_sns_topic.cost_alerts) is the cost-alert channel — wiring memory alarms
@@ -67,26 +65,3 @@ resource "aws_cloudwatch_metric_alarm" "memory_retraction_drainer_lambda_errors"
67
65
  }
68
66
  }
69
67
 
70
- # ---------------------------------------------------------------------------
71
- # wiki-compile DLQ depth (graph → wiki handoff failures)
72
- # ---------------------------------------------------------------------------
73
-
74
- resource "aws_cloudwatch_metric_alarm" "wiki_compile_dlq_depth" {
75
- count = local.deploy_lambda_handlers ? 1 : 0
76
-
77
- alarm_name = "thinkwork-${var.stage}-wiki-compile-dlq-depth"
78
- alarm_description = "wiki-compile DLQ has messages — a compile invocation crashed before the job ledger recorded an outcome; canonical pages are stale until replayed."
79
- namespace = "AWS/SQS"
80
- metric_name = "ApproximateNumberOfMessagesVisible"
81
- statistic = "Maximum"
82
- period = 60
83
- evaluation_periods = 1
84
- threshold = 1
85
- comparison_operator = "GreaterThanOrEqualToThreshold"
86
- treat_missing_data = "notBreaching"
87
- alarm_actions = []
88
-
89
- dimensions = {
90
- QueueName = aws_sqs_queue.wiki_compile_dlq[0].name
91
- }
92
- }
@@ -36,8 +36,7 @@ resource "aws_secretsmanager_secret_version" "oauth_google_productivity" {
36
36
  })
37
37
 
38
38
  # If the operator rotates the secret via AWS console / CLI without touching
39
- # tfvars, terraform shouldn't clobber it on next apply. Matches the pattern
40
- # used for google_places_api_key in the wiki-compile handler.
39
+ # tfvars, terraform shouldn't clobber it on next apply.
41
40
  lifecycle {
42
41
  ignore_changes = [secret_string]
43
42
  }
@@ -48,16 +48,6 @@ output "workflow_execution_callback_fn_arn" {
48
48
  value = local.deploy_lambda_handlers ? aws_lambda_function.handler["workflow-execution-callback"].arn : ""
49
49
  }
50
50
 
51
- output "okf_efs_refresh_fn_name" {
52
- description = "OKF EFS refresh Lambda function name."
53
- value = local.deploy_lambda_handlers ? aws_lambda_function.handler["okf-efs-refresh"].function_name : ""
54
- }
55
-
56
- output "okf_efs_refresh_fn_arn" {
57
- description = "OKF EFS refresh Lambda ARN."
58
- value = local.deploy_lambda_handlers ? aws_lambda_function.handler["okf-efs-refresh"].arn : ""
59
- }
60
-
61
51
  output "brain_artifacts_bucket_name" {
62
52
  description = "Canonical ThinkWork Brain S3 bucket for source artifacts, ingestion manifests, migration snapshots, vault projections, and exports."
63
53
  value = aws_s3_bucket.brain_artifacts.bucket
@@ -130,6 +120,23 @@ output "mcp_custom_domain_validation" {
130
120
  ] : []
131
121
  }
132
122
 
123
+ # --- THINK-915 chat turn-latency observability -------------------------------
124
+
125
+ output "chat_turn_latency_dashboard_name" {
126
+ description = "CloudWatch dashboard carrying the chat turn-latency phase metrics, dispatch Duration p95, and turn-path Lambda invocations/errors. Empty when the feature is disabled."
127
+ value = local.chat_latency_enabled ? aws_cloudwatch_dashboard.chat_turn_latency[0].dashboard_name : ""
128
+ }
129
+
130
+ output "chat_turn_latency_metric_namespace" {
131
+ description = "CloudWatch namespace holding TurnRuntimeInvokeMs / AgentLoopMs for this stage."
132
+ value = local.chat_latency_namespace
133
+ }
134
+
135
+ output "chat_turn_runtime_log_group_name_effective" {
136
+ description = "AgentCore Pi runtime log group actually used by the AgentLoopMs metric filter and the saved turn-timeline query (explicit override, else prefix discovery). Empty when the runtime has not logged yet."
137
+ value = local.chat_latency_runtime_log_group
138
+ }
139
+
133
140
  output "mcp_custom_domain_target" {
134
141
  description = "Regional target for the final mcp.thinkwork.ai → API Gateway CNAME. Only populated on the second apply (when mcp_custom_domain_ready = true). Includes { target_domain_name, hosted_zone_id } so the CF sync script can upsert the record."
135
142
  value = var.mcp_custom_domain != "" && var.mcp_custom_domain_ready ? {
@@ -51,9 +51,9 @@ locals {
51
51
  # ----------------------------------------------------------------------------
52
52
  # Platform secrets (plan 2026-06-11-006 U5/R4)
53
53
  #
54
- # API_AUTH_SECRET and APPSYNC_API_KEY leave plaintext Lambda env: the
55
- # runtime-config loader prefetches these at cold start (getApiAuthSecret /
56
- # getAppsyncApiKey accessors, env-wins during the transition window). Names
54
+ # API_AUTH_SECRET leaves plaintext Lambda env: the runtime-config loader
55
+ # prefetches it at cold start (getApiAuthSecret, env-wins during the transition
56
+ # window). Names
57
57
  # use the `thinkwork/${stage}/...` prefix so the shared role's existing
58
58
  # `secretsmanager:GetSecretValue` grant on `thinkwork/*` covers them.
59
59
  # The env copies in common_env are dropped one release AFTER this ships
@@ -83,24 +83,6 @@ resource "aws_secretsmanager_secret_version" "api_auth" {
83
83
  # console.
84
84
  }
85
85
 
86
- resource "aws_secretsmanager_secret" "appsync_api_key" {
87
- name = "thinkwork/${var.stage}/appsync-api-key"
88
- description = "AppSync API key for subscription notify fan-out. Prefetched at Lambda cold start by @thinkwork/runtime-config."
89
- tags = {
90
- Name = "thinkwork-${var.stage}-appsync-api-key"
91
- Stage = var.stage
92
- }
93
- }
94
-
95
- resource "aws_secretsmanager_secret_version" "appsync_api_key" {
96
- secret_id = aws_secretsmanager_secret.appsync_api_key.id
97
- secret_string = var.appsync_api_key
98
-
99
- # AppSync keys are terraform-rotated (the appsync module recreates them),
100
- # so track the var here — unlike api_auth there is no operator rotation
101
- # path outside terraform.
102
- }
103
-
104
86
  # The standalone compliance Lambdas (anchor, export-runner) bundle the
105
87
  # runtime-config loader but run under dedicated roles that lack the shared
106
88
  # role's ssm grant. Without these, every cold start auto-prime fails
@@ -0,0 +1,45 @@
1
+ # Signed-turn identity (THINK-324 Wave-3 C18).
2
+ #
3
+ # An asymmetric SIGN_VERIFY key per published version label. The dispatch
4
+ # Lambdas (chat-agent-invoke, wakeup-processor) mint a short-lived assertion
5
+ # binding {tenant, thread, turn} into the Pi invoke payload; the runtime
6
+ # echoes it on callbacks; verifiers (tool-executions today, more in C19)
7
+ # check the signature locally against the cached public key. The private key
8
+ # never leaves KMS — a compromised Lambda cannot exfiltrate the signer.
9
+ #
10
+ # The `agentcore_turn_assertion_*` variables predate this plane's rebuild
11
+ # (the THINK-311 trial's key was destroyed with the managed harness); the
12
+ # same one-or-two-version rotation contract applies.
13
+
14
+ resource "aws_kms_key" "agentcore_turn_assertion" {
15
+ for_each = toset(var.agentcore_turn_assertion_key_versions)
16
+
17
+ description = "ThinkWork ${var.stage} signed-turn assertion key (${each.key})"
18
+ key_usage = "SIGN_VERIFY"
19
+ customer_master_key_spec = "ECC_NIST_P256"
20
+ deletion_window_in_days = 7
21
+
22
+ lifecycle {
23
+ precondition {
24
+ condition = contains(var.agentcore_turn_assertion_key_versions, var.agentcore_turn_assertion_active_key_version)
25
+ error_message = "agentcore_turn_assertion_active_key_version must be one of agentcore_turn_assertion_key_versions."
26
+ }
27
+ }
28
+
29
+ tags = {
30
+ Stage = var.stage
31
+ Component = "turn-assertion"
32
+ }
33
+ }
34
+
35
+ resource "aws_kms_alias" "agentcore_turn_assertion" {
36
+ for_each = toset(var.agentcore_turn_assertion_key_versions)
37
+
38
+ name = "alias/thinkwork-${var.stage}-turn-assertion-${each.key}"
39
+ target_key_id = aws_kms_key.agentcore_turn_assertion[each.key].key_id
40
+ }
41
+
42
+ locals {
43
+ turn_assertion_active_key_arn = aws_kms_key.agentcore_turn_assertion[var.agentcore_turn_assertion_active_key_version].arn
44
+ turn_assertion_key_arns = [for key in aws_kms_key.agentcore_turn_assertion : key.arn]
45
+ }