diagram-to-iac 1.8.0__py3-none-any.whl → 1.11.0__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.
- diagram_to_iac/core/issue_tracker.py +2 -13
- diagram_to_iac/core/memory.py +6 -9
- diagram_to_iac/core/test_config.py +0 -123
- diagram_to_iac/services/observability.py +1 -12
- diagram_to_iac/tools/api_utils.py +2 -12
- diagram_to_iac/tools/git/git.py +6 -21
- diagram_to_iac/tools/sec_utils.py +38 -95
- {diagram_to_iac-1.8.0.dist-info → diagram_to_iac-1.11.0.dist-info}/METADATA +1 -1
- {diagram_to_iac-1.8.0.dist-info → diagram_to_iac-1.11.0.dist-info}/RECORD +12 -23
- diagram_to_iac/agents/demonstrator_langgraph/config.yaml +0 -56
- diagram_to_iac/agents/git_langgraph/config.yaml +0 -91
- diagram_to_iac/agents/hello_langgraph/config.yaml +0 -6
- diagram_to_iac/agents/policy_agent/config.yaml +0 -43
- diagram_to_iac/agents/supervisor_langgraph/config.yaml +0 -55
- diagram_to_iac/agents/terraform_langgraph/config.yaml +0 -25
- diagram_to_iac/config.yaml +0 -253
- diagram_to_iac/templates/issue_frontmatter.yml +0 -240
- diagram_to_iac/tools/git/git_config.yaml +0 -102
- diagram_to_iac/tools/shell/shell_config.yaml +0 -41
- diagram_to_iac/tools/tf/terraform_config.yaml +0 -21
- {diagram_to_iac-1.8.0.dist-info → diagram_to_iac-1.11.0.dist-info}/WHEEL +0 -0
- {diagram_to_iac-1.8.0.dist-info → diagram_to_iac-1.11.0.dist-info}/entry_points.txt +0 -0
- {diagram_to_iac-1.8.0.dist-info → diagram_to_iac-1.11.0.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,4 @@
|
|
1
1
|
import json
|
2
|
-
import os
|
3
2
|
from pathlib import Path
|
4
3
|
from typing import Dict, Optional
|
5
4
|
|
@@ -8,18 +7,8 @@ class IssueTracker:
|
|
8
7
|
|
9
8
|
def __init__(self, file_path: Optional[str] = None):
|
10
9
|
if file_path is None:
|
11
|
-
|
12
|
-
|
13
|
-
file_path = os.environ['ISSUE_TRACKER_FILE']
|
14
|
-
else:
|
15
|
-
# Check for workspace-based path first (for containers)
|
16
|
-
workspace_base = os.environ.get('WORKSPACE_BASE', '/workspace')
|
17
|
-
if os.path.exists(workspace_base):
|
18
|
-
base_dir = Path(workspace_base)
|
19
|
-
else:
|
20
|
-
# Fallback to package-relative path
|
21
|
-
base_dir = Path(__file__).resolve().parents[3]
|
22
|
-
file_path = base_dir / "data" / "db" / "issue_tracker.json"
|
10
|
+
base_dir = Path(__file__).resolve().parents[3]
|
11
|
+
file_path = base_dir / "data" / "db" / "issue_tracker.json"
|
23
12
|
self.file_path = Path(file_path)
|
24
13
|
self._table: Dict[str, Dict[str, int]] = {}
|
25
14
|
self._load()
|
diagram_to_iac/core/memory.py
CHANGED
@@ -87,15 +87,12 @@ class EnhancedMemory(Memory):
|
|
87
87
|
|
88
88
|
# Default path for the persistent agent state JSON file. Allows override via
|
89
89
|
# `AGENT_STATE_FILE` environment variable for testing.
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
return Path(__file__).resolve().parents[3] / "state" / ".agent_state" / "agent_state.json"
|
97
|
-
|
98
|
-
_DEFAULT_AGENT_STATE_PATH = _get_default_agent_state_path()
|
90
|
+
_DEFAULT_AGENT_STATE_PATH = (
|
91
|
+
Path(__file__).resolve().parents[3]
|
92
|
+
/ "state"
|
93
|
+
/ ".agent_state"
|
94
|
+
/ "agent_state.json"
|
95
|
+
)
|
99
96
|
AGENT_STATE_PATH = Path(os.environ.get("AGENT_STATE_FILE", _DEFAULT_AGENT_STATE_PATH))
|
100
97
|
|
101
98
|
|
@@ -1,123 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Configuration loader for diagram-to-iac tests.
|
3
|
-
|
4
|
-
This module provides utilities to load test configuration from the main config.yaml file,
|
5
|
-
making test repository URLs and other test settings configurable and centralized.
|
6
|
-
"""
|
7
|
-
|
8
|
-
import os
|
9
|
-
import yaml
|
10
|
-
from pathlib import Path
|
11
|
-
from typing import Dict, Any
|
12
|
-
|
13
|
-
|
14
|
-
def load_test_config() -> Dict[str, Any]:
|
15
|
-
"""
|
16
|
-
Load test configuration from the main config.yaml file.
|
17
|
-
|
18
|
-
Returns:
|
19
|
-
Dict containing test configuration settings
|
20
|
-
"""
|
21
|
-
# Find the config file relative to this module
|
22
|
-
# The config.yaml is at src/diagram_to_iac/config.yaml
|
23
|
-
# This file is at src/diagram_to_iac/core/test_config.py
|
24
|
-
# So we need to go up one directory
|
25
|
-
current_dir = Path(__file__).parent
|
26
|
-
config_path = current_dir.parent / "config.yaml"
|
27
|
-
|
28
|
-
if not config_path.exists():
|
29
|
-
raise FileNotFoundError(f"Config file not found at {config_path}")
|
30
|
-
|
31
|
-
with open(config_path, 'r') as f:
|
32
|
-
config = yaml.safe_load(f)
|
33
|
-
|
34
|
-
return config.get('test', {})
|
35
|
-
|
36
|
-
|
37
|
-
def get_test_repo_url() -> str:
|
38
|
-
"""
|
39
|
-
Get the test repository URL from configuration.
|
40
|
-
|
41
|
-
Returns:
|
42
|
-
The configured test repository URL
|
43
|
-
"""
|
44
|
-
config = load_test_config()
|
45
|
-
return config.get('github', {}).get('test_repo_url', 'https://github.com/amartyamandal/test_iac_agent_private.git')
|
46
|
-
|
47
|
-
|
48
|
-
def get_test_repo_owner() -> str:
|
49
|
-
"""
|
50
|
-
Get the test repository owner from configuration.
|
51
|
-
|
52
|
-
Returns:
|
53
|
-
The configured test repository owner
|
54
|
-
"""
|
55
|
-
config = load_test_config()
|
56
|
-
return config.get('github', {}).get('test_repo_owner', 'amartyamandal')
|
57
|
-
|
58
|
-
|
59
|
-
def get_test_repo_name() -> str:
|
60
|
-
"""
|
61
|
-
Get the test repository name from configuration.
|
62
|
-
|
63
|
-
Returns:
|
64
|
-
The configured test repository name
|
65
|
-
"""
|
66
|
-
config = load_test_config()
|
67
|
-
return config.get('github', {}).get('test_repo_name', 'test_iac_agent_private')
|
68
|
-
|
69
|
-
|
70
|
-
def get_public_test_repo_url() -> str:
|
71
|
-
"""
|
72
|
-
Get the public test repository URL from configuration.
|
73
|
-
|
74
|
-
Returns:
|
75
|
-
The configured public test repository URL
|
76
|
-
"""
|
77
|
-
config = load_test_config()
|
78
|
-
return config.get('github', {}).get('public_test_repo_url', 'https://github.com/amartyamandal/test_iac_agent_public.git')
|
79
|
-
|
80
|
-
|
81
|
-
def should_skip_integration_tests() -> bool:
|
82
|
-
"""
|
83
|
-
Check if integration tests should be skipped when no GitHub token is available.
|
84
|
-
|
85
|
-
Returns:
|
86
|
-
True if integration tests should be skipped without a token
|
87
|
-
"""
|
88
|
-
config = load_test_config()
|
89
|
-
return config.get('settings', {}).get('skip_integration_tests_without_token', True)
|
90
|
-
|
91
|
-
|
92
|
-
def should_use_real_github_api() -> bool:
|
93
|
-
"""
|
94
|
-
Check if tests should use real GitHub API calls.
|
95
|
-
|
96
|
-
Returns:
|
97
|
-
True if real GitHub API calls should be used
|
98
|
-
"""
|
99
|
-
config = load_test_config()
|
100
|
-
return config.get('settings', {}).get('use_real_github_api', False)
|
101
|
-
|
102
|
-
|
103
|
-
def should_mock_network_calls() -> bool:
|
104
|
-
"""
|
105
|
-
Check if network calls should be mocked by default.
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
True if network calls should be mocked
|
109
|
-
"""
|
110
|
-
config = load_test_config()
|
111
|
-
return config.get('settings', {}).get('mock_network_calls', True)
|
112
|
-
|
113
|
-
|
114
|
-
# Convenience function for backwards compatibility
|
115
|
-
def get_test_github_repo() -> str:
|
116
|
-
"""
|
117
|
-
Get the test GitHub repository URL.
|
118
|
-
Alias for get_test_repo_url() for backwards compatibility.
|
119
|
-
|
120
|
-
Returns:
|
121
|
-
The configured test repository URL
|
122
|
-
"""
|
123
|
-
return get_test_repo_url()
|
@@ -1,7 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import json
|
4
|
-
import os
|
5
4
|
from datetime import datetime, timezone
|
6
5
|
from pathlib import Path
|
7
6
|
import threading
|
@@ -12,17 +11,7 @@ class LogBus:
|
|
12
11
|
"""Simple JSONL logging service."""
|
13
12
|
|
14
13
|
def __init__(self, log_dir: str | Path | None = None) -> None:
|
15
|
-
if log_dir
|
16
|
-
self.log_dir = Path(log_dir)
|
17
|
-
else:
|
18
|
-
# Check for workspace-based path first (for containers)
|
19
|
-
workspace_base = os.environ.get('WORKSPACE_BASE', '/workspace')
|
20
|
-
if os.path.exists(workspace_base):
|
21
|
-
self.log_dir = Path(workspace_base) / "logs"
|
22
|
-
else:
|
23
|
-
# Fallback to package-relative path
|
24
|
-
self.log_dir = Path(__file__).resolve().parents[3] / "logs"
|
25
|
-
|
14
|
+
self.log_dir = Path(log_dir) if log_dir else Path(__file__).resolve().parents[3] / "logs"
|
26
15
|
self.log_dir.mkdir(parents=True, exist_ok=True)
|
27
16
|
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
28
17
|
self.log_path = self.log_dir / f"run-{timestamp}.jsonl"
|
@@ -3,14 +3,8 @@ import os
|
|
3
3
|
from openai import OpenAI
|
4
4
|
from anthropic import Anthropic
|
5
5
|
import requests
|
6
|
-
|
7
|
-
|
8
|
-
except ImportError:
|
9
|
-
genai = None
|
10
|
-
try:
|
11
|
-
import googleapiclient.discovery
|
12
|
-
except ImportError:
|
13
|
-
googleapiclient = None
|
6
|
+
import google.generativeai as genai
|
7
|
+
import googleapiclient.discovery
|
14
8
|
from concurrent.futures import ThreadPoolExecutor, TimeoutError
|
15
9
|
|
16
10
|
# Import centralized configuration
|
@@ -51,10 +45,6 @@ def test_openai_api():
|
|
51
45
|
|
52
46
|
def test_gemini_api():
|
53
47
|
try:
|
54
|
-
if genai is None:
|
55
|
-
print("❌ Gemini API error: google-generativeai package not installed.")
|
56
|
-
return False
|
57
|
-
|
58
48
|
google_api_key = os.environ.get("GOOGLE_API_KEY")
|
59
49
|
if not google_api_key:
|
60
50
|
print("❌ Gemini API error: GOOGLE_API_KEY environment variable not set.")
|
diagram_to_iac/tools/git/git.py
CHANGED
@@ -767,25 +767,10 @@ class GitExecutor:
|
|
767
767
|
labels_str = ",".join(gh_input.labels)
|
768
768
|
gh_command += f" --label \"{labels_str}\""
|
769
769
|
|
770
|
-
#
|
770
|
+
# Handle assignees - auto-assign to repository owner or github-copilot if none provided
|
771
771
|
assignees_to_use = gh_input.assignees or []
|
772
|
-
|
773
|
-
|
774
|
-
# If assignees are provided, apply smart prioritization
|
775
|
-
if "github-copilot" in assignees_to_use:
|
776
|
-
# Multiple assignees with Copilot -> assign to Copilot only
|
777
|
-
assignees_to_use = ["github-copilot"]
|
778
|
-
self.logger.info("Multiple assignees detected with @github-copilot - assigning to @github-copilot only")
|
779
|
-
elif len(assignees_to_use) == 1 and assignees_to_use[0] == owner:
|
780
|
-
# Only owner as assignee -> keep as owner
|
781
|
-
self.logger.info(f"Single assignee is repository owner - assigning to @{owner}")
|
782
|
-
elif len(assignees_to_use) > 1 and "github-copilot" not in assignees_to_use:
|
783
|
-
# Multiple assignees without Copilot -> assign to owner only
|
784
|
-
assignees_to_use = [owner]
|
785
|
-
self.logger.info(f"Multiple assignees without @github-copilot - assigning to repository owner @{owner} only")
|
786
|
-
# Single non-owner assignee -> keep as provided
|
787
|
-
else:
|
788
|
-
# No assignees provided - auto-assign with Copilot preference
|
772
|
+
if not assignees_to_use:
|
773
|
+
# Try to assign to @github-copilot first, fallback to repository owner
|
789
774
|
try:
|
790
775
|
# Check if github-copilot exists as a user
|
791
776
|
check_copilot_cmd = "gh api /users/github-copilot"
|
@@ -794,15 +779,15 @@ class GitExecutor:
|
|
794
779
|
|
795
780
|
if check_result.exit_code == 0:
|
796
781
|
assignees_to_use = ["github-copilot"]
|
797
|
-
self.logger.info("
|
782
|
+
self.logger.info("Auto-assigning issue to @github-copilot")
|
798
783
|
else:
|
799
784
|
# Fallback to repository owner
|
800
785
|
assignees_to_use = [owner]
|
801
|
-
self.logger.info(f"
|
786
|
+
self.logger.info(f"Auto-assigning issue to repository owner: @{owner}")
|
802
787
|
except Exception as e:
|
803
788
|
# Fallback to repository owner if check fails
|
804
789
|
assignees_to_use = [owner]
|
805
|
-
self.logger.info(f"Failed to check @github-copilot, assigning to repository owner @{owner}. Error: {e}")
|
790
|
+
self.logger.info(f"Failed to check @github-copilot, assigning to repository owner: @{owner}. Error: {e}")
|
806
791
|
|
807
792
|
if assignees_to_use:
|
808
793
|
assignees_str = ",".join(assignees_to_use)
|
@@ -37,77 +37,44 @@ except ImportError:
|
|
37
37
|
# Path inside container where the encoded YAML is mounted (dev only)
|
38
38
|
_YAML_PATH = pathlib.Path("/run/secrets.yaml")
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
"ANTHROPIC_API_KEY",
|
66
|
-
"GROK_API_KEY"
|
67
|
-
]
|
68
|
-
|
69
|
-
return expected_secrets, required_secrets, ai_secrets, full_mapping
|
70
|
-
except Exception as e:
|
71
|
-
print(f"⚠️ Warning: Could not load secret config from config.yaml: {e}")
|
72
|
-
|
73
|
-
# Fallback to hardcoded values
|
74
|
-
expected_secrets = [
|
75
|
-
"DOCKERHUB_API_KEY",
|
76
|
-
"DOCKERHUB_USERNAME",
|
77
|
-
"TF_API_KEY",
|
78
|
-
"PYPI_API_KEY",
|
79
|
-
"OPENAI_API_KEY",
|
80
|
-
"GOOGLE_API_KEY",
|
81
|
-
"ANTHROPIC_API_KEY",
|
82
|
-
"GROK_API_KEY",
|
83
|
-
"REPO_API_KEY"
|
84
|
-
]
|
85
|
-
|
86
|
-
required_secrets = ["REPO_API_KEY"]
|
87
|
-
|
88
|
-
ai_secrets = [
|
89
|
-
"OPENAI_API_KEY",
|
90
|
-
"GOOGLE_API_KEY",
|
91
|
-
"ANTHROPIC_API_KEY",
|
92
|
-
"GROK_API_KEY"
|
93
|
-
]
|
94
|
-
|
95
|
-
secret_mapping = {
|
96
|
-
"REPO_API_KEY": "GITHUB_TOKEN",
|
97
|
-
"TF_API_KEY": "TFE_TOKEN",
|
98
|
-
"DOCKERHUB_API_KEY": "DOCKERHUB_API_KEY",
|
99
|
-
"DOCKERHUB_USERNAME": "DOCKERHUB_USERNAME",
|
100
|
-
"PYPI_API_KEY": "PYPI_API_KEY",
|
101
|
-
"OPENAI_API_KEY": "OPENAI_API_KEY",
|
102
|
-
"GOOGLE_API_KEY": "GOOGLE_API_KEY",
|
103
|
-
"ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY",
|
104
|
-
"GROK_API_KEY": "GROK_API_KEY"
|
105
|
-
}
|
106
|
-
|
107
|
-
return expected_secrets, required_secrets, ai_secrets, secret_mapping
|
40
|
+
# Expected secrets based on secrets_example.yaml
|
41
|
+
EXPECTED_SECRETS = [
|
42
|
+
"DOCKERHUB_API_KEY",
|
43
|
+
"DOCKERHUB_USERNAME",
|
44
|
+
"TF_API_KEY",
|
45
|
+
"PYPI_API_KEY",
|
46
|
+
"OPENAI_API_KEY",
|
47
|
+
"GOOGLE_API_KEY",
|
48
|
+
"ANTHROPIC_API_KEY",
|
49
|
+
"GROK_API_KEY",
|
50
|
+
"REPO_API_KEY"
|
51
|
+
]
|
52
|
+
|
53
|
+
# Required secrets that must be present (others are optional)
|
54
|
+
REQUIRED_SECRETS = [
|
55
|
+
"REPO_API_KEY" # GITHUB_TOKEN is required for repo operations
|
56
|
+
]
|
57
|
+
|
58
|
+
# Optional AI API secrets (at least one should be present for AI functionality)
|
59
|
+
AI_API_SECRETS = [
|
60
|
+
"OPENAI_API_KEY",
|
61
|
+
"GOOGLE_API_KEY",
|
62
|
+
"ANTHROPIC_API_KEY",
|
63
|
+
"GROK_API_KEY"
|
64
|
+
]
|
108
65
|
|
109
|
-
#
|
110
|
-
|
66
|
+
# Map internal secret names to environment variable names
|
67
|
+
SECRET_ENV_MAPPING = {
|
68
|
+
"REPO_API_KEY": "GITHUB_TOKEN",
|
69
|
+
"TF_API_KEY": "TFE_TOKEN",
|
70
|
+
"DOCKERHUB_API_KEY": "DOCKERHUB_API_KEY",
|
71
|
+
"DOCKERHUB_USERNAME": "DOCKERHUB_USERNAME",
|
72
|
+
"PYPI_API_KEY": "PYPI_API_KEY",
|
73
|
+
"OPENAI_API_KEY": "OPENAI_API_KEY",
|
74
|
+
"GOOGLE_API_KEY": "GOOGLE_API_KEY",
|
75
|
+
"ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY",
|
76
|
+
"GROK_API_KEY": "GROK_API_KEY"
|
77
|
+
}
|
111
78
|
|
112
79
|
|
113
80
|
def _decode_b64(enc: str) -> str:
|
@@ -140,35 +107,12 @@ def _is_dev_environment() -> bool:
|
|
140
107
|
)
|
141
108
|
|
142
109
|
|
143
|
-
def _is_ci_environment() -> bool:
|
144
|
-
"""Check if running in CI environment."""
|
145
|
-
return os.environ.get("CI") == "true" or os.environ.get("GITHUB_ACTIONS") == "true"
|
146
|
-
|
147
|
-
|
148
110
|
def _get_env_secrets() -> Dict[str, Optional[str]]:
|
149
111
|
"""Get secrets from environment variables."""
|
150
112
|
env_secrets = {}
|
151
|
-
is_ci = _is_ci_environment()
|
152
|
-
|
153
113
|
for secret_key in EXPECTED_SECRETS:
|
154
114
|
env_name = SECRET_ENV_MAPPING.get(secret_key, secret_key)
|
155
|
-
raw_value =
|
156
|
-
|
157
|
-
if is_ci:
|
158
|
-
# In CI, check for _ENCODED variant first (since that's how they're provided)
|
159
|
-
encoded_env_name = f"{secret_key}_ENCODED" # Use secret_key directly for CI
|
160
|
-
raw_value = os.environ.get(encoded_env_name)
|
161
|
-
|
162
|
-
# If not found with secret_key, try with env_name
|
163
|
-
if raw_value is None:
|
164
|
-
encoded_env_name = f"{env_name}_ENCODED"
|
165
|
-
raw_value = os.environ.get(encoded_env_name)
|
166
|
-
|
167
|
-
# If still not found, try the direct environment variable name
|
168
|
-
if raw_value is None:
|
169
|
-
raw_value = os.environ.get(env_name)
|
170
|
-
|
171
|
-
# If we found a value, process it
|
115
|
+
raw_value = os.environ.get(env_name)
|
172
116
|
if raw_value:
|
173
117
|
# Check if value is already decoded, use as-is; otherwise decode it
|
174
118
|
if (secret_key == "TF_API_KEY" and ".atlasv1." in raw_value) or \
|
@@ -182,7 +126,6 @@ def _get_env_secrets() -> Dict[str, Optional[str]]:
|
|
182
126
|
env_secrets[secret_key] = _decode_b64(raw_value)
|
183
127
|
else:
|
184
128
|
env_secrets[secret_key] = None
|
185
|
-
|
186
129
|
return env_secrets
|
187
130
|
|
188
131
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
diagram_to_iac/__init__.py,sha256=gQanRC5O_7AMB-NQFEEd-MU0GICa-dBsgvcJgquKBfs,1427
|
2
2
|
diagram_to_iac/cli.py,sha256=uumG1frF42eCkdLIZxyxQB1x6lDwtG-qKL4vcHnLLXY,400
|
3
|
-
diagram_to_iac/config.yaml,sha256=0DMksgsQt32W3K1DkFXtweK1E11VxJwj1E9-IJCKUUw,7459
|
4
3
|
diagram_to_iac/r2d.py,sha256=I7XSuUtu8TdvAhK4tCMLc3U_3ZtP7DJGfq168aeI3Mk,13208
|
5
4
|
diagram_to_iac/actions/__init__.py,sha256=P1CjjY4FYUA0Tcx8FQNLYYSI9fhv8yKd_TmRGtmhW50,229
|
6
5
|
diagram_to_iac/actions/git_entry.py,sha256=mhY6gYquUPVvyvnTC2S90z_uXEe1asqWLoi1989aB_Q,5403
|
@@ -9,17 +8,13 @@ diagram_to_iac/actions/terraform_agent_entry.py,sha256=gKkX4fIRdBDZpwPQO_v2t1SSO
|
|
9
8
|
diagram_to_iac/agents/__init__.py,sha256=GHInKSPq56ZPYSKsyti6_wk82dhn2hOqfxNHkZZOj_0,735
|
10
9
|
diagram_to_iac/agents/demonstrator_langgraph/__init__.py,sha256=nghMYMEEarfkR0V6AH1fDCV-mXBLnmFP2sO4OPxJ4cI,371
|
11
10
|
diagram_to_iac/agents/demonstrator_langgraph/agent.py,sha256=9ZH2H5iAB2DfMhCr-OzImVZlwoeXIP8RKl6_VG47W2I,35349
|
12
|
-
diagram_to_iac/agents/demonstrator_langgraph/config.yaml,sha256=T1nMi9AQwZxdIWU6NWxttl9CcyEf_Pu6_F-_zCjdVUc,2050
|
13
11
|
diagram_to_iac/agents/git_langgraph/__init__.py,sha256=x6nCnOu-Vcl-qVqW1swhdaE_sQqUSvEUUtWk4eePBUo,295
|
14
12
|
diagram_to_iac/agents/git_langgraph/agent.py,sha256=_lGwyTTgTsS4ZtaQLCceGJa5zeLvux_Hqda1-fqAgXg,49288
|
15
|
-
diagram_to_iac/agents/git_langgraph/config.yaml,sha256=yjxIsD5b5TushF-Yc3iSVJl1fK4GuhErQ0tWRHdkQYc,3690
|
16
13
|
diagram_to_iac/agents/git_langgraph/pr.py,sha256=qXopN5XAF1DIac5vbH-QasihkuAiWmC9JY8pLYlm-sQ,8601
|
17
14
|
diagram_to_iac/agents/hello_langgraph/__init__.py,sha256=lviuDAPJezmpaXR-H7JxfIT9wvg1xO2t6JLyeKSSx0Y,266
|
18
15
|
diagram_to_iac/agents/hello_langgraph/agent.py,sha256=R49yfFGxqMPBBu36ztDH9lBE_-s7VFyRB33gnNSXxek,33777
|
19
|
-
diagram_to_iac/agents/hello_langgraph/config.yaml,sha256=PCOwG9FrbrZdtnc7zM3D43jP-TjudW656_qAz-G_lH0,227
|
20
16
|
diagram_to_iac/agents/policy_agent/__init__.py,sha256=E6QEyIpSHh0PMRNnM0dXuYtz2HZdCJaY5W7UbEwPZBA,380
|
21
17
|
diagram_to_iac/agents/policy_agent/agent.py,sha256=dJLX3q2sYmwUGjs_qQOAlAvTfkEEYUalNCnBz1eeaBw,22296
|
22
|
-
diagram_to_iac/agents/policy_agent/config.yaml,sha256=VmNucLT1JXBSh2FJIeJfAW740AvHAoH-sAGpbjUiYCM,1333
|
23
18
|
diagram_to_iac/agents/policy_agent/integration_example.py,sha256=LtOGshT0VL6yuu5p8UtJ5xqKNweRsLqeyCZK18dnwBA,6703
|
24
19
|
diagram_to_iac/agents/policy_agent/tools/__init__.py,sha256=C9ez49BmMiaAlYs_QrtC0ypMLm1S-Sf9RCRI40-KuCA,282
|
25
20
|
diagram_to_iac/agents/policy_agent/tools/tfsec_tool.py,sha256=YYCRhwVLegeCzJrbah3BYhpKwYPh7PtDxB3kYW8qt10,10116
|
@@ -28,7 +23,6 @@ diagram_to_iac/agents/shell_langgraph/agent.py,sha256=dZWzjVQ9oX_BtNHQ1Zrzy2oQpu
|
|
28
23
|
diagram_to_iac/agents/shell_langgraph/detector.py,sha256=wLw0uDP_V2m1z6SRk7QNCzoUMYCfXwu3DNg8EWue9yk,1493
|
29
24
|
diagram_to_iac/agents/supervisor_langgraph/__init__.py,sha256=iLN60d20cqoXOLyuLvJkiwrzapE84em222Tnyndq2dc,385
|
30
25
|
diagram_to_iac/agents/supervisor_langgraph/agent.py,sha256=1qfgYSQQx1JNgN9ORFCl35NrklRbN7ZcUdP5AbGBsGo,101342
|
31
|
-
diagram_to_iac/agents/supervisor_langgraph/config.yaml,sha256=tdItteHrgTWU3xeHiZ9DVblO5j0G_2Wo63nb-wG8eIo,2334
|
32
26
|
diagram_to_iac/agents/supervisor_langgraph/demonstrator.py,sha256=OT-bElEyLZBedzcc5DtZnp1yhjYVjx4jRzt52f5SoSU,803
|
33
27
|
diagram_to_iac/agents/supervisor_langgraph/github_listener.py,sha256=Ko9dOnS9CUqbjTogEyhEmVhkiaW8OiwLzX6k18lSrac,16377
|
34
28
|
diagram_to_iac/agents/supervisor_langgraph/guards.py,sha256=XzBgjXnwbOgLkGm7AqXX4tQdGBerq_6pKvduKPqIwF0,720
|
@@ -36,29 +30,26 @@ diagram_to_iac/agents/supervisor_langgraph/pat_loop.py,sha256=feY8ZPGQxqkUuHOMSd
|
|
36
30
|
diagram_to_iac/agents/supervisor_langgraph/router.py,sha256=7hZXXEmtvG__w7UAaOhoPaHdubUv-oMKbQdMTMXk-qY,276
|
37
31
|
diagram_to_iac/agents/terraform_langgraph/__init__.py,sha256=N4_cTgk1wNZMS9WU5xZMEm6Dt5GiJ2b0iLx-QUhJd10,390
|
38
32
|
diagram_to_iac/agents/terraform_langgraph/agent.py,sha256=lDaRCLcqShZiUGN25R-T94JTCLYaz4UgT_di3tDA0nE,50593
|
39
|
-
diagram_to_iac/agents/terraform_langgraph/config.yaml,sha256=_jZ0hEegZcXRkm3pDwkPzZkOEi4Gt8ONYwsoFPNc5FQ,643
|
40
33
|
diagram_to_iac/agents/terraform_langgraph/parser.py,sha256=J56CPlpIEIPuDHeAOL3sz4TiIgqLi7raPlX7jwFrAms,2039
|
41
34
|
diagram_to_iac/core/__init__.py,sha256=VjXPYLIS2SAPIDniBkeA2EDK0VHJvdaKIC8dzVneaTM,140
|
42
35
|
diagram_to_iac/core/agent_base.py,sha256=DjZjcfzDpEhfIOki00XwQ-4lPli3OBcQ_7RNKsT7JSI,505
|
43
36
|
diagram_to_iac/core/config_loader.py,sha256=6WWOp6G7_xYUhm1x62sVa-7kFlCthcthbppmeGz1YsM,9276
|
44
37
|
diagram_to_iac/core/enhanced_memory.py,sha256=fJ8r-MREZRnm6Rg01CDCicMEx-dDxDEjJgrk8rnVc5Y,11761
|
45
38
|
diagram_to_iac/core/errors.py,sha256=gZwZocnIcBlS4YccIBdjG8XztRCtMe4Cu6KWxLzebDM,115
|
46
|
-
diagram_to_iac/core/issue_tracker.py,sha256=
|
47
|
-
diagram_to_iac/core/memory.py,sha256=
|
39
|
+
diagram_to_iac/core/issue_tracker.py,sha256=0eo289hn94yCoFCkLaYiDOIJBjk33i2dk6eLeYe_9YE,1659
|
40
|
+
diagram_to_iac/core/memory.py,sha256=P9URX8m2nab65ZPF36uf6Z9hEXQGXrjrXa8dPXG7pm8,4444
|
48
41
|
diagram_to_iac/core/registry.py,sha256=ibdMz68W7qkwF0dprt4ni5pekgJfAPuRgL85uRU7wHY,26632
|
49
|
-
diagram_to_iac/core/test_config.py,sha256=
|
42
|
+
diagram_to_iac/core/test_config.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
50
43
|
diagram_to_iac/services/__init__.py,sha256=I5R8g7vYX4tCldRf1Jf9vEhm5mylc-MfFicqLnY6a3E,238
|
51
44
|
diagram_to_iac/services/commenter.py,sha256=iXvHXOeih64FbE34PuGPk6fhI4RmC62ZSVtFwmMqiOA,22146
|
52
|
-
diagram_to_iac/services/observability.py,sha256=
|
45
|
+
diagram_to_iac/services/observability.py,sha256=yxbnjMc4TO1SM8RZZMHf2E8uVOLpxFhiTjsTkymDi6Y,1856
|
53
46
|
diagram_to_iac/services/step_summary.py,sha256=g3MuMZ51IDubI0oWcF7qMvseNgDS6D90AsKK_1s5xDQ,2808
|
54
|
-
diagram_to_iac/templates/issue_frontmatter.yml,sha256=qjyjUT8jszRIbiX6wmACfhzF-4yTvY1cRtY371o4Ung,7012
|
55
47
|
diagram_to_iac/tools/__init__.py,sha256=F2pcKhoPP5KDeQIGcqKXD1J30KFKc9qxMw1jxzrs9qY,434
|
56
|
-
diagram_to_iac/tools/api_utils.py,sha256=
|
57
|
-
diagram_to_iac/tools/sec_utils.py,sha256=
|
48
|
+
diagram_to_iac/tools/api_utils.py,sha256=5Grroc0Sbu3UXQB5rv4in6LMkyU_NkOwLbu9F2tmB18,9364
|
49
|
+
diagram_to_iac/tools/sec_utils.py,sha256=BeKM1k8e8BHw5BMyghDvwB8tlyV7g3rr-civIprmLDY,10032
|
58
50
|
diagram_to_iac/tools/text_utils.py,sha256=cnwOXWndd1QAlZC4zOO9jtF3_j4xozDLUTfzfJE9wWQ,9959
|
59
51
|
diagram_to_iac/tools/git/__init__.py,sha256=1V3_Kg_KzQ6er60N-1hqQeigkV8c4AvYq-R60_xmQ4o,1316
|
60
|
-
diagram_to_iac/tools/git/git.py,sha256=
|
61
|
-
diagram_to_iac/tools/git/git_config.yaml,sha256=ekww9EEZigEfZBv-HNSEYP__SDT61yOdBQ0u-Lhquv0,4272
|
52
|
+
diagram_to_iac/tools/git/git.py,sha256=0NYz9NqQWf-5YTX7R3nBPyLmzvih-jhd0gYY8KZDmTM,46501
|
62
53
|
diagram_to_iac/tools/hello/__init__.py,sha256=f6GpkiQxvuGaRMm34yQilGACxUI4c5edJQTDjZtskjQ,891
|
63
54
|
diagram_to_iac/tools/hello/cal_utils.py,sha256=B-0iOJHNL1IgYPlWUdrAwEf1r9LUKBAnGyx1xQz05ZE,1507
|
64
55
|
diagram_to_iac/tools/hello/text_utils.py,sha256=ZaVQYw6GVqaq9EDTQfG3gTAudeN8CuFUUb7IETZhUCA,3952
|
@@ -71,11 +62,9 @@ diagram_to_iac/tools/llm_utils/openai_driver.py,sha256=ZqzXEYEutwqRw3qWx-GH85Mj2
|
|
71
62
|
diagram_to_iac/tools/llm_utils/router.py,sha256=ga8xfmPMl_SGINDwazeAAFYTAx9L_IQcVV5AdvqD0dQ,22643
|
72
63
|
diagram_to_iac/tools/shell/__init__.py,sha256=6UZjBcnbPabA6Qy7t4j-dCi3S2sE6sB2bTE9PIL98bA,292
|
73
64
|
diagram_to_iac/tools/shell/shell.py,sha256=ZOJ7Vo3l_R2Gm6Ml2FL0RX__-C_JOsUrLJVvBMwAy9E,21122
|
74
|
-
diagram_to_iac/tools/shell/shell_config.yaml,sha256=9mV1mpOD9mwOx50TXF-ACafeJmBSZaqPo4v-TQxB5U4,1722
|
75
65
|
diagram_to_iac/tools/tf/terraform.py,sha256=j1boWRo6JKpNGf1OwnWoWboO0gMYTizCOHDSxozoFZw,37343
|
76
|
-
diagram_to_iac/
|
77
|
-
diagram_to_iac-1.
|
78
|
-
diagram_to_iac-1.
|
79
|
-
diagram_to_iac-1.
|
80
|
-
diagram_to_iac-1.
|
81
|
-
diagram_to_iac-1.8.0.dist-info/RECORD,,
|
66
|
+
diagram_to_iac-1.11.0.dist-info/METADATA,sha256=oUVHnfKjHzEHlJQlPgAy0I20q2hPPoZFBo7U_wpE7Wo,10690
|
67
|
+
diagram_to_iac-1.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
68
|
+
diagram_to_iac-1.11.0.dist-info/entry_points.txt,sha256=DfGCnmgWWGHtQpqU8VqcUWs5k_be-bfO67z1vOuTitA,277
|
69
|
+
diagram_to_iac-1.11.0.dist-info/top_level.txt,sha256=k1cV0YODiCUU46qlmbQaquMcbMXhNm05NZLxsinDUBA,15
|
70
|
+
diagram_to_iac-1.11.0.dist-info/RECORD,,
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# DemonstratorAgent specific configuration
|
2
|
-
# Inherits common settings from src/diagram_to_iac/config.yaml
|
3
|
-
# Only agent-specific overrides and unique settings are defined here
|
4
|
-
|
5
|
-
# Agent-specific routing tokens
|
6
|
-
routing_keys:
|
7
|
-
analyze: "ROUTE_TO_ANALYZE"
|
8
|
-
demonstrate: "ROUTE_TO_DEMONSTRATE"
|
9
|
-
collect_inputs: "ROUTE_TO_COLLECT_INPUTS"
|
10
|
-
retry: "ROUTE_TO_RETRY"
|
11
|
-
create_issue: "ROUTE_TO_CREATE_ISSUE"
|
12
|
-
end: "ROUTE_TO_END"
|
13
|
-
|
14
|
-
prompts:
|
15
|
-
planner_prompt: |
|
16
|
-
User request: "{user_input}"
|
17
|
-
|
18
|
-
This is a dry-run demonstration request for error: {error_type}
|
19
|
-
Error message: {error_message}
|
20
|
-
|
21
|
-
Analyze this request and determine the appropriate action:
|
22
|
-
1. If need to analyze the error for user guidance, respond with "{route_analyze}"
|
23
|
-
2. If need to demonstrate the issue to user, respond with "{route_demonstrate}"
|
24
|
-
3. If need to collect user inputs for fixing, respond with "{route_collect_inputs}"
|
25
|
-
4. If need to retry with new information, respond with "{route_retry}"
|
26
|
-
5. If need to create GitHub issue, respond with "{route_create_issue}"
|
27
|
-
6. If demonstration is complete, respond with "{route_end}"
|
28
|
-
|
29
|
-
Important: Focus on being helpful and educational in demonstrating the error and potential fixes.
|
30
|
-
|
31
|
-
# Error analysis patterns
|
32
|
-
error_patterns:
|
33
|
-
terraform_auth:
|
34
|
-
keywords: ["missing_terraform_token", "auth", "tfe_token"]
|
35
|
-
fixable: true
|
36
|
-
required_inputs: ["TFE_TOKEN", "TF_WORKSPACE"]
|
37
|
-
|
38
|
-
api_auth:
|
39
|
-
keywords: ["api key", "401", "unauthorized"]
|
40
|
-
fixable: true
|
41
|
-
required_inputs: ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "GITHUB_TOKEN"]
|
42
|
-
|
43
|
-
terraform_init:
|
44
|
-
keywords: ["terraform init", "backend"]
|
45
|
-
fixable: true
|
46
|
-
required_inputs: ["Backend configuration", "Access credentials"]
|
47
|
-
|
48
|
-
network_error:
|
49
|
-
keywords: ["network", "connection", "timeout"]
|
50
|
-
fixable: true
|
51
|
-
required_inputs: ["Network connectivity", "Proxy settings"]
|
52
|
-
|
53
|
-
permission_error:
|
54
|
-
keywords: ["permission", "forbidden", "access denied"]
|
55
|
-
fixable: false
|
56
|
-
manual_steps: "Check permissions and access rights"
|