@bevorai/sdk 0.0.0-stage → 0.1.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 (130) hide show
  1. package/README.md +179 -2
  2. package/dist/client.d.ts +86 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +171 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/errors.d.ts +109 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +132 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/graph/call-node.d.ts +47 -0
  11. package/dist/graph/call-node.d.ts.map +1 -0
  12. package/dist/graph/call-node.js +338 -0
  13. package/dist/graph/call-node.js.map +1 -0
  14. package/dist/graph/cursor.d.ts +46 -0
  15. package/dist/graph/cursor.d.ts.map +1 -0
  16. package/dist/graph/cursor.js +149 -0
  17. package/dist/graph/cursor.js.map +1 -0
  18. package/dist/graph/field-metadata.d.ts +24 -0
  19. package/dist/graph/field-metadata.d.ts.map +1 -0
  20. package/dist/graph/field-metadata.js +72 -0
  21. package/dist/graph/field-metadata.js.map +1 -0
  22. package/dist/graph/graph.d.ts +87 -0
  23. package/dist/graph/graph.d.ts.map +1 -0
  24. package/dist/graph/graph.js +354 -0
  25. package/dist/graph/graph.js.map +1 -0
  26. package/dist/helpers/call-chain.d.ts +11 -0
  27. package/dist/helpers/call-chain.d.ts.map +1 -0
  28. package/dist/helpers/call-chain.js +79 -0
  29. package/dist/helpers/call-chain.js.map +1 -0
  30. package/dist/helpers/sarif.d.ts +21 -0
  31. package/dist/helpers/sarif.d.ts.map +1 -0
  32. package/dist/helpers/sarif.js +191 -0
  33. package/dist/helpers/sarif.js.map +1 -0
  34. package/dist/helpers/source-fingerprint.d.ts +32 -0
  35. package/dist/helpers/source-fingerprint.d.ts.map +1 -0
  36. package/dist/helpers/source-fingerprint.js +115 -0
  37. package/dist/helpers/source-fingerprint.js.map +1 -0
  38. package/dist/helpers/static-analysis.d.ts +18 -0
  39. package/dist/helpers/static-analysis.d.ts.map +1 -0
  40. package/dist/helpers/static-analysis.js +89 -0
  41. package/dist/helpers/static-analysis.js.map +1 -0
  42. package/dist/index.d.ts +31 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +29 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/node.d.ts +4 -0
  47. package/dist/node.d.ts.map +1 -0
  48. package/dist/node.js +26 -0
  49. package/dist/node.js.map +1 -0
  50. package/dist/pagination.d.ts +13 -0
  51. package/dist/pagination.d.ts.map +1 -0
  52. package/dist/pagination.js +30 -0
  53. package/dist/pagination.js.map +1 -0
  54. package/dist/resources/analyses.d.ts +90 -0
  55. package/dist/resources/analyses.d.ts.map +1 -0
  56. package/dist/resources/analyses.js +250 -0
  57. package/dist/resources/analyses.js.map +1 -0
  58. package/dist/resources/chats.d.ts +48 -0
  59. package/dist/resources/chats.d.ts.map +1 -0
  60. package/dist/resources/chats.js +114 -0
  61. package/dist/resources/chats.js.map +1 -0
  62. package/dist/resources/codes.d.ts +64 -0
  63. package/dist/resources/codes.d.ts.map +1 -0
  64. package/dist/resources/codes.js +200 -0
  65. package/dist/resources/codes.js.map +1 -0
  66. package/dist/resources/files.d.ts +26 -0
  67. package/dist/resources/files.d.ts.map +1 -0
  68. package/dist/resources/files.js +45 -0
  69. package/dist/resources/files.js.map +1 -0
  70. package/dist/resources/findings.d.ts +49 -0
  71. package/dist/resources/findings.d.ts.map +1 -0
  72. package/dist/resources/findings.js +84 -0
  73. package/dist/resources/findings.js.map +1 -0
  74. package/dist/resources/nodes.d.ts +33 -0
  75. package/dist/resources/nodes.d.ts.map +1 -0
  76. package/dist/resources/nodes.js +65 -0
  77. package/dist/resources/nodes.js.map +1 -0
  78. package/dist/resources/projects.d.ts +11 -0
  79. package/dist/resources/projects.d.ts.map +1 -0
  80. package/dist/resources/projects.js +14 -0
  81. package/dist/resources/projects.js.map +1 -0
  82. package/dist/resources/shared.d.ts +14 -0
  83. package/dist/resources/shared.d.ts.map +1 -0
  84. package/dist/resources/shared.js +2 -0
  85. package/dist/resources/shared.js.map +1 -0
  86. package/dist/resources/summary.d.ts +17 -0
  87. package/dist/resources/summary.d.ts.map +1 -0
  88. package/dist/resources/summary.js +27 -0
  89. package/dist/resources/summary.js.map +1 -0
  90. package/dist/resources/transitions.d.ts +25 -0
  91. package/dist/resources/transitions.d.ts.map +1 -0
  92. package/dist/resources/transitions.js +30 -0
  93. package/dist/resources/transitions.js.map +1 -0
  94. package/dist/resources/users.d.ts +19 -0
  95. package/dist/resources/users.d.ts.map +1 -0
  96. package/dist/resources/users.js +36 -0
  97. package/dist/resources/users.js.map +1 -0
  98. package/dist/resources/versions.d.ts +20 -0
  99. package/dist/resources/versions.d.ts.map +1 -0
  100. package/dist/resources/versions.js +25 -0
  101. package/dist/resources/versions.js.map +1 -0
  102. package/dist/streaming.d.ts +43 -0
  103. package/dist/streaming.d.ts.map +1 -0
  104. package/dist/streaming.js +147 -0
  105. package/dist/streaming.js.map +1 -0
  106. package/dist/types/graph-data.d.ts +62 -0
  107. package/dist/types/graph-data.d.ts.map +1 -0
  108. package/dist/types/graph-data.js +2 -0
  109. package/dist/types/graph-data.js.map +1 -0
  110. package/dist/types/literals.d.ts +27 -0
  111. package/dist/types/literals.d.ts.map +1 -0
  112. package/dist/types/literals.js +16 -0
  113. package/dist/types/literals.js.map +1 -0
  114. package/dist/types/node-types.d.ts +5 -0
  115. package/dist/types/node-types.d.ts.map +1 -0
  116. package/dist/types/node-types.js +292 -0
  117. package/dist/types/node-types.js.map +1 -0
  118. package/dist/types/requests.d.ts +205 -0
  119. package/dist/types/requests.d.ts.map +1 -0
  120. package/dist/types/requests.js +3 -0
  121. package/dist/types/requests.js.map +1 -0
  122. package/dist/types/responses.d.ts +448 -0
  123. package/dist/types/responses.d.ts.map +1 -0
  124. package/dist/types/responses.js +11 -0
  125. package/dist/types/responses.js.map +1 -0
  126. package/dist/types/static-analysis.d.ts +28 -0
  127. package/dist/types/static-analysis.d.ts.map +1 -0
  128. package/dist/types/static-analysis.js +93 -0
  129. package/dist/types/static-analysis.js.map +1 -0
  130. package/package.json +46 -5
@@ -0,0 +1,149 @@
1
+ /**
2
+ * A movable position in the graph that remembers its path.
3
+ *
4
+ * Full execution-path DFS:
5
+ * ```ts
6
+ * const cursor = graph.cursor(nodeId);
7
+ * while (true) {
8
+ * if (cursor.gotoFirstChild()) continue;
9
+ * if (cursor.gotoNextSibling()) continue;
10
+ * if (!cursor.back()) break;
11
+ * }
12
+ * ```
13
+ *
14
+ * Adding `if (cursor.gotoFirstParent()) continue;` before `back()` also walks out of the execution
15
+ * path into cross pathways ("what else writes this", "where else is this called"). Use `peekUp()`,
16
+ * or pass an `edgeType` to only allow that for certain edges.
17
+ */
18
+ export class GraphCursor {
19
+ graph;
20
+ nodeId;
21
+ /** Edges taken from the current position, on this path. */
22
+ used = new Set();
23
+ stack = [];
24
+ constructor(graph, nodeId) {
25
+ this.graph = graph;
26
+ this.nodeId = nodeId;
27
+ }
28
+ get node() {
29
+ return this.graph.getNode(this.nodeId);
30
+ }
31
+ get depth() {
32
+ return this.stack.length;
33
+ }
34
+ get path() {
35
+ return this.stack.map(([nodeId]) => nodeId);
36
+ }
37
+ get isCycle() {
38
+ return this.path.includes(this.nodeId);
39
+ }
40
+ /**
41
+ * Takes the first unused outgoing edge. Moves onto its destination when it has one; an edge
42
+ * without a destination isn't a real node, so the cursor stays put but the edge is consumed.
43
+ */
44
+ gotoFirstChild() {
45
+ if (this.isCycle)
46
+ return null;
47
+ for (const edge of this.graph.getEdgesForNode(this.nodeId, {
48
+ direction: "out",
49
+ })) {
50
+ if (this.used.has(edge.id))
51
+ continue;
52
+ this.used = new Set([...this.used, edge.id]);
53
+ if (edge.dst_id) {
54
+ this.stack = [...this.stack, [this.nodeId, this.used]];
55
+ this.nodeId = edge.dst_id;
56
+ this.used = new Set();
57
+ }
58
+ return edge;
59
+ }
60
+ return null;
61
+ }
62
+ gotoFirstParent(edgeType = null) {
63
+ if (this.stack.length === 0 || this.isCycle)
64
+ return null;
65
+ for (const edge of this.graph.getEdgesForNode(this.nodeId, {
66
+ direction: "in",
67
+ edgeType,
68
+ })) {
69
+ if (this.used.has(edge.id))
70
+ continue;
71
+ this.used = new Set([...this.used, edge.id]);
72
+ this.stack = [...this.stack, [this.nodeId, this.used]];
73
+ this.nodeId = edge.src_id;
74
+ this.used = new Set();
75
+ return edge;
76
+ }
77
+ return null;
78
+ }
79
+ gotoNextSibling() {
80
+ const [nodeId, used, stack] = [this.nodeId, this.used, this.stack];
81
+ if (!this.back())
82
+ return null;
83
+ const edge = this.gotoFirstChild();
84
+ if (edge?.dst_id)
85
+ return edge;
86
+ const parentUsed = this.used;
87
+ [this.nodeId, this.used, this.stack] = [nodeId, used, stack];
88
+ if (edge !== null) {
89
+ // a sibling without a destination: stay put, but keep it consumed on the parent
90
+ const [parentId] = this.stack[this.stack.length - 1];
91
+ this.stack = [...this.stack.slice(0, -1), [parentId, parentUsed]];
92
+ }
93
+ return edge;
94
+ }
95
+ back() {
96
+ const top = this.stack[this.stack.length - 1];
97
+ if (!top)
98
+ return false;
99
+ [this.nodeId, this.used] = top;
100
+ this.stack = this.stack.slice(0, -1);
101
+ return true;
102
+ }
103
+ peekUp() {
104
+ if (this.stack.length === 0 || this.isCycle)
105
+ return [];
106
+ return this.graph
107
+ .getEdgesForNode(this.nodeId, { direction: "in" })
108
+ .filter((edge) => !this.used.has(edge.id))
109
+ .map((edge) => [edge, this.graph.getNode(edge.src_id)]);
110
+ }
111
+ peekDown() {
112
+ if (this.isCycle)
113
+ return [];
114
+ const out = [];
115
+ for (const edge of this.graph.getEdgesForNode(this.nodeId, {
116
+ direction: "out",
117
+ })) {
118
+ if (edge.dst_id && !this.used.has(edge.id))
119
+ out.push([edge, this.graph.getNode(edge.dst_id)]);
120
+ }
121
+ return out;
122
+ }
123
+ render(source = null) {
124
+ const node = this.node;
125
+ const path = this.stack.map(([nodeId]) => this.graph.getNode(nodeId));
126
+ const lines = [
127
+ `Path: ${[...path, node].map((n) => n.name).join(" > ")}`,
128
+ `At: ${node.name} (${node.node_type})`,
129
+ ];
130
+ if (node.signature)
131
+ lines.push(node.signature);
132
+ if (source !== null)
133
+ lines.push("", source);
134
+ const down = this.peekDown();
135
+ const up = this.peekUp();
136
+ const external = this.graph
137
+ .getEdgesForNode(this.nodeId, { direction: "out" })
138
+ .filter((edge) => !edge.dst_id);
139
+ if (down.length)
140
+ lines.push("", "Children:", ...down.map(([e, n]) => `→ ${e.edge_type} ${n.name}`));
141
+ if (up.length)
142
+ lines.push("", "Parents:", ...up.map(([e, n]) => `← ${e.edge_type} ${n.name}`));
143
+ if (external.length) {
144
+ lines.push("", "External:", ...external.map((e) => `⇢ ${e.edge_type} ${e.low_level_name || "unknown"}`));
145
+ }
146
+ return lines.join("\n");
147
+ }
148
+ }
149
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/graph/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ConstraintItem, FieldMetadataItem } from "../types/graph-data.js";
2
+ /** Accessors for the constraints on a node field (e.g. Anchor account constraints). */
3
+ export declare class FieldMetadata {
4
+ readonly item: FieldMetadataItem;
5
+ constructor(item: FieldMetadataItem);
6
+ get constraints(): ConstraintItem[];
7
+ getConstraint(name: string): ConstraintItem | null;
8
+ hasConstraint(name: string): boolean;
9
+ isMutable(): boolean;
10
+ isInit(): boolean;
11
+ isInitIfNeeded(): boolean;
12
+ isSigner(): boolean;
13
+ payer(): ConstraintItem["value"];
14
+ space(): ConstraintItem["value"];
15
+ close(): ConstraintItem["value"];
16
+ address(): ConstraintItem["value"];
17
+ /** Values of every `has_one` constraint that carries a single string. */
18
+ hasOne(): string[];
19
+ seeds(): string[] | null;
20
+ constraint(): ConstraintItem["value"];
21
+ /** Serializes like the Python SDK's `FieldMetadataItem.to_dict` (omits `value` and empty fields). */
22
+ toDict(): FieldMetadataItem;
23
+ }
24
+ //# sourceMappingURL=field-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-metadata.d.ts","sourceRoot":"","sources":["../../src/graph/field-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,uFAAuF;AACvF,qBAAa,aAAa;IACzB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAEjC,YAAY,IAAI,EAAE,iBAAiB,EAElC;IAED,IAAI,WAAW,IAAI,cAAc,EAAE,CAElC;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEjD;IAED,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnC;IAED,SAAS,IAAI,OAAO,CAEnB;IAED,MAAM,IAAI,OAAO,CAEhB;IAED,cAAc,IAAI,OAAO,CAExB;IAED,QAAQ,IAAI,OAAO,CAElB;IAED,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAE/B;IAED,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAE/B;IAED,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAE/B;IAED,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAEjC;IAED,yEAAyE;IACzE,MAAM,IAAI,MAAM,EAAE,CAIjB;IAED,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,CAGvB;IAED,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,CAEpC;IAED,qGAAqG;IACrG,MAAM,IAAI,iBAAiB,CAkB1B;CACD"}
@@ -0,0 +1,72 @@
1
+ /** Accessors for the constraints on a node field (e.g. Anchor account constraints). */
2
+ export class FieldMetadata {
3
+ item;
4
+ constructor(item) {
5
+ this.item = item;
6
+ }
7
+ get constraints() {
8
+ return this.item.constraints ?? [];
9
+ }
10
+ getConstraint(name) {
11
+ return this.constraints.find((c) => c.name === name) ?? null;
12
+ }
13
+ hasConstraint(name) {
14
+ return this.constraints.some((c) => c.name === name);
15
+ }
16
+ isMutable() {
17
+ return this.hasConstraint("mut");
18
+ }
19
+ isInit() {
20
+ return this.hasConstraint("init");
21
+ }
22
+ isInitIfNeeded() {
23
+ return this.hasConstraint("init_if_needed");
24
+ }
25
+ isSigner() {
26
+ return this.hasConstraint("signer");
27
+ }
28
+ payer() {
29
+ return this.getConstraint("payer")?.value ?? null;
30
+ }
31
+ space() {
32
+ return this.getConstraint("space")?.value ?? null;
33
+ }
34
+ close() {
35
+ return this.getConstraint("close")?.value ?? null;
36
+ }
37
+ address() {
38
+ return this.getConstraint("address")?.value ?? null;
39
+ }
40
+ /** Values of every `has_one` constraint that carries a single string. */
41
+ hasOne() {
42
+ return this.constraints
43
+ .filter((c) => c.name === "has_one" && typeof c.value === "string")
44
+ .map((c) => c.value);
45
+ }
46
+ seeds() {
47
+ const value = this.getConstraint("seeds")?.value;
48
+ return Array.isArray(value) ? value : null;
49
+ }
50
+ constraint() {
51
+ return this.getConstraint("constraint")?.value ?? null;
52
+ }
53
+ /** Serializes like the Python SDK's `FieldMetadataItem.to_dict` (omits `value` and empty fields). */
54
+ toDict() {
55
+ const out = { name: this.item.name };
56
+ if (this.item.type)
57
+ out.type = this.item.type;
58
+ if (this.item.mutability)
59
+ out.mutability = this.item.mutability;
60
+ if (this.item.discriminant !== null &&
61
+ this.item.discriminant !== undefined) {
62
+ out.discriminant = this.item.discriminant;
63
+ }
64
+ if (this.constraints.length) {
65
+ out.constraints = this.constraints.map((c) => c.value === null || c.value === undefined
66
+ ? { name: c.name }
67
+ : { name: c.name, value: c.value });
68
+ }
69
+ return out;
70
+ }
71
+ }
72
+ //# sourceMappingURL=field-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-metadata.js","sourceRoot":"","sources":["../../src/graph/field-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { BevorClient } from "../client.js";
2
+ import type { EdgeDirection, EdgeType, ID, Language } from "../types/literals.js";
3
+ import type { GraphSnapshotEdge, GraphSnapshotFile, GraphSnapshotNode } from "../types/responses.js";
4
+ import { CallNode } from "./call-node.js";
5
+ import { GraphCursor } from "./cursor.js";
6
+ export interface GraphSnapshot {
7
+ nodes: GraphSnapshotNode[];
8
+ edges: GraphSnapshotEdge[];
9
+ files: GraphSnapshotFile[];
10
+ }
11
+ export interface EdgeFilter {
12
+ direction?: EdgeDirection | null;
13
+ edgeType?: EdgeType | null;
14
+ }
15
+ /**
16
+ * Language-agnostic graph view for one code version, backed by HTTP only.
17
+ *
18
+ * Call `build()` after construction, or use `Graph.fromSnapshot` for an already-fetched snapshot.
19
+ */
20
+ export declare class Graph {
21
+ #private;
22
+ readonly codeId: ID;
23
+ edges: GraphSnapshotEdge[];
24
+ fileMap: Map<string, GraphSnapshotFile>;
25
+ /** file id -> ids of the nodes in that file */
26
+ sourceMap: Map<string, string[]>;
27
+ nodeMap: Map<string, GraphSnapshotNode>;
28
+ /** short id -> id */
29
+ idMap: Map<string, string>;
30
+ /** id -> short id */
31
+ reverseIdMap: Map<string, string>;
32
+ constructor(client: BevorClient, codeId: ID);
33
+ static fromSnapshot(client: BevorClient, codeId: ID, snapshot: GraphSnapshot): Graph;
34
+ get isBuilt(): boolean;
35
+ /** Fetches the snapshot (nodes, edges and files). No-op once built. */
36
+ build(): Promise<void>;
37
+ /** Fetches a file's text once and caches it. */
38
+ getFileContent(fileId: ID): Promise<string>;
39
+ /**
40
+ * The node's source, with oversized hex/string literals elided.
41
+ * With `withDocstring`, prefixes the docstring, following `@inheritdoc` to the referenced natspec.
42
+ */
43
+ reconstructChunk(nodeId: ID, { withDocstring }?: {
44
+ withDocstring?: boolean;
45
+ }): Promise<string>;
46
+ static reconstruct(node: GraphSnapshotNode, source: Uint8Array, docstring?: string | null): string;
47
+ getShortFromId(nodeId: ID): string;
48
+ getIdFromShort(shortId: string): ID;
49
+ getAllNodes(): GraphSnapshotNode[];
50
+ /** Nodes with no incoming edges. */
51
+ getRootNodes(): GraphSnapshotNode[];
52
+ getAllFiles(): GraphSnapshotFile[];
53
+ exists(nodeId: ID): boolean;
54
+ existsShortId(shortId: string): boolean;
55
+ getNode(nodeId: ID): GraphSnapshotNode;
56
+ getFile(fileId: ID): GraphSnapshotFile;
57
+ /** Distinct languages in this snapshot (e.g. Solidity + Rust in a monorepo). */
58
+ get languages(): ReadonlySet<Language>;
59
+ getNodeLanguage(nodeId: ID): Language;
60
+ /**
61
+ * Edges touching a node: outgoing first (by source position), then incoming.
62
+ * Each returned edge is a copy with `direction` set relative to `nodeId`.
63
+ */
64
+ getEdgesForNode(nodeId: ID, { direction, edgeType }?: EdgeFilter): GraphSnapshotEdge[];
65
+ /** All edges, optionally of one type. Edges have no direction unless queried against a node. */
66
+ getEdges({ edgeType, }?: {
67
+ edgeType?: EdgeType | null;
68
+ }): GraphSnapshotEdge[];
69
+ /** Resolves a snapshot edge by its row id. */
70
+ getEdgeById(edgeId: ID): GraphSnapshotEdge | null;
71
+ /** Walks incoming edges until it reaches a node of `nodeType`. */
72
+ traverseUpToNodeType(nodeId: ID, nodeType: string): GraphSnapshotNode | null;
73
+ getNodesInFile(fileId: ID): ID[];
74
+ /** Shortest path length treating the graph as undirected (-1 if disconnected). */
75
+ getDistance(fromNodeId: ID, toNodeId: ID): number;
76
+ /** True if `parentId` is reachable from `childId` following incoming `calls` edges. */
77
+ isDescendant(childId: ID, parentId: ID): boolean;
78
+ getCallChain(nodeId: ID): CallNode;
79
+ cursor(nodeId: ID): GraphCursor;
80
+ /** Depth-first search along outgoing edges for a node with `merkleHash`. */
81
+ getDescendantByMerkle(nodeId: ID, merkleHash: string): ID | null;
82
+ getCallableTypes(language: Language): Set<string>;
83
+ getDeclarationTypes(language: Language): Set<string>;
84
+ getExcludeTypes(language: Language): Set<string>;
85
+ getContainerTypes(language: Language): Set<string>;
86
+ }
87
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph/graph.ts"],"names":[],"mappings":"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"}