conduct-cli 0.8.5__tar.gz → 0.8.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 (51) hide show
  1. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/PKG-INFO +1 -1
  2. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/pyproject.toml +1 -1
  3. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/api.py +13 -3
  4. conduct_cli-0.8.7/src/conduct_cli/guard_policy.md +16 -0
  5. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/PKG-INFO +1 -1
  6. conduct_cli-0.8.5/src/conduct_cli/guard_policy.md +0 -16
  7. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/README.md +0 -0
  8. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/setup.cfg +0 -0
  9. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/setup.py +0 -0
  10. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/__init__.py +0 -0
  11. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/guard.py +0 -0
  12. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/guardmcp.py +0 -0
  13. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/__init__.py +0 -0
  14. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/base.py +0 -0
  15. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/posttooluse.py +0 -0
  16. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/precompact.py +0 -0
  17. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/pretooluse.py +0 -0
  18. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/session_parser.py +0 -0
  19. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/session_report_push.py +0 -0
  20. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/session_start.py +0 -0
  21. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/hooks/stop.py +0 -0
  22. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/log_util.py +0 -0
  23. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/main.py +0 -0
  24. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/mcp_server.py +0 -0
  25. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/memory.py +0 -0
  26. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/paxel.py +0 -0
  27. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli/tool_groups.py +0 -0
  28. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/SOURCES.txt +0 -0
  29. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/dependency_links.txt +0 -0
  30. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/entry_points.txt +0 -0
  31. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/requires.txt +0 -0
  32. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/src/conduct_cli.egg-info/top_level.txt +0 -0
  33. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_advisory_and_hook.py +0 -0
  34. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_api_client.py +0 -0
  35. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_bash_operator_signature.py +0 -0
  36. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_blast_radius.py +0 -0
  37. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_cmd_run.py +0 -0
  38. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_command_word_matcher.py +0 -0
  39. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_drain_daemon_health.py +0 -0
  40. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_guard_policy.py +0 -0
  41. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_guard_savings.py +0 -0
  42. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_hook_dispatch.py +0 -0
  43. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_instruction_files.py +0 -0
  44. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_journal_drain.py +0 -0
  45. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_log_util.py +0 -0
  46. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_proxy_coverage.py +0 -0
  47. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_proxy_env.py +0 -0
  48. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_report_tool_coverage.py +0 -0
  49. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_signed_policy.py +0 -0
  50. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_switch.py +0 -0
  51. {conduct_cli-0.8.5 → conduct_cli-0.8.7}/tests/test_token_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conduct-cli
3
- Version: 0.8.5
3
+ Version: 0.8.7
4
4
  Summary: CLI for Conduct AI — secure, govern, install agents, manage projects, run tests
5
5
  Author-email: Conduct AI <hello@conductai.ai>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "conduct-cli"
7
- version = "0.8.5"
7
+ version = "0.8.7"
8
8
  description = "CLI for Conduct AI — secure, govern, install agents, manage projects, run tests"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -69,17 +69,27 @@ def req_text(method: str, url: str, hdrs: dict, body_text: str, timeout: int = 3
69
69
 
70
70
 
71
71
  def stream(url: str, hdrs=None):
72
- """Yield parsed SSE data dicts."""
72
+ """Yield parsed SSE data dicts.
73
+
74
+ Uses a socket read timeout to detect stalled streams. Server sends
75
+ ': keepalive' pings every 15s, so a 60s timeout is safe.
76
+ """
73
77
  r = urllib.request.Request(url, headers=hdrs or {})
74
78
  try:
75
- resp = urllib.request.urlopen(r)
79
+ resp = urllib.request.urlopen(r, timeout=60)
76
80
  except urllib.error.HTTPError as e:
77
81
  msg = e.read().decode()
78
82
  raise RuntimeError(f"Stream {e.code}: {msg}")
79
83
 
80
84
  buf = b""
81
85
  while True:
82
- chunk = resp.read(1)
86
+ try:
87
+ chunk = resp.read(1)
88
+ except socket.timeout:
89
+ raise RuntimeError(
90
+ "Stream stalled (no data for 60s). The run may still be executing on the server — "
91
+ "check `conduct runs list` or the UI."
92
+ )
83
93
  if not chunk:
84
94
  break
85
95
  buf += chunk
@@ -0,0 +1,16 @@
1
+ At the start of every conversation:
2
+ - Call `guard_activity` ONCE with a one-line summary of what the user is asking.
3
+
4
+ Then, for the request itself:
5
+ - Call `guard_check` ONCE per intent — not per file, per command, or per edit.
6
+ - Re-check only when scope changes (reads → writes, local → network, or a new task).
7
+ - If BLOCKED: stop and explain the policy rule to the user.
8
+ - If WARNING: proceed but surface the warning inline.
9
+ - If the response is `ok` or empty: proceed silently. Do NOT narrate it in the chat.
10
+
11
+ Example:
12
+ 1. User asks to fix a bug → call `guard_activity` once with the summary.
13
+ 2. Before starting the code changes → call `guard_check` once with the intent (e.g. `write_file`, `bash`).
14
+ 3. Do NOT re-check for every subsequent read or edit in the same task.
15
+
16
+ Never write secrets to files or output. Never send PII to external endpoints.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conduct-cli
3
- Version: 0.8.5
3
+ Version: 0.8.7
4
4
  Summary: CLI for Conduct AI — secure, govern, install agents, manage projects, run tests
5
5
  Author-email: Conduct AI <hello@conductai.ai>
6
6
  License: MIT
@@ -1,16 +0,0 @@
1
- At the start of every conversation:
2
- - Call `guard_activity` once with a one-line summary of the user's request.
3
-
4
- Before every shell command, file write, network request, API call, or code change:
5
- - Call `guard_check` with the proposed action and parameters.
6
- - If BLOCKED: stop and explain the policy rule.
7
- - If WARNING: proceed and surface the warning.
8
- - If ALLOWED: proceed normally.
9
-
10
- Example:
11
- 1. User asks to fix a bug → call `guard_activity` once.
12
- 2. Before reading files or running tests → call `guard_check`.
13
- 3. Before editing code → call `guard_check` again.
14
-
15
- Never write secrets to files or output.
16
- Never send PII to external endpoints.
File without changes
File without changes
File without changes