thinkwork-cli 0.13.2 → 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 (231) hide show
  1. package/README.md +3 -14
  2. package/dist/{api-client-JYZXYQJR.js → api-client-4P4JZOBX.js} +1 -1
  3. package/dist/{chunk-Z2F6RJFR.js → chunk-4OMDWYZQ.js} +4 -5
  4. package/dist/{chunk-ILZKG5WV.js → chunk-AD2NIWB5.js} +434 -69
  5. package/dist/chunk-MWQ7RO76.js +137 -0
  6. package/dist/{chunk-DVPBI5HM.js → chunk-OLUQ4U2Z.js} +26 -26
  7. package/dist/{chunk-QOERT44A.js → chunk-YQCYD6NE.js} +57 -44
  8. package/dist/cli.js +4400 -16431
  9. package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +0 -1
  10. package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +0 -1
  11. package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +0 -14
  12. package/dist/{dist-es-CRV46D5B.js → dist-es-2OTNTL4N.js} +4 -4
  13. package/dist/{dist-es-ENBUC3JP.js → dist-es-2XVAH4BQ.js} +2 -2
  14. package/dist/{dist-es-DCY4IC3Y.js → dist-es-3DPDUJAH.js} +2 -2
  15. package/dist/{dist-es-G7PTG75M.js → dist-es-BNZTBBVC.js} +1 -1
  16. package/dist/{dist-es-GKDBE7E6.js → dist-es-CD2RBDAC.js} +1 -1
  17. package/dist/{dist-es-R7FGL2IB.js → dist-es-I4FW57PS.js} +1 -1
  18. package/dist/{dist-es-USORBXZ5.js → dist-es-KVFWJNDY.js} +4 -4
  19. package/dist/{dist-es-HY3535OI.js → dist-es-PS73DWNL.js} +2 -2
  20. package/dist/{dist-es-LDE437AM.js → dist-es-S3NZQFGT.js} +1 -1
  21. package/dist/{dist-es-G54LBMRN.js → dist-es-SGCA4P32.js} +1 -1
  22. package/dist/{dist-es-Q57SZXZ7.js → dist-es-WBM6J4RA.js} +2 -2
  23. package/dist/{dist-es-P26FWFLT.js → dist-es-ZGVADYIF.js} +8 -8
  24. package/dist/drizzle/0227_analyst_reader_role.sql +17 -26
  25. package/dist/drizzle/0230_analyst_rls.sql +28 -45
  26. package/dist/drizzle/0261_native_auth_control_plane.sql +7 -3
  27. package/dist/drizzle/0270_tool_execution_ledger.sql +115 -0
  28. package/dist/drizzle/0271_ontology_twin_declarations.sql +47 -0
  29. package/dist/drizzle/0272_identity_graph_projection_cursor.sql +23 -0
  30. package/dist/drizzle/0273_twin_materialization_suggestions.sql +29 -0
  31. package/dist/drizzle/0274_tenant_mcp_twin_keys.sql +59 -0
  32. package/dist/drizzle/0275_identity_bulk_rebuild_fence.sql +30 -0
  33. package/dist/drizzle/0276_tool_execution_ledger_allow_cascade_delete.sql +18 -0
  34. package/dist/drizzle/0277_knowledge_base_sources.sql +107 -0
  35. package/dist/drizzle/0278_kb_page_transcription.sql +55 -0
  36. package/dist/drizzle/0279_mcp_servers_off_plugin_provenance.sql +93 -0
  37. package/dist/drizzle/0280_work_item_external_refs_drop_plane_provider.sql +46 -0
  38. package/dist/drizzle/0281_tenant_mcp_twin_keys_expiry_suffix.sql +9 -0
  39. package/dist/drizzle/0282_tenant_mcp_twin_keys_grants.sql +24 -0
  40. package/dist/drizzle/0283_agents_agentcore_runtime_dispatch.sql +13 -0
  41. package/dist/drizzle/0284_user_brain_claims.sql +69 -0
  42. package/dist/drizzle/0285_tenant_mcp_twin_keys_trusted_subsystem.sql +30 -0
  43. package/dist/drizzle/0286_brain_analytics_key.sql +26 -0
  44. package/dist/drizzle/0287_brain_subject.sql +25 -0
  45. package/dist/drizzle/0288_multi_lane_identities.sql +25 -0
  46. package/dist/{loadSso-DJVB7BXE.js → loadSso-ETCXTR4I.js} +2 -2
  47. package/dist/{loadSso-JAMNA3WY.js → loadSso-UBD7KUHE.js} +2 -2
  48. package/dist/plugins/README.md +2 -2
  49. package/dist/plugins/catalog/package.json +0 -3
  50. package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +6 -3
  51. package/dist/plugins/catalog/src/__tests__/catalog.test.ts +21 -21
  52. package/dist/plugins/catalog/src/__tests__/contracts.test.ts +102 -25
  53. package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +7 -6
  54. package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +0 -15
  55. package/dist/plugins/catalog/src/contracts.ts +15 -0
  56. package/dist/plugins/catalog/src/registry/generated-first-party.ts +0 -18
  57. package/dist/plugins/n8n/test/integrated-app-contract.test.ts +1 -1
  58. package/dist/plugins/twenty/package.json +2 -1
  59. package/dist/plugins/twenty/scripts/LAMBDA_DEPLOY.md +114 -0
  60. package/dist/plugins/twenty/scripts/build-lambda.sh +29 -0
  61. package/dist/plugins/twenty/scripts/configure-product-views.ts +195 -0
  62. package/dist/plugins/twenty/scripts/lambda-handler.ts +49 -0
  63. package/dist/plugins/twenty/scripts/lib/__tests__/load-attachments.test.ts +38 -0
  64. package/dist/plugins/twenty/scripts/lib/__tests__/load-records.test.ts +145 -2
  65. package/dist/plugins/twenty/scripts/lib/__tests__/mappers.test.ts +397 -151
  66. package/dist/plugins/twenty/scripts/lib/__tests__/members-ensure.test.ts +28 -129
  67. package/dist/plugins/twenty/scripts/lib/__tests__/provision-members-db.test.ts +10 -0
  68. package/dist/plugins/twenty/scripts/lib/__tests__/schema-ensure.test.ts +13 -8
  69. package/dist/plugins/twenty/scripts/lib/lastmile-reader.ts +222 -2
  70. package/dist/plugins/twenty/scripts/lib/load-attachments.ts +29 -0
  71. package/dist/plugins/twenty/scripts/lib/load-records.ts +160 -43
  72. package/dist/plugins/twenty/scripts/lib/mappers.ts +368 -152
  73. package/dist/plugins/twenty/scripts/lib/members-ensure.ts +43 -268
  74. package/dist/plugins/twenty/scripts/lib/provision-members-db.ts +57 -0
  75. package/dist/plugins/twenty/scripts/lib/schema-ensure.ts +136 -31
  76. package/dist/plugins/twenty/scripts/migrate-lastmile.ts +254 -152
  77. package/dist/plugins/twenty/scripts/provision-twenty-members.ts +44 -1
  78. package/dist/plugins/twenty/scripts/purge-lastmile-import.ts +178 -0
  79. package/dist/plugins/twenty/scripts/restructure-products.ts +312 -0
  80. package/dist/plugins/twenty/scripts/retag-stage-values.ts +362 -0
  81. package/dist/plugins/twenty/test/manifest.test.ts +2 -4
  82. package/dist/scripts/post-deploy.sh +79 -1
  83. package/dist/{signin-UGDWTGS4.js → signin-5QZNRSOO.js} +2 -2
  84. package/dist/{sso-oidc-Q4VXANXY.js → sso-oidc-XK673P54.js} +2 -2
  85. package/dist/{sts-CWLSE3GH.js → sts-OXI2UALF.js} +6 -134
  86. package/dist/{sts-DNZLNVOV.js → sts-SQW4NBK3.js} +6 -134
  87. package/dist/terraform/examples/greenfield/main.tf +233 -175
  88. package/dist/terraform/examples/greenfield/terraform.tfvars.example +12 -8
  89. package/dist/terraform/modules/app/agentcore-admin/main.tf +47 -0
  90. package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +39 -47
  91. package/dist/terraform/modules/app/agentcore-code-interpreter/main.tf +13 -66
  92. package/dist/terraform/modules/app/agentcore-identity/main.tf +106 -26
  93. package/dist/terraform/modules/app/agentcore-identity/outputs.tf +6 -6
  94. package/dist/terraform/modules/app/agentcore-identity/scripts/bootstrap_twenty_oauth_client.sh +216 -99
  95. package/dist/terraform/modules/app/agentcore-identity/scripts/delete_identity.sh +6 -9
  96. package/dist/terraform/modules/app/agentcore-identity/scripts/delete_workload_identity.sh +19 -0
  97. package/dist/terraform/modules/app/agentcore-identity/scripts/ensure_workload_identity.sh +29 -0
  98. package/dist/terraform/modules/app/agentcore-identity/scripts/read_identity.sh +22 -7
  99. package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_identity.sh +17 -46
  100. package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_provider.mjs +65 -3
  101. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/after.tf +15 -0
  102. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/before.tf +7 -0
  103. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-after.tf +8 -0
  104. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-before.tf +9 -0
  105. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-after.tf +3 -0
  106. package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-before.tf +3 -0
  107. package/dist/terraform/modules/app/agentcore-identity/variables.tf +6 -0
  108. package/dist/terraform/modules/app/agentcore-memory/README.md +46 -9
  109. package/dist/terraform/modules/app/agentcore-memory/main.tf +27 -10
  110. package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +156 -24
  111. package/dist/terraform/modules/app/agentcore-pi/README.md +1 -3
  112. package/dist/terraform/modules/app/agentcore-pi/main.tf +42 -52
  113. package/dist/terraform/modules/app/agentcore-pi/outputs.tf +3 -3
  114. package/dist/terraform/modules/app/agentcore-pi/scripts/reconcile_pi_runtime.mjs +175 -0
  115. package/dist/terraform/modules/app/agentcore-pi/variables.tf +35 -28
  116. package/dist/terraform/modules/app/agentcore-platform/main.tf +68 -0
  117. package/dist/terraform/modules/app/agentcore-runtime/main.tf +4 -20
  118. package/dist/terraform/modules/app/capability-broker/main.tf +2 -2
  119. package/dist/terraform/modules/app/capability-broker/variables.tf +11 -0
  120. package/dist/terraform/modules/app/deployment-control-plane/README.md +264 -0
  121. package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +4 -1
  122. package/dist/terraform/modules/app/deployment-control-plane/main.tf +94 -0
  123. package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +5 -0
  124. package/dist/terraform/modules/app/deployment-control-plane/runner.py +2641 -124
  125. package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +2034 -154
  126. package/dist/terraform/modules/app/deployment-control-plane/variables.tf +33 -0
  127. package/dist/terraform/modules/app/lambda-api/auth-state.tf +72 -0
  128. package/dist/terraform/modules/app/lambda-api/chat-latency-observability.tf +466 -0
  129. package/dist/terraform/modules/app/lambda-api/dispatch-dlq.tf +55 -0
  130. package/dist/terraform/modules/app/lambda-api/handlers.tf +411 -723
  131. package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +262 -198
  132. package/dist/terraform/modules/app/lambda-api/main.tf +51 -13
  133. package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +4 -181
  134. package/dist/terraform/modules/app/lambda-api/memory-alarms.tf +3 -28
  135. package/dist/terraform/modules/app/lambda-api/oauth-secrets.tf +1 -2
  136. package/dist/terraform/modules/app/lambda-api/outputs.tf +17 -45
  137. package/dist/terraform/modules/app/lambda-api/turn-assertion.tf +45 -0
  138. package/dist/terraform/modules/app/lambda-api/variables.tf +219 -126
  139. package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/README.md +1 -1
  140. package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/main.tf +18 -18
  141. package/dist/terraform/modules/app/sandbox-log-scrubber/README.md +11 -10
  142. package/dist/terraform/modules/app/sandbox-log-scrubber/main.tf +5 -5
  143. package/dist/terraform/modules/app/static-site/main.tf +1 -1
  144. package/dist/terraform/modules/app/www-dns/main.tf +9 -27
  145. package/dist/terraform/modules/app/www-dns/variables.tf +4 -10
  146. package/dist/terraform/modules/data/aurora-postgres/README.md +34 -0
  147. package/dist/terraform/modules/data/aurora-postgres/alarms.tf +82 -0
  148. package/dist/terraform/modules/data/aurora-postgres/main.tf +27 -57
  149. package/dist/terraform/modules/data/aurora-postgres/outputs.tf +0 -9
  150. package/dist/terraform/modules/data/aurora-postgres/variables.tf +41 -0
  151. package/dist/terraform/modules/data/s3-buckets/main.tf +5 -6
  152. package/dist/terraform/modules/foundation/cognito/main.tf +81 -8
  153. package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
  154. package/dist/terraform/modules/foundation/cognito/variables.tf +24 -12
  155. package/dist/terraform/modules/thinkwork/README.md +5 -1
  156. package/dist/terraform/modules/thinkwork/main.tf +376 -374
  157. package/dist/terraform/modules/thinkwork/outputs.tf +12 -158
  158. package/dist/terraform/modules/thinkwork/variables.tf +246 -89
  159. package/dist/workspace-defaults/files/INSTRUCTIONS.md +9 -11
  160. package/dist/workspace-defaults/files/MEMORY_GUIDE.md +38 -35
  161. package/dist/workspace-defaults/files/ROUTER.md +1 -1
  162. package/dist/workspace-defaults/files/TOOLS.md +9 -39
  163. package/dist/workspace-defaults/files/agents/analyst/INSTRUCTIONS.md +6 -3
  164. package/dist/workspace-defaults/files/catalog-skills/brain-brief-builder/SKILL.md +165 -0
  165. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/SKILL.md +75 -0
  166. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
  167. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
  168. package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/workflow-authoring.md +46 -0
  169. package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +1 -1
  170. package/dist/workspace-defaults/files/skills/document-composer/SKILL.md +22 -3
  171. package/package.json +1 -1
  172. package/dist/drizzle/0261_managed_harness_multiplayer.sql +0 -313
  173. package/dist/drizzle/0262_parallel_harness_threads.sql +0 -9
  174. package/dist/drizzle/0264_harness_tool_execution_ledger.sql +0 -113
  175. package/dist/plugins/company-data/README.md +0 -49
  176. package/dist/plugins/company-data/package.json +0 -21
  177. package/dist/plugins/company-data/src/index.ts +0 -30
  178. package/dist/plugins/company-data/src/manifest.ts +0 -26
  179. package/dist/plugins/company-data/test/manifest.test.ts +0 -116
  180. package/dist/plugins/company-data/tsconfig.json +0 -8
  181. package/dist/plugins/company-etl/README.md +0 -46
  182. package/dist/plugins/company-etl/package.json +0 -21
  183. package/dist/plugins/company-etl/src/index.ts +0 -29
  184. package/dist/plugins/company-etl/src/manifest.ts +0 -26
  185. package/dist/plugins/company-etl/test/manifest.test.ts +0 -108
  186. package/dist/plugins/company-etl/tsconfig.json +0 -8
  187. package/dist/plugins/lastmile/README.md +0 -50
  188. package/dist/plugins/lastmile/package.json +0 -23
  189. package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +0 -661
  190. package/dist/plugins/lastmile/src/api/tasks-adapter.ts +0 -572
  191. package/dist/plugins/lastmile/src/discovery.fixture.ts +0 -64
  192. package/dist/plugins/lastmile/src/index.ts +0 -46
  193. package/dist/plugins/lastmile/src/manifest.ts +0 -139
  194. package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +0 -266
  195. package/dist/plugins/lastmile/test/discovery.test.ts +0 -88
  196. package/dist/plugins/lastmile/tsconfig.json +0 -8
  197. package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +0 -409
  198. package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +0 -359
  199. package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +0 -61
  200. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +0 -227
  201. package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +0 -277
  202. package/dist/terraform/modules/app/agentcore-code-interpreter/scripts/build_and_push_sandbox_base.sh +0 -70
  203. package/dist/terraform/modules/app/agentcore-gateway/main.tf +0 -305
  204. package/dist/terraform/modules/app/agentcore-gateway/outputs.tf +0 -44
  205. package/dist/terraform/modules/app/agentcore-gateway/scripts/delete_gateway.sh +0 -93
  206. package/dist/terraform/modules/app/agentcore-gateway/scripts/read_gateway.sh +0 -33
  207. package/dist/terraform/modules/app/agentcore-gateway/scripts/reconcile_gateway.sh +0 -543
  208. package/dist/terraform/modules/app/agentcore-gateway/variables.tf +0 -70
  209. package/dist/terraform/modules/app/agentcore-harness/main.tf +0 -330
  210. package/dist/terraform/modules/app/agentcore-harness/outputs.tf +0 -72
  211. package/dist/terraform/modules/app/agentcore-harness/scripts/delete_harness.sh +0 -5
  212. package/dist/terraform/modules/app/agentcore-harness/scripts/harness-lifecycle.mjs +0 -430
  213. package/dist/terraform/modules/app/agentcore-harness/scripts/harness-readback.mjs +0 -180
  214. package/dist/terraform/modules/app/agentcore-harness/scripts/harness-tool-contract.mjs +0 -193
  215. package/dist/terraform/modules/app/agentcore-harness/scripts/prune_harness.sh +0 -5
  216. package/dist/terraform/modules/app/agentcore-harness/scripts/read_harness.sh +0 -5
  217. package/dist/terraform/modules/app/agentcore-harness/scripts/reconcile_harness.sh +0 -5
  218. package/dist/terraform/modules/app/agentcore-harness/variables.tf +0 -96
  219. package/dist/terraform/modules/app/hindsight-memory/README.md +0 -89
  220. package/dist/terraform/modules/app/hindsight-memory/main.tf +0 -411
  221. package/dist/terraform/modules/app/lambda-api/agentcore-harness-alarms.tf +0 -88
  222. package/dist/terraform/modules/app/lambda-api/agentcore-identity-alarms.tf +0 -91
  223. package/dist/terraform/modules/data/bedrock-knowledge-base/main.tf +0 -102
  224. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/outputs.tf +0 -0
  225. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/sync-database.py +0 -0
  226. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/test_sync_database.py +0 -0
  227. /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/variables.tf +0 -0
  228. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/README.md +0 -0
  229. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/main.tf +0 -0
  230. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/outputs.tf +0 -0
  231. /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/variables.tf +0 -0
@@ -1,411 +0,0 @@
1
- ################################################################################
2
- # Hindsight Memory (Optional Add-On) — App Module
3
- #
4
- # Optional ECS Fargate + ALB service for Hindsight long-term memory. Only
5
- # created when `enable_hindsight = true`. AgentCore managed memory is
6
- # always on (see ../agentcore-memory) — Hindsight runs alongside it as an
7
- # add-on, not as a replacement.
8
- #
9
- # Hindsight provides hindsight_retain/recall/reflect tools for cross-thread
10
- # organizational memory with entity-graph traversal and cross-encoder
11
- # reranking. It runs local embeddings + reranker and uses the shared Aurora
12
- # PostgreSQL instance with pgvector.
13
- ################################################################################
14
-
15
- variable "stage" {
16
- type = string
17
- }
18
-
19
- variable "vpc_id" {
20
- type = string
21
- }
22
-
23
- variable "subnet_ids" {
24
- type = list(string)
25
- }
26
-
27
- variable "db_security_group_id" {
28
- type = string
29
- }
30
-
31
- variable "database_url" {
32
- type = string
33
- sensitive = true
34
- }
35
-
36
- variable "database_name" {
37
- description = <<-EOT
38
- Dedicated Hindsight database name (THINK-220). Empty (default) keeps the
39
- legacy layout: Hindsight lives in the `hindsight` schema of the primary
40
- database named in database_url. Set (e.g. "thinkwork_hindsight") to point
41
- the service at that database on the same cluster with schema `public` —
42
- the vanilla upstream configuration, which its maintenance-loop discovery
43
- queries require. The database must already exist (bootstrap SQL; Terraform
44
- cannot CREATE DATABASE inside the cluster).
45
- EOT
46
- type = string
47
- default = ""
48
- }
49
-
50
- locals {
51
- # database_url with its path segment swapped for var.database_name.
52
- # Matches "...host:port/<db>" with an optional "?query" tail.
53
- hindsight_database_url = (
54
- var.database_name == ""
55
- ? var.database_url
56
- : replace(var.database_url, "/(/[^/?]+)([?].*)?$/", "/${var.database_name}$2")
57
- )
58
- }
59
-
60
- variable "image_tag" {
61
- description = "Hindsight Docker image tag (ghcr.io/vectorize-io/hindsight:<tag>)"
62
- type = string
63
- default = "0.8.4"
64
- }
65
-
66
- variable "enable_auto_consolidation" {
67
- description = "Run Hindsight's observation consolidation engine automatically after retain. Service-level default; per-bank config overrides apply on top."
68
- type = bool
69
- default = true
70
- }
71
-
72
- variable "consolidation_dedup_threshold" {
73
- description = "Cosine-similarity threshold for near-duplicate observation reconciliation (0.0-1.0; 1.0 disables). Hindsight default is 0.97 — set explicitly so deploys don't drift with image defaults."
74
- type = string
75
- default = "0.97"
76
- }
77
-
78
- variable "retain_llm_model" {
79
- description = "Bedrock model id for Hindsight's retain/extraction pass. Default = Haiku 4.5, validated on image 0.8.4 (THINK-201, 2026-07-06): 12.9% dangling-referent rate vs ~38% for gpt-oss-20b, best usefulness of any measured config, zero Anthropic tool-schema errors (the 0.5.0 incompatibility that caused the THINK-198 incident is fixed upstream). Evidence: docs/solutions/tooling-decisions/hindsight-084-upgrade-validation-2026-07-06.md. Requires image >= 0.8.x for anthropic.* models."
80
- type = string
81
- default = "us.anthropic.claude-haiku-4-5-20251001-v1:0"
82
- }
83
-
84
- variable "observations_mission" {
85
- description = "Service-level default observations mission steering what consolidation synthesizes. Empty string omits the env var so the image default applies. Per-bank overrides apply on top."
86
- type = string
87
- default = "Synthesize durable, institutional facts about the business: customers, projects, decisions, processes, tools, relationships, and recurring patterns. Filter out ephemeral state, secrets, and personal small talk."
88
- }
89
-
90
- data "aws_region" "current" {}
91
-
92
- ################################################################################
93
- # ECS Cluster
94
- ################################################################################
95
-
96
- resource "aws_ecs_cluster" "main" {
97
- name = "thinkwork-${var.stage}-cluster"
98
-
99
- setting {
100
- name = "containerInsights"
101
- value = "enabled"
102
- }
103
-
104
- tags = { Name = "thinkwork-${var.stage}-cluster" }
105
- }
106
-
107
- ################################################################################
108
- # IAM
109
- ################################################################################
110
-
111
- resource "aws_iam_role" "ecs_execution" {
112
- name = "thinkwork-${var.stage}-hindsight-execution"
113
-
114
- assume_role_policy = jsonencode({
115
- Version = "2012-10-17"
116
- Statement = [{
117
- Action = "sts:AssumeRole"
118
- Effect = "Allow"
119
- Principal = { Service = "ecs-tasks.amazonaws.com" }
120
- }]
121
- })
122
- }
123
-
124
- resource "aws_iam_role_policy_attachment" "ecs_execution" {
125
- role = aws_iam_role.ecs_execution.name
126
- policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
127
- }
128
-
129
- resource "aws_iam_role" "ecs_task" {
130
- name = "thinkwork-${var.stage}-hindsight-task"
131
-
132
- assume_role_policy = jsonencode({
133
- Version = "2012-10-17"
134
- Statement = [{
135
- Action = "sts:AssumeRole"
136
- Effect = "Allow"
137
- Principal = { Service = "ecs-tasks.amazonaws.com" }
138
- }]
139
- })
140
- }
141
-
142
- resource "aws_iam_role_policy" "bedrock_access" {
143
- name = "bedrock-access"
144
- role = aws_iam_role.ecs_task.id
145
-
146
- policy = jsonencode({
147
- Version = "2012-10-17"
148
- Statement = [{
149
- Effect = "Allow"
150
- Action = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"]
151
- Resource = "*"
152
- }]
153
- })
154
- }
155
-
156
- ################################################################################
157
- # Security Groups
158
- ################################################################################
159
-
160
- resource "aws_security_group" "hindsight" {
161
- name_prefix = "thinkwork-${var.stage}-hindsight-"
162
- description = "Hindsight ECS task"
163
- vpc_id = var.vpc_id
164
-
165
- ingress {
166
- description = "ALB to Hindsight API"
167
- from_port = 8888
168
- to_port = 8888
169
- protocol = "tcp"
170
- security_groups = [aws_security_group.alb.id]
171
- }
172
-
173
- egress {
174
- from_port = 0
175
- to_port = 0
176
- protocol = "-1"
177
- cidr_blocks = ["0.0.0.0/0"]
178
- }
179
-
180
- tags = { Name = "thinkwork-${var.stage}-hindsight-sg" }
181
- lifecycle { create_before_destroy = true }
182
- }
183
-
184
- resource "aws_security_group" "alb" {
185
- name_prefix = "thinkwork-${var.stage}-hindsight-alb-"
186
- description = "Hindsight ALB"
187
- vpc_id = var.vpc_id
188
-
189
- ingress {
190
- from_port = 80
191
- to_port = 80
192
- protocol = "tcp"
193
- cidr_blocks = ["0.0.0.0/0"]
194
- }
195
-
196
- egress {
197
- from_port = 0
198
- to_port = 0
199
- protocol = "-1"
200
- cidr_blocks = ["0.0.0.0/0"]
201
- }
202
-
203
- tags = { Name = "thinkwork-${var.stage}-hindsight-alb-sg" }
204
- lifecycle { create_before_destroy = true }
205
- }
206
-
207
- resource "aws_security_group_rule" "aurora_from_hindsight" {
208
- type = "ingress"
209
- from_port = 5432
210
- to_port = 5432
211
- protocol = "tcp"
212
- source_security_group_id = aws_security_group.hindsight.id
213
- security_group_id = var.db_security_group_id
214
- }
215
-
216
- ################################################################################
217
- # ALB
218
- ################################################################################
219
-
220
- resource "aws_lb" "hindsight" {
221
- name = "tw-${var.stage}-hindsight"
222
- internal = false
223
- load_balancer_type = "application"
224
- security_groups = [aws_security_group.alb.id]
225
- subnets = var.subnet_ids
226
-
227
- # Synchronous retain runs LLM extraction + auto-consolidation and routinely
228
- # exceeds the 60s ALB default, which returned 504s to the retain Lambda
229
- # while Hindsight was still working (every dead-lettered retain attempt on
230
- # dev showed ~60.1-60.5s backend latency). Must stay above the retain
231
- # Lambda's HINDSIGHT_TIMEOUT_MS so the client, not the ALB, owns timeouts.
232
- idle_timeout = 300
233
-
234
- tags = { Name = "thinkwork-${var.stage}-hindsight-alb" }
235
- }
236
-
237
- resource "aws_lb_target_group" "hindsight" {
238
- name = "tw-${var.stage}-hindsight"
239
- port = 8888
240
- protocol = "HTTP"
241
- vpc_id = var.vpc_id
242
- target_type = "ip"
243
-
244
- health_check {
245
- path = "/health"
246
- port = "8888"
247
- protocol = "HTTP"
248
- healthy_threshold = 2
249
- unhealthy_threshold = 3
250
- timeout = 10
251
- interval = 30
252
- matcher = "200-399"
253
- }
254
-
255
- tags = { Name = "thinkwork-${var.stage}-hindsight-tg" }
256
- }
257
-
258
- resource "aws_lb_listener" "hindsight" {
259
- load_balancer_arn = aws_lb.hindsight.arn
260
- port = 80
261
- protocol = "HTTP"
262
-
263
- default_action {
264
- type = "forward"
265
- target_group_arn = aws_lb_target_group.hindsight.arn
266
- }
267
- }
268
-
269
- ################################################################################
270
- # CloudWatch Logs
271
- ################################################################################
272
-
273
- resource "aws_cloudwatch_log_group" "hindsight" {
274
- name = "/thinkwork/${var.stage}/hindsight"
275
- retention_in_days = 14
276
-
277
- tags = { Name = "thinkwork-${var.stage}-hindsight-logs" }
278
- }
279
-
280
- ################################################################################
281
- # ECS Task Definition
282
- ################################################################################
283
-
284
- resource "aws_ecs_task_definition" "hindsight" {
285
- family = "thinkwork-${var.stage}-hindsight"
286
- requires_compatibilities = ["FARGATE"]
287
- network_mode = "awsvpc"
288
- cpu = 2048
289
- memory = 4096
290
- execution_role_arn = aws_iam_role.ecs_execution.arn
291
- task_role_arn = aws_iam_role.ecs_task.arn
292
-
293
- lifecycle {
294
- precondition {
295
- # A dedicated Hindsight database that is actually the primary database
296
- # would put Hindsight's `public` schema on top of the thinkwork tables.
297
- condition = var.database_name == "" || !endswith(split("?", var.database_url)[0], "/${var.database_name}")
298
- error_message = "database_name must be distinct from the primary database in database_url (THINK-220)."
299
- }
300
- }
301
-
302
- runtime_platform {
303
- operating_system_family = "LINUX"
304
- cpu_architecture = "ARM64"
305
- }
306
-
307
- container_definitions = jsonencode([{
308
- name = "hindsight"
309
- image = "ghcr.io/vectorize-io/hindsight:${var.image_tag}"
310
- essential = true
311
-
312
- portMappings = [{
313
- containerPort = 8888
314
- protocol = "tcp"
315
- }]
316
-
317
- environment = concat([
318
- { name = "HINDSIGHT_API_DATABASE_URL", value = local.hindsight_database_url },
319
- # `public` on a dedicated database is upstream's vanilla layout — the
320
- # maintenance-loop discovery queries only work there (THINK-220).
321
- { name = "HINDSIGHT_API_DATABASE_SCHEMA", value = var.database_name == "" ? "hindsight" : "public" },
322
- { name = "HINDSIGHT_API_VECTOR_EXTENSION", value = "pgvector" },
323
- { name = "HINDSIGHT_API_TEXT_SEARCH_EXTENSION", value = "native" },
324
- { name = "HINDSIGHT_API_RUN_MIGRATIONS_ON_STARTUP", value = "true" },
325
- { name = "HINDSIGHT_API_LLM_PROVIDER", value = "bedrock" },
326
- { name = "HINDSIGHT_API_LLM_MODEL", value = "openai.gpt-oss-20b-1:0" },
327
- { name = "AWS_REGION_NAME", value = data.aws_region.current.name },
328
- { name = "AWS_DEFAULT_REGION", value = data.aws_region.current.name },
329
- { name = "HINDSIGHT_API_RETAIN_LLM_PROVIDER", value = "bedrock" },
330
- { name = "HINDSIGHT_API_RETAIN_LLM_MODEL", value = var.retain_llm_model },
331
- { name = "HINDSIGHT_API_REFLECT_LLM_PROVIDER", value = "bedrock" },
332
- { name = "HINDSIGHT_API_REFLECT_LLM_MODEL", value = "openai.gpt-oss-120b-1:0" },
333
- { name = "HINDSIGHT_API_EMBEDDINGS_PROVIDER", value = "local" },
334
- { name = "HINDSIGHT_API_EMBEDDINGS_LOCAL_MODEL", value = "BAAI/bge-small-en-v1.5" },
335
- { name = "HINDSIGHT_API_RERANKER_PROVIDER", value = "local" },
336
- { name = "HINDSIGHT_API_RERANKER_MAX_CANDIDATES", value = "20" },
337
- { name = "HINDSIGHT_API_RERANKER_LOCAL_BUCKET_BATCHING", value = "true" },
338
- { name = "HINDSIGHT_API_RERANKER_LOCAL_MAX_CONCURRENT", value = "1" },
339
- { name = "HINDSIGHT_API_RECALL_BUDGET_FUNCTION", value = "adaptive" },
340
- { name = "HINDSIGHT_API_RECALL_BUDGET_MIN", value = "5" },
341
- { name = "HINDSIGHT_API_RECALL_BUDGET_MAX", value = "300" },
342
- { name = "HINDSIGHT_API_ENABLE_AUTO_CONSOLIDATION", value = tostring(var.enable_auto_consolidation) },
343
- { name = "HINDSIGHT_API_CONSOLIDATION_DEDUP_THRESHOLD", value = var.consolidation_dedup_threshold },
344
- ],
345
- var.observations_mission != "" ? [
346
- { name = "HINDSIGHT_API_OBSERVATIONS_MISSION", value = var.observations_mission },
347
- ] : [],
348
- )
349
-
350
- logConfiguration = {
351
- logDriver = "awslogs"
352
- options = {
353
- "awslogs-group" = aws_cloudwatch_log_group.hindsight.name
354
- "awslogs-region" = data.aws_region.current.name
355
- "awslogs-stream-prefix" = "hindsight"
356
- }
357
- }
358
-
359
- healthCheck = {
360
- command = ["CMD-SHELL", "curl -f http://localhost:8888/health || exit 1"]
361
- interval = 30
362
- timeout = 10
363
- retries = 3
364
- startPeriod = 300
365
- }
366
- }])
367
-
368
- tags = { Name = "thinkwork-${var.stage}-hindsight" }
369
- }
370
-
371
- ################################################################################
372
- # ECS Service
373
- ################################################################################
374
-
375
- resource "aws_ecs_service" "hindsight" {
376
- name = "thinkwork-${var.stage}-hindsight"
377
- cluster = aws_ecs_cluster.main.id
378
- task_definition = aws_ecs_task_definition.hindsight.arn
379
- desired_count = 1
380
- launch_type = "FARGATE"
381
-
382
- network_configuration {
383
- subnets = var.subnet_ids
384
- security_groups = [aws_security_group.hindsight.id]
385
- assign_public_ip = true
386
- }
387
-
388
- load_balancer {
389
- target_group_arn = aws_lb_target_group.hindsight.arn
390
- container_name = "hindsight"
391
- container_port = 8888
392
- }
393
-
394
- depends_on = [aws_lb_listener.hindsight]
395
-
396
- tags = { Name = "thinkwork-${var.stage}-hindsight" }
397
- }
398
-
399
- ################################################################################
400
- # Outputs
401
- ################################################################################
402
-
403
- output "hindsight_endpoint" {
404
- description = "Hindsight API endpoint (ALB URL)"
405
- value = "http://${aws_lb.hindsight.dns_name}"
406
- }
407
-
408
- output "ecs_cluster_arn" {
409
- description = "ECS cluster ARN"
410
- value = aws_ecs_cluster.main.arn
411
- }
@@ -1,88 +0,0 @@
1
- ################################################################################
2
- # AgentCore Harness retirement-soak operational gates.
3
- #
4
- # These use native AWS/Lambda metrics so they work on a fresh stage without
5
- # pre-creating or importing implicit log groups. alarm_actions remain empty,
6
- # consistent with the other non-cost operational alarms in this module.
7
- ################################################################################
8
-
9
- resource "aws_cloudwatch_metric_alarm" "agentcore_harness_runner_errors" {
10
- count = local.deploy_lambda_handlers && var.enable_agentcore_multiplayer_proof ? 1 : 0
11
-
12
- alarm_name = "thinkwork-${var.stage}-agentcore-harness-runner-errors"
13
- alarm_description = "The AgentCore Harness runner crashed. The turn fails closed and must be reconciled before the retirement soak can pass."
14
- namespace = "AWS/Lambda"
15
- metric_name = "Errors"
16
- statistic = "Sum"
17
- period = 60
18
- evaluation_periods = 1
19
- threshold = 1
20
- comparison_operator = "GreaterThanOrEqualToThreshold"
21
- treat_missing_data = "notBreaching"
22
- alarm_actions = []
23
-
24
- dimensions = {
25
- FunctionName = aws_lambda_function.handler["harness-runner"].function_name
26
- }
27
- }
28
- resource "aws_cloudwatch_metric_alarm" "agentcore_harness_runner_throttles" {
29
- count = local.deploy_lambda_handlers && var.enable_agentcore_multiplayer_proof ? 1 : 0
30
-
31
- alarm_name = "thinkwork-${var.stage}-agentcore-harness-runner-throttles"
32
- alarm_description = "AgentCore Harness turns are being throttled before execution; capacity admission or account concurrency is insufficient."
33
- namespace = "AWS/Lambda"
34
- metric_name = "Throttles"
35
- statistic = "Sum"
36
- period = 60
37
- evaluation_periods = 1
38
- threshold = 1
39
- comparison_operator = "GreaterThanOrEqualToThreshold"
40
- treat_missing_data = "notBreaching"
41
- alarm_actions = []
42
-
43
- dimensions = {
44
- FunctionName = aws_lambda_function.handler["harness-runner"].function_name
45
- }
46
- }
47
-
48
- resource "aws_cloudwatch_metric_alarm" "agentcore_harness_runner_p95" {
49
- count = local.deploy_lambda_handlers && var.enable_agentcore_multiplayer_proof ? 1 : 0
50
-
51
- alarm_name = "thinkwork-${var.stage}-agentcore-harness-runner-p95"
52
- alarm_description = "AgentCore Harness runner p95 exceeded the 120-second retirement-certification threshold."
53
- namespace = "AWS/Lambda"
54
- metric_name = "Duration"
55
- extended_statistic = "p95"
56
- period = 300
57
- evaluation_periods = 5
58
- datapoints_to_alarm = 3
59
- threshold = 120000
60
- comparison_operator = "GreaterThanThreshold"
61
- treat_missing_data = "notBreaching"
62
- alarm_actions = []
63
-
64
- dimensions = {
65
- FunctionName = aws_lambda_function.handler["harness-runner"].function_name
66
- }
67
- }
68
-
69
- resource "aws_cloudwatch_metric_alarm" "agentcore_harness_runner_async_age" {
70
- count = local.deploy_lambda_handlers && var.enable_agentcore_multiplayer_proof ? 1 : 0
71
-
72
- alarm_name = "thinkwork-${var.stage}-agentcore-harness-runner-async-age"
73
- alarm_description = "AgentCore Harness Event invocations waited more than 60 seconds before execution; the runtime path is backlogged."
74
- namespace = "AWS/Lambda"
75
- metric_name = "AsyncEventAge"
76
- extended_statistic = "p95"
77
- period = 60
78
- evaluation_periods = 3
79
- datapoints_to_alarm = 2
80
- threshold = 60000
81
- comparison_operator = "GreaterThanThreshold"
82
- treat_missing_data = "notBreaching"
83
- alarm_actions = []
84
-
85
- dimensions = {
86
- FunctionName = aws_lambda_function.handler["harness-runner"].function_name
87
- }
88
- }
@@ -1,91 +0,0 @@
1
- ################################################################################
2
- # THINK-316 U9 — assertion mint operational gates
3
- #
4
- # The mint emits redacted EMF metrics around only the KMS Sign call. These
5
- # alarms encode the frozen U9 latency and failure thresholds; no assertion,
6
- # subject, tenant, key id, or other caller material is emitted as a dimension.
7
- ################################################################################
8
-
9
- resource "aws_cloudwatch_metric_alarm" "agentcore_turn_assertion_kms_p95" {
10
- count = var.enable_agentcore_multiplayer_proof ? 1 : 0
11
-
12
- alarm_name = "thinkwork-${var.stage}-agentcore-turn-assertion-kms-p95"
13
- alarm_description = "AgentCore turn assertion KMS signing p95 exceeded the frozen 100 ms U9 gate."
14
- namespace = "ThinkWork/AgentCore"
15
- metric_name = "TurnAssertionKmsSignLatency"
16
- extended_statistic = "p95"
17
- comparison_operator = "GreaterThanThreshold"
18
- threshold = 100
19
- period = 60
20
- evaluation_periods = 5
21
- datapoints_to_alarm = 3
22
- treat_missing_data = "notBreaching"
23
- alarm_actions = []
24
-
25
- dimensions = {
26
- Stage = var.stage
27
- }
28
- }
29
-
30
- resource "aws_cloudwatch_metric_alarm" "agentcore_turn_assertion_kms_p99" {
31
- count = var.enable_agentcore_multiplayer_proof ? 1 : 0
32
-
33
- alarm_name = "thinkwork-${var.stage}-agentcore-turn-assertion-kms-p99"
34
- alarm_description = "AgentCore turn assertion KMS signing p99 exceeded the frozen 250 ms U9 gate."
35
- namespace = "ThinkWork/AgentCore"
36
- metric_name = "TurnAssertionKmsSignLatency"
37
- extended_statistic = "p99"
38
- comparison_operator = "GreaterThanThreshold"
39
- threshold = 250
40
- period = 60
41
- evaluation_periods = 5
42
- datapoints_to_alarm = 3
43
- treat_missing_data = "notBreaching"
44
- alarm_actions = []
45
-
46
- dimensions = {
47
- Stage = var.stage
48
- }
49
- }
50
-
51
- resource "aws_cloudwatch_metric_alarm" "agentcore_turn_assertion_kms_failures" {
52
- count = var.enable_agentcore_multiplayer_proof ? 1 : 0
53
-
54
- alarm_name = "thinkwork-${var.stage}-agentcore-turn-assertion-kms-failures"
55
- alarm_description = "AgentCore turn assertion KMS signing failed; new Harness/Gateway assertions fail closed."
56
- namespace = "ThinkWork/AgentCore"
57
- metric_name = "TurnAssertionKmsSignFailures"
58
- statistic = "Sum"
59
- comparison_operator = "GreaterThanThreshold"
60
- threshold = 0
61
- period = 60
62
- evaluation_periods = 1
63
- datapoints_to_alarm = 1
64
- treat_missing_data = "notBreaching"
65
- alarm_actions = []
66
-
67
- dimensions = {
68
- Stage = var.stage
69
- }
70
- }
71
-
72
- resource "aws_cloudwatch_metric_alarm" "agentcore_turn_assertion_lambda_errors" {
73
- count = var.enable_agentcore_multiplayer_proof ? 1 : 0
74
-
75
- alarm_name = "thinkwork-${var.stage}-agentcore-turn-assertion-errors"
76
- alarm_description = "The internal AgentCore assertion mint Lambda failed. No fallback assertion is issued."
77
- namespace = "AWS/Lambda"
78
- metric_name = "Errors"
79
- statistic = "Sum"
80
- comparison_operator = "GreaterThanThreshold"
81
- threshold = 0
82
- period = 60
83
- evaluation_periods = 1
84
- datapoints_to_alarm = 1
85
- treat_missing_data = "notBreaching"
86
- alarm_actions = []
87
-
88
- dimensions = {
89
- FunctionName = aws_lambda_function.handler["turn-assertion-mint"].function_name
90
- }
91
- }
@@ -1,102 +0,0 @@
1
- ################################################################################
2
- # Bedrock Knowledge Base — Data Module
3
- #
4
- # Creates the IAM service role that Bedrock Knowledge Bases need to access
5
- # S3 documents, invoke Titan embeddings, use RDS Data API, and read secrets.
6
- ################################################################################
7
-
8
- variable "stage" {
9
- description = "Deployment stage"
10
- type = string
11
- }
12
-
13
- variable "account_id" {
14
- description = "AWS account ID"
15
- type = string
16
- }
17
-
18
- variable "region" {
19
- description = "AWS region"
20
- type = string
21
- }
22
-
23
- variable "bucket_name" {
24
- description = "S3 bucket name for knowledge base documents"
25
- type = string
26
- }
27
-
28
- data "aws_iam_policy_document" "kb_assume" {
29
- statement {
30
- effect = "Allow"
31
- actions = ["sts:AssumeRole"]
32
- principals {
33
- type = "Service"
34
- identifiers = ["bedrock.amazonaws.com"]
35
- }
36
- condition {
37
- test = "StringEquals"
38
- variable = "aws:SourceAccount"
39
- values = [var.account_id]
40
- }
41
- }
42
- }
43
-
44
- resource "aws_iam_role" "kb_service" {
45
- name = "thinkwork-${var.stage}-kb-service-role"
46
- assume_role_policy = data.aws_iam_policy_document.kb_assume.json
47
- }
48
-
49
- resource "aws_iam_role_policy" "kb_permissions" {
50
- name = "knowledge-base-permissions"
51
- role = aws_iam_role.kb_service.id
52
-
53
- policy = jsonencode({
54
- Version = "2012-10-17"
55
- Statement = [
56
- {
57
- Sid = "S3ReadDocs"
58
- Effect = "Allow"
59
- Action = [
60
- "s3:GetObject",
61
- "s3:ListBucket",
62
- ]
63
- Resource = [
64
- "arn:aws:s3:::${var.bucket_name}",
65
- "arn:aws:s3:::${var.bucket_name}/*",
66
- ]
67
- },
68
- {
69
- Sid = "BedrockEmbedding"
70
- Effect = "Allow"
71
- Action = ["bedrock:InvokeModel"]
72
- Resource = "arn:aws:bedrock:${var.region}::foundation-model/amazon.titan-embed-text-v2:0"
73
- },
74
- {
75
- Sid = "RDSDataAPI"
76
- Effect = "Allow"
77
- Action = [
78
- "rds-data:ExecuteStatement",
79
- "rds-data:BatchExecuteStatement",
80
- ]
81
- Resource = "*"
82
- },
83
- {
84
- Sid = "RDSDescribe"
85
- Effect = "Allow"
86
- Action = ["rds:DescribeDBClusters"]
87
- Resource = "*"
88
- },
89
- {
90
- Sid = "SecretsManager"
91
- Effect = "Allow"
92
- Action = ["secretsmanager:GetSecretValue"]
93
- Resource = "*"
94
- },
95
- ]
96
- })
97
- }
98
-
99
- output "kb_service_role_arn" {
100
- description = "IAM role ARN for Bedrock Knowledge Base service"
101
- value = aws_iam_role.kb_service.arn
102
- }