@bevorai/sdk 0.0.0-stage → 0.1.0-rc.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,354 @@
1
+ import { CallNode } from "./call-node.js";
2
+ import { GraphCursor } from "./cursor.js";
3
+ const HEX_LITERAL_RE = /hex"([0-9a-fA-F]+)"/g;
4
+ const LARGE_STRING_LITERAL_RE = /"(?:[^"\\]|\\[\s\S]){512,}"/g;
5
+ const utf8Decoder = new TextDecoder("utf-8", { fatal: true });
6
+ const utf8Encoder = new TextEncoder();
7
+ const sanitizeChunk = (src) => src
8
+ .replace(HEX_LITERAL_RE, (match, hex) => Math.floor(hex.length / 2) > 256 ? 'hex"<BYTECODE OMITTED>"' : match)
9
+ .replace(LARGE_STRING_LITERAL_RE, '"[LARGE_STRING_OMITTED]"');
10
+ const mustGet = (map, key, label) => {
11
+ const value = map.get(key);
12
+ if (value === undefined)
13
+ throw new Error(`unknown ${label}: ${String(key)}`);
14
+ return value;
15
+ };
16
+ /**
17
+ * Language-agnostic graph view for one code version, backed by HTTP only.
18
+ *
19
+ * Call `build()` after construction, or use `Graph.fromSnapshot` for an already-fetched snapshot.
20
+ */
21
+ export class Graph {
22
+ codeId;
23
+ #client;
24
+ #isBuilt = false;
25
+ edges = [];
26
+ fileMap = new Map();
27
+ /** file id -> ids of the nodes in that file */
28
+ sourceMap = new Map();
29
+ nodeMap = new Map();
30
+ /** short id -> id */
31
+ idMap = new Map();
32
+ /** id -> short id */
33
+ reverseIdMap = new Map();
34
+ #adjacency = new Map();
35
+ #reverseAdjacency = new Map();
36
+ #edgeById = new Map();
37
+ #fileText = new Map();
38
+ constructor(client, codeId) {
39
+ this.#client = client;
40
+ this.codeId = codeId;
41
+ }
42
+ static fromSnapshot(client, codeId, snapshot) {
43
+ const graph = new Graph(client, codeId);
44
+ graph.#ingestSnapshot(snapshot);
45
+ return graph;
46
+ }
47
+ get isBuilt() {
48
+ return this.#isBuilt;
49
+ }
50
+ /** Fetches the snapshot (nodes, edges and files). No-op once built. */
51
+ async build() {
52
+ if (this.#isBuilt)
53
+ return;
54
+ const [nodes, edges, files] = await Promise.all([
55
+ this.#client.codes.nodes.list(this.codeId),
56
+ this.#client.codes.edges(this.codeId),
57
+ this.#client.codes.files.list(this.codeId),
58
+ ]);
59
+ this.#ingestSnapshot({
60
+ nodes: nodes.results,
61
+ edges: edges.results,
62
+ files: files.results,
63
+ });
64
+ }
65
+ /** Fetches a file's text once and caches it. */
66
+ async getFileContent(fileId) {
67
+ const cached = this.#fileText.get(fileId);
68
+ if (cached !== undefined)
69
+ return cached;
70
+ const text = await this.#client.codes.files.content(this.codeId, fileId);
71
+ this.#fileText.set(fileId, text);
72
+ return text;
73
+ }
74
+ /**
75
+ * The node's source, with oversized hex/string literals elided.
76
+ * With `withDocstring`, prefixes the docstring, following `@inheritdoc` to the referenced natspec.
77
+ */
78
+ async reconstructChunk(nodeId, { withDocstring = false } = {}) {
79
+ this.#ensureBuilt();
80
+ const node = this.getNode(nodeId);
81
+ const source = utf8Encoder.encode(await this.getFileContent(node.file_id));
82
+ let docstring = null;
83
+ if (withDocstring && node.docstring) {
84
+ if (!node.docstring.includes("@inheritdoc")) {
85
+ docstring = node.docstring;
86
+ }
87
+ else {
88
+ const [natspec] = this.getEdgesForNode(nodeId, {
89
+ direction: "out",
90
+ edgeType: "has_ref_comment",
91
+ });
92
+ if (natspec) {
93
+ if (!natspec.dst_id)
94
+ throw new Error(`has_ref_comment edge ${natspec.id} has no destination`);
95
+ docstring = this.getNode(natspec.dst_id).docstring ?? null;
96
+ }
97
+ else {
98
+ docstring = node.docstring;
99
+ }
100
+ }
101
+ }
102
+ return Graph.reconstruct(node, source, docstring);
103
+ }
104
+ static reconstruct(node, source, docstring) {
105
+ const chunk = sanitizeChunk(utf8Decoder.decode(source.subarray(node.src_start_pos, node.src_end_pos)));
106
+ return docstring ? `${docstring}\n${chunk}` : chunk;
107
+ }
108
+ #ensureBuilt() {
109
+ if (!this.#isBuilt)
110
+ throw new Error("must run build() first");
111
+ }
112
+ #ingestSnapshot({ nodes, edges, files }) {
113
+ this.edges = edges;
114
+ this.fileMap = new Map(files.map((file) => [file.id, file]));
115
+ this.nodeMap = new Map();
116
+ this.idMap = new Map();
117
+ this.reverseIdMap = new Map();
118
+ this.sourceMap = new Map();
119
+ for (const node of nodes) {
120
+ this.reverseIdMap.set(node.id, node.short_id);
121
+ this.idMap.set(node.short_id, node.id);
122
+ this.nodeMap.set(node.id, node);
123
+ const inFile = this.sourceMap.get(node.file_id);
124
+ if (inFile)
125
+ inFile.push(node.id);
126
+ else
127
+ this.sourceMap.set(node.file_id, [node.id]);
128
+ }
129
+ this.#buildAdjacency();
130
+ this.#isBuilt = true;
131
+ }
132
+ #buildAdjacency() {
133
+ const adjacency = new Map();
134
+ const reverse = new Map();
135
+ const push = (map, key, edge) => {
136
+ const list = map.get(key);
137
+ if (list)
138
+ list.push(edge);
139
+ else
140
+ map.set(key, [edge]);
141
+ };
142
+ for (const edge of this.edges) {
143
+ push(adjacency, edge.src_id, edge);
144
+ if (edge.dst_id)
145
+ push(reverse, edge.dst_id, edge);
146
+ }
147
+ for (const list of adjacency.values())
148
+ list.sort((a, b) => a.src_start_pos - b.src_start_pos);
149
+ this.#adjacency = adjacency;
150
+ this.#reverseAdjacency = reverse;
151
+ this.#edgeById = new Map(this.edges.map((edge) => [edge.id, edge]));
152
+ }
153
+ getShortFromId(nodeId) {
154
+ return mustGet(this.reverseIdMap, nodeId, "node id");
155
+ }
156
+ getIdFromShort(shortId) {
157
+ return mustGet(this.idMap, shortId, "short id");
158
+ }
159
+ getAllNodes() {
160
+ this.#ensureBuilt();
161
+ return [...this.nodeMap.values()];
162
+ }
163
+ /** Nodes with no incoming edges. */
164
+ getRootNodes() {
165
+ return this.getAllNodes().filter((node) => !this.#reverseAdjacency.has(node.id));
166
+ }
167
+ getAllFiles() {
168
+ this.#ensureBuilt();
169
+ return [...this.fileMap.values()];
170
+ }
171
+ exists(nodeId) {
172
+ return this.nodeMap.has(nodeId);
173
+ }
174
+ existsShortId(shortId) {
175
+ return this.idMap.has(shortId);
176
+ }
177
+ getNode(nodeId) {
178
+ this.#ensureBuilt();
179
+ return mustGet(this.nodeMap, nodeId, "node");
180
+ }
181
+ getFile(fileId) {
182
+ this.#ensureBuilt();
183
+ return mustGet(this.fileMap, fileId, "file");
184
+ }
185
+ /** Distinct languages in this snapshot (e.g. Solidity + Rust in a monorepo). */
186
+ get languages() {
187
+ this.#ensureBuilt();
188
+ return new Set([...this.fileMap.values()].map((file) => file.language));
189
+ }
190
+ getNodeLanguage(nodeId) {
191
+ return this.getFile(this.getNode(nodeId).file_id).language;
192
+ }
193
+ /**
194
+ * Edges touching a node: outgoing first (by source position), then incoming.
195
+ * Each returned edge is a copy with `direction` set relative to `nodeId`.
196
+ */
197
+ getEdgesForNode(nodeId, { direction = null, edgeType = null } = {}) {
198
+ this.#ensureBuilt();
199
+ if (direction !== null && direction !== "in" && direction !== "out") {
200
+ throw new Error(`invalid edge direction: ${String(direction)}`);
201
+ }
202
+ const out = [];
203
+ const collect = (edges, dir) => {
204
+ for (const edge of edges ?? []) {
205
+ if (edgeType === null || edge.edge_type === edgeType)
206
+ out.push({ ...edge, direction: dir });
207
+ }
208
+ };
209
+ if (direction !== "in")
210
+ collect(this.#adjacency.get(nodeId), "out");
211
+ if (direction !== "out")
212
+ collect(this.#reverseAdjacency.get(nodeId), "in");
213
+ return out;
214
+ }
215
+ /** All edges, optionally of one type. Edges have no direction unless queried against a node. */
216
+ getEdges({ edgeType = null, } = {}) {
217
+ this.#ensureBuilt();
218
+ return edgeType === null
219
+ ? [...this.edges]
220
+ : this.edges.filter((edge) => edge.edge_type === edgeType);
221
+ }
222
+ /** Resolves a snapshot edge by its row id. */
223
+ getEdgeById(edgeId) {
224
+ this.#ensureBuilt();
225
+ return this.#edgeById.get(edgeId) ?? null;
226
+ }
227
+ /** Walks incoming edges until it reaches a node of `nodeType`. */
228
+ traverseUpToNodeType(nodeId, nodeType) {
229
+ const stack = [nodeId];
230
+ const seen = new Set();
231
+ while (stack.length) {
232
+ const current = stack.pop();
233
+ if (seen.has(current))
234
+ continue;
235
+ seen.add(current);
236
+ const node = this.getNode(current);
237
+ if (node.node_type === nodeType)
238
+ return node;
239
+ for (const edge of this.getEdgesForNode(current, { direction: "in" }))
240
+ stack.push(edge.src_id);
241
+ }
242
+ return null;
243
+ }
244
+ getNodesInFile(fileId) {
245
+ this.#ensureBuilt();
246
+ return [...(this.sourceMap.get(fileId) ?? [])];
247
+ }
248
+ /** Shortest path length treating the graph as undirected (-1 if disconnected). */
249
+ getDistance(fromNodeId, toNodeId) {
250
+ this.#ensureBuilt();
251
+ if (fromNodeId === toNodeId)
252
+ return 0;
253
+ const visited = new Set();
254
+ const queue = [[fromNodeId, 0]];
255
+ for (let i = 0; i < queue.length; i++) {
256
+ const [nodeId, dist] = queue[i];
257
+ if (nodeId === toNodeId)
258
+ return dist;
259
+ if (visited.has(nodeId))
260
+ continue;
261
+ visited.add(nodeId);
262
+ for (const edge of this.getEdgesForNode(nodeId, { direction: "in" })) {
263
+ if (!visited.has(edge.src_id))
264
+ queue.push([edge.src_id, dist + 1]);
265
+ }
266
+ for (const edge of this.getEdgesForNode(nodeId, { direction: "out" })) {
267
+ if (edge.dst_id && !visited.has(edge.dst_id))
268
+ queue.push([edge.dst_id, dist + 1]);
269
+ }
270
+ }
271
+ return -1;
272
+ }
273
+ /** True if `parentId` is reachable from `childId` following incoming `calls` edges. */
274
+ isDescendant(childId, parentId) {
275
+ this.#ensureBuilt();
276
+ if (childId === parentId)
277
+ return true;
278
+ const visited = new Set();
279
+ const queue = [childId];
280
+ for (let i = 0; i < queue.length; i++) {
281
+ const nodeId = queue[i];
282
+ if (nodeId === parentId)
283
+ return true;
284
+ if (visited.has(nodeId))
285
+ continue;
286
+ visited.add(nodeId);
287
+ for (const edge of this.getEdgesForNode(nodeId, { direction: "in" })) {
288
+ if (edge.edge_type === "calls")
289
+ queue.push(edge.src_id);
290
+ }
291
+ }
292
+ return false;
293
+ }
294
+ getCallChain(nodeId) {
295
+ return CallNode.build(this, nodeId);
296
+ }
297
+ cursor(nodeId) {
298
+ return new GraphCursor(this, nodeId);
299
+ }
300
+ /** Depth-first search along outgoing edges for a node with `merkleHash`. */
301
+ getDescendantByMerkle(nodeId, merkleHash) {
302
+ const stack = [nodeId];
303
+ const seen = new Set();
304
+ while (stack.length) {
305
+ const current = stack.pop();
306
+ seen.add(current);
307
+ const node = this.getNode(current);
308
+ if (node.merkle_hash === merkleHash)
309
+ return node.id;
310
+ for (const edge of this.getEdgesForNode(current, { direction: "out" })) {
311
+ if (edge.dst_id && !seen.has(edge.dst_id))
312
+ stack.push(edge.dst_id);
313
+ }
314
+ }
315
+ return null;
316
+ }
317
+ getCallableTypes(language) {
318
+ return language === "solidity"
319
+ ? new Set([
320
+ "function_definition",
321
+ "fallback_receive_definition",
322
+ "modifier_definition",
323
+ "constructor_definition",
324
+ ])
325
+ : new Set();
326
+ }
327
+ getDeclarationTypes(language) {
328
+ return language === "solidity"
329
+ ? new Set([
330
+ "enum_declaration",
331
+ "error_declaration",
332
+ "struct_declaration",
333
+ "event_definition",
334
+ "state_variable_declaration",
335
+ "constant_variable_declaration",
336
+ ])
337
+ : new Set();
338
+ }
339
+ getExcludeTypes(language) {
340
+ return language === "solidity"
341
+ ? new Set(["if_statement", "ternary_expression", "try_statement"])
342
+ : new Set();
343
+ }
344
+ getContainerTypes(language) {
345
+ return language === "solidity"
346
+ ? new Set([
347
+ "contract_declaration",
348
+ "library_declaration",
349
+ "interface_declaration",
350
+ ])
351
+ : new Set();
352
+ }
353
+ }
354
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CallNode } from "../graph/call-node.js";
2
+ import type { ResolvedStorageAccess } from "../types/graph-data.js";
3
+ /** `[name, shortId]` for display; `shortId` is empty for low-level methods. */
4
+ export declare const callableDisplayParts: (cn: CallNode) => [name: string, shortId: string];
5
+ /** Single-line description of one resolved storage access. */
6
+ export declare const formatResolvedStorageAccessLine: (access: ResolvedStorageAccess) => string;
7
+ /** One header row plus one row per access, ordered by source offset. */
8
+ export declare const resolvedBindingsBlockLines: (accesses: readonly ResolvedStorageAccess[], baseDepth: number) => string[];
9
+ /** Plain-text rendering of a call chain, annotating effects with the input they use. */
10
+ export declare const formatCallChainText: (root: CallNode) => string;
11
+ //# sourceMappingURL=call-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-chain.d.ts","sourceRoot":"","sources":["../../src/helpers/call-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,OAC5B,QAAQ,KACV,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAGgC,CAAC;AAElE,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,WACnC,qBAAqB,KAC3B,MAKF,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,0BAA0B,aAC5B,SAAS,qBAAqB,EAAE,aAC/B,MAAM,KACf,MAAM,EASR,CAAC;AAuCF,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,SAAU,QAAQ,KAAG,MA2BpD,CAAC"}
@@ -0,0 +1,79 @@
1
+ /** `[name, shortId]` for display; `shortId` is empty for low-level methods. */
2
+ export const callableDisplayParts = (cn) => cn.shortId
3
+ ? [cn.name || cn.lowLevelName || "?", cn.shortId]
4
+ : [`low-level method ${cn.lowLevelName || cn.name || "?"}`, ""];
5
+ /** Single-line description of one resolved storage access. */
6
+ export const formatResolvedStorageAccessLine = (access) => {
7
+ const target = access.field
8
+ ? `${access.bound_to_name || "?"}.${access.field}`
9
+ : access.bound_to_name || "?";
10
+ return `${access.edge_type} ${target} [${access.bound_to_short_id}]`;
11
+ };
12
+ /** One header row plus one row per access, ordered by source offset. */
13
+ export const resolvedBindingsBlockLines = (accesses, baseDepth) => {
14
+ if (accesses.length === 0)
15
+ return [];
16
+ const header = " ".repeat(baseDepth + 1);
17
+ const row = " ".repeat(baseDepth + 2);
18
+ const ordered = [...accesses].sort((a, b) => a.start_byte - b.start_byte);
19
+ return [
20
+ `${header}injected from parent call:`,
21
+ ...ordered.map((a) => `${row}${formatResolvedStorageAccessLine(a)}`),
22
+ ];
23
+ };
24
+ const usingContextFromParent = (cn, parent) => {
25
+ if (parent === null || !cn.targetEffectId)
26
+ return null;
27
+ const sibling = parent.children.find((child) => child.edgeId === cn.targetEffectId);
28
+ if (!sibling)
29
+ return null;
30
+ const [name, shortId] = callableDisplayParts(sibling);
31
+ return shortId ? `using ${name} [${shortId}]` : `using ${name}`;
32
+ };
33
+ const formatLine = (cn, parent) => {
34
+ const [displayName, shortId] = callableDisplayParts(cn);
35
+ const name = shortId ? `${displayName} [${shortId}]` : displayName;
36
+ let head = name;
37
+ if (cn.edgeType) {
38
+ const verb = cn.edgeType.replaceAll("_", " ");
39
+ if (parent && parent.edgeType === "has_condition" && !cn.isConditional)
40
+ head = `in condition ${verb} ${name}`;
41
+ else if (cn.isConditional)
42
+ head = `conditionally ${verb} ${name}`;
43
+ else
44
+ head = `${verb} ${name}`;
45
+ }
46
+ const tail = [];
47
+ if (cn.srcFieldNames.length)
48
+ tail.push(`src: [${cn.srcFieldNames.join(",")}]`);
49
+ if (cn.dstFieldNames.length)
50
+ tail.push(`dst: [${cn.dstFieldNames.join(",")}]`);
51
+ const context = usingContextFromParent(cn, parent);
52
+ if (context && !cn.isArg)
53
+ tail.push(`(${context})`);
54
+ return tail.length ? `${head} ${tail.join(" ")}` : head;
55
+ };
56
+ /** Plain-text rendering of a call chain, annotating effects with the input they use. */
57
+ export const formatCallChainText = (root) => {
58
+ const lines = [];
59
+ const visitLine = (cn, depth, parent) => {
60
+ const line = formatLine(cn, parent);
61
+ lines.push(" ".repeat(depth) + (cn.isCyclic ? `[CYCLIC] ${line}` : line));
62
+ visitChildren(cn, depth);
63
+ };
64
+ const visitChildren = (cn, depth) => {
65
+ const args = cn.children.filter((child) => child.isArg);
66
+ if (args.length) {
67
+ const isCall = cn.edgeType === "calls" || cn.edgeType === "calls_external";
68
+ lines.push(`${" ".repeat(depth + 1)}${isCall ? "args" : "using"}`);
69
+ for (const child of args)
70
+ visitLine(child, depth + 2, cn);
71
+ }
72
+ for (const child of cn.children)
73
+ if (!child.isArg)
74
+ visitLine(child, depth + 1, cn);
75
+ };
76
+ visitLine(root, 0, null);
77
+ return lines.join("\n");
78
+ };
79
+ //# sourceMappingURL=call-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-chain.js","sourceRoot":"","sources":["../../src/helpers/call-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Log, PhysicalLocation, Region, ReportingDescriptor, Result } from "sarif";
2
+ import type { Graph } from "../graph/graph.js";
3
+ import type { FindingLevel } from "../types/literals.js";
4
+ import type { FindingBody } from "../types/requests.js";
5
+ import type { FindingSchema } from "../types/responses.js";
6
+ export type FindingExchangeFormat = "bevor" | "sarif";
7
+ export type SarifLevel = NonNullable<Result["level"]>;
8
+ export declare const BEVOR_TOOL_VERSION = "0.0.1";
9
+ export declare const BEVOR_TO_SARIF_LEVEL: Readonly<Record<FindingLevel, SarifLevel>>;
10
+ export declare const SARIF_TO_BEVOR_LEVEL: Readonly<Record<SarifLevel, FindingLevel>>;
11
+ export declare const ruleForFinding: (finding: FindingSchema) => ReportingDescriptor;
12
+ /** Bevor-specific properties; SARIF property bags here carry strings only. */
13
+ export declare const bevorProperties: (finding: FindingSchema) => Record<string, Record<string, string>>;
14
+ export declare const resultFromFinding: (finding: FindingSchema, location: PhysicalLocation) => Result;
15
+ /** Line/column (1-indexed), byte and code-point offsets for a byte range of a UTF-8 file. */
16
+ export declare const computeRegion: (content: Uint8Array, byteStart: number, byteEnd: number) => Region;
17
+ /** Converts findings to a SARIF 2.1.0 log, one run per tool. The graph must be built. */
18
+ export declare const bevorToSarif: (graph: Graph, findings: readonly FindingSchema[]) => Promise<Log>;
19
+ /** Converts a SARIF log into finding bodies for `analyses.addFindings`. */
20
+ export declare const sarifToBevor: (sarif: Log) => FindingBody[];
21
+ //# sourceMappingURL=sarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/helpers/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAChB,MAAM,EACN,mBAAmB,EACnB,MAAM,EAEN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAM,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EACX,WAAW,EAGX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtD,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAM1E,CAAC;AAEH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAM1E,CAAC;AA8BH,eAAO,MAAM,cAAc,YACjB,aAAa,KACpB,mBAKD,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,eAAe,YAClB,aAAa,KACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcvC,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACpB,aAAa,YACZ,gBAAgB,KACxB,MASD,CAAC;AAEH,6FAA6F;AAC7F,eAAO,MAAM,aAAa,YAChB,UAAU,aACR,MAAM,WACR,MAAM,KACb,MAwBF,CAAC;AAoDF,yFAAyF;AACzF,eAAO,MAAM,YAAY,UACjB,KAAK,YACF,SAAS,aAAa,EAAE,KAChC,OAAO,CAAC,GAAG,CAyCb,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,YAAY,UAAW,GAAG,KAAG,WAAW,EA+BpD,CAAC"}