agenticdome-python-sdk 1.2.18__tar.gz → 1.2.21__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.
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/MANIFEST.in +1 -1
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/PKG-INFO +22 -22
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/PKG-INFO +22 -22
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/SOURCES.txt +4 -23
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/requires.txt +21 -21
- agenticdome_python_sdk-1.2.21/agenticdome_sdk/copilot_ir.py +294 -0
- agenticdome_python_sdk-1.2.21/agenticdome_sdk/copilot_ir_collector.cjs +110 -0
- agenticdome_python_sdk-1.2.21/agenticdome_sdk/hook_catalog.py +593 -0
- agenticdome_python_sdk-1.2.21/agenticdome_sdk/onboarding_cli.py +1213 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/customer-onboarding.md +23 -9
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/pyproject.toml +25 -22
- agenticdome_python_sdk-1.2.18/agenticdome_sdk/onboarding_cli.py +0 -649
- agenticdome_python_sdk-1.2.18/tests/test_agno_integration.py +0 -334
- agenticdome_python_sdk-1.2.18/tests/test_attack_demo.py +0 -49
- agenticdome_python_sdk-1.2.18/tests/test_autogen_integration.py +0 -319
- agenticdome_python_sdk-1.2.18/tests/test_aws_bedrock_integration.py +0 -405
- agenticdome_python_sdk-1.2.18/tests/test_claude_integration.py +0 -243
- agenticdome_python_sdk-1.2.18/tests/test_client.py +0 -448
- agenticdome_python_sdk-1.2.18/tests/test_crewai_integration.py +0 -254
- agenticdome_python_sdk-1.2.18/tests/test_execution_broker.py +0 -92
- agenticdome_python_sdk-1.2.18/tests/test_framework_guides.py +0 -187
- agenticdome_python_sdk-1.2.18/tests/test_google_adk_integration.py +0 -296
- agenticdome_python_sdk-1.2.18/tests/test_identity_context.py +0 -40
- agenticdome_python_sdk-1.2.18/tests/test_langgraph_integration.py +0 -349
- agenticdome_python_sdk-1.2.18/tests/test_llamaindex_integration.py +0 -227
- agenticdome_python_sdk-1.2.18/tests/test_local_simulation.py +0 -306
- agenticdome_python_sdk-1.2.18/tests/test_mcp_host_integration.py +0 -393
- agenticdome_python_sdk-1.2.18/tests/test_mcp_launch_example.py +0 -31
- agenticdome_python_sdk-1.2.18/tests/test_microsoft_agent_framework_integration.py +0 -321
- agenticdome_python_sdk-1.2.18/tests/test_microsoft_ai_foundry_integration.py +0 -344
- agenticdome_python_sdk-1.2.18/tests/test_onboarding_cli.py +0 -209
- agenticdome_python_sdk-1.2.18/tests/test_openai_agents_integration.py +0 -313
- agenticdome_python_sdk-1.2.18/tests/test_pydanticai_integration.py +0 -259
- agenticdome_python_sdk-1.2.18/tests/test_smolagents_integration.py +0 -181
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/CONTRIBUTING.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/LICENSE +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/NOTICE +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/README.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/SECURITY.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/dependency_links.txt +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/entry_points.txt +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_python_sdk.egg-info/top_level.txt +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/__init__.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/_framework_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/_mode.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/agno.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/autogen.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/aws_bedrock.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/claude.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/client.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/crewai.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/demo.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/google_adk.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/identity.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/langgraph.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/llamaindex.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/mcp_host.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/microsoft_agent_framework.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/microsoft_ai_foundry.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/openai_agents.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/proof.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/pydantic.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/simulation.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/agenticdome_sdk/smolagents.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/README.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/agno.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/autogen.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/aws-bedrock.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/claude-agent-sdk.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/crewai.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/custom-python.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/google-adk.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/langgraph.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/llamaindex.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/microsoft-agent-framework.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/microsoft-ai-foundry.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/openai-agents.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/pydanticai.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/frameworks/smolagents.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/mcp-integration.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/performance-evidence.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/docs/runtime-deployment.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/PRODUCTION_INTEGRATION.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/README.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/attack_demo.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/crewai_agenticdome_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/README.md +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/_shared.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/agno.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/autogen.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/aws_bedrock.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/claude_agent_sdk.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/crewai.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/custom_python.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/google_adk.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/langgraph.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/llamaindex.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/mcp.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/microsoft_agent_framework.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/microsoft_ai_foundry.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/openai_agents.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/pydanticai.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/frameworks/smolagents.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/langgraph_agenticdome_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/local_simulation_gallery.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/examples/mcp_gateway_action_firewall.py +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/setup.cfg +0 -0
- {agenticdome_python_sdk-1.2.18 → agenticdome_python_sdk-1.2.21}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agenticdome-python-sdk
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.21
|
|
4
4
|
Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
|
|
5
5
|
Author: AgenticDome
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -32,20 +32,20 @@ License-File: NOTICE
|
|
|
32
32
|
Requires-Dist: requests>=2.31.0
|
|
33
33
|
Requires-Dist: urllib3>=2.0.0
|
|
34
34
|
Provides-Extra: crewai
|
|
35
|
-
Requires-Dist: crewai<=1.15.
|
|
35
|
+
Requires-Dist: crewai<=1.15.17,>=1.15.5; extra == "crewai"
|
|
36
36
|
Provides-Extra: redis
|
|
37
37
|
Requires-Dist: redis>=4.5.0; extra == "redis"
|
|
38
38
|
Provides-Extra: pop
|
|
39
39
|
Requires-Dist: cryptography>=42.0.0; extra == "pop"
|
|
40
40
|
Provides-Extra: pydanticai
|
|
41
|
-
Requires-Dist: pydantic-ai<=2.
|
|
41
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "pydanticai"
|
|
42
42
|
Requires-Dist: anyio>=4.0.0; extra == "pydanticai"
|
|
43
43
|
Provides-Extra: pydantic
|
|
44
|
-
Requires-Dist: pydantic-ai<=2.
|
|
44
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "pydantic"
|
|
45
45
|
Requires-Dist: anyio>=4.0.0; extra == "pydantic"
|
|
46
46
|
Provides-Extra: langgraph
|
|
47
47
|
Requires-Dist: langgraph<=1.2.11,>=1.2.9; extra == "langgraph"
|
|
48
|
-
Requires-Dist: langchain-core<=1.
|
|
48
|
+
Requires-Dist: langchain-core<=1.6.0,>=1.5.0; extra == "langgraph"
|
|
49
49
|
Requires-Dist: langchain-openai==1.3.5; extra == "langgraph"
|
|
50
50
|
Requires-Dist: anyio>=4.0.0; extra == "langgraph"
|
|
51
51
|
Provides-Extra: microsoft
|
|
@@ -59,46 +59,46 @@ Requires-Dist: azure-identity==1.25.3; extra == "foundry"
|
|
|
59
59
|
Provides-Extra: agno
|
|
60
60
|
Requires-Dist: agno<=2.9.0,>=2.8.0; extra == "agno"
|
|
61
61
|
Provides-Extra: openai-agents
|
|
62
|
-
Requires-Dist: openai-agents<=0.
|
|
62
|
+
Requires-Dist: openai-agents<=0.22.0,>=0.18.3; extra == "openai-agents"
|
|
63
63
|
Provides-Extra: mcp
|
|
64
64
|
Requires-Dist: mcp<=1.28.1,>=1.26.0; extra == "mcp"
|
|
65
65
|
Provides-Extra: bedrock
|
|
66
|
-
Requires-Dist: boto3<=1.43.
|
|
66
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "bedrock"
|
|
67
67
|
Provides-Extra: aws-bedrock
|
|
68
|
-
Requires-Dist: boto3<=1.43.
|
|
68
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "aws-bedrock"
|
|
69
69
|
Provides-Extra: llamaindex
|
|
70
|
-
Requires-Dist: llama-index
|
|
70
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "llamaindex"
|
|
71
71
|
Provides-Extra: llama-index
|
|
72
|
-
Requires-Dist: llama-index
|
|
72
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "llama-index"
|
|
73
73
|
Provides-Extra: google-adk
|
|
74
|
-
Requires-Dist: google-adk<=2.7.
|
|
74
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "google-adk"
|
|
75
75
|
Provides-Extra: adk
|
|
76
|
-
Requires-Dist: google-adk<=2.7.
|
|
76
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "adk"
|
|
77
77
|
Provides-Extra: claude
|
|
78
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
78
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "claude"
|
|
79
79
|
Provides-Extra: claude-agent-sdk
|
|
80
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
80
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "claude-agent-sdk"
|
|
81
81
|
Provides-Extra: smolagents
|
|
82
82
|
Requires-Dist: smolagents==1.26.0; extra == "smolagents"
|
|
83
83
|
Provides-Extra: all
|
|
84
|
-
Requires-Dist: crewai<=1.15.
|
|
84
|
+
Requires-Dist: crewai<=1.15.17,>=1.15.5; extra == "all"
|
|
85
85
|
Requires-Dist: redis>=4.5.0; extra == "all"
|
|
86
86
|
Requires-Dist: cryptography>=42.0.0; extra == "all"
|
|
87
|
-
Requires-Dist: pydantic-ai<=2.
|
|
87
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "all"
|
|
88
88
|
Requires-Dist: anyio>=4.0.0; extra == "all"
|
|
89
89
|
Requires-Dist: langgraph<=1.2.11,>=1.2.9; extra == "all"
|
|
90
|
-
Requires-Dist: langchain-core<=1.
|
|
90
|
+
Requires-Dist: langchain-core<=1.6.0,>=1.5.0; extra == "all"
|
|
91
91
|
Requires-Dist: langchain-openai==1.3.5; extra == "all"
|
|
92
92
|
Requires-Dist: autogen-agentchat==0.7.5; extra == "all"
|
|
93
93
|
Requires-Dist: agno<=2.9.0,>=2.8.0; extra == "all"
|
|
94
94
|
Requires-Dist: azure-ai-projects<=2.4.0,>=2.3.0; extra == "all"
|
|
95
95
|
Requires-Dist: azure-identity==1.25.3; extra == "all"
|
|
96
|
-
Requires-Dist: openai-agents<=0.
|
|
96
|
+
Requires-Dist: openai-agents<=0.22.0,>=0.18.3; extra == "all"
|
|
97
97
|
Requires-Dist: mcp<=1.28.1,>=1.26.0; extra == "all"
|
|
98
|
-
Requires-Dist: boto3<=1.43.
|
|
99
|
-
Requires-Dist: llama-index
|
|
100
|
-
Requires-Dist: google-adk<=2.7.
|
|
101
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
98
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "all"
|
|
99
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "all"
|
|
100
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "all"
|
|
101
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "all"
|
|
102
102
|
Requires-Dist: smolagents==1.26.0; extra == "all"
|
|
103
103
|
Provides-Extra: dev
|
|
104
104
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agenticdome-python-sdk
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.21
|
|
4
4
|
Summary: Official Python SDK for AgenticDome security guardrails, DLP, tool authorization, and multi-agent delegation enforcement.
|
|
5
5
|
Author: AgenticDome
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -32,20 +32,20 @@ License-File: NOTICE
|
|
|
32
32
|
Requires-Dist: requests>=2.31.0
|
|
33
33
|
Requires-Dist: urllib3>=2.0.0
|
|
34
34
|
Provides-Extra: crewai
|
|
35
|
-
Requires-Dist: crewai<=1.15.
|
|
35
|
+
Requires-Dist: crewai<=1.15.17,>=1.15.5; extra == "crewai"
|
|
36
36
|
Provides-Extra: redis
|
|
37
37
|
Requires-Dist: redis>=4.5.0; extra == "redis"
|
|
38
38
|
Provides-Extra: pop
|
|
39
39
|
Requires-Dist: cryptography>=42.0.0; extra == "pop"
|
|
40
40
|
Provides-Extra: pydanticai
|
|
41
|
-
Requires-Dist: pydantic-ai<=2.
|
|
41
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "pydanticai"
|
|
42
42
|
Requires-Dist: anyio>=4.0.0; extra == "pydanticai"
|
|
43
43
|
Provides-Extra: pydantic
|
|
44
|
-
Requires-Dist: pydantic-ai<=2.
|
|
44
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "pydantic"
|
|
45
45
|
Requires-Dist: anyio>=4.0.0; extra == "pydantic"
|
|
46
46
|
Provides-Extra: langgraph
|
|
47
47
|
Requires-Dist: langgraph<=1.2.11,>=1.2.9; extra == "langgraph"
|
|
48
|
-
Requires-Dist: langchain-core<=1.
|
|
48
|
+
Requires-Dist: langchain-core<=1.6.0,>=1.5.0; extra == "langgraph"
|
|
49
49
|
Requires-Dist: langchain-openai==1.3.5; extra == "langgraph"
|
|
50
50
|
Requires-Dist: anyio>=4.0.0; extra == "langgraph"
|
|
51
51
|
Provides-Extra: microsoft
|
|
@@ -59,46 +59,46 @@ Requires-Dist: azure-identity==1.25.3; extra == "foundry"
|
|
|
59
59
|
Provides-Extra: agno
|
|
60
60
|
Requires-Dist: agno<=2.9.0,>=2.8.0; extra == "agno"
|
|
61
61
|
Provides-Extra: openai-agents
|
|
62
|
-
Requires-Dist: openai-agents<=0.
|
|
62
|
+
Requires-Dist: openai-agents<=0.22.0,>=0.18.3; extra == "openai-agents"
|
|
63
63
|
Provides-Extra: mcp
|
|
64
64
|
Requires-Dist: mcp<=1.28.1,>=1.26.0; extra == "mcp"
|
|
65
65
|
Provides-Extra: bedrock
|
|
66
|
-
Requires-Dist: boto3<=1.43.
|
|
66
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "bedrock"
|
|
67
67
|
Provides-Extra: aws-bedrock
|
|
68
|
-
Requires-Dist: boto3<=1.43.
|
|
68
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "aws-bedrock"
|
|
69
69
|
Provides-Extra: llamaindex
|
|
70
|
-
Requires-Dist: llama-index
|
|
70
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "llamaindex"
|
|
71
71
|
Provides-Extra: llama-index
|
|
72
|
-
Requires-Dist: llama-index
|
|
72
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "llama-index"
|
|
73
73
|
Provides-Extra: google-adk
|
|
74
|
-
Requires-Dist: google-adk<=2.7.
|
|
74
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "google-adk"
|
|
75
75
|
Provides-Extra: adk
|
|
76
|
-
Requires-Dist: google-adk<=2.7.
|
|
76
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "adk"
|
|
77
77
|
Provides-Extra: claude
|
|
78
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
78
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "claude"
|
|
79
79
|
Provides-Extra: claude-agent-sdk
|
|
80
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
80
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "claude-agent-sdk"
|
|
81
81
|
Provides-Extra: smolagents
|
|
82
82
|
Requires-Dist: smolagents==1.26.0; extra == "smolagents"
|
|
83
83
|
Provides-Extra: all
|
|
84
|
-
Requires-Dist: crewai<=1.15.
|
|
84
|
+
Requires-Dist: crewai<=1.15.17,>=1.15.5; extra == "all"
|
|
85
85
|
Requires-Dist: redis>=4.5.0; extra == "all"
|
|
86
86
|
Requires-Dist: cryptography>=42.0.0; extra == "all"
|
|
87
|
-
Requires-Dist: pydantic-ai<=2.
|
|
87
|
+
Requires-Dist: pydantic-ai<=2.32.1,>=2.16.0; extra == "all"
|
|
88
88
|
Requires-Dist: anyio>=4.0.0; extra == "all"
|
|
89
89
|
Requires-Dist: langgraph<=1.2.11,>=1.2.9; extra == "all"
|
|
90
|
-
Requires-Dist: langchain-core<=1.
|
|
90
|
+
Requires-Dist: langchain-core<=1.6.0,>=1.5.0; extra == "all"
|
|
91
91
|
Requires-Dist: langchain-openai==1.3.5; extra == "all"
|
|
92
92
|
Requires-Dist: autogen-agentchat==0.7.5; extra == "all"
|
|
93
93
|
Requires-Dist: agno<=2.9.0,>=2.8.0; extra == "all"
|
|
94
94
|
Requires-Dist: azure-ai-projects<=2.4.0,>=2.3.0; extra == "all"
|
|
95
95
|
Requires-Dist: azure-identity==1.25.3; extra == "all"
|
|
96
|
-
Requires-Dist: openai-agents<=0.
|
|
96
|
+
Requires-Dist: openai-agents<=0.22.0,>=0.18.3; extra == "all"
|
|
97
97
|
Requires-Dist: mcp<=1.28.1,>=1.26.0; extra == "all"
|
|
98
|
-
Requires-Dist: boto3<=1.43.
|
|
99
|
-
Requires-Dist: llama-index
|
|
100
|
-
Requires-Dist: google-adk<=2.7.
|
|
101
|
-
Requires-Dist: claude-agent-sdk<=0.2.
|
|
98
|
+
Requires-Dist: boto3<=1.43.75,>=1.43.54; extra == "all"
|
|
99
|
+
Requires-Dist: llama-index<=0.14.24,>=0.14.23; extra == "all"
|
|
100
|
+
Requires-Dist: google-adk<=2.7.1,>=2.5.0; extra == "all"
|
|
101
|
+
Requires-Dist: claude-agent-sdk<=0.2.142,>=0.2.126; extra == "all"
|
|
102
102
|
Requires-Dist: smolagents==1.26.0; extra == "all"
|
|
103
103
|
Provides-Extra: dev
|
|
104
104
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
@@ -20,9 +20,12 @@ agenticdome_sdk/autogen.py
|
|
|
20
20
|
agenticdome_sdk/aws_bedrock.py
|
|
21
21
|
agenticdome_sdk/claude.py
|
|
22
22
|
agenticdome_sdk/client.py
|
|
23
|
+
agenticdome_sdk/copilot_ir.py
|
|
24
|
+
agenticdome_sdk/copilot_ir_collector.cjs
|
|
23
25
|
agenticdome_sdk/crewai.py
|
|
24
26
|
agenticdome_sdk/demo.py
|
|
25
27
|
agenticdome_sdk/google_adk.py
|
|
28
|
+
agenticdome_sdk/hook_catalog.py
|
|
26
29
|
agenticdome_sdk/identity.py
|
|
27
30
|
agenticdome_sdk/langgraph.py
|
|
28
31
|
agenticdome_sdk/llamaindex.py
|
|
@@ -77,26 +80,4 @@ examples/frameworks/microsoft_agent_framework.py
|
|
|
77
80
|
examples/frameworks/microsoft_ai_foundry.py
|
|
78
81
|
examples/frameworks/openai_agents.py
|
|
79
82
|
examples/frameworks/pydanticai.py
|
|
80
|
-
examples/frameworks/smolagents.py
|
|
81
|
-
tests/test_agno_integration.py
|
|
82
|
-
tests/test_attack_demo.py
|
|
83
|
-
tests/test_autogen_integration.py
|
|
84
|
-
tests/test_aws_bedrock_integration.py
|
|
85
|
-
tests/test_claude_integration.py
|
|
86
|
-
tests/test_client.py
|
|
87
|
-
tests/test_crewai_integration.py
|
|
88
|
-
tests/test_execution_broker.py
|
|
89
|
-
tests/test_framework_guides.py
|
|
90
|
-
tests/test_google_adk_integration.py
|
|
91
|
-
tests/test_identity_context.py
|
|
92
|
-
tests/test_langgraph_integration.py
|
|
93
|
-
tests/test_llamaindex_integration.py
|
|
94
|
-
tests/test_local_simulation.py
|
|
95
|
-
tests/test_mcp_host_integration.py
|
|
96
|
-
tests/test_mcp_launch_example.py
|
|
97
|
-
tests/test_microsoft_agent_framework_integration.py
|
|
98
|
-
tests/test_microsoft_ai_foundry_integration.py
|
|
99
|
-
tests/test_onboarding_cli.py
|
|
100
|
-
tests/test_openai_agents_integration.py
|
|
101
|
-
tests/test_pydanticai_integration.py
|
|
102
|
-
tests/test_smolagents_integration.py
|
|
83
|
+
examples/frameworks/smolagents.py
|
|
@@ -2,49 +2,49 @@ requests>=2.31.0
|
|
|
2
2
|
urllib3>=2.0.0
|
|
3
3
|
|
|
4
4
|
[adk]
|
|
5
|
-
google-adk<=2.7.
|
|
5
|
+
google-adk<=2.7.1,>=2.5.0
|
|
6
6
|
|
|
7
7
|
[agno]
|
|
8
8
|
agno<=2.9.0,>=2.8.0
|
|
9
9
|
|
|
10
10
|
[all]
|
|
11
|
-
crewai<=1.15.
|
|
11
|
+
crewai<=1.15.17,>=1.15.5
|
|
12
12
|
redis>=4.5.0
|
|
13
13
|
cryptography>=42.0.0
|
|
14
|
-
pydantic-ai<=2.
|
|
14
|
+
pydantic-ai<=2.32.1,>=2.16.0
|
|
15
15
|
anyio>=4.0.0
|
|
16
16
|
langgraph<=1.2.11,>=1.2.9
|
|
17
|
-
langchain-core<=1.
|
|
17
|
+
langchain-core<=1.6.0,>=1.5.0
|
|
18
18
|
langchain-openai==1.3.5
|
|
19
19
|
autogen-agentchat==0.7.5
|
|
20
20
|
agno<=2.9.0,>=2.8.0
|
|
21
21
|
azure-ai-projects<=2.4.0,>=2.3.0
|
|
22
22
|
azure-identity==1.25.3
|
|
23
|
-
openai-agents<=0.
|
|
23
|
+
openai-agents<=0.22.0,>=0.18.3
|
|
24
24
|
mcp<=1.28.1,>=1.26.0
|
|
25
|
-
boto3<=1.43.
|
|
26
|
-
llama-index
|
|
27
|
-
google-adk<=2.7.
|
|
28
|
-
claude-agent-sdk<=0.2.
|
|
25
|
+
boto3<=1.43.75,>=1.43.54
|
|
26
|
+
llama-index<=0.14.24,>=0.14.23
|
|
27
|
+
google-adk<=2.7.1,>=2.5.0
|
|
28
|
+
claude-agent-sdk<=0.2.142,>=0.2.126
|
|
29
29
|
smolagents==1.26.0
|
|
30
30
|
|
|
31
31
|
[autogen]
|
|
32
32
|
autogen-agentchat==0.7.5
|
|
33
33
|
|
|
34
34
|
[aws-bedrock]
|
|
35
|
-
boto3<=1.43.
|
|
35
|
+
boto3<=1.43.75,>=1.43.54
|
|
36
36
|
|
|
37
37
|
[bedrock]
|
|
38
|
-
boto3<=1.43.
|
|
38
|
+
boto3<=1.43.75,>=1.43.54
|
|
39
39
|
|
|
40
40
|
[claude]
|
|
41
|
-
claude-agent-sdk<=0.2.
|
|
41
|
+
claude-agent-sdk<=0.2.142,>=0.2.126
|
|
42
42
|
|
|
43
43
|
[claude-agent-sdk]
|
|
44
|
-
claude-agent-sdk<=0.2.
|
|
44
|
+
claude-agent-sdk<=0.2.142,>=0.2.126
|
|
45
45
|
|
|
46
46
|
[crewai]
|
|
47
|
-
crewai<=1.15.
|
|
47
|
+
crewai<=1.15.17,>=1.15.5
|
|
48
48
|
|
|
49
49
|
[dev]
|
|
50
50
|
pytest>=8.0.0
|
|
@@ -62,19 +62,19 @@ azure-ai-projects<=2.4.0,>=2.3.0
|
|
|
62
62
|
azure-identity==1.25.3
|
|
63
63
|
|
|
64
64
|
[google-adk]
|
|
65
|
-
google-adk<=2.7.
|
|
65
|
+
google-adk<=2.7.1,>=2.5.0
|
|
66
66
|
|
|
67
67
|
[langgraph]
|
|
68
68
|
langgraph<=1.2.11,>=1.2.9
|
|
69
|
-
langchain-core<=1.
|
|
69
|
+
langchain-core<=1.6.0,>=1.5.0
|
|
70
70
|
langchain-openai==1.3.5
|
|
71
71
|
anyio>=4.0.0
|
|
72
72
|
|
|
73
73
|
[llama-index]
|
|
74
|
-
llama-index
|
|
74
|
+
llama-index<=0.14.24,>=0.14.23
|
|
75
75
|
|
|
76
76
|
[llamaindex]
|
|
77
|
-
llama-index
|
|
77
|
+
llama-index<=0.14.24,>=0.14.23
|
|
78
78
|
|
|
79
79
|
[mcp]
|
|
80
80
|
mcp<=1.28.1,>=1.26.0
|
|
@@ -85,17 +85,17 @@ mcp<=1.28.1,>=1.26.0
|
|
|
85
85
|
autogen-agentchat==0.7.5
|
|
86
86
|
|
|
87
87
|
[openai-agents]
|
|
88
|
-
openai-agents<=0.
|
|
88
|
+
openai-agents<=0.22.0,>=0.18.3
|
|
89
89
|
|
|
90
90
|
[pop]
|
|
91
91
|
cryptography>=42.0.0
|
|
92
92
|
|
|
93
93
|
[pydantic]
|
|
94
|
-
pydantic-ai<=2.
|
|
94
|
+
pydantic-ai<=2.32.1,>=2.16.0
|
|
95
95
|
anyio>=4.0.0
|
|
96
96
|
|
|
97
97
|
[pydanticai]
|
|
98
|
-
pydantic-ai<=2.
|
|
98
|
+
pydantic-ai<=2.32.1,>=2.16.0
|
|
99
99
|
anyio>=4.0.0
|
|
100
100
|
|
|
101
101
|
[redis]
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"""Generic, source-free AST collection for the AgenticDome Integration Copilot.
|
|
2
|
+
|
|
3
|
+
This public module deliberately performs no placement ranking, guard-dominance
|
|
4
|
+
reasoning, bypass scoring or compatibility decisions. Those protectable
|
|
5
|
+
capabilities live in the private Copilot Core. The collector emits bounded
|
|
6
|
+
structural metadata and never emits source text, literals or absolute paths.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import ast
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
import shutil
|
|
15
|
+
import subprocess
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict, List, Sequence, Tuple
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
IR_SCHEMA = "agenticdome.copilot-ir.v1"
|
|
21
|
+
MAX_IR_FILES = 1_000
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _relative(path: Path, root: Path) -> str:
|
|
25
|
+
try:
|
|
26
|
+
return path.resolve().relative_to(root.resolve()).as_posix()
|
|
27
|
+
except (OSError, ValueError):
|
|
28
|
+
return path.name
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _dotted_name(node: ast.AST) -> str:
|
|
32
|
+
if isinstance(node, ast.Name):
|
|
33
|
+
return node.id.lower()
|
|
34
|
+
if isinstance(node, ast.Attribute):
|
|
35
|
+
left = _dotted_name(node.value)
|
|
36
|
+
return (left + "." if left else "") + node.attr.lower()
|
|
37
|
+
if isinstance(node, ast.Call):
|
|
38
|
+
return _dotted_name(node.func)
|
|
39
|
+
return ""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _tail(value: str) -> str:
|
|
43
|
+
return str(value or "").rsplit(".", 1)[-1].lower()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _literal_enum(node: ast.AST | None, allowed: set[str]) -> str:
|
|
47
|
+
if isinstance(node, ast.Constant) and isinstance(node.value, str):
|
|
48
|
+
value = node.value.strip().lower()
|
|
49
|
+
return value if value in allowed else ""
|
|
50
|
+
return ""
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _call_hints(node: ast.Call) -> Dict[str, Any]:
|
|
54
|
+
hints: Dict[str, Any] = {}
|
|
55
|
+
has_tool_binding = False
|
|
56
|
+
for keyword in node.keywords:
|
|
57
|
+
if keyword.arg == "direction":
|
|
58
|
+
direction = _literal_enum(keyword.value, {"input", "inbound", "output", "outbound"})
|
|
59
|
+
if direction:
|
|
60
|
+
hints["direction"] = direction
|
|
61
|
+
elif keyword.arg in {"tool_name", "tool_args"}:
|
|
62
|
+
has_tool_binding = True
|
|
63
|
+
elif keyword.arg == "policy_context" and isinstance(keyword.value, ast.Dict):
|
|
64
|
+
for key, value in zip(keyword.value.keys, keyword.value.values):
|
|
65
|
+
if _literal_enum(key, {"request_purpose"}) != "request_purpose":
|
|
66
|
+
continue
|
|
67
|
+
purpose = _literal_enum(
|
|
68
|
+
value,
|
|
69
|
+
{"prompt_input", "tool_execution", "output_review", "sdk_onboarding_verification"},
|
|
70
|
+
)
|
|
71
|
+
if purpose:
|
|
72
|
+
hints["request_purpose"] = purpose
|
|
73
|
+
if has_tool_binding:
|
|
74
|
+
hints["has_tool_binding"] = True
|
|
75
|
+
return hints
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class _PythonIRVisitor(ast.NodeVisitor):
|
|
79
|
+
def __init__(self, path: str) -> None:
|
|
80
|
+
self.path = path
|
|
81
|
+
self.stack: List[str] = ["<module>"]
|
|
82
|
+
self.flow_stack: List[str] = []
|
|
83
|
+
self.functions: Dict[str, Dict[str, Any]] = {
|
|
84
|
+
"<module>": {
|
|
85
|
+
"symbol": "<module>",
|
|
86
|
+
"path": path,
|
|
87
|
+
"line": 1,
|
|
88
|
+
"hints": {"entrypoint": True, "parameters": [], "decorators": []},
|
|
89
|
+
"events": [],
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
self.features = {"functions": 0, "calls": 0, "returns": 0}
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def current(self) -> Dict[str, Any]:
|
|
96
|
+
return self.functions[self.stack[-1]]
|
|
97
|
+
|
|
98
|
+
def _visit_function(self, node: ast.AST) -> None:
|
|
99
|
+
name = str(getattr(node, "name", "anonymous"))
|
|
100
|
+
parent = self.stack[-1]
|
|
101
|
+
symbol = name if parent == "<module>" else parent + "." + name
|
|
102
|
+
decorators = [_dotted_name(item) for item in getattr(node, "decorator_list", [])]
|
|
103
|
+
parameters = [arg.arg.lower() for arg in getattr(getattr(node, "args", None), "args", [])]
|
|
104
|
+
self.functions[symbol] = {
|
|
105
|
+
"symbol": symbol,
|
|
106
|
+
"path": self.path,
|
|
107
|
+
"line": int(getattr(node, "lineno", 1)),
|
|
108
|
+
"hints": {"parameters": parameters[:100], "decorators": decorators[:50]},
|
|
109
|
+
"events": [],
|
|
110
|
+
}
|
|
111
|
+
self.features["functions"] += 1
|
|
112
|
+
self.stack.append(symbol)
|
|
113
|
+
for statement in getattr(node, "body", []):
|
|
114
|
+
self.visit(statement)
|
|
115
|
+
self.stack.pop()
|
|
116
|
+
|
|
117
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> None: # noqa: N802
|
|
118
|
+
self._visit_function(node)
|
|
119
|
+
|
|
120
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None: # noqa: N802
|
|
121
|
+
self._visit_function(node)
|
|
122
|
+
|
|
123
|
+
def visit_Call(self, node: ast.Call) -> None: # noqa: N802
|
|
124
|
+
self.features["calls"] += 1
|
|
125
|
+
self.current["events"].append({
|
|
126
|
+
"event": "call",
|
|
127
|
+
"callee": _dotted_name(node.func),
|
|
128
|
+
"line": int(getattr(node, "lineno", self.current["line"])),
|
|
129
|
+
"flow_scope": list(self.flow_stack),
|
|
130
|
+
"hints": _call_hints(node),
|
|
131
|
+
})
|
|
132
|
+
self.generic_visit(node)
|
|
133
|
+
|
|
134
|
+
def visit_Return(self, node: ast.Return) -> None: # noqa: N802
|
|
135
|
+
self.features["returns"] += 1
|
|
136
|
+
if node.value is not None:
|
|
137
|
+
self.visit(node.value)
|
|
138
|
+
self.current["events"].append({
|
|
139
|
+
"event": "return",
|
|
140
|
+
"callee": "return",
|
|
141
|
+
"line": int(getattr(node, "lineno", self.current["line"])),
|
|
142
|
+
"flow_scope": list(self.flow_stack),
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
def visit_Assign(self, node: ast.Assign) -> None: # noqa: N802
|
|
146
|
+
role = "user_input" if any(_tail(_dotted_name(target)) in {"user_input", "user_query", "user_message"} for target in node.targets) else ""
|
|
147
|
+
if role:
|
|
148
|
+
self.current["events"].append({
|
|
149
|
+
"event": "assignment",
|
|
150
|
+
"assignment_role": role,
|
|
151
|
+
"callee": "assignment",
|
|
152
|
+
"line": int(getattr(node, "lineno", self.current["line"])),
|
|
153
|
+
"flow_scope": list(self.flow_stack),
|
|
154
|
+
})
|
|
155
|
+
self.generic_visit(node)
|
|
156
|
+
|
|
157
|
+
def _visit_branch(self, node: ast.AST, arms: Sequence[Tuple[str, Sequence[ast.stmt]]]) -> None:
|
|
158
|
+
test = getattr(node, "test", None)
|
|
159
|
+
if isinstance(test, ast.AST):
|
|
160
|
+
self.visit(test)
|
|
161
|
+
marker = node.__class__.__name__.lower() + "@" + str(getattr(node, "lineno", 1))
|
|
162
|
+
for arm, statements in arms:
|
|
163
|
+
self.flow_stack.append(marker + ":" + arm)
|
|
164
|
+
for statement in statements:
|
|
165
|
+
self.visit(statement)
|
|
166
|
+
self.flow_stack.pop()
|
|
167
|
+
|
|
168
|
+
def visit_If(self, node: ast.If) -> None: # noqa: N802
|
|
169
|
+
self._visit_branch(node, (("body", node.body), ("else", node.orelse)))
|
|
170
|
+
|
|
171
|
+
def visit_For(self, node: ast.For) -> None: # noqa: N802
|
|
172
|
+
self.visit(node.iter)
|
|
173
|
+
self._visit_branch(node, (("body", node.body), ("else", node.orelse)))
|
|
174
|
+
|
|
175
|
+
def visit_AsyncFor(self, node: ast.AsyncFor) -> None: # noqa: N802
|
|
176
|
+
self.visit_For(node)
|
|
177
|
+
|
|
178
|
+
def visit_While(self, node: ast.While) -> None: # noqa: N802
|
|
179
|
+
self._visit_branch(node, (("body", node.body), ("else", node.orelse)))
|
|
180
|
+
|
|
181
|
+
def visit_Try(self, node: ast.Try) -> None: # noqa: N802
|
|
182
|
+
arms: List[Tuple[str, Sequence[ast.stmt]]] = [("body", node.body)]
|
|
183
|
+
arms.extend(("except" + str(index), handler.body) for index, handler in enumerate(node.handlers))
|
|
184
|
+
arms.extend((("else", node.orelse), ("finally", node.finalbody)))
|
|
185
|
+
self._visit_branch(node, arms)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _collect_python(root: Path, paths: Sequence[Path]) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
|
|
189
|
+
functions: List[Dict[str, Any]] = []
|
|
190
|
+
parsed = 0
|
|
191
|
+
parse_errors = 0
|
|
192
|
+
features = {"functions": 0, "calls": 0, "returns": 0}
|
|
193
|
+
for path in paths[:MAX_IR_FILES]:
|
|
194
|
+
try:
|
|
195
|
+
tree = ast.parse(path.read_text(encoding="utf-8", errors="ignore"), filename=path.name)
|
|
196
|
+
except (OSError, SyntaxError, ValueError):
|
|
197
|
+
parse_errors += 1
|
|
198
|
+
continue
|
|
199
|
+
visitor = _PythonIRVisitor(_relative(path, root))
|
|
200
|
+
visitor.visit(tree)
|
|
201
|
+
parsed += 1
|
|
202
|
+
functions.extend(visitor.functions.values())
|
|
203
|
+
for key, value in visitor.features.items():
|
|
204
|
+
features[key] += value
|
|
205
|
+
return functions, {
|
|
206
|
+
"engine": "python-ast",
|
|
207
|
+
"available": True,
|
|
208
|
+
"files_parsed": parsed,
|
|
209
|
+
"parse_errors": parse_errors,
|
|
210
|
+
"features": features,
|
|
211
|
+
"claim": "Generic AST structure collection; private reasoning is performed by the assigned Copilot service",
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _collect_typescript(root: Path, paths: Sequence[Path]) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
|
|
216
|
+
if not paths:
|
|
217
|
+
return [], {"engine": "typescript-compiler-api", "available": False, "files_parsed": 0, "reason": "No TypeScript or JavaScript source was found."}
|
|
218
|
+
node = shutil.which("node")
|
|
219
|
+
helper = Path(__file__).with_name("copilot_ir_collector.cjs")
|
|
220
|
+
if not node or not helper.exists():
|
|
221
|
+
return _typescript_fallback(root, paths, "Node.js or the packaged IR collector is unavailable.")
|
|
222
|
+
try:
|
|
223
|
+
completed = subprocess.run(
|
|
224
|
+
[node, str(helper)],
|
|
225
|
+
input=json.dumps({"root": str(root), "files": [str(path) for path in paths[:MAX_IR_FILES]]}),
|
|
226
|
+
text=True,
|
|
227
|
+
stdout=subprocess.PIPE,
|
|
228
|
+
stderr=subprocess.DEVNULL,
|
|
229
|
+
check=False,
|
|
230
|
+
timeout=20,
|
|
231
|
+
cwd=root,
|
|
232
|
+
)
|
|
233
|
+
result = json.loads(completed.stdout or "{}") if completed.returncode == 0 else {}
|
|
234
|
+
except (OSError, subprocess.TimeoutExpired, json.JSONDecodeError):
|
|
235
|
+
result = {}
|
|
236
|
+
if not isinstance(result, dict) or not result.get("available"):
|
|
237
|
+
return _typescript_fallback(root, paths, str(result.get("reason", "The TypeScript compiler is unavailable."))[:160] if isinstance(result, dict) else "The TypeScript compiler is unavailable.")
|
|
238
|
+
functions = result.get("functions") if isinstance(result.get("functions"), list) else []
|
|
239
|
+
return [item for item in functions if isinstance(item, dict)], {
|
|
240
|
+
"engine": "typescript-compiler-api",
|
|
241
|
+
"available": True,
|
|
242
|
+
"files_parsed": max(0, int(result.get("files_parsed", 0))),
|
|
243
|
+
"parse_errors": max(0, int(result.get("parse_errors", 0))),
|
|
244
|
+
"typescript_version": str(result.get("typescript_version", ""))[:40],
|
|
245
|
+
"claim": "Generic compiler AST structure collection; private reasoning is performed by the assigned Copilot service",
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _typescript_fallback(root: Path, paths: Sequence[Path], reason: str) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
|
|
250
|
+
functions: List[Dict[str, Any]] = []
|
|
251
|
+
parsed = 0
|
|
252
|
+
call_pattern = re.compile(r"\b([A-Za-z_$][\w$]*(?:\s*\.\s*[A-Za-z_$][\w$]*)*)\s*\(")
|
|
253
|
+
for path in paths[:MAX_IR_FILES]:
|
|
254
|
+
try:
|
|
255
|
+
lines = path.read_text(encoding="utf-8", errors="ignore").splitlines()
|
|
256
|
+
except OSError:
|
|
257
|
+
continue
|
|
258
|
+
events = []
|
|
259
|
+
for line_number, line in enumerate(lines, start=1):
|
|
260
|
+
for match in call_pattern.finditer(line):
|
|
261
|
+
events.append({"event": "call", "callee": re.sub(r"\s+", "", match.group(1)).lower(), "line": line_number, "flow_scope": []})
|
|
262
|
+
if re.search(r"\breturn\b", line):
|
|
263
|
+
events.append({"event": "return", "callee": "return", "line": line_number, "flow_scope": []})
|
|
264
|
+
functions.append({"symbol": "<module>", "path": _relative(path, root), "line": 1, "hints": {"entrypoint": True, "parameters": [], "decorators": []}, "events": events[:500]})
|
|
265
|
+
parsed += 1
|
|
266
|
+
return functions, {
|
|
267
|
+
"engine": "typescript-structural-fallback",
|
|
268
|
+
"available": False,
|
|
269
|
+
"files_parsed": parsed,
|
|
270
|
+
"parse_errors": 0,
|
|
271
|
+
"reason": reason,
|
|
272
|
+
"claim": "Generic structural collection only; install TypeScript for compiler AST evidence",
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def collect_repository_ir(root: Path, paths: Sequence[Path]) -> Dict[str, Any]:
|
|
277
|
+
"""Collect bounded metadata for private reasoning without emitting source."""
|
|
278
|
+
python_paths = [path for path in paths if path.suffix.lower() in {".py", ".pyi"}]
|
|
279
|
+
typescript_paths = [path for path in paths if path.suffix.lower() in {".js", ".jsx", ".ts", ".tsx"}]
|
|
280
|
+
python_functions, python_engine = _collect_python(root, python_paths)
|
|
281
|
+
typescript_functions, typescript_engine = _collect_typescript(root, typescript_paths)
|
|
282
|
+
return {
|
|
283
|
+
"schema": IR_SCHEMA,
|
|
284
|
+
"source_upload": False,
|
|
285
|
+
"collector_mode": "generic_ast_metadata_only",
|
|
286
|
+
"engines": {"python": python_engine, "typescript": typescript_engine},
|
|
287
|
+
"functions": (python_functions + typescript_functions)[:20_000],
|
|
288
|
+
"privacy": {
|
|
289
|
+
"source_text": False,
|
|
290
|
+
"string_literals": False,
|
|
291
|
+
"absolute_paths": False,
|
|
292
|
+
"environment_values": False,
|
|
293
|
+
},
|
|
294
|
+
}
|