codex-usage-tracking 0.14.0__tar.gz → 0.15.0__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.
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/.codex-plugin/plugin.json +1 -1
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/CHANGELOG.md +11 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/PKG-INFO +27 -6
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/README.md +25 -5
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/adoption-hardening-roadmap.md +1 -1
- codex_usage_tracking-0.15.0/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-call-investigator-preview.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-call-investigator.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-calls-preview.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-calls.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-details.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-diagnostics.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-insights.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/dashboard-threads.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/readme-hero.png +0 -0
- codex_usage_tracking-0.15.0/docs/assets/social-preview.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/development.md +10 -2
- codex_usage_tracking-0.15.0/docs/examples/remediation-conversation.md +34 -0
- codex_usage_tracking-0.15.0/docs/examples/token-waste-conversation.md +32 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/mcp.md +3 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/one-dot-oh-readiness.md +8 -8
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/pyproject.toml +3 -1
- codex_usage_tracking-0.15.0/scripts/generate_social_preview.py +213 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/smoke_installed_package.py +2 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/skills/codex-usage-api/SKILL.md +11 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/skills/codex-usage-tracker/SKILL.md +13 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/skills/codex-usage-tracker/scripts/run_mcp.py +2 -2
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/__init__.py +1 -1
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/dashboard/react/assets/index.css +1 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png +0 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/examples/remediation-conversation.md +34 -0
- codex_usage_tracking-0.15.0/src/codex_usage_tracker/plugin_data/docs/examples/token-waste-conversation.md +32 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/skills/codex-usage-api/SKILL.md +11 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/skills/codex-usage-tracker/SKILL.md +13 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/api.py +92 -12
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/thread_summaries.py +27 -2
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/PKG-INFO +27 -6
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/SOURCES.txt +7 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/requires.txt +1 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_dashboard_mcp.py +32 -1
- codex_usage_tracking-0.14.0/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-call-investigator-preview.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-call-investigator.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-calls-preview.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-calls.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-details.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-diagnostics.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-insights.png +0 -0
- codex_usage_tracking-0.14.0/docs/assets/dashboard-threads.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/dashboard/react/assets/index.css +0 -1
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png +0 -0
- codex_usage_tracking-0.14.0/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/.mcp.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/AGENTS.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/CONTRIBUTING.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/LICENSE +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/MANIFEST.in +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/SECURITY.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/assets/icon.svg +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/architecture/decisions/0001-package-domain-boundaries.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/architecture-boundary-map.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/architecture.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/cache-context-lab-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/call-drilldown-menu-concept-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/calls-analyst-view-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/calls-high-density-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/command-palette-dashboard-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/diagnostics-notebook-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/generated-dashboard-concept-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/generated-maintainer-banner-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/investigator-workbench-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/overview-dashboard-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/projected-weekly-credits-overlap-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/thread-efficiency-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/frontend-rewrite-references/usage-drain-lab-reference.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/plugin-prompts.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/plugin-thread-leaderboard.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/ux/call-detail-panel.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/ux/insight-overview.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/assets/ux/thread-investigation.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/call-drilldown-performance-checklist.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/cli-json-schemas.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/cli-reference.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/dashboard-guide.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/first-five-minutes.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/frontend-rewrite-roadmap.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/install.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/maintainability-roadmap.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/maintainability-scorecard.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/pricing-and-credits.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/privacy.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/react-dashboard-0.14-release-roadmap.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/ui-ux-improvement-plan.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/usage-drain-modeling.md +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/benchmark_synthetic_history.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/check_release.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/check_wemake_baseline.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/install_local_plugin.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/model_usage_drain.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/setup.cfg +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/__main__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/allowance.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/__main__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/config.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/dashboard.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/main.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/mcp_server.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/output.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/parser.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/parser_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/cli/plugin_installer.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/action_timing.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/constants.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/loader.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/reader.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/serialized.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/summaries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/token_estimates.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/context/values.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/api_payloads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/call_origin.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/formatting.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/i18n.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contract_cli.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contract_common.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contract_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contract_server.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contract_validation.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/json_contracts.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/models.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/paths.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/projects.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/redaction.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/schema.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/core/threads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/dashboard/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/dashboard/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/dashboard/assets.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/dashboard/pricing_snapshot.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/action_hints.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/fact_classifiers.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/facts.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/guided_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/mcp.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/reports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_analysis.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_concentration.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_constants.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_events.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_payloads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_report.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_source_logs.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshot_source_scan.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/snapshots.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/diagnostics/types.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/mcp_server.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/parser/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/parser/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/parser/jsonl_v1.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/parser/jsonl_values.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/parser/state.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/assets/icon.svg +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_actions.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_analysis.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_diagnostics.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_investigator.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_cells.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_data.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_detail.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_details.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_facts.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_snapshots.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_events.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_filters.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_format.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_i18n.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_layout.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_live.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_payload_cache.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_responsive.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_state.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_status.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.css +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_template.html +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tooltips.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/ar.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/de.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/en.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/es.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/fr.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/it.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/ja.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/ko.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/pt.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/ru.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/vi.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/locales/zh-Hans.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/dashboard/react/assets/dashboard-react.js +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-prompts.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-thread-leaderboard.png +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/docs/dashboard-guide.html +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_data/rate_cards/codex-credit-rates.json +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/plugin_installer.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/allowance.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/allowance_config.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/allowance_rate_card.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/allowance_text.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/allowance_usage.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/config.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/costing.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/estimates.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/pricing/openai.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/filters.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/project_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/recommendation_builder.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/recommendations.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/reports/support.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/call_detail.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/call_lists.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/context.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/context_settings.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/dashboard_shell.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/diagnostic_facts.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/diagnostic_routes.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/diagnostic_snapshots.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/handler.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/live_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/live_rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/open_investigator.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/recommendations.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/reports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/request_guards.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/responses.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/routes.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/status.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/threads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/usage_refresh.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/server/utils.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/connection.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/dashboard_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/diagnostic_call_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/diagnostic_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/exports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/query_sql.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/refresh.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/schema.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/sources.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/summary_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/usage_api_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/usage_record_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/store/usage_timing.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/support.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/allowance_breakpoints.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/allowance_fits.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/allowance_online.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_delta.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_delta_core.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_delta_rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_delta_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_scopes.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/boundary_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/capacity_specs.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/error_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/feature_history.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/features.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/grace.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/history_state.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/model.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/predictive.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/predictive_specs.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/proxy_fit.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/regime_labels.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/regime_segments.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/regression.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/reports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/spans.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/state_buckets.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/state_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/summary_metrics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/thread_curves.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/time_series.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/token_components.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/transition_gates.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/transition_metrics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/types.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/utils.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/walk_forward.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracker/usage_drain/walk_forward_rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/dependency_links.txt +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/entry_points.txt +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/src/codex_usage_tracking.egg-info/top_level.txt +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/__init__.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_cli_dashboard.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_cli_lifecycle.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_cli_module_entrypoints.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_cli_parser_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_cli_release.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_mcp_integration.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_mcp_launcher.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/cli/test_plugin_installer.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_action_timing.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_evidence.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_scan.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_serialized.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_summaries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_token_estimates.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/context/test_context_values.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_call_origin.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_formatting.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_i18n.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_json_contracts.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_privacy.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_projects.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_redaction.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_schema.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/core/test_threads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_data.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_diagnostics_snapshots.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_live.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_payload.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_pricing_snapshot.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_server.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_state.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/dashboard/test_dashboard_status.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_fact_classifiers.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_reports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_snapshot_events.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_snapshot_report.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_snapshot_source_scan.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_diagnostic_snapshots.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/diagnostics/test_doctor_first_run.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/parser/test_parser.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/parser/test_parser_inspect_log.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/parser/test_parser_state.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/pricing/test_allowance.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/pricing/test_pricing.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/reports/test_recommendations.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/reports/test_support.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_api.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_call_detail.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_call_lists.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_context.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_context_settings.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_dashboard_shell.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_diagnostic_facts.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_diagnostic_refresh_auth.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_diagnostic_snapshots.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_live_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_live_rows.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_open_investigator.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_recommendations.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_request_guards.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_responses.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_routes.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_status.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_threads.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/server/test_server_usage_refresh.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_dashboard_queries.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_large_batches.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_migrations.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_query_sql.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store/test_store_sources.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/store_dashboard_helpers.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_allowance_fits.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_boundary_delta.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_boundary_delta_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_boundary_summary.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_error_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_feature_history.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_model.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_one_percent_capacity.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_predictive.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_regime_segments.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_regression.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_report_records.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_reports.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_state_buckets.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_state_diagnostics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_summary_metrics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_thread_curves.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_token_components.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_transition_gates.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_transition_metrics.py +0 -0
- {codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/tests/usage_drain/test_usage_drain_walk_forward.py +0 -0
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.15.0 - 2026-07-05
|
|
6
|
+
|
|
7
|
+
- Make the companion plugin/skills remediation-aware for token-waste investigations, including Headroom suggestions when available, dashboard verification paths, and custom local automation ideas.
|
|
8
|
+
- Fix React dashboard package verification for public release readiness, including bundled React dashboard resources in local wheel smoke coverage and refreshed synthetic Calls/Details README screenshots.
|
|
9
|
+
- Harden React dashboard context evidence and diagnostics smoke tests against current row-selection and duplicate-heading behavior.
|
|
10
|
+
- Recenter the README around talking with the plugin/skill about local aggregate usage, with example conversation docs for token-waste and remediation workflows.
|
|
11
|
+
|
|
12
|
+
## 0.14.1 - 2026-07-04
|
|
13
|
+
|
|
14
|
+
- Harden React dashboard responsive chrome, including topbar control wrapping, table containment, sticky table affordances, mobile nav polish, and refreshed synthetic dashboard screenshots.
|
|
15
|
+
|
|
5
16
|
## 0.14.0 - 2026-07-04
|
|
6
17
|
|
|
7
18
|
- Make `serve-dashboard --open` prefer the React dashboard route while keeping legacy `/dashboard.html` available as a localhost fallback, and expose both URLs in `serve-dashboard --json`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-usage-tracking
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: Unofficial local Codex plugin and dashboard for investigating aggregate token usage, costs, caching, and thread patterns.
|
|
5
5
|
Author: Douglas Monsky
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,6 +33,7 @@ Requires-Dist: actionlint-py>=1.7.12.24; python_version >= "3.11" and extra == "
|
|
|
33
33
|
Requires-Dist: build>=1.2; extra == "dev"
|
|
34
34
|
Requires-Dist: git-agent-ratchet>=1.3.0; python_version >= "3.11" and extra == "dev"
|
|
35
35
|
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
36
|
+
Requires-Dist: pillow>=10; extra == "dev"
|
|
36
37
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
37
38
|
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
38
39
|
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
@@ -42,13 +43,12 @@ Requires-Dist: wemake-python-styleguide>=1.6.2; python_version >= "3.11" and ext
|
|
|
42
43
|
Requires-Dist: zizmor>=1.26.1; python_version >= "3.11" and extra == "dev"
|
|
43
44
|
Dynamic: license-file
|
|
44
45
|
|
|
45
|
-
# Codex Usage Tracker
|
|
46
|
-
|
|
47
46
|
<p align="center">
|
|
48
|
-
|
|
49
|
-
<a href="docs/assets/dashboard-call-investigator.png?v=readme-smart-20260704"><img src="docs/assets/dashboard-call-investigator-preview.png?v=readme-smart-20260704" alt="Codex Usage Tracker call investigator showing token accounting, cache diagnostics, and explicit evidence controls." width="49%"></a>
|
|
47
|
+
<img src="docs/assets/readme-hero.png?v=readme-hero-20260704" alt="Codex Usage Tracker local-first analytics dashboard preview with overview, calls, and investigator surfaces." width="100%">
|
|
50
48
|
</p>
|
|
51
49
|
|
|
50
|
+
# Codex Usage Tracker
|
|
51
|
+
|
|
52
52
|
Local-first dashboard, Codex plugin, and companion skill for understanding where your Codex tokens and usage credits are going.
|
|
53
53
|
|
|
54
54
|
[](https://github.com/douglasmonsky/codex-usage-tracker/actions/workflows/ci.yml)
|
|
@@ -94,6 +94,27 @@ pipx install "git+https://github.com/douglasmonsky/codex-usage-tracker.git"
|
|
|
94
94
|
|
|
95
95
|
Want Codex to do it for you? Paste: `Install codex-usage-tracking with pipx, run codex-usage-tracker setup, and open the Codex Usage Tracker dashboard.`
|
|
96
96
|
|
|
97
|
+
## Talk To Your Usage Data
|
|
98
|
+
|
|
99
|
+
The dashboard shows the evidence; the companion plugin and skills make it conversational. After `setup` and a Codex restart, ask Codex to refresh the local aggregate index, call MCP tools, and explain what is driving usage without exposing prompts or tool output.
|
|
100
|
+
|
|
101
|
+
Good starter prompts:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
Look through my usage for token waste and recommend what I should change.
|
|
105
|
+
Find high-context, low-cache calls worth opening in the investigator.
|
|
106
|
+
Which threads are draining the most, and what would reduce that next time?
|
|
107
|
+
Compare model and effort usage, then suggest safer defaults.
|
|
108
|
+
Open the dashboard and filter Calls to the rows behind your recommendation.
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The companion skill treats waste discovery as diagnosis plus remediation: it can point to Calls, Threads, Call Investigator, Diagnostics Notebook, Headroom when available, or a custom local command/skill/report preset Codex can build to stop repeating the same waste pattern.
|
|
112
|
+
|
|
113
|
+
Example conversation docs:
|
|
114
|
+
|
|
115
|
+
- [Token Waste Review](docs/examples/token-waste-conversation.md)
|
|
116
|
+
- [Remediation Planning](docs/examples/remediation-conversation.md)
|
|
117
|
+
|
|
97
118
|
## Dashboard Preview
|
|
98
119
|
|
|
99
120
|
Overview is the dashboard landing workspace: it shows recent aggregate usage, weekly remaining usage context, row loading controls, and charts that open on recent dates.
|
|
@@ -130,7 +151,7 @@ If this helped you track Codex usage, starring the repo helps others find it. Is
|
|
|
130
151
|
|
|
131
152
|
## Companion Skill And Plugin
|
|
132
153
|
|
|
133
|
-
The dashboard is the core product surface. The Codex plugin and companion usage
|
|
154
|
+
The dashboard is the core product surface. The Codex plugin and companion usage skills let Codex refresh local aggregates, call MCP tools, and explain usage patterns conversationally after plugin discovery. Setup and tool details: [MCP And Codex Skills](docs/mcp.md).
|
|
134
155
|
|
|
135
156
|
<p align="center">
|
|
136
157
|
<a href="docs/assets/plugin-prompts.png"><img src="docs/assets/plugin-prompts.png?v=readme-drilldown" alt="Synthetic Codex plugin prompt preview showing usage dashboard and thread investigation suggestions." width="86%"></a>
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
# Codex Usage Tracker
|
|
2
|
-
|
|
3
1
|
<p align="center">
|
|
4
|
-
|
|
5
|
-
<a href="docs/assets/dashboard-call-investigator.png?v=readme-smart-20260704"><img src="docs/assets/dashboard-call-investigator-preview.png?v=readme-smart-20260704" alt="Codex Usage Tracker call investigator showing token accounting, cache diagnostics, and explicit evidence controls." width="49%"></a>
|
|
2
|
+
<img src="docs/assets/readme-hero.png?v=readme-hero-20260704" alt="Codex Usage Tracker local-first analytics dashboard preview with overview, calls, and investigator surfaces." width="100%">
|
|
6
3
|
</p>
|
|
7
4
|
|
|
5
|
+
# Codex Usage Tracker
|
|
6
|
+
|
|
8
7
|
Local-first dashboard, Codex plugin, and companion skill for understanding where your Codex tokens and usage credits are going.
|
|
9
8
|
|
|
10
9
|
[](https://github.com/douglasmonsky/codex-usage-tracker/actions/workflows/ci.yml)
|
|
@@ -50,6 +49,27 @@ pipx install "git+https://github.com/douglasmonsky/codex-usage-tracker.git"
|
|
|
50
49
|
|
|
51
50
|
Want Codex to do it for you? Paste: `Install codex-usage-tracking with pipx, run codex-usage-tracker setup, and open the Codex Usage Tracker dashboard.`
|
|
52
51
|
|
|
52
|
+
## Talk To Your Usage Data
|
|
53
|
+
|
|
54
|
+
The dashboard shows the evidence; the companion plugin and skills make it conversational. After `setup` and a Codex restart, ask Codex to refresh the local aggregate index, call MCP tools, and explain what is driving usage without exposing prompts or tool output.
|
|
55
|
+
|
|
56
|
+
Good starter prompts:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
Look through my usage for token waste and recommend what I should change.
|
|
60
|
+
Find high-context, low-cache calls worth opening in the investigator.
|
|
61
|
+
Which threads are draining the most, and what would reduce that next time?
|
|
62
|
+
Compare model and effort usage, then suggest safer defaults.
|
|
63
|
+
Open the dashboard and filter Calls to the rows behind your recommendation.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The companion skill treats waste discovery as diagnosis plus remediation: it can point to Calls, Threads, Call Investigator, Diagnostics Notebook, Headroom when available, or a custom local command/skill/report preset Codex can build to stop repeating the same waste pattern.
|
|
67
|
+
|
|
68
|
+
Example conversation docs:
|
|
69
|
+
|
|
70
|
+
- [Token Waste Review](docs/examples/token-waste-conversation.md)
|
|
71
|
+
- [Remediation Planning](docs/examples/remediation-conversation.md)
|
|
72
|
+
|
|
53
73
|
## Dashboard Preview
|
|
54
74
|
|
|
55
75
|
Overview is the dashboard landing workspace: it shows recent aggregate usage, weekly remaining usage context, row loading controls, and charts that open on recent dates.
|
|
@@ -86,7 +106,7 @@ If this helped you track Codex usage, starring the repo helps others find it. Is
|
|
|
86
106
|
|
|
87
107
|
## Companion Skill And Plugin
|
|
88
108
|
|
|
89
|
-
The dashboard is the core product surface. The Codex plugin and companion usage
|
|
109
|
+
The dashboard is the core product surface. The Codex plugin and companion usage skills let Codex refresh local aggregates, call MCP tools, and explain usage patterns conversationally after plugin discovery. Setup and tool details: [MCP And Codex Skills](docs/mcp.md).
|
|
90
110
|
|
|
91
111
|
<p align="center">
|
|
92
112
|
<a href="docs/assets/plugin-prompts.png"><img src="docs/assets/plugin-prompts.png?v=readme-drilldown" alt="Synthetic Codex plugin prompt preview showing usage dashboard and thread investigation suggestions." width="86%"></a>
|
{codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/docs/adoption-hardening-roadmap.md
RENAMED
|
@@ -94,7 +94,7 @@ Branches:
|
|
|
94
94
|
|
|
95
95
|
Release target:
|
|
96
96
|
|
|
97
|
-
-
|
|
97
|
+
- Fold remaining refresh-behavior hardening into the next adoption patch/minor after `0.15.0`.
|
|
98
98
|
|
|
99
99
|
## 0.16: Maintainability Ratchet
|
|
100
100
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -149,8 +149,8 @@ python scripts/smoke_installed_package.py --docker
|
|
|
149
149
|
To verify the public PyPI package instead of the local checkout:
|
|
150
150
|
|
|
151
151
|
```bash
|
|
152
|
-
python scripts/smoke_installed_package.py --from-pypi --version 0.
|
|
153
|
-
python scripts/smoke_installed_package.py --docker --from-pypi --version 0.
|
|
152
|
+
python scripts/smoke_installed_package.py --from-pypi --version 0.15.0
|
|
153
|
+
python scripts/smoke_installed_package.py --docker --from-pypi --version 0.15.0
|
|
154
154
|
```
|
|
155
155
|
|
|
156
156
|
`scripts/check_release.py` treats these public-package smoke commands as release-state claims. Keep their `--version` and `codex-usage-tracking==...` values aligned with `pyproject.toml`; the release gate fails when the docs claim a different public version. It also checks that install docs point at the real PyPI distribution, `codex-usage-tracking`, and keep the warning that `codex-usage-tracker` is a different PyPI package.
|
|
@@ -214,6 +214,14 @@ After refreshing screenshots, copy the same files into `src/codex_usage_tracker/
|
|
|
214
214
|
|
|
215
215
|
Do not use real session logs, real prompts, assistant text, tool output, secrets, or private data in docs or screenshots.
|
|
216
216
|
|
|
217
|
+
The repository social preview artwork is generated separately:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
python scripts/generate_social_preview.py
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
It writes `docs/assets/social-preview.png` and `docs/assets/readme-hero.png` at 1280x640, using exact rendered text and existing synthetic dashboard screenshots. Refresh the static downloads claim only after checking a public package-download source such as PyPI Stats.
|
|
224
|
+
|
|
217
225
|
## Large-History Benchmarking
|
|
218
226
|
|
|
219
227
|
Use the synthetic benchmark script when changing SQLite filters, dashboard payload loading, or indexes:
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Remediation Planning Conversation
|
|
2
|
+
|
|
3
|
+
This is a synthetic, aggregate-only example of turning Codex Usage Tracker findings into concrete workflow changes. It is written as an example conversation doc rather than a transcript from private logs.
|
|
4
|
+
|
|
5
|
+
## User
|
|
6
|
+
|
|
7
|
+
Which threads are draining the most, and what can we do so this does not keep happening?
|
|
8
|
+
|
|
9
|
+
## Codex With Codex Usage Tracker
|
|
10
|
+
|
|
11
|
+
I refreshed the aggregate index, checked `usage_threads`, and pulled supporting Calls rows for the top thread. I did not inspect raw context.
|
|
12
|
+
|
|
13
|
+
## Evidence
|
|
14
|
+
|
|
15
|
+
- The top thread has repeated high-token calls after context-heavy investigation turns.
|
|
16
|
+
- The Calls table shows high context-window percentage and a few low-cache rows.
|
|
17
|
+
- The expensive rows are tied to repeated repository discovery and broad validation.
|
|
18
|
+
|
|
19
|
+
## Recommended Remediation
|
|
20
|
+
|
|
21
|
+
- Split future work into an investigation thread and an implementation thread once the plan is stable.
|
|
22
|
+
- Preserve reusable findings in a short repo note or roadmap issue, then start a fresh thread from that summary.
|
|
23
|
+
- Ask Codex to use a narrow validation plan first, then broaden only before release.
|
|
24
|
+
- If Headroom is installed, ask it to check context pressure before continuing a long thread.
|
|
25
|
+
- If the pattern repeats, have Codex build a custom local helper command or skill note that captures the exact repo facts it keeps rediscovering.
|
|
26
|
+
|
|
27
|
+
## Verify
|
|
28
|
+
|
|
29
|
+
Open the dashboard and check:
|
|
30
|
+
|
|
31
|
+
- Threads sorted by total tokens before and after the workflow change.
|
|
32
|
+
- Calls filtered to the target thread, sorted by total tokens.
|
|
33
|
+
- Call Investigator for one high-pressure call.
|
|
34
|
+
- Diagnostics Notebook usage-drain evidence if weekly usage remains unexpectedly high.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Token Waste Review Conversation
|
|
2
|
+
|
|
3
|
+
This is a synthetic, aggregate-only example of using the Codex Usage Tracker companion skill. It does not include prompts, assistant messages, tool output, pasted secrets, raw transcript text, real thread names, or real usage totals.
|
|
4
|
+
|
|
5
|
+
## User
|
|
6
|
+
|
|
7
|
+
Look through my usage for token waste and recommend what I should change.
|
|
8
|
+
|
|
9
|
+
## Codex With Codex Usage Tracker
|
|
10
|
+
|
|
11
|
+
I refreshed the local aggregate index and ranked recent calls by total tokens, context-window pressure, cache ratio, and thread totals.
|
|
12
|
+
|
|
13
|
+
## Evidence
|
|
14
|
+
|
|
15
|
+
- One long implementation thread accounts for most recent tokens.
|
|
16
|
+
- Several calls have high input tokens with low cached input, which means repeated context was not being reused efficiently.
|
|
17
|
+
- The most expensive rows cluster around broad file discovery plus full test reruns.
|
|
18
|
+
|
|
19
|
+
## Likely Waste Pattern
|
|
20
|
+
|
|
21
|
+
Codex is rediscovering project context and rerunning broad checks in the same workstream. The dashboard evidence to inspect next is Calls sorted by total tokens, then the top thread in Threads, then the highest-pressure record in Call Investigator.
|
|
22
|
+
|
|
23
|
+
## Next Actions
|
|
24
|
+
|
|
25
|
+
- Use Calls to open the top three expensive rows.
|
|
26
|
+
- If Headroom is available, use it to estimate whether the thread is near context pressure before continuing.
|
|
27
|
+
- Move stable project facts into docs or an `AGENTS.md` note so Codex does not need to infer them repeatedly.
|
|
28
|
+
- Create a repo-specific validation command or test-selection checklist if broad checks are happening every turn.
|
|
29
|
+
|
|
30
|
+
## Verify
|
|
31
|
+
|
|
32
|
+
After the next few sessions, compare Threads total tokens, Calls cache ratio, and Diagnostics Notebook usage-drain evidence against the previous window.
|
|
@@ -38,6 +38,7 @@ Open dashboard.
|
|
|
38
38
|
Use my Codex Usage Tracker data to explain what drove usage this week.
|
|
39
39
|
Heaviest thread?
|
|
40
40
|
Thread leaderboard.
|
|
41
|
+
Look through my usage for token waste and recommend fixes.
|
|
41
42
|
Find low-cache or high-context calls from today and suggest what to inspect next.
|
|
42
43
|
Look through my usage for token waste.
|
|
43
44
|
Find calls where context got bloated.
|
|
@@ -51,6 +52,8 @@ The API skill should refresh the local index, call aggregate tools such as `usag
|
|
|
51
52
|
|
|
52
53
|
If MCP tools are not available, the same questions can be answered through CLI JSON commands documented in [CLI And MCP JSON Schemas](cli-json-schemas.md).
|
|
53
54
|
|
|
55
|
+
Waste-discovery answers should include remediation ideas when evidence supports them: dashboard rows to inspect, Headroom if available for context/headroom checks, workflow changes such as thread splitting or lower effort for routine work, and small custom local commands or skill updates Codex can build when the same waste pattern keeps recurring.
|
|
56
|
+
|
|
54
57
|
The companion skill cannot read your logged-in Codex account plan, native remaining allowance, or usage from other agentic surfaces. Remaining allowance context is only as accurate as the values you manually copy into `~/.codex-usage-tracker/allowance.json`.
|
|
55
58
|
|
|
56
59
|
## Tools
|
|
@@ -24,12 +24,12 @@ Not guaranteed:
|
|
|
24
24
|
|
|
25
25
|
## 1. Public Install And Package Metadata
|
|
26
26
|
|
|
27
|
-
- [x] Verify the current public PyPI version is visible as `0.
|
|
28
|
-
- [x] Verify public venv install for `0.
|
|
29
|
-
- [x] Verify public pipx install path for `0.
|
|
27
|
+
- [x] Verify the current public PyPI version is visible as `0.15.0`: `python -c "import json, urllib.request; print(json.load(urllib.request.urlopen('https://pypi.org/pypi/codex-usage-tracking/json'))['info']['version'])"`.
|
|
28
|
+
- [x] Verify public venv install for `0.15.0`: `python -m venv /tmp/codex-usage-pypi-smoke && . /tmp/codex-usage-pypi-smoke/bin/activate && python -m pip install codex-usage-tracking==0.15.0 && codex-usage-tracker --version`.
|
|
29
|
+
- [x] Verify public pipx install path for `0.15.0`: `PIPX_HOME=/tmp/codex-usage-pipx-home PIPX_BIN_DIR=/tmp/codex-usage-pipx-bin pipx install codex-usage-tracking==0.15.0 && /tmp/codex-usage-pipx-bin/codex-usage-tracker --version`.
|
|
30
30
|
- [x] Verify installed package resources from a built wheel: `python scripts/smoke_installed_package.py`.
|
|
31
31
|
- [x] Verify installed package resources in Linux Docker: `python scripts/smoke_installed_package.py --docker`.
|
|
32
|
-
- [x] Verify public PyPI package in Docker: `python scripts/smoke_installed_package.py --docker --from-pypi --version 0.
|
|
32
|
+
- [x] Verify public PyPI package in Docker: `python scripts/smoke_installed_package.py --docker --from-pypi --version 0.15.0`.
|
|
33
33
|
- [x] Verify PyPI metadata names remain unchanged: `python scripts/check_release.py`.
|
|
34
34
|
- [x] Add Python 3.14 as an official support target after CI, package classifiers, docs, and installed-package smoke coverage were added. Docker smoke coverage uses `python:3.14-slim` by default. Track this in issue #12.
|
|
35
35
|
|
|
@@ -134,14 +134,14 @@ Not guaranteed:
|
|
|
134
134
|
|
|
135
135
|
## Evidence References
|
|
136
136
|
|
|
137
|
-
These references are the concrete proof behind completed checklist items. Public package smoke commands are version-specific to `0.
|
|
137
|
+
These references are the concrete proof behind completed checklist items. Public package smoke commands are version-specific to `0.15.0`; all repo tests use synthetic or aggregate-only data.
|
|
138
138
|
|
|
139
139
|
### Public Install And Package Metadata
|
|
140
140
|
|
|
141
141
|
- Public PyPI version, public venv install, and public pipx install are proven by the exact public-install commands in section 1.
|
|
142
142
|
- Built-wheel and installed-resource coverage is proven by `scripts/smoke_installed_package.py` and `tests/test_cli_release.py::test_installed_package_smoke_checks_help_for_stable_commands`.
|
|
143
143
|
- Linux package-resource coverage is proven by `scripts/smoke_installed_package.py --docker`.
|
|
144
|
-
- Public PyPI Docker coverage is proven by `scripts/smoke_installed_package.py --docker --from-pypi --version 0.
|
|
144
|
+
- Public PyPI Docker coverage is proven by `scripts/smoke_installed_package.py --docker --from-pypi --version 0.15.0`.
|
|
145
145
|
- PyPI metadata, package/distribution names, package resources, source/wheel member names, Python 3.10-3.14 support metadata, CI workflow requirements, publish workflow safety text, and tracked secret patterns are proven by `scripts/check_release.py`, `scripts/check_release.py --dist`, and `tests/test_cli_release.py::test_release_check_script_passes`.
|
|
146
146
|
|
|
147
147
|
### Upgrade And Migration
|
|
@@ -219,8 +219,8 @@ These references are the concrete proof behind completed checklist items. Public
|
|
|
219
219
|
- Publish workflow package name, Trusted Publishing, TestPyPI/PyPI job presence, event guards, no push/PR publishing, no token/password publishing, and manual PyPI main/tag preflight are proven by `scripts/check_release.py::_check_publish_workflow`.
|
|
220
220
|
- The GitHub `pypi` environment gate is proven by `gh api repos/douglasmonsky/codex-usage-tracker/environments/pypi`, which reports a `required_reviewers` protection rule and `can_admins_bypass=false`.
|
|
221
221
|
- Dist filename and wheel/sdist member checks are proven by `python -m build`, `python -m twine check dist/*`, and `python scripts/check_release.py --dist`.
|
|
222
|
-
- TestPyPI publish process is proven by a workflow-dispatch run on `main`, followed by TestPyPI metadata and clean virtualenv install checks for `codex-usage-tracking==0.
|
|
223
|
-
- PyPI publish process is proven by a workflow-dispatch run on `main`, protected `pypi` environment approval, PyPI metadata visibility, clean virtualenv install, temporary pipx install, and Docker public-package smoke for `codex-usage-tracking==0.
|
|
222
|
+
- TestPyPI publish process is proven by a workflow-dispatch run on `main`, followed by TestPyPI metadata and clean virtualenv install checks for `codex-usage-tracking==0.15.0`.
|
|
223
|
+
- PyPI publish process is proven by a workflow-dispatch run on `main`, protected `pypi` environment approval, PyPI metadata visibility, clean virtualenv install, temporary pipx install, and Docker public-package smoke for `codex-usage-tracking==0.15.0`.
|
|
224
224
|
- Release recovery documentation is proven by `scripts/check_release.py` required-file and docs checks.
|
|
225
225
|
|
|
226
226
|
### Known Limitations
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codex-usage-tracking"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.15.0"
|
|
8
8
|
description = "Unofficial local Codex plugin and dashboard for investigating aggregate token usage, costs, caching, and thread patterns."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -47,6 +47,7 @@ dev = [
|
|
|
47
47
|
"build>=1.2",
|
|
48
48
|
"git-agent-ratchet>=1.3.0; python_version >= '3.11'",
|
|
49
49
|
"mypy>=1.10",
|
|
50
|
+
"pillow>=10",
|
|
50
51
|
"pytest>=8.0",
|
|
51
52
|
"pytest-cov>=5.0",
|
|
52
53
|
"ruff>=0.8",
|
|
@@ -73,6 +74,7 @@ where = ["src"]
|
|
|
73
74
|
"dashboard/react/*",
|
|
74
75
|
"dashboard/react/assets/*",
|
|
75
76
|
"docs/*",
|
|
77
|
+
"docs/examples/*",
|
|
76
78
|
"docs/assets/*",
|
|
77
79
|
"rate_cards/*",
|
|
78
80
|
"skills/codex-usage-api/*",
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"""Generate repository preview artwork.
|
|
2
|
+
|
|
3
|
+
The images are built from exact rendered text and existing synthetic dashboard
|
|
4
|
+
screenshots so marketing copy stays crisp and reproducible.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from PIL import Image, ImageDraw, ImageFilter, ImageFont
|
|
12
|
+
|
|
13
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
14
|
+
ASSETS = ROOT / "docs" / "assets"
|
|
15
|
+
SOCIAL_OUT = ASSETS / "social-preview.png"
|
|
16
|
+
README_OUT = ASSETS / "readme-hero.png"
|
|
17
|
+
W, H = 1280, 640
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def font(size: int, weight: str = "regular") -> ImageFont.FreeTypeFont:
|
|
21
|
+
candidates = {
|
|
22
|
+
"regular": [
|
|
23
|
+
"/System/Library/Fonts/Supplemental/Arial.ttf",
|
|
24
|
+
"/System/Library/Fonts/Helvetica.ttc",
|
|
25
|
+
],
|
|
26
|
+
"bold": [
|
|
27
|
+
"/System/Library/Fonts/Supplemental/Arial Bold.ttf",
|
|
28
|
+
"/System/Library/Fonts/Helvetica.ttc",
|
|
29
|
+
],
|
|
30
|
+
"black": [
|
|
31
|
+
"/System/Library/Fonts/Supplemental/Arial Black.ttf",
|
|
32
|
+
"/System/Library/Fonts/Supplemental/Arial Bold.ttf",
|
|
33
|
+
],
|
|
34
|
+
}[weight]
|
|
35
|
+
for candidate in candidates:
|
|
36
|
+
path = Path(candidate)
|
|
37
|
+
if path.exists():
|
|
38
|
+
return ImageFont.truetype(str(path), size)
|
|
39
|
+
return ImageFont.load_default(size=size)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def rounded_mask(size: tuple[int, int], radius: int) -> Image.Image:
|
|
43
|
+
mask = Image.new("L", size, 0)
|
|
44
|
+
draw = ImageDraw.Draw(mask)
|
|
45
|
+
draw.rounded_rectangle((0, 0, size[0] - 1, size[1] - 1), radius=radius, fill=255)
|
|
46
|
+
return mask
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def paste_rounded(base: Image.Image, image: Image.Image, xy: tuple[int, int], radius: int) -> None:
|
|
50
|
+
base.paste(image, xy, rounded_mask(image.size, radius))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def draw_soft_shadow(base: Image.Image, box: tuple[int, int, int, int], radius: int, alpha: int = 44) -> None:
|
|
54
|
+
x0, y0, x1, y1 = box
|
|
55
|
+
shadow = Image.new("RGBA", base.size, (0, 0, 0, 0))
|
|
56
|
+
draw = ImageDraw.Draw(shadow)
|
|
57
|
+
draw.rounded_rectangle((x0, y0 + 12, x1, y1 + 18), radius=radius, fill=(15, 23, 42, alpha))
|
|
58
|
+
base.alpha_composite(shadow.filter(ImageFilter.GaussianBlur(18)))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def cover_crop(path: Path, size: tuple[int, int], focus_y: float = 0.35) -> Image.Image:
|
|
62
|
+
src = Image.open(path).convert("RGBA")
|
|
63
|
+
target_w, target_h = size
|
|
64
|
+
scale = max(target_w / src.width, target_h / src.height)
|
|
65
|
+
resized = src.resize((int(src.width * scale), int(src.height * scale)), Image.Resampling.LANCZOS)
|
|
66
|
+
left = max(0, (resized.width - target_w) // 2)
|
|
67
|
+
top = int(max(0, resized.height - target_h) * focus_y)
|
|
68
|
+
return resized.crop((left, top, left + target_w, top + target_h))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def draw_grid(draw: ImageDraw.ImageDraw) -> None:
|
|
72
|
+
for x in range(-80, W + 80, 40):
|
|
73
|
+
color = (214, 221, 235, 82) if x % 120 else (196, 205, 222, 110)
|
|
74
|
+
draw.line((x, 0, x + 210, H), fill=color, width=1)
|
|
75
|
+
for y in range(32, H, 42):
|
|
76
|
+
draw.line((0, y, W, y), fill=(226, 231, 240, 88), width=1)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def make_base() -> Image.Image:
|
|
80
|
+
base = Image.new("RGBA", (W, H), (246, 248, 252, 255))
|
|
81
|
+
px = base.load()
|
|
82
|
+
if px is None:
|
|
83
|
+
raise RuntimeError("Could not access image pixels")
|
|
84
|
+
for y in range(H):
|
|
85
|
+
for x in range(W):
|
|
86
|
+
nx = x / (W - 1)
|
|
87
|
+
ny = y / (H - 1)
|
|
88
|
+
px[x, y] = (
|
|
89
|
+
int(248 - 14 * nx + 6 * ny),
|
|
90
|
+
int(250 - 10 * nx + 3 * ny),
|
|
91
|
+
int(253 - 2 * nx - 7 * ny),
|
|
92
|
+
255,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
draw = ImageDraw.Draw(base)
|
|
96
|
+
draw_grid(draw)
|
|
97
|
+
draw.polygon([(820, 0), (1280, 0), (1280, 640), (730, 640)], fill=(226, 235, 255, 168))
|
|
98
|
+
draw.polygon([(982, 0), (1280, 0), (1280, 640), (890, 640)], fill=(218, 247, 238, 118))
|
|
99
|
+
return base
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def draw_dashboard_stack(base: Image.Image, *, x: int, y: int) -> None:
|
|
103
|
+
draw = ImageDraw.Draw(base)
|
|
104
|
+
card_box = (x, y, x + 536, y + 436)
|
|
105
|
+
draw_soft_shadow(base, card_box, 30, 72)
|
|
106
|
+
draw.rounded_rectangle(card_box, radius=30, fill=(255, 255, 255, 246), outline=(202, 213, 232), width=2)
|
|
107
|
+
|
|
108
|
+
overview = cover_crop(ASSETS / "dashboard-insights.png", (486, 178), 0.20)
|
|
109
|
+
calls = cover_crop(ASSETS / "dashboard-calls.png", (232, 174), 0.56)
|
|
110
|
+
investigator = cover_crop(ASSETS / "dashboard-call-investigator.png", (232, 174), 0.34)
|
|
111
|
+
|
|
112
|
+
paste_rounded(base, overview, (x + 25, y + 32), 20)
|
|
113
|
+
paste_rounded(base, calls, (x + 25, y + 232), 18)
|
|
114
|
+
paste_rounded(base, investigator, (x + 279, y + 232), 18)
|
|
115
|
+
draw.rounded_rectangle((x + 25, y + 32, x + 511, y + 210), radius=20, outline=(213, 224, 240), width=2)
|
|
116
|
+
draw.rounded_rectangle((x + 25, y + 232, x + 257, y + 406), radius=18, outline=(213, 224, 240), width=2)
|
|
117
|
+
draw.rounded_rectangle((x + 279, y + 232, x + 511, y + 406), radius=18, outline=(213, 224, 240), width=2)
|
|
118
|
+
|
|
119
|
+
draw.rounded_rectangle((x + 34, y + 44, x + 178, y + 72), radius=14, fill=(37, 99, 235, 232))
|
|
120
|
+
draw.text((x + 52, y + 49), "Overview", font=font(16, "bold"), fill=(255, 255, 255))
|
|
121
|
+
draw.rounded_rectangle((x + 34, y + 244, x + 126, y + 270), radius=13, fill=(15, 23, 42, 228))
|
|
122
|
+
draw.text((x + 51, y + 249), "Calls", font=font(15, "bold"), fill=(255, 255, 255))
|
|
123
|
+
draw.rounded_rectangle((x + 288, y + 244, x + 426, y + 270), radius=13, fill=(6, 95, 70, 224))
|
|
124
|
+
draw.text((x + 304, y + 249), "Investigator", font=font(15, "bold"), fill=(255, 255, 255))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def draw_stat_badge(
|
|
128
|
+
draw: ImageDraw.ImageDraw,
|
|
129
|
+
xy: tuple[int, int],
|
|
130
|
+
label: str,
|
|
131
|
+
value: str,
|
|
132
|
+
fill: tuple[int, int, int],
|
|
133
|
+
outline: tuple[int, int, int],
|
|
134
|
+
) -> int:
|
|
135
|
+
x, y = xy
|
|
136
|
+
label_font = font(18, "bold")
|
|
137
|
+
value_font = font(30, "black")
|
|
138
|
+
width = max(int(draw.textlength(label, font=label_font)), int(draw.textlength(value, font=value_font))) + 54
|
|
139
|
+
draw.rounded_rectangle((x, y, x + width, y + 96), radius=22, fill=fill, outline=outline, width=2)
|
|
140
|
+
draw.text((x + 26, y + 18), label, font=label_font, fill=(72, 83, 104))
|
|
141
|
+
draw.text((x + 26, y + 44), value, font=value_font, fill=(18, 28, 45))
|
|
142
|
+
return width
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def draw_title(draw: ImageDraw.ImageDraw, *, x: int, y: int) -> None:
|
|
146
|
+
draw.text((x, y), "Codex Usage", font=font(76, "black"), fill=(15, 23, 42))
|
|
147
|
+
draw.text((x, y + 76), "Tracker", font=font(86, "black"), fill=(37, 99, 235))
|
|
148
|
+
draw.text((x + 6, y + 176), "Unofficial local analytics for Codex tokens,", font=font(28, "bold"), fill=(53, 65, 85))
|
|
149
|
+
draw.text((x + 6, y + 212), "cache, threads, and spend.", font=font(28, "bold"), fill=(53, 65, 85))
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def draw_social_preview() -> Image.Image:
|
|
153
|
+
base = make_base()
|
|
154
|
+
draw = ImageDraw.Draw(base)
|
|
155
|
+
draw_dashboard_stack(base, x=662, y=82)
|
|
156
|
+
|
|
157
|
+
draw.rounded_rectangle((72, 70, 206, 112), radius=21, fill=(238, 246, 255), outline=(177, 199, 232), width=2)
|
|
158
|
+
draw.text((94, 82), "MIT License", font=font(17, "bold"), fill=(31, 55, 88))
|
|
159
|
+
draw.rounded_rectangle((224, 70, 394, 112), radius=21, fill=(238, 253, 246), outline=(161, 218, 195), width=2)
|
|
160
|
+
draw.text((246, 82), "10K+ downloads", font=font(17, "bold"), fill=(20, 83, 45))
|
|
161
|
+
|
|
162
|
+
draw_title(draw, x=72, y=150)
|
|
163
|
+
|
|
164
|
+
x = 72
|
|
165
|
+
x += draw_stat_badge(draw, (x, 414), "PACKAGE", "PyPI", (255, 255, 255), (203, 213, 225)) + 18
|
|
166
|
+
x += draw_stat_badge(draw, (x, 414), "DOWNLOADS", "10K+", (240, 253, 244), (134, 239, 172)) + 18
|
|
167
|
+
draw_stat_badge(draw, (x, 414), "LICENSE", "MIT", (239, 246, 255), (147, 197, 253))
|
|
168
|
+
|
|
169
|
+
draw.line((80, 558, 1188, 558), fill=(203, 213, 225), width=2)
|
|
170
|
+
draw.text((82, 582), "douglasmonsky/codex-usage-tracker", font=font(22, "bold"), fill=(30, 41, 59))
|
|
171
|
+
draw.text((825, 582), "Local dashboard + MCP tools", font=font(22, "bold"), fill=(71, 85, 105))
|
|
172
|
+
return base
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def draw_readme_hero() -> Image.Image:
|
|
176
|
+
base = make_base()
|
|
177
|
+
draw = ImageDraw.Draw(base)
|
|
178
|
+
draw_dashboard_stack(base, x=662, y=82)
|
|
179
|
+
|
|
180
|
+
draw.rounded_rectangle((72, 76, 324, 118), radius=21, fill=(238, 246, 255), outline=(177, 199, 232), width=2)
|
|
181
|
+
draw.text((96, 88), "Local-first Codex analytics", font=font(17, "bold"), fill=(31, 55, 88))
|
|
182
|
+
|
|
183
|
+
draw_title(draw, x=72, y=158)
|
|
184
|
+
|
|
185
|
+
bullets = [
|
|
186
|
+
"Aggregate-only dashboard",
|
|
187
|
+
"Thread, call, cache, and usage-drain views",
|
|
188
|
+
"CLI reports plus companion MCP tools",
|
|
189
|
+
]
|
|
190
|
+
for index, text in enumerate(bullets):
|
|
191
|
+
bullet_y = 432 + index * 42
|
|
192
|
+
draw.ellipse((80, bullet_y + 8, 94, bullet_y + 22), fill=(37, 99, 235))
|
|
193
|
+
draw.text((110, bullet_y), text, font=font(24, "bold"), fill=(30, 41, 59))
|
|
194
|
+
|
|
195
|
+
draw.line((80, 580, 1188, 580), fill=(203, 213, 225), width=2)
|
|
196
|
+
draw.text((82, 602), "douglasmonsky/codex-usage-tracker", font=font(22, "bold"), fill=(30, 41, 59))
|
|
197
|
+
draw.text((832, 602), "Private logs stay local", font=font(22, "bold"), fill=(71, 85, 105))
|
|
198
|
+
return base
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def save(image: Image.Image, path: Path) -> None:
|
|
202
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
203
|
+
image.convert("RGB").save(path, quality=95, optimize=True)
|
|
204
|
+
print(path)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def main() -> None:
|
|
208
|
+
save(draw_social_preview(), SOCIAL_OUT)
|
|
209
|
+
save(draw_readme_hero(), README_OUT)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
if __name__ == "__main__":
|
|
213
|
+
main()
|
{codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/scripts/smoke_installed_package.py
RENAMED
|
@@ -111,6 +111,8 @@ RESOURCE_PATHS = [
|
|
|
111
111
|
"dashboard/locales/it.json",
|
|
112
112
|
"dashboard/locales/ar.json",
|
|
113
113
|
"docs/dashboard-guide.html",
|
|
114
|
+
"docs/examples/token-waste-conversation.md",
|
|
115
|
+
"docs/examples/remediation-conversation.md",
|
|
114
116
|
"docs/assets/dashboard-insights.png",
|
|
115
117
|
"docs/assets/dashboard-calls.png",
|
|
116
118
|
"docs/assets/dashboard-calls-preview.png",
|
|
@@ -67,6 +67,17 @@ When the user asks what they can look into, offer a short menu of concrete aggre
|
|
|
67
67
|
- "Check whether model or effort choice is wasting tokens." Use `usage_summary(group_by="model", response_format="json")`, `usage_summary(group_by="effort", response_format="json")`, and supporting `usage_calls(...)` rows.
|
|
68
68
|
- "Can I share this safely?" Use `privacy_mode="strict"` and avoid `usage_call_context`.
|
|
69
69
|
|
|
70
|
+
## Waste Reduction Recommendations
|
|
71
|
+
|
|
72
|
+
When user asks to look for token waste, treat answer as diagnosis plus remediation. After ranking aggregate drivers, recommend concrete next steps that can reduce future usage:
|
|
73
|
+
|
|
74
|
+
- Suggest Headroom when available for context/headroom estimation if evidence shows high context-window pressure, repeated large reads, or long-thread accumulation. Say "if available" unless tool registry confirms it.
|
|
75
|
+
- Suggest dashboard verification steps: open top rows in Calls, inspect selected records in Call Investigator, compare Threads by total tokens, or use Diagnostics Notebook for usage-drain evidence.
|
|
76
|
+
- Suggest custom solutions Codex can build when pattern repeatable: repo-specific test selector, local summary command, prompt checklist, dashboard report preset, or small script extracting exact project facts Codex keeps rediscovering.
|
|
77
|
+
- Suggest workflow changes only when aggregate evidence supports them: split bloated threads, lower reasoning effort for routine edits, reuse one thread for cache-friendly related work, or start fresh thread after compacting needed state into docs.
|
|
78
|
+
|
|
79
|
+
Structure recommendations as `Evidence`, `Likely waste pattern`, `Next action`, and `How to verify`. Keep privacy boundary explicit and avoid raw context unless user asks.
|
|
80
|
+
|
|
70
81
|
## Answer Style
|
|
71
82
|
|
|
72
83
|
- Lead with the direct answer and key metric.
|
{codex_usage_tracking-0.14.0 → codex_usage_tracking-0.15.0}/skills/codex-usage-tracker/SKILL.md
RENAMED
|
@@ -41,6 +41,19 @@ When the user wants ideas, suggest concrete aggregate investigations:
|
|
|
41
41
|
|
|
42
42
|
Route these through `usage_report_pack`, `usage_calls`, `usage_threads`, `usage_summary`, and `usage_call_detail` before considering raw context.
|
|
43
43
|
|
|
44
|
+
## Remediation Recommendations
|
|
45
|
+
|
|
46
|
+
When a usage-waste investigation finds clear patterns, do not stop at "interesting." Recommend practical next actions and existing tools that could reduce future usage. Keep recommendations tied to aggregate evidence, and label speculative ideas.
|
|
47
|
+
|
|
48
|
+
- If context pressure is high, threads are long, or repeated file reads dominate, suggest Headroom if available as a follow-up tool for estimating context/headroom and deciding whether to split the thread, summarize, or start a fresh task.
|
|
49
|
+
- If cache ratio is low on repeated work, suggest concrete workflow fixes: keep related work in one thread, avoid unnecessary broad file reads, pin reusable project context in docs, or create a small project command/script that produces the exact aggregate needed.
|
|
50
|
+
- If one thread or subagent pattern dominates, suggest narrowing the task, splitting investigation from implementation, or creating a repeatable custom checklist/command so Codex does not rediscover the same facts every turn.
|
|
51
|
+
- If effort/model choice looks expensive, compare aggregate results by model and effort before recommending lower effort, smaller models, or explicit "use minimal reasoning unless blocked" instructions.
|
|
52
|
+
- If diagnostics point to missing local automation, offer to design a custom lightweight solution: a repo command, lint/test selector, dashboard report preset, support-bundle check, or Codex skill update that prevents the same waste pattern.
|
|
53
|
+
- Mention dashboard actions that help the user verify the fix: open Calls filtered to the expensive rows, Threads sorted by tokens, Call Investigator for a selected record, or Diagnostics Notebook for usage-drain evidence.
|
|
54
|
+
|
|
55
|
+
Phrase the final answer as "what happened, why it likely matters, what to try next, how to verify." Avoid implying an external tool is installed unless the current environment or tool registry confirms it.
|
|
56
|
+
|
|
44
57
|
## Common Workflows
|
|
45
58
|
|
|
46
59
|
- Refresh the index before answering usage questions.
|