interlinked-mapper 0.3.8__tar.gz → 0.3.9__tar.gz

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 (46) hide show
  1. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/PKG-INFO +1 -1
  2. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/graph.py +27 -0
  3. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/similarity.py +7 -2
  4. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/commander/query.py +28 -2
  5. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/PKG-INFO +1 -1
  6. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/pyproject.toml +1 -1
  7. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/__init__.py +0 -0
  8. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/__init__.py +0 -0
  9. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/dead_code.py +0 -0
  10. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/embeddings.py +0 -0
  11. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/analyzer/parser.py +0 -0
  12. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/cli.py +0 -0
  13. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/commander/__init__.py +0 -0
  14. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/commander/llm.py +0 -0
  15. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/commander/repl.py +0 -0
  16. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/mcp_server.py +0 -0
  17. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/models.py +0 -0
  18. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/__init__.py +0 -0
  19. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/dist/assets/index-CyhrxsQU.css +0 -0
  20. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/dist/assets/index-Dh01aXoE.js +0 -0
  21. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/dist/index.html +0 -0
  22. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/index.html +0 -0
  23. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/index.html.d3-legacy +0 -0
  24. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/package-lock.json +0 -0
  25. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/package.json +0 -0
  26. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/App.tsx +0 -0
  27. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/graph/GraphCanvas.tsx +0 -0
  28. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/graph/nodePrograms.ts +0 -0
  29. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/index.css +0 -0
  30. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/main.tsx +0 -0
  31. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/state/graphStore.ts +0 -0
  32. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/state/sseClient.ts +0 -0
  33. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/theme.ts +0 -0
  34. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/types.ts +0 -0
  35. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/src/vite-env.d.ts +0 -0
  36. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/tsconfig.json +0 -0
  37. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/frontend/vite.config.ts +0 -0
  38. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/layouts.py +0 -0
  39. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked/visualizer/server.py +0 -0
  40. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/SOURCES.txt +0 -0
  41. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/dependency_links.txt +0 -0
  42. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/entry_points.txt +0 -0
  43. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/requires.txt +0 -0
  44. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/interlinked_mapper.egg-info/top_level.txt +0 -0
  45. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/setup.cfg +0 -0
  46. {interlinked_mapper-0.3.8 → interlinked_mapper-0.3.9}/tests/test_accuracy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: interlinked-mapper
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: A Python program topology explorer — visualize the shape of your codebase
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/austerecryptid/interlinked
@@ -12,6 +12,27 @@ from interlinked.models import (
12
12
  )
13
13
 
14
14
 
15
+ # Method names so common on builtins (dict, list, set, str, etc.) that resolving
16
+ # them to project symbols by bare-name matching is almost always a false positive.
17
+ # e.g. `op_dict.items()` should NOT resolve to `ActionCost.items`.
18
+ _BUILTIN_METHOD_NAMES: frozenset[str] = frozenset({
19
+ # dict
20
+ "items", "keys", "values", "get", "pop", "update", "setdefault",
21
+ "clear", "copy",
22
+ # list / sequence
23
+ "append", "extend", "insert", "remove", "sort", "reverse",
24
+ "count", "index",
25
+ # set
26
+ "add", "discard", "union", "intersection", "difference",
27
+ "issubset", "issuperset",
28
+ # str
29
+ "strip", "split", "join", "replace", "startswith", "endswith",
30
+ "lower", "upper", "format", "encode", "decode",
31
+ # general
32
+ "close", "read", "write", "flush", "seek", "tell",
33
+ })
34
+
35
+
15
36
  class CodeGraph:
16
37
  """The core graph structure representing an entire Python project.
17
38
 
@@ -215,6 +236,12 @@ class CodeGraph:
215
236
  source = next(iter(candidates))
216
237
 
217
238
  if target not in node_ids:
239
+ # Never resolve bare builtin method names — they match too
240
+ # broadly (e.g. "items" matching ActionCost.items when the
241
+ # actual call is dict.items()).
242
+ if target in _BUILTIN_METHOD_NAMES:
243
+ return edge
244
+
218
245
  candidates = name_index.get(target, set())
219
246
  if len(candidates) == 1:
220
247
  target = next(iter(candidates))
@@ -257,8 +257,13 @@ def get_rich_context(graph: CodeGraph, node: NodeData) -> dict:
257
257
  context["callers"] = [{"id": n.id, "name": n.name} for n in callers[:20]]
258
258
  context["callees"] = [{"id": n.id, "name": n.name} for n in callees[:20]]
259
259
 
260
- # Fingerprint
261
- context["fingerprint"] = node.metadata.get("fingerprint")
260
+ # Fingerprint — slim version (drop ast_tree, minhash, ast_node_counts)
261
+ fp = node.metadata.get("fingerprint")
262
+ if fp and isinstance(fp, dict):
263
+ _heavy = {"ast_tree", "minhash", "ast_node_counts", "source_snippet"}
264
+ context["fingerprint"] = {k: v for k, v in fp.items() if k not in _heavy}
265
+ else:
266
+ context["fingerprint"] = fp
262
267
 
263
268
  return context
264
269
 
@@ -12,6 +12,30 @@ from interlinked.models import (
12
12
  )
13
13
 
14
14
 
15
+ # Fields in node.metadata["fingerprint"] that are huge and useless in
16
+ # serialized query/snapshot output. Kept in memory for similarity scoring.
17
+ _FINGERPRINT_HEAVY_KEYS = frozenset({
18
+ "ast_tree", "minhash", "ast_node_counts",
19
+ "source_snippet",
20
+ })
21
+
22
+
23
+ def _slim_node_dict(d: dict) -> dict:
24
+ """Strip heavy fingerprint fields from a serialized NodeData dict."""
25
+ meta = d.get("metadata")
26
+ if not meta or "fingerprint" not in meta:
27
+ return d
28
+ fp = meta["fingerprint"]
29
+ if not isinstance(fp, dict):
30
+ return d
31
+ d = d.copy()
32
+ d["metadata"] = meta.copy()
33
+ d["metadata"]["fingerprint"] = {
34
+ k: v for k, v in fp.items() if k not in _FINGERPRINT_HEAVY_KEYS
35
+ }
36
+ return d
37
+
38
+
15
39
  class QueryEngine:
16
40
  """Provides a high-level API for querying and manipulating the code graph.
17
41
 
@@ -407,7 +431,7 @@ class QueryEngine:
407
431
 
408
432
  self._notify()
409
433
 
410
- return [r.model_dump() for r in results]
434
+ return [_slim_node_dict(r.model_dump()) for r in results]
411
435
 
412
436
  def trace_variable(self, var_name: str, origin: str | None = None) -> str:
413
437
  """Trace a variable's path through reads/writes and highlight it.
@@ -1205,7 +1229,9 @@ class QueryEngine:
1205
1229
 
1206
1230
  def snapshot(self) -> dict:
1207
1231
  """Get the current graph snapshot as a dict (for JSON serialization)."""
1208
- return self.graph.snapshot(self.state).model_dump()
1232
+ snap = self.graph.snapshot(self.state).model_dump()
1233
+ snap["nodes"] = [_slim_node_dict(n) for n in snap.get("nodes", [])]
1234
+ return snap
1209
1235
 
1210
1236
  # ── Stats ────────────────────────────────────────────────────────
1211
1237
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: interlinked-mapper
3
- Version: 0.3.8
3
+ Version: 0.3.9
4
4
  Summary: A Python program topology explorer — visualize the shape of your codebase
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/austerecryptid/interlinked
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "interlinked-mapper"
7
- version = "0.3.8"
7
+ version = "0.3.9"
8
8
  description = "A Python program topology explorer — visualize the shape of your codebase"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}