cctally 1.64.0 → 1.66.0

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. package/CHANGELOG.md +50 -0
  2. package/bin/_cctally_alerts.py +1 -1
  3. package/bin/_cctally_cache.py +262 -40
  4. package/bin/_cctally_cache_report.py +7 -5
  5. package/bin/_cctally_core.py +49 -14
  6. package/bin/_cctally_dashboard.py +827 -4911
  7. package/bin/_cctally_dashboard_cache_report.py +714 -0
  8. package/bin/_cctally_dashboard_conversation.py +771 -0
  9. package/bin/_cctally_dashboard_envelope.py +1520 -0
  10. package/bin/_cctally_dashboard_share.py +2012 -0
  11. package/bin/_cctally_db.py +127 -5
  12. package/bin/_cctally_doctor.py +104 -3
  13. package/bin/_cctally_five_hour.py +2 -1
  14. package/bin/_cctally_forecast.py +78 -135
  15. package/bin/_cctally_parser.py +919 -784
  16. package/bin/_cctally_percent_breakdown.py +1 -1
  17. package/bin/_cctally_pricing_check.py +39 -0
  18. package/bin/_cctally_project.py +8 -5
  19. package/bin/_cctally_record.py +279 -274
  20. package/bin/_cctally_reporting.py +1 -1
  21. package/bin/_cctally_sync_week.py +1 -1
  22. package/bin/_cctally_telemetry.py +3 -5
  23. package/bin/_cctally_tui.py +487 -254
  24. package/bin/_cctally_update.py +5 -0
  25. package/bin/_lib_alert_dispatch.py +1 -1
  26. package/bin/_lib_blocks.py +6 -1
  27. package/bin/_lib_conversation_query.py +349 -36
  28. package/bin/_lib_credit.py +133 -0
  29. package/bin/_lib_doctor.py +150 -1
  30. package/bin/_lib_five_hour.py +34 -0
  31. package/bin/_lib_forecast.py +144 -0
  32. package/bin/_lib_json_envelope.py +38 -0
  33. package/bin/_lib_jsonl.py +115 -73
  34. package/bin/_lib_log.py +96 -0
  35. package/bin/_lib_perf.py +180 -0
  36. package/bin/_lib_pricing.py +47 -1
  37. package/bin/_lib_pricing_check.py +25 -3
  38. package/bin/_lib_record.py +179 -0
  39. package/bin/_lib_render.py +18 -10
  40. package/bin/_lib_snapshot_cache.py +61 -0
  41. package/bin/_lib_transcript_access.py +23 -0
  42. package/bin/cctally +51 -7
  43. package/bin/cctally-dashboard +2 -2
  44. package/bin/cctally-statusline +1 -0
  45. package/bin/cctally-tui +2 -2
  46. package/dashboard/static/assets/index-CJTUCpKt.js +80 -0
  47. package/dashboard/static/assets/index-DQWNrIqu.css +1 -0
  48. package/dashboard/static/dashboard.html +2 -2
  49. package/package.json +11 -1
  50. package/dashboard/static/assets/index-0jzYm75p.css +0 -1
  51. package/dashboard/static/assets/index-D_Ylyqsf.js +0 -80
@@ -2015,6 +2015,11 @@ class _DashboardUpdateCheckThread(threading.Thread):
2015
2015
  envelope_precompute=(
2016
2016
  c._cctally_tui._tui_precompute_envelope_config(load_config())
2017
2017
  ),
2018
+ # #278 §1.4.1: a version-banner refresh republishes complete data;
2019
+ # force the hydration latch clear so a republish that happens to
2020
+ # carry a prior hydrating seed/partial doesn't freeze the client's
2021
+ # loading skeletons.
2022
+ hydrating=False,
2018
2023
  )
2019
2024
  self._ref.set(fresh)
2020
2025
  self._hub.publish(fresh)
@@ -18,7 +18,6 @@ Spec: docs/superpowers/specs/2026-06-02-alerts-dispatch-severity-seams-design.md
18
18
  """
19
19
  from __future__ import annotations
20
20
 
21
- import importlib.util as _ilu
22
21
  import pathlib
23
22
  import sys
24
23
 
@@ -36,6 +35,7 @@ def _load_lib(name: str):
36
35
  cached = sys.modules.get(name)
37
36
  if cached is not None:
38
37
  return cached
38
+ import importlib.util as _ilu
39
39
  p = pathlib.Path(__file__).resolve().parent / f"{name}.py"
40
40
  spec = _ilu.spec_from_file_location(name, p)
41
41
  mod = _ilu.module_from_spec(spec)
@@ -61,6 +61,11 @@ UsageEntry = _lib_jsonl.UsageEntry
61
61
  _lib_pricing = _load_lib("_lib_pricing")
62
62
  _calculate_entry_cost = _lib_pricing._calculate_entry_cost
63
63
 
64
+ # JSON wire-format kernel — the additive camelCase schemaVersion stamp
65
+ # (#279 S6 W1; convention docs/cli-contract.md).
66
+ _lib_json_envelope = _load_lib("_lib_json_envelope")
67
+ stamp_schema_version = _lib_json_envelope.stamp_schema_version
68
+
64
69
 
65
70
  @dataclass
66
71
  class Block:
@@ -526,4 +531,4 @@ def _blocks_to_json(
526
531
  }
527
532
  result.append(obj)
528
533
 
529
- return json.dumps({"blocks": result}, indent=2)
534
+ return json.dumps(stamp_schema_version({"blocks": result}), indent=2)