cc-transcript 14.32.0__tar.gz → 14.33.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/PKG-INFO +1 -1
  2. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshot_schema/request.schema.json +6 -1
  3. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/pyproject.toml +1 -1
  4. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot.rs +47 -19
  5. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_projection.rs +195 -97
  6. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/Cargo.lock +0 -0
  7. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/Cargo.toml +0 -0
  8. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/LICENSE +0 -0
  9. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/README.md +0 -0
  10. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/__init__.py +0 -0
  11. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/__init__.pyi +0 -0
  12. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/_native.pyi +0 -0
  13. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/activity.py +0 -0
  14. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/activity_probe.py +0 -0
  15. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/builders.py +0 -0
  16. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/codex.py +0 -0
  17. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/command.py +0 -0
  18. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/context.py +0 -0
  19. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/corrections.py +0 -0
  20. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/cost.py +0 -0
  21. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/decision_store.py +0 -0
  22. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/decisions.py +0 -0
  23. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/discovery.py +0 -0
  24. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/disktruth.py +0 -0
  25. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/evidence.py +0 -0
  26. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/extract/__init__.py +0 -0
  27. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/extract/correct.py +0 -0
  28. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/facts.py +0 -0
  29. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/filterspec.py +0 -0
  30. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/heartbeats.py +0 -0
  31. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/ids.py +0 -0
  32. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/judge/__init__.py +0 -0
  33. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/judge/llm.py +0 -0
  34. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/judge/similar.py +0 -0
  35. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/judge/verdicts.py +0 -0
  36. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/ledger.py +0 -0
  37. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/literals.py +0 -0
  38. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/__init__.py +0 -0
  39. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/candidates.py +0 -0
  40. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/confidence.py +0 -0
  41. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/engine.py +0 -0
  42. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/formats.py +0 -0
  43. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/sampling.py +0 -0
  44. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/signals.py +0 -0
  45. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/sourcekind.py +0 -0
  46. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/spec.py +0 -0
  47. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/mining/store.py +0 -0
  48. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/models.py +0 -0
  49. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/nlp.py +0 -0
  50. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/notifications.py +0 -0
  51. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/parser.py +0 -0
  52. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/py.typed +0 -0
  53. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/query.py +0 -0
  54. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/render.py +0 -0
  55. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/__init__.py +0 -0
  56. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/buckets.py +0 -0
  57. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  58. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  59. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  60. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/engine.py +0 -0
  61. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/lexicon.py +0 -0
  62. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/sentiment/scorespec.py +0 -0
  63. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  64. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  65. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  66. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  67. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/snapshots.py +0 -0
  68. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/synthetic.py +0 -0
  69. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/tools.py +0 -0
  70. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/cc_transcript/watch.py +0 -0
  71. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/Cargo.toml +0 -0
  72. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/blame.rs +0 -0
  73. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/corpus.rs +0 -0
  74. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/corrections.rs +0 -0
  75. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/digest.rs +0 -0
  76. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/facts.rs +0 -0
  77. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/grep.rs +0 -0
  78. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/list.rs +0 -0
  79. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/mod.rs +0 -0
  80. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  81. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/show.rs +0 -0
  82. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/slice.rs +0 -0
  83. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/stats.rs +0 -0
  84. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/commands/watch.rs +0 -0
  85. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/lib.rs +0 -0
  86. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/main.rs +0 -0
  87. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/output.rs +0 -0
  88. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/target.rs +0 -0
  89. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/cli/src/timearg.rs +0 -0
  90. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/Cargo.toml +0 -0
  91. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/benches/parse.rs +0 -0
  92. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/benches/render.rs +0 -0
  93. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/benches/toolcall.rs +0 -0
  94. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/activity.rs +0 -0
  95. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/actor.rs +0 -0
  96. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/blame.rs +0 -0
  97. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/buckets.rs +0 -0
  98. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/discovery.rs +0 -0
  99. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/lower.rs +0 -0
  100. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/mod.rs +0 -0
  101. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/parse.rs +0 -0
  102. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/probe.rs +0 -0
  103. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/protocol.rs +0 -0
  104. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/codex/types.rs +0 -0
  105. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/command.rs +0 -0
  106. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/context.rs +0 -0
  107. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/corrections.rs +0 -0
  108. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/cost.rs +0 -0
  109. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/discovery.rs +0 -0
  110. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/facts.rs +0 -0
  111. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/feedback.rs +0 -0
  112. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/filter.rs +0 -0
  113. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/gateway.rs +0 -0
  114. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/ids.rs +0 -0
  115. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/judge.rs +0 -0
  116. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/lib.rs +0 -0
  117. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/command.rs +0 -0
  118. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/corrections.rs +0 -0
  119. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/feedback.rs +0 -0
  120. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/mining.rs +0 -0
  121. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/mod.rs +0 -0
  122. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/literals/protocol.rs +0 -0
  123. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/notifications.rs +0 -0
  124. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/parse.rs +0 -0
  125. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/protocol.rs +0 -0
  126. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/pystr.rs +0 -0
  127. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/query.rs +0 -0
  128. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/render.rs +0 -0
  129. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/rng.rs +0 -0
  130. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/scan.rs +0 -0
  131. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/scan_grep.rs +0 -0
  132. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/scan_regressions.rs +0 -0
  133. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/schema.rs +0 -0
  134. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_activity.rs +0 -0
  135. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_codec.rs +0 -0
  136. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
  137. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_labels.rs +0 -0
  138. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_memory.rs +0 -0
  139. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_owned.rs +0 -0
  140. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_prepared.rs +0 -0
  141. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
  142. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_prepared_service.rs +0 -0
  143. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  144. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
  145. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/snapshot_text.rs +0 -0
  146. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/sqlite.rs +0 -0
  147. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/toolcall.rs +0 -0
  148. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/types.rs +0 -0
  149. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/value.rs +0 -0
  150. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/core/src/watch.rs +0 -0
  151. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/Cargo.toml +0 -0
  152. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/build.rs +0 -0
  153. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  154. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/actor_bridge.rs +0 -0
  155. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  156. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/codex.rs +0 -0
  157. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/command.rs +0 -0
  158. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/context.rs +0 -0
  159. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/corrections.rs +0 -0
  160. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/discovery.rs +0 -0
  161. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/feedback.rs +0 -0
  162. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/judge.rs +0 -0
  163. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/lexicon.rs +0 -0
  164. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/lib.rs +0 -0
  165. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/mining.rs +0 -0
  166. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/nlp.rs +0 -0
  167. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/python.rs +0 -0
  168. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/render.rs +0 -0
  169. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/score.rs +0 -0
  170. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/snapshot_decode.rs +0 -0
  171. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/snapshots.rs +0 -0
  172. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/sqlite.rs +0 -0
  173. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/toolcall.rs +0 -0
  174. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/attachment.rs +0 -0
  175. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/blocks.rs +0 -0
  176. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/command.rs +0 -0
  177. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/convert.rs +0 -0
  178. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/dunder.rs +0 -0
  179. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/events.rs +0 -0
  180. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/meta.rs +0 -0
  181. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/mod.rs +0 -0
  182. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/print.rs +0 -0
  183. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/store.rs +0 -0
  184. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/system.rs +0 -0
  185. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/toolcall.rs +0 -0
  186. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/toolresult.rs +0 -0
  187. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/rust/crates/py/src/views/transcript.rs +0 -0
  188. {cc_transcript-14.32.0 → cc_transcript-14.33.0}/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.33.0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -2006,6 +2006,10 @@
2006
2006
  "title": "Origin",
2007
2007
  "type": "string"
2008
2008
  },
2009
+ "thinking": {
2010
+ "title": "Thinking",
2011
+ "type": "boolean"
2012
+ },
2009
2013
  "window": {
2010
2014
  "anyOf": [
2011
2015
  {
@@ -2024,7 +2028,8 @@
2024
2028
  "required": [
2025
2029
  "kind",
2026
2030
  "window",
2027
- "origin"
2031
+ "origin",
2032
+ "thinking"
2028
2033
  ],
2029
2034
  "title": "SignalTexts",
2030
2035
  "type": "object"
@@ -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.33.0" # 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")));
@@ -1160,6 +1160,7 @@ fn signal_event<'a>(
1160
1160
  work: &mut Work<'a, '_>,
1161
1161
  index: usize,
1162
1162
  origin: &str,
1163
+ thinking: bool,
1163
1164
  ) -> Result<Vec<Vec<&'a str>>, SnapshotError> {
1164
1165
  work.charge_range(index..index + 1)?;
1165
1166
  let event = work.snapshot.entry(index);
@@ -1193,7 +1194,7 @@ fn signal_event<'a>(
1193
1194
  for (ordinal, block) in event.blocks().iter().enumerate() {
1194
1195
  work.cancel.check(work.limits.deadline_unix_ms)?;
1195
1196
  match block {
1196
- ContentBlock::Thinking(text) if !text.is_empty() => plans.push(vec![text]),
1197
+ ContentBlock::Thinking(text) if thinking && !text.is_empty() => plans.push(vec![text]),
1197
1198
  ContentBlock::ToolUse(tool) => {
1198
1199
  let call = work
1199
1200
  .snapshot
@@ -1258,6 +1259,9 @@ fn signal_query(
1258
1259
  if !["any", "assistant"].contains(&origin) {
1259
1260
  return Err(invalid("invalid signal origin"));
1260
1261
  }
1262
+ let thinking = field(query, "thinking")?
1263
+ .as_bool()
1264
+ .ok_or_else(|| invalid("thinking must be boolean"))?;
1261
1265
  let window = field(query, "window")?;
1262
1266
  let mut plans = Vec::new();
1263
1267
  if window.as_str() == Some("current_turn") {
@@ -1272,7 +1276,7 @@ fn signal_query(
1272
1276
  .max(work.snapshot.activity.turn_bounds(turn).unwrap().start);
1273
1277
  }
1274
1278
  for index in range {
1275
- plans.extend(signal_event(work, index, origin)?);
1279
+ plans.extend(signal_event(work, index, origin, thinking)?);
1276
1280
  }
1277
1281
  } else {
1278
1282
  let count = count(query, "window")?;
@@ -1282,7 +1286,7 @@ fn signal_query(
1282
1286
  if length >= count {
1283
1287
  break;
1284
1288
  }
1285
- let texts = signal_event(work, index, origin)?;
1289
+ let texts = signal_event(work, index, origin, thinking)?;
1286
1290
  length += texts.len();
1287
1291
  events.push(texts);
1288
1292
  }
@@ -1336,77 +1340,58 @@ fn workflow_query(
1336
1340
  scalar(json!(matched), work)
1337
1341
  }
1338
1342
 
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> {
1343
+ fn render_window(work: &Work, range: &Range<usize>) -> Result<Range<usize>, SnapshotError> {
1344
+ let limit = work.limits.max_output_bytes;
1344
1345
  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,
1346
+ remaining: limit.checked_sub(64).ok_or_else(output_limit)? / 16,
1351
1347
  };
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");
1348
+ let activity = &work.snapshot.activity;
1349
+ let mut start = range.end;
1350
+ let mut turn = 0;
1351
+ let mut bounds = 0..0;
1352
+ let mut pending = HashSet::new();
1353
+ for index in range.clone().rev() {
1354
+ work.cancel.check(work.limits.deadline_unix_ms)?;
1355
+ if !bounds.contains(&index) {
1356
+ turn = activity.turn_of_event(index).expect("view turn");
1357
+ bounds = activity.turn_bounds(turn).expect("view turn");
1358
+ pending.clear();
1359
+ }
1360
+ let entry = work.snapshot.entry(index);
1361
+ pending.extend(entry.blocks().iter().filter_map(|block| match block {
1362
+ ContentBlock::ToolResult(result) => Some(result.tool_use_id.as_str()),
1363
+ _ => None,
1364
+ }));
1365
+ let fits = snapshot_codec::write_json(&mut input, entry, limit).is_ok()
1366
+ && entry.blocks().iter().all(|block| match block {
1367
+ ContentBlock::ToolUse(tool) if pending.contains(tool.id.as_str()) => {
1368
+ snapshot_codec::write_json(&mut input, tool.name.as_str(), limit).is_ok()
1369
+ }
1370
+ _ => true,
1371
+ })
1372
+ && (index != bounds.start
1373
+ || snapshot_codec::write_json(
1374
+ &mut input,
1375
+ activity.prompt(turn).expect("view turn"),
1376
+ limit,
1377
+ )
1378
+ .is_ok());
1379
+ if !fits {
1380
+ break;
1381
+ }
1382
+ start = index;
1383
+ }
1384
+ let window = start..range.end;
1385
+ if !window.is_empty() {
1386
+ let first = activity.turn_of_event(window.start).expect("view turn");
1387
+ let last = activity.turn_of_event(window.end - 1).expect("view turn");
1388
+ let mut clones = limit;
1364
1389
  for index in first..=last {
1365
- let copied = work
1366
- .snapshot
1367
- .activity
1368
- .projected_bytes(index)
1369
- .expect("view turn");
1390
+ let copied = activity.projected_bytes(index).expect("view turn");
1370
1391
  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
1392
  }
1408
1393
  }
1409
- produce(work)
1394
+ Ok(window)
1410
1395
  }
1411
1396
 
1412
1397
  fn render_query(
@@ -1418,24 +1403,30 @@ fn render_query(
1418
1403
  let tool_results = field(query, "tool_results")?
1419
1404
  .as_bool()
1420
1405
  .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
- })
1406
+ let window = render_window(work, &range)?;
1407
+ let lift = lift_range(work, &window, None)?;
1408
+ let session = view(&lift, &window, work.snapshot);
1409
+ let mut parts: Vec<_> = session
1410
+ .turn_views()
1411
+ .map(|(_, prompt, events, uses)| {
1412
+ render::render_turn_parts(
1413
+ prompt,
1414
+ events,
1415
+ &uses.iter().map(|use_| &use_.call).collect::<Vec<_>>(),
1416
+ &budget,
1417
+ tool_results,
1418
+ )
1419
+ })
1420
+ .filter(|text| !text.is_empty())
1421
+ .collect();
1422
+ let omitted = window.start - range.start;
1423
+ if omitted != 0 {
1424
+ parts.insert(
1425
+ 0,
1426
+ format!("[{omitted} earlier events omitted: over the render budget]"),
1427
+ );
1428
+ }
1429
+ scalar(json!(parts.join("\n\n")), work)
1439
1430
  }
1440
1431
 
1441
1432
  #[derive(serde::Serialize)]
@@ -2785,19 +2776,103 @@ mod tests {
2785
2776
  let mut cap = limits();
2786
2777
  cap.max_output_bytes = 128;
2787
2778
  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);
2779
+ let work = Work::new(&snap, &cap, &cancel);
2780
+ assert_eq!(render_window(&work, &(0..1)).unwrap(), 1..1);
2795
2781
  let req = request(json!({"kind":"user_text"}), json!([]));
2796
2782
  assert!(
2797
2783
  matches!(project(&snap,&req,&cap,&cancel,0),Err(error) if error.status==Status::OutputLimit)
2798
2784
  );
2799
2785
  }
2800
2786
 
2787
+ fn render_request(selectors: Value) -> Value {
2788
+ request(
2789
+ json!({"kind":"render","budget":{"turn_chars":100,"tool_chars":100},"tool_results":false}),
2790
+ selectors,
2791
+ )
2792
+ }
2793
+
2794
+ fn long_turn(calls: usize, input_bytes: usize) -> Vec<Value> {
2795
+ std::iter::once(user("u", "start the long run"))
2796
+ .chain((0..calls).flat_map(|call| {
2797
+ let id = format!("bash-{call}");
2798
+ [
2799
+ tool(
2800
+ &format!("call-{call}"),
2801
+ &id,
2802
+ "Bash",
2803
+ json!({"command":format!("echo {call} {}", "x".repeat(input_bytes))}),
2804
+ ),
2805
+ tool_result(&format!("result-{call}"), &id, format!("done {call}")),
2806
+ ]
2807
+ }))
2808
+ .collect()
2809
+ }
2810
+
2811
+ #[test]
2812
+ fn render_inside_one_long_turn_charges_only_the_window() {
2813
+ let snap = snapshot(&long_turn(400, 2048));
2814
+ let count = snap.event_count;
2815
+ let cap = long_turn_limits();
2816
+ let mut whole_turn = OutputCounter {
2817
+ remaining: (cap.max_output_bytes - 64) / 16,
2818
+ };
2819
+ assert!((0..count).any(|index| {
2820
+ snapshot_codec::write_json(&mut whole_turn, snap.entry(index), cap.max_output_bytes)
2821
+ .is_err()
2822
+ }));
2823
+ let cancel = Cancellation::default();
2824
+ let request =
2825
+ render_request(json!([{"kind":"event_range","start":count - 6,"stop":count}]));
2826
+ let result = project(&snap, &request, &cap, &cancel, 0).unwrap();
2827
+ assert!(result.complete);
2828
+ let text = result.data["value"].as_str().unwrap();
2829
+ assert!(!text.contains("omitted"));
2830
+ assert!(text.contains("echo 397") && text.contains("echo 399"));
2831
+ assert!(!text.contains("echo 396"));
2832
+ }
2833
+
2834
+ fn long_turn_limits() -> WorkLimits {
2835
+ WorkLimits {
2836
+ max_read_bytes: 64 * 1024 * 1024,
2837
+ max_events: 10_000,
2838
+ max_output_bytes: 2 * 1024 * 1024,
2839
+ ..limits()
2840
+ }
2841
+ }
2842
+
2843
+ #[test]
2844
+ fn over_budget_render_keeps_the_newest_events_and_names_the_omission() {
2845
+ let snap = snapshot(&long_turn(400, 2048));
2846
+ let count = snap.event_count;
2847
+ let cap = long_turn_limits();
2848
+ let cancel = Cancellation::default();
2849
+ let work = Work::new(&snap, &cap, &cancel);
2850
+ let window = render_window(&work, &(0..count)).unwrap();
2851
+ assert_eq!(window.end, count);
2852
+ assert!(window.start > 1 && window.len() > 6);
2853
+ let result = project(&snap, &render_request(json!([])), &cap, &cancel, 0).unwrap();
2854
+ assert!(result.complete);
2855
+ let text = result.data["value"].as_str().unwrap();
2856
+ let marker = format!(
2857
+ "[{} earlier events omitted: over the render budget]\n\n",
2858
+ window.start
2859
+ );
2860
+ assert!(text.starts_with(&marker));
2861
+ assert!(text.contains("echo 399"));
2862
+ assert!(!text.contains("start the long run"));
2863
+ let single = snapshot(&[user("u", &"y".repeat(32768))]);
2864
+ let tiny = WorkLimits {
2865
+ max_output_bytes: 1024,
2866
+ ..limits()
2867
+ };
2868
+ let result = project(&single, &render_request(json!([])), &tiny, &cancel, 0).unwrap();
2869
+ assert!(result.complete);
2870
+ assert_eq!(
2871
+ result.data["value"].as_str(),
2872
+ Some("[1 earlier events omitted: over the render budget]")
2873
+ );
2874
+ }
2875
+
2801
2876
  #[test]
2802
2877
  fn text_preflight_counts_escaping_and_keeps_unicode_prefixes() {
2803
2878
  let parts = ["\n\t\u{0}", "\"\\😀"];
@@ -2902,7 +2977,7 @@ mod tests {
2902
2977
  let all = run(
2903
2978
  &snap,
2904
2979
  &request(
2905
- json!({"kind":"signal_texts","window":"current_turn","origin":"any"}),
2980
+ json!({"kind":"signal_texts","window":"current_turn","origin":"any","thinking":true}),
2906
2981
  json!([]),
2907
2982
  ),
2908
2983
  );
@@ -2927,7 +3002,7 @@ mod tests {
2927
3002
  let last = run(
2928
3003
  &snap,
2929
3004
  &request(
2930
- json!({"kind":"signal_texts","window":3,"origin":"assistant"}),
3005
+ json!({"kind":"signal_texts","window":3,"origin":"assistant","thinking":true}),
2931
3006
  json!([]),
2932
3007
  ),
2933
3008
  );
@@ -2938,6 +3013,29 @@ mod tests {
2938
3013
  .map(|value| value.as_str().unwrap())
2939
3014
  .collect();
2940
3015
  assert_eq!(actual, ["finding failure", "second", "todo subject"]);
3016
+ let prose = run(
3017
+ &snap,
3018
+ &request(
3019
+ json!({"kind":"signal_texts","window":"current_turn","origin":"assistant","thinking":false}),
3020
+ json!([]),
3021
+ ),
3022
+ );
3023
+ let actual: Vec<_> = prose.data["values"]
3024
+ .as_array()
3025
+ .unwrap()
3026
+ .iter()
3027
+ .map(|value| value.as_str().unwrap())
3028
+ .collect();
3029
+ assert_eq!(
3030
+ actual,
3031
+ [
3032
+ "visible",
3033
+ "task details",
3034
+ "finding failure",
3035
+ "second",
3036
+ "todo subject"
3037
+ ]
3038
+ );
2941
3039
  }
2942
3040
 
2943
3041
  #[test]
@@ -2954,7 +3052,7 @@ mod tests {
2954
3052
  let result = run(
2955
3053
  &snap,
2956
3054
  &request(
2957
- json!({"kind":"signal_texts","window":10,"origin":"any"}),
3055
+ json!({"kind":"signal_texts","window":10,"origin":"any","thinking":true}),
2958
3056
  json!([]),
2959
3057
  ),
2960
3058
  );
@@ -2968,7 +3066,7 @@ mod tests {
2968
3066
  let zero = run(
2969
3067
  &snap,
2970
3068
  &request(
2971
- json!({"kind":"signal_texts","window":0,"origin":"any"}),
3069
+ json!({"kind":"signal_texts","window":0,"origin":"any","thinking":true}),
2972
3070
  json!([]),
2973
3071
  ),
2974
3072
  );
File without changes