@aws/agentcore 1.0.0-preview.2 → 1.0.0-preview.21

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 (277) hide show
  1. package/README.md +193 -33
  2. package/dist/agent-inspector/index.css +1 -1
  3. package/dist/agent-inspector/index.js +99 -84
  4. package/dist/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap +3132 -366
  5. package/dist/assets/__tests__/__snapshots__/dockerfile-render.test.ts.snap +6 -2
  6. package/dist/assets/__tests__/assets.snapshot.test.ts +10 -24
  7. package/dist/assets/__tests__/googleadk-session-eviction.test.ts +87 -0
  8. package/dist/assets/__tests__/summarization-namespace.test.ts +43 -0
  9. package/dist/assets/agents/AGENTS.md +87 -11
  10. package/dist/assets/cdk/bin/cdk.ts +87 -26
  11. package/dist/assets/cdk/lib/cdk-stack.ts +185 -55
  12. package/dist/assets/cdk/package.json +1 -1
  13. package/dist/assets/cdk/test/cdk.test.ts +4 -0
  14. package/dist/assets/container/python/Dockerfile +7 -1
  15. package/dist/assets/container/typescript/Dockerfile +25 -0
  16. package/dist/assets/container/typescript/dockerignore.template +24 -0
  17. package/dist/assets/datasets/predefined-v1.jsonl +3 -0
  18. package/dist/assets/datasets/simulated-v1.jsonl +3 -0
  19. package/dist/assets/python/a2a/googleadk/base/main.py +24 -16
  20. package/dist/assets/python/a2a/googleadk/base/pyproject.toml +3 -3
  21. package/dist/assets/python/a2a/langchain_langgraph/base/main.py +24 -16
  22. package/dist/assets/python/a2a/langchain_langgraph/base/pyproject.toml +3 -2
  23. package/dist/assets/python/a2a/strands/base/main.py +23 -17
  24. package/dist/assets/python/a2a/strands/base/pyproject.toml +2 -2
  25. package/dist/assets/python/a2a/strands/capabilities/memory/session.py +10 -2
  26. package/dist/assets/python/agui/googleadk/base/main.py +62 -2
  27. package/dist/assets/python/agui/googleadk/base/pyproject.toml +3 -3
  28. package/dist/assets/python/agui/langchain_langgraph/base/main.py +56 -0
  29. package/dist/assets/python/agui/langchain_langgraph/base/pyproject.toml +2 -1
  30. package/dist/assets/python/agui/strands/base/main.py +63 -1
  31. package/dist/assets/python/agui/strands/base/pyproject.toml +1 -1
  32. package/dist/assets/python/agui/strands/capabilities/memory/session.py +10 -2
  33. package/dist/assets/python/http/autogen/base/main.py +60 -29
  34. package/dist/assets/python/http/autogen/base/pyproject.toml +1 -1
  35. package/dist/assets/python/http/googleadk/base/main.py +69 -24
  36. package/dist/assets/python/http/googleadk/base/mcp_client/client.py +7 -7
  37. package/dist/assets/python/http/googleadk/base/pyproject.toml +2 -1
  38. package/dist/assets/python/http/langchain_langgraph/base/main.py +115 -24
  39. package/dist/assets/python/http/langchain_langgraph/base/mcp_client/client.py +10 -8
  40. package/dist/assets/python/http/langchain_langgraph/base/pyproject.toml +3 -2
  41. package/dist/assets/python/http/openaiagents/base/main.py +61 -32
  42. package/dist/assets/python/http/openaiagents/base/mcp_client/client.py +4 -4
  43. package/dist/assets/python/http/openaiagents/base/pyproject.toml +2 -2
  44. package/dist/assets/python/http/strands/base/main.py +571 -47
  45. package/dist/assets/python/http/strands/base/mcp_client/client.py +49 -6
  46. package/dist/assets/python/http/strands/base/model/load.py +119 -3
  47. package/dist/assets/python/http/strands/base/model/mantle_compat.py +21 -0
  48. package/dist/assets/python/http/strands/base/pyproject.toml +9 -3
  49. package/dist/assets/python/http/strands/base/skills/fetcher.py +279 -0
  50. package/dist/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
  51. package/dist/assets/python/http/strands/capabilities/memory/session.py +10 -2
  52. package/dist/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
  53. package/dist/assets/python/http/strands/capabilities/payments/payments.py +142 -0
  54. package/dist/assets/python/mcp/standalone/base/main.py +58 -0
  55. package/dist/assets/typescript/http/strands/base/README.md +37 -0
  56. package/dist/assets/typescript/http/strands/base/gitignore.template +22 -0
  57. package/dist/assets/typescript/http/strands/base/main.ts +144 -0
  58. package/dist/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
  59. package/dist/assets/typescript/http/strands/base/model/load.ts +102 -0
  60. package/dist/assets/typescript/http/strands/base/package.json +38 -0
  61. package/dist/assets/typescript/http/strands/base/tsconfig.json +19 -0
  62. package/dist/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
  63. package/dist/assets/typescript/http/vercelai/base/README.md +37 -0
  64. package/dist/assets/typescript/http/vercelai/base/gitignore.template +22 -0
  65. package/dist/assets/typescript/http/vercelai/base/main.ts +64 -0
  66. package/dist/assets/typescript/http/vercelai/base/model/load.ts +121 -0
  67. package/dist/assets/typescript/http/vercelai/base/package.json +35 -0
  68. package/dist/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
  69. package/dist/cli/index.mjs +1443 -569
  70. package/dist/lib/constants.d.ts +8 -4
  71. package/dist/lib/constants.d.ts.map +1 -1
  72. package/dist/lib/constants.js +13 -7
  73. package/dist/lib/constants.js.map +1 -1
  74. package/dist/lib/errors/index.d.ts +1 -1
  75. package/dist/lib/errors/index.d.ts.map +1 -1
  76. package/dist/lib/errors/index.js +1 -1
  77. package/dist/lib/errors/index.js.map +1 -1
  78. package/dist/lib/errors/types.d.ts +259 -0
  79. package/dist/lib/errors/types.d.ts.map +1 -0
  80. package/dist/lib/errors/types.js +402 -0
  81. package/dist/lib/errors/types.js.map +1 -0
  82. package/dist/lib/errors/zod.d.ts +8 -0
  83. package/dist/lib/errors/zod.d.ts.map +1 -0
  84. package/dist/lib/errors/{config.js → zod.js} +8 -81
  85. package/dist/lib/errors/zod.js.map +1 -0
  86. package/dist/lib/index.d.ts +3 -0
  87. package/dist/lib/index.d.ts.map +1 -1
  88. package/dist/lib/index.js +4 -1
  89. package/dist/lib/index.js.map +1 -1
  90. package/dist/lib/packaging/build-args.d.ts +6 -0
  91. package/dist/lib/packaging/build-args.d.ts.map +1 -1
  92. package/dist/lib/packaging/build-args.js +11 -2
  93. package/dist/lib/packaging/build-args.js.map +1 -1
  94. package/dist/lib/packaging/build-context-dockerignore.d.ts +23 -0
  95. package/dist/lib/packaging/build-context-dockerignore.d.ts.map +1 -0
  96. package/dist/lib/packaging/build-context-dockerignore.js +63 -0
  97. package/dist/lib/packaging/build-context-dockerignore.js.map +1 -0
  98. package/dist/lib/packaging/build-context.d.ts +21 -0
  99. package/dist/lib/packaging/build-context.d.ts.map +1 -0
  100. package/dist/lib/packaging/build-context.js +21 -0
  101. package/dist/lib/packaging/build-context.js.map +1 -0
  102. package/dist/lib/packaging/container.d.ts.map +1 -1
  103. package/dist/lib/packaging/container.js +20 -9
  104. package/dist/lib/packaging/container.js.map +1 -1
  105. package/dist/lib/packaging/helpers.d.ts +16 -0
  106. package/dist/lib/packaging/helpers.d.ts.map +1 -1
  107. package/dist/lib/packaging/helpers.js +127 -29
  108. package/dist/lib/packaging/helpers.js.map +1 -1
  109. package/dist/lib/packaging/index.d.ts +2 -1
  110. package/dist/lib/packaging/index.d.ts.map +1 -1
  111. package/dist/lib/packaging/index.js +9 -20
  112. package/dist/lib/packaging/index.js.map +1 -1
  113. package/dist/lib/packaging/node.d.ts +2 -2
  114. package/dist/lib/packaging/node.d.ts.map +1 -1
  115. package/dist/lib/packaging/node.js +83 -38
  116. package/dist/lib/packaging/node.js.map +1 -1
  117. package/dist/lib/packaging/python.js +12 -12
  118. package/dist/lib/packaging/python.js.map +1 -1
  119. package/dist/lib/result.d.ts +50 -0
  120. package/dist/lib/result.d.ts.map +1 -0
  121. package/dist/lib/result.js +49 -0
  122. package/dist/lib/result.js.map +1 -0
  123. package/dist/lib/schemas/io/config-io.d.ts +8 -0
  124. package/dist/lib/schemas/io/config-io.d.ts.map +1 -1
  125. package/dist/lib/schemas/io/config-io.js +21 -3
  126. package/dist/lib/schemas/io/config-io.js.map +1 -1
  127. package/dist/lib/schemas/io/global-config.d.ts +40 -0
  128. package/dist/lib/schemas/io/global-config.d.ts.map +1 -0
  129. package/dist/lib/schemas/io/global-config.js +118 -0
  130. package/dist/lib/schemas/io/global-config.js.map +1 -0
  131. package/dist/lib/schemas/io/index.d.ts +1 -2
  132. package/dist/lib/schemas/io/index.d.ts.map +1 -1
  133. package/dist/lib/schemas/io/index.js +1 -4
  134. package/dist/lib/schemas/io/index.js.map +1 -1
  135. package/dist/lib/schemas/io/path-resolver.d.ts +0 -6
  136. package/dist/lib/schemas/io/path-resolver.d.ts.map +1 -1
  137. package/dist/lib/schemas/io/path-resolver.js +3 -13
  138. package/dist/lib/schemas/io/path-resolver.js.map +1 -1
  139. package/dist/lib/secrets/cipher.d.ts +12 -0
  140. package/dist/lib/secrets/cipher.d.ts.map +1 -0
  141. package/dist/lib/secrets/cipher.js +54 -0
  142. package/dist/lib/secrets/cipher.js.map +1 -0
  143. package/dist/lib/secrets/index.d.ts +4 -0
  144. package/dist/lib/secrets/index.d.ts.map +1 -0
  145. package/dist/lib/secrets/index.js +15 -0
  146. package/dist/lib/secrets/index.js.map +1 -0
  147. package/dist/lib/secrets/key-provider.d.ts +16 -0
  148. package/dist/lib/secrets/key-provider.d.ts.map +1 -0
  149. package/dist/lib/secrets/key-provider.js +191 -0
  150. package/dist/lib/secrets/key-provider.js.map +1 -0
  151. package/dist/lib/secrets/sensitive-keys.d.ts +21 -0
  152. package/dist/lib/secrets/sensitive-keys.d.ts.map +1 -0
  153. package/dist/lib/secrets/sensitive-keys.js +67 -0
  154. package/dist/lib/secrets/sensitive-keys.js.map +1 -0
  155. package/dist/lib/time-constants.d.ts +5 -0
  156. package/dist/lib/time-constants.d.ts.map +1 -0
  157. package/dist/lib/time-constants.js +8 -0
  158. package/dist/lib/time-constants.js.map +1 -0
  159. package/dist/lib/utils/env.d.ts +8 -2
  160. package/dist/lib/utils/env.d.ts.map +1 -1
  161. package/dist/lib/utils/env.js +65 -17
  162. package/dist/lib/utils/env.js.map +1 -1
  163. package/dist/lib/utils/index.d.ts +3 -2
  164. package/dist/lib/utils/index.d.ts.map +1 -1
  165. package/dist/lib/utils/index.js +6 -1
  166. package/dist/lib/utils/index.js.map +1 -1
  167. package/dist/lib/utils/polling.d.ts +31 -0
  168. package/dist/lib/utils/polling.d.ts.map +1 -0
  169. package/dist/lib/utils/polling.js +61 -0
  170. package/dist/lib/utils/polling.js.map +1 -0
  171. package/dist/lib/utils/zod.d.ts +16 -0
  172. package/dist/lib/utils/zod.d.ts.map +1 -1
  173. package/dist/lib/utils/zod.js +45 -0
  174. package/dist/lib/utils/zod.js.map +1 -1
  175. package/dist/schema/constants.d.ts +56 -2
  176. package/dist/schema/constants.d.ts.map +1 -1
  177. package/dist/schema/constants.js +82 -7
  178. package/dist/schema/constants.js.map +1 -1
  179. package/dist/schema/schemas/agent-env.d.ts +178 -6
  180. package/dist/schema/schemas/agent-env.d.ts.map +1 -1
  181. package/dist/schema/schemas/agent-env.js +302 -27
  182. package/dist/schema/schemas/agent-env.js.map +1 -1
  183. package/dist/schema/schemas/agentcore-project.d.ts +450 -11
  184. package/dist/schema/schemas/agentcore-project.d.ts.map +1 -1
  185. package/dist/schema/schemas/agentcore-project.js +283 -18
  186. package/dist/schema/schemas/agentcore-project.js.map +1 -1
  187. package/dist/schema/schemas/auth.d.ts +174 -0
  188. package/dist/schema/schemas/auth.d.ts.map +1 -1
  189. package/dist/schema/schemas/auth.js +127 -3
  190. package/dist/schema/schemas/auth.js.map +1 -1
  191. package/dist/schema/schemas/aws-targets.d.ts +12 -0
  192. package/dist/schema/schemas/aws-targets.d.ts.map +1 -1
  193. package/dist/schema/schemas/aws-targets.js +4 -0
  194. package/dist/schema/schemas/aws-targets.js.map +1 -1
  195. package/dist/schema/schemas/connections.d.ts +185 -0
  196. package/dist/schema/schemas/connections.d.ts.map +1 -0
  197. package/dist/schema/schemas/connections.js +176 -0
  198. package/dist/schema/schemas/connections.js.map +1 -0
  199. package/dist/schema/schemas/deployed-state.d.ts +361 -5
  200. package/dist/schema/schemas/deployed-state.d.ts.map +1 -1
  201. package/dist/schema/schemas/deployed-state.js +105 -2
  202. package/dist/schema/schemas/deployed-state.js.map +1 -1
  203. package/dist/schema/schemas/index.d.ts +1 -0
  204. package/dist/schema/schemas/index.d.ts.map +1 -1
  205. package/dist/schema/schemas/index.js +1 -0
  206. package/dist/schema/schemas/index.js.map +1 -1
  207. package/dist/schema/schemas/mcp-defs.d.ts +2 -1
  208. package/dist/schema/schemas/mcp-defs.d.ts.map +1 -1
  209. package/dist/schema/schemas/mcp-defs.js +3 -2
  210. package/dist/schema/schemas/mcp-defs.js.map +1 -1
  211. package/dist/schema/schemas/mcp.d.ts +199 -0
  212. package/dist/schema/schemas/mcp.d.ts.map +1 -1
  213. package/dist/schema/schemas/mcp.js +343 -6
  214. package/dist/schema/schemas/mcp.js.map +1 -1
  215. package/dist/schema/schemas/primitives/ab-test.d.ts +135 -0
  216. package/dist/schema/schemas/primitives/ab-test.d.ts.map +1 -0
  217. package/dist/schema/schemas/primitives/ab-test.js +95 -0
  218. package/dist/schema/schemas/primitives/ab-test.js.map +1 -0
  219. package/dist/schema/schemas/primitives/config-bundle.d.ts +32 -0
  220. package/dist/schema/schemas/primitives/config-bundle.d.ts.map +1 -0
  221. package/dist/schema/schemas/primitives/config-bundle.js +41 -0
  222. package/dist/schema/schemas/primitives/config-bundle.js.map +1 -0
  223. package/dist/schema/schemas/primitives/dataset.d.ts +48 -0
  224. package/dist/schema/schemas/primitives/dataset.d.ts.map +1 -0
  225. package/dist/schema/schemas/primitives/dataset.js +58 -0
  226. package/dist/schema/schemas/primitives/dataset.js.map +1 -0
  227. package/dist/schema/schemas/primitives/evaluator.d.ts +8 -0
  228. package/dist/schema/schemas/primitives/evaluator.d.ts.map +1 -1
  229. package/dist/schema/schemas/primitives/evaluator.js +17 -1
  230. package/dist/schema/schemas/primitives/evaluator.js.map +1 -1
  231. package/dist/schema/schemas/primitives/harness.d.ts +377 -19
  232. package/dist/schema/schemas/primitives/harness.d.ts.map +1 -1
  233. package/dist/schema/schemas/primitives/harness.js +379 -24
  234. package/dist/schema/schemas/primitives/harness.js.map +1 -1
  235. package/dist/schema/schemas/primitives/index.d.ts +13 -7
  236. package/dist/schema/schemas/primitives/index.d.ts.map +1 -1
  237. package/dist/schema/schemas/primitives/index.js +37 -1
  238. package/dist/schema/schemas/primitives/index.js.map +1 -1
  239. package/dist/schema/schemas/primitives/knowledge-base.d.ts +104 -0
  240. package/dist/schema/schemas/primitives/knowledge-base.d.ts.map +1 -0
  241. package/dist/schema/schemas/primitives/knowledge-base.js +99 -0
  242. package/dist/schema/schemas/primitives/knowledge-base.js.map +1 -0
  243. package/dist/schema/schemas/primitives/memory.d.ts +22 -4
  244. package/dist/schema/schemas/primitives/memory.d.ts.map +1 -1
  245. package/dist/schema/schemas/primitives/memory.js +57 -16
  246. package/dist/schema/schemas/primitives/memory.js.map +1 -1
  247. package/dist/schema/schemas/primitives/online-eval-config.d.ts +21 -2
  248. package/dist/schema/schemas/primitives/online-eval-config.d.ts.map +1 -1
  249. package/dist/schema/schemas/primitives/online-eval-config.js +45 -5
  250. package/dist/schema/schemas/primitives/online-eval-config.js.map +1 -1
  251. package/dist/schema/schemas/primitives/payment.d.ts +54 -0
  252. package/dist/schema/schemas/primitives/payment.d.ts.map +1 -0
  253. package/dist/schema/schemas/primitives/payment.js +79 -0
  254. package/dist/schema/schemas/primitives/payment.js.map +1 -0
  255. package/dist/schema/schemas/primitives/policy.d.ts +26 -0
  256. package/dist/schema/schemas/primitives/policy.d.ts.map +1 -1
  257. package/dist/schema/schemas/primitives/policy.js +5 -1
  258. package/dist/schema/schemas/primitives/policy.js.map +1 -1
  259. package/npm-shrinkwrap.json +17013 -0
  260. package/package.json +43 -21
  261. package/scripts/bump-version.ts +4 -4
  262. package/scripts/bundle.mjs +70 -41
  263. package/scripts/extract-cli-model.mjs +228 -0
  264. package/scripts/render_adoc.py +274 -0
  265. package/scripts/run-e2e-dev.sh +56 -0
  266. package/scripts/run-e2e-local.sh +145 -0
  267. package/dist/lib/errors/config.d.ts +0 -49
  268. package/dist/lib/errors/config.d.ts.map +0 -1
  269. package/dist/lib/errors/config.js.map +0 -1
  270. package/dist/lib/packaging/errors.d.ts +0 -16
  271. package/dist/lib/packaging/errors.d.ts.map +0 -1
  272. package/dist/lib/packaging/errors.js +0 -36
  273. package/dist/lib/packaging/errors.js.map +0 -1
  274. package/dist/lib/schemas/io/cli-config.d.ts +0 -12
  275. package/dist/lib/schemas/io/cli-config.d.ts.map +0 -1
  276. package/dist/lib/schemas/io/cli-config.js +0 -35
  277. package/dist/lib/schemas/io/cli-config.js.map +0 -1
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolveEncryptionKey = resolveEncryptionKey;
37
+ exports.resolveCandidateKeys = resolveCandidateKeys;
38
+ exports.__resetKeyCacheForTests = __resetKeyCacheForTests;
39
+ const types_1 = require("../errors/types");
40
+ const node_crypto_1 = require("node:crypto");
41
+ const node_fs_1 = require("node:fs");
42
+ const node_os_1 = require("node:os");
43
+ const node_path_1 = require("node:path");
44
+ const KEY_BYTES = 32;
45
+ const KEYCHAIN_SERVICE = 'aws-agentcore';
46
+ const KEYCHAIN_ACCOUNT = 'env-local-secret-key';
47
+ let cachedKey = null;
48
+ /** Keychain is opt-out (headless/CI) and best-effort; any failure falls through to the keyfile. */
49
+ async function tryKeychainKey() {
50
+ if (process.env.AGENTCORE_DISABLE_KEYCHAIN === '1')
51
+ return null;
52
+ try {
53
+ // Optional native dependency — dynamic import so a missing/unbuildable
54
+ // module degrades to the keyfile instead of failing the CLI.
55
+ const { Entry } = (await Promise.resolve().then(() => __importStar(require('@napi-rs/keyring'))));
56
+ const entry = new Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
57
+ try {
58
+ const existing = entry.getPassword();
59
+ if (existing)
60
+ return Buffer.from(existing, 'base64');
61
+ }
62
+ catch {
63
+ // no stored password yet
64
+ }
65
+ const key = (0, node_crypto_1.randomBytes)(KEY_BYTES);
66
+ entry.setPassword(key.toString('base64'));
67
+ // Re-read after writing: if a concurrent process stored a different key
68
+ // between our getPassword() and setPassword(), the keychain now holds
69
+ // theirs — trust the persisted value, not our local one, so both processes
70
+ // converge on the same key.
71
+ try {
72
+ const persisted = entry.getPassword();
73
+ if (persisted)
74
+ return Buffer.from(persisted, 'base64');
75
+ }
76
+ catch {
77
+ // fall through to the freshly-generated key
78
+ }
79
+ return key;
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ function resolveConfigDir() {
86
+ return process.env.AGENTCORE_CONFIG_DIR ?? (0, node_path_1.join)((0, node_os_1.homedir)(), '.agentcore');
87
+ }
88
+ function keyfilePath() {
89
+ return (0, node_path_1.join)(resolveConfigDir(), 'secrets.key');
90
+ }
91
+ /** A keyfile that exists but isn't KEY_BYTES long is corrupt — never overwrite it. */
92
+ function assertKeyfileSize(key, path) {
93
+ if (key.length === KEY_BYTES)
94
+ return key;
95
+ throw new types_1.SecretEncryptionError(`Encryption key file at ${path} is corrupt (expected ${KEY_BYTES} bytes, found ${key.length}). ` +
96
+ `Move it aside and re-add your credentials, or restore the original key file`);
97
+ }
98
+ function keyfileKey() {
99
+ const path = keyfilePath();
100
+ try {
101
+ if ((0, node_fs_1.existsSync)(path)) {
102
+ // A wrong-sized existing file is corruption, NOT a cue to mint a new key:
103
+ // overwriting it would permanently orphan every secret sealed with the
104
+ // real key. Fail loud instead.
105
+ return assertKeyfileSize((0, node_fs_1.readFileSync)(path), path);
106
+ }
107
+ (0, node_fs_1.mkdirSync)(resolveConfigDir(), { recursive: true });
108
+ const key = (0, node_crypto_1.randomBytes)(KEY_BYTES);
109
+ try {
110
+ // `wx` fails if the file already exists, making first-time creation
111
+ // last-writer-safe: if a concurrent process created it between the
112
+ // existsSync check and here, re-read theirs instead of clobbering it.
113
+ (0, node_fs_1.writeFileSync)(path, key, { mode: 0o600, flag: 'wx' });
114
+ return key;
115
+ }
116
+ catch (writeErr) {
117
+ if (writeErr.code === 'EEXIST') {
118
+ return assertKeyfileSize((0, node_fs_1.readFileSync)(path), path);
119
+ }
120
+ throw writeErr;
121
+ }
122
+ }
123
+ catch (err) {
124
+ if (err instanceof types_1.SecretEncryptionError)
125
+ throw err;
126
+ throw new types_1.SecretEncryptionError(`Could not create or read the machine encryption key at ${path}.`, {
127
+ cause: err instanceof Error ? err : undefined,
128
+ });
129
+ }
130
+ }
131
+ /** Read the keyfile key WITHOUT creating one if absent (read-only; returns null when missing). */
132
+ function readKeyfileKeyIfPresent() {
133
+ try {
134
+ const path = keyfilePath();
135
+ if ((0, node_fs_1.existsSync)(path)) {
136
+ const key = (0, node_fs_1.readFileSync)(path);
137
+ if (key.length === KEY_BYTES)
138
+ return key;
139
+ }
140
+ }
141
+ catch {
142
+ // unreadable keyfile — treat as absent
143
+ }
144
+ return null;
145
+ }
146
+ /** Read the keychain key WITHOUT creating one if absent (returns null when unavailable/missing). */
147
+ async function readKeychainKeyIfPresent() {
148
+ if (process.env.AGENTCORE_DISABLE_KEYCHAIN === '1')
149
+ return null;
150
+ try {
151
+ const { Entry } = (await Promise.resolve().then(() => __importStar(require('@napi-rs/keyring'))));
152
+ const existing = new Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT).getPassword();
153
+ return existing ? Buffer.from(existing, 'base64') : null;
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * Resolve the single key used to ENCRYPT new values: keychain first, keyfile
161
+ * fallback. Creates a key if none exists yet.
162
+ */
163
+ async function resolveEncryptionKey() {
164
+ if (cachedKey)
165
+ return cachedKey;
166
+ const fromKeychain = await tryKeychainKey();
167
+ cachedKey = fromKeychain ?? keyfileKey();
168
+ return cachedKey;
169
+ }
170
+ /**
171
+ * Resolve ALL candidate keys for DECRYPTION, newest-intent first. A stored
172
+ * value may have been sealed by the keychain on one run and the keyfile on
173
+ * another (e.g. AGENTCORE_DISABLE_KEYCHAIN toggled); trying every available key
174
+ * lets a value decrypt regardless of which source is currently active. Read-only
175
+ * — never creates a key. May be empty if no key material exists at all.
176
+ */
177
+ async function resolveCandidateKeys() {
178
+ const keys = [];
179
+ const fromKeychain = await readKeychainKeyIfPresent();
180
+ if (fromKeychain)
181
+ keys.push(fromKeychain);
182
+ const fromKeyfile = readKeyfileKeyIfPresent();
183
+ if (fromKeyfile && !keys.some(k => k.equals(fromKeyfile)))
184
+ keys.push(fromKeyfile);
185
+ return keys;
186
+ }
187
+ /** Reset the per-process key cache. Only for use in tests. */
188
+ function __resetKeyCacheForTests() {
189
+ cachedKey = null;
190
+ }
191
+ //# sourceMappingURL=key-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-provider.js","sourceRoot":"","sources":["../../../src/lib/secrets/key-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Single source of truth for "is this env value a secret that must be encrypted
3
+ * at rest." Used by env.ts on write/read; extend with one entry when a new
4
+ * secret-bearing credential field is introduced anywhere in the CLI.
5
+ */
6
+ export declare const SENSITIVE_KEY_PATTERNS: RegExp[];
7
+ export declare function isSensitiveKey(key: string): boolean;
8
+ /**
9
+ * Validate that an API-key credential NAME won't collide with a reserved
10
+ * reference suffix. A bare API-key credential is stored as
11
+ * `AGENTCORE_CREDENTIAL_<NAME>` carrying the secret value directly; if <NAME>
12
+ * normalizes to end in a reference suffix (e.g. `my-client-id` → `..._CLIENT_ID`)
13
+ * the value is indistinguishable from a non-secret reference and would be left
14
+ * UNENCRYPTED at rest. Reject such names at creation (fail closed).
15
+ *
16
+ * Returns `true` if the name is safe, or an error message string if not — the
17
+ * `(value) => true | string` contract used by both the CLI and the TUI's
18
+ * SecretInput/TextInput `customValidation`.
19
+ */
20
+ export declare function validateCredentialNameEncryptable(name: string): true | string;
21
+ //# sourceMappingURL=sensitive-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/secrets/sensitive-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAAkD,CAAC;AAY9F,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAInD;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * Single source of truth for "is this env value a secret that must be encrypted
4
+ * at rest." Used by env.ts on write/read; extend with one entry when a new
5
+ * secret-bearing credential field is introduced anywhere in the CLI.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SENSITIVE_KEY_PATTERNS = void 0;
9
+ exports.isSensitiveKey = isSensitiveKey;
10
+ exports.validateCredentialNameEncryptable = validateCredentialNameEncryptable;
11
+ /** Suffixes whose values are secrets. */
12
+ const SECRET_SUFFIXES = [
13
+ '_API_KEY_SECRET',
14
+ '_WALLET_SECRET',
15
+ '_AUTHORIZATION_PRIVATE_KEY',
16
+ '_APP_SECRET',
17
+ '_CLIENT_SECRET',
18
+ '_API_KEY',
19
+ ];
20
+ /** Reference/identifier suffixes that are NOT secrets (stay readable). */
21
+ const REFERENCE_SUFFIXES = ['_API_KEY_ID', '_APP_ID', '_CLIENT_ID', '_AUTHORIZATION_ID'];
22
+ exports.SENSITIVE_KEY_PATTERNS = SECRET_SUFFIXES.map(s => new RegExp(`${s}$`));
23
+ /**
24
+ * Model-provider API keys are stored as the bare `AGENTCORE_CREDENTIAL_<NAME>`
25
+ * (no secret suffix). Treat such a credential var as a secret UNLESS it ends in
26
+ * a known reference suffix.
27
+ */
28
+ function isBareModelCredential(key) {
29
+ if (!key.startsWith('AGENTCORE_CREDENTIAL_'))
30
+ return false;
31
+ return !REFERENCE_SUFFIXES.some(suffix => key.endsWith(suffix));
32
+ }
33
+ function isSensitiveKey(key) {
34
+ if (REFERENCE_SUFFIXES.some(suffix => key.endsWith(suffix)))
35
+ return false;
36
+ if (exports.SENSITIVE_KEY_PATTERNS.some(re => re.test(key)))
37
+ return true;
38
+ return isBareModelCredential(key);
39
+ }
40
+ /**
41
+ * Normalize a credential name into its env-var-suffix form (matches
42
+ * computeDefaultCredentialEnvVarName: hyphens → underscores, uppercased).
43
+ */
44
+ function normalizeCredentialNameToKey(name) {
45
+ return name.replace(/-/g, '_').toUpperCase();
46
+ }
47
+ /**
48
+ * Validate that an API-key credential NAME won't collide with a reserved
49
+ * reference suffix. A bare API-key credential is stored as
50
+ * `AGENTCORE_CREDENTIAL_<NAME>` carrying the secret value directly; if <NAME>
51
+ * normalizes to end in a reference suffix (e.g. `my-client-id` → `..._CLIENT_ID`)
52
+ * the value is indistinguishable from a non-secret reference and would be left
53
+ * UNENCRYPTED at rest. Reject such names at creation (fail closed).
54
+ *
55
+ * Returns `true` if the name is safe, or an error message string if not — the
56
+ * `(value) => true | string` contract used by both the CLI and the TUI's
57
+ * SecretInput/TextInput `customValidation`.
58
+ */
59
+ function validateCredentialNameEncryptable(name) {
60
+ const normalized = normalizeCredentialNameToKey(name);
61
+ const collision = REFERENCE_SUFFIXES.find(suffix => normalized.endsWith(suffix));
62
+ if (collision) {
63
+ return `Credential name "${name}" ends in a reserved reference suffix (${collision}) and its secret would not be encrypted at rest. Choose a name that does not end in id/client-id/app-id/authorization-id.`;
64
+ }
65
+ return true;
66
+ }
67
+ //# sourceMappingURL=sensitive-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensitive-keys.js","sourceRoot":"","sources":["../../../src/lib/secrets/sensitive-keys.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA2BH,wCAIC;AAsBD,8EAOC;AA1DD,yCAAyC;AACzC,MAAM,eAAe,GAAG;IACtB,iBAAiB;IACjB,gBAAgB;IAChB,4BAA4B;IAC5B,aAAa;IACb,gBAAgB;IAChB,UAAU;CACX,CAAC;AAEF,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;AAE5E,QAAA,sBAAsB,GAAa,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9F;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,cAAc,CAAC,GAAW;IACxC,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,8BAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,iCAAiC,CAAC,IAAY;IAC5D,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,oBAAoB,IAAI,0CAA0C,SAAS,2HAA2H,CAAC;IAChN,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const ONE_SECOND_MS = 1000;
2
+ export declare const ONE_MINUTE_MS: number;
3
+ export declare const ONE_HOUR_MS: number;
4
+ export declare const ONE_DAY_MS: number;
5
+ //# sourceMappingURL=time-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-constants.d.ts","sourceRoot":"","sources":["../../src/lib/time-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,OAAO,CAAC;AAClC,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,WAAW,QAAqB,CAAC;AAC9C,eAAO,MAAM,UAAU,QAAmB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ONE_DAY_MS = exports.ONE_HOUR_MS = exports.ONE_MINUTE_MS = exports.ONE_SECOND_MS = void 0;
4
+ exports.ONE_SECOND_MS = 1000;
5
+ exports.ONE_MINUTE_MS = exports.ONE_SECOND_MS * 60;
6
+ exports.ONE_HOUR_MS = exports.ONE_MINUTE_MS * 60;
7
+ exports.ONE_DAY_MS = exports.ONE_HOUR_MS * 24;
8
+ //# sourceMappingURL=time-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-constants.js","sourceRoot":"","sources":["../../src/lib/time-constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,IAAI,CAAC;AACrB,QAAA,aAAa,GAAG,qBAAa,GAAG,EAAE,CAAC;AACnC,QAAA,WAAW,GAAG,qBAAa,GAAG,EAAE,CAAC;AACjC,QAAA,UAAU,GAAG,mBAAW,GAAG,EAAE,CAAC"}
@@ -4,7 +4,8 @@
4
4
  */
5
5
  export declare function getEnvPath(configRoot?: string): string;
6
6
  /**
7
- * Read agentcore/.env.local.
7
+ * Read agentcore/.env.local. Sensitive values stored as `enc:v1:` envelopes are
8
+ * decrypted transparently; legacy plaintext values are returned as-is.
8
9
  */
9
10
  export declare function readEnvFile(configRoot?: string): Promise<Record<string, string>>;
10
11
  /**
@@ -12,11 +13,16 @@ export declare function readEnvFile(configRoot?: string): Promise<Record<string,
12
13
  */
13
14
  export declare function getEnvVar(key: string, configRoot?: string): Promise<string | undefined>;
14
15
  /**
15
- * Write to agentcore/.env.local. Merges with existing values by default.
16
+ * Write to agentcore/.env.local. Merges with existing values by default and
17
+ * encrypts sensitive values at rest.
16
18
  */
17
19
  export declare function writeEnvFile(updates: Record<string, string>, configRoot?: string, merge?: boolean): Promise<void>;
18
20
  /**
19
21
  * Set a single value in agentcore/.env.local.
20
22
  */
21
23
  export declare function setEnvVar(key: string, value: string, configRoot?: string): Promise<void>;
24
+ /**
25
+ * Remove keys from agentcore/.env.local.
26
+ */
27
+ export declare function removeEnvVars(keys: string[], configRoot?: string): Promise<void>;
22
28
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/env.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAItF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBpH;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9F"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/env.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAItD;AAeD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CActF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7F;AAmBD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpH;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtF"}
@@ -5,8 +5,10 @@ exports.readEnvFile = readEnvFile;
5
5
  exports.getEnvVar = getEnvVar;
6
6
  exports.writeEnvFile = writeEnvFile;
7
7
  exports.setEnvVar = setEnvVar;
8
+ exports.removeEnvVars = removeEnvVars;
8
9
  const constants_1 = require("../constants");
9
10
  const path_resolver_1 = require("../schemas/io/path-resolver");
11
+ const secrets_1 = require("../secrets");
10
12
  const dotenv_1 = require("dotenv");
11
13
  const fs_1 = require("fs");
12
14
  const promises_1 = require("fs/promises");
@@ -21,14 +23,40 @@ function getEnvPath(configRoot) {
21
23
  throw new Error('Could not find agentcore directory');
22
24
  return (0, path_1.join)(root, constants_1.ENV_FILE);
23
25
  }
26
+ /** Escape and serialize an env record to dotenv `KEY="value"` lines. */
27
+ function serializeEnv(env) {
28
+ const lines = Object.entries(env)
29
+ .map(([k, v]) => {
30
+ if (v === undefined || v === null)
31
+ return '';
32
+ if (!/^[a-z_][a-z0-9_]*$/i.test(k))
33
+ throw new Error(`Invalid env key: ${k}`);
34
+ const val = String(v).replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
35
+ return `${k}="${val}"`;
36
+ })
37
+ .filter(Boolean);
38
+ return lines.length > 0 ? lines.join('\n') + '\n' : '';
39
+ }
24
40
  /**
25
- * Read agentcore/.env.local.
41
+ * Read agentcore/.env.local. Sensitive values stored as `enc:v1:` envelopes are
42
+ * decrypted transparently; legacy plaintext values are returned as-is.
26
43
  */
27
44
  async function readEnvFile(configRoot) {
28
45
  const path = getEnvPath(configRoot);
29
46
  if (!(0, fs_1.existsSync)(path))
30
47
  return {};
31
- return (0, dotenv_1.parse)(await (0, promises_1.readFile)(path, 'utf-8'));
48
+ const parsed = (0, dotenv_1.parse)(await (0, promises_1.readFile)(path, 'utf-8'));
49
+ const entries = Object.entries(parsed);
50
+ if (!entries.some(([, v]) => v.startsWith(secrets_1.ENC_PREFIX)))
51
+ return parsed;
52
+ // Try every available key (keychain + keyfile) so a value sealed by either
53
+ // source decrypts even if the active source differs from the one that wrote it.
54
+ const keys = await (0, secrets_1.resolveCandidateKeys)();
55
+ const out = {};
56
+ for (const [k, v] of entries) {
57
+ out[k] = v.startsWith(secrets_1.ENC_PREFIX) ? (0, secrets_1.decryptSecret)(v, keys) : v;
58
+ }
59
+ return out;
32
60
  }
33
61
  /**
34
62
  * Get a single value from agentcore/.env.local.
@@ -36,25 +64,32 @@ async function readEnvFile(configRoot) {
36
64
  async function getEnvVar(key, configRoot) {
37
65
  return (await readEnvFile(configRoot))[key];
38
66
  }
67
+ /** Encrypt sensitive plaintext values; leave non-sensitive and already-encrypted values unchanged. */
68
+ async function encryptSensitive(env) {
69
+ const needsEncryption = Object.entries(env).some(([k, v]) => (0, secrets_1.isSensitiveKey)(k) && v !== undefined && v !== null && !String(v).startsWith(secrets_1.ENC_PREFIX));
70
+ if (!needsEncryption)
71
+ return env;
72
+ const key = await (0, secrets_1.resolveEncryptionKey)();
73
+ const out = {};
74
+ for (const [k, v] of Object.entries(env)) {
75
+ out[k] =
76
+ (0, secrets_1.isSensitiveKey)(k) && v !== undefined && v !== null && !String(v).startsWith(secrets_1.ENC_PREFIX)
77
+ ? (0, secrets_1.encryptSecret)(String(v), key)
78
+ : v;
79
+ }
80
+ return out;
81
+ }
39
82
  /**
40
- * Write to agentcore/.env.local. Merges with existing values by default.
83
+ * Write to agentcore/.env.local. Merges with existing values by default and
84
+ * encrypts sensitive values at rest.
41
85
  */
42
86
  async function writeEnvFile(updates, configRoot, merge = true) {
43
87
  const path = getEnvPath(configRoot);
44
- const current = merge ? await readEnvFile(configRoot) : {};
45
- const env = { ...current, ...updates };
46
- const content = Object.entries(env)
47
- .map(([k, v]) => {
48
- if (v === undefined || v === null)
49
- return '';
50
- if (!/^[a-z_][a-z0-9_]*$/i.test(k))
51
- throw new Error(`Invalid env key: ${k}`);
52
- const val = String(v).replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
53
- return `${k}="${val}"`;
54
- })
55
- .filter(Boolean)
56
- .join('\n') + '\n';
57
- await (0, promises_1.writeFile)(path, content);
88
+ // Merge against the RAW on-disk values (still encrypted) so we never decrypt
89
+ // then re-encrypt unchanged secrets; encryptSensitive skips enc:v1: values.
90
+ const current = merge && (0, fs_1.existsSync)(path) ? (0, dotenv_1.parse)(await (0, promises_1.readFile)(path, 'utf-8')) : {};
91
+ const env = await encryptSensitive({ ...current, ...updates });
92
+ await (0, promises_1.writeFile)(path, serializeEnv(env));
58
93
  }
59
94
  /**
60
95
  * Set a single value in agentcore/.env.local.
@@ -62,4 +97,17 @@ async function writeEnvFile(updates, configRoot, merge = true) {
62
97
  async function setEnvVar(key, value, configRoot) {
63
98
  await writeEnvFile({ [key]: value }, configRoot);
64
99
  }
100
+ /**
101
+ * Remove keys from agentcore/.env.local.
102
+ */
103
+ async function removeEnvVars(keys, configRoot) {
104
+ const path = getEnvPath(configRoot);
105
+ if (!(0, fs_1.existsSync)(path))
106
+ return;
107
+ const current = (0, dotenv_1.parse)(await (0, promises_1.readFile)(path, 'utf-8')); // raw (encrypted) values
108
+ for (const key of keys)
109
+ delete current[key];
110
+ const env = await encryptSensitive(current); // re-encrypts any legacy plaintext among the remainder
111
+ await (0, promises_1.writeFile)(path, serializeEnv(env));
112
+ }
65
113
  //# sourceMappingURL=env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/utils/env.ts"],"names":[],"mappings":";;AAWA,gCAIC;AAKD,kCAIC;AAKD,8BAEC;AAKD,oCAmBC;AAKD,8BAEC;AA9DD,4CAAwC;AACxC,+DAA6D;AAC7D,mCAA+B;AAC/B,2BAAgC;AAChC,0CAAkD;AAClD,+BAA4B;AAE5B;;;GAGG;AACH,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,IAAA,8BAAc,GAAE,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACjE,OAAO,IAAA,WAAI,EAAC,IAAI,EAAE,oBAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,UAAmB;IACnD,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,IAAA,cAAK,EAAC,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,UAAmB;IAC9D,OAAO,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,OAA+B,EAAE,UAAmB,EAAE,KAAK,GAAG,IAAI;IACnG,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAEvC,MAAM,OAAO,GACX,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACd,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAE7E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9G,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEvB,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa,EAAE,UAAmB;IAC7E,MAAM,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/utils/env.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  export { detectAwsAccount } from './aws-account';
2
2
  export { SecureCredentials } from './credentials';
3
- export { getEnvPath, readEnvFile, writeEnvFile, getEnvVar, setEnvVar } from './env';
3
+ export { getEnvPath, readEnvFile, writeEnvFile, getEnvVar, setEnvVar, removeEnvVars } from './env';
4
4
  export { isWindows } from './platform';
5
5
  export { runSubprocess, checkSubprocess, runSubprocessCapture, type SubprocessOptions, type SubprocessResult, } from './subprocess';
6
6
  export { parseTimeString } from './time-parser';
7
7
  export { parseJsonRpcResponse } from './json-rpc';
8
- export { validateAgentSchema, validateProjectSchema } from './zod';
8
+ export { poll, isThrottlingError } from './polling';
9
+ export { validateAgentSchema, validateProjectSchema, resilientParse, type ResilientParseOptions } from './zod';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,OAAO,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateProjectSchema = exports.validateAgentSchema = exports.parseJsonRpcResponse = exports.parseTimeString = exports.runSubprocessCapture = exports.checkSubprocess = exports.runSubprocess = exports.isWindows = exports.setEnvVar = exports.getEnvVar = exports.writeEnvFile = exports.readEnvFile = exports.getEnvPath = exports.SecureCredentials = exports.detectAwsAccount = void 0;
3
+ exports.resilientParse = exports.validateProjectSchema = exports.validateAgentSchema = exports.isThrottlingError = exports.poll = exports.parseJsonRpcResponse = exports.parseTimeString = exports.runSubprocessCapture = exports.checkSubprocess = exports.runSubprocess = exports.isWindows = exports.removeEnvVars = exports.setEnvVar = exports.getEnvVar = exports.writeEnvFile = exports.readEnvFile = exports.getEnvPath = exports.SecureCredentials = exports.detectAwsAccount = void 0;
4
4
  var aws_account_1 = require("./aws-account");
5
5
  Object.defineProperty(exports, "detectAwsAccount", { enumerable: true, get: function () { return aws_account_1.detectAwsAccount; } });
6
6
  var credentials_1 = require("./credentials");
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "readEnvFile", { enumerable: true, get: function
11
11
  Object.defineProperty(exports, "writeEnvFile", { enumerable: true, get: function () { return env_1.writeEnvFile; } });
12
12
  Object.defineProperty(exports, "getEnvVar", { enumerable: true, get: function () { return env_1.getEnvVar; } });
13
13
  Object.defineProperty(exports, "setEnvVar", { enumerable: true, get: function () { return env_1.setEnvVar; } });
14
+ Object.defineProperty(exports, "removeEnvVars", { enumerable: true, get: function () { return env_1.removeEnvVars; } });
14
15
  var platform_1 = require("./platform");
15
16
  Object.defineProperty(exports, "isWindows", { enumerable: true, get: function () { return platform_1.isWindows; } });
16
17
  var subprocess_1 = require("./subprocess");
@@ -21,7 +22,11 @@ var time_parser_1 = require("./time-parser");
21
22
  Object.defineProperty(exports, "parseTimeString", { enumerable: true, get: function () { return time_parser_1.parseTimeString; } });
22
23
  var json_rpc_1 = require("./json-rpc");
23
24
  Object.defineProperty(exports, "parseJsonRpcResponse", { enumerable: true, get: function () { return json_rpc_1.parseJsonRpcResponse; } });
25
+ var polling_1 = require("./polling");
26
+ Object.defineProperty(exports, "poll", { enumerable: true, get: function () { return polling_1.poll; } });
27
+ Object.defineProperty(exports, "isThrottlingError", { enumerable: true, get: function () { return polling_1.isThrottlingError; } });
24
28
  var zod_1 = require("./zod");
25
29
  Object.defineProperty(exports, "validateAgentSchema", { enumerable: true, get: function () { return zod_1.validateAgentSchema; } });
26
30
  Object.defineProperty(exports, "validateProjectSchema", { enumerable: true, get: function () { return zod_1.validateProjectSchema; } });
31
+ Object.defineProperty(exports, "resilientParse", { enumerable: true, get: function () { return zod_1.resilientParse; } });
27
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/utils/index.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA;AACzB,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA;AAC1B,6BAAoF;AAA3E,iGAAA,UAAU,OAAA;AAAE,kGAAA,WAAW,OAAA;AAAE,mGAAA,YAAY,OAAA;AAAE,gGAAA,SAAS,OAAA;AAAE,gGAAA,SAAS,OAAA;AACpE,uCAAuC;AAA9B,qGAAA,SAAS,OAAA;AAClB,2CAMsB;AALpB,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AACf,kHAAA,oBAAoB,OAAA;AAItB,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAC7B,6BAAmE;AAA1D,0GAAA,mBAAmB,OAAA;AAAE,4GAAA,qBAAqB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/utils/index.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA;AACzB,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA;AAC1B,6BAAmG;AAA1F,iGAAA,UAAU,OAAA;AAAE,kGAAA,WAAW,OAAA;AAAE,mGAAA,YAAY,OAAA;AAAE,gGAAA,SAAS,OAAA;AAAE,gGAAA,SAAS,OAAA;AAAE,oGAAA,aAAa,OAAA;AACnF,uCAAuC;AAA9B,qGAAA,SAAS,OAAA;AAClB,2CAMsB;AALpB,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AACf,kHAAA,oBAAoB,OAAA;AAItB,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAC7B,qCAAoD;AAA3C,+FAAA,IAAI,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAChC,6BAA+G;AAAtG,0GAAA,mBAAmB,OAAA;AAAE,4GAAA,qBAAqB,OAAA;AAAE,qGAAA,cAAc,OAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared polling/retry utility for async operations.
3
+ */
4
+ export type PollResult<T> = {
5
+ done: true;
6
+ value: T;
7
+ } | {
8
+ done: false;
9
+ };
10
+ export interface PollOptions<T> {
11
+ /** Async function called each iteration. Return {done: true, value} when complete, {done: false} to keep polling. */
12
+ fn: () => Promise<PollResult<T>>;
13
+ /** Max number of attempts before throwing PollExhaustedError. */
14
+ maxAttempts?: number;
15
+ /** Max total time in ms before throwing PollTimeoutError. */
16
+ timeoutMs?: number;
17
+ /** Delay between iterations in ms. Default 5000. */
18
+ delayMs?: number;
19
+ /** Multiply delay by this factor each iteration. Default 1 (fixed). */
20
+ backoffFactor?: number;
21
+ /** Cap on delay in ms. */
22
+ maxDelayMs?: number;
23
+ /** Abort after this many consecutive errors. */
24
+ maxConsecutiveErrors?: number;
25
+ /** Called when fn throws. Return 'retry' to continue or 'abort' to rethrow. Default: 'retry'. */
26
+ onError?: (err: unknown) => 'retry' | 'abort';
27
+ }
28
+ export declare function poll<T>(options: PollOptions<T>): Promise<T>;
29
+ /** Check if an error is an AWS throttling/rate-limit error. */
30
+ export declare function isThrottlingError(err: unknown): boolean;
31
+ //# sourceMappingURL=polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/polling.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,qHAAqH;IACrH,EAAE,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC;CAC/C;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAsDjE;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAYvD"}