@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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/diff-types.d.ts +31 -0
  4. package/dist/diff-types.d.ts.map +1 -0
  5. package/dist/diff-types.js +7 -0
  6. package/dist/diff-types.js.map +1 -0
  7. package/dist/diff-utils.d.ts +11 -0
  8. package/dist/diff-utils.d.ts.map +1 -0
  9. package/dist/diff-utils.js +167 -0
  10. package/dist/diff-utils.js.map +1 -0
  11. package/dist/diff.d.ts +8 -0
  12. package/dist/diff.d.ts.map +1 -0
  13. package/dist/diff.js +103 -0
  14. package/dist/diff.js.map +1 -0
  15. package/dist/foundation-nodes.d.ts +30 -0
  16. package/dist/foundation-nodes.d.ts.map +1 -0
  17. package/dist/foundation-nodes.js +2 -0
  18. package/dist/foundation-nodes.js.map +1 -0
  19. package/dist/graph-edges.d.ts +21 -0
  20. package/dist/graph-edges.d.ts.map +1 -0
  21. package/dist/graph-edges.js +21 -0
  22. package/dist/graph-edges.js.map +1 -0
  23. package/dist/graph-types.d.ts +15 -0
  24. package/dist/graph-types.d.ts.map +1 -0
  25. package/dist/graph-types.js +2 -0
  26. package/dist/graph-types.js.map +1 -0
  27. package/dist/graph-validation.d.ts +2 -0
  28. package/dist/graph-validation.d.ts.map +1 -0
  29. package/dist/graph-validation.js +184 -0
  30. package/dist/graph-validation.js.map +1 -0
  31. package/dist/hash.d.ts +23 -0
  32. package/dist/hash.d.ts.map +1 -0
  33. package/dist/hash.js +142 -0
  34. package/dist/hash.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +11 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/model.d.ts +140 -0
  40. package/dist/model.d.ts.map +1 -0
  41. package/dist/model.js +21 -0
  42. package/dist/model.js.map +1 -0
  43. package/dist/production.d.ts +4 -0
  44. package/dist/production.d.ts.map +1 -0
  45. package/dist/production.js +14 -0
  46. package/dist/production.js.map +1 -0
  47. package/dist/provider-validation.d.ts +2 -0
  48. package/dist/provider-validation.d.ts.map +1 -0
  49. package/dist/provider-validation.js +25 -0
  50. package/dist/provider-validation.js.map +1 -0
  51. package/dist/registration-plan.d.ts +49 -0
  52. package/dist/registration-plan.d.ts.map +1 -0
  53. package/dist/registration-plan.js +117 -0
  54. package/dist/registration-plan.js.map +1 -0
  55. package/dist/service-nodes.d.ts +32 -0
  56. package/dist/service-nodes.d.ts.map +1 -0
  57. package/dist/service-nodes.js +2 -0
  58. package/dist/service-nodes.js.map +1 -0
  59. package/package.json +39 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @relkit/graph
2
+
3
+ Unsupported internal RELKIT graph model; use @relkit/app.
4
+
5
+ See [@relkit/app](https://github.com/rel-kit/relkit) for supported application APIs.
@@ -0,0 +1,31 @@
1
+ import type { JsonValue, SourceLocation } from "@relkit/contracts";
2
+ export declare const GRAPH_DIFF_CLASSIFICATIONS: readonly ["informational", "compatible", "potentially-breaking", "breaking"];
3
+ export type GraphDiffClassification = (typeof GRAPH_DIFF_CLASSIFICATIONS)[number];
4
+ export type GraphDiffCategory = "route" | "function/error" | "event/selector" | "job" | "bucket/cache" | "tool" | "agent" | "profile" | "service";
5
+ export type GraphDiffChange = "added" | "removed" | "changed" | "source-moved";
6
+ export interface SelectorExpansionDiff {
7
+ readonly added: readonly string[];
8
+ readonly removed: readonly string[];
9
+ }
10
+ export interface GraphChange {
11
+ readonly category: GraphDiffCategory;
12
+ readonly kind: string;
13
+ readonly id: string;
14
+ readonly change: GraphDiffChange;
15
+ readonly classification: GraphDiffClassification;
16
+ readonly fields: readonly string[];
17
+ readonly details: readonly string[];
18
+ readonly source?: {
19
+ readonly before: SourceLocation;
20
+ readonly after: SourceLocation;
21
+ };
22
+ readonly selectorExpansion?: SelectorExpansionDiff;
23
+ readonly before?: JsonValue;
24
+ readonly after?: JsonValue;
25
+ }
26
+ export interface GraphDiff {
27
+ readonly changes: readonly GraphChange[];
28
+ readonly hasBreakingChanges: boolean;
29
+ readonly highestClassification: GraphDiffClassification | undefined;
30
+ }
31
+ //# sourceMappingURL=diff-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-types.d.ts","sourceRoot":"","sources":["../src/diff-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE,eAAO,MAAM,0BAA0B,8EAK7B,CAAC;AACX,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,iBAAiB,GACzB,OAAO,GACP,gBAAgB,GAChB,gBAAgB,GAChB,KAAK,GACL,cAAc,GACd,MAAM,GACN,OAAO,GACP,SAAS,GACT,SAAS,CAAC;AACd,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;AAE/E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,uBAAuB,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;KAAE,CAAC;IACtF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,qBAAqB,EAAE,uBAAuB,GAAG,SAAS,CAAC;CACrE"}
@@ -0,0 +1,7 @@
1
+ export const GRAPH_DIFF_CLASSIFICATIONS = [
2
+ "informational",
3
+ "compatible",
4
+ "potentially-breaking",
5
+ "breaking",
6
+ ];
7
+ //# sourceMappingURL=diff-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-types.js","sourceRoot":"","sources":["../src/diff-types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,eAAe;IACf,YAAY;IACZ,sBAAsB;IACtB,UAAU;CACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type JsonValue } from "@relkit/contracts";
2
+ import type { GraphNode } from "./model.js";
3
+ import type { GraphDiffCategory, GraphDiffChange, GraphDiffClassification, SelectorExpansionDiff } from "./diff-types.js";
4
+ export declare function nodeKey(node: GraphNode): string;
5
+ export declare function categoryFor(node: GraphNode): GraphDiffCategory | undefined;
6
+ export declare function contractValue(node: GraphNode): JsonValue;
7
+ export declare function changedFields(before: JsonValue, after: JsonValue): readonly string[];
8
+ export declare function selectorExpansionDiff(before: GraphNode, after: GraphNode): SelectorExpansionDiff;
9
+ export declare function hasExpansionChange(value: SelectorExpansionDiff): boolean;
10
+ export declare function classifyChange(category: GraphDiffCategory, change: GraphDiffChange, fields: readonly string[], before: GraphNode | undefined, after: GraphNode | undefined, expansion: SelectorExpansionDiff | undefined): GraphDiffClassification;
11
+ //# sourceMappingURL=diff-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-utils.d.ts","sourceRoot":"","sources":["../src/diff-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAe1E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAMxD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,MAAM,EAAE,CAIpF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,qBAAqB,CAOhG;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAExE;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,SAAS,EAAE,qBAAqB,GAAG,SAAS,GAC3C,uBAAuB,CAazB"}
@@ -0,0 +1,167 @@
1
+ import { canonicalJson } from "@relkit/contracts";
2
+ export function nodeKey(node) {
3
+ return `${categoryFor(node)}\0${node.id}`;
4
+ }
5
+ export function categoryFor(node) {
6
+ if (node.kind === "trigger") {
7
+ if (node.triggerType === "http")
8
+ return "route";
9
+ if (node.triggerType === "event")
10
+ return "event/selector";
11
+ return "job";
12
+ }
13
+ if (node.kind === "function")
14
+ return "function/error";
15
+ if (node.kind === "event")
16
+ return "event/selector";
17
+ if (node.kind === "job")
18
+ return "job";
19
+ if (node.kind === "bucket" || node.kind === "cache")
20
+ return "bucket/cache";
21
+ if (node.kind === "tool")
22
+ return "tool";
23
+ if (node.kind === "agent")
24
+ return "agent";
25
+ if (node.kind === "provider")
26
+ return "profile";
27
+ if (node.kind === "service")
28
+ return "service";
29
+ return undefined;
30
+ }
31
+ export function contractValue(node) {
32
+ if (node.kind !== "trigger" || node.triggerType !== "event" || !isRecord(node.config)) {
33
+ return withoutSource(node);
34
+ }
35
+ const { expansion: _expansion, ...config } = node.config;
36
+ return withoutSource({ ...node, config });
37
+ }
38
+ export function changedFields(before, after) {
39
+ if (!isRecord(before) || !isRecord(after))
40
+ return ["value"];
41
+ const keys = new Set([...Object.keys(before), ...Object.keys(after)]);
42
+ return [...keys].filter((key) => !same(before[key], after[key])).sort();
43
+ }
44
+ export function selectorExpansionDiff(before, after) {
45
+ const left = expansion(before);
46
+ const right = expansion(after);
47
+ return {
48
+ added: right.filter((value) => !left.includes(value)),
49
+ removed: left.filter((value) => !right.includes(value)),
50
+ };
51
+ }
52
+ export function hasExpansionChange(value) {
53
+ return value.added.length > 0 || value.removed.length > 0;
54
+ }
55
+ export function classifyChange(category, change, fields, before, after, expansion) {
56
+ if (change === "source-moved")
57
+ return "informational";
58
+ if (change === "added")
59
+ return "compatible";
60
+ if (change === "removed")
61
+ return "breaking";
62
+ if (category === "route")
63
+ return "breaking";
64
+ if (category === "function/error")
65
+ return classifyFunction(fields, before, after);
66
+ if (category === "event/selector")
67
+ return classifyEvent(fields, expansion);
68
+ if (category === "job")
69
+ return classifyJob(fields);
70
+ if (category === "bucket/cache")
71
+ return classifyResource(fields, before, after);
72
+ if (category === "tool")
73
+ return classifyTool(fields);
74
+ if (category === "agent")
75
+ return classifyAgent(fields);
76
+ if (category === "service")
77
+ return classifyService(fields);
78
+ return fields.length === 0 ? "informational" : "potentially-breaking";
79
+ }
80
+ function classifyFunction(fields, before, after) {
81
+ if (fields.includes("output") || fields.includes("errors"))
82
+ return "breaking";
83
+ if (fields.includes("input"))
84
+ return inputSchemaClass(before, after);
85
+ return fields.length === 0 ? "informational" : "potentially-breaking";
86
+ }
87
+ function classifyEvent(fields, expansion) {
88
+ if (expansion?.removed.length)
89
+ return "breaking";
90
+ if (expansion?.added.length)
91
+ return "potentially-breaking";
92
+ return fields.length === 0 ? "informational" : "breaking";
93
+ }
94
+ function classifyJob(fields) {
95
+ if (fields.some((field) => ["input", "targetFunctionId", "idempotency"].includes(field)))
96
+ return "breaking";
97
+ return fields.length === 0 ? "informational" : "potentially-breaking";
98
+ }
99
+ function classifyResource(fields, before, after) {
100
+ if (fields.some((field) => ["key", "value", "visibility"].includes(field)))
101
+ return "breaking";
102
+ if (fields.includes("profile"))
103
+ return "potentially-breaking";
104
+ if (before?.kind === "cache" && after?.kind === "cache" && fields.length > 0)
105
+ return "breaking";
106
+ return fields.length === 0 ? "informational" : "potentially-breaking";
107
+ }
108
+ function classifyTool(fields) {
109
+ if (fields.includes("targetFunctionId"))
110
+ return "breaking";
111
+ if (fields.some((field) => ["sideEffect", "approval", "timeoutMs"].includes(field)))
112
+ return "potentially-breaking";
113
+ return fields.length === 0 ? "informational" : "compatible";
114
+ }
115
+ function classifyAgent(fields) {
116
+ if (fields.some((field) => ["input", "output"].includes(field)))
117
+ return "breaking";
118
+ return fields.length === 0 ? "informational" : "potentially-breaking";
119
+ }
120
+ function classifyService(fields) {
121
+ if (fields.includes("members"))
122
+ return "breaking";
123
+ if (fields.includes("middleware"))
124
+ return "potentially-breaking";
125
+ return fields.length === 0 ? "informational" : "compatible";
126
+ }
127
+ function inputSchemaClass(before, after) {
128
+ if (before?.kind !== "function" || after?.kind !== "function")
129
+ return "potentially-breaking";
130
+ const left = objectSchema(before.input);
131
+ const right = objectSchema(after.input);
132
+ if (!left || !right)
133
+ return "potentially-breaking";
134
+ const addedRequired = right.required.some((field) => !left.required.includes(field));
135
+ return addedRequired ? "breaking" : "potentially-breaking";
136
+ }
137
+ function objectSchema(value) {
138
+ if (!isRecord(value) || value.type !== "object")
139
+ return undefined;
140
+ const required = Array.isArray(value.required)
141
+ ? value.required.filter((entry) => typeof entry === "string")
142
+ : [];
143
+ return { required };
144
+ }
145
+ function expansion(node) {
146
+ if (node.kind !== "trigger" || node.triggerType !== "event" || !isRecord(node.config))
147
+ return [];
148
+ return Array.isArray(node.config.expansion)
149
+ ? node.config.expansion.filter((entry) => typeof entry === "string").sort()
150
+ : [];
151
+ }
152
+ function withoutSource(node) {
153
+ const { source: _source, ...value } = node;
154
+ return value;
155
+ }
156
+ function same(left, right) {
157
+ try {
158
+ return canonicalJson(left) === canonicalJson(right);
159
+ }
160
+ catch {
161
+ return Object.is(left, right);
162
+ }
163
+ }
164
+ function isRecord(value) {
165
+ return value !== null && typeof value === "object" && !Array.isArray(value);
166
+ }
167
+ //# sourceMappingURL=diff-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-utils.js","sourceRoot":"","sources":["../src/diff-utils.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { type GraphCanonicalizationOptions } from "./hash.js";
2
+ import type { ApplicationGraph } from "./model.js";
3
+ import type { GraphDiff } from "./diff-types.js";
4
+ /** Compares canonical graph contracts while ignoring source-only identity moves. */
5
+ export declare function diffGraph(before: ApplicationGraph, after: ApplicationGraph, options?: GraphCanonicalizationOptions): GraphDiff;
6
+ /** Alias matching command-style callers that compare two graph documents. */
7
+ export declare const diffGraphs: typeof diffGraph;
8
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,YAAY,CAAC;AAU9D,OAAO,KAAK,EAEV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AAEzB,oFAAoF;AACpF,wBAAgB,SAAS,CACvB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,4BAAiC,GACzC,SAAS,CAaX;AAED,6EAA6E;AAC7E,eAAO,MAAM,UAAU,kBAAY,CAAC"}
package/dist/diff.js ADDED
@@ -0,0 +1,103 @@
1
+ import { canonicalJson } from "@relkit/contracts";
2
+ import { canonicalizeGraph } from "./hash.js";
3
+ import { categoryFor, changedFields, classifyChange, contractValue, hasExpansionChange, nodeKey, selectorExpansionDiff, } from "./diff-utils.js";
4
+ /** Compares canonical graph contracts while ignoring source-only identity moves. */
5
+ export function diffGraph(before, after, options = {}) {
6
+ const left = canonicalizeGraph(before, options);
7
+ const right = canonicalizeGraph(after, options);
8
+ const beforeNodes = nodesByKey(left.nodes);
9
+ const afterNodes = nodesByKey(right.nodes);
10
+ const keys = [...new Set([...beforeNodes.keys(), ...afterNodes.keys()])].sort();
11
+ const changes = keys.flatMap((key) => makeChanges(beforeNodes.get(key), afterNodes.get(key)));
12
+ const ordered = changes.sort(compareChanges);
13
+ return Object.freeze({
14
+ changes: Object.freeze(ordered),
15
+ hasBreakingChanges: ordered.some((change) => change.classification === "breaking"),
16
+ highestClassification: highest(ordered),
17
+ });
18
+ }
19
+ /** Alias matching command-style callers that compare two graph documents. */
20
+ export const diffGraphs = diffGraph;
21
+ function nodesByKey(nodes) {
22
+ return new Map(nodes.flatMap((node) => (categoryFor(node) === undefined ? [] : [[nodeKey(node), node]])));
23
+ }
24
+ function makeChanges(left, right) {
25
+ const node = right ?? left;
26
+ const category = node === undefined ? undefined : categoryFor(node);
27
+ if (node === undefined || category === undefined)
28
+ return [];
29
+ if (left === undefined)
30
+ return [entry(category, right, "added", [], undefined, right)];
31
+ if (right === undefined)
32
+ return [entry(category, left, "removed", [], left, undefined)];
33
+ const expansion = selectorExpansionDiff(left, right);
34
+ const expansionChanged = category === "event/selector" && hasExpansionChange(expansion);
35
+ const fields = changedFields(contractValue(left), contractValue(right));
36
+ const allFields = expansionChanged ? [...new Set([...fields, "selector.expansion"])] : fields;
37
+ if (allFields.length === 0) {
38
+ if (canonicalJson(left.source) === canonicalJson(right.source))
39
+ return [];
40
+ return [entry(category, right, "source-moved", ["source"], left, right)];
41
+ }
42
+ return [
43
+ entry(category, right, "changed", allFields, left, right, expansionChanged ? expansion : undefined),
44
+ ];
45
+ }
46
+ function entry(category, node, change, fields, before, after, selectorExpansion) {
47
+ const source = before && after && !sameSource(before, after)
48
+ ? { before: before.source, after: after.source }
49
+ : undefined;
50
+ const result = {
51
+ category,
52
+ kind: node.kind,
53
+ id: node.id,
54
+ change,
55
+ classification: classifyChange(category, change, fields, before, after, selectorExpansion),
56
+ fields: [...fields].sort(),
57
+ details: details(change, fields, selectorExpansion),
58
+ ...(source === undefined ? {} : { source }),
59
+ ...(selectorExpansion === undefined ? {} : { selectorExpansion }),
60
+ ...(before === undefined ? {} : { before: before }),
61
+ ...(after === undefined ? {} : { after: after }),
62
+ };
63
+ return result;
64
+ }
65
+ function details(change, fields, expansion) {
66
+ const values = [...fields];
67
+ if (change === "added")
68
+ values.push("added");
69
+ if (change === "removed")
70
+ values.push("removed");
71
+ if (change === "source-moved")
72
+ values.push("source moved");
73
+ if (expansion !== undefined) {
74
+ values.push(...expansion.added.map((value) => `selector added ${value}`));
75
+ values.push(...expansion.removed.map((value) => `selector removed ${value}`));
76
+ }
77
+ return [...new Set(values)].sort();
78
+ }
79
+ function sameSource(left, right) {
80
+ return canonicalJson(left.source) === canonicalJson(right.source);
81
+ }
82
+ function compareChanges(left, right) {
83
+ return (left.category.localeCompare(right.category) ||
84
+ left.id.localeCompare(right.id) ||
85
+ left.change.localeCompare(right.change));
86
+ }
87
+ function highest(changes) {
88
+ const order = [
89
+ "informational",
90
+ "compatible",
91
+ "potentially-breaking",
92
+ "breaking",
93
+ ];
94
+ return changes.reduce((current, change) => {
95
+ if (current === "breaking")
96
+ return current;
97
+ if (current === undefined || order.indexOf(change.classification) > order.indexOf(current)) {
98
+ return change.classification;
99
+ }
100
+ return current;
101
+ }, undefined);
102
+ }
103
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { JsonValue } from "@relkit/contracts";
2
+ import type { GraphNodeBase } from "./model.js";
3
+ export interface AppNode extends GraphNodeBase<"app"> {
4
+ readonly environment?: JsonValue;
5
+ readonly providerBindings?: readonly string[];
6
+ readonly observability?: JsonValue;
7
+ readonly defaults?: JsonValue;
8
+ }
9
+ export interface EnvironmentVariableNode extends GraphNodeBase<"env"> {
10
+ readonly name: string;
11
+ readonly type: string;
12
+ readonly requiredIn: readonly string[];
13
+ readonly hasDefault: boolean;
14
+ readonly sensitive: boolean;
15
+ readonly description?: string;
16
+ }
17
+ export interface GeneratedAgentMarker {
18
+ readonly generated: true;
19
+ readonly generatedBy: "agent";
20
+ readonly agentId: string;
21
+ readonly functionId: string;
22
+ }
23
+ export interface GeneratedEventListenerMarker {
24
+ readonly generated: true;
25
+ readonly generatedBy: "event-listener";
26
+ readonly listenerId: string;
27
+ readonly functionId: string;
28
+ }
29
+ export type GeneratedFunctionMarker = GeneratedAgentMarker | GeneratedEventListenerMarker;
30
+ //# sourceMappingURL=foundation-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation-nodes.d.ts","sourceRoot":"","sources":["../src/foundation-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,OAAQ,SAAQ,aAAa,CAAC,KAAK,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAwB,SAAQ,aAAa,CAAC,KAAK,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,GAAG,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=foundation-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation-nodes.js","sourceRoot":"","sources":["../src/foundation-nodes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { ServiceMemberEdge, ServiceMiddlewareEdge } from "./service-nodes.js";
2
+ export declare const GRAPH_EDGE_KINDS: readonly ["targets-function", "calls-function", "enqueues-job", "publishes-event", "listens-to-event", "uses-bucket", "uses-cache", "invokes-agent", "exposes-as-tool", "uses-tool", "uses-provider-profile", "contains-function", "uses-service-middleware", "uses-middleware", "uses-hook"];
3
+ export type GraphEdgeKind = (typeof GRAPH_EDGE_KINDS)[number];
4
+ export interface GraphEdgeBase<Kind extends GraphEdgeKind = GraphEdgeKind> {
5
+ readonly kind: Kind;
6
+ readonly from: string;
7
+ readonly to: string;
8
+ }
9
+ export interface TargetsFunctionEdge extends GraphEdgeBase<"targets-function"> {
10
+ readonly role: "primary";
11
+ }
12
+ export interface UsesMiddlewareEdge extends GraphEdgeBase<"uses-middleware"> {
13
+ readonly order: number;
14
+ readonly match: "always" | "conditional";
15
+ }
16
+ export interface UsesHookEdge extends GraphEdgeBase<"uses-hook"> {
17
+ readonly phase: "before" | "after";
18
+ }
19
+ export type GraphEdge = TargetsFunctionEdge | GraphEdgeBase<"calls-function"> | GraphEdgeBase<"enqueues-job"> | GraphEdgeBase<"publishes-event"> | GraphEdgeBase<"listens-to-event"> | GraphEdgeBase<"uses-bucket"> | GraphEdgeBase<"uses-cache"> | GraphEdgeBase<"invokes-agent"> | GraphEdgeBase<"exposes-as-tool"> | GraphEdgeBase<"uses-tool"> | GraphEdgeBase<"uses-provider-profile"> | ServiceMemberEdge | ServiceMiddlewareEdge | UsesMiddlewareEdge | UsesHookEdge;
20
+ export declare function isGraphEdgeKind(value: unknown): value is GraphEdgeKind;
21
+ //# sourceMappingURL=graph-edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-edges.d.ts","sourceRoot":"","sources":["../src/graph-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,eAAO,MAAM,gBAAgB,+RAgBnB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,WAAW,aAAa,CAAC,IAAI,SAAS,aAAa,GAAG,aAAa;IACvE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,mBAAoB,SAAQ,aAAa,CAAC,kBAAkB,CAAC;IAC5E,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AACD,MAAM,WAAW,kBAAmB,SAAQ,aAAa,CAAC,iBAAiB,CAAC;IAC1E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC;CAC1C;AACD,MAAM,WAAW,YAAa,SAAQ,aAAa,CAAC,WAAW,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CACpC;AACD,MAAM,MAAM,SAAS,GACjB,mBAAmB,GACnB,aAAa,CAAC,gBAAgB,CAAC,GAC/B,aAAa,CAAC,cAAc,CAAC,GAC7B,aAAa,CAAC,iBAAiB,CAAC,GAChC,aAAa,CAAC,kBAAkB,CAAC,GACjC,aAAa,CAAC,aAAa,CAAC,GAC5B,aAAa,CAAC,YAAY,CAAC,GAC3B,aAAa,CAAC,eAAe,CAAC,GAC9B,aAAa,CAAC,iBAAiB,CAAC,GAChC,aAAa,CAAC,WAAW,CAAC,GAC1B,aAAa,CAAC,uBAAuB,CAAC,GACtC,iBAAiB,GACjB,qBAAqB,GACrB,kBAAkB,GAClB,YAAY,CAAC;AAEjB,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE"}
@@ -0,0 +1,21 @@
1
+ export const GRAPH_EDGE_KINDS = [
2
+ "targets-function",
3
+ "calls-function",
4
+ "enqueues-job",
5
+ "publishes-event",
6
+ "listens-to-event",
7
+ "uses-bucket",
8
+ "uses-cache",
9
+ "invokes-agent",
10
+ "exposes-as-tool",
11
+ "uses-tool",
12
+ "uses-provider-profile",
13
+ "contains-function",
14
+ "uses-service-middleware",
15
+ "uses-middleware",
16
+ "uses-hook",
17
+ ];
18
+ export function isGraphEdgeKind(value) {
19
+ return typeof value === "string" && GRAPH_EDGE_KINDS.includes(value);
20
+ }
21
+ //# sourceMappingURL=graph-edges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-edges.js","sourceRoot":"","sources":["../src/graph-edges.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,WAAW;IACX,uBAAuB;IACvB,mBAAmB;IACnB,yBAAyB;IACzB,iBAAiB;IACjB,WAAW;CACH,CAAC;AAkCX,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { GRAPH_VERSION } from "@relkit/contracts";
2
+ import type { GraphEdge, GraphEdgeKind, GraphNode } from "./model.js";
3
+ export interface ObservedEdge {
4
+ readonly relationship: GraphEdgeKind;
5
+ readonly from: string;
6
+ readonly to: string;
7
+ }
8
+ export interface ApplicationGraph {
9
+ readonly contractVersion: typeof GRAPH_VERSION;
10
+ readonly appId?: string;
11
+ readonly nodes: readonly GraphNode[];
12
+ readonly edges: readonly GraphEdge[];
13
+ }
14
+ export type Graph = ApplicationGraph;
15
+ //# sourceMappingURL=graph-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-types.d.ts","sourceRoot":"","sources":["../src/graph-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,eAAe,EAAE,OAAO,aAAa,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAED,MAAM,MAAM,KAAK,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { GRAPH_VERSION } from "@relkit/contracts";
2
+ //# sourceMappingURL=graph-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-types.js","sourceRoot":"","sources":["../src/graph-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateGraphShape(value: unknown, root?: string): void;
2
+ //# sourceMappingURL=graph-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-validation.d.ts","sourceRoot":"","sources":["../src/graph-validation.ts"],"names":[],"mappings":"AAIA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAQtE"}