cc-transcript 14.32.0__tar.gz → 14.32.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.
Files changed (188) hide show
  1. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/PKG-INFO +1 -1
  2. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/pyproject.toml +1 -1
  3. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot.rs +47 -19
  4. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_projection.rs +161 -90
  5. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/Cargo.lock +0 -0
  6. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/Cargo.toml +0 -0
  7. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/LICENSE +0 -0
  8. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/README.md +0 -0
  9. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/__init__.py +0 -0
  10. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/__init__.pyi +0 -0
  11. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/_native.pyi +0 -0
  12. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/activity.py +0 -0
  13. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/activity_probe.py +0 -0
  14. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/builders.py +0 -0
  15. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/codex.py +0 -0
  16. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/command.py +0 -0
  17. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/context.py +0 -0
  18. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/corrections.py +0 -0
  19. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/cost.py +0 -0
  20. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/decision_store.py +0 -0
  21. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/decisions.py +0 -0
  22. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/discovery.py +0 -0
  23. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/disktruth.py +0 -0
  24. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/evidence.py +0 -0
  25. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/extract/__init__.py +0 -0
  26. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/extract/correct.py +0 -0
  27. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/facts.py +0 -0
  28. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/filterspec.py +0 -0
  29. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/heartbeats.py +0 -0
  30. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/ids.py +0 -0
  31. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/judge/__init__.py +0 -0
  32. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/judge/llm.py +0 -0
  33. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/judge/similar.py +0 -0
  34. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/judge/verdicts.py +0 -0
  35. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/ledger.py +0 -0
  36. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/literals.py +0 -0
  37. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/__init__.py +0 -0
  38. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/candidates.py +0 -0
  39. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/confidence.py +0 -0
  40. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/engine.py +0 -0
  41. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/formats.py +0 -0
  42. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/sampling.py +0 -0
  43. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/signals.py +0 -0
  44. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/sourcekind.py +0 -0
  45. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/spec.py +0 -0
  46. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/mining/store.py +0 -0
  47. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/models.py +0 -0
  48. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/nlp.py +0 -0
  49. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/notifications.py +0 -0
  50. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/parser.py +0 -0
  51. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/py.typed +0 -0
  52. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/query.py +0 -0
  53. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/render.py +0 -0
  54. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/__init__.py +0 -0
  55. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/buckets.py +0 -0
  56. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  57. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  58. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  59. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/engine.py +0 -0
  60. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/lexicon.py +0 -0
  61. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/sentiment/scorespec.py +0 -0
  62. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  63. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  64. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/request.schema.json +0 -0
  65. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  66. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  67. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/snapshots.py +0 -0
  68. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/synthetic.py +0 -0
  69. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/tools.py +0 -0
  70. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/cc_transcript/watch.py +0 -0
  71. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/Cargo.toml +0 -0
  72. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/blame.rs +0 -0
  73. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/corpus.rs +0 -0
  74. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/corrections.rs +0 -0
  75. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/digest.rs +0 -0
  76. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/facts.rs +0 -0
  77. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/grep.rs +0 -0
  78. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/list.rs +0 -0
  79. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/mod.rs +0 -0
  80. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  81. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/show.rs +0 -0
  82. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/slice.rs +0 -0
  83. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/stats.rs +0 -0
  84. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/watch.rs +0 -0
  85. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/lib.rs +0 -0
  86. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/main.rs +0 -0
  87. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/output.rs +0 -0
  88. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/target.rs +0 -0
  89. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/cli/src/timearg.rs +0 -0
  90. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/Cargo.toml +0 -0
  91. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/benches/parse.rs +0 -0
  92. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/benches/render.rs +0 -0
  93. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/benches/toolcall.rs +0 -0
  94. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/activity.rs +0 -0
  95. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/actor.rs +0 -0
  96. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/blame.rs +0 -0
  97. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/buckets.rs +0 -0
  98. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/discovery.rs +0 -0
  99. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/lower.rs +0 -0
  100. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/mod.rs +0 -0
  101. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/parse.rs +0 -0
  102. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/probe.rs +0 -0
  103. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/protocol.rs +0 -0
  104. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/codex/types.rs +0 -0
  105. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/command.rs +0 -0
  106. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/context.rs +0 -0
  107. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/corrections.rs +0 -0
  108. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/cost.rs +0 -0
  109. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/discovery.rs +0 -0
  110. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/facts.rs +0 -0
  111. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/feedback.rs +0 -0
  112. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/filter.rs +0 -0
  113. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/gateway.rs +0 -0
  114. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/ids.rs +0 -0
  115. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/judge.rs +0 -0
  116. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/lib.rs +0 -0
  117. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/command.rs +0 -0
  118. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/corrections.rs +0 -0
  119. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/feedback.rs +0 -0
  120. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/mining.rs +0 -0
  121. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/mod.rs +0 -0
  122. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/literals/protocol.rs +0 -0
  123. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/notifications.rs +0 -0
  124. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/parse.rs +0 -0
  125. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/protocol.rs +0 -0
  126. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/pystr.rs +0 -0
  127. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/query.rs +0 -0
  128. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/render.rs +0 -0
  129. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/rng.rs +0 -0
  130. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/scan.rs +0 -0
  131. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/scan_grep.rs +0 -0
  132. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/scan_regressions.rs +0 -0
  133. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/schema.rs +0 -0
  134. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_activity.rs +0 -0
  135. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_codec.rs +0 -0
  136. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
  137. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_labels.rs +0 -0
  138. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_memory.rs +0 -0
  139. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_owned.rs +0 -0
  140. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared.rs +0 -0
  141. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
  142. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared_service.rs +0 -0
  143. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  144. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
  145. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_text.rs +0 -0
  146. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/sqlite.rs +0 -0
  147. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/toolcall.rs +0 -0
  148. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/types.rs +0 -0
  149. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/value.rs +0 -0
  150. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/core/src/watch.rs +0 -0
  151. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/Cargo.toml +0 -0
  152. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/build.rs +0 -0
  153. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  154. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/actor_bridge.rs +0 -0
  155. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  156. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/codex.rs +0 -0
  157. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/command.rs +0 -0
  158. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/context.rs +0 -0
  159. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/corrections.rs +0 -0
  160. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/discovery.rs +0 -0
  161. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/feedback.rs +0 -0
  162. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/judge.rs +0 -0
  163. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/lexicon.rs +0 -0
  164. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/lib.rs +0 -0
  165. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/mining.rs +0 -0
  166. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/nlp.rs +0 -0
  167. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/python.rs +0 -0
  168. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/render.rs +0 -0
  169. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/score.rs +0 -0
  170. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/snapshot_decode.rs +0 -0
  171. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/snapshots.rs +0 -0
  172. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/sqlite.rs +0 -0
  173. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/toolcall.rs +0 -0
  174. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/attachment.rs +0 -0
  175. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/blocks.rs +0 -0
  176. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/command.rs +0 -0
  177. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/convert.rs +0 -0
  178. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/dunder.rs +0 -0
  179. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/events.rs +0 -0
  180. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/meta.rs +0 -0
  181. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/mod.rs +0 -0
  182. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/print.rs +0 -0
  183. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/store.rs +0 -0
  184. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/system.rs +0 -0
  185. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/toolcall.rs +0 -0
  186. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/toolresult.rs +0 -0
  187. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/views/transcript.rs +0 -0
  188. {cc_transcript-14.32.0 → cc_transcript-14.32.1}/rust/crates/py/src/watch.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-transcript
3
- Version: 14.32.0
3
+ Version: 14.32.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cc-transcript"
3
- version = "14.32.0" # informational — releases stamp the version from the git tag
3
+ version = "14.32.1" # informational — releases stamp the version from the git tag
4
4
  description = "Grep every Claude Code session you've ever run."
5
5
  readme = "README.md"
6
6
  license = "PolyForm-Noncommercial-1.0.0"
@@ -2488,9 +2488,8 @@ impl NativeStore {
2488
2488
  .projections
2489
2489
  .values()
2490
2490
  .map(|cursor| {
2491
- crate::snapshot_memory::value_charge(&cursor.request).owned_capacity_bytes
2492
- + crate::snapshot_memory::value_charge(&cursor.request)
2493
- .opaque_dom_accounted_bytes
2491
+ let charge = crate::snapshot_memory::value_charge(&cursor.request);
2492
+ charge.owned_capacity_bytes + charge.opaque_dom_accounted_bytes
2494
2493
  })
2495
2494
  .sum();
2496
2495
  let graph_bytes: usize = state
@@ -2669,24 +2668,25 @@ impl NativeStore {
2669
2668
  let cap = self.memory_cap(context)?;
2670
2669
  if number(&Self::gauges(state), "retained_total_accounted_bytes")?
2671
2670
  .saturating_add(additional)
2672
- > cap
2671
+ <= cap
2673
2672
  {
2674
- self.classified
2675
- .lock()
2676
- .expect("classified snapshots")
2677
- .retain(|_, snapshot| Arc::strong_count(snapshot) > 1);
2678
- let leased: HashSet<_> = state
2679
- .leases
2680
- .values()
2681
- .map(|lease| lease.snapshot.id.clone())
2682
- .collect();
2683
- state.latest.retain(|_, snapshot| {
2684
- leased.contains(&snapshot.id) || Arc::strong_count(snapshot) > 1
2685
- });
2686
- state
2687
- .carried_classifications
2688
- .retain(|_, carried| Arc::strong_count(carried) > 1);
2673
+ return Ok(());
2689
2674
  }
2675
+ self.classified
2676
+ .lock()
2677
+ .expect("classified snapshots")
2678
+ .retain(|_, snapshot| Arc::strong_count(snapshot) > 1);
2679
+ let leased: HashSet<_> = state
2680
+ .leases
2681
+ .values()
2682
+ .map(|lease| lease.snapshot.id.clone())
2683
+ .collect();
2684
+ state
2685
+ .latest
2686
+ .retain(|_, snapshot| leased.contains(&snapshot.id) || Arc::strong_count(snapshot) > 1);
2687
+ state
2688
+ .carried_classifications
2689
+ .retain(|_, carried| Arc::strong_count(carried) > 1);
2690
2690
  if number(&Self::gauges(state), "retained_total_accounted_bytes")?
2691
2691
  .saturating_add(additional)
2692
2692
  > cap
@@ -7068,6 +7068,34 @@ mod tests {
7068
7068
  );
7069
7069
  }
7070
7070
 
7071
+ #[test]
7072
+ fn projection_reservations_preserve_exact_admission_caps_and_release_capacity() {
7073
+ for background in [false, true] {
7074
+ let store = store();
7075
+ let mut owner = context("a");
7076
+ if background {
7077
+ owner.insert("work_class", json!("background"));
7078
+ }
7079
+ let baseline = store.retained_accounted_bytes();
7080
+ let cap = if background {
7081
+ 32 * 1024 * 1024 - 4096
7082
+ } else {
7083
+ 32 * 1024 * 1024
7084
+ };
7085
+ let reservation = store.reserve_projection(&owner, cap - baseline).unwrap();
7086
+ assert_eq!(store.retained_accounted_bytes(), cap);
7087
+ let refused = store.reserve_projection(&owner, 1);
7088
+ assert!(matches!(refused, Err(error) if error.status == Status::RetainedLimit));
7089
+ assert_eq!(store.retained_accounted_bytes(), cap);
7090
+ drop(reservation);
7091
+ assert_eq!(store.retained_accounted_bytes(), baseline);
7092
+ let reused = store.reserve_projection(&owner, cap - baseline).unwrap();
7093
+ assert_eq!(store.retained_accounted_bytes(), cap);
7094
+ drop(reused);
7095
+ assert_eq!(store.retained_accounted_bytes(), baseline);
7096
+ }
7097
+ }
7098
+
7071
7099
  #[test]
7072
7100
  fn escaped_borrowed_entries_remain_accounted_after_release() {
7073
7101
  let source = Source::new(&format!("{}\n", user("a")));
@@ -1336,77 +1336,58 @@ fn workflow_query(
1336
1336
  scalar(json!(matched), work)
1337
1337
  }
1338
1338
 
1339
- fn checked_render<T>(
1340
- work: &mut Work,
1341
- range: &Range<usize>,
1342
- produce: impl FnOnce(&mut Work) -> Result<T, SnapshotError>,
1343
- ) -> Result<T, SnapshotError> {
1339
+ fn render_window(work: &Work, range: &Range<usize>) -> Result<Range<usize>, SnapshotError> {
1340
+ let limit = work.limits.max_output_bytes;
1344
1341
  let mut input = OutputCounter {
1345
- remaining: work
1346
- .limits
1347
- .max_output_bytes
1348
- .checked_sub(64)
1349
- .ok_or_else(output_limit)?
1350
- / 16,
1342
+ remaining: limit.checked_sub(64).ok_or_else(output_limit)? / 16,
1351
1343
  };
1352
- let mut clones = work.limits.max_output_bytes;
1353
- if !range.is_empty() {
1354
- let first = work
1355
- .snapshot
1356
- .activity
1357
- .turn_of_event(range.start)
1358
- .expect("view turn");
1359
- let last = work
1360
- .snapshot
1361
- .activity
1362
- .turn_of_event(range.end - 1)
1363
- .expect("view turn");
1344
+ let activity = &work.snapshot.activity;
1345
+ let mut start = range.end;
1346
+ let mut turn = 0;
1347
+ let mut bounds = 0..0;
1348
+ let mut pending = HashSet::new();
1349
+ for index in range.clone().rev() {
1350
+ work.cancel.check(work.limits.deadline_unix_ms)?;
1351
+ if !bounds.contains(&index) {
1352
+ turn = activity.turn_of_event(index).expect("view turn");
1353
+ bounds = activity.turn_bounds(turn).expect("view turn");
1354
+ pending.clear();
1355
+ }
1356
+ let entry = work.snapshot.entry(index);
1357
+ pending.extend(entry.blocks().iter().filter_map(|block| match block {
1358
+ ContentBlock::ToolResult(result) => Some(result.tool_use_id.as_str()),
1359
+ _ => None,
1360
+ }));
1361
+ let fits = snapshot_codec::write_json(&mut input, entry, limit).is_ok()
1362
+ && entry.blocks().iter().all(|block| match block {
1363
+ ContentBlock::ToolUse(tool) if pending.contains(tool.id.as_str()) => {
1364
+ snapshot_codec::write_json(&mut input, tool.name.as_str(), limit).is_ok()
1365
+ }
1366
+ _ => true,
1367
+ })
1368
+ && (index != bounds.start
1369
+ || snapshot_codec::write_json(
1370
+ &mut input,
1371
+ activity.prompt(turn).expect("view turn"),
1372
+ limit,
1373
+ )
1374
+ .is_ok());
1375
+ if !fits {
1376
+ break;
1377
+ }
1378
+ start = index;
1379
+ }
1380
+ let window = start..range.end;
1381
+ if !window.is_empty() {
1382
+ let first = activity.turn_of_event(window.start).expect("view turn");
1383
+ let last = activity.turn_of_event(window.end - 1).expect("view turn");
1384
+ let mut clones = limit;
1364
1385
  for index in first..=last {
1365
- let copied = work
1366
- .snapshot
1367
- .activity
1368
- .projected_bytes(index)
1369
- .expect("view turn");
1386
+ let copied = activity.projected_bytes(index).expect("view turn");
1370
1387
  clones = clones.checked_sub(copied).ok_or_else(output_limit)?;
1371
- let bounds = work
1372
- .snapshot
1373
- .activity
1374
- .turn_bounds(index)
1375
- .expect("view turn");
1376
- work.charge_range(bounds.clone())?;
1377
- let mut names = std::collections::HashMap::new();
1378
- for position in bounds {
1379
- let entry = work.snapshot.entry(position);
1380
- snapshot_codec::write_json(&mut input, entry, work.limits.max_output_bytes)
1381
- .map_err(|_| output_limit())?;
1382
- for block in entry.blocks() {
1383
- match block {
1384
- ContentBlock::ToolUse(tool) => {
1385
- names.insert(tool.id.as_str(), tool.name.as_str());
1386
- }
1387
- ContentBlock::ToolResult(result) => {
1388
- if let Some(name) = names.get(result.tool_use_id.as_str()) {
1389
- snapshot_codec::write_json(
1390
- &mut input,
1391
- name,
1392
- work.limits.max_output_bytes,
1393
- )
1394
- .map_err(|_| output_limit())?;
1395
- }
1396
- }
1397
- _ => {}
1398
- }
1399
- }
1400
- }
1401
- snapshot_codec::write_json(
1402
- &mut input,
1403
- work.snapshot.activity.prompt(index).expect("view turn"),
1404
- work.limits.max_output_bytes,
1405
- )
1406
- .map_err(|_| output_limit())?;
1407
1388
  }
1408
1389
  }
1409
- produce(work)
1390
+ Ok(window)
1410
1391
  }
1411
1392
 
1412
1393
  fn render_query(
@@ -1418,24 +1399,30 @@ fn render_query(
1418
1399
  let tool_results = field(query, "tool_results")?
1419
1400
  .as_bool()
1420
1401
  .ok_or_else(|| invalid("tool_results must be boolean"))?;
1421
- checked_render(work, &range, |work| {
1422
- let lift = lift_range(work, &range, None)?;
1423
- let session = view(&lift, &range, work.snapshot);
1424
- let parts: Vec<_> = session
1425
- .turn_views()
1426
- .map(|(_, prompt, events, uses)| {
1427
- render::render_turn_parts(
1428
- prompt,
1429
- events,
1430
- &uses.iter().map(|use_| &use_.call).collect::<Vec<_>>(),
1431
- &budget,
1432
- tool_results,
1433
- )
1434
- })
1435
- .filter(|text| !text.is_empty())
1436
- .collect();
1437
- scalar(json!(parts.join("\n\n")), work)
1438
- })
1402
+ let window = render_window(work, &range)?;
1403
+ let lift = lift_range(work, &window, None)?;
1404
+ let session = view(&lift, &window, work.snapshot);
1405
+ let mut parts: Vec<_> = session
1406
+ .turn_views()
1407
+ .map(|(_, prompt, events, uses)| {
1408
+ render::render_turn_parts(
1409
+ prompt,
1410
+ events,
1411
+ &uses.iter().map(|use_| &use_.call).collect::<Vec<_>>(),
1412
+ &budget,
1413
+ tool_results,
1414
+ )
1415
+ })
1416
+ .filter(|text| !text.is_empty())
1417
+ .collect();
1418
+ let omitted = window.start - range.start;
1419
+ if omitted != 0 {
1420
+ parts.insert(
1421
+ 0,
1422
+ format!("[{omitted} earlier events omitted: over the render budget]"),
1423
+ );
1424
+ }
1425
+ scalar(json!(parts.join("\n\n")), work)
1439
1426
  }
1440
1427
 
1441
1428
  #[derive(serde::Serialize)]
@@ -2785,19 +2772,103 @@ mod tests {
2785
2772
  let mut cap = limits();
2786
2773
  cap.max_output_bytes = 128;
2787
2774
  let cancel = Cancellation::default();
2788
- let mut work = Work::new(&snap, &cap, &cancel);
2789
- let produced = checked_render(&mut work, &(0..1), |_| {
2790
- visits.set(visits.get() + 1);
2791
- Ok(())
2792
- });
2793
- assert!(matches!(produced,Err(error) if error.status==Status::OutputLimit));
2794
- assert_eq!(visits.get(), 0);
2775
+ let work = Work::new(&snap, &cap, &cancel);
2776
+ assert_eq!(render_window(&work, &(0..1)).unwrap(), 1..1);
2795
2777
  let req = request(json!({"kind":"user_text"}), json!([]));
2796
2778
  assert!(
2797
2779
  matches!(project(&snap,&req,&cap,&cancel,0),Err(error) if error.status==Status::OutputLimit)
2798
2780
  );
2799
2781
  }
2800
2782
 
2783
+ fn render_request(selectors: Value) -> Value {
2784
+ request(
2785
+ json!({"kind":"render","budget":{"turn_chars":100,"tool_chars":100},"tool_results":false}),
2786
+ selectors,
2787
+ )
2788
+ }
2789
+
2790
+ fn long_turn(calls: usize, input_bytes: usize) -> Vec<Value> {
2791
+ std::iter::once(user("u", "start the long run"))
2792
+ .chain((0..calls).flat_map(|call| {
2793
+ let id = format!("bash-{call}");
2794
+ [
2795
+ tool(
2796
+ &format!("call-{call}"),
2797
+ &id,
2798
+ "Bash",
2799
+ json!({"command":format!("echo {call} {}", "x".repeat(input_bytes))}),
2800
+ ),
2801
+ tool_result(&format!("result-{call}"), &id, format!("done {call}")),
2802
+ ]
2803
+ }))
2804
+ .collect()
2805
+ }
2806
+
2807
+ #[test]
2808
+ fn render_inside_one_long_turn_charges_only_the_window() {
2809
+ let snap = snapshot(&long_turn(400, 2048));
2810
+ let count = snap.event_count;
2811
+ let cap = long_turn_limits();
2812
+ let mut whole_turn = OutputCounter {
2813
+ remaining: (cap.max_output_bytes - 64) / 16,
2814
+ };
2815
+ assert!((0..count).any(|index| {
2816
+ snapshot_codec::write_json(&mut whole_turn, snap.entry(index), cap.max_output_bytes)
2817
+ .is_err()
2818
+ }));
2819
+ let cancel = Cancellation::default();
2820
+ let request =
2821
+ render_request(json!([{"kind":"event_range","start":count - 6,"stop":count}]));
2822
+ let result = project(&snap, &request, &cap, &cancel, 0).unwrap();
2823
+ assert!(result.complete);
2824
+ let text = result.data["value"].as_str().unwrap();
2825
+ assert!(!text.contains("omitted"));
2826
+ assert!(text.contains("echo 397") && text.contains("echo 399"));
2827
+ assert!(!text.contains("echo 396"));
2828
+ }
2829
+
2830
+ fn long_turn_limits() -> WorkLimits {
2831
+ WorkLimits {
2832
+ max_read_bytes: 64 * 1024 * 1024,
2833
+ max_events: 10_000,
2834
+ max_output_bytes: 2 * 1024 * 1024,
2835
+ ..limits()
2836
+ }
2837
+ }
2838
+
2839
+ #[test]
2840
+ fn over_budget_render_keeps_the_newest_events_and_names_the_omission() {
2841
+ let snap = snapshot(&long_turn(400, 2048));
2842
+ let count = snap.event_count;
2843
+ let cap = long_turn_limits();
2844
+ let cancel = Cancellation::default();
2845
+ let work = Work::new(&snap, &cap, &cancel);
2846
+ let window = render_window(&work, &(0..count)).unwrap();
2847
+ assert_eq!(window.end, count);
2848
+ assert!(window.start > 1 && window.len() > 6);
2849
+ let result = project(&snap, &render_request(json!([])), &cap, &cancel, 0).unwrap();
2850
+ assert!(result.complete);
2851
+ let text = result.data["value"].as_str().unwrap();
2852
+ let marker = format!(
2853
+ "[{} earlier events omitted: over the render budget]\n\n",
2854
+ window.start
2855
+ );
2856
+ assert!(text.starts_with(&marker));
2857
+ assert!(text.contains("echo 399"));
2858
+ assert!(!text.contains("start the long run"));
2859
+ let single = snapshot(&[user("u", &"y".repeat(32768))]);
2860
+ let tiny = WorkLimits {
2861
+ max_output_bytes: 1024,
2862
+ ..limits()
2863
+ };
2864
+ let result = project(&single, &render_request(json!([])), &tiny, &cancel, 0).unwrap();
2865
+ assert!(result.complete);
2866
+ assert_eq!(
2867
+ result.data["value"].as_str(),
2868
+ Some("[1 earlier events omitted: over the render budget]")
2869
+ );
2870
+ }
2871
+
2801
2872
  #[test]
2802
2873
  fn text_preflight_counts_escaping_and_keeps_unicode_prefixes() {
2803
2874
  let parts = ["\n\t\u{0}", "\"\\😀"];
File without changes