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
@@ -1,25 +0,0 @@
1
- variable "enabled" {
2
- description = "Create the AgentCore Harness trial IAM surface (THINK-311 U4). Pure-IAM and inert — nothing invokes Harness until U5 — so it defaults on; flip off to remove the role without touching root variables."
3
- type = bool
4
- default = true
5
- }
6
-
7
- variable "stage" {
8
- description = "Deployment stage (dev, prod, etc.)"
9
- type = string
10
- }
11
-
12
- variable "region" {
13
- description = "AWS region"
14
- type = string
15
- }
16
-
17
- variable "account_id" {
18
- description = "AWS account ID"
19
- type = string
20
- }
21
-
22
- variable "bucket_name" {
23
- description = "Stage workspace S3 bucket name — Harness microVMs read tenant skill sources under tenants/*"
24
- type = string
25
- }
@@ -1,89 +0,0 @@
1
- # Hindsight Memory Module (canonical user and Space memory)
2
-
3
- Thinkwork provisions AgentCore managed memory as an AWS platform primitive, but
4
- full ThinkWork installs use **Hindsight** as the canonical user and Space memory
5
- provider. AgentCore-only memory remains available as an explicit
6
- low-cost/development opt-out.
7
-
8
- ## Memory layers
9
-
10
- | Layer | Backend | Always on | What it stores |
11
- | --------------------- | ----------------------- | ----------------------------- | ------------------------------------------------------------------------------ |
12
- | 1. Workspace files | S3 per-agent | Yes | Scratchpad, working files |
13
- | 2. Thread history | Aurora `messages` table | Yes | Last 30 turns per thread |
14
- | 3a. Managed long-term | AgentCore Memory | **Yes** | AWS platform memory primitive and low-cost/development fallback |
15
- | 3b. Product long-term | Hindsight ECS service | **Default for full installs** | Canonical user/Space memory with entity graph + BM25 + cross-encoder reranking |
16
-
17
- ## How retention works
18
-
19
- The agent container automatically emits a `CreateEvent` into AgentCore
20
- Memory after every turn (user message + assistant response), via
21
- `memory.store_turn_pair` in `packages/agentcore/agent-container/memory.py`.
22
- AgentCore's background strategies extract facts into four namespaces:
23
-
24
- - `assistant_{actorId}` — semantic facts
25
- - `preferences_{actorId}` — user preferences
26
- - `session_{sessionId}` — session summaries
27
- - `episodes_{actorId}/{sessionId}` — episodic memory
28
-
29
- The agent reads them back via the `recall()` tool. There is no need for
30
- the model to call `remember()` for routine facts — it only exists for
31
- user-driven "please remember X" requests.
32
-
33
- When Hindsight is enabled, the container ALSO registers
34
- `hindsight_retain`, `hindsight_recall`, and `hindsight_reflect` tools that
35
- route to the Hindsight service. `remember()` dual-writes to both backends
36
- so explicit memories land in both systems.
37
-
38
- ## Usage
39
-
40
- ### Default — Hindsight canonical memory
41
-
42
- ```hcl
43
- module "thinkwork" {
44
- source = "thinkwork-ai/thinkwork/aws"
45
-
46
- stage = "prod"
47
- # enable_hindsight defaults to true
48
- }
49
- ```
50
-
51
- The `terraform/modules/app/agentcore-memory` module is still instantiated, but
52
- the active user/Space memory engine resolves to Hindsight.
53
-
54
- ### Low-cost/development AgentCore-only opt-out
55
-
56
- ```hcl
57
- module "thinkwork" {
58
- source = "thinkwork-ai/thinkwork/aws"
59
-
60
- stage = "prod"
61
- enable_hindsight = false
62
- memory_engine = "agentcore"
63
-
64
- # This is not the full product memory path.
65
- }
66
- ```
67
-
68
- When `enable_hindsight = true`, Terraform creates:
69
-
70
- - ECS Fargate cluster + service (ARM64, 2 vCPU, 4 GB)
71
- - Application Load Balancer
72
- - Security groups (ALB → Hindsight → Aurora ingress)
73
- - CloudWatch log group
74
-
75
- Cost: ~$75/mo (ARM64 Fargate + ALB hours).
76
-
77
- ## Turning Hindsight on/off
78
-
79
- Toggling `enable_hindsight` and re-running `thinkwork deploy`:
80
-
81
- - **false → true**: creates the ECS + ALB infra. Agents gain the three
82
- `hindsight_*` tools on their next invoke. The active memory engine resolves
83
- to Hindsight when `memory_engine` is empty.
84
- - **true → false**: destroys the ECS + ALB infra. Agents lose the
85
- `hindsight_*` tools. This should be paired with `memory_engine = "agentcore"`
86
- for explicit low-cost/development deployments.
87
-
88
- Memory data is not migrated between backends. Hindsight records and
89
- AgentCore records live in separate stores.
@@ -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,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
- }