cctally 1.70.0 → 1.72.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.
- package/CHANGELOG.md +21 -0
- package/bin/_cctally_cache.py +430 -8
- package/bin/_cctally_config.py +108 -0
- package/bin/_cctally_core.py +6 -1
- package/bin/_cctally_dashboard.py +106 -11
- package/bin/_cctally_db.py +445 -1
- package/bin/_cctally_parser.py +20 -0
- package/bin/_cctally_quota.py +58 -6
- package/bin/_lib_codex_conversation.py +509 -0
- package/bin/_lib_codex_conversation_query.py +950 -0
- package/bin/_lib_conversation_dispatch.py +547 -0
- package/bin/_lib_conversation_retention.py +344 -0
- package/bin/cctally +1 -0
- package/dashboard/static/assets/index-BWadAHxC.js +80 -0
- package/dashboard/static/assets/index-D2nwo_ln.css +1 -0
- package/dashboard/static/dashboard.html +2 -2
- package/package.json +5 -1
- package/dashboard/static/assets/index-CBbErI-P.js +0 -80
- package/dashboard/static/assets/index-kDDVOLa_.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,26 @@ based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [1.72.0] - 2026-07-17
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Codex conversations (#294 S6): the write-only Codex physical corpus is now readable through a new normalization and assembly kernel layer. Ingest derives normalized message rows, browse rollups, and an independent FTS index inside the existing per-file sync transaction (replayable by cache migration `025_codex_conversation_normalization`, with an explicit `normalization_pending` state for caches whose events predate it), and provider-neutral kernels assemble first-meaningful-prompt titles, digest-exact mirror pairing, canonical items with stable keys, per-turn cost attribution, thread nesting from thread metadata, outline, browse/facets, and FTS5/LIKE search. Transcript retention (#313) now prunes these derived rows — normalized messages, rollups, file touches, and their FTS postings — in the same transaction as the Codex physical events it removes, so a prune leaves no orphaned browse or search state. A thin provider-neutral dispatch maps both Claude and Codex conversations into one envelope family with a source-tagged token union. This is an internal kernel layer with no user-visible surface yet — S7 wires the routes, transcript CLI, export, and live-tail; the Claude conversation kernels are unchanged. (#294)
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- Packaging: `bin/_lib_conversation_retention.py` (the transcript-retention prune engine shipped in 1.71.0) was missing from the npm `files` list and the public mirror allowlist, so an installed `cctally cache-sync --prune-conversations` and the dashboard's background prune would crash at import (and the public test suite could not import it); it now ships in both. (#313)
|
|
15
|
+
- Internal (maintainer-only): the self-hosted reader e2e (`e2e-reader`) CI lane no longer red-builds when a prior hard-failed run leaks its `cctally dashboard` server on the dedicated Playwright port 8797. A pre-flight `dashboard/web/e2e/free-port.sh` now reaps any stale listener before `npx playwright test` — Playwright's `reuseExistingServer: false` probe aborts on an occupied port *before* it launches `e2e/serve.sh`, so the port has to be cleared ahead of the run rather than inside the launcher. No user-facing behavior change.
|
|
16
|
+
|
|
17
|
+
## [1.71.0] - 2026-07-17
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- Transcript retention: the dashboard's background sync thread now runs a throttled (at most once every 24 hours) prune of conversation transcripts older than the new `conversation.retention_days` config key (default 180; set to `off`/`0` to keep transcripts forever), bounding `cache.db`'s otherwise-unbounded growth. Only transcript rows are pruned — cost/usage history and Codex analytics metadata are untouched and everything pruned is re-derivable from the JSONL. Eligibility is decided per conversation from the authoritative message rows (a conversation with any recent activity is kept whole), never a rollup. (#313)
|
|
21
|
+
- `cctally cache-sync --prune-conversations` prunes >retention-day transcripts on demand and reports the rows removed per provider. (#313)
|
|
22
|
+
- `cctally db vacuum [--db {cache,stats,all}]` reclaims the disk space a prune freed (SQLite `VACUUM`); it is never automatic, runs under an exclusive lock so a running dashboard makes it fail promptly rather than race, and refuses when free disk is below ~2x the file size. (#313)
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- Dashboard CPU peg: `cctally dashboard` no longer pegs a CPU core under sustained active use on large caches. The Codex quota-projection reconcile — which ran unconditionally on every dashboard tick and every `codex-*` command, re-loading the entire quota history (~2.9s) — now short-circuits to an O(1) no-op when the Codex physical state is unchanged and the stored projection is intact; `codex-daily` with no fresh Codex data drops from ~3.2s to well under a second. The dashboard sync thread also caps its CPU duty at 50% of one core via a work-proportional cooldown, so a slow rebuild can no longer keep the thread busy back-to-back. (#313)
|
|
26
|
+
- Dashboard: the #294 S5 source selector no longer causes the mobile topbar to scroll sideways on the narrowest phones. The active-source status chip sits in the non-shrinkable action cluster, and adding it pushed that cluster past a 320px-wide viewport; it now hides at ≤360px (freshness is still on the global sync chip and a degraded source stays flagged in the selector and panels), and both the source selector and its status chip drop out of the condensed one-row header once you scroll, matching how the workspace switcher and doctor chip already collapse there. (#294)
|
|
27
|
+
|
|
8
28
|
## [1.70.0] - 2026-07-17
|
|
9
29
|
|
|
10
30
|
### Added
|
|
@@ -35,6 +55,7 @@ based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
35
55
|
## [1.69.0] - 2026-07-17
|
|
36
56
|
|
|
37
57
|
### Added
|
|
58
|
+
- Dashboard source selector and source-aware UX (#294 S5): a Header Claude/Codex/All radiogroup (cycle with `v`) drives every panel, modal, alert filter, and share default at once, rendering each provider's native vocabulary (Codex token counters and quota windows, no `$ / 1%` or subscription-week copy) and hiding — never zero-filling — panels a source doesn't publish, with a Help-overlay note pointing at where the equivalent lives (Codex forecast/trend → the quota panel, cache-report → the hero counters). Alerts and toasts read the per-source projections (a Codex budget alert can't double-toast), the alert settings regroup into global-notifier / Claude / Codex controls with a CLI pointer for Codex quota rules, a per-source status chip surfaces freshness and degraded warnings, and every share render, composer section, preset, and history row carries and displays the source it was captured under — a mid-flow selector switch never restamps an open share flow, and `all` composes provider-labelled sections rather than a blended snapshot. The Claude-only user's data and flows are unchanged except that new share artifacts and history now say "Claude".
|
|
38
59
|
- Dashboard source-aware backend read model (#294 S4): `/api/data` now appends
|
|
39
60
|
immutable Claude, Codex, and labelled all-source states; provider-owned
|
|
40
61
|
session/project/quota details use opaque qualified routes backed by bounded
|