cc-session-tools 3.10.1__tar.gz → 3.10.2__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 (297) hide show
  1. {cc_session_tools-3.10.1/src/cc_session_tools.egg-info → cc_session_tools-3.10.2}/PKG-INFO +1 -1
  2. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/pyproject.toml +1 -1
  3. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2/src/cc_session_tools.egg-info}/PKG-INFO +1 -1
  4. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/model_info.py +24 -19
  5. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_context_window_warning.py +23 -0
  6. cc_session_tools-3.10.2/tests/test_model_info.py +67 -0
  7. cc_session_tools-3.10.1/tests/test_model_info.py +0 -30
  8. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/LICENSE +0 -0
  9. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/README.md +0 -0
  10. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/setup.cfg +0 -0
  11. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/__init__.py +0 -0
  12. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/__init__.py +0 -0
  13. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccd.py +0 -0
  14. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccmsg.py +0 -0
  15. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccr.py +0 -0
  16. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccs.py +0 -0
  17. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccsched.py +0 -0
  18. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/ccst.py +0 -0
  19. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
  20. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
  21. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
  22. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
  23. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/config/hooks-bundle.json +0 -0
  24. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/config/session-tag-hook.json +0 -0
  25. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/hooks_install.py +0 -0
  26. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/__init__.py +0 -0
  27. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/bun_tools.py +0 -0
  28. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/claude_flags.py +0 -0
  29. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/claude_md_install.py +0 -0
  30. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/context_overrides.py +0 -0
  31. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/db.py +0 -0
  32. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/debug.py +0 -0
  33. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/doctor.py +0 -0
  34. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
  35. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/hook_registry.py +0 -0
  36. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/install_sync.py +0 -0
  37. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/levenshtein.py +0 -0
  38. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/machine_identity.py +0 -0
  39. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
  40. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
  41. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
  42. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/lock.py +0 -0
  43. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/message.py +0 -0
  44. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
  45. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/repository.py +0 -0
  46. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/retention.py +0 -0
  47. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/service.py +0 -0
  48. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/messaging/store.py +0 -0
  49. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/occupancy.py +0 -0
  50. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/paths.py +0 -0
  51. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
  52. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/backup.py +0 -0
  53. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/classify.py +0 -0
  54. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
  55. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/dump.py +0 -0
  56. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
  57. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/importers.py +0 -0
  58. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/init_paths.py +0 -0
  59. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/init_service.py +0 -0
  60. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
  61. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/naming.py +0 -0
  62. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/readiness.py +0 -0
  63. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/rehydrate.py +0 -0
  64. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/rename_group.py +0 -0
  65. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/reorganize.py +0 -0
  66. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/repository.py +0 -0
  67. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/resolve.py +0 -0
  68. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/service.py +0 -0
  69. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
  70. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/store.py +0 -0
  71. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/sync_check.py +0 -0
  72. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/sync_lock.py +0 -0
  73. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/sync_notify.py +0 -0
  74. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/vector_clock.py +0 -0
  75. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/vector_clock_store.py +0 -0
  76. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/verify.py +0 -0
  77. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/pdata/write_log.py +0 -0
  78. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/picker.py +0 -0
  79. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/proc_lock.py +0 -0
  80. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/prompts.py +0 -0
  81. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/roots.py +0 -0
  82. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/rules.py +0 -0
  83. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
  84. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
  85. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
  86. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
  87. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
  88. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/due.py +0 -0
  89. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
  90. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
  91. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
  92. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
  93. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
  94. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
  95. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
  96. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
  97. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/state.py +0 -0
  98. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/store.py +0 -0
  99. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
  100. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
  101. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
  102. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/session_gc.py +0 -0
  103. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/sessions.py +0 -0
  104. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/sessions_db.py +0 -0
  105. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/sessions_repair.py +0 -0
  106. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/shell_install.py +0 -0
  107. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/tasklist.py +0 -0
  108. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/telemetry_store.py +0 -0
  109. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/lib/text_wrap.py +0 -0
  110. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
  111. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/clean-hook-sessions/SKILL.md +0 -0
  112. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/clean-hook-sessions/scripts/clean-hook-sessions.py +0 -0
  113. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/compact-smart/SKILL.md +0 -0
  114. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
  115. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
  116. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
  117. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
  118. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/extract-pptx/SKILL.md +0 -0
  119. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/extract-pptx/scripts/extract_pptx.py +0 -0
  120. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/extract-to-text/SKILL.md +0 -0
  121. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/extract-to-text/scripts/extract_to_text.py +0 -0
  122. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
  123. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
  124. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
  125. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
  126. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
  127. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
  128. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
  129. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
  130. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
  131. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
  132. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-design-schema/SKILL.md +0 -0
  133. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-do-audit-and-prepare-to-migrate/SKILL.md +0 -0
  134. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-do-init/SKILL.md +0 -0
  135. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-do-manual-migration/SKILL.md +0 -0
  136. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-do-update-consuming-skills/SKILL.md +0 -0
  137. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-do-update-project-docs/SKILL.md +0 -0
  138. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-pdata-resolve-conflicts/SKILL.md +0 -0
  139. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-project-layout-reference/SKILL.md +0 -0
  140. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
  141. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
  142. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
  143. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
  144. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
  145. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
  146. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
  147. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
  148. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
  149. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
  150. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/send-session-message/SKILL.md +0 -0
  151. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -0
  152. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +0 -0
  153. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools.egg-info/SOURCES.txt +0 -0
  154. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
  155. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
  156. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools.egg-info/requires.txt +0 -0
  157. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/cc_session_tools.egg-info/top_level.txt +0 -0
  158. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/__init__.py +0 -0
  159. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/attribution.py +0 -0
  160. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/cache.py +0 -0
  161. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/ccusage_wrapper.py +0 -0
  162. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/cli.py +0 -0
  163. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/data/pricing.json +0 -0
  164. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/parent_inference.py +0 -0
  165. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/parser.py +0 -0
  166. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/pricing.py +0 -0
  167. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/query.py +0 -0
  168. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/report.py +0 -0
  169. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/schema.py +0 -0
  170. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/claude_code_usage/session_names.py +0 -0
  171. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/__init__.py +0 -0
  172. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/after_response.py +0 -0
  173. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/bash_hard_deny.py +0 -0
  174. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/bash_security_review.py +0 -0
  175. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/cache.py +0 -0
  176. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/catchup.py +0 -0
  177. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/confirm_8digit.py +0 -0
  178. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/context_window_warning.py +0 -0
  179. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/last_screenshot.py +0 -0
  180. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/marker_allow.py +0 -0
  181. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/markers.py +0 -0
  182. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/messaging_deliver.py +0 -0
  183. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/normalise.py +0 -0
  184. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/pdata_sync.py +0 -0
  185. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/pending_migration.py +0 -0
  186. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/pending_rename.py +0 -0
  187. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/script_allowlist.py +0 -0
  188. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/session_tag.py +0 -0
  189. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/stats.py +0 -0
  190. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/telemetry.py +0 -0
  191. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/telemetry_query.py +0 -0
  192. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/telemetry_trim.py +0 -0
  193. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/transcript.py +0 -0
  194. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/src/hooks/worklog_guard.py +0 -0
  195. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_after_response.py +0 -0
  196. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_attribution.py +0 -0
  197. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_bash_hard_deny.py +0 -0
  198. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_bash_security_review.py +0 -0
  199. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_bash_security_review_allowlist.py +0 -0
  200. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_bun_tools.py +0 -0
  201. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cache.py +0 -0
  202. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cache_sqlite.py +0 -0
  203. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccr_orphans.py +0 -0
  204. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_emptiness.py +0 -0
  205. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_eta.py +0 -0
  206. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_list_mode.py +0 -0
  207. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_scope_flags.py +0 -0
  208. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_sentinel_sort.py +0 -0
  209. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccs_session_counts.py +0 -0
  210. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_bundle_discovery.py +0 -0
  211. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
  212. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_cli.py +0 -0
  213. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_context_override_cli.py +0 -0
  214. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_doctor.py +0 -0
  215. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_gc_prune.py +0 -0
  216. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_gc_report.py +0 -0
  217. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_hook_dispatcher.py +0 -0
  218. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_hooks_allowlist.py +0 -0
  219. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_hooks_install_prune.py +0 -0
  220. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
  221. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_hooks_uninstall.py +0 -0
  222. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_install_everything.py +0 -0
  223. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_machine_identity_cli.py +0 -0
  224. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_main_gate.py +0 -0
  225. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_cli.py +0 -0
  226. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_init_cli.py +0 -0
  227. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_readiness_cli.py +0 -0
  228. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
  229. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_rename_group_cli.py +0 -0
  230. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_reorganize_cli.py +0 -0
  231. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_sync_cli.py +0 -0
  232. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_pdata_verify_cli.py +0 -0
  233. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_repair_sessions_cli.py +0 -0
  234. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_sessions_cli.py +0 -0
  235. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_shell_install.py +0 -0
  236. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_skills_install.py +0 -0
  237. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_skills_uninstall.py +0 -0
  238. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_telemetry_query.py +0 -0
  239. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccst_telemetry_trim.py +0 -0
  240. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_ccusage_wrapper.py +0 -0
  241. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_claude_flags.py +0 -0
  242. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_claude_md_install.py +0 -0
  243. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli.py +0 -0
  244. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli_ccd.py +0 -0
  245. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli_ccd_dry_run.py +0 -0
  246. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli_ccr.py +0 -0
  247. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli_ccs.py +0 -0
  248. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_cli_version.py +0 -0
  249. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_confirm_8digit.py +0 -0
  250. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_context_overrides.py +0 -0
  251. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_db.py +0 -0
  252. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_debug.py +0 -0
  253. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_doctor_mutes.py +0 -0
  254. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_empty_session.py +0 -0
  255. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_hook_cache.py +0 -0
  256. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_hooks_install.py +0 -0
  257. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_hooks_install_records.py +0 -0
  258. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_install_sync.py +0 -0
  259. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_last_screenshot.py +0 -0
  260. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_levenshtein.py +0 -0
  261. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_machine_identity.py +0 -0
  262. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_marker_allow.py +0 -0
  263. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_migrate_ccmsg.py +0 -0
  264. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_migrate_ccsched.py +0 -0
  265. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_migrate_sessions_db.py +0 -0
  266. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_migrate_telemetry.py +0 -0
  267. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_normalise.py +0 -0
  268. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_occupancy.py +0 -0
  269. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_parent_inference.py +0 -0
  270. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_parser.py +0 -0
  271. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_paths.py +0 -0
  272. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_pdata_audit_skill.py +0 -0
  273. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_pdata_post_migration_skills.py +0 -0
  274. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_pending_migration_hook.py +0 -0
  275. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_picker.py +0 -0
  276. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_pricing.py +0 -0
  277. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_proc_lock.py +0 -0
  278. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_prompts.py +0 -0
  279. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_query.py +0 -0
  280. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_report.py +0 -0
  281. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_roots.py +0 -0
  282. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_rules.py +0 -0
  283. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_scheduler_bundled_jobs.py +0 -0
  284. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_schema.py +0 -0
  285. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_script_allowlist.py +0 -0
  286. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_session_names.py +0 -0
  287. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_session_tag.py +0 -0
  288. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_sessions.py +0 -0
  289. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_sessions_db.py +0 -0
  290. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_sessions_db_migration_chain.py +0 -0
  291. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_sessions_repair.py +0 -0
  292. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_tasklist.py +0 -0
  293. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_telemetry.py +0 -0
  294. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_telemetry_store.py +0 -0
  295. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_text_wrap.py +0 -0
  296. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_transcript.py +0 -0
  297. {cc_session_tools-3.10.1 → cc_session_tools-3.10.2}/tests/test_worklog_guard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 3.10.1
3
+ Version: 3.10.2
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)
5
5
  Author: raffishquartan
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cc-session-tools"
7
- version = "3.10.1"
7
+ version = "3.10.2"
8
8
  description = "Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 3.10.1
3
+ Version: 3.10.2
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)
5
5
  Author: raffishquartan
6
6
  License: MIT License
@@ -5,8 +5,8 @@ source of truth this table is migrating from). Consumed by
5
5
  context_window_warning to phrase its nudge in terms of "% of the model's
6
6
  actual window" and to estimate a per-model cache-read cost.
7
7
 
8
- Figures current as of 2026-08-13 (Claude 5 family). Context windows: Fable 5 /
9
- Mythos 5 / Opus 5 / Opus 4.6-4.8 / Sonnet 5 / Sonnet 4.6 all 1,000,000 tokens
8
+ Figures current as of 2026-09-29 (Claude 5 family; 5.5/5.1 ids added). Context windows: Fable 5 /
9
+ Mythos 5 / Opus 5 / Opus 4.6-4.8 / Sonnet 5 / Sonnet 5.5 / Opus 5.5 / Fable 5.1 / Sonnet 4.6 all 1,000,000 tokens
10
10
  (the default, not a beta long-context mode); Haiku 4.5 stays at 200,000.
11
11
  Prices are the standard (non-cached) input rate per million tokens.
12
12
 
@@ -25,50 +25,55 @@ design spec's section 2.
25
25
  """
26
26
  from __future__ import annotations
27
27
 
28
+ import re
29
+
28
30
  _WINDOW_1M = {
29
31
  "claude-fable-5", "claude-mythos-5",
30
32
  "claude-opus-5", "claude-opus-4-8", "claude-opus-4-7", "claude-opus-4-6",
31
33
  "claude-sonnet-5", "claude-sonnet-4-6",
34
+ "claude-sonnet-5-5", "claude-opus-5-5", "claude-fable-5-1",
32
35
  }
33
36
  _PRICE = {
34
37
  "claude-fable-5": 10.00, "claude-mythos-5": 10.00,
35
38
  "claude-opus-5": 5.00, "claude-opus-4-8": 5.00, "claude-opus-4-7": 5.00, "claude-opus-4-6": 5.00,
36
39
  "claude-sonnet-5": 3.00, "claude-sonnet-4-6": 3.00,
40
+ # Assumed equal to the family's existing price (no published figure for these ids); the
41
+ # price only feeds the rough "~$/turn in cache reads" estimate.
42
+ "claude-sonnet-5-5": 3.00, "claude-opus-5-5": 5.00, "claude-fable-5-1": 10.00,
43
+ "claude-haiku-4-5": 1.00,
37
44
  }
38
45
  _NAME = {
39
46
  "claude-fable-5": "Fable 5", "claude-mythos-5": "Mythos 5",
40
47
  "claude-opus-5": "Opus 5", "claude-opus-4-8": "Opus 4.8",
41
48
  "claude-opus-4-7": "Opus 4.7", "claude-opus-4-6": "Opus 4.6",
42
49
  "claude-sonnet-5": "Sonnet 5", "claude-sonnet-4-6": "Sonnet 4.6",
50
+ "claude-sonnet-5-5": "Sonnet 5.5", "claude-opus-5-5": "Opus 5.5",
51
+ "claude-fable-5-1": "Fable 5.1", "claude-haiku-4-5": "Haiku 4.5",
43
52
  }
44
53
  _DEFAULT_WINDOW = 200_000
45
54
  _DEFAULT_PRICE = 5.00
46
55
  _DEFAULT_NAME = "an unrecognized model"
47
56
 
48
57
 
49
- def _is_haiku_4_5(model_id: str) -> bool:
50
- return model_id.startswith("claude-haiku-4-5")
58
+ _DATED_SNAPSHOT = re.compile(r"(.+)-\d{8}")
59
+
60
+
61
+ def _canonical(model_id: str) -> str:
62
+ """A dated snapshot id (`<id>-YYYYMMDD`) resolves to its undated row. Applied once, and
63
+ only for an exactly-eight-digit suffix: any other suffix (or a snapshot of an unknown id)
64
+ stays unrecognised. `[1m]`/`-latest` are not handled - transcripts' `message.model` never
65
+ carries them."""
66
+ match = _DATED_SNAPSHOT.fullmatch(model_id)
67
+ return match.group(1) if match else model_id
51
68
 
52
69
 
53
70
  def context_window(model_id: str) -> int:
54
- if model_id in _WINDOW_1M:
55
- return 1_000_000
56
- if _is_haiku_4_5(model_id):
57
- return 200_000
58
- return _DEFAULT_WINDOW
71
+ return 1_000_000 if _canonical(model_id) in _WINDOW_1M else _DEFAULT_WINDOW
59
72
 
60
73
 
61
74
  def input_price_per_mtok(model_id: str) -> float:
62
- if model_id in _PRICE:
63
- return _PRICE[model_id]
64
- if _is_haiku_4_5(model_id):
65
- return 1.00
66
- return _DEFAULT_PRICE
75
+ return _PRICE.get(_canonical(model_id), _DEFAULT_PRICE)
67
76
 
68
77
 
69
78
  def display_name(model_id: str) -> str:
70
- if model_id in _NAME:
71
- return _NAME[model_id]
72
- if _is_haiku_4_5(model_id):
73
- return "Haiku 4.5"
74
- return _DEFAULT_NAME
79
+ return _NAME.get(_canonical(model_id), _DEFAULT_NAME)
@@ -180,3 +180,26 @@ def test_override_end_to_end_via_real_store(tmp_path, monkeypatch, capsys):
180
180
  out = capsys.readouterr()
181
181
  assert rc == 0
182
182
  assert out.out == ""
183
+
184
+
185
+ @pytest.mark.parametrize(
186
+ ("model_id", "name", "cost"),
187
+ [
188
+ ("claude-sonnet-5-5", "Sonnet 5.5", "0.07"),
189
+ ("claude-opus-5-5", "Opus 5.5", "0.13"),
190
+ ("claude-fable-5-1", "Fable 5.1", "0.26"),
191
+ ],
192
+ )
193
+ def test_new_5x_models_are_measured_against_their_one_million_token_window(
194
+ tmp_path, monkeypatch, capsys, model_id, name, cost
195
+ ):
196
+ p = tmp_path / "t.jsonl"
197
+ _write_transcript(p, [{"type": "assistant", "message": {"model": model_id,
198
+ "usage": {"input_tokens": 266000, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0}}}])
199
+ monkeypatch.setattr(cww, "_is_overridden", lambda session_id: False)
200
+ rc, out = _run_main(monkeypatch, capsys, {"transcript_path": str(p), "session_id": "s1"})
201
+ reason = json.loads(out.out)["reason"]
202
+ assert "~27% of the 1M-token window" in reason
203
+ assert name in reason
204
+ assert f"~${cost}/turn" in reason
205
+ assert "unrecognized" not in reason
@@ -0,0 +1,67 @@
1
+ from hooks import model_info
2
+
3
+ CASES = [
4
+ ("claude-fable-5", 1_000_000, 10.00, "Fable 5"),
5
+ ("claude-mythos-5", 1_000_000, 10.00, "Mythos 5"),
6
+ ("claude-opus-5", 1_000_000, 5.00, "Opus 5"),
7
+ ("claude-opus-4-8", 1_000_000, 5.00, "Opus 4.8"),
8
+ ("claude-opus-4-7", 1_000_000, 5.00, "Opus 4.7"),
9
+ ("claude-opus-4-6", 1_000_000, 5.00, "Opus 4.6"),
10
+ ("claude-sonnet-5", 1_000_000, 3.00, "Sonnet 5"),
11
+ ("claude-sonnet-4-6", 1_000_000, 3.00, "Sonnet 4.6"),
12
+ ("claude-sonnet-5-5", 1_000_000, 3.00, "Sonnet 5.5"),
13
+ ("claude-opus-5-5", 1_000_000, 5.00, "Opus 5.5"),
14
+ ("claude-fable-5-1", 1_000_000, 10.00, "Fable 5.1"),
15
+ ("claude-haiku-4-5-20251001", 200_000, 1.00, "Haiku 4.5"),
16
+ ]
17
+
18
+
19
+ def test_known_models():
20
+ for model_id, window, price, name in CASES:
21
+ assert model_info.context_window(model_id) == window
22
+ assert model_info.input_price_per_mtok(model_id) == price
23
+ assert model_info.display_name(model_id) == name
24
+
25
+
26
+ def test_unrecognized_model_falls_back():
27
+ assert model_info.context_window("claude-nonexistent-9") == 200_000
28
+ assert model_info.input_price_per_mtok("claude-nonexistent-9") == 5.00
29
+ assert model_info.display_name("claude-nonexistent-9") == "an unrecognized model"
30
+
31
+
32
+ def test_empty_model_id_falls_back():
33
+ assert model_info.context_window("") == 200_000
34
+
35
+
36
+ def test_dated_snapshot_ids_resolve_like_their_family_id():
37
+ """Claude Code can report a dated snapshot id (`<family>-YYYYMMDD`); it must resolve to the
38
+ same row as the undated id, not fall to the 200k default."""
39
+ for base, window, price, name in CASES:
40
+ if base.startswith("claude-haiku"):
41
+ continue
42
+ dated = f"{base}-20261001"
43
+ assert model_info.context_window(dated) == window
44
+ assert model_info.input_price_per_mtok(dated) == price
45
+ assert model_info.display_name(dated) == name
46
+
47
+
48
+ def test_unknown_dated_and_decorated_ids_stay_unrecognised():
49
+ for model_id in (
50
+ "claude-sonnet-5-9-20261001",
51
+ "claude-nonexistent-9-20261001",
52
+ "claude-sonnet-5-5-2026100", # 7 digits
53
+ "claude-sonnet-5-5-202610011", # 9 digits
54
+ "claude-sonnet-5-5-latest",
55
+ "claude-sonnet-5-5[1m]",
56
+ "claude-sonnet-5-5-20261001-20261002", # normalised once only
57
+ "claude-haiku-4-5-garbage",
58
+ ):
59
+ assert model_info.context_window(model_id) == 200_000, model_id
60
+ assert model_info.display_name(model_id) == "an unrecognized model", model_id
61
+
62
+
63
+ def test_id_that_merely_starts_with_a_known_id_is_not_recognised():
64
+ """Guards against a future lazy prefix implementation (already true before the fix):
65
+ `claude-sonnet-5-9` must not inherit `claude-sonnet-5`'s row."""
66
+ assert model_info.context_window("claude-sonnet-5-9") == 200_000
67
+ assert model_info.display_name("claude-sonnet-5-9") == "an unrecognized model"
@@ -1,30 +0,0 @@
1
- from hooks import model_info
2
-
3
- CASES = [
4
- ("claude-fable-5", 1_000_000, 10.00, "Fable 5"),
5
- ("claude-mythos-5", 1_000_000, 10.00, "Mythos 5"),
6
- ("claude-opus-5", 1_000_000, 5.00, "Opus 5"),
7
- ("claude-opus-4-8", 1_000_000, 5.00, "Opus 4.8"),
8
- ("claude-opus-4-7", 1_000_000, 5.00, "Opus 4.7"),
9
- ("claude-opus-4-6", 1_000_000, 5.00, "Opus 4.6"),
10
- ("claude-sonnet-5", 1_000_000, 3.00, "Sonnet 5"),
11
- ("claude-sonnet-4-6", 1_000_000, 3.00, "Sonnet 4.6"),
12
- ("claude-haiku-4-5-20251001", 200_000, 1.00, "Haiku 4.5"),
13
- ]
14
-
15
-
16
- def test_known_models():
17
- for model_id, window, price, name in CASES:
18
- assert model_info.context_window(model_id) == window
19
- assert model_info.input_price_per_mtok(model_id) == price
20
- assert model_info.display_name(model_id) == name
21
-
22
-
23
- def test_unrecognized_model_falls_back():
24
- assert model_info.context_window("claude-nonexistent-9") == 200_000
25
- assert model_info.input_price_per_mtok("claude-nonexistent-9") == 5.00
26
- assert model_info.display_name("claude-nonexistent-9") == "an unrecognized model"
27
-
28
-
29
- def test_empty_model_id_falls_back():
30
- assert model_info.context_window("") == 200_000