alita-sdk 0.3.462__py3-none-any.whl → 0.3.627__py3-none-any.whl

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 (261) hide show
  1. alita_sdk/cli/agent/__init__.py +5 -0
  2. alita_sdk/cli/agent/default.py +258 -0
  3. alita_sdk/cli/agent_executor.py +15 -3
  4. alita_sdk/cli/agent_loader.py +56 -8
  5. alita_sdk/cli/agent_ui.py +93 -31
  6. alita_sdk/cli/agents.py +2274 -230
  7. alita_sdk/cli/callbacks.py +96 -25
  8. alita_sdk/cli/cli.py +10 -1
  9. alita_sdk/cli/config.py +162 -9
  10. alita_sdk/cli/context/__init__.py +30 -0
  11. alita_sdk/cli/context/cleanup.py +198 -0
  12. alita_sdk/cli/context/manager.py +731 -0
  13. alita_sdk/cli/context/message.py +285 -0
  14. alita_sdk/cli/context/strategies.py +289 -0
  15. alita_sdk/cli/context/token_estimation.py +127 -0
  16. alita_sdk/cli/input_handler.py +419 -0
  17. alita_sdk/cli/inventory.py +1073 -0
  18. alita_sdk/cli/testcases/__init__.py +94 -0
  19. alita_sdk/cli/testcases/data_generation.py +119 -0
  20. alita_sdk/cli/testcases/discovery.py +96 -0
  21. alita_sdk/cli/testcases/executor.py +84 -0
  22. alita_sdk/cli/testcases/logger.py +85 -0
  23. alita_sdk/cli/testcases/parser.py +172 -0
  24. alita_sdk/cli/testcases/prompts.py +91 -0
  25. alita_sdk/cli/testcases/reporting.py +125 -0
  26. alita_sdk/cli/testcases/setup.py +108 -0
  27. alita_sdk/cli/testcases/test_runner.py +282 -0
  28. alita_sdk/cli/testcases/utils.py +39 -0
  29. alita_sdk/cli/testcases/validation.py +90 -0
  30. alita_sdk/cli/testcases/workflow.py +196 -0
  31. alita_sdk/cli/toolkit.py +14 -17
  32. alita_sdk/cli/toolkit_loader.py +35 -5
  33. alita_sdk/cli/tools/__init__.py +36 -2
  34. alita_sdk/cli/tools/approval.py +224 -0
  35. alita_sdk/cli/tools/filesystem.py +910 -64
  36. alita_sdk/cli/tools/planning.py +389 -0
  37. alita_sdk/cli/tools/terminal.py +414 -0
  38. alita_sdk/community/__init__.py +72 -12
  39. alita_sdk/community/inventory/__init__.py +236 -0
  40. alita_sdk/community/inventory/config.py +257 -0
  41. alita_sdk/community/inventory/enrichment.py +2137 -0
  42. alita_sdk/community/inventory/extractors.py +1469 -0
  43. alita_sdk/community/inventory/ingestion.py +3172 -0
  44. alita_sdk/community/inventory/knowledge_graph.py +1457 -0
  45. alita_sdk/community/inventory/parsers/__init__.py +218 -0
  46. alita_sdk/community/inventory/parsers/base.py +295 -0
  47. alita_sdk/community/inventory/parsers/csharp_parser.py +907 -0
  48. alita_sdk/community/inventory/parsers/go_parser.py +851 -0
  49. alita_sdk/community/inventory/parsers/html_parser.py +389 -0
  50. alita_sdk/community/inventory/parsers/java_parser.py +593 -0
  51. alita_sdk/community/inventory/parsers/javascript_parser.py +629 -0
  52. alita_sdk/community/inventory/parsers/kotlin_parser.py +768 -0
  53. alita_sdk/community/inventory/parsers/markdown_parser.py +362 -0
  54. alita_sdk/community/inventory/parsers/python_parser.py +604 -0
  55. alita_sdk/community/inventory/parsers/rust_parser.py +858 -0
  56. alita_sdk/community/inventory/parsers/swift_parser.py +832 -0
  57. alita_sdk/community/inventory/parsers/text_parser.py +322 -0
  58. alita_sdk/community/inventory/parsers/yaml_parser.py +370 -0
  59. alita_sdk/community/inventory/patterns/__init__.py +61 -0
  60. alita_sdk/community/inventory/patterns/ast_adapter.py +380 -0
  61. alita_sdk/community/inventory/patterns/loader.py +348 -0
  62. alita_sdk/community/inventory/patterns/registry.py +198 -0
  63. alita_sdk/community/inventory/presets.py +535 -0
  64. alita_sdk/community/inventory/retrieval.py +1403 -0
  65. alita_sdk/community/inventory/toolkit.py +173 -0
  66. alita_sdk/community/inventory/toolkit_utils.py +176 -0
  67. alita_sdk/community/inventory/visualize.py +1370 -0
  68. alita_sdk/configurations/__init__.py +1 -1
  69. alita_sdk/configurations/ado.py +141 -20
  70. alita_sdk/configurations/bitbucket.py +0 -3
  71. alita_sdk/configurations/confluence.py +76 -42
  72. alita_sdk/configurations/figma.py +76 -0
  73. alita_sdk/configurations/gitlab.py +17 -5
  74. alita_sdk/configurations/openapi.py +329 -0
  75. alita_sdk/configurations/qtest.py +72 -1
  76. alita_sdk/configurations/report_portal.py +96 -0
  77. alita_sdk/configurations/sharepoint.py +148 -0
  78. alita_sdk/configurations/testio.py +83 -0
  79. alita_sdk/runtime/clients/artifact.py +3 -3
  80. alita_sdk/runtime/clients/client.py +353 -48
  81. alita_sdk/runtime/clients/sandbox_client.py +0 -21
  82. alita_sdk/runtime/langchain/_constants_bkup.py +1318 -0
  83. alita_sdk/runtime/langchain/assistant.py +123 -26
  84. alita_sdk/runtime/langchain/constants.py +642 -1
  85. alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +103 -60
  86. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLinesLoader.py +77 -0
  87. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +6 -3
  88. alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +226 -7
  89. alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +5 -2
  90. alita_sdk/runtime/langchain/document_loaders/constants.py +12 -7
  91. alita_sdk/runtime/langchain/langraph_agent.py +279 -73
  92. alita_sdk/runtime/langchain/utils.py +82 -15
  93. alita_sdk/runtime/llms/preloaded.py +2 -6
  94. alita_sdk/runtime/skills/__init__.py +91 -0
  95. alita_sdk/runtime/skills/callbacks.py +498 -0
  96. alita_sdk/runtime/skills/discovery.py +540 -0
  97. alita_sdk/runtime/skills/executor.py +610 -0
  98. alita_sdk/runtime/skills/input_builder.py +371 -0
  99. alita_sdk/runtime/skills/models.py +330 -0
  100. alita_sdk/runtime/skills/registry.py +355 -0
  101. alita_sdk/runtime/skills/skill_runner.py +330 -0
  102. alita_sdk/runtime/toolkits/__init__.py +7 -0
  103. alita_sdk/runtime/toolkits/application.py +21 -9
  104. alita_sdk/runtime/toolkits/artifact.py +15 -5
  105. alita_sdk/runtime/toolkits/datasource.py +13 -6
  106. alita_sdk/runtime/toolkits/mcp.py +139 -251
  107. alita_sdk/runtime/toolkits/mcp_config.py +1048 -0
  108. alita_sdk/runtime/toolkits/planning.py +178 -0
  109. alita_sdk/runtime/toolkits/skill_router.py +238 -0
  110. alita_sdk/runtime/toolkits/subgraph.py +251 -6
  111. alita_sdk/runtime/toolkits/tools.py +238 -32
  112. alita_sdk/runtime/toolkits/vectorstore.py +11 -5
  113. alita_sdk/runtime/tools/__init__.py +3 -1
  114. alita_sdk/runtime/tools/application.py +20 -6
  115. alita_sdk/runtime/tools/artifact.py +511 -28
  116. alita_sdk/runtime/tools/data_analysis.py +183 -0
  117. alita_sdk/runtime/tools/function.py +43 -15
  118. alita_sdk/runtime/tools/image_generation.py +50 -44
  119. alita_sdk/runtime/tools/llm.py +852 -67
  120. alita_sdk/runtime/tools/loop.py +3 -1
  121. alita_sdk/runtime/tools/loop_output.py +3 -1
  122. alita_sdk/runtime/tools/mcp_remote_tool.py +25 -10
  123. alita_sdk/runtime/tools/mcp_server_tool.py +7 -6
  124. alita_sdk/runtime/tools/planning/__init__.py +36 -0
  125. alita_sdk/runtime/tools/planning/models.py +246 -0
  126. alita_sdk/runtime/tools/planning/wrapper.py +607 -0
  127. alita_sdk/runtime/tools/router.py +2 -4
  128. alita_sdk/runtime/tools/sandbox.py +9 -6
  129. alita_sdk/runtime/tools/skill_router.py +776 -0
  130. alita_sdk/runtime/tools/tool.py +3 -1
  131. alita_sdk/runtime/tools/vectorstore.py +7 -2
  132. alita_sdk/runtime/tools/vectorstore_base.py +51 -11
  133. alita_sdk/runtime/utils/AlitaCallback.py +137 -21
  134. alita_sdk/runtime/utils/constants.py +5 -1
  135. alita_sdk/runtime/utils/mcp_client.py +492 -0
  136. alita_sdk/runtime/utils/mcp_oauth.py +202 -5
  137. alita_sdk/runtime/utils/mcp_sse_client.py +36 -7
  138. alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
  139. alita_sdk/runtime/utils/serialization.py +155 -0
  140. alita_sdk/runtime/utils/streamlit.py +6 -10
  141. alita_sdk/runtime/utils/toolkit_utils.py +16 -5
  142. alita_sdk/runtime/utils/utils.py +36 -0
  143. alita_sdk/tools/__init__.py +113 -29
  144. alita_sdk/tools/ado/repos/__init__.py +51 -33
  145. alita_sdk/tools/ado/repos/repos_wrapper.py +148 -89
  146. alita_sdk/tools/ado/test_plan/__init__.py +25 -9
  147. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +23 -1
  148. alita_sdk/tools/ado/utils.py +1 -18
  149. alita_sdk/tools/ado/wiki/__init__.py +25 -8
  150. alita_sdk/tools/ado/wiki/ado_wrapper.py +291 -22
  151. alita_sdk/tools/ado/work_item/__init__.py +26 -9
  152. alita_sdk/tools/ado/work_item/ado_wrapper.py +56 -3
  153. alita_sdk/tools/advanced_jira_mining/__init__.py +11 -8
  154. alita_sdk/tools/aws/delta_lake/__init__.py +13 -9
  155. alita_sdk/tools/aws/delta_lake/tool.py +5 -1
  156. alita_sdk/tools/azure_ai/search/__init__.py +11 -8
  157. alita_sdk/tools/azure_ai/search/api_wrapper.py +1 -1
  158. alita_sdk/tools/base/tool.py +5 -1
  159. alita_sdk/tools/base_indexer_toolkit.py +170 -45
  160. alita_sdk/tools/bitbucket/__init__.py +17 -12
  161. alita_sdk/tools/bitbucket/api_wrapper.py +59 -11
  162. alita_sdk/tools/bitbucket/cloud_api_wrapper.py +49 -35
  163. alita_sdk/tools/browser/__init__.py +5 -4
  164. alita_sdk/tools/carrier/__init__.py +5 -6
  165. alita_sdk/tools/carrier/backend_reports_tool.py +6 -6
  166. alita_sdk/tools/carrier/run_ui_test_tool.py +6 -6
  167. alita_sdk/tools/carrier/ui_reports_tool.py +5 -5
  168. alita_sdk/tools/chunkers/__init__.py +3 -1
  169. alita_sdk/tools/chunkers/code/treesitter/treesitter.py +37 -13
  170. alita_sdk/tools/chunkers/sematic/json_chunker.py +1 -0
  171. alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
  172. alita_sdk/tools/chunkers/universal_chunker.py +270 -0
  173. alita_sdk/tools/cloud/aws/__init__.py +10 -7
  174. alita_sdk/tools/cloud/azure/__init__.py +10 -7
  175. alita_sdk/tools/cloud/gcp/__init__.py +10 -7
  176. alita_sdk/tools/cloud/k8s/__init__.py +10 -7
  177. alita_sdk/tools/code/linter/__init__.py +10 -8
  178. alita_sdk/tools/code/loaders/codesearcher.py +3 -2
  179. alita_sdk/tools/code/sonar/__init__.py +10 -7
  180. alita_sdk/tools/code_indexer_toolkit.py +73 -23
  181. alita_sdk/tools/confluence/__init__.py +21 -15
  182. alita_sdk/tools/confluence/api_wrapper.py +78 -23
  183. alita_sdk/tools/confluence/loader.py +4 -2
  184. alita_sdk/tools/custom_open_api/__init__.py +12 -5
  185. alita_sdk/tools/elastic/__init__.py +11 -8
  186. alita_sdk/tools/elitea_base.py +493 -30
  187. alita_sdk/tools/figma/__init__.py +58 -11
  188. alita_sdk/tools/figma/api_wrapper.py +1235 -143
  189. alita_sdk/tools/figma/figma_client.py +73 -0
  190. alita_sdk/tools/figma/toon_tools.py +2748 -0
  191. alita_sdk/tools/github/__init__.py +13 -14
  192. alita_sdk/tools/github/github_client.py +224 -100
  193. alita_sdk/tools/github/graphql_client_wrapper.py +119 -33
  194. alita_sdk/tools/github/schemas.py +14 -5
  195. alita_sdk/tools/github/tool.py +5 -1
  196. alita_sdk/tools/github/tool_prompts.py +9 -22
  197. alita_sdk/tools/gitlab/__init__.py +15 -11
  198. alita_sdk/tools/gitlab/api_wrapper.py +207 -41
  199. alita_sdk/tools/gitlab_org/__init__.py +10 -8
  200. alita_sdk/tools/gitlab_org/api_wrapper.py +63 -64
  201. alita_sdk/tools/google/bigquery/__init__.py +13 -12
  202. alita_sdk/tools/google/bigquery/tool.py +5 -1
  203. alita_sdk/tools/google_places/__init__.py +10 -8
  204. alita_sdk/tools/google_places/api_wrapper.py +1 -1
  205. alita_sdk/tools/jira/__init__.py +17 -11
  206. alita_sdk/tools/jira/api_wrapper.py +91 -40
  207. alita_sdk/tools/keycloak/__init__.py +11 -8
  208. alita_sdk/tools/localgit/__init__.py +9 -3
  209. alita_sdk/tools/localgit/local_git.py +62 -54
  210. alita_sdk/tools/localgit/tool.py +5 -1
  211. alita_sdk/tools/memory/__init__.py +11 -3
  212. alita_sdk/tools/non_code_indexer_toolkit.py +1 -0
  213. alita_sdk/tools/ocr/__init__.py +11 -8
  214. alita_sdk/tools/openapi/__init__.py +490 -114
  215. alita_sdk/tools/openapi/api_wrapper.py +1368 -0
  216. alita_sdk/tools/openapi/tool.py +20 -0
  217. alita_sdk/tools/pandas/__init__.py +20 -12
  218. alita_sdk/tools/pandas/api_wrapper.py +38 -25
  219. alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
  220. alita_sdk/tools/postman/__init__.py +11 -11
  221. alita_sdk/tools/pptx/__init__.py +10 -9
  222. alita_sdk/tools/pptx/pptx_wrapper.py +1 -1
  223. alita_sdk/tools/qtest/__init__.py +30 -10
  224. alita_sdk/tools/qtest/api_wrapper.py +430 -13
  225. alita_sdk/tools/rally/__init__.py +10 -8
  226. alita_sdk/tools/rally/api_wrapper.py +1 -1
  227. alita_sdk/tools/report_portal/__init__.py +12 -9
  228. alita_sdk/tools/salesforce/__init__.py +10 -9
  229. alita_sdk/tools/servicenow/__init__.py +17 -14
  230. alita_sdk/tools/servicenow/api_wrapper.py +1 -1
  231. alita_sdk/tools/sharepoint/__init__.py +10 -8
  232. alita_sdk/tools/sharepoint/api_wrapper.py +4 -4
  233. alita_sdk/tools/slack/__init__.py +10 -8
  234. alita_sdk/tools/slack/api_wrapper.py +2 -2
  235. alita_sdk/tools/sql/__init__.py +11 -9
  236. alita_sdk/tools/testio/__init__.py +10 -8
  237. alita_sdk/tools/testrail/__init__.py +11 -8
  238. alita_sdk/tools/testrail/api_wrapper.py +1 -1
  239. alita_sdk/tools/utils/__init__.py +9 -4
  240. alita_sdk/tools/utils/content_parser.py +77 -3
  241. alita_sdk/tools/utils/text_operations.py +410 -0
  242. alita_sdk/tools/utils/tool_prompts.py +79 -0
  243. alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +17 -13
  244. alita_sdk/tools/xray/__init__.py +12 -9
  245. alita_sdk/tools/yagmail/__init__.py +9 -3
  246. alita_sdk/tools/zephyr/__init__.py +9 -7
  247. alita_sdk/tools/zephyr_enterprise/__init__.py +11 -8
  248. alita_sdk/tools/zephyr_essential/__init__.py +10 -8
  249. alita_sdk/tools/zephyr_essential/api_wrapper.py +30 -13
  250. alita_sdk/tools/zephyr_essential/client.py +2 -2
  251. alita_sdk/tools/zephyr_scale/__init__.py +11 -9
  252. alita_sdk/tools/zephyr_scale/api_wrapper.py +2 -2
  253. alita_sdk/tools/zephyr_squad/__init__.py +10 -8
  254. {alita_sdk-0.3.462.dist-info → alita_sdk-0.3.627.dist-info}/METADATA +147 -7
  255. alita_sdk-0.3.627.dist-info/RECORD +468 -0
  256. alita_sdk-0.3.627.dist-info/entry_points.txt +2 -0
  257. alita_sdk-0.3.462.dist-info/RECORD +0 -384
  258. alita_sdk-0.3.462.dist-info/entry_points.txt +0 -2
  259. {alita_sdk-0.3.462.dist-info → alita_sdk-0.3.627.dist-info}/WHEEL +0 -0
  260. {alita_sdk-0.3.462.dist-info → alita_sdk-0.3.627.dist-info}/licenses/LICENSE +0 -0
  261. {alita_sdk-0.3.462.dist-info → alita_sdk-0.3.627.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,61 @@
1
+ """
2
+ Cross-file reference pattern detection module.
3
+
4
+ This module provides extensible pattern matching for detecting cross-file
5
+ relationships in various programming languages and document types.
6
+
7
+ Pattern categories:
8
+ - imports: Code import/include statements
9
+ - links: Documentation links (Markdown, Wiki, HTML)
10
+ - citations: Text references ("see X", "@see X", etc.)
11
+ - mentions: Entity name mentions in content
12
+
13
+ Supported approaches:
14
+ 1. Regex patterns - Fast, language-agnostic pattern matching
15
+ 2. AST parsing - Accurate code analysis using deepwiki parsers (when available)
16
+
17
+ Each pattern file defines patterns for a specific language or document type.
18
+ """
19
+
20
+ from .registry import PatternRegistry, Pattern, PatternCategory, RelationType
21
+ from .loader import (
22
+ load_all_patterns,
23
+ get_patterns_for_file,
24
+ get_patterns_for_content_type,
25
+ extract_references_from_content,
26
+ )
27
+
28
+ # AST adapter - provides integration with deepwiki parsers
29
+ from .ast_adapter import (
30
+ is_ast_available,
31
+ get_supported_ast_languages,
32
+ parse_file_ast,
33
+ parse_files_ast,
34
+ extract_ast_cross_file_relations,
35
+ get_symbols_for_entity_matching,
36
+ ASTSymbol,
37
+ ASTRelation,
38
+ ASTParseResult,
39
+ )
40
+
41
+ __all__ = [
42
+ # Pattern system
43
+ 'PatternRegistry',
44
+ 'Pattern',
45
+ 'PatternCategory',
46
+ 'RelationType',
47
+ 'load_all_patterns',
48
+ 'get_patterns_for_file',
49
+ 'get_patterns_for_content_type',
50
+ 'extract_references_from_content',
51
+ # AST adapter
52
+ 'is_ast_available',
53
+ 'get_supported_ast_languages',
54
+ 'parse_file_ast',
55
+ 'parse_files_ast',
56
+ 'extract_ast_cross_file_relations',
57
+ 'get_symbols_for_entity_matching',
58
+ 'ASTSymbol',
59
+ 'ASTRelation',
60
+ 'ASTParseResult',
61
+ ]
@@ -0,0 +1,380 @@
1
+ """
2
+ AST Adapter - Bridge between parsers module and patterns module.
3
+
4
+ This module provides a unified interface for AST-based code analysis,
5
+ integrating with the local parsers module for first-pass extraction.
6
+ """
7
+
8
+ from typing import Dict, List, Any, Optional, Set, Tuple
9
+ from pathlib import Path
10
+ import logging
11
+ from dataclasses import dataclass
12
+
13
+ # Import from local parsers module (self-contained, no external dependencies)
14
+ from ..parsers import (
15
+ parser_registry,
16
+ parse_file,
17
+ parse_files,
18
+ get_parser_for_file,
19
+ ParseResult,
20
+ Symbol,
21
+ Relationship,
22
+ RelationshipType,
23
+ SymbolType,
24
+ )
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+ # Type aliases for compatibility with patterns module
29
+ ASTSymbol = Symbol
30
+ ASTRelation = Relationship
31
+ ASTParseResult = ParseResult
32
+
33
+
34
+ def is_ast_available() -> bool:
35
+ """
36
+ Check if AST parsing is available.
37
+
38
+ Since we use the local parsers module with Python's built-in ast
39
+ and regex patterns, this is always available.
40
+
41
+ Returns:
42
+ True - AST parsing is always available
43
+ """
44
+ return True
45
+
46
+
47
+ def get_supported_languages() -> List[str]:
48
+ """
49
+ Get list of supported programming languages.
50
+
51
+ Returns:
52
+ List of language identifiers
53
+ """
54
+ return parser_registry.get_supported_languages()
55
+
56
+
57
+ def get_supported_ast_languages() -> List[str]:
58
+ """
59
+ Get list of supported programming languages for AST parsing.
60
+
61
+ Alias for get_supported_languages() for compatibility with patterns module.
62
+
63
+ Returns:
64
+ List of language identifiers
65
+ """
66
+ return get_supported_languages()
67
+
68
+
69
+ def get_supported_extensions() -> List[str]:
70
+ """
71
+ Get list of supported file extensions.
72
+
73
+ Returns:
74
+ List of file extensions (with dot prefix)
75
+ """
76
+ return parser_registry.get_supported_extensions()
77
+
78
+
79
+ def parse_file_ast(
80
+ file_path: str,
81
+ content: Optional[str] = None
82
+ ) -> Optional[ParseResult]:
83
+ """
84
+ Parse a single file and extract symbols and relationships.
85
+
86
+ Args:
87
+ file_path: Path to the file to parse
88
+ content: Optional file content (if not provided, will read from disk)
89
+
90
+ Returns:
91
+ ParseResult with symbols and relationships, or None if parsing fails
92
+ """
93
+ try:
94
+ return parse_file(file_path, content)
95
+ except Exception as e:
96
+ logger.warning(f"Failed to parse {file_path}: {e}")
97
+ return None
98
+
99
+
100
+ def parse_files_ast(
101
+ file_paths: List[str],
102
+ file_contents: Optional[Dict[str, str]] = None,
103
+ resolve_cross_file: bool = True,
104
+ max_workers: int = 4
105
+ ) -> Dict[str, ParseResult]:
106
+ """
107
+ Parse multiple files with optional cross-file resolution.
108
+
109
+ Args:
110
+ file_paths: List of file paths to parse
111
+ file_contents: Optional dict mapping file paths to content
112
+ resolve_cross_file: Whether to resolve cross-file references
113
+ max_workers: Maximum number of parallel workers
114
+
115
+ Returns:
116
+ Dict mapping file paths to ParseResult objects
117
+ """
118
+ results = {}
119
+
120
+ # Group files by language
121
+ files_by_language: Dict[str, List[Tuple[str, Optional[str]]]] = {}
122
+
123
+ for file_path in file_paths:
124
+ parser = get_parser_for_file(file_path)
125
+ if parser:
126
+ lang = parser.language
127
+ if lang not in files_by_language:
128
+ files_by_language[lang] = []
129
+ content = file_contents.get(file_path) if file_contents else None
130
+ files_by_language[lang].append((file_path, content))
131
+
132
+ # Parse each language group
133
+ for lang, files in files_by_language.items():
134
+ parser = parser_registry.get_parser(lang)
135
+ if parser and hasattr(parser, 'parse_multiple_files'):
136
+ try:
137
+ lang_results = parser.parse_multiple_files(
138
+ files,
139
+ resolve_cross_file=resolve_cross_file,
140
+ max_workers=max_workers
141
+ )
142
+ results.update(lang_results)
143
+ except Exception as e:
144
+ logger.warning(f"Failed to parse {lang} files: {e}")
145
+ # Fall back to individual parsing
146
+ for file_path, content in files:
147
+ result = parse_file_ast(file_path, content)
148
+ if result:
149
+ results[file_path] = result
150
+ else:
151
+ # Individual parsing fallback
152
+ for file_path, content in files:
153
+ result = parse_file_ast(file_path, content)
154
+ if result:
155
+ results[file_path] = result
156
+
157
+ return results
158
+
159
+
160
+ def extract_ast_cross_file_relations(
161
+ parse_results: Dict[str, ParseResult]
162
+ ) -> List[Dict[str, Any]]:
163
+ """
164
+ Extract cross-file relationships from parse results.
165
+
166
+ Args:
167
+ parse_results: Dict mapping file paths to ParseResult objects
168
+
169
+ Returns:
170
+ List of relationship dictionaries with source_file, target_file, etc.
171
+ """
172
+ cross_file_relations = []
173
+
174
+ # Build symbol index
175
+ symbol_to_file: Dict[str, str] = {}
176
+ for file_path, result in parse_results.items():
177
+ for symbol in result.symbols:
178
+ symbol_to_file[symbol.name] = file_path
179
+ if symbol.qualified_name:
180
+ symbol_to_file[symbol.qualified_name] = file_path
181
+
182
+ # Find cross-file relationships
183
+ for file_path, result in parse_results.items():
184
+ for rel in result.relationships:
185
+ target_file = symbol_to_file.get(rel.target)
186
+ if target_file and target_file != file_path:
187
+ cross_file_relations.append({
188
+ 'source_file': file_path,
189
+ 'source': rel.source,
190
+ 'target_file': target_file,
191
+ 'target': rel.target,
192
+ 'relationship_type': rel.relationship_type.value,
193
+ 'metadata': rel.metadata
194
+ })
195
+
196
+ return cross_file_relations
197
+
198
+
199
+ def extract_first_pass_entities(
200
+ file_path: str,
201
+ content: str
202
+ ) -> List[Dict[str, Any]]:
203
+ """
204
+ Extract entities (symbols) from a file for first-pass processing.
205
+
206
+ This is a non-LLM based extraction using AST/regex patterns.
207
+
208
+ Args:
209
+ file_path: Path to the file
210
+ content: File content
211
+
212
+ Returns:
213
+ List of entity dictionaries
214
+ """
215
+ result = parse_file_ast(file_path, content)
216
+ if not result:
217
+ return []
218
+
219
+ entities = []
220
+ for symbol in result.symbols:
221
+ entity = {
222
+ 'name': symbol.name,
223
+ 'type': symbol.symbol_type.value,
224
+ 'file_path': file_path,
225
+ 'line_start': symbol.line_start,
226
+ 'line_end': symbol.line_end,
227
+ 'qualified_name': symbol.qualified_name,
228
+ }
229
+ if symbol.docstring:
230
+ entity['docstring'] = symbol.docstring
231
+ if symbol.metadata:
232
+ entity['metadata'] = symbol.metadata
233
+ entities.append(entity)
234
+
235
+ return entities
236
+
237
+
238
+ def extract_first_pass_relations(
239
+ file_path: str,
240
+ content: str
241
+ ) -> List[Dict[str, Any]]:
242
+ """
243
+ Extract relationships from a file for first-pass processing.
244
+
245
+ This is a non-LLM based extraction using AST/regex patterns.
246
+
247
+ Args:
248
+ file_path: Path to the file
249
+ content: File content
250
+
251
+ Returns:
252
+ List of relationship dictionaries
253
+ """
254
+ result = parse_file_ast(file_path, content)
255
+ if not result:
256
+ return []
257
+
258
+ relations = []
259
+ for rel in result.relationships:
260
+ relation = {
261
+ 'source': rel.source,
262
+ 'target': rel.target,
263
+ 'relationship_type': rel.relationship_type.value,
264
+ 'file_path': file_path,
265
+ 'line': rel.line,
266
+ }
267
+ if rel.metadata:
268
+ relation['metadata'] = rel.metadata
269
+ relations.append(relation)
270
+
271
+ return relations
272
+
273
+
274
+ def get_file_summary(
275
+ file_path: str,
276
+ content: str
277
+ ) -> Dict[str, Any]:
278
+ """
279
+ Get a summary of a file's structure.
280
+
281
+ Args:
282
+ file_path: Path to the file
283
+ content: File content
284
+
285
+ Returns:
286
+ Summary dictionary with counts and top-level items
287
+ """
288
+ result = parse_file_ast(file_path, content)
289
+ if not result:
290
+ return {
291
+ 'file_path': file_path,
292
+ 'language': 'unknown',
293
+ 'symbols': [],
294
+ 'relationships': [],
295
+ 'counts': {}
296
+ }
297
+
298
+ # Count by type
299
+ symbol_counts: Dict[str, int] = {}
300
+ for symbol in result.symbols:
301
+ type_name = symbol.symbol_type.value
302
+ symbol_counts[type_name] = symbol_counts.get(type_name, 0) + 1
303
+
304
+ rel_counts: Dict[str, int] = {}
305
+ for rel in result.relationships:
306
+ type_name = rel.relationship_type.value
307
+ rel_counts[type_name] = rel_counts.get(type_name, 0) + 1
308
+
309
+ return {
310
+ 'file_path': file_path,
311
+ 'language': result.language,
312
+ 'symbols': [s.name for s in result.symbols],
313
+ 'relationships': len(result.relationships),
314
+ 'counts': {
315
+ 'symbols': symbol_counts,
316
+ 'relationships': rel_counts
317
+ }
318
+ }
319
+
320
+
321
+ def get_symbols_for_entity_matching(
322
+ parse_results: Dict[str, ParseResult]
323
+ ) -> Dict[str, List[Dict[str, Any]]]:
324
+ """
325
+ Get symbols formatted for entity matching.
326
+
327
+ This function extracts symbols from parse results and formats them
328
+ for use in entity matching algorithms.
329
+
330
+ Args:
331
+ parse_results: Dict mapping file paths to ParseResult objects
332
+
333
+ Returns:
334
+ Dict mapping file paths to lists of symbol dictionaries
335
+ """
336
+ result = {}
337
+ for file_path, parse_result in parse_results.items():
338
+ symbols = []
339
+ for symbol in parse_result.symbols:
340
+ symbols.append({
341
+ 'name': symbol.name,
342
+ 'type': symbol.symbol_type.value,
343
+ 'full_name': symbol.full_name or symbol.get_qualified_name(),
344
+ 'file_path': symbol.file_path,
345
+ 'visibility': symbol.visibility,
346
+ 'docstring': symbol.docstring,
347
+ 'range': {
348
+ 'start_line': symbol.range.start.line,
349
+ 'end_line': symbol.range.end.line
350
+ } if symbol.range else None,
351
+ 'metadata': symbol.metadata
352
+ })
353
+ result[file_path] = symbols
354
+ return result
355
+
356
+
357
+ # Export key functions and types
358
+ __all__ = [
359
+ 'is_ast_available',
360
+ 'get_supported_languages',
361
+ 'get_supported_ast_languages',
362
+ 'get_supported_extensions',
363
+ 'parse_file_ast',
364
+ 'parse_files_ast',
365
+ 'extract_ast_cross_file_relations',
366
+ 'extract_first_pass_entities',
367
+ 'extract_first_pass_relations',
368
+ 'get_file_summary',
369
+ 'get_symbols_for_entity_matching',
370
+ # Type aliases
371
+ 'ASTSymbol',
372
+ 'ASTRelation',
373
+ 'ASTParseResult',
374
+ # Re-export types
375
+ 'ParseResult',
376
+ 'Symbol',
377
+ 'Relationship',
378
+ 'RelationshipType',
379
+ 'SymbolType',
380
+ ]