codex-usage-tracking 0.11.3__tar.gz → 0.11.4__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.
Files changed (197) hide show
  1. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/.codex-plugin/plugin.json +1 -1
  2. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/CHANGELOG.md +5 -0
  3. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/PKG-INFO +1 -1
  4. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/development.md +7 -7
  5. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/one-dot-oh-readiness.md +8 -8
  6. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/pyproject.toml +1 -1
  7. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/skills/codex-usage-tracker/scripts/run_mcp.py +2 -2
  8. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/__init__.py +1 -1
  9. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/store.py +9 -5
  10. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/PKG-INFO +1 -1
  11. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/SOURCES.txt +1 -0
  12. codex_usage_tracking-0.11.4/tests/test_store_large_batches.py +94 -0
  13. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/.mcp.json +0 -0
  14. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/AGENTS.md +0 -0
  15. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/CONTRIBUTING.md +0 -0
  16. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/LICENSE +0 -0
  17. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/MANIFEST.in +0 -0
  18. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/README.md +0 -0
  19. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/SECURITY.md +0 -0
  20. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/assets/icon.svg +0 -0
  21. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/architecture.md +0 -0
  22. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-call-investigator-evidence.png +0 -0
  23. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-call-investigator-preview.png +0 -0
  24. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-call-investigator.png +0 -0
  25. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-calls-preview.png +0 -0
  26. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-calls.png +0 -0
  27. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-details.png +0 -0
  28. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
  29. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-diagnostics.png +0 -0
  30. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-insights.png +0 -0
  31. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/dashboard-threads.png +0 -0
  32. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/plugin-prompts.png +0 -0
  33. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/plugin-thread-leaderboard.png +0 -0
  34. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/ux/call-detail-panel.png +0 -0
  35. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/ux/insight-overview.png +0 -0
  36. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/assets/ux/thread-investigation.png +0 -0
  37. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/call-drilldown-performance-checklist.md +0 -0
  38. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/cli-json-schemas.md +0 -0
  39. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/cli-reference.md +0 -0
  40. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/dashboard-guide.md +0 -0
  41. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/install.md +0 -0
  42. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/mcp.md +0 -0
  43. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/pricing-and-credits.md +0 -0
  44. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/privacy.md +0 -0
  45. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/ui-ux-improvement-plan.md +0 -0
  46. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/docs/usage-drain-modeling.md +0 -0
  47. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/scripts/benchmark_synthetic_history.py +0 -0
  48. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/scripts/check_release.py +0 -0
  49. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/scripts/install_local_plugin.py +0 -0
  50. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/scripts/model_usage_drain.py +0 -0
  51. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/scripts/smoke_installed_package.py +0 -0
  52. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/setup.cfg +0 -0
  53. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/skills/codex-usage-api/SKILL.md +0 -0
  54. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/skills/codex-usage-tracker/SKILL.md +0 -0
  55. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/__main__.py +0 -0
  56. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/allowance.py +0 -0
  57. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/api_payloads.py +0 -0
  58. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/call_origin.py +0 -0
  59. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/cli.py +0 -0
  60. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/cli_parser.py +0 -0
  61. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/context.py +0 -0
  62. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/costing.py +0 -0
  63. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/dashboard.py +0 -0
  64. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_facts.py +0 -0
  65. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_reports.py +0 -0
  66. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_analysis.py +0 -0
  67. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_concentration.py +0 -0
  68. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_constants.py +0 -0
  69. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_events.py +0 -0
  70. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_report.py +0 -0
  71. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshot_rows.py +0 -0
  72. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostic_snapshots.py +0 -0
  73. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/diagnostics.py +0 -0
  74. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/formatting.py +0 -0
  75. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/i18n.py +0 -0
  76. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/json_contracts.py +0 -0
  77. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/mcp_server.py +0 -0
  78. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/models.py +0 -0
  79. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/parser.py +0 -0
  80. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/paths.py +0 -0
  81. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/__init__.py +0 -0
  82. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/assets/icon.svg +0 -0
  83. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.css +0 -0
  84. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.js +0 -0
  85. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_actions.js +0 -0
  86. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_analysis.js +0 -0
  87. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call.css +0 -0
  88. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_diagnostics.js +0 -0
  89. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_call_investigator.js +0 -0
  90. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_cells.js +0 -0
  91. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_data.js +0 -0
  92. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_detail.css +0 -0
  93. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_details.js +0 -0
  94. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics.js +0 -0
  95. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_facts.js +0 -0
  96. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_diagnostics_snapshots.js +0 -0
  97. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_events.js +0 -0
  98. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_filters.js +0 -0
  99. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_format.js +0 -0
  100. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_i18n.js +0 -0
  101. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.css +0 -0
  102. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_insights.js +0 -0
  103. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_layout.css +0 -0
  104. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_live.js +0 -0
  105. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_payload_cache.js +0 -0
  106. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_responsive.css +0 -0
  107. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_state.js +0 -0
  108. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_status.js +0 -0
  109. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.css +0 -0
  110. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tables.js +0 -0
  111. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_template.html +0 -0
  112. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_tooltips.js +0 -0
  113. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/ar.json +0 -0
  114. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/de.json +0 -0
  115. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/en.json +0 -0
  116. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/es.json +0 -0
  117. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/fr.json +0 -0
  118. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/it.json +0 -0
  119. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/ja.json +0 -0
  120. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/ko.json +0 -0
  121. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/pt.json +0 -0
  122. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/ru.json +0 -0
  123. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/vi.json +0 -0
  124. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/dashboard/locales/zh-Hans.json +0 -0
  125. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-evidence.png +0 -0
  126. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator-preview.png +0 -0
  127. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-call-investigator.png +0 -0
  128. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls-preview.png +0 -0
  129. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png +0 -0
  130. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png +0 -0
  131. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics-git-expanded.png +0 -0
  132. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-diagnostics.png +0 -0
  133. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png +0 -0
  134. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png +0 -0
  135. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-prompts.png +0 -0
  136. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/assets/plugin-thread-leaderboard.png +0 -0
  137. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/docs/dashboard-guide.html +0 -0
  138. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/rate_cards/codex-credit-rates.json +0 -0
  139. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/skills/codex-usage-api/SKILL.md +0 -0
  140. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_data/skills/codex-usage-tracker/SKILL.md +0 -0
  141. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/plugin_installer.py +0 -0
  142. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/pricing.py +0 -0
  143. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/pricing_config.py +0 -0
  144. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/pricing_estimates.py +0 -0
  145. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/pricing_openai.py +0 -0
  146. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/projects.py +0 -0
  147. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/recommendations.py +0 -0
  148. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/redaction.py +0 -0
  149. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/reports.py +0 -0
  150. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/schema.py +0 -0
  151. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/server.py +0 -0
  152. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/server_utils.py +0 -0
  153. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/store_query_sql.py +0 -0
  154. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/store_schema.py +0 -0
  155. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/store_sources.py +0 -0
  156. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/store_thread_summaries.py +0 -0
  157. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/support.py +0 -0
  158. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/threads.py +0 -0
  159. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/usage_drain_model.py +0 -0
  160. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/usage_drain_reports.py +0 -0
  161. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracker/usage_drain_time_series.py +0 -0
  162. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/dependency_links.txt +0 -0
  163. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/entry_points.txt +0 -0
  164. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/requires.txt +0 -0
  165. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/src/codex_usage_tracking.egg-info/top_level.txt +0 -0
  166. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/store_dashboard_helpers.py +0 -0
  167. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_allowance.py +0 -0
  168. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_call_origin.py +0 -0
  169. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_cli_lifecycle.py +0 -0
  170. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_cli_release.py +0 -0
  171. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_context_evidence.py +0 -0
  172. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_data.py +0 -0
  173. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_diagnostics_snapshots.py +0 -0
  174. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_live.py +0 -0
  175. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_payload.py +0 -0
  176. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_server.py +0 -0
  177. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_state.py +0 -0
  178. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_dashboard_status.py +0 -0
  179. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_diagnostic_snapshots.py +0 -0
  180. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_i18n.py +0 -0
  181. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_json_contracts.py +0 -0
  182. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_mcp_integration.py +0 -0
  183. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_mcp_launcher.py +0 -0
  184. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_parser.py +0 -0
  185. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_plugin_installer.py +0 -0
  186. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_pricing.py +0 -0
  187. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_privacy.py +0 -0
  188. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_projects.py +0 -0
  189. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_recommendations.py +0 -0
  190. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_redaction.py +0 -0
  191. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_schema.py +0 -0
  192. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_store_dashboard_mcp.py +0 -0
  193. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_store_migrations.py +0 -0
  194. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_support.py +0 -0
  195. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_threads.py +0 -0
  196. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_usage_drain_model.py +0 -0
  197. {codex_usage_tracking-0.11.3 → codex_usage_tracking-0.11.4}/tests/test_usage_drain_reports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-usage-tracker",
3
- "version": "0.11.3",
3
+ "version": "0.11.4",
4
4
  "description": "Unofficial local tracker for aggregate Codex token usage from local session logs.",
5
5
  "author": {
6
6
  "name": "Douglas Monsky"
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.11.4 - 2026-06-27
6
+
7
+ - Fix `codex-usage-tracker setup` on large local histories by batching stale diagnostic-fact deletes so SQLite does not exceed bound-variable limits during usage index refresh.
8
+ - Add synthetic regression coverage for large diagnostic fact refreshes under a low SQLite variable ceiling. Thanks to `@gevikhn` for the Windows setup failure report.
9
+
5
10
  ## 0.11.3 - 2026-06-23
6
11
 
7
12
  - Fix Windows `serve-dashboard` asset loading by forcing JavaScript, CSS, JSON, and SVG MIME types in the localhost server instead of trusting OS registry MIME mappings.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-usage-tracking
3
- Version: 0.11.3
3
+ Version: 0.11.4
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
@@ -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.11.3
41
+ release/0.11.4
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.11.3
94
+ 0.11.4
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.11.3
150
- python scripts/smoke_installed_package.py --docker --from-pypi --version 0.11.3
149
+ python scripts/smoke_installed_package.py --from-pypi --version 0.11.4
150
+ python scripts/smoke_installed_package.py --docker --from-pypi --version 0.11.4
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.11.3 -m "codex-usage-tracker 0.11.3"
298
- git push origin v0.11.3
297
+ git tag -a v0.11.4 -m "codex-usage-tracker 0.11.4"
298
+ git push origin v0.11.4
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. Patch release `0.10.1` adds lightweight action timing to context evidence and ships the synthetic Git Interactions README screenshot. Minor release `0.11.0` adds usage-drain diagnostic reports, projected weekly credit charts, and cumulative thread cost curves. Patch release `0.11.1` improves the Diagnostics weekly projection table and stale snapshot reload controls. Patch release `0.11.2` fixes served dashboard shell hydration and hardens the synthetic source-log benchmark smoke test. Patch release `0.11.3` fixes Windows live dashboard asset MIME handling.
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. Minor release `0.11.0` adds usage-drain diagnostic reports, projected weekly credit charts, and cumulative thread cost curves. Patch release `0.11.1` improves the Diagnostics weekly projection table and stale snapshot reload controls. Patch release `0.11.2` fixes served dashboard shell hydration and hardens the synthetic source-log benchmark smoke test. Patch release `0.11.3` fixes Windows live dashboard asset MIME handling. Patch release `0.11.4` fixes large-history setup refresh failures from SQLite variable limits.
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.11.3`: `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.11.3`: `python -m venv /tmp/codex-usage-pypi-smoke && . /tmp/codex-usage-pypi-smoke/bin/activate && python -m pip install codex-usage-tracking==0.11.3 && codex-usage-tracker --version`.
29
- - [x] Verify public pipx install path for `0.11.3`: `PIPX_HOME=/tmp/codex-usage-pipx-home PIPX_BIN_DIR=/tmp/codex-usage-pipx-bin pipx install codex-usage-tracking==0.11.3 && /tmp/codex-usage-pipx-bin/codex-usage-tracker --version`.
27
+ - [x] Verify the current public PyPI version is visible as `0.11.4`: `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.11.4`: `python -m venv /tmp/codex-usage-pypi-smoke && . /tmp/codex-usage-pypi-smoke/bin/activate && python -m pip install codex-usage-tracking==0.11.4 && codex-usage-tracker --version`.
29
+ - [x] Verify public pipx install path for `0.11.4`: `PIPX_HOME=/tmp/codex-usage-pipx-home PIPX_BIN_DIR=/tmp/codex-usage-pipx-bin pipx install codex-usage-tracking==0.11.4 && /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.11.3`.
32
+ - [x] Verify public PyPI package in Docker: `python scripts/smoke_installed_package.py --docker --from-pypi --version 0.11.4`.
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.11.3`; all repo tests use synthetic or aggregate-only data.
137
+ These references are the concrete proof behind completed checklist items. Public package smoke commands are version-specific to `0.11.4`; 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.11.3`.
144
+ - Public PyPI Docker coverage is proven by `scripts/smoke_installed_package.py --docker --from-pypi --version 0.11.4`.
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.11.3`.
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.11.3`.
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.11.4`.
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.11.4`.
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.11.3"
7
+ version = "0.11.4"
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"
@@ -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.11.3",
18
+ "codex-usage-tracking==0.11.4",
19
19
  )
20
- RUNTIME_VERSION = "0.11.3"
20
+ RUNTIME_VERSION = "0.11.4"
21
21
  PACKAGE_SPEC_MARKER = ".codex-usage-tracker-package-spec"
22
22
  MODULE_CHECK = (
23
23
  "import importlib.metadata; "
@@ -2,6 +2,6 @@
2
2
 
3
3
  from codex_usage_tracker.models import UsageEvent
4
4
 
5
- __version__ = "0.11.3"
5
+ __version__ = "0.11.4"
6
6
 
7
7
  __all__ = ["UsageEvent", "__version__"]
@@ -53,6 +53,7 @@ EVENT_COLUMNS = list(USAGE_EVENT_COLUMN_NAMES)
53
53
  DIAGNOSTIC_FACT_COLUMNS = list(DIAGNOSTIC_FACT_COLUMN_NAMES)
54
54
  __all__ = ["EVENT_COLUMNS", "SCHEMA_VERSION", "SchemaMigrationError", "init_db"]
55
55
  OBSERVED_USAGE_RECONCILIATION_THRESHOLD = 3
56
+ SQLITE_VARIABLE_BATCH_SIZE = 500
56
57
  USAGE_TIMING_SELECT_SQL = """
57
58
  previous_usage.event_timestamp AS previous_call_event_timestamp,
58
59
  previous_usage.session_id AS previous_call_session_id,
@@ -436,11 +437,14 @@ def _delete_diagnostic_facts_for_record_ids(
436
437
  ) -> None:
437
438
  if not record_ids:
438
439
  return
439
- placeholders = ", ".join("?" for _record_id in record_ids)
440
- conn.execute(
441
- f"DELETE FROM call_diagnostic_facts WHERE record_id IN ({placeholders})",
442
- record_ids,
443
- )
440
+ unique_record_ids = list(dict.fromkeys(record_ids))
441
+ for start in range(0, len(unique_record_ids), SQLITE_VARIABLE_BATCH_SIZE):
442
+ chunk = unique_record_ids[start : start + SQLITE_VARIABLE_BATCH_SIZE]
443
+ placeholders = ", ".join("?" for _record_id in chunk)
444
+ conn.execute(
445
+ f"DELETE FROM call_diagnostic_facts WHERE record_id IN ({placeholders})",
446
+ chunk,
447
+ )
444
448
 
445
449
 
446
450
  def _insert_diagnostic_facts(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-usage-tracking
3
- Version: 0.11.3
3
+ Version: 0.11.4
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
@@ -187,6 +187,7 @@ tests/test_recommendations.py
187
187
  tests/test_redaction.py
188
188
  tests/test_schema.py
189
189
  tests/test_store_dashboard_mcp.py
190
+ tests/test_store_large_batches.py
190
191
  tests/test_store_migrations.py
191
192
  tests/test_support.py
192
193
  tests/test_threads.py
@@ -0,0 +1,94 @@
1
+ from __future__ import annotations
2
+
3
+ import sqlite3
4
+ from collections.abc import Iterator
5
+ from contextlib import contextmanager
6
+ from datetime import datetime, timedelta, timezone
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ import pytest
11
+ from store_dashboard_helpers import SESSION_ID, _usage_event
12
+
13
+ from codex_usage_tracker import store
14
+ from codex_usage_tracker.models import DiagnosticFact
15
+ from codex_usage_tracker.store import connect, upsert_usage_events
16
+
17
+
18
+ class _LimitedVariableConnection:
19
+ def __init__(self, conn: sqlite3.Connection, *, max_variables: int) -> None:
20
+ self._conn = conn
21
+ self._max_variables = max_variables
22
+
23
+ def execute(self, sql: str, parameters: Any = (), /) -> sqlite3.Cursor:
24
+ if _parameter_count(parameters) > self._max_variables:
25
+ raise sqlite3.OperationalError("too many SQL variables")
26
+ return self._conn.execute(sql, parameters)
27
+
28
+ def executemany(self, sql: str, parameters: Any, /) -> sqlite3.Cursor:
29
+ return self._conn.executemany(sql, parameters)
30
+
31
+ def __getattr__(self, name: str) -> Any:
32
+ return getattr(self._conn, name)
33
+
34
+
35
+ def _parameter_count(parameters: Any) -> int:
36
+ if parameters is None:
37
+ return 0
38
+ try:
39
+ return len(parameters)
40
+ except TypeError:
41
+ return 0
42
+
43
+
44
+ def test_upsert_usage_events_batches_diagnostic_fact_deletes(
45
+ tmp_path: Path,
46
+ monkeypatch: pytest.MonkeyPatch,
47
+ ) -> None:
48
+ db_path = tmp_path / "usage.sqlite3"
49
+
50
+ @contextmanager
51
+ def limited_connect(db_path: Path) -> Iterator[_LimitedVariableConnection]:
52
+ with connect(db_path) as conn:
53
+ yield _LimitedVariableConnection(conn, max_variables=600)
54
+
55
+ monkeypatch.setattr(store, "connect", limited_connect)
56
+
57
+ base_timestamp = datetime(2026, 5, 17, 18, 0, tzinfo=timezone.utc)
58
+ events = [
59
+ _usage_event(
60
+ record_id=f"issue-69-record-{index:04d}",
61
+ session_id=SESSION_ID,
62
+ thread_key="thread:issue-69",
63
+ event_timestamp=(base_timestamp + timedelta(seconds=index))
64
+ .isoformat()
65
+ .replace("+00:00", "Z"),
66
+ cumulative_total_tokens=index + 1,
67
+ )
68
+ for index in range(1200)
69
+ ]
70
+ diagnostic_facts = [
71
+ DiagnosticFact(
72
+ record_id=event.record_id,
73
+ fact_type="function",
74
+ fact_name="exec_command",
75
+ fact_category="function",
76
+ )
77
+ for event in events
78
+ ]
79
+
80
+ upsert_usage_events(
81
+ events,
82
+ db_path=db_path,
83
+ refresh_links=False,
84
+ diagnostic_facts=diagnostic_facts,
85
+ )
86
+ assert _diagnostic_fact_row_count(db_path) == 1200
87
+
88
+ upsert_usage_events(events, db_path=db_path, refresh_links=False)
89
+ assert _diagnostic_fact_row_count(db_path) == 0
90
+
91
+
92
+ def _diagnostic_fact_row_count(db_path: Path) -> int:
93
+ with connect(db_path) as conn:
94
+ return int(conn.execute("SELECT COUNT(*) FROM call_diagnostic_facts").fetchone()[0])