@opendatalabs/personal-server-ts-server 1.16.1 → 1.17.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/dist/app.d.ts +5 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +38 -1
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +6 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +63 -21
- package/dist/bootstrap.js.map +1 -1
- package/dist/enclave-main.d.ts +11 -0
- package/dist/enclave-main.d.ts.map +1 -0
- package/dist/enclave-main.js +188 -0
- package/dist/enclave-main.js.map +1 -0
- package/dist/index.js +6 -22
- package/dist/index.js.map +1 -1
- package/dist/jobs/access-reporter.d.ts +36 -0
- package/dist/jobs/access-reporter.d.ts.map +1 -0
- package/dist/jobs/access-reporter.js +272 -0
- package/dist/jobs/access-reporter.js.map +1 -0
- package/dist/jobs/raw-envelope-stream.d.ts +3 -0
- package/dist/jobs/raw-envelope-stream.d.ts.map +1 -0
- package/dist/jobs/raw-envelope-stream.js +371 -0
- package/dist/jobs/raw-envelope-stream.js.map +1 -0
- package/dist/jobs/types.d.ts +17 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +3 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +43 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +491 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/listen.d.ts +11 -0
- package/dist/listen.d.ts.map +1 -0
- package/dist/listen.js +23 -0
- package/dist/listen.js.map +1 -0
- package/dist/mcp/durable-state.d.ts +75 -0
- package/dist/mcp/durable-state.d.ts.map +1 -0
- package/dist/mcp/durable-state.js +418 -0
- package/dist/mcp/durable-state.js.map +1 -0
- package/dist/mcp/grants.d.ts +12 -0
- package/dist/mcp/grants.d.ts.map +1 -0
- package/dist/mcp/grants.js +33 -0
- package/dist/mcp/grants.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tee-ingress.d.ts +29 -0
- package/dist/mcp/tee-ingress.d.ts.map +1 -0
- package/dist/mcp/tee-ingress.js +203 -0
- package/dist/mcp/tee-ingress.js.map +1 -0
- package/dist/package.json +67 -0
- package/dist/routes/enclave-fleet.d.ts +14 -0
- package/dist/routes/enclave-fleet.d.ts.map +1 -0
- package/dist/routes/enclave-fleet.js +43 -0
- package/dist/routes/enclave-fleet.js.map +1 -0
- package/dist/routes/enclave-jobs.d.ts +9 -0
- package/dist/routes/enclave-jobs.d.ts.map +1 -0
- package/dist/routes/enclave-jobs.js +106 -0
- package/dist/routes/enclave-jobs.js.map +1 -0
- package/dist/routes/enclave-mcp.d.ts +9 -0
- package/dist/routes/enclave-mcp.d.ts.map +1 -0
- package/dist/routes/enclave-mcp.js +46 -0
- package/dist/routes/enclave-mcp.js.map +1 -0
- package/dist/routes/mcp.d.ts +5 -2
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +49 -17
- package/dist/routes/mcp.js.map +1 -1
- package/dist/scripts/bundle-verification.d.ts +2 -0
- package/dist/scripts/bundle-verification.d.ts.map +1 -0
- package/dist/scripts/bundle-verification.js +32 -0
- package/dist/scripts/bundle-verification.js.map +1 -0
- package/dist/scripts/verify-bundle.d.ts +2 -0
- package/dist/scripts/verify-bundle.d.ts.map +1 -0
- package/dist/scripts/verify-bundle.js +44 -0
- package/dist/scripts/verify-bundle.js.map +1 -0
- package/dist/storage/hierarchy.d.ts +4 -0
- package/dist/storage/hierarchy.d.ts.map +1 -1
- package/dist/storage/hierarchy.js +10 -0
- package/dist/storage/hierarchy.js.map +1 -1
- package/dist/storage/node-data-storage.d.ts.map +1 -1
- package/dist/storage/node-data-storage.js +7 -1
- package/dist/storage/node-data-storage.js.map +1 -1
- package/dist/ui/ps-lite-debug.js +3205 -5575
- package/package.json +15 -7
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createPublicOnlyAccount } from "@opendatalabs/personal-server-ts-core/keys";
|
|
2
|
+
import { isAddress, isHex } from "viem";
|
|
3
|
+
import { createServer } from "./bootstrap.js";
|
|
4
|
+
import { createAccessReporter } from "./jobs/access-reporter.js";
|
|
5
|
+
import { loadConfig } from "./config/index.js";
|
|
6
|
+
import { listenHttpServer } from "./listen.js";
|
|
7
|
+
const REQUIRED_ENV = [
|
|
8
|
+
"VANA_MASTER_KEY_SIGNATURE",
|
|
9
|
+
"PS_ACCESS_TOKEN",
|
|
10
|
+
"PS_SERVER_ADDRESS",
|
|
11
|
+
"PS_SERVER_PUBLIC_KEY",
|
|
12
|
+
"ENCLAVE_AGENT_URL",
|
|
13
|
+
];
|
|
14
|
+
const SYNC_DISABLED = "false";
|
|
15
|
+
const MAINNET_CHAIN_ID = 1_480;
|
|
16
|
+
const MOKSHA_CHAIN_ID = 14_800;
|
|
17
|
+
const DEFAULT_STORAGE_API_URLS = {
|
|
18
|
+
[MAINNET_CHAIN_ID]: "https://storage.vana.org",
|
|
19
|
+
[MOKSHA_CHAIN_ID]: "https://storage-dev.vana.org",
|
|
20
|
+
};
|
|
21
|
+
const CONTRACT_ENV = {
|
|
22
|
+
DATA_REGISTRY_CONTRACT: "dataRegistry",
|
|
23
|
+
DATA_PORTABILITY_SERVER_CONTRACT: "dataPortabilityServer",
|
|
24
|
+
DATA_PORTABILITY_GRANTEES_CONTRACT: "dataPortabilityGrantees",
|
|
25
|
+
DATA_PORTABILITY_PERMISSIONS_CONTRACT: "dataPortabilityPermissions",
|
|
26
|
+
};
|
|
27
|
+
export function readEnclaveEnv(env) {
|
|
28
|
+
if (env.VANA_OWNER_PRIVATE_KEY) {
|
|
29
|
+
throw new Error("VANA_OWNER_PRIVATE_KEY is forbidden in enclave profile");
|
|
30
|
+
}
|
|
31
|
+
for (const key of REQUIRED_ENV) {
|
|
32
|
+
if (!env[key]) {
|
|
33
|
+
throw new Error(`${key} is required in enclave profile`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const ownerSignature = env.VANA_MASTER_KEY_SIGNATURE;
|
|
37
|
+
const accessToken = env.PS_ACCESS_TOKEN;
|
|
38
|
+
const serverAddress = env.PS_SERVER_ADDRESS;
|
|
39
|
+
const serverPublicKey = env.PS_SERVER_PUBLIC_KEY;
|
|
40
|
+
const agentUrl = env.ENCLAVE_AGENT_URL;
|
|
41
|
+
// Drop the master signature before config and application code can inspect env.
|
|
42
|
+
delete env.VANA_MASTER_KEY_SIGNATURE;
|
|
43
|
+
if (!isHex(ownerSignature)) {
|
|
44
|
+
throw new Error("VANA_MASTER_KEY_SIGNATURE must be hex encoded");
|
|
45
|
+
}
|
|
46
|
+
if (!isAddress(serverAddress)) {
|
|
47
|
+
throw new Error("PS_SERVER_ADDRESS must be an address");
|
|
48
|
+
}
|
|
49
|
+
if (!isHex(serverPublicKey)) {
|
|
50
|
+
throw new Error("PS_SERVER_PUBLIC_KEY must be hex encoded");
|
|
51
|
+
}
|
|
52
|
+
assertHttpUrl(agentUrl, "ENCLAVE_AGENT_URL");
|
|
53
|
+
return {
|
|
54
|
+
ownerSignature,
|
|
55
|
+
accessToken,
|
|
56
|
+
serverAddress,
|
|
57
|
+
serverPublicKey,
|
|
58
|
+
agentUrl,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function runEnclaveMain() {
|
|
62
|
+
const enclaveEnv = readEnclaveEnv(process.env);
|
|
63
|
+
const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
|
|
64
|
+
const config = await loadConfig({ rootPath });
|
|
65
|
+
const chainId = readChainId(process.env.CHAIN_ID);
|
|
66
|
+
config.gateway.chainId = chainId;
|
|
67
|
+
for (const [envName, contractName] of Object.entries(CONTRACT_ENV)) {
|
|
68
|
+
const address = process.env[envName];
|
|
69
|
+
if (!address) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!isAddress(address)) {
|
|
73
|
+
throw new Error(`${envName} must be an address`);
|
|
74
|
+
}
|
|
75
|
+
config.gateway.contracts[contractName] = address;
|
|
76
|
+
}
|
|
77
|
+
if (process.env.GATEWAY_URL) {
|
|
78
|
+
config.gateway.url = process.env.GATEWAY_URL;
|
|
79
|
+
}
|
|
80
|
+
const storageApiUrlValue = process.env.STORAGE_API_URL ?? DEFAULT_STORAGE_API_URLS[chainId];
|
|
81
|
+
if (storageApiUrlValue) {
|
|
82
|
+
let storageApiUrl;
|
|
83
|
+
try {
|
|
84
|
+
storageApiUrl = new URL(storageApiUrlValue);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new Error("STORAGE_API_URL must be a valid absolute https URL");
|
|
88
|
+
}
|
|
89
|
+
if (storageApiUrl.protocol !== "https:") {
|
|
90
|
+
throw new Error("STORAGE_API_URL must be a valid absolute https URL");
|
|
91
|
+
}
|
|
92
|
+
config.storage.config.vana = {
|
|
93
|
+
...config.storage.config.vana,
|
|
94
|
+
apiUrl: storageApiUrlValue,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Preview-testing hook; production fetch behaviour is unchanged when unset.
|
|
98
|
+
if (process.env.VERCEL_PROTECTION_BYPASS) {
|
|
99
|
+
installGatewayBypass(config.gateway.url, process.env.VERCEL_PROTECTION_BYPASS);
|
|
100
|
+
}
|
|
101
|
+
config.sync.enabled = process.env.SYNC_ENABLED !== SYNC_DISABLED;
|
|
102
|
+
config.devUi.enabled = false;
|
|
103
|
+
config.tunnel.enabled = false;
|
|
104
|
+
const serverAccount = createPublicOnlyAccount({
|
|
105
|
+
address: enclaveEnv.serverAddress,
|
|
106
|
+
publicKey: enclaveEnv.serverPublicKey,
|
|
107
|
+
});
|
|
108
|
+
// Enclave only: MCP reads become enclave-signed access records. Other
|
|
109
|
+
// profiles have no agent to sign them, so they report nothing.
|
|
110
|
+
const accessReporter = createAccessReporter({
|
|
111
|
+
agentEndpoint: enclaveEnv.agentUrl,
|
|
112
|
+
accessToken: enclaveEnv.accessToken,
|
|
113
|
+
chainId,
|
|
114
|
+
});
|
|
115
|
+
const context = await createServer(config, {
|
|
116
|
+
rootPath,
|
|
117
|
+
hydrateScopes: readHydrateScopes(process.env.PS_HYDRATE_SCOPES),
|
|
118
|
+
ownerSignature: enclaveEnv.ownerSignature,
|
|
119
|
+
serverAccount,
|
|
120
|
+
profile: "enclave",
|
|
121
|
+
readFulfillmentReporter: accessReporter,
|
|
122
|
+
jobResultUpload: {
|
|
123
|
+
storageEndpoint: storageApiUrlValue,
|
|
124
|
+
agentEndpoint: enclaveEnv.agentUrl,
|
|
125
|
+
accessToken: enclaveEnv.accessToken,
|
|
126
|
+
chainId,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
const server = await listenHttpServer({
|
|
130
|
+
fetch: context.app.fetch,
|
|
131
|
+
port: config.server.port,
|
|
132
|
+
onListening: (info) => {
|
|
133
|
+
context.logger.info({ port: info.port }, "Enclave server started");
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
void context.startBackgroundServices();
|
|
137
|
+
const shutdown = (signal) => {
|
|
138
|
+
context.logger.info({ signal }, "Shutdown signal received");
|
|
139
|
+
server.close(() => {
|
|
140
|
+
void accessReporter.stop().then(() => context.cleanup());
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
144
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
145
|
+
}
|
|
146
|
+
function readHydrateScopes(value) {
|
|
147
|
+
if (!value) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const scopes = [
|
|
151
|
+
...new Set(value.split(",").map((scope) => scope.trim())),
|
|
152
|
+
].filter(Boolean);
|
|
153
|
+
return scopes.length > 0 ? scopes : undefined;
|
|
154
|
+
}
|
|
155
|
+
function assertHttpUrl(value, name) {
|
|
156
|
+
let url;
|
|
157
|
+
try {
|
|
158
|
+
url = new URL(value);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new Error(`${name} must be a valid absolute http(s) URL`);
|
|
162
|
+
}
|
|
163
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
164
|
+
throw new Error(`${name} must be a valid absolute http(s) URL`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function readChainId(value) {
|
|
168
|
+
const chainId = value === undefined ? MOKSHA_CHAIN_ID : Number(value);
|
|
169
|
+
if (chainId !== MAINNET_CHAIN_ID && chainId !== MOKSHA_CHAIN_ID) {
|
|
170
|
+
throw new Error("CHAIN_ID must be 1480 or 14800");
|
|
171
|
+
}
|
|
172
|
+
return chainId;
|
|
173
|
+
}
|
|
174
|
+
function installGatewayBypass(gatewayUrl, secret) {
|
|
175
|
+
const gatewayOrigin = new URL(gatewayUrl).origin;
|
|
176
|
+
const requestFetch = globalThis.fetch;
|
|
177
|
+
globalThis.fetch = (input, init) => {
|
|
178
|
+
const requestUrl = new URL(input instanceof Request ? input.url : input.toString());
|
|
179
|
+
if (requestUrl.origin !== gatewayOrigin) {
|
|
180
|
+
return requestFetch(input, init);
|
|
181
|
+
}
|
|
182
|
+
const headers = new Headers(input instanceof Request ? input.headers : undefined);
|
|
183
|
+
new Headers(init?.headers).forEach((value, key) => headers.set(key, value));
|
|
184
|
+
headers.set("x-vercel-protection-bypass", secret);
|
|
185
|
+
return requestFetch(input, { ...init, headers });
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=enclave-main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enclave-main.js","sourceRoot":"","sources":["../src/enclave-main.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,33 +1,17 @@
|
|
|
1
|
-
import { createAdaptorServer } from "@hono/node-server";
|
|
2
1
|
import { createRequire } from "node:module";
|
|
3
2
|
import { loadConfig } from "./config/index.js";
|
|
4
3
|
import { createServer } from "./bootstrap.js";
|
|
5
4
|
import { verifyTunnelUrl } from "./tunnel/index.js";
|
|
5
|
+
import { runEnclaveMain } from "./enclave-main.js";
|
|
6
|
+
import { listenHttpServer } from "./listen.js";
|
|
6
7
|
const require = createRequire(import.meta.url);
|
|
7
8
|
const pkg = require("../package.json");
|
|
8
9
|
const DRAIN_TIMEOUT_MS = 5_000;
|
|
9
|
-
async function listenHttpServer(params) {
|
|
10
|
-
const server = createAdaptorServer({ fetch: params.fetch });
|
|
11
|
-
await new Promise((resolve, reject) => {
|
|
12
|
-
const onError = (error) => {
|
|
13
|
-
server.off("error", onError);
|
|
14
|
-
reject(error);
|
|
15
|
-
};
|
|
16
|
-
server.once("error", onError);
|
|
17
|
-
server.listen(params.port, params.hostname, () => {
|
|
18
|
-
server.off("error", onError);
|
|
19
|
-
const address = server.address();
|
|
20
|
-
if (!address || typeof address === "string") {
|
|
21
|
-
reject(new Error("Could not resolve bound server address"));
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
params.onListening?.(address);
|
|
25
|
-
resolve();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
return server;
|
|
29
|
-
}
|
|
30
10
|
async function main() {
|
|
11
|
+
if (process.env.ENCLAVE_MODE === "true") {
|
|
12
|
+
await runEnclaveMain();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
31
15
|
const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
|
|
32
16
|
const config = await loadConfig({ rootPath });
|
|
33
17
|
const context = await createServer(config, { rootPath });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAEhE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACxC,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAEzE,IAAI,QAAQ,EAAE,CAAC;gBACb,oEAAoE;gBACpE,4BAA4B;gBAC5B,MAAM,CAAC,IAAI,CACT;oBACE,GAAG,EAAE,oBAAoB,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK;iBACrE,EACD,kBAAkB,CACnB,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,eAAuC,CAAC;IAC5C,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,eAAe,GAAG,MAAM,gBAAgB,CAAC;gBACvC,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,OAAO,CAAC,iBAAiB;gBAC/B,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;oBACpB,MAAM,mBAAmB,GAAG,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5D,OAAO,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC;oBACpD,MAAM,CAAC,IAAI,CACT,EAAE,mBAAmB,EAAE,EACvB,gCAAgC,CACjC,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,EACxC,0FAA0F,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,6EAA6E;IAC7E,OAAO,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC1C,6EAA6E;QAC7E,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC7C,IACE,SAAS;YACT,aAAa;YACb,OAAO,CAAC,kBAAkB,EAAE;YAC5B,aAAa,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,OAAO,EAC5C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC;YACnE,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EACxC,qBAAqB,CACtB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAC7D,8DAA8D,CAC/D,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,QAAQ,CAAC,MAAc;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,gDAAgD,CAAC,CAAC;QAE1E,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,OAAO,IAAI,CAAC,CAAC;YACb,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,eAAe,EAAE,CAAC;YACpB,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,iCAAiC;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffered access-record reporter (enclave profile only).
|
|
3
|
+
*
|
|
4
|
+
* Every MCP read the sandbox PS serves or refuses becomes one access record.
|
|
5
|
+
* The sandbox cannot reach the Gateway itself, so records go to the enclave
|
|
6
|
+
* agent, which signs them with the user's enclave key and relays them:
|
|
7
|
+
*
|
|
8
|
+
* sandbox PS --Bearer PS_ACCESS_TOKEN--> agent --node bearer--> Gateway
|
|
9
|
+
*
|
|
10
|
+
* Reporting is best effort by contract: a read is never delayed or failed
|
|
11
|
+
* because its record could not be delivered. Delivery itself is not best
|
|
12
|
+
* effort — a failed batch is retried with backoff, and a batch that is finally
|
|
13
|
+
* given up on is logged as dropped so the gap in the owner's audit trail is
|
|
14
|
+
* visible rather than silent (security #9).
|
|
15
|
+
*/
|
|
16
|
+
import type { PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
|
|
17
|
+
/** Log line a dropped batch always emits; the audit gap is a metric, not noise. */
|
|
18
|
+
export declare const ACCESS_RECORDS_DROPPED = "Access records dropped";
|
|
19
|
+
export interface AccessReporterLogger {
|
|
20
|
+
warn(payload: Record<string, unknown>, message: string): void;
|
|
21
|
+
}
|
|
22
|
+
export interface AccessReporterOptions {
|
|
23
|
+
agentEndpoint: string;
|
|
24
|
+
accessToken: string;
|
|
25
|
+
chainId: number;
|
|
26
|
+
logger?: AccessReporterLogger;
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
}
|
|
29
|
+
export interface AccessReporter extends PersonalServerReadFulfillmentReporter {
|
|
30
|
+
/** Sends everything buffered. Resolves even when delivery failed. */
|
|
31
|
+
flush(): Promise<void>;
|
|
32
|
+
/** Stops the timer and flushes; call on shutdown. */
|
|
33
|
+
stop(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export declare function createAccessReporter(options: AccessReporterOptions): AccessReporter;
|
|
36
|
+
//# sourceMappingURL=access-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-reporter.d.ts","sourceRoot":"","sources":["../../src/jobs/access-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,qCAAqC,EACtC,MAAM,2CAA2C,CAAC;AAsBnD,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,qCAAqC;IAC3E,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,qDAAqD;IACrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA4BD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAoMhB"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffered access-record reporter (enclave profile only).
|
|
3
|
+
*
|
|
4
|
+
* Every MCP read the sandbox PS serves or refuses becomes one access record.
|
|
5
|
+
* The sandbox cannot reach the Gateway itself, so records go to the enclave
|
|
6
|
+
* agent, which signs them with the user's enclave key and relays them:
|
|
7
|
+
*
|
|
8
|
+
* sandbox PS --Bearer PS_ACCESS_TOKEN--> agent --node bearer--> Gateway
|
|
9
|
+
*
|
|
10
|
+
* Reporting is best effort by contract: a read is never delayed or failed
|
|
11
|
+
* because its record could not be delivered. Delivery itself is not best
|
|
12
|
+
* effort — a failed batch is retried with backoff, and a batch that is finally
|
|
13
|
+
* given up on is logged as dropped so the gap in the owner's audit trail is
|
|
14
|
+
* visible rather than silent (security #9).
|
|
15
|
+
*/
|
|
16
|
+
const ACCESS_RECORDS_PATH = "/agent/v1/access-records";
|
|
17
|
+
const ACTION_READ = "read";
|
|
18
|
+
const POST = "POST";
|
|
19
|
+
const JSON_CONTENT_TYPE = "application/json";
|
|
20
|
+
/** One request carries at most this many records; the agent enforces it too. */
|
|
21
|
+
const MAX_BATCH_RECORDS = 50;
|
|
22
|
+
/** A partial batch waits at most this long before it is sent. */
|
|
23
|
+
const FLUSH_INTERVAL_MS = 5_000;
|
|
24
|
+
/** Backstop for an unreachable agent: drop oldest rather than grow forever. */
|
|
25
|
+
const MAX_QUEUED_RECORDS = 500;
|
|
26
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
27
|
+
const HTTP_BAD_REQUEST = 400;
|
|
28
|
+
const HTTP_SERVER_ERROR = 500;
|
|
29
|
+
/** Delivery attempts per batch before it is given up on and logged. */
|
|
30
|
+
const MAX_SEND_ATTEMPTS = 3;
|
|
31
|
+
/** Backoff between attempts: 500 ms, then 1 s. */
|
|
32
|
+
const RETRY_BASE_DELAY_MS = 500;
|
|
33
|
+
/** Log line a dropped batch always emits; the audit gap is a metric, not noise. */
|
|
34
|
+
export const ACCESS_RECORDS_DROPPED = "Access records dropped";
|
|
35
|
+
export function createAccessReporter(options) {
|
|
36
|
+
const requestFetch = options.fetch ?? fetch;
|
|
37
|
+
const endpoint = `${options.agentEndpoint.replace(/\/$/, "")}${ACCESS_RECORDS_PATH}`;
|
|
38
|
+
const logger = options.logger ?? consoleAccessReporterLogger;
|
|
39
|
+
const queue = [];
|
|
40
|
+
let timer;
|
|
41
|
+
let sending = Promise.resolve();
|
|
42
|
+
// Shutdown must not wait out the backoff; a stopping reporter sends once.
|
|
43
|
+
let stopping = false;
|
|
44
|
+
// Every record this reporter never delivered, across both drop paths.
|
|
45
|
+
let dropped = 0;
|
|
46
|
+
function enqueue(event) {
|
|
47
|
+
queue.push(toPayload(options.chainId, event));
|
|
48
|
+
if (queue.length > MAX_QUEUED_RECORDS) {
|
|
49
|
+
const overflow = queue.splice(0, queue.length - MAX_QUEUED_RECORDS);
|
|
50
|
+
drop(overflow, { reason: "queue_full" });
|
|
51
|
+
}
|
|
52
|
+
if (queue.length >= MAX_BATCH_RECORDS) {
|
|
53
|
+
void flush();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
startTimer();
|
|
57
|
+
}
|
|
58
|
+
function startTimer() {
|
|
59
|
+
if (timer)
|
|
60
|
+
return;
|
|
61
|
+
timer = setTimeout(() => {
|
|
62
|
+
timer = undefined;
|
|
63
|
+
void flush();
|
|
64
|
+
}, FLUSH_INTERVAL_MS);
|
|
65
|
+
timer.unref?.();
|
|
66
|
+
}
|
|
67
|
+
function clearFlushTimer() {
|
|
68
|
+
if (!timer)
|
|
69
|
+
return;
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
timer = undefined;
|
|
72
|
+
}
|
|
73
|
+
// Serialized so two flushes never interleave batches on the wire.
|
|
74
|
+
function flush() {
|
|
75
|
+
clearFlushTimer();
|
|
76
|
+
sending = sending.then(async () => {
|
|
77
|
+
while (queue.length > 0) {
|
|
78
|
+
const batch = queue.splice(0, MAX_BATCH_RECORDS);
|
|
79
|
+
await send(batch);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return sending;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Deliver one batch, retrying a transient failure with backoff.
|
|
86
|
+
*
|
|
87
|
+
* attempt 1 --fail--> 500 ms --> attempt 2 --fail--> 1 s --> attempt 3
|
|
88
|
+
*
|
|
89
|
+
* A 4xx is the agent refusing these records, not a blip, so it is not
|
|
90
|
+
* retried. Whatever is finally undelivered goes through `drop`, which is the
|
|
91
|
+
* one place an audit gap becomes visible.
|
|
92
|
+
*/
|
|
93
|
+
async function send(records) {
|
|
94
|
+
for (let attempt = 1; attempt <= MAX_SEND_ATTEMPTS; attempt += 1) {
|
|
95
|
+
const outcome = await attemptSend(records);
|
|
96
|
+
if (outcome === null)
|
|
97
|
+
return;
|
|
98
|
+
// A 400 that names the records it objects to indicts those records, not
|
|
99
|
+
// the batch: the rest still describe reads the owner is owed.
|
|
100
|
+
if (outcome.rejected) {
|
|
101
|
+
await sendWithoutRejected(records, outcome);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const lastChance = attempt === MAX_SEND_ATTEMPTS || stopping;
|
|
105
|
+
if (outcome.permanent || lastChance) {
|
|
106
|
+
drop(records, { ...detailOf(outcome), attempts: attempt });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
await delay(RETRY_BASE_DELAY_MS * 2 ** (attempt - 1));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Drop only the records the responder named and resend the remainder once.
|
|
114
|
+
*
|
|
115
|
+
* [a bad b] --400 index 1--> drop [bad] --resend--> [a b]
|
|
116
|
+
*
|
|
117
|
+
* One attempt, not the full backoff ladder: the batch has already cost a
|
|
118
|
+
* round trip, and a second refusal means the remainder is no better.
|
|
119
|
+
*/
|
|
120
|
+
async function sendWithoutRejected(records, failure) {
|
|
121
|
+
const rejected = new Set(failure.rejected);
|
|
122
|
+
drop(records.filter((_, index) => rejected.has(index)), { ...detailOf(failure), attempts: 1 });
|
|
123
|
+
const remainder = records.filter((_, index) => !rejected.has(index));
|
|
124
|
+
if (remainder.length === 0)
|
|
125
|
+
return;
|
|
126
|
+
const outcome = await attemptSend(remainder);
|
|
127
|
+
if (outcome === null)
|
|
128
|
+
return;
|
|
129
|
+
drop(remainder, { ...detailOf(outcome), attempts: 1 });
|
|
130
|
+
}
|
|
131
|
+
/** null when the batch landed; otherwise why it did not. */
|
|
132
|
+
async function attemptSend(records) {
|
|
133
|
+
try {
|
|
134
|
+
const response = await requestFetch(endpoint, {
|
|
135
|
+
method: POST,
|
|
136
|
+
headers: {
|
|
137
|
+
Authorization: `Bearer ${options.accessToken}`,
|
|
138
|
+
"Content-Type": JSON_CONTENT_TYPE,
|
|
139
|
+
},
|
|
140
|
+
body: JSON.stringify({ records }),
|
|
141
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
142
|
+
});
|
|
143
|
+
if (response.ok)
|
|
144
|
+
return null;
|
|
145
|
+
return {
|
|
146
|
+
reason: `refused_${response.status}`,
|
|
147
|
+
permanent: response.status >= HTTP_BAD_REQUEST &&
|
|
148
|
+
response.status < HTTP_SERVER_ERROR,
|
|
149
|
+
...(await readRefusal(response, records.length)),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
return {
|
|
154
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
155
|
+
permanent: false,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* What a dropped batch is logged with. `rejected` positions are meaningless
|
|
161
|
+
* once the records they point at are gone, so they stay out of the line.
|
|
162
|
+
*/
|
|
163
|
+
function detailOf(failure) {
|
|
164
|
+
return {
|
|
165
|
+
reason: failure.reason,
|
|
166
|
+
...(failure.code === undefined ? {} : { code: failure.code }),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Records that will never reach the Gateway. Reads were already served, so
|
|
171
|
+
* this is the audit trail's gap: it is counted and logged under one stable
|
|
172
|
+
* message, never swallowed.
|
|
173
|
+
*/
|
|
174
|
+
function drop(records, detail) {
|
|
175
|
+
dropped += records.length;
|
|
176
|
+
logger.warn({ count: records.length, droppedTotal: dropped, ...detail }, ACCESS_RECORDS_DROPPED);
|
|
177
|
+
}
|
|
178
|
+
function delay(ms) {
|
|
179
|
+
return new Promise((resolve) => {
|
|
180
|
+
const handle = setTimeout(resolve, ms);
|
|
181
|
+
handle.unref?.();
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
async report(event) {
|
|
186
|
+
enqueue(event);
|
|
187
|
+
},
|
|
188
|
+
async reportDenied(event) {
|
|
189
|
+
enqueue(event);
|
|
190
|
+
},
|
|
191
|
+
flush,
|
|
192
|
+
async stop() {
|
|
193
|
+
stopping = true;
|
|
194
|
+
clearFlushTimer();
|
|
195
|
+
await flush();
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* What a refusal body says: the error code, and — on a 400 — which records it
|
|
201
|
+
* objects to. Anything unparseable leaves both unset, so a bodyless refusal
|
|
202
|
+
* behaves exactly as it did before.
|
|
203
|
+
*/
|
|
204
|
+
async function readRefusal(response, batchSize) {
|
|
205
|
+
let body;
|
|
206
|
+
try {
|
|
207
|
+
body = await response.json();
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return {};
|
|
211
|
+
}
|
|
212
|
+
if (typeof body !== "object" || body === null)
|
|
213
|
+
return {};
|
|
214
|
+
const refusal = body;
|
|
215
|
+
const code = refusal["code"];
|
|
216
|
+
const rejected = response.status === HTTP_BAD_REQUEST
|
|
217
|
+
? rejectedIndices(refusal, batchSize)
|
|
218
|
+
: undefined;
|
|
219
|
+
return {
|
|
220
|
+
...(typeof code === "string" ? { code } : {}),
|
|
221
|
+
...(rejected === undefined ? {} : { rejected }),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Positions the responder objected to, in either shape it may use:
|
|
226
|
+
*
|
|
227
|
+
* { rejected: [{ index: 1, code }, ...] } per-record report
|
|
228
|
+
* { error, index: 1 } single offending record
|
|
229
|
+
*
|
|
230
|
+
* Out-of-range or absent indices yield undefined, which keeps the caller on
|
|
231
|
+
* the whole-batch path rather than dropping records nobody named.
|
|
232
|
+
*/
|
|
233
|
+
function rejectedIndices(refusal, batchSize) {
|
|
234
|
+
const entries = Array.isArray(refusal["rejected"])
|
|
235
|
+
? refusal["rejected"]
|
|
236
|
+
: [refusal];
|
|
237
|
+
const indices = new Set();
|
|
238
|
+
for (const entry of entries) {
|
|
239
|
+
if (typeof entry !== "object" || entry === null)
|
|
240
|
+
continue;
|
|
241
|
+
const index = entry["index"];
|
|
242
|
+
if (isBatchIndex(index, batchSize))
|
|
243
|
+
indices.add(index);
|
|
244
|
+
}
|
|
245
|
+
return indices.size > 0 ? [...indices] : undefined;
|
|
246
|
+
}
|
|
247
|
+
function isBatchIndex(value, batchSize) {
|
|
248
|
+
return (Number.isInteger(value) &&
|
|
249
|
+
value >= 0 &&
|
|
250
|
+
value < batchSize);
|
|
251
|
+
}
|
|
252
|
+
function toPayload(chainId, event) {
|
|
253
|
+
return {
|
|
254
|
+
action: ACTION_READ,
|
|
255
|
+
chainId,
|
|
256
|
+
...(event.denyReason === undefined ? {} : { denyReason: event.denyReason }),
|
|
257
|
+
grantId: event.grantId,
|
|
258
|
+
granteeAddress: event.builder,
|
|
259
|
+
logId: event.logId,
|
|
260
|
+
occurredAt: event.servedAt,
|
|
261
|
+
outcome: event.outcome,
|
|
262
|
+
scope: event.scope,
|
|
263
|
+
source: event.source,
|
|
264
|
+
...(event.tool === undefined ? {} : { tool: event.tool }),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const consoleAccessReporterLogger = {
|
|
268
|
+
warn(payload, message) {
|
|
269
|
+
console.warn(message, payload);
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=access-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-reporter.js","sourceRoot":"","sources":["../../src/jobs/access-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-envelope-stream.d.ts","sourceRoot":"","sources":["../../src/jobs/raw-envelope-stream.ts"],"names":[],"mappings":"AAoCA,kFAAkF;AAClF,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,GAC9C,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAQrC"}
|