@sequenceholdings/managed-functions 0.4.5 → 0.5.1
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 +147 -12
- package/dist/abrigo-contract.d.ts +2 -92
- package/dist/abrigo-contract.js +12 -53
- package/dist/abrigo-response.d.ts +1 -6
- package/dist/abrigo-response.js +3 -25
- package/dist/abrigo.d.ts +5 -5
- package/dist/abrigo.js +66 -92
- package/dist/agent-evidence.d.ts +5 -5
- package/dist/agent-evidence.js +58 -48
- package/dist/agent-source-evidence-contract.d.ts +2 -1197
- package/dist/agent-source-evidence-contract.js +24 -94
- package/dist/agents-contract.d.ts +2 -99
- package/dist/agents-contract.js +13 -67
- package/dist/agents.d.ts +5 -5
- package/dist/agents.js +79 -44
- package/dist/capabilities.d.ts +1 -1
- package/dist/capabilities.js +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +4 -1
- package/dist/directory-config.d.ts +1 -23
- package/dist/directory-config.js +8 -20
- package/dist/directory-contract.d.ts +2 -68
- package/dist/directory-contract.js +13 -55
- package/dist/directory-roster-contract.d.ts +2 -22
- package/dist/directory-roster-contract.js +7 -22
- package/dist/directory.d.ts +4 -8
- package/dist/directory.js +15 -33
- package/dist/group-roster-access.d.ts +7 -0
- package/dist/group-roster-access.js +8 -0
- package/dist/index.d.ts +49 -46
- package/dist/index.js +8 -1
- package/dist/invocation-client.d.ts +4 -4
- package/dist/invocation-client.js +32 -60
- package/dist/invocation-contract.d.ts +2 -59
- package/dist/invocation-contract.js +10 -61
- package/dist/invocation.d.ts +4 -4
- package/dist/invocation.js +42 -63
- package/dist/lattice-provenance-contract.d.ts +2 -607
- package/dist/lattice-provenance-contract.js +14 -154
- package/dist/lattice-provenance.d.ts +3 -3
- package/dist/lattice-provenance.js +46 -97
- package/dist/monitoring-annotations.d.ts +2 -53
- package/dist/monitoring-annotations.js +2 -51
- package/dist/monitoring-contract.d.ts +5 -460
- package/dist/monitoring-contract.js +37 -77
- package/dist/monitoring-events.d.ts +2 -252
- package/dist/monitoring-events.js +15 -125
- package/dist/monitoring.d.ts +3 -3
- package/dist/monitoring.js +41 -41
- package/dist/orm.d.ts +10 -1
- package/dist/orm.js +27 -7
- package/dist/platform-client.d.ts +27 -0
- package/dist/platform-client.js +79 -0
- package/dist/platform-domains.d.ts +1671 -0
- package/dist/platform-domains.js +77 -0
- package/dist/processes-contract.d.ts +2 -149
- package/dist/processes-contract.js +17 -100
- package/dist/processes.d.ts +3 -3
- package/dist/processes.js +64 -49
- package/dist/runtime.cjs +4251 -1666
- package/dist/service-directory-roster.d.ts +12 -3
- package/dist/service-directory-roster.js +11 -17
- package/dist/service-directory.d.ts +4 -8
- package/dist/service-directory.js +16 -67
- package/dist/storage.d.ts +36 -35
- package/dist/storage.js +12 -5
- package/dist/workflow-source-contract.d.ts +2 -524
- package/dist/workflow-source-contract.js +16 -56
- package/dist/workflow-source.d.ts +3 -3
- package/dist/workflow-source.js +106 -43
- package/package.json +4 -3
package/dist/workflow-source.js
CHANGED
|
@@ -2,30 +2,56 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createFunctionServiceWorkflowsClient = createFunctionServiceWorkflowsClient;
|
|
4
4
|
exports.createFunctionWorkflowEvidenceClient = createFunctionWorkflowEvidenceClient;
|
|
5
|
+
const adapters_1 = require("@sequenceholdings/platform/adapters");
|
|
5
6
|
const zod_1 = require("zod");
|
|
6
7
|
const agent_source_evidence_contract_1 = require("./agent-source-evidence-contract");
|
|
7
8
|
const workflow_source_contract_1 = require("./workflow-source-contract");
|
|
8
9
|
function header(request, name) {
|
|
9
10
|
const { headers } = request;
|
|
10
|
-
const values = typeof headers.get ===
|
|
11
|
-
|
|
11
|
+
const values = typeof headers.get === "function"
|
|
12
|
+
? [headers.get(name)]
|
|
13
|
+
: Object.entries(headers)
|
|
14
|
+
.filter(([key]) => key.toLowerCase() === name)
|
|
15
|
+
.map(([, value]) => value);
|
|
16
|
+
return values.length === 1 && typeof values[0] === "string"
|
|
17
|
+
? values[0]
|
|
18
|
+
: null;
|
|
12
19
|
}
|
|
13
|
-
const receiverSchema = zod_1.z.object({
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
const receiverSchema = zod_1.z.object({
|
|
21
|
+
sub: zod_1.z.string(),
|
|
22
|
+
functionId: zod_1.z.uuid(),
|
|
23
|
+
versionId: zod_1.z.uuid(),
|
|
24
|
+
invocationId: zod_1.z.uuid(),
|
|
25
|
+
serviceAccountId: zod_1.z.uuid(),
|
|
26
|
+
org: zod_1.z.string().min(1),
|
|
27
|
+
exp: zod_1.z.number().int(),
|
|
28
|
+
});
|
|
29
|
+
function credential({ request, evidence, }) {
|
|
30
|
+
const refused = () => new workflow_source_contract_1.FunctionWorkflowReadError(401, "invalid_context", "This invocation has no valid workflow-source credential");
|
|
31
|
+
const token = header(request, evidence
|
|
32
|
+
? workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER
|
|
33
|
+
: workflow_source_contract_1.FUNCTION_WORKFLOW_TOKEN_HEADER);
|
|
34
|
+
const body = token && token.length <= 16_384
|
|
35
|
+
? /^([A-Za-z0-9_-]+)\.[A-Za-z0-9_-]{43}$/.exec(token)?.[1]
|
|
36
|
+
: null;
|
|
18
37
|
if (!body || !token)
|
|
19
38
|
throw refused();
|
|
20
39
|
let value;
|
|
21
40
|
try {
|
|
22
|
-
value = JSON.parse(Buffer.from(body,
|
|
41
|
+
value = JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
|
|
23
42
|
}
|
|
24
43
|
catch {
|
|
25
44
|
throw refused();
|
|
26
45
|
}
|
|
27
|
-
const binding = receiverSchema
|
|
28
|
-
|
|
46
|
+
const binding = receiverSchema
|
|
47
|
+
.extend({
|
|
48
|
+
audience: zod_1.z.literal(evidence
|
|
49
|
+
? "atlas-managed-function-workflow-evidence"
|
|
50
|
+
: "atlas-managed-function-workflow-read"),
|
|
51
|
+
})
|
|
52
|
+
.safeParse(value);
|
|
53
|
+
if (!binding.success ||
|
|
54
|
+
binding.data.sub !== `service-account|${binding.data.serviceAccountId}`)
|
|
29
55
|
throw refused();
|
|
30
56
|
return { token, binding: binding.data };
|
|
31
57
|
}
|
|
@@ -35,59 +61,96 @@ function origin(baseUrl) {
|
|
|
35
61
|
url = new URL(baseUrl);
|
|
36
62
|
}
|
|
37
63
|
catch {
|
|
38
|
-
throw new workflow_source_contract_1.FunctionWorkflowReadError(400,
|
|
64
|
+
throw new workflow_source_contract_1.FunctionWorkflowReadError(400, "invalid_configuration", "Configure a trusted Atlas origin");
|
|
39
65
|
}
|
|
40
|
-
const loopback = url.protocol ===
|
|
41
|
-
|
|
42
|
-
|
|
66
|
+
const loopback = url.protocol === "http:" &&
|
|
67
|
+
["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
|
|
68
|
+
if ((!loopback && url.protocol !== "https:") ||
|
|
69
|
+
url.username ||
|
|
70
|
+
url.password ||
|
|
71
|
+
url.pathname !== "/" ||
|
|
72
|
+
url.search ||
|
|
73
|
+
url.hash)
|
|
74
|
+
throw new workflow_source_contract_1.FunctionWorkflowReadError(400, "invalid_configuration", "Configure an HTTPS Atlas origin without credentials, path, query or fragment");
|
|
43
75
|
return url.origin;
|
|
44
76
|
}
|
|
45
77
|
function sameReceiver(left, right) {
|
|
46
|
-
return left.functionId === right.functionId &&
|
|
78
|
+
return (left.functionId === right.functionId &&
|
|
79
|
+
left.versionId === right.versionId &&
|
|
80
|
+
left.invocationId === right.invocationId &&
|
|
81
|
+
left.serviceAccountId === right.serviceAccountId &&
|
|
82
|
+
left.org === right.org &&
|
|
83
|
+
left.sub === right.sub);
|
|
47
84
|
}
|
|
48
|
-
async function post({ options, path, body, credentials }) {
|
|
85
|
+
async function post({ options, path, body, credentials, }) {
|
|
49
86
|
const serialized = JSON.stringify(body);
|
|
50
|
-
if (Buffer.byteLength(serialized,
|
|
51
|
-
throw new workflow_source_contract_1.FunctionWorkflowReadError(413,
|
|
52
|
-
const lattice = header(options.request,
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
87
|
+
if (Buffer.byteLength(serialized, "utf8") > agent_source_evidence_contract_1.AGENT_SOURCE_VERIFY_MAX_BYTES)
|
|
88
|
+
throw new workflow_source_contract_1.FunctionWorkflowReadError(413, "workflow_source_too_large", "Workflow source verification exceeds 768 KiB; capture a smaller output before writing");
|
|
89
|
+
const lattice = header(options.request, "x-sequence-lattice-execution-token");
|
|
90
|
+
const send = (0, adapters_1.createInvocationDomainTransport)({
|
|
91
|
+
baseUrl: options.baseUrl,
|
|
92
|
+
fetchImpl: options.fetchImpl,
|
|
93
|
+
domain: path === workflow_source_contract_1.FUNCTION_WORKFLOW_CAPTURE_PATH
|
|
94
|
+
? "workflows-capture"
|
|
95
|
+
: "workflows-evidence",
|
|
96
|
+
credentials: [
|
|
97
|
+
...Object.entries(credentials).map(([header, token]) => ({
|
|
98
|
+
header,
|
|
99
|
+
token,
|
|
100
|
+
})),
|
|
101
|
+
...(lattice
|
|
102
|
+
? [{ header: "x-sequence-lattice-execution-token", token: lattice }]
|
|
103
|
+
: []),
|
|
104
|
+
],
|
|
105
|
+
error: (status, code, message) => new workflow_source_contract_1.FunctionWorkflowReadError(status, code, message),
|
|
106
|
+
failure: {
|
|
107
|
+
code: "workflow_source_failed",
|
|
108
|
+
message: "Workflow source request failed",
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
return send(body);
|
|
60
112
|
}
|
|
61
113
|
function assertLive(binding) {
|
|
62
114
|
if (binding.exp <= Date.now() / 1000)
|
|
63
|
-
throw new workflow_source_contract_1.FunctionWorkflowReadError(401,
|
|
115
|
+
throw new workflow_source_contract_1.FunctionWorkflowReadError(401, "expired_context", "The workflow-source credential expired; start a new invocation");
|
|
64
116
|
}
|
|
65
117
|
function createFunctionServiceWorkflowsClient(options) {
|
|
66
118
|
origin(options.baseUrl);
|
|
67
119
|
const read = credential({ request: options.request, evidence: false });
|
|
68
120
|
const evidence = credential({ request: options.request, evidence: true });
|
|
69
121
|
if (!sameReceiver(read.binding, evidence.binding))
|
|
70
|
-
throw new workflow_source_contract_1.FunctionWorkflowReadError(401,
|
|
71
|
-
return
|
|
122
|
+
throw new workflow_source_contract_1.FunctionWorkflowReadError(401, "invalid_context", "Workflow capture credentials name different invocations");
|
|
123
|
+
return (0, adapters_1.createWorkflowSourceClient)({
|
|
124
|
+
send: (body) => {
|
|
72
125
|
assertLive(read.binding);
|
|
73
126
|
assertLive(evidence.binding);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
127
|
+
return post({
|
|
128
|
+
options,
|
|
129
|
+
path: workflow_source_contract_1.FUNCTION_WORKFLOW_CAPTURE_PATH,
|
|
130
|
+
body,
|
|
131
|
+
credentials: {
|
|
132
|
+
[workflow_source_contract_1.FUNCTION_WORKFLOW_TOKEN_HEADER]: read.token,
|
|
133
|
+
[workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER]: evidence.token,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
});
|
|
79
138
|
}
|
|
80
139
|
function createFunctionWorkflowEvidenceClient(options) {
|
|
81
140
|
origin(options.baseUrl);
|
|
82
141
|
const evidence = credential({ request: options.request, evidence: true });
|
|
83
|
-
return
|
|
142
|
+
return (0, adapters_1.createWorkflowEvidenceClient)({
|
|
143
|
+
binding: evidence.binding,
|
|
144
|
+
send: (body) => {
|
|
84
145
|
assertLive(evidence.binding);
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
146
|
+
return post({
|
|
147
|
+
options,
|
|
148
|
+
path: workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_PATH,
|
|
149
|
+
body,
|
|
150
|
+
credentials: {
|
|
151
|
+
[workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER]: evidence.token,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
});
|
|
93
156
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sequenceholdings/managed-functions",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Managed Function context and opt-in cache runtime",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"zod": "^4.1.13",
|
|
41
41
|
"@opentelemetry/api": "^1.9.0",
|
|
42
42
|
"@opentelemetry/sdk-trace-base": "^2.5.1",
|
|
43
|
-
"@sequenceholdings/storage": "0.1.
|
|
43
|
+
"@sequenceholdings/storage": "0.1.3",
|
|
44
|
+
"@sequenceholdings/platform": "0.1.0"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@types/node": "^22.0.0",
|
|
@@ -48,7 +49,7 @@
|
|
|
48
49
|
"vitest": "^4.1.11",
|
|
49
50
|
"esbuild": "^0.25.0",
|
|
50
51
|
"tsup": "^8.3.0",
|
|
51
|
-
"@sequenceholdings/orm": "2.
|
|
52
|
+
"@sequenceholdings/orm": "2.8.1"
|
|
52
53
|
},
|
|
53
54
|
"engines": {
|
|
54
55
|
"node": ">=20"
|