cycode 3.24.1.dev3__tar.gz → 3.24.2.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/PKG-INFO +1 -1
  2. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/__init__.py +1 -1
  3. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/guardrail_config.py +2 -9
  4. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/handlers.py +59 -52
  5. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_result.py +2 -0
  6. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/models.py +1 -0
  7. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/models.py +4 -0
  8. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/pyproject.toml +1 -1
  9. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/LICENCE +0 -0
  10. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/README.md +0 -0
  11. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/__main__.py +0 -0
  12. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/__init__.py +0 -0
  13. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/app.py +0 -0
  14. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/__init__.py +0 -0
  15. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/activation_manager.py +0 -0
  16. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/__init__.py +0 -0
  17. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/command_utils.py +0 -0
  18. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/consts.py +0 -0
  19. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/hooks_manager.py +0 -0
  20. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/__init__.py +0 -0
  21. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_plugin_utils.py +0 -0
  22. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/_skill_utils.py +0 -0
  23. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/base.py +0 -0
  24. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/claude_code.py +0 -0
  25. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/codex.py +0 -0
  26. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/copilot.py +0 -0
  27. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/ides/cursor.py +0 -0
  28. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/install_command.py +0 -0
  29. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/__init__.py +0 -0
  30. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/consts.py +0 -0
  31. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/detach.py +0 -0
  32. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/payload.py +0 -0
  33. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/policy.py +0 -0
  34. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/scan_command.py +0 -0
  35. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/types.py +0 -0
  36. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/scan/utils.py +0 -0
  37. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/session_start_command.py +0 -0
  38. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/status_command.py +0 -0
  39. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_guardrails/uninstall_command.py +0 -0
  40. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/__init__.py +0 -0
  41. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/ai_remediation_command.py +0 -0
  42. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/apply_fix.py +0 -0
  43. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ai_remediation/print_remediation.py +0 -0
  44. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/__init__.py +0 -0
  45. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/api_command.py +0 -0
  46. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/api/openapi_spec.py +0 -0
  47. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/__init__.py +0 -0
  48. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_command.py +0 -0
  49. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_common.py +0 -0
  50. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/auth_manager.py +0 -0
  51. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/auth/models.py +0 -0
  52. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/__init__.py +0 -0
  53. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/configure_command.py +0 -0
  54. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/consts.py +0 -0
  55. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/messages.py +0 -0
  56. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/configure/prompts.py +0 -0
  57. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ignore/__init__.py +0 -0
  58. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/ignore/ignore_command.py +0 -0
  59. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/mcp/__init__.py +0 -0
  60. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/mcp/mcp_command.py +0 -0
  61. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/__init__.py +0 -0
  62. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/report_command.py +0 -0
  63. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/__init__.py +0 -0
  64. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/common.py +0 -0
  65. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/path/__init__.py +0 -0
  66. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/path/path_command.py +0 -0
  67. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/repository_url/__init__.py +0 -0
  68. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/repository_url/repository_url_command.py +0 -0
  69. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/sbom_command.py +0 -0
  70. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report/sbom/sbom_report_file.py +0 -0
  71. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/__init__.py +0 -0
  72. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/report_import_command.py +0 -0
  73. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/sbom/__init__.py +0 -0
  74. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/report_import/sbom/sbom_command.py +0 -0
  75. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/sca_options.py +0 -0
  76. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/__init__.py +0 -0
  77. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/aggregation_report.py +0 -0
  78. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/code_scanner.py +0 -0
  79. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_history/__init__.py +0 -0
  80. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_history/commit_history_command.py +0 -0
  81. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/commit_range_scanner.py +0 -0
  82. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/detection_excluder.py +0 -0
  83. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/path/__init__.py +0 -0
  84. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/path/path_command.py +0 -0
  85. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_commit/__init__.py +0 -0
  86. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +0 -0
  87. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_push/__init__.py +0 -0
  88. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_push/pre_push_command.py +0 -0
  89. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_receive/__init__.py +0 -0
  90. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +0 -0
  91. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/remote_url_resolver.py +0 -0
  92. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/repository/__init__.py +0 -0
  93. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/repository/repository_command.py +0 -0
  94. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/__init__.py +0 -0
  95. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/ci_integrations.py +0 -0
  96. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +0 -0
  97. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_command.py +0 -0
  98. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/scan/scan_parameters.py +0 -0
  99. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/__init__.py +0 -0
  100. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/get_cli_status.py +0 -0
  101. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/models.py +0 -0
  102. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/status_command.py +0 -0
  103. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/apps/status/version_command.py +0 -0
  104. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/cli_types.py +0 -0
  105. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/config.py +0 -0
  106. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/console.py +0 -0
  107. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/consts.py +0 -0
  108. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/__init__.py +0 -0
  109. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/custom_exceptions.py +0 -0
  110. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_ai_remediation_errors.py +0 -0
  111. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_auth_errors.py +0 -0
  112. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_errors.py +0 -0
  113. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_report_sbom_errors.py +0 -0
  114. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/exceptions/handle_scan_errors.py +0 -0
  115. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/__init__.py +0 -0
  116. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/commit_range_documents.py +0 -0
  117. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/documents_walk_ignore.py +0 -0
  118. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/file_excluder.py +0 -0
  119. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/iac/__init__.py +0 -0
  120. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/iac/tf_content_generator.py +0 -0
  121. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/models/__init__.py +0 -0
  122. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/models/in_memory_zip.py +0 -0
  123. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/path_documents.py +0 -0
  124. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/repository_documents.py +0 -0
  125. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/__init__.py +0 -0
  126. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/base_restore_dependencies.py +0 -0
  127. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/go/__init__.py +0 -0
  128. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/go/restore_go_dependencies.py +0 -0
  129. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/__init__.py +0 -0
  130. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/restore_gradle_dependencies.py +0 -0
  131. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/maven/restore_maven_dependencies.py +0 -0
  132. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/__init__.py +0 -0
  133. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_bun_dependencies.py +0 -0
  134. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_deno_dependencies.py +0 -0
  135. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_npm_dependencies.py +0 -0
  136. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_pnpm_dependencies.py +0 -0
  137. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/npm/restore_yarn_dependencies.py +0 -0
  138. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/nuget/__init__.py +0 -0
  139. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/nuget/restore_nuget_dependencies.py +0 -0
  140. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/php/__init__.py +0 -0
  141. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/php/restore_composer_dependencies.py +0 -0
  142. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/__init__.py +0 -0
  143. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_pip_dependencies.py +0 -0
  144. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_pipenv_dependencies.py +0 -0
  145. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_poetry_dependencies.py +0 -0
  146. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/python/restore_uv_dependencies.py +0 -0
  147. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/ruby/__init__.py +0 -0
  148. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/ruby/restore_ruby_dependencies.py +0 -0
  149. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sbt/__init__.py +0 -0
  150. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py +0 -0
  151. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/sca/sca_file_collector.py +0 -0
  152. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/walk_ignore.py +0 -0
  153. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/files_collector/zip_documents.py +0 -0
  154. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/logger.py +0 -0
  155. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/main.py +0 -0
  156. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/__init__.py +0 -0
  157. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/console_printer.py +0 -0
  158. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/json_printer.py +0 -0
  159. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/printer_base.py +0 -0
  160. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/rich_printer.py +0 -0
  161. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/__init__.py +0 -0
  162. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/sca_table_printer.py +0 -0
  163. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table.py +0 -0
  164. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_models.py +0 -0
  165. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_printer.py +0 -0
  166. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/tables/table_printer_base.py +0 -0
  167. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/text_printer.py +0 -0
  168. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/__init__.py +0 -0
  169. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/code_snippet_syntax.py +0 -0
  170. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_data.py +0 -0
  171. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/__init__.py +0 -0
  172. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/common_ordering.py +0 -0
  173. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/detection_ordering/sca_ordering.py +0 -0
  174. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/rich_helpers.py +0 -0
  175. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/sca_ossf.py +0 -0
  176. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/printers/utils/sca_policy_details.py +0 -0
  177. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/__init__.py +0 -0
  178. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/base_file_manager.py +0 -0
  179. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/config_file_manager.py +0 -0
  180. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/configuration_manager.py +0 -0
  181. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/credentials_manager.py +0 -0
  182. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/user_settings/jwt_creator.py +0 -0
  183. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/__init__.py +0 -0
  184. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/binary_utils.py +0 -0
  185. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/enum_utils.py +0 -0
  186. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/get_api_client.py +0 -0
  187. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/git_proxy.py +0 -0
  188. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/host_info.py +0 -0
  189. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/ignore_utils.py +0 -0
  190. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/jwt_utils.py +0 -0
  191. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/path_utils.py +0 -0
  192. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/progress_bar.py +0 -0
  193. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/scan_batch.py +0 -0
  194. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/scan_utils.py +0 -0
  195. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/shell_executor.py +0 -0
  196. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/string_utils.py +0 -0
  197. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/task_timer.py +0 -0
  198. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/trust_store.py +0 -0
  199. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/url_utils.py +0 -0
  200. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/version_checker.py +0 -0
  201. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cli/utils/yaml_utils.py +0 -0
  202. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/config.py +0 -0
  203. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/__init__.py +0 -0
  204. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/ai_security_manager_client.py +0 -0
  205. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/ai_security_manager_service_config.py +0 -0
  206. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/auth_client.py +0 -0
  207. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/base_token_auth_client.py +0 -0
  208. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cli_activation_client.py +0 -0
  209. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/client_creator.py +0 -0
  210. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/config.py +0 -0
  211. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/config_dev.py +0 -0
  212. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_client.py +0 -0
  213. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_client_base.py +0 -0
  214. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_dev_based_client.py +0 -0
  215. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_oidc_based_client.py +0 -0
  216. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/cycode_token_based_client.py +0 -0
  217. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/headers.py +0 -0
  218. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/import_sbom_client.py +0 -0
  219. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/logger.py +0 -0
  220. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/report_client.py +0 -0
  221. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/scan_client.py +0 -0
  222. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/cyclient/scan_config_base.py +0 -0
  223. {cycode-3.24.1.dev3 → cycode-3.24.2.dev1}/cycode/logger.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cycode
3
- Version: 3.24.1.dev3
3
+ Version: 3.24.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
@@ -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.24.1.dev3' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
8
+ __version__ = '3.24.2.dev1' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -37,19 +37,11 @@ _KNOWN_GUARDRAIL_KEYS = frozenset(
37
37
  )
38
38
  )
39
39
 
40
- # CLI --ide names to matrix column names; identity for names not listed.
41
- _AGENT_BY_IDE_NAME = {'claude-code': 'claude'}
42
-
43
40
 
44
41
  def get_config_cache_path() -> Path:
45
42
  return Path.home() / CYCODE_CONFIGURATION_DIRECTORY / GUARDRAILS_CONFIG_FILE_NAME
46
43
 
47
44
 
48
- def agent_for_ide(ide_name: Optional[str]) -> str:
49
- ide_name = (ide_name or '').lower()
50
- return _AGENT_BY_IDE_NAME.get(ide_name, ide_name)
51
-
52
-
53
45
  def _default_sensitive_globs() -> list:
54
46
  return list(DEFAULT_SENSITIVE_PATH_GLOBS)
55
47
 
@@ -69,8 +61,9 @@ class GuardrailConfig:
69
61
  }
70
62
 
71
63
  def mode_for(self, guardrail_key: str, ide_name: Optional[str]) -> str:
64
+ """The platform keys the cells by our --ide names, so the lookup is direct."""
72
65
  agents = (self._guardrails.get(guardrail_key) or {}).get('agents') or {}
73
- return str(agents.get(agent_for_ide(ide_name), GuardrailCellMode.REPORT.value)).lower()
66
+ return str(agents.get((ide_name or '').lower(), GuardrailCellMode.REPORT.value)).lower()
74
67
 
75
68
  def _modes_for_event(self, event_name: str, ide_name: Optional[str]) -> list:
76
69
  return [
@@ -13,7 +13,7 @@ import os
13
13
  from dataclasses import dataclass
14
14
  from multiprocessing.pool import ThreadPool
15
15
  from multiprocessing.pool import TimeoutError as PoolTimeoutError
16
- from typing import TYPE_CHECKING, Callable, Optional
16
+ from typing import TYPE_CHECKING, Callable, NamedTuple, Optional
17
17
 
18
18
  import typer
19
19
 
@@ -45,12 +45,32 @@ logger = get_logger('AI Guardrails')
45
45
  HandlerFn = Callable[[typer.Context, AIHookPayload, dict], HookDecision]
46
46
 
47
47
 
48
+ class ScanOutcome(NamedTuple):
49
+ """What one guardrail scan came back with; the verdict is the server's, which applied the tenant's floors."""
50
+
51
+ violation_summary: Optional[str] = None
52
+ scan_id: Optional[str] = None
53
+ verdict: Optional[GuardrailsMode] = None
54
+
55
+
56
+ NO_SCAN = ScanOutcome()
57
+
58
+
59
+ def _parse_verdict(verdict: Optional[str]) -> Optional[GuardrailsMode]:
60
+ """The server spells the verdict "Block"/"Report" and omits it when the scan found nothing to decide on."""
61
+ if not verdict:
62
+ return None
63
+ try:
64
+ return GuardrailsMode(verdict.lower())
65
+ except ValueError:
66
+ logger.debug('Ignoring unknown guardrail verdict, %s', {'verdict': verdict})
67
+ return None
68
+
69
+
48
70
  def handle_before_submit_prompt(ctx: typer.Context, payload: AIHookPayload, policy: dict) -> HookDecision:
49
71
  """Scan prompt text for secrets before it's sent to the AI model."""
50
72
  ai_client = ctx.obj['ai_security_client']
51
73
 
52
- prompt_config = get_policy_value(policy, 'prompt', default={})
53
- effective_mode = get_effective_mode(prompt_config)
54
74
  prompt = payload.prompt or ''
55
75
  max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
56
76
  timeout_ms = get_policy_value(policy, 'secrets', 'timeout_ms', default=30000)
@@ -62,20 +82,20 @@ def handle_before_submit_prompt(ctx: typer.Context, payload: AIHookPayload, poli
62
82
  error_message = None
63
83
 
64
84
  try:
65
- violation_summary, scan_id = _scan_text_for_secrets(
85
+ scan_outcome = _scan_text_for_secrets(
66
86
  ctx,
67
87
  clipped,
68
88
  timeout_ms,
69
89
  payload=payload,
70
90
  event_type=AiHookEventType.PROMPT,
71
- effective_mode=effective_mode,
72
91
  )
92
+ scan_id = scan_outcome.scan_id
73
93
 
74
- if violation_summary:
94
+ if scan_outcome.violation_summary:
75
95
  block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[AiHookEventType.PROMPT]
76
- if effective_mode == GuardrailsMode.BLOCK:
96
+ if scan_outcome.verdict == GuardrailsMode.BLOCK:
77
97
  outcome = AIHookOutcome.BLOCKED
78
- user_message = f'Remove secrets before sending. {violation_summary}'
98
+ user_message = f'Remove secrets before sending. {scan_outcome.violation_summary}'
79
99
  return HookDecision.deny(AiHookEventType.PROMPT, user_message)
80
100
  outcome = AIHookOutcome.WARNED
81
101
  return HookDecision.allow(AiHookEventType.PROMPT)
@@ -104,7 +124,6 @@ def handle_before_read_file(ctx: typer.Context, payload: AIHookPayload, policy:
104
124
  file_read_config = get_policy_value(policy, 'file_read', default={})
105
125
  file_path = payload.file_path or ''
106
126
  path_mode = get_effective_mode(file_read_config, action_key='path_action')
107
- content_mode = get_effective_mode(file_read_config)
108
127
 
109
128
  scan_id = None
110
129
  block_reason = None
@@ -138,21 +157,20 @@ def handle_before_read_file(ctx: typer.Context, payload: AIHookPayload, policy:
138
157
  outcome = AIHookOutcome.ALLOWED
139
158
 
140
159
  if get_policy_value(file_read_config, 'scan_content', default=True):
141
- violation_summary, scan_id = _scan_path_for_secrets(
142
- ctx, file_path, policy, payload=payload, effective_mode=content_mode
143
- )
144
- if violation_summary:
160
+ scan_outcome = _scan_path_for_secrets(ctx, file_path, policy, payload=payload)
161
+ scan_id = scan_outcome.scan_id
162
+ if scan_outcome.violation_summary:
145
163
  block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[AiHookEventType.FILE_READ]
146
- if content_mode == GuardrailsMode.BLOCK:
164
+ if scan_outcome.verdict == GuardrailsMode.BLOCK:
147
165
  outcome = AIHookOutcome.BLOCKED
148
- user_message = f'Cycode blocked reading {file_path}. {violation_summary}'
166
+ user_message = f'Cycode blocked reading {file_path}. {scan_outcome.violation_summary}'
149
167
  return HookDecision.deny(
150
168
  AiHookEventType.FILE_READ,
151
169
  user_message,
152
170
  'Secrets detected; do not send this file to the model.',
153
171
  )
154
172
  outcome = AIHookOutcome.WARNED
155
- user_message = f'Cycode detected secrets in {file_path}. {violation_summary}'
173
+ user_message = f'Cycode detected secrets in {file_path}. {scan_outcome.violation_summary}'
156
174
  return HookDecision.ask(
157
175
  AiHookEventType.FILE_READ,
158
176
  user_message,
@@ -192,10 +210,9 @@ class _ArgScanFeature:
192
210
  """Configuration for a "scan some text and decide" event.
193
211
 
194
212
  MCP execution and command exec share identical scan-and-decide logic;
195
- only the policy key, event type, and user-facing messages differ.
213
+ only the event type and user-facing messages differ.
196
214
  """
197
215
 
198
- policy_key: str # 'mcp' or 'command_exec'
199
216
  event_type: AiHookEventType
200
217
  deny_message: Callable[[str], str]
201
218
  deny_agent_message: str
@@ -213,11 +230,9 @@ def _handle_arg_scan(
213
230
  """Shared scan + decision flow for MCP_EXECUTION and COMMAND_EXEC events."""
214
231
  ai_client = ctx.obj['ai_security_client']
215
232
 
216
- feature_config = get_policy_value(policy, feature.policy_key, default={})
217
233
  max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
218
234
  timeout_ms = get_policy_value(policy, 'secrets', 'timeout_ms', default=30000)
219
235
  clipped = truncate_utf8(scan_text, max_bytes)
220
- effective_mode = get_effective_mode(feature_config)
221
236
 
222
237
  scan_id = None
223
238
  block_reason = None
@@ -225,27 +240,27 @@ def _handle_arg_scan(
225
240
  error_message = None
226
241
 
227
242
  try:
228
- violation_summary, scan_id = _scan_text_for_secrets(
243
+ scan_outcome = _scan_text_for_secrets(
229
244
  ctx,
230
245
  clipped,
231
246
  timeout_ms,
232
247
  payload=payload,
233
248
  event_type=feature.event_type,
234
- effective_mode=effective_mode,
235
249
  )
236
- if violation_summary:
250
+ scan_id = scan_outcome.scan_id
251
+ if scan_outcome.violation_summary:
237
252
  block_reason = SECRETS_BLOCK_REASON_BY_EVENT_TYPE[feature.event_type]
238
- if effective_mode == GuardrailsMode.BLOCK:
253
+ if scan_outcome.verdict == GuardrailsMode.BLOCK:
239
254
  outcome = AIHookOutcome.BLOCKED
240
255
  return HookDecision.deny(
241
256
  feature.event_type,
242
- feature.deny_message(violation_summary),
257
+ feature.deny_message(scan_outcome.violation_summary),
243
258
  feature.deny_agent_message,
244
259
  )
245
260
  outcome = AIHookOutcome.WARNED
246
261
  return HookDecision.ask(
247
262
  feature.event_type,
248
- feature.ask_message(violation_summary),
263
+ feature.ask_message(scan_outcome.violation_summary),
249
264
  feature.ask_agent_message,
250
265
  )
251
266
 
@@ -278,7 +293,6 @@ def handle_before_mcp_execution(ctx: typer.Context, payload: AIHookPayload, poli
278
293
  payload,
279
294
  policy,
280
295
  _ArgScanFeature(
281
- policy_key='mcp',
282
296
  event_type=AiHookEventType.MCP_EXECUTION,
283
297
  deny_message=lambda v: f'Cycode blocked MCP tool call "{tool}". {v}',
284
298
  deny_agent_message='Do not pass secrets to tools. Use secret references (name/id) instead.',
@@ -329,11 +343,9 @@ def build_ai_guardrails_scan_parameters(
329
343
  paths: Optional[tuple[str, ...]],
330
344
  payload: AIHookPayload,
331
345
  event_type: AiHookEventType,
332
- effective_mode: GuardrailsMode,
333
346
  ) -> dict:
334
347
  scan_parameters = get_scan_parameters(ctx, paths)
335
348
  scan_parameters.setdefault('metadata', {})['ai_guardrails'] = {
336
- 'mode': effective_mode.value,
337
349
  'ide_provider': payload.ide_provider,
338
350
  'detection_source': SECRETS_BLOCK_REASON_BY_EVENT_TYPE[event_type].value,
339
351
  'device_id': get_serial_number(),
@@ -360,13 +372,13 @@ def _setup_scan_context(ctx: typer.Context) -> typer.Context:
360
372
 
361
373
  def _perform_scan(
362
374
  ctx: typer.Context, documents: list[Document], scan_parameters: dict, timeout_seconds: float
363
- ) -> tuple[Optional[str], Optional[str]]:
364
- """Run a scan on documents, returning (violation_summary, scan_id).
375
+ ) -> ScanOutcome:
376
+ """Run a scan on documents.
365
377
 
366
378
  Raises on scan failure / timeout so the fail-open policy can take over.
367
379
  """
368
380
  if not documents:
369
- return None, None
381
+ return NO_SCAN
370
382
 
371
383
  scan_batch_thread_func = _get_scan_documents_thread_func(
372
384
  ctx, is_git_diff=False, is_commit_range=False, scan_parameters=scan_parameters
@@ -377,7 +389,7 @@ def _perform_scan(
377
389
  with ThreadPool(processes=1) as pool:
378
390
  result = pool.apply_async(scan_batch_thread_func, (documents,))
379
391
  try:
380
- scan_id, error, local_scan_result = result.get(timeout=timeout_seconds)
392
+ _, error, local_scan_result = result.get(timeout=timeout_seconds)
381
393
  except PoolTimeoutError:
382
394
  logger.debug('Scan timed out after %s seconds', timeout_seconds)
383
395
  raise RuntimeError(f'Scan timed out after {timeout_seconds} seconds') from None
@@ -387,15 +399,14 @@ def _perform_scan(
387
399
  raise RuntimeError(error.message)
388
400
 
389
401
  if not local_scan_result:
390
- return None, None
391
-
392
- scan_id = local_scan_result.scan_id
402
+ return NO_SCAN
393
403
 
394
- if local_scan_result.issue_detected:
395
- violation_summary = build_violation_summary([local_scan_result])
396
- return violation_summary, scan_id
397
-
398
- return None, scan_id
404
+ violation_summary = build_violation_summary([local_scan_result]) if local_scan_result.issue_detected else None
405
+ return ScanOutcome(
406
+ violation_summary=violation_summary,
407
+ scan_id=local_scan_result.scan_id,
408
+ verdict=_parse_verdict(local_scan_result.verdict),
409
+ )
399
410
 
400
411
 
401
412
  def _scan_text_for_secrets(
@@ -404,16 +415,15 @@ def _scan_text_for_secrets(
404
415
  timeout_ms: int,
405
416
  payload: AIHookPayload,
406
417
  event_type: AiHookEventType,
407
- effective_mode: GuardrailsMode,
408
- ) -> tuple[Optional[str], Optional[str]]:
418
+ ) -> ScanOutcome:
409
419
  """Scan text content for secrets using Cycode CLI."""
410
420
  if not text:
411
- return None, None
421
+ return NO_SCAN
412
422
 
413
423
  document = Document(path='prompt-content.txt', content=text, is_git_diff_format=False)
414
424
  scan_ctx = _setup_scan_context(ctx)
415
425
  timeout_seconds = timeout_ms / 1000.0
416
- scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, None, payload, event_type, effective_mode)
426
+ scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, None, payload, event_type)
417
427
  return _perform_scan(scan_ctx, [document], scan_parameters, timeout_seconds)
418
428
 
419
429
 
@@ -422,15 +432,14 @@ def _scan_path_for_secrets(
422
432
  file_path: str,
423
433
  policy: dict,
424
434
  payload: AIHookPayload,
425
- effective_mode: GuardrailsMode,
426
- ) -> tuple[Optional[str], Optional[str]]:
435
+ ) -> ScanOutcome:
427
436
  """Scan a file path for secrets."""
428
437
  if not file_path or not os.path.isfile(file_path):
429
- return None, None
438
+ return NO_SCAN
430
439
 
431
440
  if is_path_configured_in_exclusions(str(ScanTypeOption.SECRET), os.path.abspath(file_path)):
432
441
  logger.debug('Skipping scan; the path is in the ignore paths list, %s', {'file_path': file_path})
433
- return None, None
442
+ return NO_SCAN
434
443
 
435
444
  max_bytes = get_policy_value(policy, 'secrets', 'max_bytes', default=200000)
436
445
 
@@ -442,7 +451,5 @@ def _scan_path_for_secrets(
442
451
 
443
452
  document = Document(path=os.path.basename(file_path), content=content, is_git_diff_format=False)
444
453
  scan_ctx = _setup_scan_context(ctx)
445
- scan_parameters = build_ai_guardrails_scan_parameters(
446
- scan_ctx, (file_path,), payload, AiHookEventType.FILE_READ, effective_mode
447
- )
454
+ scan_parameters = build_ai_guardrails_scan_parameters(scan_ctx, (file_path,), payload, AiHookEventType.FILE_READ)
448
455
  return _perform_scan(scan_ctx, [document], scan_parameters, timeout_seconds)
@@ -79,6 +79,7 @@ def create_local_scan_result(
79
79
  issue_detected=len(relevant_document_detections_list) > 0,
80
80
  detections_count=detections_count,
81
81
  relevant_detections_count=relevant_detections_count,
82
+ verdict=scan_result.verdict,
82
83
  )
83
84
 
84
85
 
@@ -170,6 +171,7 @@ def get_sync_scan_result(scan_type: str, scan_results: 'ScanResultsSyncFlow') ->
170
171
  did_detect=True,
171
172
  detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_results.detection_messages),
172
173
  scan_id=scan_results.id,
174
+ verdict=scan_results.verdict,
173
175
  )
174
176
 
175
177
 
@@ -58,6 +58,7 @@ class LocalScanResult(NamedTuple):
58
58
  issue_detected: bool
59
59
  detections_count: int
60
60
  relevant_detections_count: int
61
+ verdict: Optional[str] = None
61
62
 
62
63
 
63
64
  @dataclass
@@ -76,6 +76,7 @@ class ZippedFileScanResult(Schema):
76
76
  report_url: Optional[str] = None,
77
77
  scan_id: Optional[str] = None,
78
78
  err: Optional[str] = None,
79
+ verdict: Optional[str] = None,
79
80
  ) -> None:
80
81
  super().__init__()
81
82
  self.did_detect = did_detect
@@ -83,6 +84,7 @@ class ZippedFileScanResult(Schema):
83
84
  self.scan_id = scan_id
84
85
  self.report_url = report_url
85
86
  self.err = err
87
+ self.verdict = verdict
86
88
 
87
89
 
88
90
  class ScanResult(Schema):
@@ -506,6 +508,7 @@ class DetectionRuleSchema(Schema):
506
508
  class ScanResultsSyncFlow:
507
509
  id: str
508
510
  detection_messages: list[dict]
511
+ verdict: Optional[str] = None
509
512
 
510
513
 
511
514
  class ScanResultsSyncFlowSchema(Schema):
@@ -514,6 +517,7 @@ class ScanResultsSyncFlowSchema(Schema):
514
517
 
515
518
  id = fields.String()
516
519
  detection_messages = fields.List(fields.Dict())
520
+ verdict = fields.String(allow_none=True, load_default=None)
517
521
 
518
522
  @post_load
519
523
  def build_dto(self, data: dict[str, Any], **_) -> ScanResultsSyncFlow:
@@ -21,7 +21,7 @@ classifiers = [
21
21
  "Programming Language :: Python :: 3.14",
22
22
  ]
23
23
  dynamic = ["dependencies"]
24
- version = "3.24.1.dev3"
24
+ version = "3.24.2.dev1"
25
25
 
26
26
  [project.scripts]
27
27
  cycode = "cycode.cli.app:app"
File without changes
File without changes