@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.
- package/README.md +193 -33
- package/dist/agent-inspector/index.css +1 -1
- package/dist/agent-inspector/index.js +99 -84
- package/dist/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap +3132 -366
- package/dist/assets/__tests__/__snapshots__/dockerfile-render.test.ts.snap +6 -2
- package/dist/assets/__tests__/assets.snapshot.test.ts +10 -24
- package/dist/assets/__tests__/googleadk-session-eviction.test.ts +87 -0
- package/dist/assets/__tests__/summarization-namespace.test.ts +43 -0
- package/dist/assets/agents/AGENTS.md +87 -11
- package/dist/assets/cdk/bin/cdk.ts +87 -26
- package/dist/assets/cdk/lib/cdk-stack.ts +185 -55
- package/dist/assets/cdk/package.json +1 -1
- package/dist/assets/cdk/test/cdk.test.ts +4 -0
- package/dist/assets/container/python/Dockerfile +7 -1
- package/dist/assets/container/typescript/Dockerfile +25 -0
- package/dist/assets/container/typescript/dockerignore.template +24 -0
- package/dist/assets/datasets/predefined-v1.jsonl +3 -0
- package/dist/assets/datasets/simulated-v1.jsonl +3 -0
- package/dist/assets/python/a2a/googleadk/base/main.py +24 -16
- package/dist/assets/python/a2a/googleadk/base/pyproject.toml +3 -3
- package/dist/assets/python/a2a/langchain_langgraph/base/main.py +24 -16
- package/dist/assets/python/a2a/langchain_langgraph/base/pyproject.toml +3 -2
- package/dist/assets/python/a2a/strands/base/main.py +23 -17
- package/dist/assets/python/a2a/strands/base/pyproject.toml +2 -2
- package/dist/assets/python/a2a/strands/capabilities/memory/session.py +10 -2
- package/dist/assets/python/agui/googleadk/base/main.py +62 -2
- package/dist/assets/python/agui/googleadk/base/pyproject.toml +3 -3
- package/dist/assets/python/agui/langchain_langgraph/base/main.py +56 -0
- package/dist/assets/python/agui/langchain_langgraph/base/pyproject.toml +2 -1
- package/dist/assets/python/agui/strands/base/main.py +63 -1
- package/dist/assets/python/agui/strands/base/pyproject.toml +1 -1
- package/dist/assets/python/agui/strands/capabilities/memory/session.py +10 -2
- package/dist/assets/python/http/autogen/base/main.py +60 -29
- package/dist/assets/python/http/autogen/base/pyproject.toml +1 -1
- package/dist/assets/python/http/googleadk/base/main.py +69 -24
- package/dist/assets/python/http/googleadk/base/mcp_client/client.py +7 -7
- package/dist/assets/python/http/googleadk/base/pyproject.toml +2 -1
- package/dist/assets/python/http/langchain_langgraph/base/main.py +115 -24
- package/dist/assets/python/http/langchain_langgraph/base/mcp_client/client.py +10 -8
- package/dist/assets/python/http/langchain_langgraph/base/pyproject.toml +3 -2
- package/dist/assets/python/http/openaiagents/base/main.py +61 -32
- package/dist/assets/python/http/openaiagents/base/mcp_client/client.py +4 -4
- package/dist/assets/python/http/openaiagents/base/pyproject.toml +2 -2
- package/dist/assets/python/http/strands/base/main.py +571 -47
- package/dist/assets/python/http/strands/base/mcp_client/client.py +49 -6
- package/dist/assets/python/http/strands/base/model/load.py +119 -3
- package/dist/assets/python/http/strands/base/model/mantle_compat.py +21 -0
- package/dist/assets/python/http/strands/base/pyproject.toml +9 -3
- package/dist/assets/python/http/strands/base/skills/fetcher.py +279 -0
- package/dist/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
- package/dist/assets/python/http/strands/capabilities/memory/session.py +10 -2
- package/dist/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
- package/dist/assets/python/http/strands/capabilities/payments/payments.py +142 -0
- package/dist/assets/python/mcp/standalone/base/main.py +58 -0
- package/dist/assets/typescript/http/strands/base/README.md +37 -0
- package/dist/assets/typescript/http/strands/base/gitignore.template +22 -0
- package/dist/assets/typescript/http/strands/base/main.ts +144 -0
- package/dist/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
- package/dist/assets/typescript/http/strands/base/model/load.ts +102 -0
- package/dist/assets/typescript/http/strands/base/package.json +38 -0
- package/dist/assets/typescript/http/strands/base/tsconfig.json +19 -0
- package/dist/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
- package/dist/assets/typescript/http/vercelai/base/README.md +37 -0
- package/dist/assets/typescript/http/vercelai/base/gitignore.template +22 -0
- package/dist/assets/typescript/http/vercelai/base/main.ts +64 -0
- package/dist/assets/typescript/http/vercelai/base/model/load.ts +121 -0
- package/dist/assets/typescript/http/vercelai/base/package.json +35 -0
- package/dist/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
- package/dist/cli/index.mjs +1443 -569
- package/dist/lib/constants.d.ts +8 -4
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +13 -7
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors/index.d.ts +1 -1
- package/dist/lib/errors/index.d.ts.map +1 -1
- package/dist/lib/errors/index.js +1 -1
- package/dist/lib/errors/index.js.map +1 -1
- package/dist/lib/errors/types.d.ts +259 -0
- package/dist/lib/errors/types.d.ts.map +1 -0
- package/dist/lib/errors/types.js +402 -0
- package/dist/lib/errors/types.js.map +1 -0
- package/dist/lib/errors/zod.d.ts +8 -0
- package/dist/lib/errors/zod.d.ts.map +1 -0
- package/dist/lib/errors/{config.js → zod.js} +8 -81
- package/dist/lib/errors/zod.js.map +1 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +4 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/packaging/build-args.d.ts +6 -0
- package/dist/lib/packaging/build-args.d.ts.map +1 -1
- package/dist/lib/packaging/build-args.js +11 -2
- package/dist/lib/packaging/build-args.js.map +1 -1
- package/dist/lib/packaging/build-context-dockerignore.d.ts +23 -0
- package/dist/lib/packaging/build-context-dockerignore.d.ts.map +1 -0
- package/dist/lib/packaging/build-context-dockerignore.js +63 -0
- package/dist/lib/packaging/build-context-dockerignore.js.map +1 -0
- package/dist/lib/packaging/build-context.d.ts +21 -0
- package/dist/lib/packaging/build-context.d.ts.map +1 -0
- package/dist/lib/packaging/build-context.js +21 -0
- package/dist/lib/packaging/build-context.js.map +1 -0
- package/dist/lib/packaging/container.d.ts.map +1 -1
- package/dist/lib/packaging/container.js +20 -9
- package/dist/lib/packaging/container.js.map +1 -1
- package/dist/lib/packaging/helpers.d.ts +16 -0
- package/dist/lib/packaging/helpers.d.ts.map +1 -1
- package/dist/lib/packaging/helpers.js +127 -29
- package/dist/lib/packaging/helpers.js.map +1 -1
- package/dist/lib/packaging/index.d.ts +2 -1
- package/dist/lib/packaging/index.d.ts.map +1 -1
- package/dist/lib/packaging/index.js +9 -20
- package/dist/lib/packaging/index.js.map +1 -1
- package/dist/lib/packaging/node.d.ts +2 -2
- package/dist/lib/packaging/node.d.ts.map +1 -1
- package/dist/lib/packaging/node.js +83 -38
- package/dist/lib/packaging/node.js.map +1 -1
- package/dist/lib/packaging/python.js +12 -12
- package/dist/lib/packaging/python.js.map +1 -1
- package/dist/lib/result.d.ts +50 -0
- package/dist/lib/result.d.ts.map +1 -0
- package/dist/lib/result.js +49 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemas/io/config-io.d.ts +8 -0
- package/dist/lib/schemas/io/config-io.d.ts.map +1 -1
- package/dist/lib/schemas/io/config-io.js +21 -3
- package/dist/lib/schemas/io/config-io.js.map +1 -1
- package/dist/lib/schemas/io/global-config.d.ts +40 -0
- package/dist/lib/schemas/io/global-config.d.ts.map +1 -0
- package/dist/lib/schemas/io/global-config.js +118 -0
- package/dist/lib/schemas/io/global-config.js.map +1 -0
- package/dist/lib/schemas/io/index.d.ts +1 -2
- package/dist/lib/schemas/io/index.d.ts.map +1 -1
- package/dist/lib/schemas/io/index.js +1 -4
- package/dist/lib/schemas/io/index.js.map +1 -1
- package/dist/lib/schemas/io/path-resolver.d.ts +0 -6
- package/dist/lib/schemas/io/path-resolver.d.ts.map +1 -1
- package/dist/lib/schemas/io/path-resolver.js +3 -13
- package/dist/lib/schemas/io/path-resolver.js.map +1 -1
- package/dist/lib/secrets/cipher.d.ts +12 -0
- package/dist/lib/secrets/cipher.d.ts.map +1 -0
- package/dist/lib/secrets/cipher.js +54 -0
- package/dist/lib/secrets/cipher.js.map +1 -0
- package/dist/lib/secrets/index.d.ts +4 -0
- package/dist/lib/secrets/index.d.ts.map +1 -0
- package/dist/lib/secrets/index.js +15 -0
- package/dist/lib/secrets/index.js.map +1 -0
- package/dist/lib/secrets/key-provider.d.ts +16 -0
- package/dist/lib/secrets/key-provider.d.ts.map +1 -0
- package/dist/lib/secrets/key-provider.js +191 -0
- package/dist/lib/secrets/key-provider.js.map +1 -0
- package/dist/lib/secrets/sensitive-keys.d.ts +21 -0
- package/dist/lib/secrets/sensitive-keys.d.ts.map +1 -0
- package/dist/lib/secrets/sensitive-keys.js +67 -0
- package/dist/lib/secrets/sensitive-keys.js.map +1 -0
- package/dist/lib/time-constants.d.ts +5 -0
- package/dist/lib/time-constants.d.ts.map +1 -0
- package/dist/lib/time-constants.js +8 -0
- package/dist/lib/time-constants.js.map +1 -0
- package/dist/lib/utils/env.d.ts +8 -2
- package/dist/lib/utils/env.d.ts.map +1 -1
- package/dist/lib/utils/env.js +65 -17
- package/dist/lib/utils/env.js.map +1 -1
- package/dist/lib/utils/index.d.ts +3 -2
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js +6 -1
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/lib/utils/polling.d.ts +31 -0
- package/dist/lib/utils/polling.d.ts.map +1 -0
- package/dist/lib/utils/polling.js +61 -0
- package/dist/lib/utils/polling.js.map +1 -0
- package/dist/lib/utils/zod.d.ts +16 -0
- package/dist/lib/utils/zod.d.ts.map +1 -1
- package/dist/lib/utils/zod.js +45 -0
- package/dist/lib/utils/zod.js.map +1 -1
- package/dist/schema/constants.d.ts +56 -2
- package/dist/schema/constants.d.ts.map +1 -1
- package/dist/schema/constants.js +82 -7
- package/dist/schema/constants.js.map +1 -1
- package/dist/schema/schemas/agent-env.d.ts +178 -6
- package/dist/schema/schemas/agent-env.d.ts.map +1 -1
- package/dist/schema/schemas/agent-env.js +302 -27
- package/dist/schema/schemas/agent-env.js.map +1 -1
- package/dist/schema/schemas/agentcore-project.d.ts +450 -11
- package/dist/schema/schemas/agentcore-project.d.ts.map +1 -1
- package/dist/schema/schemas/agentcore-project.js +283 -18
- package/dist/schema/schemas/agentcore-project.js.map +1 -1
- package/dist/schema/schemas/auth.d.ts +174 -0
- package/dist/schema/schemas/auth.d.ts.map +1 -1
- package/dist/schema/schemas/auth.js +127 -3
- package/dist/schema/schemas/auth.js.map +1 -1
- package/dist/schema/schemas/aws-targets.d.ts +12 -0
- package/dist/schema/schemas/aws-targets.d.ts.map +1 -1
- package/dist/schema/schemas/aws-targets.js +4 -0
- package/dist/schema/schemas/aws-targets.js.map +1 -1
- package/dist/schema/schemas/connections.d.ts +185 -0
- package/dist/schema/schemas/connections.d.ts.map +1 -0
- package/dist/schema/schemas/connections.js +176 -0
- package/dist/schema/schemas/connections.js.map +1 -0
- package/dist/schema/schemas/deployed-state.d.ts +361 -5
- package/dist/schema/schemas/deployed-state.d.ts.map +1 -1
- package/dist/schema/schemas/deployed-state.js +105 -2
- package/dist/schema/schemas/deployed-state.js.map +1 -1
- package/dist/schema/schemas/index.d.ts +1 -0
- package/dist/schema/schemas/index.d.ts.map +1 -1
- package/dist/schema/schemas/index.js +1 -0
- package/dist/schema/schemas/index.js.map +1 -1
- package/dist/schema/schemas/mcp-defs.d.ts +2 -1
- package/dist/schema/schemas/mcp-defs.d.ts.map +1 -1
- package/dist/schema/schemas/mcp-defs.js +3 -2
- package/dist/schema/schemas/mcp-defs.js.map +1 -1
- package/dist/schema/schemas/mcp.d.ts +199 -0
- package/dist/schema/schemas/mcp.d.ts.map +1 -1
- package/dist/schema/schemas/mcp.js +343 -6
- package/dist/schema/schemas/mcp.js.map +1 -1
- package/dist/schema/schemas/primitives/ab-test.d.ts +135 -0
- package/dist/schema/schemas/primitives/ab-test.d.ts.map +1 -0
- package/dist/schema/schemas/primitives/ab-test.js +95 -0
- package/dist/schema/schemas/primitives/ab-test.js.map +1 -0
- package/dist/schema/schemas/primitives/config-bundle.d.ts +32 -0
- package/dist/schema/schemas/primitives/config-bundle.d.ts.map +1 -0
- package/dist/schema/schemas/primitives/config-bundle.js +41 -0
- package/dist/schema/schemas/primitives/config-bundle.js.map +1 -0
- package/dist/schema/schemas/primitives/dataset.d.ts +48 -0
- package/dist/schema/schemas/primitives/dataset.d.ts.map +1 -0
- package/dist/schema/schemas/primitives/dataset.js +58 -0
- package/dist/schema/schemas/primitives/dataset.js.map +1 -0
- package/dist/schema/schemas/primitives/evaluator.d.ts +8 -0
- package/dist/schema/schemas/primitives/evaluator.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/evaluator.js +17 -1
- package/dist/schema/schemas/primitives/evaluator.js.map +1 -1
- package/dist/schema/schemas/primitives/harness.d.ts +377 -19
- package/dist/schema/schemas/primitives/harness.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/harness.js +379 -24
- package/dist/schema/schemas/primitives/harness.js.map +1 -1
- package/dist/schema/schemas/primitives/index.d.ts +13 -7
- package/dist/schema/schemas/primitives/index.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/index.js +37 -1
- package/dist/schema/schemas/primitives/index.js.map +1 -1
- package/dist/schema/schemas/primitives/knowledge-base.d.ts +104 -0
- package/dist/schema/schemas/primitives/knowledge-base.d.ts.map +1 -0
- package/dist/schema/schemas/primitives/knowledge-base.js +99 -0
- package/dist/schema/schemas/primitives/knowledge-base.js.map +1 -0
- package/dist/schema/schemas/primitives/memory.d.ts +22 -4
- package/dist/schema/schemas/primitives/memory.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/memory.js +57 -16
- package/dist/schema/schemas/primitives/memory.js.map +1 -1
- package/dist/schema/schemas/primitives/online-eval-config.d.ts +21 -2
- package/dist/schema/schemas/primitives/online-eval-config.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/online-eval-config.js +45 -5
- package/dist/schema/schemas/primitives/online-eval-config.js.map +1 -1
- package/dist/schema/schemas/primitives/payment.d.ts +54 -0
- package/dist/schema/schemas/primitives/payment.d.ts.map +1 -0
- package/dist/schema/schemas/primitives/payment.js +79 -0
- package/dist/schema/schemas/primitives/payment.js.map +1 -0
- package/dist/schema/schemas/primitives/policy.d.ts +26 -0
- package/dist/schema/schemas/primitives/policy.d.ts.map +1 -1
- package/dist/schema/schemas/primitives/policy.js +5 -1
- package/dist/schema/schemas/primitives/policy.js.map +1 -1
- package/npm-shrinkwrap.json +17013 -0
- package/package.json +43 -21
- package/scripts/bump-version.ts +4 -4
- package/scripts/bundle.mjs +70 -41
- package/scripts/extract-cli-model.mjs +228 -0
- package/scripts/render_adoc.py +274 -0
- package/scripts/run-e2e-dev.sh +56 -0
- package/scripts/run-e2e-local.sh +145 -0
- package/dist/lib/errors/config.d.ts +0 -49
- package/dist/lib/errors/config.d.ts.map +0 -1
- package/dist/lib/errors/config.js.map +0 -1
- package/dist/lib/packaging/errors.d.ts +0 -16
- package/dist/lib/packaging/errors.d.ts.map +0 -1
- package/dist/lib/packaging/errors.js +0 -36
- package/dist/lib/packaging/errors.js.map +0 -1
- package/dist/lib/schemas/io/cli-config.d.ts +0 -12
- package/dist/lib/schemas/io/cli-config.d.ts.map +0 -1
- package/dist/lib/schemas/io/cli-config.js +0 -35
- 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmIA,oDAKC;AASD,oDAOC;AAGD,0DAEC;AA7JD,2CAAwD;AACxD,6CAA0C;AAC1C,qCAA6E;AAC7E,qCAAkC;AAClC,yCAAiC;AAEjC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,gBAAgB,GAAG,eAAe,CAAC;AACzC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEhD,IAAI,SAAS,GAAkB,IAAI,CAAC;AAWpC,mGAAmG;AACnG,KAAK,UAAU,cAAc;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC;QACH,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,wDAAa,kBAAkB,GAAC,CAAkB,CAAC;QACtE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,QAAQ;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,IAAA,yBAAW,EAAC,SAAS,CAAC,CAAC;QACnC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,wEAAwE;QACxE,sEAAsE;QACtE,2EAA2E;QAC3E,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,SAAS;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,YAAY,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAA,gBAAI,EAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,sFAAsF;AACtF,SAAS,iBAAiB,CAAC,GAAW,EAAE,IAAY;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACzC,MAAM,IAAI,6BAAqB,CAC7B,0BAA0B,IAAI,yBAAyB,SAAS,iBAAiB,GAAG,CAAC,MAAM,KAAK;QAC9F,6EAA6E,CAChF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,0EAA0E;YAC1E,uEAAuE;YACvE,+BAA+B;YAC/B,OAAO,iBAAiB,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,IAAA,mBAAS,EAAC,gBAAgB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAA,yBAAW,EAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,oEAAoE;YACpE,mEAAmE;YACnE,sEAAsE;YACtE,IAAA,uBAAa,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAK,QAAkC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1D,OAAO,iBAAiB,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAAqB;YAAE,MAAM,GAAG,CAAC;QACpD,MAAM,IAAI,6BAAqB,CAAC,0DAA0D,IAAI,GAAG,EAAE;YACjG,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,uBAAuB;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,GAAG,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,wBAAwB;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,wDAAa,kBAAkB,GAAC,CAAkB,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7E,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,oBAAoB;IACxC,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,cAAc,EAAE,CAAC;IAC5C,SAAS,GAAG,YAAY,IAAI,UAAU,EAAE,CAAC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB;IACxC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,YAAY,GAAG,MAAM,wBAAwB,EAAE,CAAC;IACtD,IAAI,YAAY;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;IAC9C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,SAAgB,uBAAuB;IACrC,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/lib/utils/env.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/lib/utils/env.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
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":";;
|
|
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 {
|
|
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;
|
|
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"}
|
package/dist/lib/utils/index.js
CHANGED
|
@@ -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,
|
|
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"}
|