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,359 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Smoke test the Twenty CRM managed application deployment.
4
- *
5
- * Dry-run is the default. Set SMOKE_ENABLE_TWENTY_MANAGED_APP=1 after deploy
6
- * to read Terraform/API deployment status and probe the public Twenty /healthz
7
- * endpoint when the runtime is enabled.
8
- *
9
- * Optional live env:
10
- * SMOKE_TERRAFORM_DIR=terraform/examples/greenfield
11
- * SMOKE_TWENTY_URL=https://crm.example.com
12
- * SMOKE_TENANT_ID=<tenant-id>
13
- * VITE_GRAPHQL_HTTP_URL, GRAPHQL_HTTP_URL, or API_GRAPHQL_URL
14
- * API_AUTH_SECRET, THINKWORK_API_SECRET, VITE_GRAPHQL_API_KEY, or GRAPHQL_API_KEY
15
- */
16
-
17
- import { execFileSync } from "node:child_process";
18
- import fs from "node:fs";
19
- import path from "node:path";
20
- import process from "node:process";
21
- import { attachSmokeEvidence } from "../../../scripts/smoke/deployment-evidence.mjs";
22
-
23
- const LIVE_ENABLED = process.env.SMOKE_ENABLE_TWENTY_MANAGED_APP === "1";
24
- const TIMEOUT_MS = Number(process.env.SMOKE_TIMEOUT_MS || 15_000);
25
-
26
- const env = {
27
- ...loadEnvFile(),
28
- ...process.env,
29
- };
30
-
31
- const terraformDir = env.SMOKE_TERRAFORM_DIR || "terraform/examples/greenfield";
32
- const apiUrl = first(
33
- env.VITE_GRAPHQL_HTTP_URL,
34
- env.GRAPHQL_HTTP_URL,
35
- env.API_GRAPHQL_URL,
36
- );
37
- const apiSecret = first(env.API_AUTH_SECRET, env.THINKWORK_API_SECRET);
38
- const apiKey = first(
39
- env.VITE_GRAPHQL_API_KEY,
40
- env.APPSYNC_API_KEY,
41
- env.GRAPHQL_API_KEY,
42
- );
43
- const tenantId = first(env.SMOKE_TENANT_ID, env.TENANT_ID);
44
-
45
- if (!LIVE_ENABLED) {
46
- console.log(
47
- JSON.stringify(
48
- await attachSmokeEvidence(
49
- "twenty-managed-app",
50
- {
51
- ok: true,
52
- skippedLive: true,
53
- reason:
54
- "set SMOKE_ENABLE_TWENTY_MANAGED_APP=1 to run the deployed Twenty managed-app smoke",
55
- dryRun: {
56
- terraformDir,
57
- requiredWhenRunning: [
58
- "Terraform outputs in SMOKE_TERRAFORM_DIR or SMOKE_TWENTY_URL",
59
- "Twenty provisioned/runtime deployment status",
60
- ],
61
- optionalGraphqlEnv: [
62
- "SMOKE_TENANT_ID",
63
- "VITE_GRAPHQL_HTTP_URL or GRAPHQL_HTTP_URL or API_GRAPHQL_URL",
64
- "API_AUTH_SECRET or THINKWORK_API_SECRET or VITE_GRAPHQL_API_KEY or GRAPHQL_API_KEY",
65
- ],
66
- verifies: [
67
- "twenty_provisioned false skips cleanly",
68
- "twenty_runtime_enabled true requires HTTPS twenty_url",
69
- "public Twenty /healthz responds successfully",
70
- "optional GraphQL deployment status and managed-app health agree with the public URL",
71
- ],
72
- },
73
- },
74
- env,
75
- ),
76
- null,
77
- 2,
78
- ),
79
- );
80
- process.exit(0);
81
- }
82
-
83
- try {
84
- const result = await runLiveSmoke();
85
- console.log(
86
- JSON.stringify(
87
- await attachSmokeEvidence(
88
- "twenty-managed-app",
89
- { ok: true, ...result },
90
- env,
91
- ),
92
- null,
93
- 2,
94
- ),
95
- );
96
- } catch (error) {
97
- fail(error instanceof Error ? error.message : String(error));
98
- }
99
-
100
- async function runLiveSmoke() {
101
- const terraform = readTerraformOutputs(terraformDir);
102
- const graphql = await readGraphqlStatus().catch((error) => ({
103
- error: error instanceof Error ? error.message : String(error),
104
- }));
105
- const status = resolveStatus({ terraform, graphql });
106
-
107
- if (!status.provisioned) {
108
- return {
109
- skippedLive: true,
110
- reason: "Twenty CRM is not provisioned for this stage.",
111
- terraform,
112
- graphql,
113
- };
114
- }
115
-
116
- if (!status.runtimeEnabled) {
117
- return {
118
- skippedLive: true,
119
- reason: "Twenty CRM is provisioned but runtime is parked.",
120
- status,
121
- terraform,
122
- graphql,
123
- };
124
- }
125
-
126
- if (!status.url) {
127
- throw new Error(
128
- "Twenty runtime is enabled but no public URL was resolved.",
129
- );
130
- }
131
- if (!status.url.startsWith("https://")) {
132
- throw new Error(`Twenty URL must be HTTPS, got ${status.url}.`);
133
- }
134
-
135
- const publicHealth = await probeHealthz(status.url);
136
- const graphqlHealth =
137
- graphql?.deploymentStatus && !graphql.error
138
- ? await readGraphqlHealth().catch((error) => ({
139
- error: error instanceof Error ? error.message : String(error),
140
- }))
141
- : null;
142
-
143
- if (!publicHealth.healthy) {
144
- throw new Error(
145
- `Twenty /healthz failed: HTTP ${publicHealth.statusCode ?? "none"} ${publicHealth.message}`,
146
- );
147
- }
148
- if (graphqlHealth && "healthy" in graphqlHealth && !graphqlHealth.healthy) {
149
- throw new Error(
150
- `GraphQL managed health reported unhealthy: ${graphqlHealth.message}`,
151
- );
152
- }
153
-
154
- return {
155
- status,
156
- publicHealth,
157
- graphqlHealth,
158
- terraform,
159
- graphql,
160
- };
161
- }
162
-
163
- function resolveStatus({ terraform, graphql }) {
164
- const app = graphql?.deploymentStatus?.managedApplications?.find(
165
- (entry) => entry.key === "twenty",
166
- );
167
- return {
168
- provisioned: bool(
169
- firstDefined(
170
- app?.provisioned,
171
- terraform.twenty_provisioned,
172
- !!env.SMOKE_TWENTY_URL,
173
- ),
174
- ),
175
- runtimeEnabled: bool(
176
- firstDefined(
177
- app?.runtimeEnabled,
178
- terraform.twenty_runtime_enabled,
179
- !!env.SMOKE_TWENTY_URL,
180
- ),
181
- ),
182
- url: first(env.SMOKE_TWENTY_URL, app?.url, terraform.twenty_url),
183
- source: app ? "graphql" : terraform.available ? "terraform" : "env",
184
- status: app?.status ?? null,
185
- message: app?.message ?? null,
186
- };
187
- }
188
-
189
- async function probeHealthz(baseUrl) {
190
- const endpoint = new URL("/healthz", baseUrl).toString();
191
- const started = Date.now();
192
- const controller = new AbortController();
193
- const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
194
- try {
195
- const response = await fetch(endpoint, { signal: controller.signal });
196
- const body = await response.text().catch(() => "");
197
- return {
198
- endpoint,
199
- healthy: response.ok,
200
- statusCode: response.status,
201
- latencyMs: Date.now() - started,
202
- message: body.slice(0, 300),
203
- };
204
- } finally {
205
- clearTimeout(timer);
206
- }
207
- }
208
-
209
- function readTerraformOutputs(dir) {
210
- const resolved = path.resolve(dir);
211
- if (!fs.existsSync(resolved)) {
212
- return { available: false, reason: `Terraform dir not found: ${dir}` };
213
- }
214
-
215
- try {
216
- const raw = execFileSync(
217
- "terraform",
218
- ["-chdir=" + resolved, "output", "-json"],
219
- {
220
- encoding: "utf8",
221
- stdio: ["ignore", "pipe", "pipe"],
222
- },
223
- );
224
- const parsed = JSON.parse(raw);
225
- return {
226
- available: true,
227
- twenty_provisioned: outputValue(parsed.twenty_provisioned),
228
- twenty_runtime_enabled: outputValue(parsed.twenty_runtime_enabled),
229
- twenty_url: outputValue(parsed.twenty_url),
230
- twenty_server_log_group_name: outputValue(
231
- parsed.twenty_server_log_group_name,
232
- ),
233
- twenty_worker_log_group_name: outputValue(
234
- parsed.twenty_worker_log_group_name,
235
- ),
236
- twenty_cache_endpoint: outputValue(parsed.twenty_cache_endpoint),
237
- };
238
- } catch (error) {
239
- return {
240
- available: false,
241
- reason: error instanceof Error ? error.message : String(error),
242
- };
243
- }
244
- }
245
-
246
- async function readGraphqlStatus() {
247
- if (!apiUrl || (!apiSecret && !apiKey)) return null;
248
- const data = await gql(`
249
- query TwentySmokeDeploymentStatus {
250
- deploymentStatus {
251
- stage
252
- region
253
- twentyProvisioned
254
- twentyRuntimeEnabled
255
- twentyUrl
256
- managedApplications {
257
- key
258
- status
259
- provisioned
260
- runtimeEnabled
261
- url
262
- message
263
- }
264
- }
265
- }
266
- `);
267
- return data;
268
- }
269
-
270
- async function readGraphqlHealth() {
271
- const data = await gql(`
272
- query TwentySmokeManagedApplicationHealth {
273
- managedApplicationHealthCheck(key: "twenty") {
274
- healthy
275
- statusCode
276
- latencyMs
277
- endpoint
278
- message
279
- }
280
- }
281
- `);
282
- return data.managedApplicationHealthCheck;
283
- }
284
-
285
- async function gql(query) {
286
- const headers = { "content-type": "application/json" };
287
- if (tenantId) headers["x-tenant-id"] = tenantId;
288
- if (apiSecret) headers.authorization = `Bearer ${apiSecret}`;
289
- else headers["x-api-key"] = apiKey;
290
-
291
- const response = await fetch(apiUrl, {
292
- method: "POST",
293
- headers,
294
- body: JSON.stringify({ query }),
295
- });
296
- if (!response.ok) {
297
- throw new Error(
298
- `GraphQL HTTP ${response.status}: ${await response.text()}`,
299
- );
300
- }
301
- const body = await response.json();
302
- if (body.errors?.length) {
303
- throw new Error(`GraphQL errors: ${JSON.stringify(body.errors)}`);
304
- }
305
- return body.data;
306
- }
307
-
308
- function outputValue(entry) {
309
- return entry && Object.prototype.hasOwnProperty.call(entry, "value")
310
- ? entry.value
311
- : undefined;
312
- }
313
-
314
- function firstDefined(...values) {
315
- return values.find((value) => value !== undefined && value !== null);
316
- }
317
-
318
- function bool(value) {
319
- return value === true || value === "true" || value === "1";
320
- }
321
-
322
- function loadEnvFile() {
323
- const explicit = process.env.COMPUTER_ENV_FILE;
324
- if (explicit === "none") return {};
325
- const candidates = [explicit, "apps/web/.env", ".env"].filter(Boolean);
326
-
327
- for (const candidate of candidates) {
328
- const resolved = path.resolve(candidate);
329
- if (!fs.existsSync(resolved)) continue;
330
- return Object.fromEntries(
331
- fs
332
- .readFileSync(resolved, "utf8")
333
- .split(/\r?\n/)
334
- .map((line) => line.trim())
335
- .filter((line) => line && !line.startsWith("#") && line.includes("="))
336
- .map((line) => {
337
- const index = line.indexOf("=");
338
- const key = line.slice(0, index).trim();
339
- const value = line
340
- .slice(index + 1)
341
- .trim()
342
- .replace(/^['"]|['"]$/g, "");
343
- return [key, value];
344
- }),
345
- );
346
- }
347
- return {};
348
- }
349
-
350
- function first(...values) {
351
- return values.find(
352
- (value) => value !== undefined && value !== null && value !== "",
353
- );
354
- }
355
-
356
- function fail(message) {
357
- console.error(JSON.stringify({ ok: false, error: message }, null, 2));
358
- process.exit(1);
359
- }
@@ -1,22 +0,0 @@
1
- {
2
- "name": "@thinkwork/plugin-workos-auth",
3
- "version": "0.0.0",
4
- "private": true,
5
- "type": "module",
6
- "main": "./src/index.ts",
7
- "exports": {
8
- ".": "./src/index.ts",
9
- "./manifest": "./src/manifest.ts",
10
- "./provider-contract": "./src/provider-contract.ts"
11
- },
12
- "scripts": {
13
- "build": "tsc --build",
14
- "typecheck": "tsc --noEmit",
15
- "test": "vitest run"
16
- },
17
- "devDependencies": {
18
- "@thinkwork/plugin-catalog": "workspace:*",
19
- "typescript": "^5.5.0",
20
- "vitest": "^2.0.0"
21
- }
22
- }
@@ -1,30 +0,0 @@
1
- import { workosAuthManifest } from "./manifest";
2
-
3
- export const workosAuthPluginPackage = {
4
- packageKey: "workos-auth",
5
- sourceRoot: "plugins/workos-auth",
6
- manifest: workosAuthManifest,
7
- ownedSources: [
8
- {
9
- kind: "manifest",
10
- path: "plugins/workos-auth/src/manifest.ts",
11
- description:
12
- "WorkOS Auth catalog manifest and Cognito auth-provider component contract.",
13
- },
14
- {
15
- kind: "api",
16
- path: "plugins/workos-auth/src/provider-contract.ts",
17
- description:
18
- "WorkOS Auth provider keys, admin config fields, and U1-approved public option metadata.",
19
- },
20
- {
21
- kind: "tests",
22
- path: "plugins/workos-auth/test",
23
- description: "WorkOS Auth package-local manifest and contract tests.",
24
- },
25
- ],
26
- compatibilityLinks: [],
27
- } as const;
28
-
29
- export { workosAuthManifest };
30
- export * from "./provider-contract";
@@ -1,40 +0,0 @@
1
- import type { PluginManifest } from "@thinkwork/plugin-catalog/contracts";
2
-
3
- import {
4
- WORKOS_AUTH_COGNITO_IDP_NAME,
5
- WORKOS_AUTH_PROVIDER_COMPONENT_KEY,
6
- WORKOS_AUTH_SETTINGS_SURFACE,
7
- workosAuthConfigFields,
8
- workosAuthPublicOptions,
9
- } from "./provider-contract";
10
-
11
- export const workosAuthManifest = {
12
- pluginKey: "workos-auth",
13
- displayName: "WorkOS Auth",
14
- description:
15
- "WorkOS-backed SSO broker that federates through Cognito while keeping Cognito as ThinkWork's final session issuer.",
16
- versions: [
17
- {
18
- version: "0.1.0",
19
- requiredOauthScopes: [],
20
- components: [
21
- {
22
- type: "auth-provider",
23
- key: WORKOS_AUTH_PROVIDER_COMPONENT_KEY,
24
- displayName: "WorkOS Cognito federation",
25
- provider: "workos",
26
- settingsSurface: WORKOS_AUTH_SETTINGS_SURFACE,
27
- cognitoIdentityProviderName: WORKOS_AUTH_COGNITO_IDP_NAME,
28
- configFields: workosAuthConfigFields,
29
- publicOptions: workosAuthPublicOptions,
30
- },
31
- {
32
- type: "ui-surface",
33
- key: "settings",
34
- displayName: "WorkOS Auth settings",
35
- intendedMount: WORKOS_AUTH_SETTINGS_SURFACE,
36
- },
37
- ],
38
- },
39
- ],
40
- } satisfies PluginManifest;
@@ -1,39 +0,0 @@
1
- import type {
2
- AuthProviderConfigField,
3
- AuthProviderPublicOption,
4
- } from "@thinkwork/plugin-catalog/contracts";
5
-
6
- export const WORKOS_AUTH_PROVIDER_COMPONENT_KEY = "workos-auth" as const;
7
- export const WORKOS_AUTH_SETTINGS_SURFACE =
8
- "settings.plugins.workos-auth" as const;
9
- export const WORKOS_AUTH_COGNITO_IDP_NAME = "WorkOSAuth" as const;
10
-
11
- export const workosAuthConfigFields = [
12
- {
13
- key: "issuerUrl",
14
- displayName: "WorkOS AuthKit issuer URL",
15
- required: true,
16
- storage: "metadata",
17
- },
18
- {
19
- key: "clientId",
20
- displayName: "WorkOS OAuth client ID",
21
- required: true,
22
- storage: "metadata",
23
- },
24
- {
25
- key: "clientSecret",
26
- displayName: "WorkOS OAuth client secret",
27
- required: true,
28
- storage: "secret-ref",
29
- },
30
- ] satisfies AuthProviderConfigField[];
31
-
32
- export const workosAuthPublicOptions = [
33
- {
34
- key: "sso",
35
- displayName: "Continue with SSO",
36
- providerSpecific: false,
37
- recommended: true,
38
- },
39
- ] satisfies AuthProviderPublicOption[];
@@ -1,94 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
-
3
- import {
4
- validatePluginManifest,
5
- type AuthProviderComponent,
6
- } from "@thinkwork/plugin-catalog/contracts";
7
- import { defineFirstPartyPluginPackage } from "@thinkwork/plugin-catalog/plugin-package";
8
-
9
- import { workosAuthPluginPackage } from "../src";
10
- import { workosAuthManifest } from "../src/manifest";
11
- import {
12
- WORKOS_AUTH_COGNITO_IDP_NAME,
13
- WORKOS_AUTH_PROVIDER_COMPONENT_KEY,
14
- WORKOS_AUTH_SETTINGS_SURFACE,
15
- workosAuthConfigFields,
16
- workosAuthPublicOptions,
17
- } from "../src/provider-contract";
18
-
19
- function authProviderComponent(): AuthProviderComponent {
20
- const component = workosAuthManifest.versions[0].components.find(
21
- (candidate) => candidate.type === "auth-provider",
22
- );
23
- if (component?.type !== "auth-provider") {
24
- throw new Error("WorkOS Auth manifest is missing auth-provider component");
25
- }
26
- return component;
27
- }
28
-
29
- describe("WorkOS Auth plugin manifest", () => {
30
- it("validates as an auth-provider plugin with a settings surface", () => {
31
- const validated = validatePluginManifest(workosAuthManifest);
32
-
33
- expect(validated.pluginKey).toBe("workos-auth");
34
- expect(validated.displayName).toBe("WorkOS Auth");
35
- expect(validated.versions[0].requiredOauthScopes).toEqual([]);
36
- expect(validated.versions[0].components.map((component) => component.type))
37
- .toEqual(["auth-provider", "ui-surface"]);
38
- });
39
-
40
- it("declares the U1-approved single SSO fallback instead of provider buttons", () => {
41
- const component = authProviderComponent();
42
-
43
- expect(component).toMatchObject({
44
- type: "auth-provider",
45
- key: WORKOS_AUTH_PROVIDER_COMPONENT_KEY,
46
- provider: "workos",
47
- settingsSurface: WORKOS_AUTH_SETTINGS_SURFACE,
48
- cognitoIdentityProviderName: WORKOS_AUTH_COGNITO_IDP_NAME,
49
- });
50
- expect(component.publicOptions).toEqual(workosAuthPublicOptions);
51
- expect(component.publicOptions).toEqual([
52
- {
53
- key: "sso",
54
- displayName: "Continue with SSO",
55
- providerSpecific: false,
56
- recommended: true,
57
- },
58
- ]);
59
- });
60
-
61
- it("models secrets as secret references, never manifest values", () => {
62
- expect(workosAuthConfigFields).toEqual([
63
- {
64
- key: "issuerUrl",
65
- displayName: "WorkOS AuthKit issuer URL",
66
- required: true,
67
- storage: "metadata",
68
- },
69
- {
70
- key: "clientId",
71
- displayName: "WorkOS OAuth client ID",
72
- required: true,
73
- storage: "metadata",
74
- },
75
- {
76
- key: "clientSecret",
77
- displayName: "WorkOS OAuth client secret",
78
- required: true,
79
- storage: "secret-ref",
80
- },
81
- ]);
82
- expect(JSON.stringify(workosAuthManifest)).not.toMatch(
83
- /client_secret|sk_|secretValue|currentValue/,
84
- );
85
- });
86
-
87
- it("defines a first-party package boundary under plugins/workos-auth", () => {
88
- const defined = defineFirstPartyPluginPackage(workosAuthPluginPackage);
89
-
90
- expect(defined.packageKey).toBe("workos-auth");
91
- expect(defined.sourceRoot).toBe("plugins/workos-auth");
92
- expect(defined.compatibilityLinks).toEqual([]);
93
- });
94
- });
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "."
6
- },
7
- "include": ["./**/*.ts"]
8
- }
@@ -1,61 +0,0 @@
1
- # Sandbox base image for the AgentCore Code Interpreter.
2
- #
3
- # Builds a Python 3.12 container with a small, pinned set of libraries
4
- # template authors can rely on without paying the first-turn `pip install`
5
- # tax. Installs sitecustomize.py so the stdout/stderr token redactor is
6
- # active before any user code or framework traceback runs on cold start.
7
- #
8
- # Image tagging is CI-driven (see scripts/build_and_push_sandbox_base.sh).
9
- # Tags are immutable; a bump ships as a reviewable PR.
10
- #
11
- # Build context is the repository root so the COPY line can reach the
12
- # module-owned Python source below.
13
- #
14
- # docker build -f terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base .
15
-
16
- FROM python:3.12-slim AS base
17
-
18
- # ---------------------------------------------------------------------------
19
- # System packages — minimal. The sandbox runs agent code, not a full distro.
20
- # ---------------------------------------------------------------------------
21
- RUN apt-get update && apt-get install -y --no-install-recommends \
22
- ca-certificates \
23
- curl \
24
- git \
25
- && rm -rf /var/lib/apt/lists/*
26
-
27
- # ---------------------------------------------------------------------------
28
- # Blessed Python libraries — pinned to explicit versions per plan R14/R24.
29
- # Bumps happen in reviewable PRs. Runtime `pip install` is still allowed
30
- # (per R15; T2 residual is named), but these baseline packages install once
31
- # at image bake and don't pay the per-turn cost.
32
- # ---------------------------------------------------------------------------
33
- RUN pip install --no-cache-dir \
34
- pandas==2.2.3 \
35
- numpy==2.1.3 \
36
- requests==2.32.3 \
37
- boto3==1.38.0 \
38
- httpx==0.28.1 \
39
- pyyaml==6.0.2 \
40
- openpyxl==3.1.5 \
41
- python-dateutil==2.9.0.post0
42
-
43
- # ---------------------------------------------------------------------------
44
- # sitecustomize.py — the R13 stdout/stderr token redactor. Python
45
- # auto-imports any module named "sitecustomize" on interpreter startup, so
46
- # placing it in site-packages makes the redactor load before any user code
47
- # (and before the framework traceback on cold start). See the module
48
- # docstring for the honestly-scoped invariant and named residual gaps.
49
- # ---------------------------------------------------------------------------
50
- COPY terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py \
51
- /usr/local/lib/python3.12/site-packages/sitecustomize.py
52
-
53
- # ---------------------------------------------------------------------------
54
- # Startup assertion — fail loudly if the module isn't wired up or
55
- # THINKWORK_SANDBOX_SCRUBBER=off slips through to prod. Runs in the same
56
- # image smoke-test CI job that pushes the tag.
57
- # ---------------------------------------------------------------------------
58
- RUN python -c "import sitecustomize; assert sitecustomize.installed(), 'sitecustomize did not install its stdio wrapper on import'; print('sitecustomize: OK')"
59
-
60
- # AgentCore Code Interpreter supplies its own entrypoint; we provide the
61
- # libraries + scrubber only. No CMD/ENTRYPOINT override.