cycode 3.17.1.dev10__py3-none-any.whl → 3.17.2.dev1__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.
cycode/__init__.py CHANGED
@@ -5,4 +5,4 @@ import time as _time
5
5
  # end-to-end scan duration from the moment the user actually triggered it.
6
6
  _BOOT_WALL: float = _time.time()
7
7
 
8
- __version__ = '3.17.1.dev10' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
8
+ __version__ = '3.17.2.dev1' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -34,6 +34,25 @@ def get_ide(name: str) -> IDE:
34
34
  return ide
35
35
 
36
36
 
37
+ def collect_all_session_contexts() -> tuple[dict[str, dict], dict]:
38
+ """Sweep every registered IDE's session context, regardless of which IDE triggered the hook.
39
+
40
+ Returns ``(config_files_by_ide, plugins)``: the global MCP config file of each IDE that has
41
+ one (keyed by IDE name), and the enabled plugins merged across IDEs (first registered IDE
42
+ wins on a duplicate plugin key - plugins are IDE-agnostic marketplace artifacts).
43
+ """
44
+ config_files_by_ide: dict[str, dict] = {}
45
+ plugins: dict = {}
46
+ for ide in IDES.values():
47
+ global_config_file, enabled_plugins = ide.get_session_context()
48
+ if global_config_file:
49
+ config_files_by_ide[ide.name] = global_config_file
50
+ for plugin_key, plugin in (enabled_plugins or {}).items():
51
+ plugins.setdefault(plugin_key, plugin)
52
+
53
+ return config_files_by_ide, plugins
54
+
55
+
37
56
  def resolve_ides(name: str) -> list[IDE]:
38
57
  """Resolve an ``--ide`` argument to one or all IDE instances.
39
58
 
@@ -15,6 +15,22 @@ from cycode.logger import get_logger
15
15
  logger = get_logger('AI Guardrails Plugins')
16
16
 
17
17
 
18
+ def resolve_cached_plugin_dir(cache_root: Path, marketplace: str, plugin_name: str) -> Optional[Path]:
19
+ """Find ``<cache_root>/<marketplace>/<plugin>/<version-or-hash>/``.
20
+
21
+ Both Claude Code and Codex cache installed plugin content in this layout (the trailing
22
+ segment is a version for Claude, a content hash for Codex). If multiple are cached, pick
23
+ the most recently modified (name as a deterministic tie-breaker).
24
+ """
25
+ base = cache_root / marketplace / plugin_name
26
+ if not base.is_dir():
27
+ return None
28
+ candidates = [d for d in base.iterdir() if d.is_dir()]
29
+ if not candidates:
30
+ return None
31
+ return max(candidates, key=lambda d: (d.stat().st_mtime, d.name))
32
+
33
+
18
34
  def load_plugin_json(path: Path) -> Optional[dict]:
19
35
  """Load a JSON file inside a plugin directory; None if missing or invalid."""
20
36
  if not path.exists():
@@ -10,6 +10,7 @@ from cycode.cli.apps.ai_guardrails.consts import CYCODE_SCAN_PROMPT_COMMAND, CYC
10
10
  from cycode.cli.apps.ai_guardrails.ides._plugin_utils import (
11
11
  build_global_config_file,
12
12
  load_plugin_json,
13
+ resolve_cached_plugin_dir,
13
14
  walk_enabled_plugins,
14
15
  )
15
16
  from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
@@ -164,6 +165,11 @@ def load_claude_settings(settings_path: Optional[Path] = None) -> Optional[dict]
164
165
  return None
165
166
 
166
167
 
168
+ def _plugins_cache_dir() -> Path:
169
+ """Claude Code's local plugin content cache: ``~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/``."""
170
+ return Path.home() / '.claude' / 'plugins' / 'cache'
171
+
172
+
167
173
  def _resolve_marketplace_path(marketplace: dict) -> Optional[Path]:
168
174
  """Resolve filesystem path for a directory-type marketplace."""
169
175
  source = marketplace.get('source', {})
@@ -194,25 +200,29 @@ def _read_claude_plugin(plugin_dir: Path) -> tuple[dict, dict]:
194
200
  if servers:
195
201
  entry['mcp_server_names'] = list(servers.keys())
196
202
  entry['mcp_config_file_path'] = str(mcp_config_path)
197
- entry['mcp_config_file'] = json.dumps(mcp_config)
203
+ entry['mcp_config_file'] = json.dumps({'mcpServers': servers})
198
204
  return entry, servers
199
205
 
200
206
 
201
207
  def resolve_plugins(settings: dict) -> dict:
202
208
  """Walk Claude Code's ``enabledPlugins`` via the shared plugin walker.
203
209
 
204
- Each enabled plugin's marketplace is resolved through
205
- ``extraKnownMarketplaces`` to a directory; the rest of the work
206
- (manifest + ``.mcp.json``) is the shared ``_read_claude_plugin``.
210
+ Directory-type marketplaces resolve through ``extraKnownMarketplaces``; all
211
+ other source types (git, github, ...) resolve through the local plugin cache.
212
+ The rest of the work (manifest + ``.mcp.json``) is the shared ``_read_claude_plugin``.
207
213
  """
208
214
  enabled = settings.get('enabledPlugins') or {}
209
215
  marketplaces = settings.get('extraKnownMarketplaces') or {}
210
216
 
211
- def _locate(_plugin_name: str, marketplace_name: str) -> Optional[Path]:
217
+ def _locate(plugin_name: str, marketplace_name: str) -> Optional[Path]:
218
+ # Directory-type marketplaces point straight at the plugin source; every other source
219
+ # type (git, github, ...) is cloned into the local plugin cache.
212
220
  marketplace = marketplaces.get(marketplace_name)
213
- if not marketplace:
214
- return None
215
- return _resolve_marketplace_path(marketplace)
221
+ if marketplace:
222
+ marketplace_path = _resolve_marketplace_path(marketplace)
223
+ if marketplace_path is not None:
224
+ return marketplace_path
225
+ return resolve_cached_plugin_dir(_plugins_cache_dir(), marketplace_name, plugin_name)
216
226
 
217
227
  return walk_enabled_plugins(
218
228
  plugin_entries=enabled,
@@ -17,6 +17,7 @@ from cycode.cli.apps.ai_guardrails.consts import CYCODE_SCAN_PROMPT_COMMAND, CYC
17
17
  from cycode.cli.apps.ai_guardrails.ides._plugin_utils import (
18
18
  build_global_config_file,
19
19
  load_plugin_json,
20
+ resolve_cached_plugin_dir,
20
21
  walk_enabled_plugins,
21
22
  )
22
23
  from cycode.cli.apps.ai_guardrails.ides.base import IDE, DecisionAction, HookDecision
@@ -100,18 +101,8 @@ def _email_from_auth(auth_path: Optional[Path] = None) -> Optional[str]:
100
101
 
101
102
 
102
103
  def _resolve_codex_plugin_dir(plugin_name: str, marketplace: str) -> Optional[Path]:
103
- """Find ``~/.codex/plugins/cache/<marketplace>/<plugin>/<hash>/``.
104
-
105
- The trailing segment is a content hash. If multiple are cached, pick the
106
- most recently modified.
107
- """
108
- base = _codex_home() / 'plugins' / 'cache' / marketplace / plugin_name
109
- if not base.is_dir():
110
- return None
111
- candidates = [d for d in base.iterdir() if d.is_dir()]
112
- if not candidates:
113
- return None
114
- return max(candidates, key=lambda d: d.stat().st_mtime)
104
+ """Find ``~/.codex/plugins/cache/<marketplace>/<plugin>/<hash>/``."""
105
+ return resolve_cached_plugin_dir(_codex_home() / 'plugins' / 'cache', marketplace, plugin_name)
115
106
 
116
107
 
117
108
  def _read_codex_plugin(plugin_dir: Path) -> tuple[dict, dict]:
@@ -141,7 +132,7 @@ def _read_codex_plugin(plugin_dir: Path) -> tuple[dict, dict]:
141
132
  if servers:
142
133
  entry['mcp_server_names'] = list(servers.keys())
143
134
  entry['mcp_config_file_path'] = str(mcp_config_path)
144
- entry['mcp_config_file'] = json.dumps(mcp_doc)
135
+ entry['mcp_config_file'] = json.dumps({'mcpServers': servers})
145
136
  return entry, servers
146
137
 
147
138
 
@@ -1,12 +1,15 @@
1
1
  """Handle AI guardrails session start: auth, conversation creation, session context."""
2
2
 
3
+ import hashlib
4
+ import json
3
5
  import sys
6
+ import time
7
+ from pathlib import Path
4
8
  from typing import TYPE_CHECKING, Annotated, Optional
5
9
 
6
10
  import typer
7
11
 
8
- from cycode.cli.apps.ai_guardrails.ides import DEFAULT_IDE_NAME, get_ide
9
- from cycode.cli.apps.ai_guardrails.ides.base import IDE
12
+ from cycode.cli.apps.ai_guardrails.ides import DEFAULT_IDE_NAME, collect_all_session_contexts, get_ide
10
13
  from cycode.cli.apps.ai_guardrails.scan.utils import read_stdin_text, safe_json_parse
11
14
  from cycode.cli.apps.auth.auth_common import get_authorization_info
12
15
  from cycode.cli.apps.auth.auth_manager import AuthManager
@@ -26,23 +29,76 @@ if TYPE_CHECKING:
26
29
 
27
30
  logger = get_logger('AI Guardrails')
28
31
 
32
+ _SESSION_CONTEXT_CACHE_FILE = '.session-context-cache'
33
+ _SESSION_CONTEXT_TTL_SECONDS = 7 * 24 * 60 * 60
29
34
 
30
- def _report_session_context(ai_client: 'AISecurityManagerClient', ide: IDE, user_email: Optional[str]) -> None:
31
- """Report IDE session context to the AI security manager. Never raises."""
35
+
36
+ def _session_context_cache_path() -> Path:
37
+ return Path.home() / '.cycode' / _SESSION_CONTEXT_CACHE_FILE
38
+
39
+
40
+ def _session_context_digest(report: dict) -> str:
41
+ """Deterministic hash of the outgoing payload (not the raw config files, which churn)."""
42
+ canonical = json.dumps(report, sort_keys=True, separators=(',', ':'), default=str)
43
+ return hashlib.sha256(canonical.encode('utf-8')).hexdigest()
44
+
45
+
46
+ def _should_skip_report(digest: str, tenant_id: Optional[str]) -> bool:
47
+ """Skip when the same payload was already sent for this tenant and the TTL hasn't expired."""
32
48
  try:
33
- global_config_file, enabled_plugins = ide.get_session_context()
34
- if not global_config_file and not enabled_plugins:
35
- return
36
- ai_client.report_session_context(
37
- hostname=get_hostname(),
38
- platform_name=get_platform_name(),
39
- os_version=get_os_version(),
40
- serial_number=get_serial_number(),
41
- last_login_user=get_last_login_user(),
42
- global_config_file=global_config_file,
43
- enabled_plugins=enabled_plugins,
44
- user_email=user_email,
49
+ cache = json.loads(_session_context_cache_path().read_text(encoding='utf-8'))
50
+ return (
51
+ cache.get('hash') == digest
52
+ and cache.get('tenant_id') == tenant_id
53
+ and time.time() - float(cache.get('sent_at', 0)) < _SESSION_CONTEXT_TTL_SECONDS
54
+ )
55
+ except Exception:
56
+ # Missing/corrupt cache reads as a miss - over-sending is harmless
57
+ return False
58
+
59
+
60
+ def _save_report_cache(digest: str, tenant_id: Optional[str]) -> None:
61
+ try:
62
+ cache_path = _session_context_cache_path()
63
+ cache_path.parent.mkdir(parents=True, exist_ok=True)
64
+ cache_path.write_text(
65
+ json.dumps({'hash': digest, 'tenant_id': tenant_id, 'sent_at': time.time()}), encoding='utf-8'
45
66
  )
67
+ except Exception as e:
68
+ logger.debug('Failed to write session context cache', exc_info=e)
69
+
70
+
71
+ def _report_session_context(
72
+ ai_client: 'AISecurityManagerClient',
73
+ user_email: Optional[str],
74
+ tenant_id: Optional[str],
75
+ ) -> None:
76
+ """Report the device + cross-IDE session context to the AI security manager. Never raises.
77
+
78
+ The device context is always reported. MCP configs are collected from every registered IDE,
79
+ not just the triggering one. Unchanged payloads are skipped via a hash cache until the TTL expires.
80
+ """
81
+ try:
82
+ config_files_by_ide, enabled_plugins = collect_all_session_contexts()
83
+ report = {
84
+ 'hostname': get_hostname(),
85
+ 'platform_name': get_platform_name(),
86
+ 'os_version': get_os_version(),
87
+ 'serial_number': get_serial_number(),
88
+ 'last_login_user': get_last_login_user(),
89
+ # Sorted by path so the digest is stable regardless of IDE registry order.
90
+ 'config_files': sorted(config_files_by_ide.values(), key=lambda f: f['path']),
91
+ 'enabled_plugins': enabled_plugins,
92
+ 'user_email': user_email,
93
+ }
94
+
95
+ digest = _session_context_digest(report)
96
+ if _should_skip_report(digest, tenant_id):
97
+ logger.debug('Session context unchanged; skipping report')
98
+ return
99
+
100
+ if ai_client.report_session_context(**report):
101
+ _save_report_cache(digest, tenant_id)
46
102
  except Exception as e:
47
103
  logger.debug('Failed to report session context', exc_info=e)
48
104
 
@@ -61,7 +117,7 @@ def session_start_command(
61
117
  """Handle session start: ensure auth, create conversation, report session context."""
62
118
  ide_integration = get_ide(ide)
63
119
 
64
- # Step 1: Ensure authentication
120
+ # Ensure authentication
65
121
  auth_info = get_authorization_info(ctx)
66
122
  if auth_info is None:
67
123
  logger.debug('Not authenticated, starting authentication')
@@ -70,10 +126,11 @@ def session_start_command(
70
126
  except Exception as err:
71
127
  handle_auth_exception(ctx, err)
72
128
  return
129
+ auth_info = get_authorization_info(ctx)
73
130
  else:
74
131
  logger.debug('Already authenticated')
75
132
 
76
- # Step 2: Read stdin payload (backward compat: old hooks pipe no stdin)
133
+ # Read stdin payload (backward compat: old hooks pipe no stdin)
77
134
  if sys.stdin.isatty():
78
135
  logger.debug('No stdin payload (TTY), skipping session initialization')
79
136
  return
@@ -84,7 +141,7 @@ def session_start_command(
84
141
  logger.debug('Empty or invalid stdin payload, skipping session initialization')
85
142
  return
86
143
 
87
- # Step 3: Build session payload + initialize API client
144
+ # Build session payload + initialize API client
88
145
  session_payload = ide_integration.build_session_payload(payload)
89
146
 
90
147
  try:
@@ -93,11 +150,11 @@ def session_start_command(
93
150
  logger.debug('Failed to initialize AI security client', exc_info=e)
94
151
  return
95
152
 
96
- # Step 4: Create conversation
153
+ # Create conversation
97
154
  try:
98
155
  ai_client.create_conversation(session_payload)
99
156
  except Exception as e:
100
157
  logger.debug('Failed to create conversation during session start', exc_info=e)
101
158
 
102
- # Step 5: Report session context (MCP servers, enabled plugins)
103
- _report_session_context(ai_client, ide_integration, session_payload.ide_user_email)
159
+ # Report session context (device + cross-IDE MCP servers and plugins)
160
+ _report_session_context(ai_client, session_payload.ide_user_email, auth_info.tenant_id)
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import platform
2
3
  import re
3
4
  from typing import Optional
4
5
 
@@ -12,19 +13,32 @@ from cycode.cli.utils.shell_executor import shell
12
13
  BUILD_GRADLE_FILE_NAME = 'build.gradle'
13
14
  BUILD_GRADLE_KTS_FILE_NAME = 'build.gradle.kts'
14
15
  BUILD_GRADLE_DEP_TREE_FILE_NAME = 'gradle-dependencies-generated.txt'
15
- BUILD_GRADLE_ALL_PROJECTS_COMMAND = ['gradle', 'projects']
16
16
  ALL_PROJECTS_REGEX = r"[+-]{3} Project '(.*?)'"
17
17
 
18
+ GRADLE_EXECUTABLE = 'gradle'
19
+ GRADLEW_FILE_NAME = 'gradlew'
20
+ GRADLEW_BAT_FILE_NAME = 'gradlew.bat'
21
+
18
22
 
19
23
  class RestoreGradleDependencies(BaseRestoreDependencies):
20
24
  def __init__(
21
25
  self, ctx: typer.Context, is_git_diff: bool, command_timeout: int, projects: Optional[set[str]] = None
22
26
  ) -> None:
23
27
  super().__init__(ctx, is_git_diff, command_timeout, create_output_file_manually=True)
28
+ self.gradle_executable = self._resolve_gradle_executable()
24
29
  if projects is None:
25
30
  projects = set()
26
31
  self.projects = self.get_all_projects() if self.is_gradle_sub_projects() else projects
27
32
 
33
+ def _resolve_gradle_executable(self) -> str:
34
+ scan_root = get_path_from_context(self.ctx)
35
+ if scan_root:
36
+ wrapper_name = GRADLEW_BAT_FILE_NAME if platform.system() == 'Windows' else GRADLEW_FILE_NAME
37
+ wrapper_path = os.path.join(scan_root, wrapper_name)
38
+ if os.path.isfile(wrapper_path):
39
+ return wrapper_path
40
+ return GRADLE_EXECUTABLE
41
+
28
42
  def is_gradle_sub_projects(self) -> bool:
29
43
  return self.ctx.obj.get('gradle_all_sub_projects', False)
30
44
 
@@ -35,7 +49,7 @@ class RestoreGradleDependencies(BaseRestoreDependencies):
35
49
  return (
36
50
  self.get_commands_for_sub_projects(manifest_file_path)
37
51
  if self.is_gradle_sub_projects()
38
- else [['gradle', 'dependencies', '-b', manifest_file_path, '-q', '--console', 'plain']]
52
+ else [[self.gradle_executable, 'dependencies', '-b', manifest_file_path, '-q', '--console', 'plain']]
39
53
  )
40
54
 
41
55
  def get_lock_file_name(self) -> str:
@@ -49,7 +63,7 @@ class RestoreGradleDependencies(BaseRestoreDependencies):
49
63
 
50
64
  def get_all_projects(self) -> set[str]:
51
65
  output = shell(
52
- command=BUILD_GRADLE_ALL_PROJECTS_COMMAND,
66
+ command=[self.gradle_executable, 'projects'],
53
67
  timeout=self.command_timeout,
54
68
  working_directory=get_path_from_context(self.ctx),
55
69
  )
@@ -62,7 +76,7 @@ class RestoreGradleDependencies(BaseRestoreDependencies):
62
76
  project_name = os.path.basename(os.path.dirname(manifest_file_path))
63
77
  project_name = f':{project_name}'
64
78
  return (
65
- [['gradle', f'{project_name}:dependencies', '-q', '--console', 'plain']]
79
+ [[self.gradle_executable, f'{project_name}:dependencies', '-q', '--console', 'plain']]
66
80
  if project_name in self.projects
67
81
  else []
68
82
  )
@@ -98,11 +98,11 @@ class AISecurityManagerClient:
98
98
  os_version: Optional[str] = None,
99
99
  serial_number: Optional[str] = None,
100
100
  last_login_user: Optional[str] = None,
101
- global_config_file: Optional[dict] = None,
101
+ config_files: Optional[list[dict]] = None,
102
102
  enabled_plugins: Optional[dict] = None,
103
103
  user_email: Optional[str] = None,
104
- ) -> None:
105
- """Report session context to the backend."""
104
+ ) -> bool:
105
+ """Report session context to the backend. Returns whether the report was accepted."""
106
106
  body: dict = {
107
107
  'hostname': hostname,
108
108
  'platform_name': platform_name,
@@ -110,12 +110,14 @@ class AISecurityManagerClient:
110
110
  'serial_number': serial_number,
111
111
  'last_login_user': last_login_user,
112
112
  'user_email': user_email,
113
- 'global_config_file': global_config_file,
113
+ 'config_files': config_files,
114
114
  'enabled_plugins': enabled_plugins,
115
115
  }
116
116
 
117
117
  try:
118
118
  self.client.post(self._build_endpoint_path(self._SESSION_CONTEXT_PATH), body=body)
119
+ return True
119
120
  except Exception as e:
120
121
  logger.debug('Failed to report session context', exc_info=e)
121
122
  # Don't fail the session if reporting fails
123
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cycode
3
- Version: 3.17.1.dev10
3
+ Version: 3.17.2.dev1
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  License-Expression: MIT
6
6
  License-File: LICENCE
@@ -1,4 +1,4 @@
1
- cycode/__init__.py,sha256=UjdGx8D2pbm-DIgUO0-gvR92y-C7W85PfkiKjo0b-eg,397
1
+ cycode/__init__.py,sha256=EAGqyauQgWjbkbDVGhIc99Qu6DCg7Q4U-NYHKc2VN7A,396
2
2
  cycode/__main__.py,sha256=Z3bD5yrA7yPvAChcADQrqCaZd0ChGI1gdiwALwbWJ6U,104
3
3
  cycode/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cycode/cli/app.py,sha256=AlR2durAEbsa47PDfIj7JtMvJDWA_Dq6wPtVuMJYSCs,10250
@@ -8,11 +8,11 @@ cycode/cli/apps/ai_guardrails/__init__.py,sha256=NsqB1Ca83BIjJMcDSt6suec6Ed0iNna
8
8
  cycode/cli/apps/ai_guardrails/command_utils.py,sha256=NVwd0-2RGRKIqhsQ-4LNDR1D0gVm_o7n-z5LxG2bqAo,800
9
9
  cycode/cli/apps/ai_guardrails/consts.py,sha256=Js2QtSNYG9Kt0eo3vepRd5TFciCeJHEC9NN18zqKvlE,620
10
10
  cycode/cli/apps/ai_guardrails/hooks_manager.py,sha256=c8okVel9KjeXWm5QTnvTraWsTwzrUTqqKd6C80C34Y4,9003
11
- cycode/cli/apps/ai_guardrails/ides/__init__.py,sha256=JMXbQlq-7q1429w3nQq9Z4FZ8K0zdiUK6zCbilmD3JU,1689
12
- cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py,sha256=sBiLZWAKL8M7fTSDLR09aPk7_2w7NJfN10tydwVszmA,3273
11
+ cycode/cli/apps/ai_guardrails/ides/__init__.py,sha256=BDUvQYoavmMtuhoUESCSONpd_ssPjxEH8NCZD1_hsCA,2565
12
+ cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py,sha256=XPIc9pZFEgdGVTSSAl9yqI48F88GKlFnJ5FsLUhHjCE,3981
13
13
  cycode/cli/apps/ai_guardrails/ides/base.py,sha256=siFgELUNn1YBXY-jbx3yvhCbbqMXZQG1mFlxTAnwqS8,6995
14
- cycode/cli/apps/ai_guardrails/ides/claude_code.py,sha256=KkTpX285ofwAD8olOcXwZXy9KBerlG3haS7QDrizD3o,13634
15
- cycode/cli/apps/ai_guardrails/ides/codex.py,sha256=n9aiFQ8vGJxZMxCViSz5K8t3GixxZhiIMeIBkbfjxmg,12189
14
+ cycode/cli/apps/ai_guardrails/ides/claude_code.py,sha256=Hxg76KuwaFRrRR_rB6okx68HTpH_HU0bUyC0P4k02Eg,14276
15
+ cycode/cli/apps/ai_guardrails/ides/codex.py,sha256=HC2PhB4J3-k3IHgT_nBsDtLGXNBeOkg5FjWFKzAreak,11942
16
16
  cycode/cli/apps/ai_guardrails/ides/cursor.py,sha256=wyHbh0QaSjC0EbwcWi-kZR4SN5lgkOLJ5S55EgSO2sw,5606
17
17
  cycode/cli/apps/ai_guardrails/install_command.py,sha256=vGZSIvHHVMS9_zhV_6lEhxqtmr5H6uykSq4AS5nxQYw,4278
18
18
  cycode/cli/apps/ai_guardrails/scan/__init__.py,sha256=qJc82XiQGiAuc1sYY8Ij_A-qXpxgLPuayQq8xWlouMA,48
@@ -23,7 +23,7 @@ cycode/cli/apps/ai_guardrails/scan/policy.py,sha256=BZoNNdDQ9tqnfwhB4X1-bDtudaOQ
23
23
  cycode/cli/apps/ai_guardrails/scan/scan_command.py,sha256=uiBCDGcshqgvwkdqrlwNbaGZQnjpAvuTZ9T7UI09YJY,6178
24
24
  cycode/cli/apps/ai_guardrails/scan/types.py,sha256=lDttkYFBfOkdMEEaRbq1IT2QTK0R-7Ht3T8vZdyB3b4,1038
25
25
  cycode/cli/apps/ai_guardrails/scan/utils.py,sha256=QzR_zmivDYwg2-F8g4bFfsycHhNo-pPuJly0P_l0gm8,2879
26
- cycode/cli/apps/ai_guardrails/session_start_command.py,sha256=_N7dDi2bv7IykvB7xtCFFZgP0YmvT8-jxeSywBM57Os,3700
26
+ cycode/cli/apps/ai_guardrails/session_start_command.py,sha256=05Li-ON2U1BU_8CR2YYw1y5HVvoWPTf19ne--EgPqmQ,5921
27
27
  cycode/cli/apps/ai_guardrails/status_command.py,sha256=Uqss68TEPCYPXpLix6Bh-4J3g-khxWsAqlIGYH5x4bQ,3203
28
28
  cycode/cli/apps/ai_guardrails/uninstall_command.py,sha256=dOmePfZmlHAPy2zEJM1yMtSuDqvzDwtqgmLKYK-T9PI,2698
29
29
  cycode/cli/apps/ai_remediation/__init__.py,sha256=8vYthY9RQeJqEni3AIF5sryz8n-XJQ6VNqG4aEFBAdY,553
@@ -117,7 +117,7 @@ cycode/cli/files_collector/sca/base_restore_dependencies.py,sha256=hCQyjQW5hPhBw
117
117
  cycode/cli/files_collector/sca/go/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
118
  cycode/cli/files_collector/sca/go/restore_go_dependencies.py,sha256=LXUjslfdHO3umz36WtQyRpKa_fVaRgEjewVkZ0QvnYU,1899
119
119
  cycode/cli/files_collector/sca/maven/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
- cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py,sha256=hwsdJby0_7i3s6YmCU-tB6B3TfsfbyQyeTVwEy6c6SA,2699
120
+ cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py,sha256=2W5Y8yrSIV7o4rCUtNsqO2YFImvcY5TnabzTbStiaBo,3261
121
121
  cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py,sha256=zObNN8n6yUriNVB3ZdvAkoKXXrMvzU9Lpd5lNhVo_so,4003
122
122
  cycode/cli/files_collector/sca/npm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
123
  cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py,sha256=HI0X_19wCM6B_vRpX6uD12dXsQbU6LCcLQdobPZDgAs,4580
@@ -188,7 +188,7 @@ cycode/cli/utils/version_checker.py,sha256=0f5PaTk02ZkDxzBqZOeMV9mU_CWcx6HKW80jU
188
188
  cycode/cli/utils/yaml_utils.py,sha256=R-tqzl0C-zoa42rS7nfWeHu3GJ0jpbQUyyqYYU2hleM,1818
189
189
  cycode/config.py,sha256=jHORGZQcAXkAGSf2XreC-RQoc8sdNWja69QKtPWTbWo,1044
190
190
  cycode/cyclient/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
- cycode/cyclient/ai_security_manager_client.py,sha256=_LDU8B6_3DuMT-I-K5-Ok2E-NR30aJbD7L0f8UGDDPQ,4730
191
+ cycode/cyclient/ai_security_manager_client.py,sha256=K3fvBC_d-8iDnVnMSVPXiDtuuapiWGT2xg1Kx203XU0,4808
192
192
  cycode/cyclient/ai_security_manager_service_config.py,sha256=83pQzgOb93JW6E-dznJkI4c0NEXmQRlx9YZKMmjVwp8,808
193
193
  cycode/cyclient/auth_client.py,sha256=TwbmZ358Ancf-Q-IZolvfljZ8691_6botsqd0R0PLPk,2105
194
194
  cycode/cyclient/base_token_auth_client.py,sha256=mn5580d7A8Z2_zcdFKIJk78ADK7mViwTcV-4QCpRCGo,4369
@@ -209,8 +209,8 @@ cycode/cyclient/report_client.py,sha256=Scq30NeJPzgXv0hPLO1U05AdE9i_2iu6cIrSKpEJ
209
209
  cycode/cyclient/scan_client.py,sha256=6TK5FQkfrvV7PHqRnUzEn1PBNd2oPYVamvIixcUfe3c,16755
210
210
  cycode/cyclient/scan_config_base.py,sha256=mXsPZGYCtp85rv5GIige40yQZXuRcEKUW-VQJ0vgFzk,1201
211
211
  cycode/logger.py,sha256=EfZGRK6VC5rE_LAjIcRrHFiQCueylCDXoG6bvGkrIME,2111
212
- cycode-3.17.1.dev10.dist-info/METADATA,sha256=CUUCwEIh2CKhigEh5u90CphxtOsYx7vLfutsxfaTKkE,89247
213
- cycode-3.17.1.dev10.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
214
- cycode-3.17.1.dev10.dist-info/entry_points.txt,sha256=iDcVJM8ByLElVgvBgtYxDjw1kT7O8Mo0LcWZIT5L3Ig,45
215
- cycode-3.17.1.dev10.dist-info/licenses/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
216
- cycode-3.17.1.dev10.dist-info/RECORD,,
212
+ cycode-3.17.2.dev1.dist-info/METADATA,sha256=r9d8aVWGVmkdo07gw6df0k1z-Ji4dKraxrjODW5Pl1I,89246
213
+ cycode-3.17.2.dev1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
214
+ cycode-3.17.2.dev1.dist-info/entry_points.txt,sha256=iDcVJM8ByLElVgvBgtYxDjw1kT7O8Mo0LcWZIT5L3Ig,45
215
+ cycode-3.17.2.dev1.dist-info/licenses/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
216
+ cycode-3.17.2.dev1.dist-info/RECORD,,