@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.
Files changed (113) hide show
  1. package/README.md +116 -54
  2. package/dist/clients/agent/client.d.ts +9 -0
  3. package/dist/clients/agent/client.js +72 -0
  4. package/dist/clients/agent/client.js.map +1 -0
  5. package/dist/clients/agent/contracts.d.ts +34 -0
  6. package/dist/clients/agent/contracts.js +2 -0
  7. package/dist/clients/agent/contracts.js.map +1 -0
  8. package/dist/clients/agent/index.d.ts +3 -0
  9. package/dist/clients/agent/index.js +2 -0
  10. package/dist/clients/agent/index.js.map +1 -0
  11. package/dist/clients/owner/client.d.ts +18 -0
  12. package/dist/clients/owner/client.js +169 -0
  13. package/dist/clients/owner/client.js.map +1 -0
  14. package/dist/clients/owner/contracts.d.ts +34 -0
  15. package/dist/clients/owner/contracts.js +2 -0
  16. package/dist/clients/owner/contracts.js.map +1 -0
  17. package/dist/clients/owner/index.d.ts +3 -0
  18. package/dist/clients/owner/index.js +2 -0
  19. package/dist/clients/owner/index.js.map +1 -0
  20. package/dist/runtime/index.d.ts +8 -10
  21. package/dist/runtime/index.js +8 -7
  22. package/dist/runtime/index.js.map +1 -1
  23. package/dist/storage/fs.d.ts +1 -0
  24. package/dist/storage/fs.js +28 -0
  25. package/dist/storage/fs.js.map +1 -1
  26. package/dist/storage/memory.d.ts +1 -0
  27. package/dist/storage/memory.js +20 -0
  28. package/dist/storage/memory.js.map +1 -1
  29. package/dist/storage/provider.d.ts +2 -0
  30. package/dist/vault-core/contracts.d.ts +230 -0
  31. package/dist/vault-core/contracts.js +2 -0
  32. package/dist/vault-core/contracts.js.map +1 -0
  33. package/dist/vault-core/core.d.ts +21 -0
  34. package/dist/vault-core/core.js +335 -0
  35. package/dist/vault-core/core.js.map +1 -0
  36. package/dist/vault-core/defaults.d.ts +141 -0
  37. package/dist/vault-core/defaults.js +602 -0
  38. package/dist/vault-core/defaults.js.map +1 -0
  39. package/dist/vault-core/errors.d.ts +4 -0
  40. package/dist/vault-core/errors.js +9 -0
  41. package/dist/vault-core/errors.js.map +1 -0
  42. package/dist/vault-core/index.d.ts +6 -0
  43. package/dist/vault-core/index.js +5 -0
  44. package/dist/vault-core/index.js.map +1 -0
  45. package/dist/vault-core/persistence.d.ts +87 -0
  46. package/dist/vault-core/persistence.js +309 -0
  47. package/dist/vault-core/persistence.js.map +1 -0
  48. package/dist/vault-core/ports.d.ts +101 -0
  49. package/dist/vault-core/ports.js +2 -0
  50. package/dist/vault-core/ports.js.map +1 -0
  51. package/dist/vault-ingress/defaults.d.ts +14 -0
  52. package/dist/vault-ingress/defaults.js +41 -0
  53. package/dist/vault-ingress/defaults.js.map +1 -0
  54. package/dist/vault-ingress/flow-factories.d.ts +24 -0
  55. package/dist/vault-ingress/flow-factories.js +48 -0
  56. package/dist/vault-ingress/flow-factories.js.map +1 -0
  57. package/dist/vault-ingress/index.d.ts +81 -0
  58. package/dist/vault-ingress/index.js +357 -0
  59. package/dist/vault-ingress/index.js.map +1 -0
  60. package/docs/ARCHITECTURE.md +44 -76
  61. package/docs/REFERENCE.md +217 -218
  62. package/docs/WORKS_WITH_CUSTOM_FETCH.md +16 -191
  63. package/docs/es/README.md +8 -24
  64. package/docs/fr/README.md +8 -24
  65. package/docs/ja/README.md +8 -24
  66. package/docs/ko/README.md +8 -24
  67. package/docs/pt/README.md +8 -24
  68. package/docs/zh/README.md +21 -7
  69. package/package.json +2 -10
  70. package/dist/agent/agent.d.ts +0 -267
  71. package/dist/agent/agent.js +0 -689
  72. package/dist/agent/agent.js.map +0 -1
  73. package/dist/audit/ActivityLog.d.ts +0 -25
  74. package/dist/audit/ActivityLog.js +0 -71
  75. package/dist/audit/ActivityLog.js.map +0 -1
  76. package/dist/http/authClient.d.ts +0 -26
  77. package/dist/http/authClient.js +0 -132
  78. package/dist/http/authClient.js.map +0 -1
  79. package/dist/http/genericSecretValidator.d.ts +0 -11
  80. package/dist/http/genericSecretValidator.js +0 -42
  81. package/dist/http/genericSecretValidator.js.map +0 -1
  82. package/dist/http/localAuthProxy.d.ts +0 -33
  83. package/dist/http/localAuthProxy.js +0 -93
  84. package/dist/http/localAuthProxy.js.map +0 -1
  85. package/dist/http/localSecretIngress.d.ts +0 -33
  86. package/dist/http/localSecretIngress.js +0 -162
  87. package/dist/http/localSecretIngress.js.map +0 -1
  88. package/dist/http/secretAcquisition.d.ts +0 -54
  89. package/dist/http/secretAcquisition.js +0 -177
  90. package/dist/http/secretAcquisition.js.map +0 -1
  91. package/dist/protocol/childSecretNaming.d.ts +0 -7
  92. package/dist/protocol/childSecretNaming.js +0 -12
  93. package/dist/protocol/childSecretNaming.js.map +0 -1
  94. package/dist/protocol/identity.d.ts +0 -8
  95. package/dist/protocol/identity.js +0 -16
  96. package/dist/protocol/identity.js.map +0 -1
  97. package/dist/sealed/index.d.ts +0 -6
  98. package/dist/sealed/index.js +0 -6
  99. package/dist/sealed/index.js.map +0 -1
  100. package/dist/vault/secretPolicy.d.ts +0 -3
  101. package/dist/vault/secretPolicy.js +0 -14
  102. package/dist/vault/secretPolicy.js.map +0 -1
  103. package/dist/vault/vault.d.ts +0 -100
  104. package/dist/vault/vault.js +0 -603
  105. package/dist/vault/vault.js.map +0 -1
  106. package/docs/TODO-multi-vault.md +0 -29
  107. package/docs/spec/runtime/README.md +0 -44
  108. package/docs/spec/runtime/activity-log.md +0 -71
  109. package/docs/spec/runtime/exposure-surfaces.md +0 -99
  110. package/docs/spec/runtime/managed-agent-record.md +0 -52
  111. package/docs/spec/runtime/merge-rules.md +0 -52
  112. package/docs/spec/runtime/secret-origin-policy.md +0 -46
  113. 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":"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"}
@@ -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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Sealed blob export. Seal/unseal primitives and sealed blob format helpers.
3
- * Do not depend on CbioAgent.
4
- */
5
- export { sealBlob, unsealBlob, SEALED_BLOB_VERSION } from './seal.js';
6
- export type { SealedBlobPayload } from './seal.js';
@@ -1,6 +0,0 @@
1
- /**
2
- * Sealed blob export. Seal/unseal primitives and sealed blob format helpers.
3
- * Do not depend on CbioAgent.
4
- */
5
- export { sealBlob, unsealBlob, SEALED_BLOB_VERSION } from './seal.js';
6
- //# sourceMappingURL=index.js.map
@@ -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,3 +0,0 @@
1
- export declare function isLoopbackHost(hostname: string): boolean;
2
- export declare function isAllowedSecretUrl(url: URL): boolean;
3
- export declare function normalizeSecretPolicyOrigin(origin: string): string;
@@ -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"}
@@ -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
- }