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.
- package/README.md +3 -14
- package/dist/{api-client-JYZXYQJR.js → api-client-4P4JZOBX.js} +1 -1
- package/dist/{chunk-Z2F6RJFR.js → chunk-4OMDWYZQ.js} +4 -5
- package/dist/{chunk-ILZKG5WV.js → chunk-AD2NIWB5.js} +434 -69
- package/dist/chunk-MWQ7RO76.js +137 -0
- package/dist/{chunk-DVPBI5HM.js → chunk-OLUQ4U2Z.js} +26 -26
- package/dist/{chunk-QOERT44A.js → chunk-YQCYD6NE.js} +57 -44
- package/dist/cli.js +4400 -16431
- package/dist/commands/enterprise/templates/deploy-repo/scripts/apply-release.mjs +0 -1
- package/dist/commands/enterprise/templates/deploy-repo/scripts/smoke.mjs +0 -1
- package/dist/commands/enterprise/templates/deploy-repo/terraform/main.tf +0 -14
- package/dist/{dist-es-CRV46D5B.js → dist-es-2OTNTL4N.js} +4 -4
- package/dist/{dist-es-ENBUC3JP.js → dist-es-2XVAH4BQ.js} +2 -2
- package/dist/{dist-es-DCY4IC3Y.js → dist-es-3DPDUJAH.js} +2 -2
- package/dist/{dist-es-G7PTG75M.js → dist-es-BNZTBBVC.js} +1 -1
- package/dist/{dist-es-GKDBE7E6.js → dist-es-CD2RBDAC.js} +1 -1
- package/dist/{dist-es-R7FGL2IB.js → dist-es-I4FW57PS.js} +1 -1
- package/dist/{dist-es-USORBXZ5.js → dist-es-KVFWJNDY.js} +4 -4
- package/dist/{dist-es-HY3535OI.js → dist-es-PS73DWNL.js} +2 -2
- package/dist/{dist-es-LDE437AM.js → dist-es-S3NZQFGT.js} +1 -1
- package/dist/{dist-es-G54LBMRN.js → dist-es-SGCA4P32.js} +1 -1
- package/dist/{dist-es-Q57SZXZ7.js → dist-es-WBM6J4RA.js} +2 -2
- package/dist/{dist-es-P26FWFLT.js → dist-es-ZGVADYIF.js} +8 -8
- package/dist/drizzle/0227_analyst_reader_role.sql +17 -26
- package/dist/drizzle/0230_analyst_rls.sql +28 -45
- package/dist/drizzle/0261_native_auth_control_plane.sql +7 -3
- package/dist/drizzle/0270_tool_execution_ledger.sql +115 -0
- package/dist/drizzle/0271_ontology_twin_declarations.sql +47 -0
- package/dist/drizzle/0272_identity_graph_projection_cursor.sql +23 -0
- package/dist/drizzle/0273_twin_materialization_suggestions.sql +29 -0
- package/dist/drizzle/0274_tenant_mcp_twin_keys.sql +59 -0
- package/dist/drizzle/0275_identity_bulk_rebuild_fence.sql +30 -0
- package/dist/drizzle/0276_tool_execution_ledger_allow_cascade_delete.sql +18 -0
- package/dist/drizzle/0277_knowledge_base_sources.sql +107 -0
- package/dist/drizzle/0278_kb_page_transcription.sql +55 -0
- package/dist/drizzle/0279_mcp_servers_off_plugin_provenance.sql +93 -0
- package/dist/drizzle/0280_work_item_external_refs_drop_plane_provider.sql +46 -0
- package/dist/drizzle/0281_tenant_mcp_twin_keys_expiry_suffix.sql +9 -0
- package/dist/drizzle/0282_tenant_mcp_twin_keys_grants.sql +24 -0
- package/dist/drizzle/0283_agents_agentcore_runtime_dispatch.sql +13 -0
- package/dist/drizzle/0284_user_brain_claims.sql +69 -0
- package/dist/drizzle/0285_tenant_mcp_twin_keys_trusted_subsystem.sql +30 -0
- package/dist/drizzle/0286_brain_analytics_key.sql +26 -0
- package/dist/drizzle/0287_brain_subject.sql +25 -0
- package/dist/drizzle/0288_multi_lane_identities.sql +25 -0
- package/dist/{loadSso-DJVB7BXE.js → loadSso-ETCXTR4I.js} +2 -2
- package/dist/{loadSso-JAMNA3WY.js → loadSso-UBD7KUHE.js} +2 -2
- package/dist/plugins/README.md +2 -2
- package/dist/plugins/catalog/package.json +0 -3
- package/dist/plugins/catalog/src/__tests__/build-catalog.test.ts +6 -3
- package/dist/plugins/catalog/src/__tests__/catalog.test.ts +21 -21
- package/dist/plugins/catalog/src/__tests__/contracts.test.ts +102 -25
- package/dist/plugins/catalog/src/__tests__/plugin-package.test.ts +7 -6
- package/dist/plugins/catalog/src/__tests__/plugin-registry.test.ts +0 -15
- package/dist/plugins/catalog/src/contracts.ts +15 -0
- package/dist/plugins/catalog/src/registry/generated-first-party.ts +0 -18
- package/dist/plugins/n8n/test/integrated-app-contract.test.ts +1 -1
- package/dist/plugins/twenty/package.json +2 -1
- package/dist/plugins/twenty/scripts/LAMBDA_DEPLOY.md +114 -0
- package/dist/plugins/twenty/scripts/build-lambda.sh +29 -0
- package/dist/plugins/twenty/scripts/configure-product-views.ts +195 -0
- package/dist/plugins/twenty/scripts/lambda-handler.ts +49 -0
- package/dist/plugins/twenty/scripts/lib/__tests__/load-attachments.test.ts +38 -0
- package/dist/plugins/twenty/scripts/lib/__tests__/load-records.test.ts +145 -2
- package/dist/plugins/twenty/scripts/lib/__tests__/mappers.test.ts +397 -151
- package/dist/plugins/twenty/scripts/lib/__tests__/members-ensure.test.ts +28 -129
- package/dist/plugins/twenty/scripts/lib/__tests__/provision-members-db.test.ts +10 -0
- package/dist/plugins/twenty/scripts/lib/__tests__/schema-ensure.test.ts +13 -8
- package/dist/plugins/twenty/scripts/lib/lastmile-reader.ts +222 -2
- package/dist/plugins/twenty/scripts/lib/load-attachments.ts +29 -0
- package/dist/plugins/twenty/scripts/lib/load-records.ts +160 -43
- package/dist/plugins/twenty/scripts/lib/mappers.ts +368 -152
- package/dist/plugins/twenty/scripts/lib/members-ensure.ts +43 -268
- package/dist/plugins/twenty/scripts/lib/provision-members-db.ts +57 -0
- package/dist/plugins/twenty/scripts/lib/schema-ensure.ts +136 -31
- package/dist/plugins/twenty/scripts/migrate-lastmile.ts +254 -152
- package/dist/plugins/twenty/scripts/provision-twenty-members.ts +44 -1
- package/dist/plugins/twenty/scripts/purge-lastmile-import.ts +178 -0
- package/dist/plugins/twenty/scripts/restructure-products.ts +312 -0
- package/dist/plugins/twenty/scripts/retag-stage-values.ts +362 -0
- package/dist/plugins/twenty/test/manifest.test.ts +2 -4
- package/dist/scripts/post-deploy.sh +79 -1
- package/dist/{signin-UGDWTGS4.js → signin-5QZNRSOO.js} +2 -2
- package/dist/{sso-oidc-Q4VXANXY.js → sso-oidc-XK673P54.js} +2 -2
- package/dist/{sts-CWLSE3GH.js → sts-OXI2UALF.js} +6 -134
- package/dist/{sts-DNZLNVOV.js → sts-SQW4NBK3.js} +6 -134
- package/dist/terraform/examples/greenfield/main.tf +233 -175
- package/dist/terraform/examples/greenfield/terraform.tfvars.example +12 -8
- package/dist/terraform/modules/app/agentcore-admin/main.tf +47 -0
- package/dist/terraform/modules/app/agentcore-code-interpreter/README.md +39 -47
- package/dist/terraform/modules/app/agentcore-code-interpreter/main.tf +13 -66
- package/dist/terraform/modules/app/agentcore-identity/main.tf +106 -26
- package/dist/terraform/modules/app/agentcore-identity/outputs.tf +6 -6
- package/dist/terraform/modules/app/agentcore-identity/scripts/bootstrap_twenty_oauth_client.sh +216 -99
- package/dist/terraform/modules/app/agentcore-identity/scripts/delete_identity.sh +6 -9
- package/dist/terraform/modules/app/agentcore-identity/scripts/delete_workload_identity.sh +19 -0
- package/dist/terraform/modules/app/agentcore-identity/scripts/ensure_workload_identity.sh +29 -0
- package/dist/terraform/modules/app/agentcore-identity/scripts/read_identity.sh +22 -7
- package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_identity.sh +17 -46
- package/dist/terraform/modules/app/agentcore-identity/scripts/reconcile_twenty_provider.mjs +65 -3
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/after.tf +15 -0
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/before.tf +7 -0
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-after.tf +8 -0
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/identity-before.tf +9 -0
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-after.tf +3 -0
- package/dist/terraform/modules/app/agentcore-identity/tests/tainted-marker/thinkwork-before.tf +3 -0
- package/dist/terraform/modules/app/agentcore-identity/variables.tf +6 -0
- package/dist/terraform/modules/app/agentcore-memory/README.md +46 -9
- package/dist/terraform/modules/app/agentcore-memory/main.tf +27 -10
- package/dist/terraform/modules/app/agentcore-memory/scripts/create_or_find_memory.sh +156 -24
- package/dist/terraform/modules/app/agentcore-pi/README.md +1 -3
- package/dist/terraform/modules/app/agentcore-pi/main.tf +42 -52
- package/dist/terraform/modules/app/agentcore-pi/outputs.tf +3 -3
- package/dist/terraform/modules/app/agentcore-pi/scripts/reconcile_pi_runtime.mjs +175 -0
- package/dist/terraform/modules/app/agentcore-pi/variables.tf +35 -28
- package/dist/terraform/modules/app/agentcore-platform/main.tf +68 -0
- package/dist/terraform/modules/app/agentcore-runtime/main.tf +4 -20
- package/dist/terraform/modules/app/capability-broker/main.tf +2 -2
- package/dist/terraform/modules/app/capability-broker/variables.tf +11 -0
- package/dist/terraform/modules/app/deployment-control-plane/README.md +264 -0
- package/dist/terraform/modules/app/deployment-control-plane/buildspec.yml +4 -1
- package/dist/terraform/modules/app/deployment-control-plane/main.tf +94 -0
- package/dist/terraform/modules/app/deployment-control-plane/outputs.tf +5 -0
- package/dist/terraform/modules/app/deployment-control-plane/runner.py +2641 -124
- package/dist/terraform/modules/app/deployment-control-plane/test_runner_bundle.py +2034 -154
- package/dist/terraform/modules/app/deployment-control-plane/variables.tf +33 -0
- package/dist/terraform/modules/app/lambda-api/auth-state.tf +72 -0
- package/dist/terraform/modules/app/lambda-api/chat-latency-observability.tf +466 -0
- package/dist/terraform/modules/app/lambda-api/dispatch-dlq.tf +55 -0
- package/dist/terraform/modules/app/lambda-api/handlers.tf +411 -723
- package/dist/terraform/modules/app/lambda-api/iam-grouped.tf +262 -198
- package/dist/terraform/modules/app/lambda-api/main.tf +51 -13
- package/dist/terraform/modules/app/lambda-api/mcp-oauth.tf +4 -181
- package/dist/terraform/modules/app/lambda-api/memory-alarms.tf +3 -28
- package/dist/terraform/modules/app/lambda-api/oauth-secrets.tf +1 -2
- package/dist/terraform/modules/app/lambda-api/outputs.tf +17 -45
- package/dist/terraform/modules/app/lambda-api/turn-assertion.tf +45 -0
- package/dist/terraform/modules/app/lambda-api/variables.tf +219 -126
- package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/README.md +1 -1
- package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/main.tf +18 -18
- package/dist/terraform/modules/app/sandbox-log-scrubber/README.md +11 -10
- package/dist/terraform/modules/app/sandbox-log-scrubber/main.tf +5 -5
- package/dist/terraform/modules/app/static-site/main.tf +1 -1
- package/dist/terraform/modules/app/www-dns/main.tf +9 -27
- package/dist/terraform/modules/app/www-dns/variables.tf +4 -10
- package/dist/terraform/modules/data/aurora-postgres/README.md +34 -0
- package/dist/terraform/modules/data/aurora-postgres/alarms.tf +82 -0
- package/dist/terraform/modules/data/aurora-postgres/main.tf +27 -57
- package/dist/terraform/modules/data/aurora-postgres/outputs.tf +0 -9
- package/dist/terraform/modules/data/aurora-postgres/variables.tf +41 -0
- package/dist/terraform/modules/data/s3-buckets/main.tf +5 -6
- package/dist/terraform/modules/foundation/cognito/main.tf +81 -8
- package/dist/terraform/modules/foundation/cognito/outputs.tf +5 -0
- package/dist/terraform/modules/foundation/cognito/variables.tf +24 -12
- package/dist/terraform/modules/thinkwork/README.md +5 -1
- package/dist/terraform/modules/thinkwork/main.tf +376 -374
- package/dist/terraform/modules/thinkwork/outputs.tf +12 -158
- package/dist/terraform/modules/thinkwork/variables.tf +246 -89
- package/dist/workspace-defaults/files/INSTRUCTIONS.md +9 -11
- package/dist/workspace-defaults/files/MEMORY_GUIDE.md +38 -35
- package/dist/workspace-defaults/files/ROUTER.md +1 -1
- package/dist/workspace-defaults/files/TOOLS.md +9 -39
- package/dist/workspace-defaults/files/agents/analyst/INSTRUCTIONS.md +6 -3
- package/dist/workspace-defaults/files/catalog-skills/brain-brief-builder/SKILL.md +165 -0
- package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/SKILL.md +75 -0
- package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/mcp-tooling.md +40 -0
- package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/validation-and-handoff.md +40 -0
- package/dist/workspace-defaults/files/catalog-skills/n8n-workflow-operator/references/workflow-authoring.md +46 -0
- package/dist/workspace-defaults/files/skills/artifact-builder/references/crm-dashboard.md +1 -1
- package/dist/workspace-defaults/files/skills/document-composer/SKILL.md +22 -3
- package/package.json +1 -1
- package/dist/drizzle/0261_managed_harness_multiplayer.sql +0 -313
- package/dist/drizzle/0262_parallel_harness_threads.sql +0 -9
- package/dist/drizzle/0264_harness_tool_execution_ledger.sql +0 -113
- package/dist/plugins/company-data/README.md +0 -49
- package/dist/plugins/company-data/package.json +0 -21
- package/dist/plugins/company-data/src/index.ts +0 -30
- package/dist/plugins/company-data/src/manifest.ts +0 -26
- package/dist/plugins/company-data/test/manifest.test.ts +0 -116
- package/dist/plugins/company-data/tsconfig.json +0 -8
- package/dist/plugins/company-etl/README.md +0 -46
- package/dist/plugins/company-etl/package.json +0 -21
- package/dist/plugins/company-etl/src/index.ts +0 -29
- package/dist/plugins/company-etl/src/manifest.ts +0 -26
- package/dist/plugins/company-etl/test/manifest.test.ts +0 -108
- package/dist/plugins/company-etl/tsconfig.json +0 -8
- package/dist/plugins/lastmile/README.md +0 -50
- package/dist/plugins/lastmile/package.json +0 -23
- package/dist/plugins/lastmile/smoke/lastmile-plugin-smoke.mjs +0 -661
- package/dist/plugins/lastmile/src/api/tasks-adapter.ts +0 -572
- package/dist/plugins/lastmile/src/discovery.fixture.ts +0 -64
- package/dist/plugins/lastmile/src/index.ts +0 -46
- package/dist/plugins/lastmile/src/manifest.ts +0 -139
- package/dist/plugins/lastmile/test/api/tasks-adapter.test.ts +0 -266
- package/dist/plugins/lastmile/test/discovery.test.ts +0 -88
- package/dist/plugins/lastmile/tsconfig.json +0 -8
- package/dist/plugins/n8n/smoke/n8n-managed-app-smoke.mjs +0 -409
- package/dist/plugins/twenty/smoke/twenty-managed-app-smoke.mjs +0 -359
- package/dist/terraform/modules/app/agentcore-code-interpreter/Dockerfile.sandbox-base +0 -61
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/sitecustomize.py +0 -227
- package/dist/terraform/modules/app/agentcore-code-interpreter/sandbox/test_sitecustomize.py +0 -277
- package/dist/terraform/modules/app/agentcore-code-interpreter/scripts/build_and_push_sandbox_base.sh +0 -70
- package/dist/terraform/modules/app/agentcore-gateway/main.tf +0 -305
- package/dist/terraform/modules/app/agentcore-gateway/outputs.tf +0 -44
- package/dist/terraform/modules/app/agentcore-gateway/scripts/delete_gateway.sh +0 -93
- package/dist/terraform/modules/app/agentcore-gateway/scripts/read_gateway.sh +0 -33
- package/dist/terraform/modules/app/agentcore-gateway/scripts/reconcile_gateway.sh +0 -543
- package/dist/terraform/modules/app/agentcore-gateway/variables.tf +0 -70
- package/dist/terraform/modules/app/agentcore-harness/main.tf +0 -330
- package/dist/terraform/modules/app/agentcore-harness/outputs.tf +0 -72
- package/dist/terraform/modules/app/agentcore-harness/scripts/delete_harness.sh +0 -5
- package/dist/terraform/modules/app/agentcore-harness/scripts/harness-lifecycle.mjs +0 -430
- package/dist/terraform/modules/app/agentcore-harness/scripts/harness-readback.mjs +0 -180
- package/dist/terraform/modules/app/agentcore-harness/scripts/harness-tool-contract.mjs +0 -193
- package/dist/terraform/modules/app/agentcore-harness/scripts/prune_harness.sh +0 -5
- package/dist/terraform/modules/app/agentcore-harness/scripts/read_harness.sh +0 -5
- package/dist/terraform/modules/app/agentcore-harness/scripts/reconcile_harness.sh +0 -5
- package/dist/terraform/modules/app/agentcore-harness/variables.tf +0 -96
- package/dist/terraform/modules/app/hindsight-memory/README.md +0 -89
- package/dist/terraform/modules/app/hindsight-memory/main.tf +0 -411
- package/dist/terraform/modules/app/lambda-api/agentcore-harness-alarms.tf +0 -88
- package/dist/terraform/modules/app/lambda-api/agentcore-identity-alarms.tf +0 -91
- package/dist/terraform/modules/data/bedrock-knowledge-base/main.tf +0 -102
- /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/outputs.tf +0 -0
- /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/sync-database.py +0 -0
- /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/scripts/test_sync_database.py +0 -0
- /package/dist/{plugins/n8n/terraform → terraform/modules/app}/n8n/variables.tf +0 -0
- /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/README.md +0 -0
- /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/main.tf +0 -0
- /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/outputs.tf +0 -0
- /package/dist/{plugins/twenty/terraform → terraform/modules/app}/twenty/variables.tf +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Reconcile the Pi Bedrock AgentCore Runtime to a digest-pinned image
|
|
3
|
+
// (THINK-584 U5). Invoked by the deployment-control-plane runner with a JSON
|
|
4
|
+
// request on STDIN (never argv — the mirrored env contains secrets):
|
|
5
|
+
//
|
|
6
|
+
// {
|
|
7
|
+
// "region": "us-east-1",
|
|
8
|
+
// "runtimeName": "thinkwork_<stage>_pi",
|
|
9
|
+
// "runtimeId": "<optional known id>",
|
|
10
|
+
// "roleArn": "arn:aws:iam::...:role/thinkwork-<stage>-agentcore-pi-role",
|
|
11
|
+
// "imageUri": "<account>.dkr.ecr...amazonaws.com/...@sha256:<digest>",
|
|
12
|
+
// "environment": { ... mirrored Lambda env, control chars escaped ... },
|
|
13
|
+
// "waitSeconds": 900
|
|
14
|
+
// }
|
|
15
|
+
//
|
|
16
|
+
// Creates the runtime when absent, updates it when present, then waits for
|
|
17
|
+
// runtime READY + DEFAULT endpoint liveVersion == runtime version + the
|
|
18
|
+
// exact image URI. Prints a result JSON on stdout. Env VALUES are never
|
|
19
|
+
// printed — counts only (R19).
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
BedrockAgentCoreControlClient,
|
|
23
|
+
CreateAgentRuntimeCommand,
|
|
24
|
+
GetAgentRuntimeCommand,
|
|
25
|
+
ListAgentRuntimesCommand,
|
|
26
|
+
ListAgentRuntimeEndpointsCommand,
|
|
27
|
+
UpdateAgentRuntimeCommand,
|
|
28
|
+
} from "@aws-sdk/client-bedrock-agentcore-control";
|
|
29
|
+
|
|
30
|
+
if (process.argv[2] === "--runtime-preflight") {
|
|
31
|
+
process.stdout.write(
|
|
32
|
+
JSON.stringify({
|
|
33
|
+
entrypoint: "reconcile_pi_runtime",
|
|
34
|
+
sdkImportReady:
|
|
35
|
+
typeof BedrockAgentCoreControlClient === "function" &&
|
|
36
|
+
typeof CreateAgentRuntimeCommand === "function" &&
|
|
37
|
+
typeof GetAgentRuntimeCommand === "function" &&
|
|
38
|
+
typeof ListAgentRuntimesCommand === "function" &&
|
|
39
|
+
typeof ListAgentRuntimeEndpointsCommand === "function" &&
|
|
40
|
+
typeof UpdateAgentRuntimeCommand === "function",
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const chunks = [];
|
|
47
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
48
|
+
const input = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
49
|
+
|
|
50
|
+
const environment = input.environment ?? {};
|
|
51
|
+
const envCount = Object.keys(environment).length;
|
|
52
|
+
if (envCount === 0) {
|
|
53
|
+
// Atomic-or-abort: an empty mirrored env would strand the runtime.
|
|
54
|
+
process.stderr.write(
|
|
55
|
+
"reconcile_pi_runtime: refusing to proceed with an empty environment mirror\n",
|
|
56
|
+
);
|
|
57
|
+
process.exit(2);
|
|
58
|
+
}
|
|
59
|
+
if (!/@sha256:[0-9a-f]{64}$/.test(input.imageUri ?? "")) {
|
|
60
|
+
process.stderr.write(
|
|
61
|
+
"reconcile_pi_runtime: imageUri must be pinned to an immutable sha256 digest\n",
|
|
62
|
+
);
|
|
63
|
+
process.exit(2);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const client = new BedrockAgentCoreControlClient({ region: input.region });
|
|
67
|
+
|
|
68
|
+
let runtimeId = input.runtimeId || "";
|
|
69
|
+
if (!runtimeId) {
|
|
70
|
+
let nextToken;
|
|
71
|
+
do {
|
|
72
|
+
const page = await client.send(new ListAgentRuntimesCommand({ nextToken }));
|
|
73
|
+
const match = (page.agentRuntimes ?? []).find(
|
|
74
|
+
(runtime) => runtime.agentRuntimeName === input.runtimeName,
|
|
75
|
+
);
|
|
76
|
+
if (match) {
|
|
77
|
+
runtimeId = match.agentRuntimeId;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
nextToken = page.nextToken;
|
|
81
|
+
} while (nextToken);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const artifact = {
|
|
85
|
+
containerConfiguration: { containerUri: input.imageUri },
|
|
86
|
+
};
|
|
87
|
+
let created = false;
|
|
88
|
+
if (runtimeId) {
|
|
89
|
+
await client.send(
|
|
90
|
+
new UpdateAgentRuntimeCommand({
|
|
91
|
+
agentRuntimeId: runtimeId,
|
|
92
|
+
roleArn: input.roleArn,
|
|
93
|
+
agentRuntimeArtifact: artifact,
|
|
94
|
+
networkConfiguration: { networkMode: "PUBLIC" },
|
|
95
|
+
protocolConfiguration: { serverProtocol: "HTTP" },
|
|
96
|
+
environmentVariables: environment,
|
|
97
|
+
}),
|
|
98
|
+
);
|
|
99
|
+
} else {
|
|
100
|
+
const response = await client.send(
|
|
101
|
+
new CreateAgentRuntimeCommand({
|
|
102
|
+
agentRuntimeName: input.runtimeName,
|
|
103
|
+
roleArn: input.roleArn,
|
|
104
|
+
agentRuntimeArtifact: artifact,
|
|
105
|
+
networkConfiguration: { networkMode: "PUBLIC" },
|
|
106
|
+
protocolConfiguration: { serverProtocol: "HTTP" },
|
|
107
|
+
environmentVariables: environment,
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
runtimeId = response.agentRuntimeId;
|
|
111
|
+
created = true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const sleep = (milliseconds) =>
|
|
115
|
+
new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
116
|
+
|
|
117
|
+
const waitSeconds = Number(input.waitSeconds ?? 900);
|
|
118
|
+
const deadline = Date.now() + waitSeconds * 1000;
|
|
119
|
+
let detail;
|
|
120
|
+
let endpoint;
|
|
121
|
+
for (;;) {
|
|
122
|
+
detail = await client.send(
|
|
123
|
+
new GetAgentRuntimeCommand({ agentRuntimeId: runtimeId }),
|
|
124
|
+
);
|
|
125
|
+
const endpoints = await client.send(
|
|
126
|
+
new ListAgentRuntimeEndpointsCommand({ agentRuntimeId: runtimeId }),
|
|
127
|
+
);
|
|
128
|
+
endpoint = (endpoints.runtimeEndpoints ?? []).find(
|
|
129
|
+
(candidate) => candidate.name === "DEFAULT",
|
|
130
|
+
);
|
|
131
|
+
const mirroredCount = Object.keys(detail.environmentVariables ?? {}).length;
|
|
132
|
+
const image =
|
|
133
|
+
detail.agentRuntimeArtifact?.containerConfiguration?.containerUri ?? "";
|
|
134
|
+
const settled =
|
|
135
|
+
detail.status === "READY" &&
|
|
136
|
+
endpoint?.status === "READY" &&
|
|
137
|
+
(endpoint?.targetVersion == null ||
|
|
138
|
+
endpoint.targetVersion === detail.agentRuntimeVersion) &&
|
|
139
|
+
endpoint?.liveVersion === detail.agentRuntimeVersion &&
|
|
140
|
+
image === input.imageUri;
|
|
141
|
+
if (settled) {
|
|
142
|
+
if (mirroredCount === 0) {
|
|
143
|
+
// Post-update assertion half of atomic-or-abort: the runtime settled
|
|
144
|
+
// but reports an EMPTY env — the mirror did not stick. Fail loudly.
|
|
145
|
+
process.stderr.write(
|
|
146
|
+
"reconcile_pi_runtime: runtime settled with an EMPTY environment\n",
|
|
147
|
+
);
|
|
148
|
+
process.exit(2);
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
if (Date.now() >= deadline) {
|
|
153
|
+
process.stderr.write(
|
|
154
|
+
`reconcile_pi_runtime: timed out waiting for ${runtimeId} ` +
|
|
155
|
+
`(runtime=${detail.status} endpoint=${endpoint?.status ?? "MISSING"} ` +
|
|
156
|
+
`live=${endpoint?.liveVersion ?? "null"} target=${endpoint?.targetVersion ?? "null"} ` +
|
|
157
|
+
`image=${image})\n`,
|
|
158
|
+
);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
await sleep(15000);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
process.stdout.write(
|
|
165
|
+
JSON.stringify({
|
|
166
|
+
runtimeId,
|
|
167
|
+
created,
|
|
168
|
+
version: detail.agentRuntimeVersion,
|
|
169
|
+
status: detail.status,
|
|
170
|
+
endpointStatus: endpoint?.status ?? "UNKNOWN",
|
|
171
|
+
liveVersion: endpoint?.liveVersion ?? null,
|
|
172
|
+
image: detail.agentRuntimeArtifact?.containerConfiguration?.containerUri,
|
|
173
|
+
envCount,
|
|
174
|
+
}),
|
|
175
|
+
);
|
|
@@ -43,18 +43,6 @@ variable "async_dlq_arn" {
|
|
|
43
43
|
type = string
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
variable "hindsight_endpoint" {
|
|
47
|
-
description = "Hindsight API endpoint. Empty string (default) disables Hindsight tools in the container; set to an endpoint URL to enable Hindsight as an add-on alongside the always-on managed memory."
|
|
48
|
-
type = string
|
|
49
|
-
default = ""
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
variable "hindsight_database_name" {
|
|
53
|
-
description = "Dedicated Hindsight database name (THINK-220 cutover flag). Empty = the provider's direct SQL (high-confidence-fact recall, access-count writes) targets the `hindsight` schema of the primary database; set = that database's `public` schema."
|
|
54
|
-
type = string
|
|
55
|
-
default = ""
|
|
56
|
-
}
|
|
57
|
-
|
|
58
46
|
variable "agentcore_memory_id" {
|
|
59
47
|
description = "AgentCore Memory resource ID. Populated automatically by the agentcore-memory module; injected into the container as AGENTCORE_MEMORY_ID for auto-retention."
|
|
60
48
|
type = string
|
|
@@ -74,16 +62,6 @@ variable "api_auth_secret" {
|
|
|
74
62
|
sensitive = true
|
|
75
63
|
}
|
|
76
64
|
|
|
77
|
-
variable "memory_engine" {
|
|
78
|
-
description = "Active long-term memory engine ('hindsight' or 'agentcore'). Surfaced to the runtime as MEMORY_ENGINE for telemetry/debugging only; engine selection itself happens in the API's normalized memory layer when memory-retain is invoked."
|
|
79
|
-
type = string
|
|
80
|
-
default = "hindsight"
|
|
81
|
-
validation {
|
|
82
|
-
condition = contains(["hindsight", "agentcore"], var.memory_engine)
|
|
83
|
-
error_message = "memory_engine must be 'hindsight' or 'agentcore'."
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
65
|
variable "requester_idle_memory_learning_enabled" {
|
|
88
66
|
description = "When true, requester memory learning runs through the API idle/dreaming pipeline instead of runtime retain-on-every-turn."
|
|
89
67
|
type = bool
|
|
@@ -103,37 +81,37 @@ variable "db_secret_arn" {
|
|
|
103
81
|
}
|
|
104
82
|
|
|
105
83
|
variable "okf_efs_enabled" {
|
|
106
|
-
description = "
|
|
84
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
107
85
|
type = bool
|
|
108
86
|
default = false
|
|
109
87
|
}
|
|
110
88
|
|
|
111
89
|
variable "okf_efs_subnet_ids" {
|
|
112
|
-
description = "
|
|
90
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
113
91
|
type = list(string)
|
|
114
92
|
default = []
|
|
115
93
|
}
|
|
116
94
|
|
|
117
95
|
variable "okf_efs_security_group_ids" {
|
|
118
|
-
description = "
|
|
96
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
119
97
|
type = list(string)
|
|
120
98
|
default = []
|
|
121
99
|
}
|
|
122
100
|
|
|
123
101
|
variable "okf_efs_file_system_arn" {
|
|
124
|
-
description = "EFS
|
|
102
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
125
103
|
type = string
|
|
126
104
|
default = ""
|
|
127
105
|
}
|
|
128
106
|
|
|
129
107
|
variable "okf_efs_read_access_point_arn" {
|
|
130
|
-
description = "EFS
|
|
108
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
131
109
|
type = string
|
|
132
110
|
default = ""
|
|
133
111
|
}
|
|
134
112
|
|
|
135
113
|
variable "okf_efs_mount_path" {
|
|
136
|
-
description = "
|
|
114
|
+
description = "DEPRECATED (THINK-589): no-op, removal pending. The OKF wiki EFS feature is dead; this input is ignored — Pi is never VPC-attached and never mounts EFS. Declaration retained so existing passthroughs and tfvars keep working until PR 2 deletes it."
|
|
137
115
|
type = string
|
|
138
116
|
default = "/mnt/thinkwork-okf"
|
|
139
117
|
}
|
|
@@ -151,3 +129,32 @@ variable "capability_signing_public_key" {
|
|
|
151
129
|
type = string
|
|
152
130
|
default = ""
|
|
153
131
|
}
|
|
132
|
+
|
|
133
|
+
# ---------------------------------------------------------------------------
|
|
134
|
+
# THINK-1082: Pi inside the VPC. Pi holds DB_CLUSTER_ARN + DB_SECRET_ARN (RDS
|
|
135
|
+
# Data API — no network path to the cluster itself) but ships alongside the
|
|
136
|
+
# api handlers, which reach Aurora over its public endpoint today. This lane
|
|
137
|
+
# lets the runtime sit in the same private subnets behind the same api-lambda
|
|
138
|
+
# security group so the stage's database port can close uniformly. NETWORK
|
|
139
|
+
# side only: the THINK-589 EFS mount stays gone (no file_system_config). The
|
|
140
|
+
# private subnets must be NAT-routed — Pi needs Bedrock / Anthropic / GitHub
|
|
141
|
+
# egress. Default off = byte-identical to today.
|
|
142
|
+
# ---------------------------------------------------------------------------
|
|
143
|
+
|
|
144
|
+
variable "in_vpc" {
|
|
145
|
+
description = "Attach the Pi runtime Lambda to the VPC (vpc_subnet_ids + vpc_security_group_ids). Requires both lists non-empty and NAT-routed subnets (Bedrock, Anthropic, GitHub egress). Network attachment only — never re-adds the retired EFS mount."
|
|
146
|
+
type = bool
|
|
147
|
+
default = false
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
variable "vpc_subnet_ids" {
|
|
151
|
+
description = "Private (NAT-routed) subnet IDs for the Pi runtime when in_vpc is true."
|
|
152
|
+
type = list(string)
|
|
153
|
+
default = []
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
variable "vpc_security_group_ids" {
|
|
157
|
+
description = "Security groups for the Pi runtime when in_vpc is true (the thinkwork module passes its api-lambda SG)."
|
|
158
|
+
type = list(string)
|
|
159
|
+
default = []
|
|
160
|
+
}
|
|
@@ -10,6 +10,12 @@ variable "stage" {
|
|
|
10
10
|
type = string
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
variable "release_mirror_principal_arns" {
|
|
14
|
+
description = "IAM principals allowed to mirror release runtime images into this stage's AgentCore ECR repository. AgentCore Runtime is arm64-only and the deployment runner resolves the runtime image from THIS account's ECR by the '<releaseVersion>-pi-arm64' tag, so the ThinkWork release pipeline must be able to push it (THINK-616). Set to [] to disable the cross-account grant and mirror by hand."
|
|
15
|
+
type = list(string)
|
|
16
|
+
default = []
|
|
17
|
+
}
|
|
18
|
+
|
|
13
19
|
################################################################################
|
|
14
20
|
# ECR Repository
|
|
15
21
|
################################################################################
|
|
@@ -48,6 +54,68 @@ resource "aws_ecr_lifecycle_policy" "agentcore" {
|
|
|
48
54
|
})
|
|
49
55
|
}
|
|
50
56
|
|
|
57
|
+
################################################################################
|
|
58
|
+
# Cross-account release-image mirror grant (THINK-616)
|
|
59
|
+
#
|
|
60
|
+
# The release workflow's `mirror-customer-images` job pushes
|
|
61
|
+
# `<releaseVersion>-pi-arm64` into this repository from the ThinkWork release
|
|
62
|
+
# account. A repository policy is the whole grant — no role, user, or key is
|
|
63
|
+
# provisioned here.
|
|
64
|
+
#
|
|
65
|
+
# `aws_ecr_repository_policy` REPLACES the repository policy document, so the
|
|
66
|
+
# Lambda image-retrieval statement that Lambda auto-attaches when a container
|
|
67
|
+
# function is created is restated here; dropping it would leave the Pi Lambda's
|
|
68
|
+
# image pull ungranted.
|
|
69
|
+
################################################################################
|
|
70
|
+
|
|
71
|
+
data "aws_caller_identity" "current" {}
|
|
72
|
+
|
|
73
|
+
resource "aws_ecr_repository_policy" "agentcore" {
|
|
74
|
+
count = length(var.release_mirror_principal_arns) > 0 ? 1 : 0
|
|
75
|
+
|
|
76
|
+
repository = aws_ecr_repository.agentcore.name
|
|
77
|
+
|
|
78
|
+
policy = jsonencode({
|
|
79
|
+
Version = "2012-10-17"
|
|
80
|
+
Statement = [
|
|
81
|
+
{
|
|
82
|
+
Sid = "LambdaECRImageRetrievalPolicy"
|
|
83
|
+
Effect = "Allow"
|
|
84
|
+
Principal = {
|
|
85
|
+
Service = "lambda.amazonaws.com"
|
|
86
|
+
}
|
|
87
|
+
Action = [
|
|
88
|
+
"ecr:BatchGetImage",
|
|
89
|
+
"ecr:GetDownloadUrlForLayer",
|
|
90
|
+
]
|
|
91
|
+
Condition = {
|
|
92
|
+
StringLike = {
|
|
93
|
+
"aws:sourceArn" = "arn:aws:lambda:*:${data.aws_caller_identity.current.account_id}:function:*"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
Sid = "ThinkWorkReleaseImageMirror"
|
|
99
|
+
Effect = "Allow"
|
|
100
|
+
Principal = {
|
|
101
|
+
AWS = var.release_mirror_principal_arns
|
|
102
|
+
}
|
|
103
|
+
Action = [
|
|
104
|
+
"ecr:BatchCheckLayerAvailability",
|
|
105
|
+
"ecr:BatchGetImage",
|
|
106
|
+
"ecr:CompleteLayerUpload",
|
|
107
|
+
"ecr:DescribeImages",
|
|
108
|
+
"ecr:GetDownloadUrlForLayer",
|
|
109
|
+
"ecr:InitiateLayerUpload",
|
|
110
|
+
"ecr:ListImages",
|
|
111
|
+
"ecr:PutImage",
|
|
112
|
+
"ecr:UploadLayerPart",
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
]
|
|
116
|
+
})
|
|
117
|
+
}
|
|
118
|
+
|
|
51
119
|
################################################################################
|
|
52
120
|
# Async-invoke DLQ
|
|
53
121
|
################################################################################
|
|
@@ -26,12 +26,6 @@ variable "bucket_name" {
|
|
|
26
26
|
type = string
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
variable "hindsight_endpoint" {
|
|
30
|
-
description = "Hindsight API endpoint. Empty string (default) disables Hindsight tools in the container; set to an endpoint URL to enable Hindsight as an add-on alongside the always-on managed memory."
|
|
31
|
-
type = string
|
|
32
|
-
default = ""
|
|
33
|
-
}
|
|
34
|
-
|
|
35
29
|
variable "agentcore_memory_id" {
|
|
36
30
|
description = "AgentCore Memory resource ID. Populated automatically by the agentcore-memory module; injected into the container as AGENTCORE_MEMORY_ID for auto-retention."
|
|
37
31
|
type = string
|
|
@@ -58,16 +52,6 @@ variable "nova_act_api_key" {
|
|
|
58
52
|
sensitive = true
|
|
59
53
|
}
|
|
60
54
|
|
|
61
|
-
variable "memory_engine" {
|
|
62
|
-
description = "Active long-term memory engine ('hindsight' or 'agentcore'). Surfaced to the runtime as MEMORY_ENGINE for telemetry/debugging only; engine selection itself happens in the API's normalized memory layer when memory-retain is invoked."
|
|
63
|
-
type = string
|
|
64
|
-
default = "hindsight"
|
|
65
|
-
validation {
|
|
66
|
-
condition = contains(["hindsight", "agentcore"], var.memory_engine)
|
|
67
|
-
error_message = "memory_engine must be 'hindsight' or 'agentcore'."
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
55
|
variable "requester_idle_memory_learning_enabled" {
|
|
72
56
|
description = "When true, requester memory learning runs through the API idle/dreaming pipeline instead of runtime retain-on-every-turn."
|
|
73
57
|
type = bool
|
|
@@ -302,9 +286,9 @@ resource "aws_iam_role_policy" "agentcore" {
|
|
|
302
286
|
},
|
|
303
287
|
{
|
|
304
288
|
# Async-invoke the memory-retain Lambda after every chat turn so
|
|
305
|
-
# the API's normalized memory layer can run the
|
|
306
|
-
# retainTurn() path
|
|
307
|
-
#
|
|
289
|
+
# the API's normalized memory layer can run the AgentCore
|
|
290
|
+
# CreateEvent retainTurn() path. InvocationType=Event from the
|
|
291
|
+
# Python client; this
|
|
308
292
|
# Lambda is the only target.
|
|
309
293
|
Sid = "MemoryRetainInvoke"
|
|
310
294
|
Effect = "Allow"
|
|
@@ -346,7 +330,7 @@ resource "aws_lambda_function" "agentcore" {
|
|
|
346
330
|
AWS_LWA_PORT = "8080"
|
|
347
331
|
AGENTCORE_MEMORY_ID = var.agentcore_memory_id
|
|
348
332
|
AGENTCORE_FILES_BUCKET = var.bucket_name
|
|
349
|
-
MEMORY_ENGINE =
|
|
333
|
+
MEMORY_ENGINE = "agentcore"
|
|
350
334
|
REQUESTER_IDLE_MEMORY_LEARNING_ENABLED = tostring(var.requester_idle_memory_learning_enabled)
|
|
351
335
|
MEMORY_RETAIN_FN_NAME = local.memory_retain_fn_name
|
|
352
336
|
# Needed by run_skill_dispatch.py to POST terminal state back to
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
#
|
|
9
9
|
# THINK-144: this module owns a DEDICATED execute-api interface VPC endpoint
|
|
10
10
|
# with private DNS DISABLED. It is never added to the app VPC's shared
|
|
11
|
-
#
|
|
11
|
+
# vpc_interface_endpoint_services set — that list's private DNS would
|
|
12
12
|
# capture every *.execute-api call in the VPC and 403 the stack's public HTTP
|
|
13
13
|
# APIs. The session bootstrap targets this endpoint's own DNS name instead.
|
|
14
14
|
|
|
@@ -188,7 +188,7 @@ resource "aws_lambda_function" "broker" {
|
|
|
188
188
|
|
|
189
189
|
vpc_config {
|
|
190
190
|
subnet_ids = var.subnet_ids
|
|
191
|
-
security_group_ids = [aws_security_group.broker_lambda[0].id]
|
|
191
|
+
security_group_ids = distinct(concat([aws_security_group.broker_lambda[0].id], var.additional_security_group_ids))
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
environment {
|
|
@@ -96,3 +96,14 @@ variable "log_retention_days" {
|
|
|
96
96
|
type = number
|
|
97
97
|
default = 30
|
|
98
98
|
}
|
|
99
|
+
|
|
100
|
+
# THINK-1082: the broker is already VPC-attached (private subnets, its own
|
|
101
|
+
# egress-only SG) but reaches Aurora through the database SG's world-open
|
|
102
|
+
# 0.0.0.0/0 -> 5432 rule (the cluster's public hostname resolves to the
|
|
103
|
+
# private IP from inside the VPC). Extra SGs let the caller attach the
|
|
104
|
+
# api-lambda SG the database SG admits, so the public rule can close.
|
|
105
|
+
variable "additional_security_group_ids" {
|
|
106
|
+
description = "Extra security groups appended to the broker Lambda's vpc_config (e.g. the api-lambda SG granted tcp/5432 on the database SG). Default none = unchanged."
|
|
107
|
+
type = list(string)
|
|
108
|
+
default = []
|
|
109
|
+
}
|