@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.
Files changed (71) hide show
  1. package/README.md +147 -12
  2. package/dist/abrigo-contract.d.ts +2 -92
  3. package/dist/abrigo-contract.js +12 -53
  4. package/dist/abrigo-response.d.ts +1 -6
  5. package/dist/abrigo-response.js +3 -25
  6. package/dist/abrigo.d.ts +5 -5
  7. package/dist/abrigo.js +66 -92
  8. package/dist/agent-evidence.d.ts +5 -5
  9. package/dist/agent-evidence.js +58 -48
  10. package/dist/agent-source-evidence-contract.d.ts +2 -1197
  11. package/dist/agent-source-evidence-contract.js +24 -94
  12. package/dist/agents-contract.d.ts +2 -99
  13. package/dist/agents-contract.js +13 -67
  14. package/dist/agents.d.ts +5 -5
  15. package/dist/agents.js +79 -44
  16. package/dist/capabilities.d.ts +1 -1
  17. package/dist/capabilities.js +1 -1
  18. package/dist/config.d.ts +1 -0
  19. package/dist/config.js +4 -1
  20. package/dist/directory-config.d.ts +1 -23
  21. package/dist/directory-config.js +8 -20
  22. package/dist/directory-contract.d.ts +2 -68
  23. package/dist/directory-contract.js +13 -55
  24. package/dist/directory-roster-contract.d.ts +2 -22
  25. package/dist/directory-roster-contract.js +7 -22
  26. package/dist/directory.d.ts +4 -8
  27. package/dist/directory.js +15 -33
  28. package/dist/group-roster-access.d.ts +7 -0
  29. package/dist/group-roster-access.js +8 -0
  30. package/dist/index.d.ts +49 -46
  31. package/dist/index.js +8 -1
  32. package/dist/invocation-client.d.ts +4 -4
  33. package/dist/invocation-client.js +32 -60
  34. package/dist/invocation-contract.d.ts +2 -59
  35. package/dist/invocation-contract.js +10 -61
  36. package/dist/invocation.d.ts +4 -4
  37. package/dist/invocation.js +42 -63
  38. package/dist/lattice-provenance-contract.d.ts +2 -607
  39. package/dist/lattice-provenance-contract.js +14 -154
  40. package/dist/lattice-provenance.d.ts +3 -3
  41. package/dist/lattice-provenance.js +46 -97
  42. package/dist/monitoring-annotations.d.ts +2 -53
  43. package/dist/monitoring-annotations.js +2 -51
  44. package/dist/monitoring-contract.d.ts +5 -460
  45. package/dist/monitoring-contract.js +37 -77
  46. package/dist/monitoring-events.d.ts +2 -252
  47. package/dist/monitoring-events.js +15 -125
  48. package/dist/monitoring.d.ts +3 -3
  49. package/dist/monitoring.js +41 -41
  50. package/dist/orm.d.ts +10 -1
  51. package/dist/orm.js +27 -7
  52. package/dist/platform-client.d.ts +27 -0
  53. package/dist/platform-client.js +79 -0
  54. package/dist/platform-domains.d.ts +1671 -0
  55. package/dist/platform-domains.js +77 -0
  56. package/dist/processes-contract.d.ts +2 -149
  57. package/dist/processes-contract.js +17 -100
  58. package/dist/processes.d.ts +3 -3
  59. package/dist/processes.js +64 -49
  60. package/dist/runtime.cjs +4251 -1666
  61. package/dist/service-directory-roster.d.ts +12 -3
  62. package/dist/service-directory-roster.js +11 -17
  63. package/dist/service-directory.d.ts +4 -8
  64. package/dist/service-directory.js +16 -67
  65. package/dist/storage.d.ts +36 -35
  66. package/dist/storage.js +12 -5
  67. package/dist/workflow-source-contract.d.ts +2 -524
  68. package/dist/workflow-source-contract.js +16 -56
  69. package/dist/workflow-source.d.ts +3 -3
  70. package/dist/workflow-source.js +106 -43
  71. package/package.json +4 -3
@@ -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 === 'function' ? [headers.get(name)] : Object.entries(headers).filter(([key]) => key.toLowerCase() === name).map(([, value]) => value);
11
- return values.length === 1 && typeof values[0] === 'string' ? values[0] : null;
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({ sub: zod_1.z.string(), functionId: zod_1.z.uuid(), versionId: zod_1.z.uuid(), invocationId: zod_1.z.uuid(), serviceAccountId: zod_1.z.uuid(), org: zod_1.z.string().min(1), exp: zod_1.z.number().int() });
14
- function credential({ request, evidence }) {
15
- const refused = () => new workflow_source_contract_1.FunctionWorkflowReadError(401, 'invalid_context', 'This invocation has no valid workflow-source credential');
16
- const token = header(request, evidence ? workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER : workflow_source_contract_1.FUNCTION_WORKFLOW_TOKEN_HEADER);
17
- const body = token && token.length <= 16_384 ? /^([A-Za-z0-9_-]+)\.[A-Za-z0-9_-]{43}$/.exec(token)?.[1] : null;
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, 'base64url').toString('utf8'));
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.extend({ audience: zod_1.z.literal(evidence ? 'atlas-managed-function-workflow-evidence' : 'atlas-managed-function-workflow-read') }).safeParse(value);
28
- if (!binding.success || binding.data.sub !== `service-account|${binding.data.serviceAccountId}`)
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, 'invalid_configuration', 'Configure a trusted Atlas origin');
64
+ throw new workflow_source_contract_1.FunctionWorkflowReadError(400, "invalid_configuration", "Configure a trusted Atlas origin");
39
65
  }
40
- const loopback = url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);
41
- if ((!loopback && url.protocol !== 'https:') || url.username || url.password || url.pathname !== '/' || url.search || url.hash)
42
- throw new workflow_source_contract_1.FunctionWorkflowReadError(400, 'invalid_configuration', 'Configure an HTTPS Atlas origin without credentials, path, query or fragment');
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 && left.versionId === right.versionId && left.invocationId === right.invocationId && left.serviceAccountId === right.serviceAccountId && left.org === right.org && left.sub === right.sub;
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, 'utf8') > agent_source_evidence_contract_1.AGENT_SOURCE_VERIFY_MAX_BYTES)
51
- throw new workflow_source_contract_1.FunctionWorkflowReadError(413, 'workflow_source_too_large', 'Workflow source verification exceeds 768 KiB; capture a smaller output before writing');
52
- const lattice = header(options.request, 'x-sequence-lattice-execution-token');
53
- const response = await (options.fetchImpl ?? globalThis.fetch)(`${origin(options.baseUrl)}${path}`, { method: 'POST', headers: { 'content-type': 'application/json', ...credentials, ...(lattice ? { 'x-sequence-lattice-execution-token': lattice } : {}) }, body: serialized, redirect: 'error', signal: AbortSignal.timeout(30_000) });
54
- const result = await response.json().catch(() => null);
55
- if (!response.ok) {
56
- const error = zod_1.z.object({ detail: zod_1.z.string().max(2000).optional(), code: zod_1.z.string().max(128).optional() }).safeParse(result);
57
- throw new workflow_source_contract_1.FunctionWorkflowReadError(response.status, error.success ? (error.data.code ?? 'workflow_source_failed') : 'workflow_source_failed', error.success ? (error.data.detail ?? 'Workflow source request failed') : 'Workflow source request failed');
58
- }
59
- return result;
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, 'expired_context', 'The workflow-source credential expired; start a new invocation');
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, 'invalid_context', 'Workflow capture credentials name different invocations');
71
- return { async captureCompletedRun(query) {
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
- const parsed = workflow_source_contract_1.functionWorkflowSourceCaptureSchema.safeParse(await post({ options, path: workflow_source_contract_1.FUNCTION_WORKFLOW_CAPTURE_PATH, body: { ...workflow_source_contract_1.functionWorkflowCompletedRunQuerySchema.parse(query), operation: 'captureCompletedRun' }, credentials: { [workflow_source_contract_1.FUNCTION_WORKFLOW_TOKEN_HEADER]: read.token, [workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER]: evidence.token } }));
75
- if (!parsed.success || parsed.data.response.workflow !== query.workflow || parsed.data.response.runId !== query.runId)
76
- throw new workflow_source_contract_1.FunctionWorkflowReadError(502, 'malformed_response', 'Atlas returned a different completed workflow source');
77
- return parsed.data;
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 { async verifySourceEvidence(input) {
142
+ return (0, adapters_1.createWorkflowEvidenceClient)({
143
+ binding: evidence.binding,
144
+ send: (body) => {
84
145
  assertLive(evidence.binding);
85
- const parsed = workflow_source_contract_1.functionWorkflowSourceVerificationSchema.safeParse(await post({ options, path: workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_PATH, body: workflow_source_contract_1.functionWorkflowSourceEvidenceRequestSchema.parse({ ...input, operation: 'verifySourceEvidence' }), credentials: { [workflow_source_contract_1.FUNCTION_WORKFLOW_EVIDENCE_TOKEN_HEADER]: evidence.token } }));
86
- if (!parsed.success)
87
- throw new workflow_source_contract_1.FunctionWorkflowReadError(502, 'malformed_response', 'Atlas returned invalid workflow source verification');
88
- const { source, receiver } = parsed.data;
89
- if (source.workflowId !== input.workflow || source.runId !== input.runId || source.responseHash !== input.responseHash || receiver.functionId !== evidence.binding.functionId || receiver.versionId !== evidence.binding.versionId || receiver.invocationId !== evidence.binding.invocationId || receiver.serviceAccountId !== evidence.binding.serviceAccountId || receiver.org !== evidence.binding.org)
90
- throw new workflow_source_contract_1.FunctionWorkflowReadError(502, 'malformed_response', 'Atlas returned workflow evidence for another request or invocation');
91
- return parsed.data;
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.4.5",
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.2"
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.7.1"
52
+ "@sequenceholdings/orm": "2.8.1"
52
53
  },
53
54
  "engines": {
54
55
  "node": ">=20"