@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
package/dist/errors.js ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * A non-2xx response that carries no recognised Bevor error code
3
+ * (proxies, gateways, validation errors, unknown codes).
4
+ */
5
+ export class APIError extends Error {
6
+ status;
7
+ body;
8
+ constructor(status, body) {
9
+ super(`HTTP ${status}: ${body || "no details"}`);
10
+ this.name = "APIError";
11
+ this.status = status;
12
+ this.body = body;
13
+ }
14
+ }
15
+ /** Base class for errors the API reports with a known `code`. */
16
+ export class BaseError extends Error {
17
+ constructor(message) {
18
+ super(message ?? "");
19
+ this.name = new.target.name;
20
+ }
21
+ get details() {
22
+ return { message: this.message, code: this.code };
23
+ }
24
+ }
25
+ // base classes
26
+ /** Base class for all authentication/authorization errors. */
27
+ export class AuthException extends BaseError {
28
+ }
29
+ /** Base class for all code-related errors. */
30
+ export class CodeException extends BaseError {
31
+ }
32
+ /** Base class for all payment-related errors. */
33
+ export class PaymentException extends BaseError {
34
+ code = "payment.error";
35
+ statusCode = 402;
36
+ }
37
+ /** Too many requests. Retrying later succeeds. */
38
+ export class RateLimitException extends BaseError {
39
+ code = "app.rate_limit";
40
+ statusCode = 429;
41
+ }
42
+ // auth
43
+ export class SessionExpiredError extends AuthException {
44
+ code = "auth.session_expired";
45
+ statusCode = 401;
46
+ }
47
+ export class UnauthenticatedError extends AuthException {
48
+ code = "auth.unauthenticated";
49
+ statusCode = 401;
50
+ }
51
+ export class PaymentRequiredError extends AuthException {
52
+ code = "auth.payment_required";
53
+ statusCode = 402;
54
+ }
55
+ export class UnauthorizedError extends AuthException {
56
+ code = "auth.unauthorized";
57
+ statusCode = 403;
58
+ }
59
+ /** Authenticated, but not allowed. Re-authenticating won't fix it. */
60
+ export class InvalidPermissionsError extends AuthException {
61
+ code = "auth.invalid_permissions";
62
+ statusCode = 403;
63
+ }
64
+ export class InvalidScopeError extends AuthException {
65
+ code = "auth.invalid_scope";
66
+ statusCode = 403;
67
+ }
68
+ // general
69
+ /**
70
+ * The request is wrong for this endpoint, regardless of any resource's state.
71
+ * e.g. a required header is missing, or the project kind doesn't support the route.
72
+ */
73
+ export class BadRequestException extends BaseError {
74
+ code = "error.bad_request";
75
+ statusCode = 400;
76
+ }
77
+ /** Doesn't exist, was deleted, or isn't visible to the caller. */
78
+ export class NotFoundError extends BaseError {
79
+ code = "error.not_found";
80
+ statusCode = 404;
81
+ }
82
+ /**
83
+ * The resource's current state forbids the action. e.g. a pipeline is running,
84
+ * changes are staged, or it already exists.
85
+ */
86
+ export class InvalidStateException extends BaseError {
87
+ code = "error.invalid_state";
88
+ statusCode = 409;
89
+ }
90
+ /** Our failure, or an upstream service's. Retrying may succeed. */
91
+ export class ServerException extends BaseError {
92
+ code = "error.server";
93
+ statusCode = 500;
94
+ }
95
+ /** A plan or usage limit was reached. Retrying won't help, upgrading will. */
96
+ export class PlanLimitException extends BaseError {
97
+ code = "error.plan_limit";
98
+ statusCode = 402;
99
+ }
100
+ // domain
101
+ export class CodeUnsupportedException extends CodeException {
102
+ code = "code.unsupported";
103
+ statusCode = 400;
104
+ }
105
+ export class CodeConflictException extends CodeException {
106
+ code = "code.conflict";
107
+ statusCode = 409;
108
+ }
109
+ export class PaymentFailedException extends PaymentException {
110
+ code = "payment.failed";
111
+ statusCode = 402;
112
+ }
113
+ /** Used to reconstruct typed errors from HTTP error response bodies. */
114
+ export const ERROR_REGISTRY = {
115
+ "auth.session_expired": SessionExpiredError,
116
+ "auth.unauthorized": UnauthorizedError,
117
+ "auth.unauthenticated": UnauthenticatedError,
118
+ "auth.payment_required": PaymentRequiredError,
119
+ "auth.invalid_permissions": InvalidPermissionsError,
120
+ "auth.invalid_scope": InvalidScopeError,
121
+ "error.bad_request": BadRequestException,
122
+ "error.not_found": NotFoundError,
123
+ "error.plan_limit": PlanLimitException,
124
+ "error.invalid_state": InvalidStateException,
125
+ "error.server": ServerException,
126
+ "app.rate_limit": RateLimitException,
127
+ "payment.error": PaymentException,
128
+ "payment.failed": PaymentFailedException,
129
+ "code.unsupported": CodeUnsupportedException,
130
+ "code.conflict": CodeConflictException,
131
+ };
132
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { ResolvedStorageAccess } from "../types/graph-data.js";
2
+ import type { EdgeType, ID } from "../types/literals.js";
3
+ import type { Graph } from "./graph.js";
4
+ /** JSON form of a `CallNode`, as returned by `toDict()` and the call-chain endpoint. */
5
+ export interface CallNodeDict {
6
+ node_id: ID | null;
7
+ short_id: string | null;
8
+ name: string | null;
9
+ node_type: string | null;
10
+ edge_id: ID | null;
11
+ edge_type: EdgeType | null;
12
+ low_level_name: string | null;
13
+ target_effect_id: ID | null;
14
+ is_conditional: boolean;
15
+ is_arg: boolean;
16
+ is_cyclic: boolean;
17
+ src_field_names: string[];
18
+ dst_field_names: string[];
19
+ resolved_bindings: ResolvedStorageAccess[];
20
+ children: CallNodeDict[];
21
+ }
22
+ export declare class CallNode {
23
+ #private;
24
+ nodeId: ID | null;
25
+ shortId: string | null;
26
+ name: string | null;
27
+ nodeType: string | null;
28
+ edgeId: ID | null;
29
+ edgeType: EdgeType | null;
30
+ lowLevelName: string | null;
31
+ targetEffectId: ID | null;
32
+ isConditional: boolean;
33
+ isArg: boolean;
34
+ isCyclic: boolean;
35
+ srcFieldNames: string[];
36
+ dstFieldNames: string[];
37
+ resolvedBindings: ResolvedStorageAccess[];
38
+ children: CallNode[];
39
+ constructor(init?: Partial<CallNode>);
40
+ /** A shallow copy, like `dataclasses.replace`. */
41
+ clone(overrides?: Partial<CallNode>): CallNode;
42
+ toDict(): CallNodeDict;
43
+ static fromDict(data: Partial<CallNodeDict>): CallNode;
44
+ toText(): string;
45
+ static build(graph: Graph, nodeId: ID): CallNode;
46
+ }
47
+ //# sourceMappingURL=call-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-node.d.ts","sourceRoot":"","sources":["../../src/graph/call-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,qBAAqB,EAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAiKxC,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,EAAE,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,QAAQ,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,qBAAa,QAAQ;;IACpB,MAAM,EAAE,EAAE,GAAG,IAAI,CAAQ;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,EAAE,GAAG,IAAI,CAAQ;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAQ;IACjC,aAAa,UAAS;IACtB,KAAK,UAAS;IACd,QAAQ,UAAS;IACjB,aAAa,EAAE,MAAM,EAAE,CAAM;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAM;IAC7B,gBAAgB,EAAE,qBAAqB,EAAE,CAAM;IAC/C,QAAQ,EAAE,QAAQ,EAAE,CAAM;IAE1B,YAAY,IAAI,GAAE,OAAO,CAAC,QAAQ,CAAM,EAEvC;IAED,kDAAkD;IAClD,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,QAAQ,CAAM,GAAG,QAAQ,CAEjD;IAED,MAAM,IAAI,YAAY,CAoBrB;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,QAAQ,CAqBrD;IAkCD,MAAM,IAAI,MAAM,CAwBf;IAkBD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,CAiI/C;CACD"}
@@ -0,0 +1,338 @@
1
+ const SKIP_EDGES = new Set([
2
+ "overrides",
3
+ "inherits",
4
+ "has_ref_comment",
5
+ "initializes",
6
+ ]);
7
+ const CALL_EDGES = new Set(["calls", "calls_external"]);
8
+ const join = (...parts) => parts.filter((part) => Boolean(part)).join(".") || null;
9
+ const isParameterFact = (fact) => "start_byte" in fact;
10
+ /**
11
+ * One function invocation: its stored storage facts, plus what its storage parameters are bound to
12
+ * by the call that invoked it.
13
+ */
14
+ class Frame {
15
+ graph;
16
+ node;
17
+ paramSlots;
18
+ path;
19
+ /** the function's edges by position, including those owned by condition nodes nested in it */
20
+ refs = new Map();
21
+ accesses = [];
22
+ #byPos = new Map();
23
+ constructor(graph, node, paramSlots, path) {
24
+ this.graph = graph;
25
+ this.node = node;
26
+ this.paramSlots = paramSlots;
27
+ this.path = path;
28
+ const stack = [node.id];
29
+ while (stack.length) {
30
+ for (const edge of graph.getEdgesForNode(stack.pop(), {
31
+ direction: "out",
32
+ })) {
33
+ this.refs.set(edge.src_start_pos, edge);
34
+ if (edge.edge_type === "has_condition" && edge.dst_id)
35
+ stack.push(edge.dst_id);
36
+ }
37
+ }
38
+ for (const fact of node.parameters ?? []) {
39
+ for (const slot of this.resolve(fact, fact.field)) {
40
+ const access = {
41
+ edge_type: fact.is_written ? "writes" : "reads",
42
+ start_byte: fact.start_byte,
43
+ bound_to_node_id: slot.nodeId,
44
+ bound_to_short_id: graph.getNode(slot.nodeId).short_id,
45
+ bound_to_name: slot.name,
46
+ field: slot.field,
47
+ };
48
+ this.accesses.push(access);
49
+ const pos = fact.field_start_byte ?? fact.start_byte;
50
+ const atPos = this.#byPos.get(pos);
51
+ if (atPos)
52
+ atPos.push(access);
53
+ else
54
+ this.#byPos.set(pos, [access]);
55
+ }
56
+ }
57
+ }
58
+ /** The frame `call`'s callee runs in, bound by this frame's resolution of its arguments. */
59
+ callee(call) {
60
+ if (!call.dst_id || this.path.includes(call.dst_id))
61
+ return null;
62
+ return new Frame(this.graph, this.graph.getNode(call.dst_id), this.bind(call), [...this.path, this.node.id]);
63
+ }
64
+ /** Concrete slots for a stored root, with `field` appended to the path. */
65
+ resolve(fact, field) {
66
+ // an access fact is rooted in its own `param_index`; on a binding, `param_index` is the
67
+ // *callee's* parameter and the root is `bound_to_param_index`
68
+ const paramIndex = isParameterFact(fact)
69
+ ? fact.param_index
70
+ : fact.bound_to_param_index;
71
+ if (paramIndex !== null && paramIndex !== undefined) {
72
+ return (this.paramSlots.get(paramIndex) ?? []).map((slot) => ({
73
+ ...slot,
74
+ field: join(slot.field, field),
75
+ }));
76
+ }
77
+ if (fact.bound_to_ref_pos === null || fact.bound_to_ref_pos === undefined)
78
+ return [];
79
+ const ref = this.refs.get(fact.bound_to_ref_pos);
80
+ if (!ref?.dst_id)
81
+ return [];
82
+ if (fact.bound_to_return_index === null ||
83
+ fact.bound_to_return_index === undefined) {
84
+ // a reference to a state variable: the edge's destination is the root
85
+ const target = this.graph.getNode(ref.dst_id);
86
+ return [{ nodeId: target.id, name: target.name, field: field ?? null }];
87
+ }
88
+ // the return slot of a call: what the callee returns, bound by this call's arguments
89
+ const callee = this.callee(ref);
90
+ if (callee === null)
91
+ return [];
92
+ const out = [];
93
+ for (const ret of callee.node.returns ?? []) {
94
+ if (ret.param_ind !== fact.bound_to_return_index)
95
+ continue;
96
+ for (const slot of callee.resolve(ret, ret.bound_to_field)) {
97
+ out.push({ ...slot, field: join(slot.field, field) });
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ /** What each storage parameter of `call`'s callee is bound to, resolved in this frame. */
103
+ bind(call) {
104
+ const out = new Map();
105
+ for (const binding of call.call_bindings ?? []) {
106
+ const slots = this.resolve(binding, binding.bound_to_field);
107
+ const existing = out.get(binding.param_index);
108
+ if (existing)
109
+ existing.push(...slots);
110
+ else
111
+ out.set(binding.param_index, slots);
112
+ }
113
+ return out;
114
+ }
115
+ at(pos) {
116
+ return this.#byPos.get(pos) ?? [];
117
+ }
118
+ }
119
+ export class CallNode {
120
+ nodeId = null;
121
+ shortId = null;
122
+ name = null;
123
+ nodeType = null;
124
+ edgeId = null;
125
+ edgeType = null;
126
+ lowLevelName = null;
127
+ targetEffectId = null;
128
+ isConditional = false;
129
+ isArg = false;
130
+ isCyclic = false;
131
+ srcFieldNames = [];
132
+ dstFieldNames = [];
133
+ resolvedBindings = [];
134
+ children = [];
135
+ constructor(init = {}) {
136
+ Object.assign(this, init);
137
+ }
138
+ /** A shallow copy, like `dataclasses.replace`. */
139
+ clone(overrides = {}) {
140
+ return new CallNode({ ...this, ...overrides });
141
+ }
142
+ toDict() {
143
+ return {
144
+ node_id: this.nodeId,
145
+ short_id: this.shortId,
146
+ name: this.name,
147
+ node_type: this.nodeType,
148
+ edge_id: this.edgeId,
149
+ edge_type: this.edgeType,
150
+ low_level_name: this.lowLevelName,
151
+ target_effect_id: this.targetEffectId,
152
+ is_conditional: this.isConditional,
153
+ is_arg: this.isArg,
154
+ is_cyclic: this.isCyclic,
155
+ src_field_names: [...this.srcFieldNames],
156
+ dst_field_names: [...this.dstFieldNames],
157
+ resolved_bindings: this.resolvedBindings.map((binding) => ({
158
+ ...binding,
159
+ })),
160
+ children: this.children.map((child) => child.toDict()),
161
+ };
162
+ }
163
+ static fromDict(data) {
164
+ return new CallNode({
165
+ nodeId: data.node_id ?? null,
166
+ shortId: data.short_id ?? null,
167
+ name: data.name ?? null,
168
+ nodeType: data.node_type ?? null,
169
+ edgeId: data.edge_id ?? null,
170
+ edgeType: data.edge_type ?? null,
171
+ lowLevelName: data.low_level_name ?? null,
172
+ targetEffectId: data.target_effect_id ?? null,
173
+ isConditional: Boolean(data.is_conditional),
174
+ isArg: Boolean(data.is_arg),
175
+ isCyclic: Boolean(data.is_cyclic),
176
+ srcFieldNames: [...(data.src_field_names ?? [])],
177
+ dstFieldNames: [...(data.dst_field_names ?? [])],
178
+ children: (data.children ?? []).map((child) => CallNode.fromDict(child)),
179
+ resolvedBindings: (data.resolved_bindings ?? []).map((binding) => ({
180
+ ...binding,
181
+ field: binding.field ?? null,
182
+ })),
183
+ });
184
+ }
185
+ // text
186
+ #label() {
187
+ if (this.shortId)
188
+ return `${this.name || this.lowLevelName || "?"} [${this.shortId}]`;
189
+ return `low-level method ${this.lowLevelName || this.name || "?"}`;
190
+ }
191
+ #line(parent) {
192
+ const label = this.#label();
193
+ let head = label;
194
+ if (this.edgeType) {
195
+ const verb = this.edgeType.replaceAll("_", " ");
196
+ // an input runs exactly when its effect does: only show its own condition if it differs
197
+ const inheritsCondition = this.isArg && parent?.isConditional === true;
198
+ if (parent?.edgeType === "has_condition" && !this.isConditional) {
199
+ head = `in condition ${verb} ${label}`;
200
+ }
201
+ else if (this.isConditional && !inheritsCondition) {
202
+ head = `conditionally ${verb} ${label}`;
203
+ }
204
+ else {
205
+ head = `${verb} ${label}`;
206
+ }
207
+ }
208
+ const tail = [];
209
+ if (this.srcFieldNames.length)
210
+ tail.push(`src: [${this.srcFieldNames.join(",")}]`);
211
+ if (this.dstFieldNames.length)
212
+ tail.push(`dst: [${this.dstFieldNames.join(",")}]`);
213
+ return tail.length ? `${head} ${tail.join(" ")}` : head;
214
+ }
215
+ toText() {
216
+ const lines = [];
217
+ const visit = (cn, depth, parent) => {
218
+ const line = cn.#line(parent);
219
+ lines.push(" ".repeat(depth) + (cn.isCyclic ? `[CYCLIC] ${line}` : line));
220
+ const args = cn.children.filter((child) => child.isArg);
221
+ if (args.length) {
222
+ lines.push(" ".repeat(depth + 1) +
223
+ (cn.edgeType && CALL_EDGES.has(cn.edgeType) ? "args" : "using"));
224
+ for (const child of args)
225
+ visit(child, depth + 2, cn);
226
+ }
227
+ for (const child of cn.children)
228
+ if (!child.isArg)
229
+ visit(child, depth + 1, cn);
230
+ };
231
+ visit(this, 0, null);
232
+ return lines.join("\n");
233
+ }
234
+ // build
235
+ /** Points a struct-typed access at the concrete storage it hits. */
236
+ #resolveTo(access) {
237
+ this.edgeType = access.edge_type;
238
+ this.nodeId = access.bound_to_node_id;
239
+ this.shortId = access.bound_to_short_id;
240
+ this.name = access.bound_to_name;
241
+ this.dstFieldNames = access.field ? [access.field] : [];
242
+ }
243
+ static #prune(cn) {
244
+ cn.children = cn.children.filter((child) => CallNode.#prune(child));
245
+ return !(cn.edgeType === "has_condition" && cn.children.length === 0);
246
+ }
247
+ static build(graph, nodeId) {
248
+ const childFrame = (edge, frame) => {
249
+ // a condition node belongs to the same function instance
250
+ if (edge.edge_type === "has_condition")
251
+ return frame;
252
+ if (CALL_EDGES.has(edge.edge_type))
253
+ return frame.callee(edge);
254
+ return null;
255
+ };
256
+ /**
257
+ * One node per concrete slot this struct-typed access may hit; itself if unresolved. A resolved
258
+ * node keeps its inputs and is expanded as its new target.
259
+ */
260
+ const resolved = (child, accesses, path) => {
261
+ if (accesses.length === 0)
262
+ return [child];
263
+ return accesses.map((access) => {
264
+ const cn = child.clone({
265
+ children: child.children.filter((c) => c.isArg),
266
+ });
267
+ cn.#resolveTo(access);
268
+ cn.children.push(...walk(access.bound_to_node_id, null, null, path, new Map())
269
+ .children);
270
+ return cn;
271
+ });
272
+ };
273
+ const attachArgs = (cn, edge, path, callerArgs) => {
274
+ // inputs run in the caller's frame, with the caller's stack
275
+ if (edge === null)
276
+ return;
277
+ for (const [argEdge, argFrame] of callerArgs.get(edge.id) ?? []) {
278
+ const child = walk(argEdge.dst_id ?? null, argEdge, childFrame(argEdge, argFrame), path, callerArgs, true);
279
+ cn.children.push(...resolved(child, argFrame.at(argEdge.src_start_pos), path));
280
+ }
281
+ };
282
+ /** `frame` is the frame this node's body runs in: a fresh one for a callee, the enclosing one for a condition node. */
283
+ const walk = (nid, edge, frame, path, callerArgs, isArg = false) => {
284
+ const node = nid ? graph.getNode(nid) : null;
285
+ const lowLevelName = edge?.low_level_name ?? null;
286
+ const cn = new CallNode({
287
+ nodeId: nid,
288
+ shortId: node?.short_id ?? null,
289
+ name: node !== null ? node.name : lowLevelName,
290
+ nodeType: node?.node_type ?? null,
291
+ edgeId: edge?.id ?? null,
292
+ edgeType: edge?.edge_type ?? null,
293
+ lowLevelName,
294
+ targetEffectId: edge?.target_effect_id ?? null,
295
+ isConditional: edge ? Boolean(edge.is_conditional) : false,
296
+ isArg,
297
+ isCyclic: nid ? path.includes(nid) : false,
298
+ srcFieldNames: [...(edge?.src_field_names ?? [])],
299
+ dstFieldNames: [...(edge?.dst_field_names ?? [])],
300
+ });
301
+ if (cn.isCyclic || node === null) {
302
+ attachArgs(cn, edge, path, callerArgs);
303
+ return cn;
304
+ }
305
+ if (cn.edgeType && SKIP_EDGES.has(cn.edgeType))
306
+ return cn;
307
+ // no caller context: an entrypoint, or a node started from directly
308
+ const bodyFrame = frame ?? new Frame(graph, node, new Map(), path);
309
+ const childEdges = graph.getEdgesForNode(node.id, { direction: "out" });
310
+ // inputs belong to this frame: they're walked under the effect they feed, with this frame
311
+ const myArgs = new Map();
312
+ for (const childEdge of childEdges) {
313
+ if (!childEdge.target_effect_id)
314
+ continue;
315
+ const entries = myArgs.get(childEdge.target_effect_id);
316
+ if (entries)
317
+ entries.push([childEdge, bodyFrame]);
318
+ else
319
+ myArgs.set(childEdge.target_effect_id, [[childEdge, bodyFrame]]);
320
+ }
321
+ const stack = [...path, node.id];
322
+ for (const childEdge of childEdges) {
323
+ if (childEdge.target_effect_id)
324
+ continue;
325
+ const child = walk(childEdge.dst_id ?? null, childEdge, childFrame(childEdge, bodyFrame), stack, myArgs);
326
+ cn.children.push(...resolved(child, bodyFrame.at(childEdge.src_start_pos), stack));
327
+ }
328
+ if (edge === null || edge.edge_type !== "has_condition")
329
+ cn.resolvedBindings = bodyFrame.accesses;
330
+ attachArgs(cn, edge, path, callerArgs);
331
+ return cn;
332
+ };
333
+ const root = walk(nodeId, null, null, [], new Map());
334
+ CallNode.#prune(root);
335
+ return root;
336
+ }
337
+ }
338
+ //# sourceMappingURL=call-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-node.js","sourceRoot":"","sources":["../../src/graph/call-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { EdgeType, ID } from "../types/literals.js";
2
+ import type { GraphSnapshotEdge, GraphSnapshotNode } from "../types/responses.js";
3
+ import type { Graph } from "./graph.js";
4
+ type Frame = readonly [nodeId: ID, used: ReadonlySet<ID>];
5
+ /**
6
+ * A movable position in the graph that remembers its path.
7
+ *
8
+ * Full execution-path DFS:
9
+ * ```ts
10
+ * const cursor = graph.cursor(nodeId);
11
+ * while (true) {
12
+ * if (cursor.gotoFirstChild()) continue;
13
+ * if (cursor.gotoNextSibling()) continue;
14
+ * if (!cursor.back()) break;
15
+ * }
16
+ * ```
17
+ *
18
+ * Adding `if (cursor.gotoFirstParent()) continue;` before `back()` also walks out of the execution
19
+ * path into cross pathways ("what else writes this", "where else is this called"). Use `peekUp()`,
20
+ * or pass an `edgeType` to only allow that for certain edges.
21
+ */
22
+ export declare class GraphCursor {
23
+ readonly graph: Graph;
24
+ nodeId: ID;
25
+ /** Edges taken from the current position, on this path. */
26
+ used: ReadonlySet<ID>;
27
+ stack: readonly Frame[];
28
+ constructor(graph: Graph, nodeId: ID);
29
+ get node(): GraphSnapshotNode;
30
+ get depth(): number;
31
+ get path(): ID[];
32
+ get isCycle(): boolean;
33
+ /**
34
+ * Takes the first unused outgoing edge. Moves onto its destination when it has one; an edge
35
+ * without a destination isn't a real node, so the cursor stays put but the edge is consumed.
36
+ */
37
+ gotoFirstChild(): GraphSnapshotEdge | null;
38
+ gotoFirstParent(edgeType?: EdgeType | null): GraphSnapshotEdge | null;
39
+ gotoNextSibling(): GraphSnapshotEdge | null;
40
+ back(): boolean;
41
+ peekUp(): [GraphSnapshotEdge, GraphSnapshotNode][];
42
+ peekDown(): [GraphSnapshotEdge, GraphSnapshotNode][];
43
+ render(source?: string | null): string;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/graph/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EACX,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,KAAK,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1D;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAW;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,MAAM,EAAE,EAAE,CAAC;IACX,2DAA2D;IAC3D,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAa;IAClC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAM;IAE7B,YAAY,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAGnC;IAED,IAAI,IAAI,IAAI,iBAAiB,CAE5B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,IAAI,IAAI,EAAE,EAAE,CAEf;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,cAAc,IAAI,iBAAiB,GAAG,IAAI,CAezC;IAED,eAAe,CAAC,QAAQ,GAAE,QAAQ,GAAG,IAAW,GAAG,iBAAiB,GAAG,IAAI,CAc1E;IAED,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAe1C;IAED,IAAI,IAAI,OAAO,CAMd;IAED,MAAM,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,CAMjD;IAED,QAAQ,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,CAUnD;IAED,MAAM,CAAC,MAAM,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAuC3C;CACD"}