controlzero 1.13.6__tar.gz → 1.13.7__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 (309) hide show
  1. {controlzero-1.13.6 → controlzero-1.13.7}/PKG-INFO +2 -1
  2. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/__init__.py +1 -1
  3. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/audit_remote.py +5 -0
  4. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/main.py +118 -0
  5. controlzero-1.13.7/controlzero/cli/setup_wizard.py +481 -0
  6. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/spool_cmd.py +2 -0
  7. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/client.py +4 -3
  8. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/enrollment.py +8 -1
  9. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/grant_protocol.py +3 -2
  10. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hosted_policy.py +93 -2
  11. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_keyring.py +65 -5
  12. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/tamper.py +2 -0
  13. {controlzero-1.13.6 → controlzero-1.13.7}/pyproject.toml +6 -1
  14. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_keychain_dek.py +142 -7
  15. controlzero-1.13.7/tests/test_api_url_config.py +72 -0
  16. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_5d_email_install.py +1 -1
  17. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_request_approval.py +1 -1
  18. controlzero-1.13.7/tests/test_install_api_url.py +69 -0
  19. controlzero-1.13.7/tests/test_setup_wizard.py +196 -0
  20. controlzero-1.13.7/tests/test_tls_ca_bundle.py +112 -0
  21. {controlzero-1.13.6 → controlzero-1.13.7}/.gitignore +0 -0
  22. {controlzero-1.13.6 → controlzero-1.13.7}/CHANGELOG.md +0 -0
  23. {controlzero-1.13.6 → controlzero-1.13.7}/Dockerfile.test +0 -0
  24. {controlzero-1.13.6 → controlzero-1.13.7}/LICENSE +0 -0
  25. {controlzero-1.13.6 → controlzero-1.13.7}/README.md +0 -0
  26. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/__main__.py +0 -0
  27. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/__init__.py +0 -0
  28. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/_messages.py +0 -0
  29. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/action_aliases.py +0 -0
  30. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/action_validator.py +0 -0
  31. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/bundle.py +0 -0
  32. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/condition_ops.py +0 -0
  33. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credential_hook.py +0 -0
  34. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credential_scanner.py +0 -0
  35. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credentials_data/__init__.py +0 -0
  36. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/credentials_data/built_in.yaml +0 -0
  37. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/dlp_scanner.py +0 -0
  38. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/enforcer.py +0 -0
  39. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/hook_extractors.py +0 -0
  40. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/io_capture_producer.py +0 -0
  41. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/source_labels.py +0 -0
  42. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/tool_extractors.json +0 -0
  43. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/_internal/types.py +0 -0
  44. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/audit_local.py +0 -0
  45. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/canonical.py +0 -0
  46. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/__init__.py +0 -0
  47. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/__main__.py +0 -0
  48. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/_secrets.py +0 -0
  49. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/agent_config.py +0 -0
  50. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/console.py +0 -0
  51. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/debug_bundle.py +0 -0
  52. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/doctor.py +0 -0
  53. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/enforcement.py +0 -0
  54. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/exec_cmd.py +0 -0
  55. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hook_entry.py +0 -0
  56. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/__init__.py +0 -0
  57. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/antigravity.py +0 -0
  58. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/base.py +0 -0
  59. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/claude_code.py +0 -0
  60. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/codex_cli.py +0 -0
  61. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/cursor.py +0 -0
  62. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/cursor_cli.py +0 -0
  63. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/gemini_cli.py +0 -0
  64. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/kiro.py +0 -0
  65. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/hosts/unknown.py +0 -0
  66. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/kiro_adapter.py +0 -0
  67. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/migrate.py +0 -0
  68. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/output.py +0 -0
  69. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/telemetry_consent.py +0 -0
  70. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/antigravity/hooks.json +0 -0
  71. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/antigravity.yaml +0 -0
  72. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/autogen.yaml +0 -0
  73. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/claude-code.yaml +0 -0
  74. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/codex-cli.yaml +0 -0
  75. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/cost-cap.yaml +0 -0
  76. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/crewai.yaml +0 -0
  77. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/cursor.yaml +0 -0
  78. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/gemini-cli.yaml +0 -0
  79. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/generic.yaml +0 -0
  80. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-file-save.kiro.hook +0 -0
  81. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-pre-tool-use.kiro.hook +0 -0
  82. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/ide-prompt-submit.kiro.hook +0 -0
  83. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/kiro/kiro.yaml +0 -0
  84. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/langchain.yaml +0 -0
  85. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/mcp.yaml +0 -0
  86. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/templates/rag.yaml +0 -0
  87. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/cli/update_cmd.py +0 -0
  88. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/device.py +0 -0
  89. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/error_codes.py +0 -0
  90. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/error_codes.yaml +0 -0
  91. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/errors.py +0 -0
  92. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/__init__.py +0 -0
  93. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/mock.py +0 -0
  94. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/pending_approval.py +0 -0
  95. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/secret_leak_guard.py +0 -0
  96. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hitl/status.py +0 -0
  97. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hook_integrity.py +0 -0
  98. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hooks/__init__.py +0 -0
  99. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/hooks/tool_output_handler.py +0 -0
  100. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/__init__.py +0 -0
  101. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/anthropic.py +0 -0
  102. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/autogen.py +0 -0
  103. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/braintrust.py +0 -0
  104. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/__init__.py +0 -0
  105. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/agent.py +0 -0
  106. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/crew.py +0 -0
  107. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/task.py +0 -0
  108. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/crewai/tool.py +0 -0
  109. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google.py +0 -0
  110. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/__init__.py +0 -0
  111. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/agent.py +0 -0
  112. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/google_adk/tool.py +0 -0
  113. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/__init__.py +0 -0
  114. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/agent.py +0 -0
  115. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/callbacks.py +0 -0
  116. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/chain.py +0 -0
  117. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/graph.py +0 -0
  118. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/modern.py +0 -0
  119. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langchain/tool.py +0 -0
  120. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/langfuse.py +0 -0
  121. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/litellm.py +0 -0
  122. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/openai.py +0 -0
  123. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/pydantic_ai.py +0 -0
  124. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/integrations/vercel_ai.py +0 -0
  125. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/layout_migration.py +0 -0
  126. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/policy_loader.py +0 -0
  127. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/__init__.py +0 -0
  128. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/reference.py +0 -0
  129. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/resolver.py +0 -0
  130. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/secrets/secretstr.py +0 -0
  131. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/__init__.py +0 -0
  132. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_compress.py +0 -0
  133. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_constants.py +0 -0
  134. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_crc32c.py +0 -0
  135. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_crypto.py +0 -0
  136. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_frame.py +0 -0
  137. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_metrics.py +0 -0
  138. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_spool.py +0 -0
  139. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_state.py +0 -0
  140. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/_uploader.py +0 -0
  141. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/spool/cz-audit-v1.dict +0 -0
  142. {controlzero-1.13.6 → controlzero-1.13.7}/controlzero/tracecontext.py +0 -0
  143. {controlzero-1.13.6 → controlzero-1.13.7}/examples/hello_world.py +0 -0
  144. {controlzero-1.13.6 → controlzero-1.13.7}/tests/_fixtures/antigravity-envelope-expected.json +0 -0
  145. {controlzero-1.13.6 → controlzero-1.13.7}/tests/_fixtures/jcs_args_hash_vectors.json +0 -0
  146. {controlzero-1.13.6 → controlzero-1.13.7}/tests/conftest.py +0 -0
  147. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/antigravity.json +0 -0
  148. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/claude_code.json +0 -0
  149. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/codex_cli.json +0 -0
  150. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/cursor.json +0 -0
  151. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/gemini_cli.json +0 -0
  152. {controlzero-1.13.6 → controlzero-1.13.7}/tests/fixtures/adapter-contracts/kiro.json +0 -0
  153. {controlzero-1.13.6 → controlzero-1.13.7}/tests/integrations/__init__.py +0 -0
  154. {controlzero-1.13.6 → controlzero-1.13.7}/tests/integrations/test_google.py +0 -0
  155. {controlzero-1.13.6 → controlzero-1.13.7}/tests/parity/action_aliases.json +0 -0
  156. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/__init__.py +0 -0
  157. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/conftest.py +0 -0
  158. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_cli.py +0 -0
  159. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_concurrency.py +0 -0
  160. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_conformance.py +0 -0
  161. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_core.py +0 -0
  162. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_crash.py +0 -0
  163. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_diskfull.py +0 -0
  164. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_durable_default_tamper.py +0 -0
  165. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_sink_wiring.py +0 -0
  166. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_transcript_localack.py +0 -0
  167. {controlzero-1.13.6 → controlzero-1.13.7}/tests/spool/test_spool_uploader.py +0 -0
  168. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_aliases.py +0 -0
  169. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_canonicalization.py +0 -0
  170. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_action_validator_t86.py +0 -0
  171. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_adapter_contracts.py +0 -0
  172. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_adapter_interface.py +0 -0
  173. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_agent_name_env.py +0 -0
  174. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_agy_docs_no_exit2_1373.py +0 -0
  175. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_adapter.py +0 -0
  176. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_envelope_parity.py +0 -0
  177. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_ga_blockers_1248.py +0 -0
  178. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_hook_check.py +0 -0
  179. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_install.py +0 -0
  180. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_posttooluse_observe_58.py +0 -0
  181. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_antigravity_tool_vocab_1303.py +0 -0
  182. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_api_key_mask.py +0 -0
  183. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_project_id_attribution_pr2.py +0 -0
  184. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote.py +0 -0
  185. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote_io_capture.py +0 -0
  186. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_remote_sdk_version.py +0 -0
  187. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_audit_sink_isolation.py +0 -0
  188. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_cache_freshness_1303.py +0 -0
  189. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_parser.py +0 -0
  190. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_bundle_translate.py +0 -0
  191. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_canonical_phase1a.py +0 -0
  192. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_capability_matrix_doc.py +0 -0
  193. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_carve_out.py +0 -0
  194. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_debug_bundle.py +0 -0
  195. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_extractor_integration.py +0 -0
  196. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hook.py +0 -0
  197. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hook_entry.py +0 -0
  198. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_hosted_refresh.py +0 -0
  199. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_init.py +0 -0
  200. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_init_templates.py +0 -0
  201. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_tail.py +0 -0
  202. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_test.py +0 -0
  203. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cli_validate.py +0 -0
  204. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_coding_agent_hooks.py +0 -0
  205. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_condition_operators_1495.py +0 -0
  206. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_conditions.py +0 -0
  207. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_config_format_parity_1303.py +0 -0
  208. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_conformance.py +0 -0
  209. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_console.py +0 -0
  210. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_credential_hook.py +0 -0
  211. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cross_adapter_shell_enforcement.py +0 -0
  212. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_cursor_adapter.py +0 -0
  213. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_default_action.py +0 -0
  214. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_deny_rule_reconciliation_1011.py +0 -0
  215. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_deny_wins_default_catchall_1620.py +0 -0
  216. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_device.py +0 -0
  217. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_dlp_mask.py +0 -0
  218. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_dlp_scanner.py +0 -0
  219. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_doctor.py +0 -0
  220. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_engine_version_consistency.py +0 -0
  221. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_enrollment.py +0 -0
  222. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_env_dump_438.py +0 -0
  223. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_epic_1247_bryan_acceptance.py +0 -0
  224. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_error_codes.py +0 -0
  225. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_errors_e_codes.py +0 -0
  226. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_fail_closed_eval.py +0 -0
  227. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_failopen_1303.py +0 -0
  228. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_glob_matching.py +0 -0
  229. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_cli_flag.py +0 -0
  230. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_exceptions.py +0 -0
  231. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_get_secret_hitl.py +0 -0
  232. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_mock_backend.py +0 -0
  233. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_pending_approval.py +0 -0
  234. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_secret_leak_guard.py +0 -0
  235. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_6a_wait.py +0 -0
  236. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_conformance.py +0 -0
  237. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_phase2b_protocol.py +0 -0
  238. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_reason_codes.py +0 -0
  239. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hitl_validator_keys.py +0 -0
  240. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_command_pinning_1705.py +0 -0
  241. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_extractors.py +0 -0
  242. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_integrity.py +0 -0
  243. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hook_mask_failclosed.py +0 -0
  244. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_local_audit_1247.py +0 -0
  245. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_local_shadow_warn_1265.py +0 -0
  246. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosted_policy_e2e.py +0 -0
  247. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hosts_adapter.py +0 -0
  248. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hybrid_mode_strict.py +0 -0
  249. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_hybrid_mode_warn.py +0 -0
  250. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_install_hook_command.py +0 -0
  251. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_install_hooks.py +0 -0
  252. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_io_capture_producer.py +0 -0
  253. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_adapter.py +0 -0
  254. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_e2e.py +0 -0
  255. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_hook_pin_1265.py +0 -0
  256. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_cli_v210_hooks.py +0 -0
  257. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_hook_templates.py +0 -0
  258. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_install.py +0 -0
  259. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_kiro_install_standardisation.py +0 -0
  260. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_layout_migration_t101.py +0 -0
  261. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_layout_parity_t102.py +0 -0
  262. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_dict.py +0 -0
  263. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_file_json.py +0 -0
  264. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_local_mode_file_yaml.py +0 -0
  265. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_localized_reason.py +0 -0
  266. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_fallback_stderr.py +0 -0
  267. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_options_ignored_hosted.py +0 -0
  268. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_log_rotation.py +0 -0
  269. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_migrate.py +0 -0
  270. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_min_sdk_version_gate.py +0 -0
  271. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_multi_client_per_project_175.py +0 -0
  272. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_no_policy_no_key.py +0 -0
  273. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_observe_mode_1247.py +0 -0
  274. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_package_rename_shim.py +0 -0
  275. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_part3_active_policy_count_1303.py +0 -0
  276. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_per_client_isolation_1011.py +0 -0
  277. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_engine_version_phase1b.py +0 -0
  278. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_freshness.py +0 -0
  279. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_load_failclosed_f3.py +0 -0
  280. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_settings.py +0 -0
  281. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_policy_source_audit.py +0 -0
  282. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_install_messaging.py +0 -0
  283. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_output.py +0 -0
  284. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_pr4_status.py +0 -0
  285. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_probe_audit_isolation.py +0 -0
  286. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_quarantine.py +0 -0
  287. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_reason_code.py +0 -0
  288. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_refresh.py +0 -0
  289. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_secrets.py +0 -0
  290. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_secrets_reference_resolver.py +0 -0
  291. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_shell_semantic_class.py +0 -0
  292. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_source_labels.py +0 -0
  293. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_sql_semantic_class.py +0 -0
  294. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_synthetic_policy_id_t79.py +0 -0
  295. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t103_precedence.py +0 -0
  296. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t104_cache_gc.py +0 -0
  297. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t108_local_override_audit.py +0 -0
  298. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t96_single_audit_log.py +0 -0
  299. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_t99_install_prefetch_bundle.py +0 -0
  300. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper.py +0 -0
  301. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper_behavior.py +0 -0
  302. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tamper_hook.py +0 -0
  303. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_telemetry_consent.py +0 -0
  304. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_tracecontext.py +0 -0
  305. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_unsafe_int_boundary.py +0 -0
  306. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_update_cmd.py +0 -0
  307. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_upgrade_nudge.py +0 -0
  308. {controlzero-1.13.6 → controlzero-1.13.7}/tests/test_version_aware_fail_closed.py +0 -0
  309. {controlzero-1.13.6 → controlzero-1.13.7}/tools/cz-kiro-adapter +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: controlzero
3
- Version: 1.13.6
3
+ Version: 1.13.7
4
4
  Summary: AI agent governance: policies, audit, and observability for tool calls. Works locally with no signup.
5
5
  Project-URL: Homepage, https://controlzero.ai
6
6
  Project-URL: Documentation, https://docs.controlzero.ai
@@ -28,6 +28,7 @@ Requires-Dist: httpx>=0.25.0
28
28
  Requires-Dist: loguru>=0.7.0
29
29
  Requires-Dist: pydantic>=2.0.0
30
30
  Requires-Dist: pyyaml>=6.0
31
+ Requires-Dist: questionary<3,>=2.0.0
31
32
  Requires-Dist: rfc8785<0.2,>=0.1.4
32
33
  Requires-Dist: rich>=13.0.0
33
34
  Requires-Dist: zstandard>=0.23.0
@@ -41,7 +41,7 @@ from controlzero.hitl.grant_protocol import (
41
41
  from controlzero.policy_loader import load_policy
42
42
  from controlzero.secrets import SecretRef, SecretStr, secret_ref
43
43
 
44
- __version__ = "1.13.6"
44
+ __version__ = "1.13.7"
45
45
 
46
46
  __all__ = [
47
47
  "Client",
@@ -18,6 +18,7 @@ Design constraints:
18
18
  """
19
19
 
20
20
  from __future__ import annotations
21
+ from .hosted_policy import tls_verify
21
22
 
22
23
  import getpass
23
24
  import json
@@ -968,6 +969,7 @@ class RemoteAuditSink(_SpoolWiringMixin):
968
969
  content=body,
969
970
  headers=headers,
970
971
  timeout=FLUSH_TIMEOUT_S,
972
+ verify=tls_verify(),
971
973
  )
972
974
  if resp.status_code == 401:
973
975
  raise _AuthExpiredError("server returned 401")
@@ -1034,6 +1036,7 @@ class RemoteAuditSink(_SpoolWiringMixin):
1034
1036
  content=body,
1035
1037
  headers=headers,
1036
1038
  timeout=FLUSH_TIMEOUT_S,
1039
+ verify=tls_verify(),
1037
1040
  )
1038
1041
  return post
1039
1042
 
@@ -1192,6 +1195,7 @@ class BearerAuditSink(_SpoolWiringMixin):
1192
1195
  content=body,
1193
1196
  headers=headers,
1194
1197
  timeout=FLUSH_TIMEOUT_S,
1198
+ verify=tls_verify(),
1195
1199
  )
1196
1200
  if resp.status_code == 401:
1197
1201
  raise _AuthExpiredError("server returned 401")
@@ -1244,6 +1248,7 @@ class BearerAuditSink(_SpoolWiringMixin):
1244
1248
  content=body,
1245
1249
  headers=headers,
1246
1250
  timeout=FLUSH_TIMEOUT_S,
1251
+ verify=tls_verify(),
1247
1252
  )
1248
1253
  return post
1249
1254
 
@@ -270,6 +270,43 @@ def init(template: str, out: str, force: bool):
270
270
  click.echo(f" 4. Use it in code: Client(policy_file='{out_path}')")
271
271
 
272
272
 
273
+ @cli.command("setup", hidden=True)
274
+ @click.option("--api-url", default=None,
275
+ help="Self-hosted / air-gap backend URL or host (e.g. https://cz.internal). "
276
+ "Presence selects self-hosted mode; persisted to config.yaml.")
277
+ @click.option("--api-key", default=None,
278
+ help="Control Zero API key (cz_live_/cz_test_). Env: CONTROLZERO_API_KEY.")
279
+ @click.option("--agent", "agents", multiple=True,
280
+ help="Coding agent to wire (repeatable): claude-code, codex-cli, gemini-cli, "
281
+ "kiro, cursor, antigravity. Env: CONTROLZERO_SETUP_AGENTS (comma list).")
282
+ @click.option("--tls-ca-bundle", default=None,
283
+ help="CA bundle path for a self-signed air-gap endpoint. Persisted to config.")
284
+ @click.option("--email", default=None, help="Your work email (Approvals attribution).")
285
+ @click.option("--yes", "assume_yes", is_flag=True,
286
+ help="Non-interactive: resolve from flags/env, never prompt.")
287
+ @click.pass_context
288
+ def setup(ctx, api_url, api_key, agents, tls_ca_bundle, email, assume_yes):
289
+ """Guided onboarding: pick SaaS vs self-hosted, validate, wire agent hooks.
290
+
291
+ Interactive in a TTY; degrades to flags/env (exit 2 on missing input) in
292
+ CI/non-TTY. Hidden/beta -- existing install commands are unchanged.
293
+ """
294
+ from controlzero.cli.setup_wizard import Flags, run_setup
295
+
296
+ code = run_setup(
297
+ ctx,
298
+ Flags(
299
+ api_url=api_url,
300
+ api_key=api_key,
301
+ agents=tuple(agents),
302
+ tls_ca_bundle=tls_ca_bundle,
303
+ email=email,
304
+ assume_yes=assume_yes,
305
+ ),
306
+ )
307
+ sys.exit(code)
308
+
309
+
273
310
  @cli.command()
274
311
  @click.argument("policy_file", type=click.Path(exists=True), default="controlzero.yaml")
275
312
  def validate(policy_file: str):
@@ -3608,6 +3645,45 @@ def _print_api_key_status(api_key: Optional[str]) -> None:
3608
3645
  click.echo("Tip: Pass --api-key cz_live_xxx to sync audit logs to the dashboard.")
3609
3646
 
3610
3647
 
3648
+ def _write_api_url_config(api_url: str) -> None:
3649
+ """Persist ``api_url`` to ~/.controlzero/config.yaml (0600). The resolver
3650
+ reads it (env > config > default), so a self-hosted / air-gap endpoint set
3651
+ once at install reaches the agent hook WITHOUT exporting CONTROLZERO_API_URL
3652
+ into every hook subprocess (the historical air-gap footgun). Scheme+host
3653
+ only; the SDK strips a trailing slash and appends request paths itself."""
3654
+ GLOBAL_POLICY_DIR.mkdir(parents=True, exist_ok=True)
3655
+ try:
3656
+ os.chmod(GLOBAL_POLICY_DIR, 0o700)
3657
+ except OSError:
3658
+ pass
3659
+ config_data: dict = {}
3660
+ if GLOBAL_CONFIG_PATH.exists():
3661
+ try:
3662
+ existing = yaml.safe_load(GLOBAL_CONFIG_PATH.read_text(encoding="utf-8"))
3663
+ if isinstance(existing, dict):
3664
+ config_data = existing
3665
+ except Exception: # noqa: BLE001
3666
+ pass
3667
+ config_data["api_url"] = api_url.rstrip("/")
3668
+ GLOBAL_CONFIG_PATH.write_text(
3669
+ yaml.safe_dump(config_data, default_flow_style=False),
3670
+ encoding="utf-8",
3671
+ )
3672
+ try:
3673
+ os.chmod(GLOBAL_CONFIG_PATH, 0o600)
3674
+ except OSError:
3675
+ pass
3676
+
3677
+
3678
+ def _api_url_install_callback(ctx, param, value):
3679
+ """click callback for the shared --api-url install option. Persists the URL
3680
+ at install time; expose_value=False keeps it off the command signature so no
3681
+ install function needs an api_url parameter."""
3682
+ if value:
3683
+ _write_api_url_config(value)
3684
+ return value
3685
+
3686
+
3611
3687
  def _bind_api_key_for_install(
3612
3688
  api_key: str,
3613
3689
  product: str,
@@ -3683,6 +3759,13 @@ def install():
3683
3759
  default=None,
3684
3760
  help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team. Stored at ~/.controlzero/config.yaml.",
3685
3761
  )
3762
+ @click.option(
3763
+ "--api-url",
3764
+ default=None,
3765
+ expose_value=False,
3766
+ callback=_api_url_install_callback,
3767
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
3768
+ )
3686
3769
  def install_claude_code(force: bool, merge: bool, settings: Optional[str], api_key: Optional[str], email: Optional[str]):
3687
3770
  """Install controlzero as a Claude Code PreToolUse hook.
3688
3771
 
@@ -3873,6 +3956,13 @@ def install_claude_code(force: bool, merge: bool, settings: Optional[str], api_k
3873
3956
  default=None,
3874
3957
  help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
3875
3958
  )
3959
+ @click.option(
3960
+ "--api-url",
3961
+ default=None,
3962
+ expose_value=False,
3963
+ callback=_api_url_install_callback,
3964
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
3965
+ )
3876
3966
  def install_gemini_cli(force: bool, merge: bool, settings: Optional[str], api_key: Optional[str], email: Optional[str]):
3877
3967
  """Install controlzero as a Gemini CLI pre-tool-call hook.
3878
3968
 
@@ -4085,6 +4175,13 @@ def install_gemini_cli(force: bool, merge: bool, settings: Optional[str], api_ke
4085
4175
  default=None,
4086
4176
  help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
4087
4177
  )
4178
+ @click.option(
4179
+ "--api-url",
4180
+ default=None,
4181
+ expose_value=False,
4182
+ callback=_api_url_install_callback,
4183
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
4184
+ )
4088
4185
  def install_codex_cli(force: bool, merge: bool, config: Optional[str], api_key: Optional[str], email: Optional[str]):
4089
4186
  """Install controlzero as a Codex CLI tool approval hook.
4090
4187
 
@@ -4620,6 +4717,13 @@ def _cursor_enforcement_probe(installed_cmd: str) -> tuple:
4620
4717
  help="Your work email. Required for Approvals so the backend knows who is "
4621
4718
  "at the keyboard when the API key is shared across a team.",
4622
4719
  )
4720
+ @click.option(
4721
+ "--api-url",
4722
+ default=None,
4723
+ expose_value=False,
4724
+ callback=_api_url_install_callback,
4725
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
4726
+ )
4623
4727
  def install_cursor(
4624
4728
  force: bool,
4625
4729
  merge: bool,
@@ -4834,6 +4938,13 @@ def install_cursor(
4834
4938
  default=None,
4835
4939
  help="Your work email. Required for Approvals so the backend knows who's at the keyboard when the API key is shared across a team.",
4836
4940
  )
4941
+ @click.option(
4942
+ "--api-url",
4943
+ default=None,
4944
+ expose_value=False,
4945
+ callback=_api_url_install_callback,
4946
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
4947
+ )
4837
4948
  def install_antigravity(
4838
4949
  force: bool,
4839
4950
  merge: bool,
@@ -6264,6 +6375,13 @@ def _run_kiro_uninstall(
6264
6375
  is_flag=True,
6265
6376
  help="Print what would change without writing anything to disk.",
6266
6377
  )
6378
+ @click.option(
6379
+ "--api-url",
6380
+ default=None,
6381
+ expose_value=False,
6382
+ callback=_api_url_install_callback,
6383
+ help="Base URL of a self-hosted / air-gap Control Zero backend (e.g. https://cz.internal). Persisted to ~/.controlzero/config.yaml so the hook targets it; overrides the SaaS default. env CONTROLZERO_API_URL still wins.",
6384
+ )
6267
6385
  def install_kiro(
6268
6386
  surface: str,
6269
6387
  workspace: Optional[str],