interlinked-mapper 0.3.4__tar.gz → 0.3.5__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 (45) hide show
  1. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/PKG-INFO +1 -1
  2. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/mcp_server.py +37 -34
  3. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/PKG-INFO +1 -1
  4. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/pyproject.toml +1 -1
  5. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/__init__.py +0 -0
  6. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/__init__.py +0 -0
  7. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/dead_code.py +0 -0
  8. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/embeddings.py +0 -0
  9. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/graph.py +0 -0
  10. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/parser.py +0 -0
  11. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/analyzer/similarity.py +0 -0
  12. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/cli.py +0 -0
  13. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/commander/__init__.py +0 -0
  14. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/commander/llm.py +0 -0
  15. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/commander/query.py +0 -0
  16. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/commander/repl.py +0 -0
  17. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/models.py +0 -0
  18. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/__init__.py +0 -0
  19. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/dist/assets/index-CyhrxsQU.css +0 -0
  20. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/dist/assets/index-Dh01aXoE.js +0 -0
  21. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/dist/index.html +0 -0
  22. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/index.html +0 -0
  23. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/index.html.d3-legacy +0 -0
  24. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/package-lock.json +0 -0
  25. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/package.json +0 -0
  26. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/App.tsx +0 -0
  27. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/graph/GraphCanvas.tsx +0 -0
  28. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/graph/nodePrograms.ts +0 -0
  29. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/index.css +0 -0
  30. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/main.tsx +0 -0
  31. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/state/graphStore.ts +0 -0
  32. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/state/sseClient.ts +0 -0
  33. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/theme.ts +0 -0
  34. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/types.ts +0 -0
  35. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/src/vite-env.d.ts +0 -0
  36. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/tsconfig.json +0 -0
  37. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/frontend/vite.config.ts +0 -0
  38. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/layouts.py +0 -0
  39. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked/visualizer/server.py +0 -0
  40. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/SOURCES.txt +0 -0
  41. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/dependency_links.txt +0 -0
  42. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/entry_points.txt +0 -0
  43. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/requires.txt +0 -0
  44. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/interlinked_mapper.egg-info/top_level.txt +0 -0
  45. {interlinked_mapper-0.3.4 → interlinked_mapper-0.3.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: interlinked-mapper
3
- Version: 0.3.4
3
+ Version: 0.3.5
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
@@ -41,46 +41,46 @@ from interlinked.analyzer.dead_code import detect_dead_code
41
41
  from interlinked.commander.query import QueryEngine
42
42
 
43
43
 
44
+ def _start_background_analysis(graph: CodeGraph, engine: QueryEngine, project_path: str) -> None:
45
+ """Run similarity + embeddings in background threads (non-blocking).
46
+
47
+ Mirrors the pattern used by the REST API server: parse returns fast,
48
+ then similarity fingerprinting and embedding builds run in the background.
49
+ """
50
+ import threading
51
+
52
+ # Similarity in background thread
53
+ def _run_similarity():
54
+ try:
55
+ from interlinked.analyzer.similarity import analyze_similarity
56
+ analyze_similarity(graph)
57
+ except Exception:
58
+ pass
59
+ threading.Thread(target=_run_similarity, daemon=True, name="mcp-similarity").start()
60
+
61
+ # Embeddings in background thread (via build_async which spawns its own thread)
62
+ try:
63
+ from interlinked.visualizer.server import _start_embedding_build, _collect_function_sources
64
+ _start_embedding_build(graph, project_path, engine)
65
+ except Exception:
66
+ pass
67
+
68
+
44
69
  def build_graph(project_path: str) -> tuple[CodeGraph, QueryEngine]:
45
- """Parse a project and build the graph + query engine."""
70
+ """Parse a project and build the graph + query engine.
71
+
72
+ Returns immediately after parsing + dead code detection.
73
+ Similarity and embeddings run in background threads.
74
+ """
46
75
  nodes, edges = parse_project(project_path)
47
76
  graph = CodeGraph()
48
77
  graph.build_from(nodes, edges)
49
78
  detect_dead_code(graph)
50
79
 
51
- # Run similarity analysis if available
52
- try:
53
- from interlinked.analyzer.similarity import analyze_similarity
54
- analyze_similarity(graph)
55
- except Exception:
56
- pass
57
-
58
80
  engine = QueryEngine(graph)
59
81
 
60
- # Start embedding build in background (if torch/transformers installed)
61
- try:
62
- from interlinked.analyzer.embeddings import EmbeddingIndex, is_available
63
- if is_available():
64
- from pathlib import Path
65
- emb_index = EmbeddingIndex(project_path)
66
- engine._embedding_index = emb_index
67
- # Collect function sources
68
- from interlinked.models import SymbolType
69
- functions = []
70
- for node in graph.all_nodes(include_proposed=False):
71
- if node.symbol_type not in (SymbolType.FUNCTION, SymbolType.METHOD):
72
- continue
73
- if node.file_path and node.line_start and node.line_end:
74
- try:
75
- lines = Path(node.file_path).read_text(encoding="utf-8", errors="replace").splitlines()
76
- source = "\n".join(lines[max(0, node.line_start - 1):min(len(lines), node.line_end)])
77
- if source:
78
- functions.append({"id": node.id, "source": source})
79
- except Exception:
80
- pass
81
- emb_index.build_async(functions)
82
- except Exception:
83
- pass
82
+ # Kick off similarity + embeddings in background (non-blocking)
83
+ _start_background_analysis(graph, engine, project_path)
84
84
 
85
85
  return graph, engine
86
86
 
@@ -520,7 +520,8 @@ def _dispatch_via_server(name: str, args: dict[str, Any], server_url: str) -> st
520
520
  if method == "GET":
521
521
  r = httpx.get(url, timeout=30.0)
522
522
  else:
523
- r = httpx.post(url, json=body, timeout=30.0)
523
+ timeout = 120.0 if "switch_project" in path else 30.0
524
+ r = httpx.post(url, json=body, timeout=timeout)
524
525
  data = r.json()
525
526
 
526
527
  # Extract the most useful part of the response for the LLM
@@ -621,8 +622,10 @@ def _dispatch_tool(
621
622
 
622
623
  elif name == "interlinked_switch_project":
623
624
  from interlinked.visualizer.server import _rebuild_graph
624
- result = _rebuild_graph(args["path"], graph)
625
+ result = _rebuild_graph(args["path"], graph, run_similarity=False)
625
626
  engine.reset_filter()
627
+ # Background similarity + embeddings — matches REST API pattern
628
+ _start_background_analysis(graph, engine, args["path"])
626
629
  return json.dumps(result, indent=2)
627
630
 
628
631
  elif name == "interlinked_edges_between":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: interlinked-mapper
3
- Version: 0.3.4
3
+ Version: 0.3.5
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.4"
7
+ version = "0.3.5"
8
8
  description = "A Python program topology explorer — visualize the shape of your codebase"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}