@hookwarden/engine 0.0.1 → 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 (149) hide show
  1. package/dist/adapters/django.d.ts +4 -0
  2. package/dist/adapters/django.d.ts.map +1 -0
  3. package/dist/adapters/django.js +148 -0
  4. package/dist/adapters/django.js.map +1 -0
  5. package/dist/adapters/fastapi.d.ts +4 -0
  6. package/dist/adapters/fastapi.d.ts.map +1 -0
  7. package/dist/adapters/fastapi.js +118 -0
  8. package/dist/adapters/fastapi.js.map +1 -0
  9. package/dist/adapters/index.d.ts +9 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +10 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/nextjs.d.ts +4 -0
  14. package/dist/adapters/nextjs.d.ts.map +1 -0
  15. package/dist/adapters/nextjs.js +82 -0
  16. package/dist/adapters/nextjs.js.map +1 -0
  17. package/dist/evaluate.d.ts +6 -0
  18. package/dist/evaluate.d.ts.map +1 -0
  19. package/dist/evaluate.js +108 -0
  20. package/dist/evaluate.js.map +1 -0
  21. package/dist/evaluator/index.d.ts +4 -0
  22. package/dist/evaluator/index.d.ts.map +1 -0
  23. package/dist/evaluator/index.js +4 -0
  24. package/dist/evaluator/index.js.map +1 -0
  25. package/dist/evaluator/matchers.d.ts +13 -0
  26. package/dist/evaluator/matchers.d.ts.map +1 -0
  27. package/dist/evaluator/matchers.js +124 -0
  28. package/dist/evaluator/matchers.js.map +1 -0
  29. package/dist/evaluator/parse-error.d.ts +4 -0
  30. package/dist/evaluator/parse-error.d.ts.map +1 -0
  31. package/dist/evaluator/parse-error.js +46 -0
  32. package/dist/evaluator/parse-error.js.map +1 -0
  33. package/dist/evaluator/path-severity-overrides.d.ts +4 -0
  34. package/dist/evaluator/path-severity-overrides.d.ts.map +1 -0
  35. package/dist/evaluator/path-severity-overrides.js +29 -0
  36. package/dist/evaluator/path-severity-overrides.js.map +1 -0
  37. package/dist/evaluator/visit.d.ts +16 -0
  38. package/dist/evaluator/visit.d.ts.map +1 -0
  39. package/dist/evaluator/visit.js +96 -0
  40. package/dist/evaluator/visit.js.map +1 -0
  41. package/dist/findings/fingerprint.d.ts +22 -0
  42. package/dist/findings/fingerprint.d.ts.map +1 -0
  43. package/dist/findings/fingerprint.js +39 -0
  44. package/dist/findings/fingerprint.js.map +1 -0
  45. package/dist/findings/index.d.ts +3 -0
  46. package/dist/findings/index.d.ts.map +1 -0
  47. package/dist/findings/index.js +4 -0
  48. package/dist/findings/index.js.map +1 -0
  49. package/dist/findings/webcrypto.d.ts +2 -0
  50. package/dist/findings/webcrypto.d.ts.map +1 -0
  51. package/dist/findings/webcrypto.js +15 -0
  52. package/dist/findings/webcrypto.js.map +1 -0
  53. package/dist/index.d.ts +8 -8
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +9 -4
  56. package/dist/index.js.map +1 -1
  57. package/dist/model/build.d.ts +12 -0
  58. package/dist/model/build.d.ts.map +1 -0
  59. package/dist/model/build.js +154 -0
  60. package/dist/model/build.js.map +1 -0
  61. package/dist/model/catalog.d.ts +17 -0
  62. package/dist/model/catalog.d.ts.map +1 -0
  63. package/dist/model/catalog.js +303 -0
  64. package/dist/model/catalog.js.map +1 -0
  65. package/dist/model/evidence.d.ts +18 -0
  66. package/dist/model/evidence.d.ts.map +1 -0
  67. package/dist/model/evidence.js +114 -0
  68. package/dist/model/evidence.js.map +1 -0
  69. package/dist/model/index.d.ts +6 -0
  70. package/dist/model/index.d.ts.map +1 -0
  71. package/dist/model/index.js +7 -0
  72. package/dist/model/index.js.map +1 -0
  73. package/dist/model/middleware.d.ts +10 -0
  74. package/dist/model/middleware.d.ts.map +1 -0
  75. package/dist/model/middleware.js +140 -0
  76. package/dist/model/middleware.js.map +1 -0
  77. package/dist/model/reachability.d.ts +11 -0
  78. package/dist/model/reachability.d.ts.map +1 -0
  79. package/dist/model/reachability.js +260 -0
  80. package/dist/model/reachability.js.map +1 -0
  81. package/dist/parsers/babel.d.ts +11 -0
  82. package/dist/parsers/babel.d.ts.map +1 -0
  83. package/dist/parsers/babel.js +121 -0
  84. package/dist/parsers/babel.js.map +1 -0
  85. package/dist/parsers/index.d.ts +6 -0
  86. package/dist/parsers/index.d.ts.map +1 -0
  87. package/dist/parsers/index.js +7 -0
  88. package/dist/parsers/index.js.map +1 -0
  89. package/dist/parsers/literals.d.ts +4 -0
  90. package/dist/parsers/literals.d.ts.map +1 -0
  91. package/dist/parsers/literals.js +37 -0
  92. package/dist/parsers/literals.js.map +1 -0
  93. package/dist/parsers/python-literals.d.ts +5 -0
  94. package/dist/parsers/python-literals.d.ts.map +1 -0
  95. package/dist/parsers/python-literals.js +62 -0
  96. package/dist/parsers/python-literals.js.map +1 -0
  97. package/dist/parsers/python-loader.d.ts +9 -0
  98. package/dist/parsers/python-loader.d.ts.map +1 -0
  99. package/dist/parsers/python-loader.js +16 -0
  100. package/dist/parsers/python-loader.js.map +1 -0
  101. package/dist/parsers/python.d.ts +8 -0
  102. package/dist/parsers/python.d.ts.map +1 -0
  103. package/dist/parsers/python.js +125 -0
  104. package/dist/parsers/python.js.map +1 -0
  105. package/dist/parsers/walk.d.ts +15 -0
  106. package/dist/parsers/walk.d.ts.map +1 -0
  107. package/dist/parsers/walk.js +66 -0
  108. package/dist/parsers/walk.js.map +1 -0
  109. package/dist/redaction/index.d.ts +3 -0
  110. package/dist/redaction/index.d.ts.map +1 -0
  111. package/dist/redaction/index.js +2 -0
  112. package/dist/redaction/index.js.map +1 -0
  113. package/dist/redaction/structural.d.ts +14 -0
  114. package/dist/redaction/structural.d.ts.map +1 -0
  115. package/dist/redaction/structural.js +37 -0
  116. package/dist/redaction/structural.js.map +1 -0
  117. package/dist/types/config.d.ts +7 -0
  118. package/dist/types/config.d.ts.map +1 -0
  119. package/dist/types/config.js +6 -0
  120. package/dist/types/config.js.map +1 -0
  121. package/dist/types/finding.d.ts +32 -0
  122. package/dist/types/finding.d.ts.map +1 -0
  123. package/dist/types/finding.js +12 -0
  124. package/dist/types/finding.js.map +1 -0
  125. package/dist/types/handler.d.ts +39 -0
  126. package/dist/types/handler.d.ts.map +1 -0
  127. package/dist/types/handler.js +7 -0
  128. package/dist/types/handler.js.map +1 -0
  129. package/dist/types/index.d.ts +7 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +4 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/project-model.d.ts +42 -0
  134. package/dist/types/project-model.d.ts.map +1 -0
  135. package/dist/types/project-model.js +5 -0
  136. package/dist/types/project-model.js.map +1 -0
  137. package/dist/types/rule-set.d.ts +42 -0
  138. package/dist/types/rule-set.d.ts.map +1 -0
  139. package/dist/types/rule-set.js +6 -0
  140. package/dist/types/rule-set.js.map +1 -0
  141. package/dist/types/scan-result.d.ts +19 -0
  142. package/dist/types/scan-result.d.ts.map +1 -0
  143. package/dist/types/scan-result.js +8 -0
  144. package/dist/types/scan-result.js.map +1 -0
  145. package/dist/version.d.ts +2 -0
  146. package/dist/version.d.ts.map +1 -0
  147. package/dist/version.js +5 -0
  148. package/dist/version.js.map +1 -0
  149. package/package.json +12 -1
@@ -0,0 +1,6 @@
1
+ export { type BuildProjectModelInput, buildProjectModel } from "./build.js";
2
+ export { type CandidateHandler, detectCatalogHandlers } from "./catalog.js";
3
+ export { type ComputeEvidenceInput, type ComputeEvidenceOutput, computeEvidence, locationFromCandidate, } from "./evidence.js";
4
+ export { type ExtractMiddlewareInput, extractMiddlewareChain, } from "./middleware.js";
5
+ export { type ComputeReachabilityInput, computeReachableSymbols, } from "./reachability.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,KAAK,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,sBAAsB,EAC3B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,wBAAwB,EAC7B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // model/ barrel — Plan 06a + 06b combined surface.
2
+ export { buildProjectModel } from "./build.js";
3
+ export { detectCatalogHandlers } from "./catalog.js";
4
+ export { computeEvidence, locationFromCandidate, } from "./evidence.js";
5
+ export { extractMiddlewareChain, } from "./middleware.js";
6
+ export { computeReachableSymbols, } from "./reachability.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAA+B,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAyB,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAGL,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ResolvedMiddleware } from "../types/handler.js";
2
+ import type { ImportEdge, ParsedFile } from "../types/project-model.js";
3
+ import type { CandidateHandler } from "./catalog.js";
4
+ export interface ExtractMiddlewareInput {
5
+ readonly handler: CandidateHandler;
6
+ readonly parsedFile: ParsedFile;
7
+ readonly imports: ReadonlyArray<ImportEdge>;
8
+ }
9
+ export declare function extractMiddlewareChain(input: ExtractMiddlewareInput): ReadonlyArray<ResolvedMiddleware>;
10
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/model/middleware.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,sBAAsB,GAC5B,aAAa,CAAC,kBAAkB,CAAC,CAgCnC"}
@@ -0,0 +1,140 @@
1
+ // D-36 middleware_chain population. Express + Hono + Fastify covered.
2
+ // Flask middleware chains are decorator-based and rare on webhook routes; chain stays [] for v1
3
+ // (deferred per Plan 06b's known limitations; rule authors who need Flask middleware ordering
4
+ // can use a TS predicate via the D-28 escape hatch).
5
+ import { walkBabelAst } from "../parsers/walk.js";
6
+ export function extractMiddlewareChain(input) {
7
+ const { handler, parsedFile, imports } = input;
8
+ if (parsedFile.parse_error !== null || parsedFile.raw_ast === null)
9
+ return [];
10
+ // Decorator-based middleware on Python webhook handlers is rare; v1 leaves chain empty.
11
+ // Phase 6 corpus run will surface whether this is actually needed; if so, lift to v1.x.
12
+ if (handler.framework === "flask" ||
13
+ handler.framework === "django" ||
14
+ handler.framework === "fastapi") {
15
+ return [];
16
+ }
17
+ if (parsedFile.dialect !== "babel")
18
+ return [];
19
+ const ast = parsedFile.raw_ast;
20
+ const globalUses = [];
21
+ const routeArgs = [];
22
+ walkBabelAst(ast, (node) => {
23
+ const useEntry = matchAppUseRegistration(node, handler, imports);
24
+ if (useEntry)
25
+ globalUses.push(useEntry);
26
+ const routeMiddleware = matchRouteArgsMiddleware(node, handler, imports);
27
+ routeArgs.push(...routeMiddleware);
28
+ });
29
+ // Final chain: global app.use(...) registrations (in source order) followed by per-route
30
+ // middleware. Position is renumbered so the chain reads as "first middleware to run = position 0".
31
+ const merged = [];
32
+ for (const m of [...globalUses, ...routeArgs]) {
33
+ merged.push({ ...m, position: merged.length });
34
+ }
35
+ return merged;
36
+ }
37
+ // Match `app.use(...)` registrations registered before the handler's source location.
38
+ function matchAppUseRegistration(node, handler, imports) {
39
+ if (node.type !== "ExpressionStatement")
40
+ return null;
41
+ const expr = node.expression;
42
+ if (expr.type !== "CallExpression")
43
+ return null;
44
+ const callee = expr.callee;
45
+ if (callee.type !== "MemberExpression")
46
+ return null;
47
+ if (callee.property.type !== "Identifier" || callee.property.name !== "use")
48
+ return null;
49
+ const loc = nodeLocation(node);
50
+ if (loc.line >= handler.location.line)
51
+ return null; // only middleware registered before the handler
52
+ const arg = expr.arguments[0];
53
+ if (!arg)
54
+ return null;
55
+ const name = identifierOrMemberName(arg);
56
+ if (!name)
57
+ return null;
58
+ return {
59
+ name,
60
+ import_source: resolveImportSource(name, imports),
61
+ position: 0, // renumbered after collection
62
+ location: loc,
63
+ };
64
+ }
65
+ // Match per-route middleware: `app.post('/x', mw1, mw2, handler)` — every CallExpression arg
66
+ // between the path (index 0) and handler (final) is middleware.
67
+ function matchRouteArgsMiddleware(node, handler, imports) {
68
+ if (node.type !== "ExpressionStatement")
69
+ return [];
70
+ const expr = node.expression;
71
+ if (expr.type !== "CallExpression")
72
+ return [];
73
+ const callee = expr.callee;
74
+ if (callee.type !== "MemberExpression")
75
+ return [];
76
+ if (callee.property.type !== "Identifier")
77
+ return [];
78
+ if (expr.arguments.length < 3)
79
+ return []; // need: path, ...middleware, handler
80
+ // Match this call site to our handler by source location.
81
+ const loc = nodeLocation(node);
82
+ if (loc.line !== handler.location.line || loc.col !== handler.location.col)
83
+ return [];
84
+ const out = [];
85
+ // Middleware is args[1..args.length-2] (path is [0], handler is final).
86
+ for (let i = 1; i < expr.arguments.length - 1; i++) {
87
+ const arg = expr.arguments[i];
88
+ if (!arg)
89
+ continue;
90
+ if (arg.type === "SpreadElement" || arg.type === "ArgumentPlaceholder")
91
+ continue;
92
+ const name = identifierOrMemberName(arg);
93
+ if (!name)
94
+ continue;
95
+ out.push({
96
+ name,
97
+ import_source: resolveImportSource(name, imports),
98
+ position: i - 1, // renumbered after collection
99
+ location: nodeLocation(arg),
100
+ });
101
+ }
102
+ return out;
103
+ }
104
+ function identifierOrMemberName(node) {
105
+ if (node.type === "Identifier")
106
+ return node.name;
107
+ if (node.type === "MemberExpression") {
108
+ const obj = identifierOrMemberName(node.object);
109
+ if (obj && node.property.type === "Identifier")
110
+ return `${obj}.${node.property.name}`;
111
+ return null;
112
+ }
113
+ if (node.type === "CallExpression") {
114
+ // e.g. `express.json()` — collapse to the callee chain.
115
+ return identifierOrMemberName(node.callee);
116
+ }
117
+ return null;
118
+ }
119
+ function nodeLocation(node) {
120
+ const loc = node.loc;
121
+ return {
122
+ line: loc?.start.line ?? 1,
123
+ col: (loc?.start.column ?? 0) + 1,
124
+ end_line: loc?.end.line ?? 1,
125
+ end_col: (loc?.end.column ?? 0) + 1,
126
+ };
127
+ }
128
+ function resolveImportSource(qualifiedName, imports) {
129
+ const root = qualifiedName.split(".")[0];
130
+ if (!root)
131
+ return null;
132
+ for (const edge of imports) {
133
+ for (const n of edge.imported_names) {
134
+ if (n.local === root)
135
+ return edge.to_module;
136
+ }
137
+ }
138
+ return null;
139
+ }
140
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/model/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ReachableSymbol } from "../types/handler.js";
2
+ import type { ImportEdge, ParsedFile } from "../types/project-model.js";
3
+ export interface ComputeReachabilityInput {
4
+ readonly handler_body_node: unknown;
5
+ readonly handler_file: ParsedFile;
6
+ readonly all_files: ReadonlyArray<ParsedFile>;
7
+ readonly imports: ReadonlyArray<ImportEdge>;
8
+ readonly maxDepth: number;
9
+ }
10
+ export declare function computeReachableSymbols(input: ComputeReachabilityInput): ReadonlyArray<ReachableSymbol>;
11
+ //# sourceMappingURL=reachability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reachability.d.ts","sourceRoot":"","sources":["../../src/model/reachability.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAiBxE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,wBAAwB,GAC9B,aAAa,CAAC,eAAe,CAAC,CA0DhC"}
@@ -0,0 +1,260 @@
1
+ // D-34: bounded-depth reachable symbols, with cross-file traversal via ImportEdge.
2
+ // Walks the import graph + intra-file call graph + middleware chain to a configurable depth
3
+ // (default 3 hops). Catches: middleware verification, util-extracted verification,
4
+ // decorator-applied verification. Misses: dynamic dispatch, reflection — surfaced as
5
+ // `manual-review` candidates by rules (PITFALLS #3 graded-confidence policy).
6
+ //
7
+ // Caps:
8
+ // - maxDepth (caller-supplied via config.reachability_max_depth; default 3)
9
+ // - MAX_VISITED_SYMBOLS = 1000 per handler (DoS defense — threat-model T-02-06b-04)
10
+ import { walkBabelAst } from "../parsers/walk.js";
11
+ const MAX_VISITED_SYMBOLS = 1000;
12
+ export function computeReachableSymbols(input) {
13
+ const visited = new Set();
14
+ const out = [];
15
+ // Index every file's top-level symbols so cross-file traversal can resolve `mod.name` → AST.
16
+ const symbolTables = new Map();
17
+ for (const f of input.all_files) {
18
+ if (f.parse_error !== null || f.raw_ast === null)
19
+ continue;
20
+ symbolTables.set(f.file_path, { file: f, symbols: buildSymbolTable(f) });
21
+ }
22
+ const record = (entry) => {
23
+ if (visited.has(entry.qualified_name))
24
+ return false;
25
+ if (visited.size >= MAX_VISITED_SYMBOLS)
26
+ return false; // T-02-06b-04 DoS cap
27
+ visited.add(entry.qualified_name);
28
+ out.push(entry);
29
+ return true;
30
+ };
31
+ // Hop 1: direct calls in the handler body.
32
+ for (const call of collectCalls(input.handler_body_node, input.handler_file.dialect)) {
33
+ record({
34
+ qualified_name: call,
35
+ import_source: resolveImportSource(call, input.imports),
36
+ hops: 1,
37
+ via: "direct call",
38
+ });
39
+ }
40
+ // BFS frontier — each entry tracks the file that defined the symbol body so subsequent hops
41
+ // can keep resolving locally or follow imports into other files.
42
+ let frontier = out.map((e) => ({ entry: e, resolverFile: input.handler_file.file_path }));
43
+ for (let hop = 2; hop <= input.maxDepth; hop++) {
44
+ if (visited.size >= MAX_VISITED_SYMBOLS)
45
+ break;
46
+ const next = [];
47
+ for (const { entry, resolverFile } of frontier) {
48
+ const expansions = expandFrontierEntry(entry, resolverFile, symbolTables, input);
49
+ for (const exp of expansions) {
50
+ const newEntry = {
51
+ qualified_name: exp.qualified_name,
52
+ import_source: exp.import_source,
53
+ hops: hop,
54
+ via: exp.via,
55
+ };
56
+ if (record(newEntry)) {
57
+ next.push({ entry: newEntry, resolverFile: exp.nextResolverFile });
58
+ }
59
+ }
60
+ }
61
+ if (next.length === 0)
62
+ break;
63
+ frontier = next;
64
+ }
65
+ return out;
66
+ }
67
+ // Expand one frontier entry — branches on whether it's a cross-file imported symbol or a local one.
68
+ function expandFrontierEntry(entry, resolverFile, symbolTables, input) {
69
+ // Branch A — imported symbol → walk into target module's matching top-level symbol body.
70
+ if (entry.import_source !== null) {
71
+ const targetFile = resolveModuleToFile(entry.import_source, input.all_files);
72
+ if (!targetFile)
73
+ return [];
74
+ const targetTable = symbolTables.get(targetFile.file_path);
75
+ if (!targetTable)
76
+ return [];
77
+ const exportedName = findExportedName(entry.qualified_name, input.imports);
78
+ if (!exportedName)
79
+ return [];
80
+ const symbolBody = targetTable.symbols.get(exportedName);
81
+ if (!symbolBody)
82
+ return [];
83
+ return collectCalls(symbolBody, targetFile.dialect).map((inner) => ({
84
+ qualified_name: inner,
85
+ import_source: resolveImportSource(inner, targetFile.imports),
86
+ via: `${entry.qualified_name} (imported from ${entry.import_source})`,
87
+ nextResolverFile: targetFile.file_path,
88
+ }));
89
+ }
90
+ // Branch B — local symbol → walk its body in the resolver file.
91
+ const resolverTable = symbolTables.get(resolverFile);
92
+ if (!resolverTable)
93
+ return [];
94
+ const localBody = resolverTable.symbols.get(entry.qualified_name);
95
+ if (!localBody)
96
+ return [];
97
+ return collectCalls(localBody, resolverTable.file.dialect).map((inner) => ({
98
+ qualified_name: inner,
99
+ import_source: resolveImportSource(inner, resolverTable.file.imports),
100
+ via: `${entry.qualified_name} (local in ${resolverFile})`,
101
+ nextResolverFile: resolverFile,
102
+ }));
103
+ }
104
+ // Build per-file symbol table from FunctionDeclarations + VariableDeclarations holding
105
+ // ArrowFunctionExpression / FunctionExpression. Python: function_definition + class methods.
106
+ function buildSymbolTable(file) {
107
+ const out = new Map();
108
+ if (file.dialect === "babel") {
109
+ const ast = file.raw_ast;
110
+ for (const stmt of ast.program.body) {
111
+ collectTopLevelSymbols(stmt, out);
112
+ }
113
+ }
114
+ else if (file.dialect === "tree-sitter-python") {
115
+ const tree = file.raw_ast;
116
+ for (const fn of tree.rootNode.descendantsOfType(["function_definition"])) {
117
+ const name = fn.childForFieldName("name")?.text;
118
+ if (name)
119
+ out.set(name, fn);
120
+ }
121
+ for (const klass of tree.rootNode.descendantsOfType(["class_definition"])) {
122
+ const className = klass.childForFieldName("name")?.text;
123
+ const body = klass.childForFieldName("body");
124
+ if (!className || !body)
125
+ continue;
126
+ for (const fn of body.descendantsOfType(["function_definition"])) {
127
+ const methodName = fn.childForFieldName("name")?.text;
128
+ if (methodName)
129
+ out.set(`${className}.${methodName}`, fn);
130
+ }
131
+ }
132
+ }
133
+ return out;
134
+ }
135
+ function collectTopLevelSymbols(stmt, out) {
136
+ if (stmt.type === "FunctionDeclaration") {
137
+ if (stmt.id?.name)
138
+ out.set(stmt.id.name, stmt);
139
+ return;
140
+ }
141
+ if (stmt.type === "VariableDeclaration") {
142
+ for (const decl of stmt.declarations) {
143
+ const name = decl.id.type === "Identifier" ? decl.id.name : null;
144
+ const init = decl.init;
145
+ if (!name || !init)
146
+ continue;
147
+ if (init.type === "ArrowFunctionExpression" || init.type === "FunctionExpression") {
148
+ out.set(name, init);
149
+ }
150
+ }
151
+ return;
152
+ }
153
+ if (stmt.type === "ExportNamedDeclaration" && stmt.declaration) {
154
+ collectTopLevelSymbols(stmt.declaration, out);
155
+ return;
156
+ }
157
+ if (stmt.type === "ExportDefaultDeclaration") {
158
+ const decl = stmt.declaration;
159
+ if (decl.type === "FunctionDeclaration" && decl.id?.name) {
160
+ out.set(decl.id.name, decl);
161
+ }
162
+ }
163
+ }
164
+ function collectCalls(body, dialect) {
165
+ if (dialect === "babel")
166
+ return collectCallsBabel(body);
167
+ if (dialect === "tree-sitter-python")
168
+ return collectCallsPython(body);
169
+ return [];
170
+ }
171
+ function collectCallsBabel(root) {
172
+ const out = [];
173
+ walkBabelAst(root, (node) => {
174
+ if (node.type !== "CallExpression")
175
+ return;
176
+ const qn = qnameBabel(node.callee);
177
+ if (qn)
178
+ out.push(qn);
179
+ });
180
+ return out;
181
+ }
182
+ function qnameBabel(node) {
183
+ if (node.type === "Identifier")
184
+ return node.name;
185
+ if (node.type === "MemberExpression") {
186
+ const obj = qnameBabel(node.object);
187
+ const prop = node.property;
188
+ if (!obj)
189
+ return null;
190
+ if (prop.type === "Identifier")
191
+ return `${obj}.${prop.name}`;
192
+ }
193
+ return null;
194
+ }
195
+ function collectCallsPython(body) {
196
+ if (!body || typeof body !== "object")
197
+ return [];
198
+ const node = body;
199
+ if (typeof node.descendantsOfType !== "function")
200
+ return [];
201
+ const out = [];
202
+ for (const c of node.descendantsOfType(["call"])) {
203
+ const fn = c.childForFieldName("function");
204
+ if (fn?.text)
205
+ out.push(fn.text);
206
+ }
207
+ return out;
208
+ }
209
+ function resolveImportSource(qualifiedName, imports) {
210
+ // qualified_name like `stripe.webhooks.constructEvent` — root identifier is `stripe`.
211
+ const root = qualifiedName.split(".")[0];
212
+ if (!root)
213
+ return null;
214
+ for (const edge of imports) {
215
+ for (const name of edge.imported_names) {
216
+ if (name.local === root)
217
+ return edge.to_module;
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ function findExportedName(qualifiedName, imports) {
223
+ // Map local name back to its source-side export name (e.g. `cd` → `compare_digest`
224
+ // when imported via `from hmac import compare_digest as cd`).
225
+ const root = qualifiedName.split(".")[0];
226
+ if (!root)
227
+ return null;
228
+ for (const edge of imports) {
229
+ for (const name of edge.imported_names) {
230
+ if (name.local === root)
231
+ return name.source === "default" ? root : name.source;
232
+ }
233
+ }
234
+ return null;
235
+ }
236
+ function resolveModuleToFile(moduleName, allFiles) {
237
+ // Best-effort lookup: relative paths only. Bare module names (e.g. `express`) live in
238
+ // node_modules — outside the scanned tree — so cannot be followed. Symbol stays as an
239
+ // external leaf with import_source set, which is what rules need for D-34 set-lookup.
240
+ if (!moduleName.startsWith(".") && !moduleName.startsWith("/"))
241
+ return null;
242
+ // Strip leading ./ or ../, then drop any source-file extension so ESM-style imports
243
+ // (`./foo.js` → src `./foo.ts`) and bare imports (`./foo`) both resolve.
244
+ const noLead = moduleName.replace(/^\.\.?\//, "").replace(/^\.\//, "");
245
+ const stem = noLead.replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py)$/i, "");
246
+ for (const f of allFiles) {
247
+ if (f.file_path === noLead)
248
+ return f;
249
+ for (const ext of [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".py"]) {
250
+ if (f.file_path.endsWith(`${stem}${ext}`))
251
+ return f;
252
+ }
253
+ for (const indexFile of ["/index.ts", "/index.js", "/index.tsx", "/index.jsx"]) {
254
+ if (f.file_path.endsWith(`${stem}${indexFile}`))
255
+ return f;
256
+ }
257
+ }
258
+ return null;
259
+ }
260
+ //# sourceMappingURL=reachability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reachability.js","sourceRoot":"","sources":["../../src/model/reachability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { File, Node } from "@babel/types";
2
+ import type { ParsedFile } from "../types/project-model.js";
3
+ export interface ParseJsTsInput {
4
+ readonly file_path: string;
5
+ readonly source_text: string;
6
+ readonly hint?: "ts" | "tsx" | "js" | "jsx";
7
+ }
8
+ export declare function parseJsTs(input: ParseJsTsInput): Promise<ParsedFile>;
9
+ export type BabelFile = File;
10
+ export type BabelNode = Node;
11
+ //# sourceMappingURL=babel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babel.d.ts","sourceRoot":"","sources":["../../src/parsers/babel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAqB,IAAI,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EAAc,UAAU,EAAoB,MAAM,2BAA2B,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;CAC7C;AAiCD,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAoC1E;AAmDD,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC;AAC7B,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC"}
@@ -0,0 +1,121 @@
1
+ // JS/TS parser adapter (ENGINE-01). Calls @babel/parser, normalizes the result into ParsedFile.
2
+ // Engine-pure: NO fs / http / net / process — caller hands us source_text.
3
+ // D-27 all-or-nothing: any parse error short-circuits to a ParseErrorRecord with empty imports.
4
+ // Plugin set is permissive per phase-2 Claude's Discretion; Phase 6 will tighten against the 200+ corpus.
5
+ import { parse } from "@babel/parser";
6
+ const TS_FAMILY = [
7
+ "typescript",
8
+ "decorators-legacy",
9
+ "topLevelAwait",
10
+ "importAttributes",
11
+ "explicitResourceManagement",
12
+ ];
13
+ const JS_FAMILY = [
14
+ "decorators-legacy",
15
+ "topLevelAwait",
16
+ "importAttributes",
17
+ "explicitResourceManagement",
18
+ ];
19
+ const JSX_FAMILY = ["jsx"];
20
+ function pluginsFor(hint, filePath) {
21
+ const ext = (hint ?? filePath.split(".").pop() ?? "").toLowerCase();
22
+ const isTs = ext === "ts" || ext === "tsx";
23
+ const isJsx = ext === "tsx" || ext === "jsx";
24
+ const out = isTs ? [...TS_FAMILY] : [...JS_FAMILY];
25
+ if (isJsx)
26
+ out.push(...JSX_FAMILY);
27
+ return out;
28
+ }
29
+ function languageFor(hint, filePath) {
30
+ const ext = (hint ?? filePath.split(".").pop() ?? "").toLowerCase();
31
+ return ext === "ts" || ext === "tsx" ? "typescript" : "javascript";
32
+ }
33
+ export async function parseJsTs(input) {
34
+ const { file_path, source_text } = input;
35
+ const plugins = pluginsFor(input.hint, file_path);
36
+ const language = languageFor(input.hint, file_path);
37
+ let ast = null;
38
+ let parseError = null;
39
+ try {
40
+ ast = parse(source_text, {
41
+ sourceType: "module",
42
+ plugins: plugins,
43
+ errorRecovery: false, // D-27: we want the throw, not a partial tree
44
+ tokens: false,
45
+ ranges: false,
46
+ attachComment: false,
47
+ allowReturnOutsideFunction: false,
48
+ });
49
+ }
50
+ catch (err) {
51
+ // Babel's SyntaxError carries .loc = { line, column } (1-indexed line, 0-indexed column).
52
+ const e = err;
53
+ parseError = {
54
+ message: e?.message ?? "babel parse error",
55
+ location: { line: e?.loc?.line ?? 1, col: (e?.loc?.column ?? 0) + 1 },
56
+ source: "babel",
57
+ };
58
+ }
59
+ // D-27: when parse_error is set, downstream rules MUST NOT inspect raw_ast — return empty imports.
60
+ const imports = ast === null ? [] : extractImports(ast, file_path);
61
+ return {
62
+ file_path,
63
+ language,
64
+ dialect: "babel",
65
+ source_text,
66
+ raw_ast: ast,
67
+ imports,
68
+ parse_error: parseError,
69
+ };
70
+ }
71
+ function extractImports(ast, fromFile) {
72
+ const out = [];
73
+ for (const stmt of ast.program.body) {
74
+ // ES module imports: import { a, b as c } from 'x'; import d from 'x'; import * as ns from 'x';
75
+ if (stmt.type === "ImportDeclaration") {
76
+ out.push(toImportEdge(stmt, fromFile));
77
+ continue;
78
+ }
79
+ // CJS interop: const x = require('y'); top-level only.
80
+ if (stmt.type === "VariableDeclaration") {
81
+ for (const decl of stmt.declarations) {
82
+ if (decl.init?.type !== "CallExpression")
83
+ continue;
84
+ const callee = decl.init.callee;
85
+ if (callee.type !== "Identifier" || callee.name !== "require")
86
+ continue;
87
+ const arg = decl.init.arguments[0];
88
+ if (!arg || arg.type !== "StringLiteral")
89
+ continue;
90
+ const local = decl.id.type === "Identifier" ? decl.id.name : "<destructured>";
91
+ out.push({
92
+ from_file: fromFile,
93
+ to_module: arg.value,
94
+ imported_names: [{ local, source: "default" }],
95
+ is_default: true,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ function toImportEdge(node, fromFile) {
103
+ const toModule = node.source.value;
104
+ const names = [];
105
+ let isDefault = false;
106
+ for (const spec of node.specifiers) {
107
+ if (spec.type === "ImportDefaultSpecifier") {
108
+ isDefault = true;
109
+ names.push({ local: spec.local.name, source: "default" });
110
+ }
111
+ else if (spec.type === "ImportSpecifier") {
112
+ const importedName = spec.imported.type === "Identifier" ? spec.imported.name : spec.imported.value;
113
+ names.push({ local: spec.local.name, source: importedName });
114
+ }
115
+ else if (spec.type === "ImportNamespaceSpecifier") {
116
+ names.push({ local: spec.local.name, source: "*" });
117
+ }
118
+ }
119
+ return { from_file: fromFile, to_module: toModule, imported_names: names, is_default: isDefault };
120
+ }
121
+ //# sourceMappingURL=babel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babel.js","sourceRoot":"","sources":["../../src/parsers/babel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { type BabelFile, type BabelNode, type ParseJsTsInput, parseJsTs } from "./babel.js";
2
+ export { extractBabelLiterals } from "./literals.js";
3
+ export { type ParsePythonInput, parsePython } from "./python.js";
4
+ export { extractPythonLiterals } from "./python-literals.js";
5
+ export { type InitPythonRuntimeInput, initPythonRuntime, type PythonRuntime, } from "./python-loader.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // parsers/ barrel — engine-internal. Public package barrel does not re-export parsers.
2
+ export { parseJsTs } from "./babel.js";
3
+ export { extractBabelLiterals } from "./literals.js";
4
+ export { parsePython } from "./python.js";
5
+ export { extractPythonLiterals } from "./python-literals.js";
6
+ export { initPythonRuntime, } from "./python-loader.js";
7
+ //# sourceMappingURL=index.js.map