@relkit/graph 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/diff-types.d.ts +31 -0
- package/dist/diff-types.d.ts.map +1 -0
- package/dist/diff-types.js +7 -0
- package/dist/diff-types.js.map +1 -0
- package/dist/diff-utils.d.ts +11 -0
- package/dist/diff-utils.d.ts.map +1 -0
- package/dist/diff-utils.js +167 -0
- package/dist/diff-utils.js.map +1 -0
- package/dist/diff.d.ts +8 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +103 -0
- package/dist/diff.js.map +1 -0
- package/dist/foundation-nodes.d.ts +30 -0
- package/dist/foundation-nodes.d.ts.map +1 -0
- package/dist/foundation-nodes.js +2 -0
- package/dist/foundation-nodes.js.map +1 -0
- package/dist/graph-edges.d.ts +21 -0
- package/dist/graph-edges.d.ts.map +1 -0
- package/dist/graph-edges.js +21 -0
- package/dist/graph-edges.js.map +1 -0
- package/dist/graph-types.d.ts +15 -0
- package/dist/graph-types.d.ts.map +1 -0
- package/dist/graph-types.js +2 -0
- package/dist/graph-types.js.map +1 -0
- package/dist/graph-validation.d.ts +2 -0
- package/dist/graph-validation.d.ts.map +1 -0
- package/dist/graph-validation.js +184 -0
- package/dist/graph-validation.js.map +1 -0
- package/dist/hash.d.ts +23 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +142 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +140 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +21 -0
- package/dist/model.js.map +1 -0
- package/dist/production.d.ts +4 -0
- package/dist/production.d.ts.map +1 -0
- package/dist/production.js +14 -0
- package/dist/production.js.map +1 -0
- package/dist/provider-validation.d.ts +2 -0
- package/dist/provider-validation.d.ts.map +1 -0
- package/dist/provider-validation.js +25 -0
- package/dist/provider-validation.js.map +1 -0
- package/dist/registration-plan.d.ts +49 -0
- package/dist/registration-plan.d.ts.map +1 -0
- package/dist/registration-plan.js +117 -0
- package/dist/registration-plan.js.map +1 -0
- package/dist/service-nodes.d.ts +32 -0
- package/dist/service-nodes.d.ts.map +1 -0
- package/dist/service-nodes.js +2 -0
- package/dist/service-nodes.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { isStableId, normalizeSourceLocation } from "@relkit/contracts";
|
|
2
|
+
import { isGraphEdgeKind, isGraphNodeKind } from "./model.js";
|
|
3
|
+
import { validateProviderNode } from "./provider-validation.js";
|
|
4
|
+
export function validateGraphShape(value, root) {
|
|
5
|
+
if (!isRecord(value) || !Array.isArray(value.nodes) || !Array.isArray(value.edges)) {
|
|
6
|
+
fail("A graph must contain nodes and edges arrays.");
|
|
7
|
+
}
|
|
8
|
+
rejectUnboundIdentities(value);
|
|
9
|
+
if (value.appId !== undefined && !isCanonicalId(value.appId))
|
|
10
|
+
fail("Graph appId is invalid.");
|
|
11
|
+
value.nodes.forEach((node, index) => validateNode(node, root, index));
|
|
12
|
+
value.edges.forEach((edge, index) => validateEdge(edge, index));
|
|
13
|
+
}
|
|
14
|
+
function validateNode(value, root, index) {
|
|
15
|
+
if (!isRecord(value) || !isGraphNodeKind(value.kind) || !isCanonicalId(value.id)) {
|
|
16
|
+
fail(`Graph nodes[${index}] has an invalid kind or canonical id.`);
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
normalizeSourceLocation(value.source, root);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
fail(`Graph nodes[${index}].source is invalid: ${error instanceof Error ? error.message : String(error)}`);
|
|
23
|
+
}
|
|
24
|
+
if ("targetFunctionId" in value) {
|
|
25
|
+
validateId(value.targetFunctionId, `Graph nodes[${index}].targetFunctionId`);
|
|
26
|
+
}
|
|
27
|
+
if (value.kind === "function")
|
|
28
|
+
validateGenerated(value.generated, index, "generated");
|
|
29
|
+
if (value.kind === "agent") {
|
|
30
|
+
validateIds(value.toolIds, `Graph nodes[${index}].toolIds`);
|
|
31
|
+
validateGenerated(value.generatedFunction, index, "generatedFunction");
|
|
32
|
+
}
|
|
33
|
+
if (value.kind === "trigger" && value.triggerType === "http") {
|
|
34
|
+
validateHttpIdentities(value.config, index);
|
|
35
|
+
}
|
|
36
|
+
if (value.kind === "service")
|
|
37
|
+
validateService(value, index);
|
|
38
|
+
if (value.kind === "provider")
|
|
39
|
+
validateProviderNode(value, index, fail);
|
|
40
|
+
if (value.kind === "middleware") {
|
|
41
|
+
if (typeof value.path !== "string" || !Number.isSafeInteger(value.order)) {
|
|
42
|
+
fail(`Graph nodes[${index}] middleware metadata is invalid.`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (value.kind === "hook") {
|
|
46
|
+
validateId(value.ownerId, `Graph nodes[${index}].ownerId`);
|
|
47
|
+
if (!(value.ownerKind === "function" || value.ownerKind === "tool")) {
|
|
48
|
+
fail(`Graph nodes[${index}].ownerKind is invalid.`);
|
|
49
|
+
}
|
|
50
|
+
if (!(value.phase === "before" || value.phase === "after")) {
|
|
51
|
+
fail(`Graph nodes[${index}].phase is invalid.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function validateGenerated(value, index, field) {
|
|
56
|
+
if (value === undefined || value === null)
|
|
57
|
+
return;
|
|
58
|
+
if (!isRecord(value))
|
|
59
|
+
fail(`Graph nodes[${index}].${field} is invalid.`);
|
|
60
|
+
for (const key of ["agentId", "listenerId", "functionId"]) {
|
|
61
|
+
if (value[key] !== undefined)
|
|
62
|
+
validateId(value[key], `Graph nodes[${index}].${field}.${key}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function validateHttpIdentities(value, index) {
|
|
66
|
+
if (!isRecord(value))
|
|
67
|
+
return;
|
|
68
|
+
for (const field of ["middleware", "transforms"]) {
|
|
69
|
+
if (!Array.isArray(value[field]))
|
|
70
|
+
continue;
|
|
71
|
+
value[field].forEach((entry, entryIndex) => {
|
|
72
|
+
if (!isRecord(entry))
|
|
73
|
+
fail(`Graph nodes[${index}].config.${field}[${entryIndex}] is invalid.`);
|
|
74
|
+
validateId(entry.id, `Graph nodes[${index}].config.${field}[${entryIndex}].id`);
|
|
75
|
+
if (field === "middleware") {
|
|
76
|
+
if (typeof entry.path !== "string" ||
|
|
77
|
+
!Number.isSafeInteger(entry.order) ||
|
|
78
|
+
(entry.match !== "always" && entry.match !== "conditional"))
|
|
79
|
+
fail(`Graph nodes[${index}].config.middleware[${entryIndex}] is invalid.`);
|
|
80
|
+
}
|
|
81
|
+
if (entry.targetFunctionId !== undefined) {
|
|
82
|
+
validateId(entry.targetFunctionId, `Graph nodes[${index}].config.${field}[${entryIndex}].targetFunctionId`);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (isRecord(value.rateLimit) && value.rateLimit.storeId !== undefined) {
|
|
87
|
+
validateId(value.rateLimit.storeId, `Graph nodes[${index}].config.rateLimit.storeId`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function validateService(value, index) {
|
|
91
|
+
if (!Array.isArray(value.members) || value.members.length === 0) {
|
|
92
|
+
fail(`Graph nodes[${index}].members must be a non-empty array.`);
|
|
93
|
+
}
|
|
94
|
+
const names = new Set();
|
|
95
|
+
value.members.forEach((member, memberIndex) => {
|
|
96
|
+
if (!isRecord(member) || !nonEmpty(member.name) || names.has(member.name)) {
|
|
97
|
+
fail(`Graph nodes[${index}].members[${memberIndex}] is invalid.`);
|
|
98
|
+
}
|
|
99
|
+
names.add(member.name);
|
|
100
|
+
validateId(member.functionId, `Graph nodes[${index}].members[${memberIndex}].functionId`);
|
|
101
|
+
});
|
|
102
|
+
if (!Array.isArray(value.middleware))
|
|
103
|
+
fail(`Graph nodes[${index}].middleware must be an array.`);
|
|
104
|
+
value.middleware.forEach((entry, middlewareIndex) => {
|
|
105
|
+
if (!isRecord(entry))
|
|
106
|
+
fail(`Graph nodes[${index}].middleware[${middlewareIndex}] is invalid.`);
|
|
107
|
+
validateId(entry.id, `Graph nodes[${index}].middleware[${middlewareIndex}].id`);
|
|
108
|
+
});
|
|
109
|
+
if (value.tags !== undefined && !textArray(value.tags))
|
|
110
|
+
fail(`Graph nodes[${index}].tags is invalid.`);
|
|
111
|
+
for (const field of ["title", "description"]) {
|
|
112
|
+
if (value[field] !== undefined && typeof value[field] !== "string") {
|
|
113
|
+
fail(`Graph nodes[${index}].${field} is invalid.`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function validateEdge(value, index) {
|
|
118
|
+
if (!isRecord(value) || !isGraphEdgeKind(value.kind)) {
|
|
119
|
+
fail(`Graph edges[${index}] has an invalid kind.`);
|
|
120
|
+
}
|
|
121
|
+
validateId(value.from, `Graph edges[${index}].from`);
|
|
122
|
+
validateId(value.to, `Graph edges[${index}].to`);
|
|
123
|
+
if (value.kind === "targets-function" && value.role !== "primary") {
|
|
124
|
+
fail(`Graph edges[${index}].role is invalid.`);
|
|
125
|
+
}
|
|
126
|
+
if (value.kind === "contains-function" && !nonEmpty(value.member)) {
|
|
127
|
+
fail(`Graph edges[${index}].member is invalid.`);
|
|
128
|
+
}
|
|
129
|
+
if ((value.kind === "contains-function" ||
|
|
130
|
+
value.kind === "uses-service-middleware" ||
|
|
131
|
+
value.kind === "uses-middleware") &&
|
|
132
|
+
(!Number.isSafeInteger(value.order) || value.order < 0)) {
|
|
133
|
+
fail(`Graph edges[${index}].order is invalid.`);
|
|
134
|
+
}
|
|
135
|
+
if (value.kind === "uses-middleware" && value.match !== "always" && value.match !== "conditional")
|
|
136
|
+
fail(`Graph edges[${index}].match is invalid.`);
|
|
137
|
+
if (value.kind === "uses-hook" && value.phase !== "before" && value.phase !== "after") {
|
|
138
|
+
fail(`Graph edges[${index}].phase is invalid.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function validateIds(value, label) {
|
|
142
|
+
if (!Array.isArray(value))
|
|
143
|
+
fail(`${label} is invalid.`);
|
|
144
|
+
value.forEach((entry, index) => validateId(entry, `${label}[${index}]`));
|
|
145
|
+
}
|
|
146
|
+
function validateId(value, label) {
|
|
147
|
+
if (!isCanonicalId(value))
|
|
148
|
+
fail(`${label} is invalid.`);
|
|
149
|
+
}
|
|
150
|
+
function isCanonicalId(value) {
|
|
151
|
+
return isStableId(value) && !value.startsWith("unbound.");
|
|
152
|
+
}
|
|
153
|
+
function nonEmpty(value) {
|
|
154
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
155
|
+
}
|
|
156
|
+
function textArray(value) {
|
|
157
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
158
|
+
}
|
|
159
|
+
function rejectUnboundIdentities(value, path = "graph", identityField = false) {
|
|
160
|
+
if (typeof value === "string") {
|
|
161
|
+
if (identityField && value.startsWith("unbound."))
|
|
162
|
+
fail(`${path} is not a canonical identity.`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (Array.isArray(value)) {
|
|
166
|
+
value.forEach((entry, index) => rejectUnboundIdentities(entry, `${path}[${index}]`, identityField));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (!isRecord(value))
|
|
170
|
+
return;
|
|
171
|
+
for (const [key, child] of Object.entries(value)) {
|
|
172
|
+
rejectUnboundIdentities(child, `${path}.${key}`, isIdentityField(key));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function isIdentityField(key) {
|
|
176
|
+
return (key === "id" || key === "from" || key === "to" || key.endsWith("Id") || key.endsWith("Ids"));
|
|
177
|
+
}
|
|
178
|
+
function isRecord(value) {
|
|
179
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
180
|
+
}
|
|
181
|
+
function fail(message) {
|
|
182
|
+
throw new TypeError(message);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=graph-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-validation.js","sourceRoot":"","sources":["../src/graph-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/hash.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const GRAPH_HASH_ALGORITHM: "sha256";
|
|
2
|
+
export declare const GRAPH_HASH_PREFIX: "sha256:";
|
|
3
|
+
export interface GraphCanonicalizationOptions {
|
|
4
|
+
readonly projectRoot?: string;
|
|
5
|
+
}
|
|
6
|
+
interface GraphShape {
|
|
7
|
+
readonly contractVersion: number;
|
|
8
|
+
readonly appId?: string;
|
|
9
|
+
readonly nodes: readonly unknown[];
|
|
10
|
+
readonly edges: readonly unknown[];
|
|
11
|
+
}
|
|
12
|
+
/** Returns a graph with portable paths, ephemeral fields removed, and sorted nodes/edges. */
|
|
13
|
+
export declare function canonicalizeGraph<T extends GraphShape>(graph: T, options?: GraphCanonicalizationOptions): T;
|
|
14
|
+
/** Serializes the canonical graph without a trailing newline. */
|
|
15
|
+
export declare function canonicalGraphJson<T extends GraphShape>(graph: T, options?: GraphCanonicalizationOptions): string;
|
|
16
|
+
/** Hashes canonical graph bytes using the single public graph hash format. */
|
|
17
|
+
export declare function hashGraph<T extends GraphShape>(graph: T, options?: GraphCanonicalizationOptions): string;
|
|
18
|
+
/** Sorts already JSON-safe graph nodes with deterministic duplicate tie-breakers. */
|
|
19
|
+
export declare function sortGraphNodes<T extends object>(nodes: readonly T[], options?: GraphCanonicalizationOptions): readonly T[];
|
|
20
|
+
/** Sorts already JSON-safe graph edges with deterministic duplicate tie-breakers. */
|
|
21
|
+
export declare function sortGraphEdges<T extends object>(edges: readonly T[], options?: GraphCanonicalizationOptions): readonly T[];
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,EAAG,QAAiB,CAAC;AACtD,eAAO,MAAM,iBAAiB,WAAsC,CAAC;AAErE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,UAAU;IAClB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;CACpC;AAID,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,UAAU,EACpD,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,4BAAiC,GACzC,CAAC,CAcH;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,UAAU,EACrD,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAER;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,CAAC,SAAS,UAAU,EAC5C,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAIR;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,GAAE,4BAAiC,GACzC,SAAS,CAAC,EAAE,CAId;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,GAAE,4BAAiC,GACzC,SAAS,CAAC,EAAE,CAId"}
|
package/dist/hash.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { canonicalJson, normalizeSourceLocation } from "@relkit/contracts";
|
|
3
|
+
export const GRAPH_HASH_ALGORITHM = "sha256";
|
|
4
|
+
export const GRAPH_HASH_PREFIX = `${GRAPH_HASH_ALGORITHM}:`;
|
|
5
|
+
/** Returns a graph with portable paths, ephemeral fields removed, and sorted nodes/edges. */
|
|
6
|
+
export function canonicalizeGraph(graph, options = {}) {
|
|
7
|
+
const normalized = canonicalizeValue(graph, options, "graph");
|
|
8
|
+
if (!isRecord(normalized) ||
|
|
9
|
+
!Array.isArray(normalized.nodes) ||
|
|
10
|
+
!Array.isArray(normalized.edges)) {
|
|
11
|
+
throw new TypeError("A graph must contain nodes and edges arrays.");
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
...normalized,
|
|
15
|
+
nodes: sortJsonNodes(normalized.nodes),
|
|
16
|
+
edges: sortJsonEdges(normalized.edges),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Serializes the canonical graph without a trailing newline. */
|
|
20
|
+
export function canonicalGraphJson(graph, options = {}) {
|
|
21
|
+
return canonicalJson(canonicalizeGraph(graph, options));
|
|
22
|
+
}
|
|
23
|
+
/** Hashes canonical graph bytes using the single public graph hash format. */
|
|
24
|
+
export function hashGraph(graph, options = {}) {
|
|
25
|
+
return `${GRAPH_HASH_PREFIX}${createHash(GRAPH_HASH_ALGORITHM)
|
|
26
|
+
.update(canonicalGraphJson(graph, options), "utf8")
|
|
27
|
+
.digest("hex")}`;
|
|
28
|
+
}
|
|
29
|
+
/** Sorts already JSON-safe graph nodes with deterministic duplicate tie-breakers. */
|
|
30
|
+
export function sortGraphNodes(nodes, options = {}) {
|
|
31
|
+
return sortJsonNodes(nodes.map((node) => canonicalizeValue(node, options, "node")));
|
|
32
|
+
}
|
|
33
|
+
/** Sorts already JSON-safe graph edges with deterministic duplicate tie-breakers. */
|
|
34
|
+
export function sortGraphEdges(edges, options = {}) {
|
|
35
|
+
return sortJsonEdges(edges.map((edge) => canonicalizeValue(edge, options, "edge")));
|
|
36
|
+
}
|
|
37
|
+
function canonicalizeValue(value, options, context) {
|
|
38
|
+
if (Array.isArray(value))
|
|
39
|
+
return value.map((entry) => canonicalizeValue(entry, options, context));
|
|
40
|
+
if (!isRecord(value))
|
|
41
|
+
return value;
|
|
42
|
+
if (!isPlainObject(value))
|
|
43
|
+
throw new TypeError("Graph values must be plain JSON objects.");
|
|
44
|
+
const result = {};
|
|
45
|
+
for (const key of Object.keys(value)) {
|
|
46
|
+
if (context !== "data" && isEphemeralKey(key))
|
|
47
|
+
continue;
|
|
48
|
+
const child = value[key];
|
|
49
|
+
if (key === "source" && isSourceLocation(child)) {
|
|
50
|
+
const source = normalizeSourceLocation(child, options.projectRoot);
|
|
51
|
+
result[key] = { file: source.file, line: source.line, column: source.column };
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
result[key] = canonicalizeValue(child, options, childContext(context, key));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
function sortJsonNodes(nodes) {
|
|
60
|
+
return [...nodes].sort((left, right) => compareGraphValues(left, right, "node"));
|
|
61
|
+
}
|
|
62
|
+
function sortJsonEdges(edges) {
|
|
63
|
+
return [...edges].sort((left, right) => compareGraphValues(left, right, "edge"));
|
|
64
|
+
}
|
|
65
|
+
function compareGraphValues(left, right, kind) {
|
|
66
|
+
const a = isRecord(left) ? left : {};
|
|
67
|
+
const b = isRecord(right) ? right : {};
|
|
68
|
+
if (kind === "edge" && isOrderedServiceEdge(a) && isOrderedServiceEdge(b)) {
|
|
69
|
+
const order = numberValue(a.order) - numberValue(b.order);
|
|
70
|
+
if (order !== 0)
|
|
71
|
+
return order;
|
|
72
|
+
}
|
|
73
|
+
const fields = kind === "node" ? ["kind", "id"] : ["kind", "from", "to", "role"];
|
|
74
|
+
for (const field of fields) {
|
|
75
|
+
const compared = compareStrings(text(a[field]), text(b[field]));
|
|
76
|
+
if (compared !== 0)
|
|
77
|
+
return compared;
|
|
78
|
+
}
|
|
79
|
+
return compareStrings(canonicalJson(left), canonicalJson(right));
|
|
80
|
+
}
|
|
81
|
+
function isOrderedServiceEdge(value) {
|
|
82
|
+
return value.kind === "contains-function" || value.kind === "uses-service-middleware";
|
|
83
|
+
}
|
|
84
|
+
function numberValue(value) {
|
|
85
|
+
return typeof value === "number" ? value : Number.MAX_SAFE_INTEGER;
|
|
86
|
+
}
|
|
87
|
+
function isSourceLocation(value) {
|
|
88
|
+
return (isRecord(value) &&
|
|
89
|
+
typeof value.file === "string" &&
|
|
90
|
+
Number.isInteger(value.line) &&
|
|
91
|
+
Number.isInteger(value.column));
|
|
92
|
+
}
|
|
93
|
+
function isEphemeralKey(key) {
|
|
94
|
+
const normalized = key.replaceAll("_", "").replaceAll("-", "").toLowerCase();
|
|
95
|
+
return (normalized === "time" ||
|
|
96
|
+
normalized === "timems" ||
|
|
97
|
+
normalized === "timens" ||
|
|
98
|
+
normalized === "timestamp" ||
|
|
99
|
+
normalized === "timestamps" ||
|
|
100
|
+
normalized === "createdat" ||
|
|
101
|
+
normalized === "updatedat" ||
|
|
102
|
+
normalized === "generatedat" ||
|
|
103
|
+
normalized === "startedat" ||
|
|
104
|
+
normalized === "finishedat" ||
|
|
105
|
+
normalized === "completedat" ||
|
|
106
|
+
normalized === "duration" ||
|
|
107
|
+
normalized === "durationms" ||
|
|
108
|
+
normalized === "elapsedms" ||
|
|
109
|
+
normalized === "pid" ||
|
|
110
|
+
normalized === "processid" ||
|
|
111
|
+
normalized === "processpid" ||
|
|
112
|
+
normalized === "random" ||
|
|
113
|
+
normalized.startsWith("randomid") ||
|
|
114
|
+
normalized.startsWith("randomseed") ||
|
|
115
|
+
normalized === "nonce" ||
|
|
116
|
+
normalized === "generation" ||
|
|
117
|
+
normalized.startsWith("generationid") ||
|
|
118
|
+
normalized.startsWith("generationtoken"));
|
|
119
|
+
}
|
|
120
|
+
function isRecord(value) {
|
|
121
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
122
|
+
}
|
|
123
|
+
function isPlainObject(value) {
|
|
124
|
+
const prototype = Object.getPrototypeOf(value);
|
|
125
|
+
return prototype === null || prototype === Object.prototype;
|
|
126
|
+
}
|
|
127
|
+
function childContext(context, key) {
|
|
128
|
+
if (key === "metadata" || key === "lifecycle" || key === "runtime")
|
|
129
|
+
return "metadata";
|
|
130
|
+
if (context === "graph" && key === "nodes")
|
|
131
|
+
return "node";
|
|
132
|
+
if (context === "graph" && key === "edges")
|
|
133
|
+
return "edge";
|
|
134
|
+
return "data";
|
|
135
|
+
}
|
|
136
|
+
function text(value) {
|
|
137
|
+
return typeof value === "string" ? value : "";
|
|
138
|
+
}
|
|
139
|
+
function compareStrings(left, right) {
|
|
140
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./model.js";
|
|
2
|
+
export * from "./graph-types.js";
|
|
3
|
+
export * from "./foundation-nodes.js";
|
|
4
|
+
export * from "./service-nodes.js";
|
|
5
|
+
export * from "./hash.js";
|
|
6
|
+
export * from "./graph-validation.js";
|
|
7
|
+
export * from "./registration-plan.js";
|
|
8
|
+
export * from "./production.js";
|
|
9
|
+
export * from "./diff-types.js";
|
|
10
|
+
export * from "./diff.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./model.js";
|
|
2
|
+
export * from "./graph-types.js";
|
|
3
|
+
export * from "./foundation-nodes.js";
|
|
4
|
+
export * from "./service-nodes.js";
|
|
5
|
+
export * from "./hash.js";
|
|
6
|
+
export * from "./graph-validation.js";
|
|
7
|
+
export * from "./registration-plan.js";
|
|
8
|
+
export * from "./production.js";
|
|
9
|
+
export * from "./diff-types.js";
|
|
10
|
+
export * from "./diff.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { JsonValue, SourceLocation } from "@relkit/contracts";
|
|
2
|
+
import type { AppNode, EnvironmentVariableNode, GeneratedAgentMarker, GeneratedFunctionMarker } from "./foundation-nodes.js";
|
|
3
|
+
import type { ServiceNode } from "./service-nodes.js";
|
|
4
|
+
export declare const GRAPH_NODE_KINDS: readonly ["app", "env", "function", "trigger", "job", "event", "bucket", "cache", "tool", "agent", "provider", "service", "middleware", "hook"];
|
|
5
|
+
export type GraphNodeKind = (typeof GRAPH_NODE_KINDS)[number];
|
|
6
|
+
export type GraphTriggerType = "http" | "queue" | "schedule" | "event";
|
|
7
|
+
export interface GraphNodeBase<Kind extends GraphNodeKind = GraphNodeKind> {
|
|
8
|
+
readonly kind: Kind;
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly source: SourceLocation;
|
|
11
|
+
}
|
|
12
|
+
export interface FunctionNode extends GraphNodeBase<"function"> {
|
|
13
|
+
readonly input: JsonValue;
|
|
14
|
+
readonly output: JsonValue;
|
|
15
|
+
readonly errors?: JsonValue;
|
|
16
|
+
readonly dependencies?: JsonValue;
|
|
17
|
+
readonly timeoutMs?: number;
|
|
18
|
+
readonly concurrency?: number;
|
|
19
|
+
readonly generated?: GeneratedFunctionMarker;
|
|
20
|
+
}
|
|
21
|
+
export type { AppNode, EnvironmentVariableNode } from "./foundation-nodes.js";
|
|
22
|
+
export interface MiddlewareRouteRef {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly order: number;
|
|
26
|
+
readonly match: "always" | "conditional";
|
|
27
|
+
}
|
|
28
|
+
export interface TransformProjection {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly schema: JsonValue;
|
|
31
|
+
}
|
|
32
|
+
export interface HttpTriggerConfig {
|
|
33
|
+
readonly method: string;
|
|
34
|
+
readonly path: string;
|
|
35
|
+
readonly rawHandler?: boolean;
|
|
36
|
+
readonly title?: string;
|
|
37
|
+
readonly description?: string;
|
|
38
|
+
readonly tags?: readonly string[];
|
|
39
|
+
readonly runtimePaths?: readonly string[];
|
|
40
|
+
readonly request: JsonValue;
|
|
41
|
+
readonly responses: JsonValue;
|
|
42
|
+
readonly middleware: readonly MiddlewareRouteRef[];
|
|
43
|
+
readonly transforms: readonly TransformProjection[];
|
|
44
|
+
readonly rateLimit?: {
|
|
45
|
+
readonly limit: number;
|
|
46
|
+
readonly windowMs: number;
|
|
47
|
+
readonly key: JsonValue;
|
|
48
|
+
readonly storeId?: string;
|
|
49
|
+
};
|
|
50
|
+
readonly maxBodyBytes?: number;
|
|
51
|
+
readonly timeoutMs?: number;
|
|
52
|
+
}
|
|
53
|
+
export type SelectorExpansion = `${string}@${number}`;
|
|
54
|
+
export interface EventTriggerConfig {
|
|
55
|
+
readonly selector: JsonValue;
|
|
56
|
+
readonly expansion: readonly SelectorExpansion[];
|
|
57
|
+
readonly delivery: "ephemeral" | "durable";
|
|
58
|
+
readonly profile?: string;
|
|
59
|
+
readonly retry?: JsonValue;
|
|
60
|
+
readonly concurrency?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface TriggerNode<Trigger extends GraphTriggerType = GraphTriggerType, Config = JsonValue> extends GraphNodeBase<"trigger"> {
|
|
63
|
+
readonly triggerType: Trigger;
|
|
64
|
+
readonly targetFunctionId: string;
|
|
65
|
+
readonly config: Config;
|
|
66
|
+
}
|
|
67
|
+
export interface JobNode extends GraphNodeBase<"job"> {
|
|
68
|
+
readonly input: JsonValue;
|
|
69
|
+
readonly targetFunctionId: string;
|
|
70
|
+
readonly profile: string;
|
|
71
|
+
readonly retry?: JsonValue;
|
|
72
|
+
readonly timeoutMs?: number;
|
|
73
|
+
readonly concurrency?: number;
|
|
74
|
+
readonly schedule?: JsonValue;
|
|
75
|
+
readonly idempotency?: JsonValue;
|
|
76
|
+
}
|
|
77
|
+
export interface EventNode extends GraphNodeBase<"event"> {
|
|
78
|
+
readonly version: number;
|
|
79
|
+
readonly payload: JsonValue;
|
|
80
|
+
readonly sensitiveFields?: readonly string[];
|
|
81
|
+
readonly profile: string;
|
|
82
|
+
}
|
|
83
|
+
export interface BucketNode extends GraphNodeBase<"bucket"> {
|
|
84
|
+
readonly profile: string;
|
|
85
|
+
readonly visibility: "private" | "public";
|
|
86
|
+
readonly maxObjectBytes?: number;
|
|
87
|
+
readonly allowedContentTypes?: readonly string[];
|
|
88
|
+
}
|
|
89
|
+
export interface CacheNode extends GraphNodeBase<"cache"> {
|
|
90
|
+
readonly key: JsonValue;
|
|
91
|
+
readonly value: JsonValue;
|
|
92
|
+
readonly profile: string;
|
|
93
|
+
readonly defaultTtlMs?: number;
|
|
94
|
+
readonly maxTtlMs?: number;
|
|
95
|
+
}
|
|
96
|
+
export interface ToolNode extends GraphNodeBase<"tool"> {
|
|
97
|
+
readonly targetFunctionId: string;
|
|
98
|
+
readonly description: string;
|
|
99
|
+
readonly sideEffect: "none" | "read" | "write" | "external";
|
|
100
|
+
readonly approval: "never" | "on-write" | "always";
|
|
101
|
+
readonly timeoutMs?: number;
|
|
102
|
+
readonly mcp: boolean;
|
|
103
|
+
}
|
|
104
|
+
export interface MiddlewareNode extends GraphNodeBase<"middleware"> {
|
|
105
|
+
readonly path: string;
|
|
106
|
+
readonly order: number;
|
|
107
|
+
}
|
|
108
|
+
export interface HookNode extends GraphNodeBase<"hook"> {
|
|
109
|
+
readonly ownerId: string;
|
|
110
|
+
readonly ownerKind: "function" | "tool";
|
|
111
|
+
readonly phase: "before" | "after";
|
|
112
|
+
}
|
|
113
|
+
export interface AgentNode extends GraphNodeBase<"agent"> {
|
|
114
|
+
readonly input: JsonValue;
|
|
115
|
+
readonly output: JsonValue;
|
|
116
|
+
readonly model?: string;
|
|
117
|
+
readonly instructions: JsonValue;
|
|
118
|
+
readonly toolIds: readonly string[];
|
|
119
|
+
readonly limits: JsonValue;
|
|
120
|
+
readonly generatedFunction: GeneratedAgentMarker;
|
|
121
|
+
readonly profile: string;
|
|
122
|
+
}
|
|
123
|
+
export interface ProviderProfileNode extends GraphNodeBase<"provider"> {
|
|
124
|
+
readonly profile: string;
|
|
125
|
+
readonly capability: string;
|
|
126
|
+
readonly adapter: string;
|
|
127
|
+
readonly ownership: "external" | "managed";
|
|
128
|
+
readonly configuration: JsonValue;
|
|
129
|
+
readonly environment: readonly {
|
|
130
|
+
readonly name: string;
|
|
131
|
+
readonly type: string;
|
|
132
|
+
readonly sensitive: boolean;
|
|
133
|
+
}[];
|
|
134
|
+
}
|
|
135
|
+
export type GraphNode = AppNode | EnvironmentVariableNode | FunctionNode | TriggerNode | JobNode | EventNode | BucketNode | CacheNode | ToolNode | AgentNode | ProviderProfileNode | ServiceNode | MiddlewareNode | HookNode;
|
|
136
|
+
export { GRAPH_EDGE_KINDS, isGraphEdgeKind, type GraphEdge, type GraphEdgeBase, type GraphEdgeKind, type TargetsFunctionEdge, type UsesHookEdge, type UsesMiddlewareEdge, } from "./graph-edges.js";
|
|
137
|
+
export type TargetFunctionRole = "primary";
|
|
138
|
+
export type { ApplicationGraph, Graph, ObservedEdge } from "./graph-types.js";
|
|
139
|
+
export declare function isGraphNodeKind(value: unknown): value is GraphNodeKind;
|
|
140
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/model.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const GRAPH_NODE_KINDS = [
|
|
2
|
+
"app",
|
|
3
|
+
"env",
|
|
4
|
+
"function",
|
|
5
|
+
"trigger",
|
|
6
|
+
"job",
|
|
7
|
+
"event",
|
|
8
|
+
"bucket",
|
|
9
|
+
"cache",
|
|
10
|
+
"tool",
|
|
11
|
+
"agent",
|
|
12
|
+
"provider",
|
|
13
|
+
"service",
|
|
14
|
+
"middleware",
|
|
15
|
+
"hook",
|
|
16
|
+
];
|
|
17
|
+
export { GRAPH_EDGE_KINDS, isGraphEdgeKind, } from "./graph-edges.js";
|
|
18
|
+
export function isGraphNodeKind(value) {
|
|
19
|
+
return typeof value === "string" && GRAPH_NODE_KINDS.includes(value);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK;IACL,KAAK;IACL,UAAU;IACV,SAAS;IACT,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,UAAU;IACV,SAAS;IACT,YAAY;IACZ,MAAM;CACE,CAAC;AAqJX,OAAO,EACL,gBAAgB,EAChB,eAAe,GAOhB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production.d.ts","sourceRoot":"","sources":["../src/production.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AAEtE,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAYnE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Rejects development-only runtime fallbacks before production activation. */
|
|
2
|
+
export function assertProductionGraph(graph) {
|
|
3
|
+
for (const node of graph.nodes) {
|
|
4
|
+
if (node.kind !== "trigger" || node.triggerType !== "http")
|
|
5
|
+
continue;
|
|
6
|
+
const config = node.config;
|
|
7
|
+
if (config.rateLimit !== undefined &&
|
|
8
|
+
config.rateLimit !== null &&
|
|
9
|
+
config.rateLimit.storeId === undefined) {
|
|
10
|
+
throw new Error(`Route "${node.id}" requires a shared rate-limit cache store in production.`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=production.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"production.js","sourceRoot":"","sources":["../src/production.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,KAAuB;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM;YAAE,SAAS;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAsC,CAAC;QAC3D,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;YAC9B,MAAM,CAAC,SAAS,KAAK,IAAI;YACzB,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,2DAA2D,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-validation.d.ts","sourceRoot":"","sources":["../src/provider-validation.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,KAAK,GAC/B,IAAI,CAqBN"}
|