conduct-cli 0.4.46__tar.gz → 0.4.48__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conduct-cli
3
- Version: 0.4.46
3
+ Version: 0.4.48
4
4
  Summary: CLI for Conduct AI — 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.4.46"
7
+ version = "0.4.48"
8
8
  description = "CLI for Conduct AI — install agents, manage projects, run tests"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -107,7 +107,7 @@ def _fetch_budget_status():
107
107
  return False, None
108
108
 
109
109
 
110
- def _check_policy(tool_name, tool_input):
110
+ def _check_policy(tool_name, tool_input, tokens_before=0):
111
111
  """Return (matched_rule, action, rule_id, message) or (None, 'allow', None, None)."""
112
112
  if not POLICY_PATH.exists():
113
113
  return None, "allow", None, None
@@ -139,6 +139,10 @@ def _check_policy(tool_name, tool_input):
139
139
  continue
140
140
  except re.error:
141
141
  continue
142
+ min_tokens = rule.get("match_tokens_before_gt")
143
+ if min_tokens is not None:
144
+ if tokens_before <= int(min_tokens):
145
+ continue
142
146
  action = rule.get("action", "audit")
143
147
  rule_id = rule.get("rule_id", "unknown")
144
148
  message = rule.get("message") or f"Policy violation: {rule_id}"
@@ -389,6 +393,11 @@ def post_usage_main():
389
393
  elif transcript_path:
390
394
  tokens_input, tokens_output = _read_tokens_from_transcript(transcript_path, tool_use_id)
391
395
  _post_usage(session_id, tool_name, tokens_input, tokens_output, None)
396
+ # Token-threshold policy check (PostToolUse only — tokens not known at PreToolUse)
397
+ _, action, rule_id, message = _check_policy(tool_name, {}, tokens_before=tokens_input)
398
+ if action in ("warn", "block"):
399
+ decision = "warned" if action == "warn" else "blocked"
400
+ _post_event(tool_name, {}, decision, rule_id, message, session_id=session_id)
392
401
 
393
402
  sys.exit(0)
394
403
 
@@ -1891,15 +1891,24 @@ def _render_tui(rows: list[dict]) -> None:
1891
1891
  "paused": "yellow", "pending": "cyan", "cancelled": "dim"}.get(status, "white")
1892
1892
  sicon = {"running": "●", "succeeded": "✓", "failed": "✗",
1893
1893
  "paused": "⏸", "pending": "○", "cancelled": "—"}.get(status, "?")
1894
- # Duration
1895
- created = r.get("created_at") or r.get("started_at") or 0
1896
- ended = r.get("completed_at") or r.get("finished_at") or 0
1897
- if created and ended:
1898
- secs = int(ended - created)
1894
+ # Duration — timestamps may be ISO strings or unix floats
1895
+ import datetime as _dt
1896
+ def _to_ts(val):
1897
+ if not val:
1898
+ return None
1899
+ if isinstance(val, (int, float)):
1900
+ return float(val)
1901
+ try:
1902
+ return _dt.datetime.fromisoformat(str(val).replace("Z", "+00:00")).timestamp()
1903
+ except Exception:
1904
+ return None
1905
+ created_ts = _to_ts(r.get("created_at") or r.get("started_at"))
1906
+ ended_ts = _to_ts(r.get("completed_at") or r.get("finished_at"))
1907
+ if created_ts and ended_ts:
1908
+ secs = int(ended_ts - created_ts)
1899
1909
  dur = f"{secs//60}:{secs%60:02d}"
1900
- elif created and status == "running":
1901
- import datetime as _dt
1902
- secs = int(time.time() - (created if created > 1e10 else created))
1910
+ elif created_ts and status == "running":
1911
+ secs = int(time.time() - created_ts)
1903
1912
  dur = f"{secs//60}:{secs%60:02d}"
1904
1913
  else:
1905
1914
  dur = "—"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conduct-cli
3
- Version: 0.4.46
3
+ Version: 0.4.48
4
4
  Summary: CLI for Conduct AI — install agents, manage projects, run tests
5
5
  Author-email: Conduct AI <hello@conductai.ai>
6
6
  License: MIT
File without changes
File without changes
File without changes