codex-usage-tracking 0.10.0__tar.gz → 0.10.1__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.10.0 → codex_usage_tracking-0.10.1}/.codex-plugin/plugin.json +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/CHANGELOG.md +5 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/PKG-INFO +5 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/README.md +4 -0
- codex_usage_tracking-0.10.1/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/cli-json-schemas.md +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/dashboard-guide.md +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/development.md +7 -7
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/one-dot-oh-readiness.md +8 -8
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/privacy.md +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/pyproject.toml +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/scripts/check_release.py +3 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/scripts/smoke_installed_package.py +1 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/skills/codex-usage-tracker/scripts/run_mcp.py +2 -2
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/__init__.py +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/context.py +105 -4
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.js +1 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_investigator.js +37 -3
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_detail.css +19 -0
- codex_usage_tracking-0.10.1/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/dashboard-guide.html +1 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/PKG-INFO +5 -1
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/SOURCES.txt +2 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_context_evidence.py +100 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/.mcp.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/AGENTS.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/CONTRIBUTING.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/LICENSE +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/MANIFEST.in +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/SECURITY.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/assets/icon.svg +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/architecture.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-call-investigator-preview.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-call-investigator.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-calls-preview.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-calls.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-details.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-diagnostics.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-insights.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/dashboard-threads.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/plugin-prompts.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/plugin-thread-leaderboard.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/ux/call-detail-panel.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/ux/insight-overview.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/assets/ux/thread-investigation.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/call-drilldown-performance-checklist.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/cli-reference.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/install.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/mcp.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/pricing-and-credits.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/docs/ui-ux-improvement-plan.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/scripts/benchmark_synthetic_history.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/scripts/install_local_plugin.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/setup.cfg +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/skills/codex-usage-api/SKILL.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/skills/codex-usage-tracker/SKILL.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/__main__.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/allowance.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/api_payloads.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/call_origin.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/cli.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/cli_parser.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/costing.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/dashboard.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_facts.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_reports.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_analysis.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_concentration.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_constants.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_events.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_report.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshot_rows.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostic_snapshots.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/diagnostics.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/formatting.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/i18n.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/json_contracts.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/mcp_server.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/models.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/parser.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/paths.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/__init__.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/assets/icon.svg +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_actions.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_analysis.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_diagnostics.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_cells.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_data.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_details.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_facts.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_snapshots.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_events.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_filters.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_format.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_i18n.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_layout.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_live.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_payload_cache.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_responsive.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_state.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_status.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.css +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_template.html +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tooltips.js +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/ar.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/de.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/en.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/es.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/fr.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/it.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/ja.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/ko.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/pt.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/ru.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/vi.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/dashboard/locales/zh-Hans.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-evidence.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-prompts.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-thread-leaderboard.png +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/rate_cards/codex-credit-rates.json +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/skills/codex-usage-api/SKILL.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_data/skills/codex-usage-tracker/SKILL.md +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/plugin_installer.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/pricing.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/pricing_config.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/pricing_estimates.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/pricing_openai.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/projects.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/recommendations.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/redaction.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/reports.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/schema.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/server.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/server_utils.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/store.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/store_query_sql.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/store_schema.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/store_sources.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/store_thread_summaries.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/support.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/threads.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/dependency_links.txt +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/entry_points.txt +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/requires.txt +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracking.egg-info/top_level.txt +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/store_dashboard_helpers.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_allowance.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_call_origin.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_cli_lifecycle.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_cli_release.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_data.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_diagnostics_snapshots.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_live.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_payload.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_server.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_dashboard_state.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_diagnostic_snapshots.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_i18n.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_json_contracts.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_mcp_integration.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_mcp_launcher.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_parser.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_plugin_installer.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_pricing.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_privacy.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_projects.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_recommendations.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_redaction.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_schema.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_store_dashboard_mcp.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_store_migrations.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_support.py +0 -0
- {codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/tests/test_threads.py +0 -0
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.10.1 - 2026-06-21
|
|
6
|
+
|
|
7
|
+
- Add lightweight action timing metadata to context evidence so call investigations can show elapsed time for parsed tool and command actions without persisting raw command text or outputs.
|
|
8
|
+
- Add synthetic README diagnostics coverage for the Git Interactions panel and package the screenshot with installed plugin docs.
|
|
9
|
+
|
|
5
10
|
## 0.10.0 - 2026-06-21
|
|
6
11
|
|
|
7
12
|
- Add Git/GitHub CLI diagnostic snapshots with safe operation labels, coarse categories, mutability buckets, and terminal token-count coverage.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-usage-tracking
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.1
|
|
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
|
|
@@ -107,6 +107,10 @@ Diagnostics surfaces on-demand snapshot reports for tool output, commands, Git i
|
|
|
107
107
|
|
|
108
108
|

|
|
109
109
|
|
|
110
|
+
The Git Interactions panel expands the safe Git and GitHub CLI operation families without storing command text, branch names, release notes, or patch content.
|
|
111
|
+
|
|
112
|
+

|
|
113
|
+
|
|
110
114
|
Insights still gives a fast triage layer for costly threads, low cache reuse, context bloat, and pricing gaps.
|
|
111
115
|
|
|
112
116
|

|
|
@@ -69,6 +69,10 @@ Diagnostics surfaces on-demand snapshot reports for tool output, commands, Git i
|
|
|
69
69
|
|
|
70
70
|

|
|
71
71
|
|
|
72
|
+
The Git Interactions panel expands the safe Git and GitHub CLI operation families without storing command text, branch names, release notes, or patch content.
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
72
76
|
Insights still gives a fast triage layer for costly threads, low cache reuse, context bloat, and pricing gaps.
|
|
73
77
|
|
|
74
78
|

|
|
@@ -689,4 +689,4 @@ Most setup and file-writing commands accept `--json` and return a schema-specifi
|
|
|
689
689
|
- `init-thresholds --json`, `init-projects --json`
|
|
690
690
|
- `support-bundle --json`
|
|
691
691
|
|
|
692
|
-
`context` already returns JSON because it is an explicit on-demand context request. Treat `codex-usage-tracker-context-v1` output as sensitive local context even though it is redacted and size-limited by default. `max_entries=0` requests all matching entries and `max_chars=0` removes the character cap for that explicit request. Tool output and compacted replacement history are omitted unless explicitly requested. Compaction entries may include metadata such as `replacement_history_available`, `replacement_entry_count`, and `replacement_history_included`; replacement text appears only when `include_compaction_history` is true for that local request. MCP returns `codex-usage-tracker-context-disabled-v1` when raw context loading has not been explicitly enabled with `CODEX_USAGE_TRACKER_ALLOW_RAW_CONTEXT=1`.
|
|
692
|
+
`context` already returns JSON because it is an explicit on-demand context request. Treat `codex-usage-tracker-context-v1` output as sensitive local context even though it is redacted and size-limited by default. `max_entries=0` requests all matching entries and `max_chars=0` removes the character cap for that explicit request. Tool output and compacted replacement history are omitted unless explicitly requested. Compaction entries may include metadata such as `replacement_history_available`, `replacement_entry_count`, and `replacement_history_included`; replacement text appears only when `include_compaction_history` is true for that local request. Evidence responses include `action_timing`, derived from timestamps in the same selected-turn source scan, plus per-entry `action_timing` fields such as `since_turn_start_ms`, `since_previous_entry_ms`, and `reported_duration_ms` when available. MCP returns `codex-usage-tracker-context-disabled-v1` when raw context loading has not been explicitly enabled with `CODEX_USAGE_TRACKER_ALLOW_RAW_CONTEXT=1`.
|
|
@@ -171,7 +171,7 @@ Previous and next buttons move chronologically within the same resolved thread a
|
|
|
171
171
|
|
|
172
172
|
The details rail is collapsed by default to preserve table space. Open `Call Details` when you want a compact aggregate preview without leaving the table. When expanded on desktop, it sticks inside the viewport and scrolls internally when the selected call has more fields or loaded context than can fit on screen.
|
|
173
173
|
|
|
174
|
-
The call investigator loads a redacted turn-log evidence window by default when served from localhost with the context API enabled. The default request uses `mode=quick`: redacted tool output is included, no character cap is applied, and serialized local JSONL is reported as a fast character-based upper bound without bucket analysis. The default entry window is still bounded so very long sessions remain responsive. Older surrounding evidence is collapsed by default and can be expanded or loaded explicitly. Visible evidence token estimates are calculated from the full selected-turn evidence set before display limiting, using `tiktoken` when available and a conservative character fallback only when the tokenizer is unavailable.
|
|
174
|
+
The call investigator loads a redacted turn-log evidence window by default when served from localhost with the context API enabled. The default request uses `mode=quick`: redacted tool output is included, no character cap is applied, and serialized local JSONL is reported as a fast character-based upper bound without bucket analysis. The default entry window is still bounded so very long sessions remain responsive. Older surrounding evidence is collapsed by default and can be expanded or loaded explicitly. Evidence entries include lightweight action timing derived from the timestamps already read during that same source-log scan, shown as elapsed time from the selected turn start, gap since the previous evidence entry, and reported event duration when the log provides one. Visible evidence token estimates are calculated from the full selected-turn evidence set before display limiting, using `tiktoken` when available and a conservative character fallback only when the tokenizer is unavailable.
|
|
175
175
|
|
|
176
176
|
Use `Run full serialized analysis` when you specifically want tokenizer-counted serialized JSONL groups such as encrypted reasoning/state, local goal metadata, token callback metadata, and rate-limit metadata. This full mode can explain why visible text is much smaller than exact uncached input, but it can overcount because local JSONL includes client metadata that may not be prompt text. Raw grouped text is not returned. `encrypted_content` is an opaque encrypted field found on some reasoning response items. The tracker cannot decrypt it and treats it as serialized state, not readable prompt, assistant, or tool text. Token-count context entries are labeled as the selected call, previous token count in the same turn, or earlier token count in the same turn when possible, and show call/session cumulative totals for input, cached input, uncached input, output, reasoning output, and total tokens.
|
|
177
177
|
|
|
@@ -38,7 +38,7 @@ fix/<issue-number>-short-description
|
|
|
38
38
|
docs/<issue-number>-short-description
|
|
39
39
|
chore/<issue-number>-short-description
|
|
40
40
|
test/<issue-number>-short-description
|
|
41
|
-
release/0.10.
|
|
41
|
+
release/0.10.1
|
|
42
42
|
hotfix/0.3.3
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -91,7 +91,7 @@ blocked
|
|
|
91
91
|
Recommended milestones:
|
|
92
92
|
|
|
93
93
|
```text
|
|
94
|
-
0.10.
|
|
94
|
+
0.10.1
|
|
95
95
|
1.0-readiness
|
|
96
96
|
1.0.0
|
|
97
97
|
```
|
|
@@ -146,8 +146,8 @@ python scripts/smoke_installed_package.py --docker
|
|
|
146
146
|
To verify the public PyPI package instead of the local checkout:
|
|
147
147
|
|
|
148
148
|
```bash
|
|
149
|
-
python scripts/smoke_installed_package.py --from-pypi --version 0.10.
|
|
150
|
-
python scripts/smoke_installed_package.py --docker --from-pypi --version 0.10.
|
|
149
|
+
python scripts/smoke_installed_package.py --from-pypi --version 0.10.1
|
|
150
|
+
python scripts/smoke_installed_package.py --docker --from-pypi --version 0.10.1
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
`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.
|
|
@@ -294,8 +294,8 @@ After the release branch merges, tag from updated `main`, not from an unreviewed
|
|
|
294
294
|
```bash
|
|
295
295
|
git switch main
|
|
296
296
|
git pull --ff-only
|
|
297
|
-
git tag -a v0.10.
|
|
298
|
-
git push origin v0.10.
|
|
297
|
+
git tag -a v0.10.1 -m "codex-usage-tracker 0.10.1"
|
|
298
|
+
git push origin v0.10.1
|
|
299
299
|
```
|
|
300
300
|
|
|
301
301
|
Do not create or push release tags without maintainer approval.
|
|
@@ -304,7 +304,7 @@ Do not create or push release tags without maintainer approval.
|
|
|
304
304
|
|
|
305
305
|
Publishing uses GitHub Actions Trusted Publishing through `.github/workflows/publish.yml`; do not upload from a local machine and do not add PyPI or TestPyPI API tokens.
|
|
306
306
|
|
|
307
|
-
The first public package release, `0.3.0`, was published on June 8, 2026. Patch release `0.3.1` followed the same day to ship the live-dashboard skill launch fix. Patch release `0.3.2` made dashboard launch refresh the default and added runtime enablement for context loading. Minor release `0.4.0` added Python 3.14 support, release recovery docs, stricter privacy/support-bundle regression coverage, and large-history benchmark thresholds. Patch release `0.4.1` was published by workflow dispatch from `main`; it hardened the PyPI publish workflow and checked off completed 1.0 readiness gates. Minor release `0.5.0` added dashboard localization support and initial language catalogs. Minor release `0.6.0` is the performance and call-drilldown release with SQL-backed live API slices, materialized thread summaries, faster evidence loading, and dashboard runtime module refactors. Patch release `0.6.1` aligns the final README/package screenshots and companion plugin assets. Minor release `0.7.0` adds observed usage snapshots and the latest-observed dashboard card while keeping raw evidence on demand only. Minor release `0.8.0` adds aggregate diagnostics, source-offset context seeking, and live dashboard loading hardening. Patch release `0.8.1` improves Diagnostics fact table readability with pinned fact names and sortable fact columns. Minor release `0.9.0` adds persisted diagnostic snapshots, on-demand diagnostic refresh, tool/command/file-read/concentration reports, and Diagnostics dashboard panels. Minor release `0.10.0` adds Git/GitHub CLI diagnostics, file-modification diagnostics, and derived call timing fields across the dashboard and API.
|
|
307
|
+
The first public package release, `0.3.0`, was published on June 8, 2026. Patch release `0.3.1` followed the same day to ship the live-dashboard skill launch fix. Patch release `0.3.2` made dashboard launch refresh the default and added runtime enablement for context loading. Minor release `0.4.0` added Python 3.14 support, release recovery docs, stricter privacy/support-bundle regression coverage, and large-history benchmark thresholds. Patch release `0.4.1` was published by workflow dispatch from `main`; it hardened the PyPI publish workflow and checked off completed 1.0 readiness gates. Minor release `0.5.0` added dashboard localization support and initial language catalogs. Minor release `0.6.0` is the performance and call-drilldown release with SQL-backed live API slices, materialized thread summaries, faster evidence loading, and dashboard runtime module refactors. Patch release `0.6.1` aligns the final README/package screenshots and companion plugin assets. Minor release `0.7.0` adds observed usage snapshots and the latest-observed dashboard card while keeping raw evidence on demand only. Minor release `0.8.0` adds aggregate diagnostics, source-offset context seeking, and live dashboard loading hardening. Patch release `0.8.1` improves Diagnostics fact table readability with pinned fact names and sortable fact columns. Minor release `0.9.0` adds persisted diagnostic snapshots, on-demand diagnostic refresh, tool/command/file-read/concentration reports, and Diagnostics dashboard panels. Minor release `0.10.0` adds Git/GitHub CLI diagnostics, file-modification diagnostics, and derived call timing fields across the dashboard and API. Patch release `0.10.1` adds lightweight action timing to context evidence and ships the synthetic Git Interactions README screenshot.
|
|
308
308
|
|
|
309
309
|
- GitHub Release: `https://github.com/douglasmonsky/codex-usage-tracker/releases/tag/v0.3.0`
|
|
310
310
|
- GitHub Release: `https://github.com/douglasmonsky/codex-usage-tracker/releases/tag/v0.3.1`
|
|
@@ -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.10.
|
|
28
|
-
- [x] Verify public venv install for `0.10.
|
|
29
|
-
- [x] Verify public pipx install path for `0.10.
|
|
27
|
+
- [x] Verify the current public PyPI version is visible as `0.10.1`: `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.10.1`: `python -m venv /tmp/codex-usage-pypi-smoke && . /tmp/codex-usage-pypi-smoke/bin/activate && python -m pip install codex-usage-tracking==0.10.1 && codex-usage-tracker --version`.
|
|
29
|
+
- [x] Verify public pipx install path for `0.10.1`: `PIPX_HOME=/tmp/codex-usage-pipx-home PIPX_BIN_DIR=/tmp/codex-usage-pipx-bin pipx install codex-usage-tracking==0.10.1 && /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.10.
|
|
32
|
+
- [x] Verify public PyPI package in Docker: `python scripts/smoke_installed_package.py --docker --from-pypi --version 0.10.1`.
|
|
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.10.
|
|
137
|
+
These references are the concrete proof behind completed checklist items. Public package smoke commands are version-specific to `0.10.1`; 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.10.
|
|
144
|
+
- Public PyPI Docker coverage is proven by `scripts/smoke_installed_package.py --docker --from-pypi --version 0.10.1`.
|
|
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.10.
|
|
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.10.
|
|
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.10.1`.
|
|
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.10.1`.
|
|
224
224
|
- Release recovery documentation is proven by `scripts/check_release.py` required-file and docs checks.
|
|
225
225
|
|
|
226
226
|
### Known Limitations
|
|
@@ -41,7 +41,7 @@ Diagnostic snapshots are not live recomputed during ordinary dashboard or usage
|
|
|
41
41
|
|
|
42
42
|
## On-Demand Context
|
|
43
43
|
|
|
44
|
-
`usage_call_context`, `codex-usage-tracker context`, and the `serve-dashboard` context endpoint read a single source JSONL file only when explicitly requested. Returned context is redacted for common secret patterns and capped in size by default for CLI/MCP requests. The call investigator uses the same endpoint at runtime and requests quick redacted evidence for the selected call when the local context API is enabled; that still does not persist raw context into SQLite, CSV, support bundles, or generated dashboard HTML.
|
|
44
|
+
`usage_call_context`, `codex-usage-tracker context`, and the `serve-dashboard` context endpoint read a single source JSONL file only when explicitly requested. Returned context is redacted for common secret patterns and capped in size by default for CLI/MCP requests. The call investigator uses the same endpoint at runtime and requests quick redacted evidence for the selected call when the local context API is enabled; that still does not persist raw context into SQLite, CSV, support bundles, or generated dashboard HTML. Per-entry action timing in this evidence response is derived from already-read entry timestamps and contains numeric durations only; it does not add a second scan or store raw transcript content.
|
|
45
45
|
|
|
46
46
|
Tool output is omitted by default for CLI/MCP and dashboard investigator context requests. The call investigator offers `Show tool output` when redacted, size-limited tool output is needed. Full serialized JSONL group analysis is also opt-in through `mode=full` / `Run full serialized analysis`; default quick mode returns only a fast serialized upper-bound estimate. Compacted replacement history remains omitted by default everywhere. Compaction metadata can show that replacement history exists, its entry count, and the source line, but the replacement text is returned only when explicitly requested for that selected call and is redacted before display.
|
|
47
47
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codex-usage-tracking"
|
|
7
|
-
version = "0.10.
|
|
7
|
+
version = "0.10.1"
|
|
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"
|
|
@@ -82,6 +82,7 @@ REQUIRED_FILES = [
|
|
|
82
82
|
"docs/assets/dashboard-calls-preview.png",
|
|
83
83
|
"docs/assets/dashboard-threads.png",
|
|
84
84
|
"docs/assets/dashboard-diagnostics.png",
|
|
85
|
+
"docs/assets/dashboard-diagnostics-git-expanded.png",
|
|
85
86
|
"docs/assets/dashboard-details.png",
|
|
86
87
|
"docs/assets/dashboard-call-investigator.png",
|
|
87
88
|
"docs/assets/dashboard-call-investigator-preview.png",
|
|
@@ -134,6 +135,7 @@ REQUIRED_FILES = [
|
|
|
134
135
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png",
|
|
135
136
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png",
|
|
136
137
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png",
|
|
138
|
+
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png",
|
|
137
139
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png",
|
|
138
140
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png",
|
|
139
141
|
"src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png",
|
|
@@ -179,6 +181,7 @@ WHEEL_REQUIRED_MEMBERS = {
|
|
|
179
181
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png",
|
|
180
182
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png",
|
|
181
183
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png",
|
|
184
|
+
"codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png",
|
|
182
185
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png",
|
|
183
186
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png",
|
|
184
187
|
"codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png",
|
{codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/scripts/smoke_installed_package.py
RENAMED
|
@@ -110,6 +110,7 @@ RESOURCE_PATHS = [
|
|
|
110
110
|
"docs/assets/dashboard-calls-preview.png",
|
|
111
111
|
"docs/assets/dashboard-threads.png",
|
|
112
112
|
"docs/assets/dashboard-diagnostics.png",
|
|
113
|
+
"docs/assets/dashboard-diagnostics-git-expanded.png",
|
|
113
114
|
"docs/assets/dashboard-details.png",
|
|
114
115
|
"docs/assets/dashboard-call-investigator.png",
|
|
115
116
|
"docs/assets/dashboard-call-investigator-preview.png",
|
|
@@ -15,9 +15,9 @@ from pathlib import Path
|
|
|
15
15
|
|
|
16
16
|
PACKAGE_SPEC = os.environ.get(
|
|
17
17
|
"CODEX_USAGE_TRACKER_PACKAGE_SPEC",
|
|
18
|
-
"codex-usage-tracking==0.10.
|
|
18
|
+
"codex-usage-tracking==0.10.1",
|
|
19
19
|
)
|
|
20
|
-
RUNTIME_VERSION = "0.10.
|
|
20
|
+
RUNTIME_VERSION = "0.10.1"
|
|
21
21
|
PACKAGE_SPEC_MARKER = ".codex-usage-tracker-package-spec"
|
|
22
22
|
MODULE_CHECK = (
|
|
23
23
|
"import importlib.metadata; "
|
{codex_usage_tracking-0.10.0 → codex_usage_tracking-0.10.1}/src/codex_usage_tracker/context.py
RENAMED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
|
+
from datetime import datetime, timezone
|
|
6
7
|
from functools import lru_cache
|
|
7
8
|
from math import ceil
|
|
8
9
|
from pathlib import Path
|
|
@@ -92,7 +93,14 @@ def load_call_context(
|
|
|
92
93
|
|
|
93
94
|
target_turn_id = _optional_str(row.get("turn_id"))
|
|
94
95
|
source_scan_started = perf_counter()
|
|
95
|
-
|
|
96
|
+
(
|
|
97
|
+
entries,
|
|
98
|
+
omitted,
|
|
99
|
+
estimate_entries,
|
|
100
|
+
serialized_estimate,
|
|
101
|
+
serialized_estimate_ms,
|
|
102
|
+
action_timing,
|
|
103
|
+
) = (
|
|
96
104
|
_read_context_entries(
|
|
97
105
|
path=source_file,
|
|
98
106
|
token_line=line_number,
|
|
@@ -126,6 +134,7 @@ def load_call_context(
|
|
|
126
134
|
"visible_token_estimate": visible_estimate["visible_token_estimate"],
|
|
127
135
|
"visible_token_estimator": visible_estimate["visible_token_estimator"],
|
|
128
136
|
"serialized_evidence": serialized_estimate,
|
|
137
|
+
"action_timing": action_timing,
|
|
129
138
|
"record": {
|
|
130
139
|
"record_id": row.get("record_id"),
|
|
131
140
|
"session_id": row.get("session_id"),
|
|
@@ -187,7 +196,14 @@ def _read_context_entries(
|
|
|
187
196
|
include_compaction_history: bool,
|
|
188
197
|
model: str | None,
|
|
189
198
|
context_mode: str,
|
|
190
|
-
) -> tuple[
|
|
199
|
+
) -> tuple[
|
|
200
|
+
list[dict[str, Any]],
|
|
201
|
+
dict[str, Any],
|
|
202
|
+
list[dict[str, Any]],
|
|
203
|
+
dict[str, Any],
|
|
204
|
+
float,
|
|
205
|
+
dict[str, Any],
|
|
206
|
+
]:
|
|
191
207
|
candidates: list[dict[str, Any]] = []
|
|
192
208
|
raw_entries: list[dict[str, Any]] = []
|
|
193
209
|
field_buckets: dict[str, dict[str, Any]] = {}
|
|
@@ -341,11 +357,12 @@ def _read_context_entries(
|
|
|
341
357
|
)
|
|
342
358
|
serialized_estimate_ms = _elapsed_ms(serialized_started)
|
|
343
359
|
candidates = _dedupe_chat_message_echoes(candidates)
|
|
360
|
+
action_timing = _annotate_action_timing(candidates)
|
|
344
361
|
limited, omitted = _limit_entries(candidates, max_chars=max_chars, max_entries=max_entries)
|
|
345
362
|
omitted["parse_errors"] = omitted_parse_errors
|
|
346
363
|
omitted["target_turn_id"] = target_turn_id
|
|
347
364
|
omitted["total_entries"] = len(candidates)
|
|
348
|
-
return limited, omitted, candidates, serialized_estimate, serialized_estimate_ms
|
|
365
|
+
return limited, omitted, candidates, serialized_estimate, serialized_estimate_ms, action_timing
|
|
349
366
|
|
|
350
367
|
|
|
351
368
|
def _collect_serialized_envelope(
|
|
@@ -438,6 +455,7 @@ def _summarized_context_entry(
|
|
|
438
455
|
compaction=summarized.get("compaction")
|
|
439
456
|
if isinstance(summarized.get("compaction"), dict)
|
|
440
457
|
else None,
|
|
458
|
+
action_duration_ms=_nonnegative_float(summarized.get("action_duration_ms")),
|
|
441
459
|
)
|
|
442
460
|
|
|
443
461
|
|
|
@@ -675,11 +693,15 @@ def _summarize_safe_structured_event(
|
|
|
675
693
|
value = payload.get(key)
|
|
676
694
|
if _is_safe_structured_scalar(value):
|
|
677
695
|
compact[key] = value
|
|
678
|
-
|
|
696
|
+
summary: dict[str, Any] = {
|
|
679
697
|
"label": event_type,
|
|
680
698
|
"text": _jsonish(compact),
|
|
681
699
|
"carry_into_next_turn": True,
|
|
682
700
|
}
|
|
701
|
+
duration_ms = _nonnegative_float(payload.get("duration_ms"))
|
|
702
|
+
if duration_ms is not None:
|
|
703
|
+
summary["action_duration_ms"] = duration_ms
|
|
704
|
+
return summary
|
|
683
705
|
|
|
684
706
|
|
|
685
707
|
def _is_safe_structured_scalar(value: object) -> bool:
|
|
@@ -715,6 +737,7 @@ def _context_entry(
|
|
|
715
737
|
tool_output_omitted: bool = False,
|
|
716
738
|
token_usage: dict[str, Any] | None = None,
|
|
717
739
|
compaction: dict[str, Any] | None = None,
|
|
740
|
+
action_duration_ms: float | None = None,
|
|
718
741
|
) -> dict[str, Any]:
|
|
719
742
|
entry = {
|
|
720
743
|
"line_number": line_number,
|
|
@@ -730,9 +753,79 @@ def _context_entry(
|
|
|
730
753
|
entry["token_usage"] = token_usage
|
|
731
754
|
if compaction:
|
|
732
755
|
entry["compaction"] = compaction
|
|
756
|
+
if action_duration_ms is not None:
|
|
757
|
+
entry["action_timing"] = {
|
|
758
|
+
"reported_duration_ms": _normalize_millisecond_value(action_duration_ms),
|
|
759
|
+
"duration_source": "event.duration_ms",
|
|
760
|
+
}
|
|
733
761
|
return entry
|
|
734
762
|
|
|
735
763
|
|
|
764
|
+
def _annotate_action_timing(entries: list[dict[str, Any]]) -> dict[str, Any]:
|
|
765
|
+
first_ms: float | None = None
|
|
766
|
+
previous_ms: float | None = None
|
|
767
|
+
last_ms: float | None = None
|
|
768
|
+
timed_entries = 0
|
|
769
|
+
slowest_gap_ms = 0.0
|
|
770
|
+
|
|
771
|
+
for entry in entries:
|
|
772
|
+
timestamp_ms = _timestamp_epoch_ms(entry.get("timestamp"))
|
|
773
|
+
if timestamp_ms is None:
|
|
774
|
+
continue
|
|
775
|
+
if first_ms is None:
|
|
776
|
+
first_ms = timestamp_ms
|
|
777
|
+
existing_timing = entry.get("action_timing")
|
|
778
|
+
action_timing = dict(existing_timing) if isinstance(existing_timing, dict) else {}
|
|
779
|
+
action_timing["since_turn_start_ms"] = _duration_between_ms(first_ms, timestamp_ms)
|
|
780
|
+
if previous_ms is not None:
|
|
781
|
+
gap_ms = _duration_between_ms(previous_ms, timestamp_ms)
|
|
782
|
+
action_timing["since_previous_entry_ms"] = gap_ms
|
|
783
|
+
slowest_gap_ms = max(slowest_gap_ms, float(gap_ms))
|
|
784
|
+
action_timing["timestamp_source"] = "entry.timestamp"
|
|
785
|
+
entry["action_timing"] = action_timing
|
|
786
|
+
previous_ms = timestamp_ms
|
|
787
|
+
last_ms = timestamp_ms
|
|
788
|
+
timed_entries += 1
|
|
789
|
+
|
|
790
|
+
total_elapsed_ms = (
|
|
791
|
+
_duration_between_ms(first_ms, last_ms)
|
|
792
|
+
if first_ms is not None and last_ms is not None
|
|
793
|
+
else 0
|
|
794
|
+
)
|
|
795
|
+
return {
|
|
796
|
+
"available": timed_entries > 1,
|
|
797
|
+
"scope": "selected_turn_evidence_entries",
|
|
798
|
+
"source": "entry_timestamps",
|
|
799
|
+
"timed_entry_count": timed_entries,
|
|
800
|
+
"total_elapsed_ms": total_elapsed_ms,
|
|
801
|
+
"slowest_gap_ms": _normalize_millisecond_value(slowest_gap_ms),
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
def _timestamp_epoch_ms(value: object) -> float | None:
|
|
806
|
+
if not isinstance(value, str) or not value.strip():
|
|
807
|
+
return None
|
|
808
|
+
normalized = value.strip()
|
|
809
|
+
if normalized.endswith("Z"):
|
|
810
|
+
normalized = f"{normalized[:-1]}+00:00"
|
|
811
|
+
try:
|
|
812
|
+
parsed = datetime.fromisoformat(normalized)
|
|
813
|
+
except ValueError:
|
|
814
|
+
return None
|
|
815
|
+
if parsed.tzinfo is None:
|
|
816
|
+
parsed = parsed.replace(tzinfo=timezone.utc)
|
|
817
|
+
return parsed.timestamp() * 1000
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
def _duration_between_ms(start_ms: float, end_ms: float) -> int | float:
|
|
821
|
+
return _normalize_millisecond_value(max(0.0, end_ms - start_ms))
|
|
822
|
+
|
|
823
|
+
|
|
824
|
+
def _normalize_millisecond_value(value: float) -> int | float:
|
|
825
|
+
rounded = round(value, 3)
|
|
826
|
+
return int(rounded) if rounded.is_integer() else rounded
|
|
827
|
+
|
|
828
|
+
|
|
736
829
|
def _limit_entries(
|
|
737
830
|
entries: list[dict[str, Any]],
|
|
738
831
|
max_chars: int,
|
|
@@ -977,5 +1070,13 @@ def _nonnegative_int(value: object) -> int | None:
|
|
|
977
1070
|
return number if number >= 0 else None
|
|
978
1071
|
|
|
979
1072
|
|
|
1073
|
+
def _nonnegative_float(value: object) -> float | None:
|
|
1074
|
+
try:
|
|
1075
|
+
number = float(value) # type: ignore[arg-type]
|
|
1076
|
+
except (TypeError, ValueError):
|
|
1077
|
+
return None
|
|
1078
|
+
return number if number >= 0 else None
|
|
1079
|
+
|
|
1080
|
+
|
|
980
1081
|
def _optional_str(value: object) -> str | None:
|
|
981
1082
|
return value if isinstance(value, str) and value else None
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
escapeHtml,
|
|
7
7
|
short,
|
|
8
8
|
formatTimestamp,
|
|
9
|
+
formatDuration,
|
|
9
10
|
t,
|
|
10
11
|
tf,
|
|
11
12
|
moneyText,
|
|
@@ -753,6 +754,31 @@
|
|
|
753
754
|
`;
|
|
754
755
|
}
|
|
755
756
|
|
|
757
|
+
function formatTimingValue(milliseconds) {
|
|
758
|
+
const value = Number(milliseconds);
|
|
759
|
+
if (!Number.isFinite(value) || value < 0) return '';
|
|
760
|
+
return formatDuration(value / 1000, '');
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
function renderContextTimingMeta(entry) {
|
|
764
|
+
const timing = entry?.action_timing || {};
|
|
765
|
+
if (!timing || typeof timing !== 'object') return '';
|
|
766
|
+
const chips = [];
|
|
767
|
+
const sinceStart = formatTimingValue(timing.since_turn_start_ms);
|
|
768
|
+
const sincePrevious = formatTimingValue(timing.since_previous_entry_ms);
|
|
769
|
+
const reportedDuration = formatTimingValue(timing.reported_duration_ms);
|
|
770
|
+
if (sinceStart) {
|
|
771
|
+
chips.push(`<span class="context-entry-timing" title="Elapsed from selected turn start">T+${escapeHtml(sinceStart)}</span>`);
|
|
772
|
+
}
|
|
773
|
+
if (sincePrevious) {
|
|
774
|
+
chips.push(`<span class="context-entry-timing" title="Gap since previous evidence entry">+${escapeHtml(sincePrevious)}</span>`);
|
|
775
|
+
}
|
|
776
|
+
if (reportedDuration) {
|
|
777
|
+
chips.push(`<span class="context-entry-timing duration" title="Duration reported by this event">${escapeHtml(t('table.duration'))} ${escapeHtml(reportedDuration)}</span>`);
|
|
778
|
+
}
|
|
779
|
+
return chips.join('');
|
|
780
|
+
}
|
|
781
|
+
|
|
756
782
|
function contextEntryWindow(entries, payload) {
|
|
757
783
|
const sourceLine = Number(payload?.source?.line_number || 0);
|
|
758
784
|
const selectedIndex = entries.findIndex(entry => sourceLine && Number(entry.line_number || 0) === sourceLine);
|
|
@@ -795,7 +821,11 @@
|
|
|
795
821
|
const entryWindow = contextEntryWindow(entries, payload);
|
|
796
822
|
const body = entries.map((entry, index) => {
|
|
797
823
|
const entryKey = contextEntryKey(entry, index);
|
|
798
|
-
const
|
|
824
|
+
const metaParts = [
|
|
825
|
+
formatTimestamp(entry.timestamp, ''),
|
|
826
|
+
entry.line_number ? tf('context.line', { line: entry.line_number }) : '',
|
|
827
|
+
].filter(Boolean);
|
|
828
|
+
const timingMeta = renderContextTimingMeta(entry);
|
|
799
829
|
const outputAction = entry.tool_output_omitted && !payload.include_tool_output
|
|
800
830
|
? `<button class="context-entry-action" type="button" data-context-entry-load-output>${escapeHtml(t('button.show_tool_output'))}</button>`
|
|
801
831
|
: '';
|
|
@@ -806,7 +836,8 @@
|
|
|
806
836
|
<div class="context-entry-header">
|
|
807
837
|
<span class="context-entry-title">${escapeHtml(entry.label || entry.type || 'entry')}</span>
|
|
808
838
|
<span class="context-entry-meta">
|
|
809
|
-
${
|
|
839
|
+
${metaParts.length ? `<span>${escapeHtml(metaParts.join(' - '))}</span>` : ''}
|
|
840
|
+
${timingMeta}
|
|
810
841
|
${outputAction}
|
|
811
842
|
</span>
|
|
812
843
|
</div>
|
|
@@ -821,7 +852,10 @@
|
|
|
821
852
|
<details class="context-entry context-entry-collapsed" data-context-entry-key="${escapeHtml(entryKey)}">
|
|
822
853
|
<summary class="context-entry-summary">
|
|
823
854
|
<span class="context-entry-title">${escapeHtml(entry.label || entry.type || 'entry')}</span>
|
|
824
|
-
<span class="context-entry-meta"
|
|
855
|
+
<span class="context-entry-meta">
|
|
856
|
+
${metaParts.length ? `<span>${escapeHtml(metaParts.join(' - '))}</span>` : ''}
|
|
857
|
+
${timingMeta}
|
|
858
|
+
</span>
|
|
825
859
|
</summary>
|
|
826
860
|
${bodyHtml}
|
|
827
861
|
</details>
|
|
@@ -271,6 +271,25 @@
|
|
|
271
271
|
margin-left: auto;
|
|
272
272
|
text-align: right;
|
|
273
273
|
}
|
|
274
|
+
.context-entry-timing {
|
|
275
|
+
display: inline-flex;
|
|
276
|
+
align-items: center;
|
|
277
|
+
min-height: 20px;
|
|
278
|
+
padding: 2px 6px;
|
|
279
|
+
border: 1px solid #bfdbfe;
|
|
280
|
+
border-radius: 999px;
|
|
281
|
+
background: #eff6ff;
|
|
282
|
+
color: #1d4ed8;
|
|
283
|
+
font-size: 10px;
|
|
284
|
+
font-weight: 780;
|
|
285
|
+
line-height: 1.2;
|
|
286
|
+
white-space: nowrap;
|
|
287
|
+
}
|
|
288
|
+
.context-entry-timing.duration {
|
|
289
|
+
border-color: #bbf7d0;
|
|
290
|
+
background: #ecfdf5;
|
|
291
|
+
color: #065f46;
|
|
292
|
+
}
|
|
274
293
|
.context-entry-action {
|
|
275
294
|
display: inline-flex;
|
|
276
295
|
align-items: center;
|
|
Binary file
|
|
@@ -133,7 +133,7 @@ codex-usage-tracker serve-dashboard --open</code></pre>
|
|
|
133
133
|
|
|
134
134
|
<h2>Call Investigator</h2>
|
|
135
135
|
<img src="assets/dashboard-call-investigator.png" alt="Call investigator showing exact token accounting, cache/accounting deltas, context estimates, and runtime evidence.">
|
|
136
|
-
<p>Clicking a Calls row opens <code>dashboard.html?view=call&record=<record_id></code> for one model call. It separates exact callback counts, derived previous/next deltas, visible-context estimates, serialized local JSONL upper bounds, candidate serialized-overhead buckets, and redacted evidence loaded at runtime for the selected call. When the localhost context API is enabled, the investigator automatically loads a bounded turn-log evidence window with tool output included; use <code>Hide tool output</code> for a quieter evidence stream, and expand or load older surrounding evidence explicitly when needed. Visible evidence token estimates are calculated from the full selected-turn evidence set before display limiting, using <code>tiktoken</code> when available and a conservative character fallback only when the tokenizer is unavailable. The serialized upper bound tokenizes a redacted raw-JSON representation of the same selected-turn log slice. It can explain why visible text is much smaller than exact uncached input, but it can overcount because local JSONL includes client metadata that may not be prompt text. Bucket labels such as encrypted reasoning/state, local goal metadata, token callback metadata, and rate-limit metadata are counts only; raw text is not returned. <code>encrypted_content</code> is an opaque encrypted field found on some reasoning response items. The tracker cannot decrypt it and treats it as serialized state, not readable prompt, assistant, or tool text. Previous and next buttons move chronologically within the same resolved thread. Cache diagnostics label warm cache reuse, cold resume or stale cache, partial cache miss, uncached spike, and post-compaction without claiming exact cached text spans.</p>
|
|
136
|
+
<p>Clicking a Calls row opens <code>dashboard.html?view=call&record=<record_id></code> for one model call. It separates exact callback counts, derived previous/next deltas, visible-context estimates, serialized local JSONL upper bounds, candidate serialized-overhead buckets, and redacted evidence loaded at runtime for the selected call. When the localhost context API is enabled, the investigator automatically loads a bounded turn-log evidence window with tool output included; use <code>Hide tool output</code> for a quieter evidence stream, and expand or load older surrounding evidence explicitly when needed. Evidence entries include lightweight action timing derived from timestamps already read during that same source-log scan, shown as elapsed time from the selected turn start, gap since the previous evidence entry, and reported event duration when the log provides one. Visible evidence token estimates are calculated from the full selected-turn evidence set before display limiting, using <code>tiktoken</code> when available and a conservative character fallback only when the tokenizer is unavailable. The serialized upper bound tokenizes a redacted raw-JSON representation of the same selected-turn log slice. It can explain why visible text is much smaller than exact uncached input, but it can overcount because local JSONL includes client metadata that may not be prompt text. Bucket labels such as encrypted reasoning/state, local goal metadata, token callback metadata, and rate-limit metadata are counts only; raw text is not returned. <code>encrypted_content</code> is an opaque encrypted field found on some reasoning response items. The tracker cannot decrypt it and treats it as serialized state, not readable prompt, assistant, or tool text. Previous and next buttons move chronologically within the same resolved thread. Cache diagnostics label warm cache reuse, cold resume or stale cache, partial cache miss, uncached spike, and post-compaction without claiming exact cached text spans.</p>
|
|
137
137
|
|
|
138
138
|
<h2>Details And Context</h2>
|
|
139
139
|
<img src="assets/dashboard-details.png" alt="Calls view with a selected usage row and the compact Call Details rail collapsed.">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-usage-tracking
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.1
|
|
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
|
|
@@ -107,6 +107,10 @@ Diagnostics surfaces on-demand snapshot reports for tool output, commands, Git i
|
|
|
107
107
|
|
|
108
108
|

|
|
109
109
|
|
|
110
|
+
The Git Interactions panel expands the safe Git and GitHub CLI operation families without storing command text, branch names, release notes, or patch content.
|
|
111
|
+
|
|
112
|
+

|
|
113
|
+
|
|
110
114
|
Insights still gives a fast triage layer for costly threads, low cache reuse, context bloat, and pricing gaps.
|
|
111
115
|
|
|
112
116
|

|
|
@@ -27,6 +27,7 @@ docs/assets/dashboard-call-investigator.png
|
|
|
27
27
|
docs/assets/dashboard-calls-preview.png
|
|
28
28
|
docs/assets/dashboard-calls.png
|
|
29
29
|
docs/assets/dashboard-details.png
|
|
30
|
+
docs/assets/dashboard-diagnostics-git-expanded.png
|
|
30
31
|
docs/assets/dashboard-diagnostics.png
|
|
31
32
|
docs/assets/dashboard-insights.png
|
|
32
33
|
docs/assets/dashboard-threads.png
|
|
@@ -139,6 +140,7 @@ src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png
|
|
|
139
140
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png
|
|
140
141
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png
|
|
141
142
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png
|
|
143
|
+
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png
|
|
142
144
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png
|
|
143
145
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png
|
|
144
146
|
src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png
|