@the-ai-company/cbio-node-runtime 0.39.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -54
- package/dist/clients/agent/client.d.ts +9 -0
- package/dist/clients/agent/client.js +72 -0
- package/dist/clients/agent/client.js.map +1 -0
- package/dist/clients/agent/contracts.d.ts +34 -0
- package/dist/clients/agent/contracts.js +2 -0
- package/dist/clients/agent/contracts.js.map +1 -0
- package/dist/clients/agent/index.d.ts +3 -0
- package/dist/clients/agent/index.js +2 -0
- package/dist/clients/agent/index.js.map +1 -0
- package/dist/clients/owner/client.d.ts +18 -0
- package/dist/clients/owner/client.js +169 -0
- package/dist/clients/owner/client.js.map +1 -0
- package/dist/clients/owner/contracts.d.ts +34 -0
- package/dist/clients/owner/contracts.js +2 -0
- package/dist/clients/owner/contracts.js.map +1 -0
- package/dist/clients/owner/index.d.ts +3 -0
- package/dist/clients/owner/index.js +2 -0
- package/dist/clients/owner/index.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -10
- package/dist/runtime/index.js +8 -7
- package/dist/runtime/index.js.map +1 -1
- package/dist/storage/fs.d.ts +1 -0
- package/dist/storage/fs.js +28 -0
- package/dist/storage/fs.js.map +1 -1
- package/dist/storage/memory.d.ts +1 -0
- package/dist/storage/memory.js +20 -0
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/provider.d.ts +2 -0
- package/dist/vault-core/contracts.d.ts +230 -0
- package/dist/vault-core/contracts.js +2 -0
- package/dist/vault-core/contracts.js.map +1 -0
- package/dist/vault-core/core.d.ts +21 -0
- package/dist/vault-core/core.js +335 -0
- package/dist/vault-core/core.js.map +1 -0
- package/dist/vault-core/defaults.d.ts +141 -0
- package/dist/vault-core/defaults.js +602 -0
- package/dist/vault-core/defaults.js.map +1 -0
- package/dist/vault-core/errors.d.ts +4 -0
- package/dist/vault-core/errors.js +9 -0
- package/dist/vault-core/errors.js.map +1 -0
- package/dist/vault-core/index.d.ts +6 -0
- package/dist/vault-core/index.js +5 -0
- package/dist/vault-core/index.js.map +1 -0
- package/dist/vault-core/persistence.d.ts +87 -0
- package/dist/vault-core/persistence.js +309 -0
- package/dist/vault-core/persistence.js.map +1 -0
- package/dist/vault-core/ports.d.ts +101 -0
- package/dist/vault-core/ports.js +2 -0
- package/dist/vault-core/ports.js.map +1 -0
- package/dist/vault-ingress/defaults.d.ts +14 -0
- package/dist/vault-ingress/defaults.js +41 -0
- package/dist/vault-ingress/defaults.js.map +1 -0
- package/dist/vault-ingress/flow-factories.d.ts +24 -0
- package/dist/vault-ingress/flow-factories.js +48 -0
- package/dist/vault-ingress/flow-factories.js.map +1 -0
- package/dist/vault-ingress/index.d.ts +81 -0
- package/dist/vault-ingress/index.js +357 -0
- package/dist/vault-ingress/index.js.map +1 -0
- package/docs/ARCHITECTURE.md +44 -76
- package/docs/REFERENCE.md +217 -218
- package/docs/WORKS_WITH_CUSTOM_FETCH.md +16 -191
- package/docs/es/README.md +8 -24
- package/docs/fr/README.md +8 -24
- package/docs/ja/README.md +8 -24
- package/docs/ko/README.md +8 -24
- package/docs/pt/README.md +8 -24
- package/docs/zh/README.md +21 -7
- package/package.json +2 -10
- package/dist/agent/agent.d.ts +0 -267
- package/dist/agent/agent.js +0 -689
- package/dist/agent/agent.js.map +0 -1
- package/dist/audit/ActivityLog.d.ts +0 -25
- package/dist/audit/ActivityLog.js +0 -71
- package/dist/audit/ActivityLog.js.map +0 -1
- package/dist/http/authClient.d.ts +0 -26
- package/dist/http/authClient.js +0 -132
- package/dist/http/authClient.js.map +0 -1
- package/dist/http/genericSecretValidator.d.ts +0 -11
- package/dist/http/genericSecretValidator.js +0 -42
- package/dist/http/genericSecretValidator.js.map +0 -1
- package/dist/http/localAuthProxy.d.ts +0 -33
- package/dist/http/localAuthProxy.js +0 -93
- package/dist/http/localAuthProxy.js.map +0 -1
- package/dist/http/localSecretIngress.d.ts +0 -33
- package/dist/http/localSecretIngress.js +0 -162
- package/dist/http/localSecretIngress.js.map +0 -1
- package/dist/http/secretAcquisition.d.ts +0 -54
- package/dist/http/secretAcquisition.js +0 -177
- package/dist/http/secretAcquisition.js.map +0 -1
- package/dist/protocol/childSecretNaming.d.ts +0 -7
- package/dist/protocol/childSecretNaming.js +0 -12
- package/dist/protocol/childSecretNaming.js.map +0 -1
- package/dist/protocol/identity.d.ts +0 -8
- package/dist/protocol/identity.js +0 -16
- package/dist/protocol/identity.js.map +0 -1
- package/dist/sealed/index.d.ts +0 -6
- package/dist/sealed/index.js +0 -6
- package/dist/sealed/index.js.map +0 -1
- package/dist/vault/secretPolicy.d.ts +0 -3
- package/dist/vault/secretPolicy.js +0 -14
- package/dist/vault/secretPolicy.js.map +0 -1
- package/dist/vault/vault.d.ts +0 -100
- package/dist/vault/vault.js +0 -603
- package/dist/vault/vault.js.map +0 -1
- package/docs/TODO-multi-vault.md +0 -29
- package/docs/spec/runtime/README.md +0 -44
- package/docs/spec/runtime/activity-log.md +0 -71
- package/docs/spec/runtime/exposure-surfaces.md +0 -99
- package/docs/spec/runtime/managed-agent-record.md +0 -52
- package/docs/spec/runtime/merge-rules.md +0 -52
- package/docs/spec/runtime/secret-origin-policy.md +0 -46
- package/docs/spec/runtime/secret-validation.md +0 -113
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import * as crypto from "node:crypto";
|
|
2
|
-
import * as http from "node:http";
|
|
3
|
-
function normalizeIngressPath(input) {
|
|
4
|
-
if (!input)
|
|
5
|
-
return `/cbio/ingest/${crypto.randomBytes(12).toString("hex")}`;
|
|
6
|
-
return input.startsWith("/") ? input : `/${input}`;
|
|
7
|
-
}
|
|
8
|
-
function isAuthorized(req, authToken) {
|
|
9
|
-
const header = req.headers.authorization;
|
|
10
|
-
if (typeof header === "string" && header === `Bearer ${authToken}`) {
|
|
11
|
-
return true;
|
|
12
|
-
}
|
|
13
|
-
const fallback = req.headers["x-cbio-ingest-token"];
|
|
14
|
-
return typeof fallback === "string" && fallback === authToken;
|
|
15
|
-
}
|
|
16
|
-
async function readRequestBody(req, maxBodyBytes) {
|
|
17
|
-
const chunks = [];
|
|
18
|
-
let total = 0;
|
|
19
|
-
for await (const chunk of req) {
|
|
20
|
-
const next = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
21
|
-
total += next.length;
|
|
22
|
-
if (total > maxBodyBytes) {
|
|
23
|
-
throw new Error("CBIO_LOCAL_SECRET_TOO_LARGE");
|
|
24
|
-
}
|
|
25
|
-
chunks.push(next);
|
|
26
|
-
}
|
|
27
|
-
return Buffer.concat(chunks);
|
|
28
|
-
}
|
|
29
|
-
function extractSecret(body, contentType) {
|
|
30
|
-
const normalizedType = (contentType ?? "").split(";")[0].trim().toLowerCase();
|
|
31
|
-
if (normalizedType === "application/json") {
|
|
32
|
-
const parsed = JSON.parse(body.toString("utf8"));
|
|
33
|
-
const candidate = parsed.secret ?? parsed.value ?? parsed.token;
|
|
34
|
-
if (typeof candidate !== "string" || candidate.length === 0) {
|
|
35
|
-
throw new Error("CBIO_LOCAL_SECRET_MISSING");
|
|
36
|
-
}
|
|
37
|
-
return candidate;
|
|
38
|
-
}
|
|
39
|
-
const value = body.toString("utf8");
|
|
40
|
-
if (!value) {
|
|
41
|
-
throw new Error("CBIO_LOCAL_SECRET_MISSING");
|
|
42
|
-
}
|
|
43
|
-
return value;
|
|
44
|
-
}
|
|
45
|
-
export async function startLocalSecretIngress(options) {
|
|
46
|
-
const { vault, secretName, allowedOrigins, overwrite = false, host = "127.0.0.1", port = 0, path, authToken = crypto.randomBytes(24).toString("base64url"), once = true, maxBodyBytes = 64 * 1024, } = options;
|
|
47
|
-
const ingressPath = normalizeIngressPath(path);
|
|
48
|
-
let settled = false;
|
|
49
|
-
let completionResult = null;
|
|
50
|
-
let completionError = null;
|
|
51
|
-
const waiters = [];
|
|
52
|
-
const server = http.createServer(async (req, res) => {
|
|
53
|
-
try {
|
|
54
|
-
if ((req.socket.remoteAddress ?? "") !== host) {
|
|
55
|
-
res.statusCode = 403;
|
|
56
|
-
res.end(JSON.stringify({ error: "CBIO_LOCAL_SECRET_REMOTE_DENIED" }));
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if ((req.method ?? "GET").toUpperCase() !== "POST" || (req.url ?? "/") !== ingressPath) {
|
|
60
|
-
res.statusCode = 404;
|
|
61
|
-
res.end(JSON.stringify({ error: "CBIO_LOCAL_SECRET_NOT_FOUND" }));
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (!isAuthorized(req, authToken)) {
|
|
65
|
-
res.statusCode = 401;
|
|
66
|
-
res.end(JSON.stringify({ error: "CBIO_LOCAL_SECRET_UNAUTHORIZED" }));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (settled && once) {
|
|
70
|
-
res.statusCode = 409;
|
|
71
|
-
res.end(JSON.stringify({ error: "CBIO_LOCAL_SECRET_ALREADY_CONSUMED" }));
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const body = await readRequestBody(req, maxBodyBytes);
|
|
75
|
-
const secretValue = extractSecret(body, req.headers["content-type"]);
|
|
76
|
-
if (vault.hasSecret(secretName)) {
|
|
77
|
-
if (!overwrite || !vault.updateSecret) {
|
|
78
|
-
res.statusCode = 409;
|
|
79
|
-
res.end(JSON.stringify({ error: "CBIO_LOCAL_SECRET_ALREADY_EXISTS" }));
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
await vault.updateSecret(secretName, secretValue);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
await vault.addSecret(secretName, secretValue, { allowedOrigins });
|
|
86
|
-
}
|
|
87
|
-
settled = true;
|
|
88
|
-
completionResult = { secretName };
|
|
89
|
-
for (const waiter of waiters.splice(0)) {
|
|
90
|
-
waiter.resolve(completionResult);
|
|
91
|
-
}
|
|
92
|
-
res.statusCode = 201;
|
|
93
|
-
res.setHeader("Content-Type", "application/json");
|
|
94
|
-
res.end(JSON.stringify({ ok: true, secretName }));
|
|
95
|
-
if (once) {
|
|
96
|
-
setImmediate(() => {
|
|
97
|
-
server.close();
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
if (!settled && completionError == null) {
|
|
103
|
-
completionError = error;
|
|
104
|
-
for (const waiter of waiters.splice(0)) {
|
|
105
|
-
waiter.reject(error);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const code = error instanceof Error ? error.message : "CBIO_LOCAL_SECRET_INGEST_FAILED";
|
|
109
|
-
res.statusCode = code === "CBIO_LOCAL_SECRET_TOO_LARGE" ? 413 : 400;
|
|
110
|
-
res.setHeader("Content-Type", "application/json");
|
|
111
|
-
res.end(JSON.stringify({ error: code }));
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
server.on("close", () => {
|
|
115
|
-
if (!settled && completionError == null) {
|
|
116
|
-
completionError = new Error("CBIO_LOCAL_SECRET_INGRESS_CLOSED");
|
|
117
|
-
for (const waiter of waiters.splice(0)) {
|
|
118
|
-
waiter.reject(completionError);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
await new Promise((resolve, reject) => {
|
|
123
|
-
server.once("error", reject);
|
|
124
|
-
server.listen(port, host, () => {
|
|
125
|
-
server.off("error", reject);
|
|
126
|
-
resolve();
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
const address = server.address();
|
|
130
|
-
if (!address || typeof address === "string") {
|
|
131
|
-
throw new Error("Failed to determine local secret ingress address.");
|
|
132
|
-
}
|
|
133
|
-
const resolvedAddress = address;
|
|
134
|
-
const baseUrl = `http://${host}:${resolvedAddress.port}`;
|
|
135
|
-
const url = `${baseUrl}${ingressPath}`;
|
|
136
|
-
return {
|
|
137
|
-
secretName,
|
|
138
|
-
host,
|
|
139
|
-
port: resolvedAddress.port,
|
|
140
|
-
path: ingressPath,
|
|
141
|
-
baseUrl,
|
|
142
|
-
url,
|
|
143
|
-
authToken,
|
|
144
|
-
close() {
|
|
145
|
-
return new Promise((resolve, reject) => {
|
|
146
|
-
server.close((err) => (err ? reject(err) : resolve()));
|
|
147
|
-
});
|
|
148
|
-
},
|
|
149
|
-
waitForSecret() {
|
|
150
|
-
if (completionResult) {
|
|
151
|
-
return Promise.resolve(completionResult);
|
|
152
|
-
}
|
|
153
|
-
if (completionError != null) {
|
|
154
|
-
return Promise.reject(completionError);
|
|
155
|
-
}
|
|
156
|
-
return new Promise((resolve, reject) => {
|
|
157
|
-
waiters.push({ resolve, reject });
|
|
158
|
-
});
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=localSecretIngress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"localSecretIngress.js","sourceRoot":"","sources":["../../src/http/localSecretIngress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SecretAcquisition
|
|
3
|
-
*
|
|
4
|
-
* Fetches secrets from remote JSON endpoints and stores them in vault.
|
|
5
|
-
* Secret never leaves this module; fetch + extract + store is atomic.
|
|
6
|
-
*/
|
|
7
|
-
import type { CbioVault } from '../vault/vault.js';
|
|
8
|
-
import type { ActivityLogEntry } from '../audit/ActivityLog.js';
|
|
9
|
-
interface FetchResultBase {
|
|
10
|
-
/** True when the operation succeeded/failed but activity log write failed. Caller gets FetchResult; audit trail may be incomplete. */
|
|
11
|
-
activityLogWriteFailed?: boolean;
|
|
12
|
-
}
|
|
13
|
-
export interface FetchSuccess<TData = unknown> extends FetchResultBase {
|
|
14
|
-
success: true;
|
|
15
|
-
data: TData;
|
|
16
|
-
secretName: string;
|
|
17
|
-
}
|
|
18
|
-
export interface FetchFailure extends FetchResultBase {
|
|
19
|
-
success: false;
|
|
20
|
-
error: string;
|
|
21
|
-
code?: string;
|
|
22
|
-
}
|
|
23
|
-
export type FetchResult<TData = unknown> = FetchSuccess<TData> | FetchFailure;
|
|
24
|
-
export interface FetchJsonAndAddSecretOptions<TResponse = unknown, TBody = unknown> {
|
|
25
|
-
secretName: string;
|
|
26
|
-
url: string;
|
|
27
|
-
method?: string;
|
|
28
|
-
headers?: Record<string, string>;
|
|
29
|
-
/** JSON-serializable request body. */
|
|
30
|
-
body?: TBody;
|
|
31
|
-
/** Extract the secret from a parsed JSON response body. */
|
|
32
|
-
extractKey: (response: TResponse) => string;
|
|
33
|
-
allowedOrigins?: string[];
|
|
34
|
-
}
|
|
35
|
-
export interface FetchJsonAndUpdateSecretOptions<TResponse = unknown, TBody = unknown> {
|
|
36
|
-
secretName: string;
|
|
37
|
-
url: string;
|
|
38
|
-
method?: string;
|
|
39
|
-
headers?: Record<string, string>;
|
|
40
|
-
/** JSON-serializable request body. */
|
|
41
|
-
body?: TBody;
|
|
42
|
-
/** Extract the rotated secret from a parsed JSON response body. */
|
|
43
|
-
extractKey: (response: TResponse) => string;
|
|
44
|
-
}
|
|
45
|
-
export declare class SecretAcquisition {
|
|
46
|
-
private readonly _vault;
|
|
47
|
-
private readonly _appendActivityLog;
|
|
48
|
-
constructor(_vault: CbioVault, _appendActivityLog: (entry: ActivityLogEntry) => Promise<void>);
|
|
49
|
-
hasSecret(secretName: string): boolean;
|
|
50
|
-
listSecretNames(): string[];
|
|
51
|
-
fetchJsonAndAddSecret<TResponse = unknown, TBody = unknown>(options: FetchJsonAndAddSecretOptions<TResponse, TBody>): Promise<FetchResult<TResponse>>;
|
|
52
|
-
fetchJsonAndUpdateSecret<TResponse = unknown, TBody = unknown>(options: FetchJsonAndUpdateSecretOptions<TResponse, TBody>): Promise<FetchResult<TResponse>>;
|
|
53
|
-
}
|
|
54
|
-
export {};
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SecretAcquisition
|
|
3
|
-
*
|
|
4
|
-
* Fetches secrets from remote JSON endpoints and stores them in vault.
|
|
5
|
-
* Secret never leaves this module; fetch + extract + store is atomic.
|
|
6
|
-
*/
|
|
7
|
-
import { IdentityError } from '../errors.js';
|
|
8
|
-
import { isAllowedSecretUrl } from '../vault/secretPolicy.js';
|
|
9
|
-
function sanitize(obj, secret) {
|
|
10
|
-
if (typeof obj !== 'object' || obj === null)
|
|
11
|
-
return obj;
|
|
12
|
-
const newObj = Array.isArray(obj) ? [] : {};
|
|
13
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
14
|
-
if (typeof value === 'string' && value === secret) {
|
|
15
|
-
newObj[key] = '***';
|
|
16
|
-
}
|
|
17
|
-
else if (typeof value === 'object') {
|
|
18
|
-
newObj[key] = sanitize(value, secret);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
newObj[key] = value;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return newObj;
|
|
25
|
-
}
|
|
26
|
-
function serializeJsonBody(body) {
|
|
27
|
-
return body === undefined ? undefined : JSON.stringify(body);
|
|
28
|
-
}
|
|
29
|
-
export class SecretAcquisition {
|
|
30
|
-
_vault;
|
|
31
|
-
_appendActivityLog;
|
|
32
|
-
constructor(_vault, _appendActivityLog) {
|
|
33
|
-
this._vault = _vault;
|
|
34
|
-
this._appendActivityLog = _appendActivityLog;
|
|
35
|
-
}
|
|
36
|
-
hasSecret(secretName) {
|
|
37
|
-
return this._vault.hasSecret(secretName);
|
|
38
|
-
}
|
|
39
|
-
listSecretNames() {
|
|
40
|
-
return this._vault.listSecretNames();
|
|
41
|
-
}
|
|
42
|
-
async fetchJsonAndAddSecret(options) {
|
|
43
|
-
const { url, method = 'POST', secretName } = options;
|
|
44
|
-
const fail = async (error, code) => {
|
|
45
|
-
try {
|
|
46
|
-
await this._appendActivityLog({
|
|
47
|
-
ts: Date.now(),
|
|
48
|
-
action: 'fetchJsonAndAddSecret',
|
|
49
|
-
secretName,
|
|
50
|
-
url,
|
|
51
|
-
method,
|
|
52
|
-
success: false,
|
|
53
|
-
error,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return { success: false, error, code, activityLogWriteFailed: true };
|
|
58
|
-
}
|
|
59
|
-
return { success: false, error, code };
|
|
60
|
-
};
|
|
61
|
-
try {
|
|
62
|
-
const { headers = {}, body, extractKey, allowedOrigins } = options;
|
|
63
|
-
const sourceUrl = new URL(url);
|
|
64
|
-
if (!isAllowedSecretUrl(sourceUrl)) {
|
|
65
|
-
return fail(`Secret fetch requires HTTPS or loopback HTTP for local development. Received: ${url}`);
|
|
66
|
-
}
|
|
67
|
-
const response = await fetch(url, {
|
|
68
|
-
method,
|
|
69
|
-
headers: {
|
|
70
|
-
'Content-Type': 'application/json',
|
|
71
|
-
...headers
|
|
72
|
-
},
|
|
73
|
-
body: serializeJsonBody(body)
|
|
74
|
-
});
|
|
75
|
-
if (!response.ok) {
|
|
76
|
-
return fail(`HTTP Error: ${response.status}`);
|
|
77
|
-
}
|
|
78
|
-
const data = await response.json();
|
|
79
|
-
const key = extractKey(data);
|
|
80
|
-
if (!key) {
|
|
81
|
-
return fail("Failed to extract key from response");
|
|
82
|
-
}
|
|
83
|
-
let resolvedSecretName = secretName;
|
|
84
|
-
let suffix = 0;
|
|
85
|
-
while (this._vault.hasSecret(resolvedSecretName)) {
|
|
86
|
-
suffix++;
|
|
87
|
-
resolvedSecretName = `${secretName}_${suffix}`;
|
|
88
|
-
}
|
|
89
|
-
await this._vault.addSecret(resolvedSecretName, key, { allowedOrigins: allowedOrigins ?? [sourceUrl.origin] });
|
|
90
|
-
try {
|
|
91
|
-
await this._appendActivityLog({
|
|
92
|
-
ts: Date.now(),
|
|
93
|
-
action: 'fetchJsonAndAddSecret',
|
|
94
|
-
secretName: resolvedSecretName,
|
|
95
|
-
url,
|
|
96
|
-
method,
|
|
97
|
-
success: true,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
const sanitizedData = sanitize(data, key);
|
|
102
|
-
return { success: true, data: sanitizedData, secretName: resolvedSecretName, activityLogWriteFailed: true };
|
|
103
|
-
}
|
|
104
|
-
const sanitizedData = sanitize(data, key);
|
|
105
|
-
return { success: true, data: sanitizedData, secretName: resolvedSecretName };
|
|
106
|
-
}
|
|
107
|
-
catch (e) {
|
|
108
|
-
const code = IdentityError.isIdentityError(e) ? e.code : undefined;
|
|
109
|
-
return fail(e.message ?? String(e), code);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
async fetchJsonAndUpdateSecret(options) {
|
|
113
|
-
const { url, method = 'POST', secretName } = options;
|
|
114
|
-
const fail = async (error, code) => {
|
|
115
|
-
try {
|
|
116
|
-
await this._appendActivityLog({
|
|
117
|
-
ts: Date.now(),
|
|
118
|
-
action: 'fetchJsonAndUpdateSecret',
|
|
119
|
-
secretName,
|
|
120
|
-
url,
|
|
121
|
-
method,
|
|
122
|
-
success: false,
|
|
123
|
-
error,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
return { success: false, error, code, activityLogWriteFailed: true };
|
|
128
|
-
}
|
|
129
|
-
return { success: false, error, code };
|
|
130
|
-
};
|
|
131
|
-
try {
|
|
132
|
-
const { headers = {}, body, extractKey } = options;
|
|
133
|
-
const sourceUrl = new URL(url);
|
|
134
|
-
if (!isAllowedSecretUrl(sourceUrl)) {
|
|
135
|
-
return fail(`Secret rotation requires HTTPS or loopback HTTP for local development. Received: ${url}`);
|
|
136
|
-
}
|
|
137
|
-
const response = await fetch(url, {
|
|
138
|
-
method,
|
|
139
|
-
headers: {
|
|
140
|
-
'Content-Type': 'application/json',
|
|
141
|
-
...headers
|
|
142
|
-
},
|
|
143
|
-
body: serializeJsonBody(body)
|
|
144
|
-
});
|
|
145
|
-
if (!response.ok) {
|
|
146
|
-
return fail(`HTTP Error: ${response.status}`);
|
|
147
|
-
}
|
|
148
|
-
const data = await response.json();
|
|
149
|
-
const key = extractKey(data);
|
|
150
|
-
if (!key) {
|
|
151
|
-
return fail("Failed to extract key from response");
|
|
152
|
-
}
|
|
153
|
-
await this._vault.rotateSecret(secretName, key, sourceUrl.origin);
|
|
154
|
-
try {
|
|
155
|
-
await this._appendActivityLog({
|
|
156
|
-
ts: Date.now(),
|
|
157
|
-
action: 'fetchJsonAndUpdateSecret',
|
|
158
|
-
secretName,
|
|
159
|
-
url,
|
|
160
|
-
method,
|
|
161
|
-
success: true,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
const sanitizedData = sanitize(data, key);
|
|
166
|
-
return { success: true, data: sanitizedData, secretName, activityLogWriteFailed: true };
|
|
167
|
-
}
|
|
168
|
-
const sanitizedData = sanitize(data, key);
|
|
169
|
-
return { success: true, data: sanitizedData, secretName };
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
const code = IdentityError.isIdentityError(e) ? e.code : undefined;
|
|
173
|
-
return fail(e.message ?? String(e), code);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=secretAcquisition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secretAcquisition.js","sourceRoot":"","sources":["../../src/http/secretAcquisition.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA4C9D,SAAS,QAAQ,CAAC,GAAY,EAAE,MAAc;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IACxD,MAAM,MAAM,GAAwC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC/C,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrD,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAkC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACH,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrD,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACpC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,iBAAiB;IAEL;IACA;IAFrB,YACqB,MAAiB,EACjB,kBAA8D;QAD9D,WAAM,GAAN,MAAM,CAAW;QACjB,uBAAkB,GAAlB,kBAAkB,CAA4C;IAChF,CAAC;IAEJ,SAAS,CAAC,UAAkB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAuC,OAAuD;QACrH,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,EAAE,KAAa,EAAE,IAAa,EAAyB,EAAE;YACvE,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC1B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,uBAAuB;oBAC/B,UAAU;oBACV,GAAG;oBACH,MAAM;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK;iBACR,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YACzE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC,CAAC;QACF,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;YACnE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,iFAAiF,GAAG,EAAE,CAAC,CAAC;YACxG,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM;gBACN,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;oBAClC,GAAG,OAAO;iBACb;gBACD,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAe,CAAC;YAChD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,OAAO,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACvD,CAAC;YAED,IAAI,kBAAkB,GAAG,UAAU,CAAC;YACpC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC/C,MAAM,EAAE,CAAC;gBACT,kBAAkB,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAE/G,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC1B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,uBAAuB;oBAC/B,UAAU,EAAE,kBAAkB;oBAC9B,GAAG;oBACH,MAAM;oBACN,OAAO,EAAE,IAAI;iBAChB,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAA0B,EAAE,UAAU,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YAC7H,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAA0B,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QAC/F,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAuC,OAA0D;QAC3H,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,EAAE,KAAa,EAAE,IAAa,EAAyB,EAAE;YACvE,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC1B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,0BAA0B;oBAClC,UAAU;oBACV,GAAG;oBACH,MAAM;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK;iBACR,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YACzE,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC,CAAC;QACF,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;YACnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,oFAAoF,GAAG,EAAE,CAAC,CAAC;YAC3G,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM;gBACN,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;oBAClC,GAAG,OAAO;iBACb;gBACD,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAe,CAAC;YAChD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,OAAO,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC;oBAC1B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,0BAA0B;oBAClC,UAAU;oBACV,GAAG;oBACH,MAAM;oBACN,OAAO,EAAE,IAAI;iBAChB,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAA0B,EAAE,UAAU,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YACzG,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAA0B,EAAE,UAAU,EAAE,CAAC;QAC3E,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vault secret naming for child identities. CHILD_KEY_PREFIX, getChildIdentitySecretName.
|
|
3
|
-
* Not protocol objects. Protocol talks about public identities and signatures,
|
|
4
|
-
* not local secret names or internal storage prefixes.
|
|
5
|
-
*/
|
|
6
|
-
export declare const CHILD_KEY_PREFIX: "cbio:child:";
|
|
7
|
-
export declare function getChildIdentitySecretName(publicKey: string): string;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vault secret naming for child identities. CHILD_KEY_PREFIX, getChildIdentitySecretName.
|
|
3
|
-
* Not protocol objects. Protocol talks about public identities and signatures,
|
|
4
|
-
* not local secret names or internal storage prefixes.
|
|
5
|
-
*/
|
|
6
|
-
import * as crypto from 'node:crypto';
|
|
7
|
-
export const CHILD_KEY_PREFIX = 'cbio:child:';
|
|
8
|
-
export function getChildIdentitySecretName(publicKey) {
|
|
9
|
-
const hash = crypto.createHash('sha256').update(publicKey).digest('hex').substring(0, 12);
|
|
10
|
-
return CHILD_KEY_PREFIX + hash;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=childSecretNaming.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"childSecretNaming.js","sourceRoot":"","sources":["../../src/protocol/childSecretNaming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAsB,CAAC;AAEvD,MAAM,UAAU,0BAA0B,CAAC,SAAiB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,gBAAgB,GAAG,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claw-biometric Core Identity. Runtime utilities over protocol primitives.
|
|
3
|
-
* getVaultPath (runtime). Re-exports protocol for consumers.
|
|
4
|
-
*/
|
|
5
|
-
import { deriveRootAgentId } from '@the-ai-company/cbio-protocol';
|
|
6
|
-
import { getChildIdentitySecretName, CHILD_KEY_PREFIX } from './childSecretNaming.js';
|
|
7
|
-
export { deriveRootAgentId, getChildIdentitySecretName, CHILD_KEY_PREFIX };
|
|
8
|
-
export declare function getVaultPath(publicKey: string): string;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claw-biometric Core Identity. Runtime utilities over protocol primitives.
|
|
3
|
-
* getVaultPath (runtime). Re-exports protocol for consumers.
|
|
4
|
-
*/
|
|
5
|
-
import * as os from 'node:os';
|
|
6
|
-
import * as path from 'node:path';
|
|
7
|
-
import * as crypto from 'node:crypto';
|
|
8
|
-
import { deriveRootAgentId } from '@the-ai-company/cbio-protocol';
|
|
9
|
-
import { getChildIdentitySecretName, CHILD_KEY_PREFIX } from './childSecretNaming.js';
|
|
10
|
-
export { deriveRootAgentId, getChildIdentitySecretName, CHILD_KEY_PREFIX };
|
|
11
|
-
export function getVaultPath(publicKey) {
|
|
12
|
-
const hash = crypto.createHash('sha256').update(publicKey).digest('hex').substring(0, 12);
|
|
13
|
-
const baseDir = process.env.C_BIO_VAULT_DIR || path.join(os.homedir(), '.c-bio');
|
|
14
|
-
return path.join(baseDir, `vault_${hash}.enc`);
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=identity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/protocol/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,CAAC;AAE3E,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/sealed/index.d.ts
DELETED
package/dist/sealed/index.js
DELETED
package/dist/sealed/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sealed/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export function isLoopbackHost(hostname) {
|
|
2
|
-
return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';
|
|
3
|
-
}
|
|
4
|
-
export function isAllowedSecretUrl(url) {
|
|
5
|
-
return url.protocol === 'https:' || (url.protocol === 'http:' && isLoopbackHost(url.hostname));
|
|
6
|
-
}
|
|
7
|
-
export function normalizeSecretPolicyOrigin(origin) {
|
|
8
|
-
const url = new URL(origin);
|
|
9
|
-
if (!isAllowedSecretUrl(url)) {
|
|
10
|
-
throw new Error(`Secret policy requires HTTPS origin or loopback HTTP for local development. Received: ${origin}`);
|
|
11
|
-
}
|
|
12
|
-
return url.origin;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=secretPolicy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secretPolicy.js","sourceRoot":"","sources":["../../src/vault/secretPolicy.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC3C,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACvC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yFAAyF,MAAM,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACtB,CAAC"}
|
package/dist/vault/vault.d.ts
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { Signer } from '../protocol/crypto.js';
|
|
2
|
-
import type { IStorageProvider } from '../storage/provider.js';
|
|
3
|
-
import { type ActivityLogEntry, type ActivityLogMetadata } from '../audit/ActivityLog.js';
|
|
4
|
-
export interface SecretPolicy {
|
|
5
|
-
allowedOrigins?: string[];
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* CbioVault
|
|
9
|
-
*
|
|
10
|
-
* A secure container for third-party API keys and secrets.
|
|
11
|
-
* Secrets are stored in a private field (#) and are inaccessible
|
|
12
|
-
* to the outside Agent logic. Vault stores ONLY secrets (encrypted).
|
|
13
|
-
*/
|
|
14
|
-
export declare class CbioVault {
|
|
15
|
-
#private;
|
|
16
|
-
private static readonly PERSIST_SALT;
|
|
17
|
-
private static readonly VERSIONED_SECRET_PREFIX;
|
|
18
|
-
private static readonly REVOCATION_PREFIX;
|
|
19
|
-
private static readonly SECRET_OPERATION_WINDOW_MS;
|
|
20
|
-
private static readonly SECRET_OPERATION_LIMIT;
|
|
21
|
-
/**
|
|
22
|
-
* @internal Used by Owner. Binds storage and loads vault from disk. Do not call directly.
|
|
23
|
-
*/
|
|
24
|
-
initFromStorage(signer: Signer, storageKey: string, storage?: IStorageProvider, activityLogKey?: string, activityLogKeyIsDerived?: boolean): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* @internal Used by Owner.importIdentity. Binds storage and loads vault from blob. Do not call directly.
|
|
27
|
-
*/
|
|
28
|
-
initFromBlob(signer: Signer, blob: string, storageKey: string, storage?: IStorageProvider, activityLogKey?: string, activityLogKeyIsDerived?: boolean): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Add a new secret. Fails if secretName already exists.
|
|
31
|
-
*/
|
|
32
|
-
addSecret(secretName: string, secretValue: string, options?: SecretPolicy): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Update an existing secret. Fails if secretName does not exist.
|
|
35
|
-
*/
|
|
36
|
-
updateSecret(secretName: string, secretValue: string): Promise<void>;
|
|
37
|
-
setSecretAllowedOrigins(secretName: string, allowedOrigins: readonly string[]): Promise<void>;
|
|
38
|
-
rotateSecret(secretName: string, secretValue: string, sourceOrigin: string): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* Case 3: Retrieve a secret in plaintext.
|
|
41
|
-
* @internal @admin
|
|
42
|
-
* WARNING: This is an ADMIN-ONLY method. Do not use in Agent's autonomous logic.
|
|
43
|
-
*/
|
|
44
|
-
getSecret(secretName: string): string | undefined;
|
|
45
|
-
internalHasSecret(secretName: string): boolean;
|
|
46
|
-
internalGetSecret(secretName: string): string | undefined;
|
|
47
|
-
internalSetSecret(secretName: string, secretValue: string, options?: SecretPolicy): Promise<void>;
|
|
48
|
-
internalDeleteSecret(secretName: string): Promise<void>;
|
|
49
|
-
assertSecretOperationAllowed(secretName: string, operation: string): void;
|
|
50
|
-
/**
|
|
51
|
-
* Case 4: Permanently delete a secret from memory and disk.
|
|
52
|
-
* @internal @admin
|
|
53
|
-
* WARNING: This is an ADMIN-ONLY method. Agent should NEVER be allowed
|
|
54
|
-
* to delete its own memory autonomously. Only Owner (Human) can call this.
|
|
55
|
-
*/
|
|
56
|
-
deleteSecret(secretName: string): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* @internal Used by AuthClient to append activity log entries.
|
|
59
|
-
*/
|
|
60
|
-
appendActivityLogEntry(entry: ActivityLogEntry): Promise<void>;
|
|
61
|
-
/**
|
|
62
|
-
* Persistence: Atomic save with write-read-verify.
|
|
63
|
-
*/
|
|
64
|
-
save(signer: Signer, storageKey?: string, storage?: IStorageProvider): Promise<void>;
|
|
65
|
-
serializeToBlob(signer: Signer): Promise<string>;
|
|
66
|
-
/**
|
|
67
|
-
* Seal vault with external key (AES-256-GCM) for portable local storage.
|
|
68
|
-
*/
|
|
69
|
-
seal(kdk: string): string;
|
|
70
|
-
/**
|
|
71
|
-
* Unseal vault from blob encrypted with kdk.
|
|
72
|
-
*/
|
|
73
|
-
unseal(kdk: string, sealed: string): void;
|
|
74
|
-
hasSecret(secretName: string): boolean;
|
|
75
|
-
listSecretNames(): string[];
|
|
76
|
-
listAllSecretNames(): string[];
|
|
77
|
-
/**
|
|
78
|
-
* Read activity log. Owner-only. Returns [] if activity log not enabled.
|
|
79
|
-
*/
|
|
80
|
-
getActivityLog(): Promise<readonly ActivityLogEntry[]>;
|
|
81
|
-
/**
|
|
82
|
-
* Read activity log metadata (agentId, storageKey). Returns null if not present.
|
|
83
|
-
*/
|
|
84
|
-
getActivityLogMetadata(): Promise<ActivityLogMetadata | null>;
|
|
85
|
-
/**
|
|
86
|
-
* Merge secrets from another vault instance.
|
|
87
|
-
* Only allowed if both vaults belong to the same identity.
|
|
88
|
-
* @param options.onConflict 'abort' = return conflicts (default); 'skip' = merge non-conflicting only; 'overwrite' = use other's value for conflicts.
|
|
89
|
-
*/
|
|
90
|
-
mergeFrom(otherVault: CbioVault, options?: {
|
|
91
|
-
onConflict?: 'abort' | 'skip' | 'overwrite';
|
|
92
|
-
}): Promise<MergeResult>;
|
|
93
|
-
}
|
|
94
|
-
export interface MergeResult {
|
|
95
|
-
merged: boolean;
|
|
96
|
-
added: string[];
|
|
97
|
-
skipped: string[];
|
|
98
|
-
overwritten: string[];
|
|
99
|
-
conflicts?: string[];
|
|
100
|
-
}
|