cc-transcript 14.35.0__tar.gz → 14.37.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 (198) hide show
  1. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/PKG-INFO +2 -2
  2. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/extract/correct.py +61 -16
  3. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/config.schema.json +1 -0
  4. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/pyproject.toml +2 -2
  5. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/lower.rs +120 -9
  6. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/parse.rs +13 -3
  7. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/types.rs +3 -0
  8. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/lib.rs +1 -0
  9. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/parse.rs +742 -39
  10. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep.rs +1 -0
  11. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot.rs +6736 -2200
  12. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_activity.rs +601 -23
  13. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_codec.rs +114 -12
  14. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_codex_append.rs +15 -9
  15. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_labels.rs +151 -7
  16. cc_transcript-14.37.0/rust/crates/core/src/snapshot_ledger.rs +1286 -0
  17. cc_transcript-14.37.0/rust/crates/core/src/snapshot_ledger_tests.rs +13315 -0
  18. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_memory.rs +112 -0
  19. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_owned.rs +96 -18
  20. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared.rs +1 -1
  21. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared_disk.rs +361 -60
  22. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared_service.rs +1076 -528
  23. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_projection.rs +153 -34
  24. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_root_warm.rs +14 -15
  25. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/toolcall.rs +33 -1
  26. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/types.rs +25 -10
  27. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/value.rs +17 -4
  28. cc_transcript-14.37.0/rust/crates/core/tests/sonic_arena_model.rs +242 -0
  29. cc_transcript-14.37.0/rust/crates/core/tests/std_allocation_model.rs +165 -0
  30. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/python.rs +2 -1
  31. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/render.rs +3 -1
  32. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/snapshot_decode.rs +7 -5
  33. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/blocks.rs +41 -2
  34. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/events.rs +2 -1
  35. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/store.rs +4 -3
  36. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/toolcall.rs +20 -7
  37. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/transcript.rs +4 -4
  38. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/watch.rs +2 -1
  39. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/Cargo.lock +0 -0
  40. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/Cargo.toml +0 -0
  41. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/LICENSE +0 -0
  42. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/README.md +0 -0
  43. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/__init__.py +0 -0
  44. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/__init__.pyi +0 -0
  45. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/_native.pyi +0 -0
  46. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/activity.py +0 -0
  47. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/activity_probe.py +0 -0
  48. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/builders.py +0 -0
  49. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/codex.py +0 -0
  50. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/command.py +0 -0
  51. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/context.py +0 -0
  52. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/corrections.py +0 -0
  53. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/cost.py +0 -0
  54. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/decision_store.py +0 -0
  55. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/decisions.py +0 -0
  56. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/discovery.py +0 -0
  57. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/disktruth.py +0 -0
  58. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/evidence.py +0 -0
  59. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/extract/__init__.py +0 -0
  60. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/facts.py +0 -0
  61. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/filterspec.py +0 -0
  62. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/heartbeats.py +0 -0
  63. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/ids.py +0 -0
  64. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/__init__.py +0 -0
  65. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/llm.py +0 -0
  66. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/similar.py +0 -0
  67. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/verdicts.py +0 -0
  68. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/ledger.py +0 -0
  69. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/literals.py +0 -0
  70. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/__init__.py +0 -0
  71. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/candidates.py +0 -0
  72. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/confidence.py +0 -0
  73. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/engine.py +0 -0
  74. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/formats.py +0 -0
  75. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/sampling.py +0 -0
  76. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/signals.py +0 -0
  77. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/sourcekind.py +0 -0
  78. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/spec.py +0 -0
  79. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/store.py +0 -0
  80. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/models.py +0 -0
  81. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/nlp.py +0 -0
  82. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/notifications.py +0 -0
  83. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/parser.py +0 -0
  84. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/py.typed +0 -0
  85. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/query.py +0 -0
  86. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/render.py +0 -0
  87. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/__init__.py +0 -0
  88. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/buckets.py +0 -0
  89. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  90. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  91. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  92. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/engine.py +0 -0
  93. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/lexicon.py +0 -0
  94. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/scorespec.py +0 -0
  95. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  96. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/request.schema.json +0 -0
  97. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  98. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  99. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshots.py +0 -0
  100. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/synthetic.py +0 -0
  101. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/tools.py +0 -0
  102. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/watch.py +0 -0
  103. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/Cargo.toml +0 -0
  104. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/blame.rs +0 -0
  105. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/corpus.rs +0 -0
  106. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/corrections.rs +0 -0
  107. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/digest.rs +0 -0
  108. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/facts.rs +0 -0
  109. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/grep.rs +0 -0
  110. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/list.rs +0 -0
  111. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/mod.rs +0 -0
  112. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  113. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/show.rs +0 -0
  114. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/slice.rs +0 -0
  115. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/stats.rs +0 -0
  116. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/watch.rs +0 -0
  117. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/lib.rs +0 -0
  118. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/main.rs +0 -0
  119. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/output.rs +0 -0
  120. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/target.rs +0 -0
  121. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/timearg.rs +0 -0
  122. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/Cargo.toml +0 -0
  123. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/parse.rs +0 -0
  124. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/render.rs +0 -0
  125. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/toolcall.rs +0 -0
  126. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/activity.rs +0 -0
  127. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/actor.rs +0 -0
  128. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/blame.rs +0 -0
  129. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/buckets.rs +0 -0
  130. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/discovery.rs +0 -0
  131. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/mod.rs +0 -0
  132. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/probe.rs +0 -0
  133. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/protocol.rs +0 -0
  134. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/command.rs +0 -0
  135. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/context.rs +0 -0
  136. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/corrections.rs +0 -0
  137. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/cost.rs +0 -0
  138. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/discovery.rs +0 -0
  139. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/facts.rs +0 -0
  140. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/feedback.rs +0 -0
  141. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/filter.rs +0 -0
  142. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/gateway.rs +0 -0
  143. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/ids.rs +0 -0
  144. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/judge.rs +0 -0
  145. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/command.rs +0 -0
  146. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/corrections.rs +0 -0
  147. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/feedback.rs +0 -0
  148. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/mining.rs +0 -0
  149. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/mod.rs +0 -0
  150. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/protocol.rs +0 -0
  151. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/notifications.rs +0 -0
  152. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/protocol.rs +0 -0
  153. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/pystr.rs +0 -0
  154. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/query.rs +0 -0
  155. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/render.rs +0 -0
  156. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/rng.rs +0 -0
  157. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan.rs +0 -0
  158. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_checkpoint.rs +0 -0
  159. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep_stream.rs +0 -0
  160. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
  161. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_index.rs +0 -0
  162. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_projection.rs +0 -0
  163. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_regressions.rs +0 -0
  164. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_stream.rs +0 -0
  165. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/schema.rs +0 -0
  166. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  167. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_text.rs +0 -0
  168. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/sqlite.rs +0 -0
  169. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/watch.rs +0 -0
  170. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/Cargo.toml +0 -0
  171. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/build.rs +0 -0
  172. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  173. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/actor_bridge.rs +0 -0
  174. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  175. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/codex.rs +0 -0
  176. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/command.rs +0 -0
  177. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/context.rs +0 -0
  178. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/corrections.rs +0 -0
  179. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/discovery.rs +0 -0
  180. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/feedback.rs +0 -0
  181. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/judge.rs +0 -0
  182. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/lexicon.rs +0 -0
  183. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/lib.rs +0 -0
  184. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/mining.rs +0 -0
  185. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/nlp.rs +0 -0
  186. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/score.rs +0 -0
  187. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/snapshots.rs +0 -0
  188. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/sqlite.rs +0 -0
  189. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/toolcall.rs +0 -0
  190. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/attachment.rs +0 -0
  191. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/command.rs +0 -0
  192. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/convert.rs +0 -0
  193. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/dunder.rs +0 -0
  194. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/meta.rs +0 -0
  195. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/mod.rs +0 -0
  196. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/print.rs +0 -0
  197. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/system.rs +0 -0
  198. {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/toolresult.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-transcript
3
- Version: 14.35.0
3
+ Version: 14.37.0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -18,7 +18,7 @@ Requires-Dist: ruff>=0.8 ; extra == 'dev'
18
18
  Requires-Dist: sqlite-vec>=0.1.9 ; extra == 'judge'
19
19
  Requires-Dist: model2vec>=0.8.2 ; extra == 'judge'
20
20
  Requires-Dist: numpy>=1.26 ; extra == 'judge'
21
- Requires-Dist: spawnllm>=0.5.4,<0.6 ; extra == 'llm'
21
+ Requires-Dist: spawnllm>=0.17.1,<0.18 ; extra == 'llm'
22
22
  Provides-Extra: dev
23
23
  Provides-Extra: judge
24
24
  Provides-Extra: llm
@@ -3,11 +3,12 @@
3
3
  :func:`extract_correction` harvests the candidate incorrect edits around a
4
4
  feedback anchor (deterministically, via :mod:`cc_transcript.evidence`), then picks
5
5
  the single edit the feedback faults and appends that one row to the shared
6
- ledger. The pick is an LLM call by default — lifted from cc-steer's enrich
7
- prompt — and degrades to the best-overlap candidate when no LLM backend is ready
8
- (:func:`usable_backend` returns None). The pick keys to the candidate's index, so
9
- the row carries the real cross-language ``incorrect_digest`` from the harvested
10
- tool call, never reconstructed content.
6
+ ledger. The pick is a Jev label decision by default; when Jev errors or refuses
7
+ it falls back to an LLM call — lifted from cc-steer's enrich prompt — and to the
8
+ best-overlap candidate when no LLM backend is ready either (:func:`usable_backend`
9
+ returns None). The pick keys to the candidate's index, so the row carries the
10
+ real cross-language ``incorrect_digest`` from the harvested tool call, never
11
+ reconstructed content.
11
12
 
12
13
  Behind the ``[llm]`` extra: this module imports pydantic at definition time and
13
14
  ``spawnllm`` lazily, so only LLM-capable consumers import it. A hook that merely
@@ -29,7 +30,7 @@ if TYPE_CHECKING:
29
30
  from collections.abc import Sequence
30
31
  from pathlib import Path
31
32
 
32
- from spawnllm import LlmBackend, TModel
33
+ from spawnllm import Label, LlmBackend, TModel
33
34
 
34
35
  from cc_transcript.activity import SessionActivity
35
36
  from cc_transcript.corrections import Correction, CorrectionLog
@@ -38,6 +39,13 @@ if TYPE_CHECKING:
38
39
  from cc_transcript.tools import Hunk
39
40
 
40
41
  HUNK_BUDGET = Budget(tool_chars=600)
42
+ NO_CANDIDATE = "none"
43
+
44
+ PICK_QUESTION = """\
45
+ Which single candidate edit does the developer FEEDBACK fault? The candidates are edits an AI coding \
46
+ assistant made shortly before the feedback, newest first, each with the correction that later overwrote \
47
+ it when one was found; the correction ranked most likely by content overlap is tagged [likely fix]. \
48
+ Answer none when the feedback faults the approach, a command, or work outside these edits."""
41
49
 
42
50
  PICK_PROMPT = """\
43
51
  You are grounding one piece of developer FEEDBACK on an AI coding assistant's work
@@ -107,17 +115,37 @@ def candidate_block(index: int, pair: CandidatePair, *, anchor_turn: int, likely
107
115
  )
108
116
 
109
117
 
110
- def build_pick_prompt(feedback: str, pairs: Sequence[CandidatePair], *, anchor_turn: int) -> str:
118
+ def candidate_blocks(pairs: Sequence[CandidatePair], *, anchor_turn: int) -> str:
111
119
  likely = likely_fix(pairs)
112
- return PICK_PROMPT.format(
113
- candidates="\n\n".join(
114
- candidate_block(index, pair, anchor_turn=anchor_turn, likely=pair is likely)
115
- for index, pair in enumerate(pairs, 1)
116
- ),
117
- feedback=feedback,
120
+ return "\n\n".join(
121
+ candidate_block(index, pair, anchor_turn=anchor_turn, likely=pair is likely)
122
+ for index, pair in enumerate(pairs, 1)
123
+ )
124
+
125
+
126
+ def build_pick_prompt(feedback: str, pairs: Sequence[CandidatePair], *, anchor_turn: int) -> str:
127
+ return PICK_PROMPT.format(candidates=candidate_blocks(pairs, anchor_turn=anchor_turn), feedback=feedback)
128
+
129
+
130
+ def pick_label(pairs: Sequence[CandidatePair]) -> Label:
131
+ from spawnllm import Label
132
+
133
+ return Label(
134
+ PICK_QUESTION,
135
+ {
136
+ NO_CANDIDATE: "The feedback is not about any of these edits",
137
+ **{
138
+ str(index): f"candidate {index}: {pair.incorrect.file_path} ({pair.incorrect.tool})"
139
+ for index, pair in enumerate(pairs, 1)
140
+ },
141
+ },
118
142
  )
119
143
 
120
144
 
145
+ def pair_for(choice: str, pairs: Sequence[CandidatePair]) -> CandidatePair | None:
146
+ return None if choice == NO_CANDIDATE else pairs[int(choice) - 1]
147
+
148
+
121
149
  def usable_backend() -> LlmBackend | None:
122
150
  """The first ready spawnllm backend for the ``review`` specialty, or None when none is ready.
123
151
 
@@ -132,11 +160,27 @@ def usable_backend() -> LlmBackend | None:
132
160
  return None
133
161
 
134
162
 
163
+ async def jev_choice(pairs: Sequence[CandidatePair], *, feedback: str, anchor_turn: int) -> str | None:
164
+ from spawnllm import DecideError, DecideKeyMissing, LabelAnswer, decide
165
+
166
+ try:
167
+ decision = await decide(
168
+ {"candidate_edits": candidate_blocks(pairs, anchor_turn=anchor_turn), "feedback": feedback},
169
+ {"pick": pick_label(pairs)},
170
+ )
171
+ except (DecideError, DecideKeyMissing, TimeoutError):
172
+ return None
173
+ answer = decision.answers["pick"]
174
+ return answer.choice if isinstance(answer, LabelAnswer) else None
175
+
176
+
135
177
  async def choose_pair(
136
178
  pairs: Sequence[CandidatePair], *, feedback: str, anchor_turn: int, tier: TModel, backend: LlmBackend | None
137
179
  ) -> CandidatePair | None:
138
180
  from spawnllm import extract
139
181
 
182
+ if (choice := await jev_choice(pairs, feedback=feedback, anchor_turn=anchor_turn)) is not None:
183
+ return pair_for(choice, pairs)
140
184
  if backend is None:
141
185
  return max(pairs, key=lambda pair: pair.overlap)
142
186
  pick = await extract(
@@ -158,9 +202,10 @@ async def extract_correction(
158
202
  ) -> Correction | None:
159
203
  """Harvests around ``anchor`` and appends the one correction ``feedback`` faults.
160
204
 
161
- The faulted candidate is the LLM's pick when ``backend`` is given, else the
162
- best-overlap candidate. Idempotent per anchor: a no-op when this anchor
163
- already has a row, so re-runs and overlapping producers never duplicate.
205
+ The faulted candidate is Jev's pick; when Jev errors or refuses, it is the
206
+ LLM's pick when ``backend`` is given, else the best-overlap candidate.
207
+ Idempotent per anchor: a no-op when this anchor already has a row, so
208
+ re-runs and overlapping producers never duplicate.
164
209
  Returns the appended correction, or None when nothing is harvested or picked.
165
210
  """
166
211
  if await log.for_anchor(anchor.session_id, anchor.event_uuid):
@@ -81,6 +81,7 @@
81
81
  },
82
82
  "max_retained_bytes": {
83
83
  "default": 1073741824,
84
+ "description": "Hard cap on retained accounted bytes. It must be at least the store's startup footprint (the pre-sized delivery and expired-query tables plus the default tool registries); a smaller value is rejected as an invalid configuration. Background admissions are capped at max_retained_bytes - reserved_hook_accounted_bytes, so a footprint above that difference refuses every background admission while foreground hook admissions proceed.",
84
85
  "exclusiveMinimum": 0,
85
86
  "maximum": 9007199254740991,
86
87
  "title": "Max Retained Bytes",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cc-transcript"
3
- version = "14.35.0" # informational — releases stamp the version from the git tag
3
+ version = "14.37.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"
@@ -41,7 +41,7 @@ dev = [
41
41
  "ty>=0.0.44",
42
42
  "ruff>=0.8",
43
43
  ]
44
- llm = ["spawnllm>=0.5.4,<0.6"]
44
+ llm = ["spawnllm>=0.17.1,<0.18"]
45
45
  judge = [
46
46
  "sqlite-vec>=0.1.9",
47
47
  "model2vec>=0.8.2",
@@ -9,6 +9,7 @@ use crate::codex::types::{
9
9
  CodexEntry, CodexItem, CodexSession, EventMsg, ResponseItem, ResponseItemPayload,
10
10
  };
11
11
  use crate::pystr;
12
+ use crate::snapshot_memory::{pins_arena, SourceArena};
12
13
  use crate::types::{
13
14
  AssistantEntry, ContentBlock, Entry, EntryMeta, OtherEntry, ToolResultBlock, ToolUseBlock,
14
15
  UserContent, UserEntry,
@@ -547,15 +548,17 @@ fn payload_tag(payload: &ResponseItemPayload) -> &str {
547
548
  }
548
549
 
549
550
  fn payload_raw(payload: &ResponseItemPayload) -> Value {
551
+ payload_dom(payload).cloned().unwrap_or_default()
552
+ }
553
+
554
+ fn payload_dom(payload: &ResponseItemPayload) -> Option<&Value> {
550
555
  use ResponseItemPayload as R;
551
556
  match payload {
552
- R::ToolSearchCall { arguments, .. } => arguments.clone(),
553
- R::LocalShellCall { action, .. } | R::WebSearchCall { action, .. } => {
554
- action.clone().unwrap_or_default()
555
- }
556
- R::GhostSnapshot(v) => v.clone(),
557
- R::Other { raw, .. } => raw.clone(),
558
- _ => Value::default(),
557
+ R::ToolSearchCall { arguments, .. } => Some(arguments),
558
+ R::LocalShellCall { action, .. } | R::WebSearchCall { action, .. } => action.as_ref(),
559
+ R::GhostSnapshot(v) => Some(v),
560
+ R::Other { raw, .. } => Some(raw),
561
+ _ => None,
559
562
  }
560
563
  }
561
564
 
@@ -592,6 +595,10 @@ fn event_tag(em: &EventMsg) -> &str {
592
595
  }
593
596
 
594
597
  fn event_raw(em: &EventMsg) -> Value {
598
+ event_dom(em).cloned().unwrap_or_default()
599
+ }
600
+
601
+ fn event_dom(em: &EventMsg) -> Option<&Value> {
595
602
  use EventMsg as E;
596
603
  match em {
597
604
  E::ExecCommandEnd(v)
@@ -607,11 +614,75 @@ fn event_raw(em: &EventMsg) -> Value {
607
614
  | E::CollabAgentSpawnEnd(v)
608
615
  | E::CollabWaitingEnd(v)
609
616
  | E::CollabCloseEnd(v)
610
- | E::Other { raw: v, .. } => v.clone(),
611
- _ => Value::default(),
617
+ | E::Other { raw: v, .. } => Some(v),
618
+ _ => None,
619
+ }
620
+ }
621
+
622
+ pub(crate) fn line_dom(item: &CodexItem) -> Option<&Value> {
623
+ use ResponseItemPayload as R;
624
+ match item {
625
+ CodexItem::SessionMeta(m) => Some(&m.raw),
626
+ CodexItem::TurnContext(v) => Some(v),
627
+ CodexItem::WorldState(w) => Some(&w.state),
628
+ CodexItem::ResponseItem(ri) => match &ri.payload {
629
+ R::FunctionCallOutput { output, .. } | R::CustomToolCallOutput { output, .. } => {
630
+ Some(output)
631
+ }
632
+ payload => payload_dom(payload),
633
+ },
634
+ CodexItem::EventMsg(em) => event_dom(em),
635
+ CodexItem::Compacted(_)
636
+ | CodexItem::InterAgentCommunicationMetadata { .. }
637
+ | CodexItem::Other(_) => None,
638
+ }
639
+ }
640
+
641
+ fn retains_line(entry: &Entry) -> bool {
642
+ match entry {
643
+ Entry::Other(other) => pins_arena(&other.raw),
644
+ _ => entry
645
+ .tool_results()
646
+ .any(|result| result.tool_use_result.as_ref().is_some_and(pins_arena)),
647
+ }
648
+ }
649
+
650
+ fn lowered_arenas(source: &CodexEntry, entry: &Entry) -> Vec<SourceArena> {
651
+ match (&source.item, entry) {
652
+ (CodexItem::Other(other), Entry::Other(lowered)) => pins_arena(&lowered.raw)
653
+ .then(|| SourceArena {
654
+ root: lowered.raw.clone(),
655
+ source_len: other.raw.len(),
656
+ })
657
+ .into_iter()
658
+ .collect(),
659
+ _ => source
660
+ .source
661
+ .iter()
662
+ .filter(|_| retains_line(entry))
663
+ .cloned()
664
+ .collect(),
612
665
  }
613
666
  }
614
667
 
668
+ pub(crate) fn session_arenas(
669
+ session: &CodexSession,
670
+ entries: &[Entry],
671
+ ) -> Vec<(usize, SourceArena)> {
672
+ assert_eq!(session.entries.len(), entries.len());
673
+ session
674
+ .entries
675
+ .iter()
676
+ .zip(entries)
677
+ .enumerate()
678
+ .flat_map(|(index, (source, entry))| {
679
+ lowered_arenas(source, entry)
680
+ .into_iter()
681
+ .map(move |arena| (index, arena))
682
+ })
683
+ .collect()
684
+ }
685
+
615
686
  #[cfg(test)]
616
687
  mod tests {
617
688
  use std::collections::HashSet;
@@ -1339,4 +1410,44 @@ mod tests {
1339
1410
  "050b lifted turns must expose the interrupted user entry"
1340
1411
  );
1341
1412
  }
1413
+
1414
+ #[test]
1415
+ fn lowered_entries_record_the_arenas_they_keep() {
1416
+ let lines = [
1417
+ r#"{"timestamp":"2026-07-19T00:00:00Z","type":"response_item","payload":{"type":"function_call_output","call_id":"c","output":{"stdout":"x"}}}"#,
1418
+ r#"{"timestamp":"2026-07-19T00:00:01Z","type":"response_item","payload":{"type":"function_call","call_id":"c","name":"exec","arguments":"{}"}}"#,
1419
+ r#"{"timestamp":"2026-07-19T00:00:02Z","type":"event_msg","payload":{"type":"task_started","turn_id":"t"}}"#,
1420
+ r#"{"timestamp":"2026-07-19T00:00:03Z","type":"turn_context","payload":{"cwd":"/w","model":"m"}}"#,
1421
+ r#"{"timestamp":"2026-07-19T00:00:04Z","type":"mystery","payload":{"k":1}}"#,
1422
+ r#"{"timestamp":"2026-07-19T00:00:05Z","type":"response_item","payload":{"type":"function_call_output","call_id":"d","output":"plain"}}"#,
1423
+ ];
1424
+ let session = parse_codex_bytes(lines.join("\n").as_bytes());
1425
+ let entries = lower(&session).entries;
1426
+ assert_eq!(
1427
+ session
1428
+ .entries
1429
+ .iter()
1430
+ .map(|entry| entry.source.as_ref().map(|source| source.source_len))
1431
+ .collect::<Vec<_>>(),
1432
+ [
1433
+ Some(lines[0].len()),
1434
+ None,
1435
+ None,
1436
+ Some(lines[3].len()),
1437
+ None,
1438
+ Some(lines[5].len())
1439
+ ]
1440
+ );
1441
+ assert_eq!(
1442
+ session_arenas(&session, &entries)
1443
+ .iter()
1444
+ .map(|(entry, arena)| (*entry, arena.source_len))
1445
+ .collect::<Vec<_>>(),
1446
+ [
1447
+ (0, lines[0].len()),
1448
+ (3, lines[3].len()),
1449
+ (4, lines[4].len())
1450
+ ]
1451
+ );
1452
+ }
1342
1453
  }
@@ -1,12 +1,14 @@
1
1
  use memchr::memchr_iter;
2
2
  use sonic_rs::{JsonContainerTrait, JsonValueTrait, Value};
3
3
 
4
+ use crate::codex::lower::line_dom;
4
5
  use crate::codex::types::{
5
6
  CodexEntry, CodexItem, CodexOther, CodexSession, Compacted, EventMsg, ResponseItem,
6
7
  ResponseItemPayload, SessionMeta, TokenUsage, TokenUsageInfo, WorldState,
7
8
  };
8
9
  use crate::parse::parse_timestamp;
9
- use crate::value::{field, field_str, normalize_last_wins};
10
+ use crate::snapshot_memory::{pins_arena, SourceArena};
11
+ use crate::value::{deduplicated, field, field_str};
10
12
 
11
13
  const AVG_CODEX_LINE_BYTES: usize = 700;
12
14
 
@@ -65,14 +67,21 @@ fn parse_codex_line(line: &[u8], line_index: usize, entries: &mut Vec<CodexEntry
65
67
  return;
66
68
  }
67
69
  match sonic_rs::from_slice::<Value>(line) {
68
- Ok(mut value) => {
69
- normalize_last_wins(&mut value);
70
+ Ok(parsed) => {
71
+ let (value, source_len) = deduplicated(&parsed).unwrap_or_else(|| (parsed, line.len()));
70
72
  let timestamp = field_str(&value, "timestamp").and_then(|s| parse_timestamp(s).ok());
71
73
  let item = parse_codex_item(&value, line);
74
+ let source = line_dom(&item)
75
+ .is_some_and(pins_arena)
76
+ .then(|| SourceArena {
77
+ root: value,
78
+ source_len,
79
+ });
72
80
  entries.push(CodexEntry {
73
81
  line_index,
74
82
  timestamp,
75
83
  item,
84
+ source,
76
85
  });
77
86
  }
78
87
  Err(_) => entries.push(CodexEntry {
@@ -82,6 +91,7 @@ fn parse_codex_line(line: &[u8], line_index: usize, entries: &mut Vec<CodexEntry
82
91
  ty: None,
83
92
  raw: String::from_utf8_lossy(line).into_owned(),
84
93
  }),
94
+ source: None,
85
95
  }),
86
96
  }
87
97
  }
@@ -1,11 +1,14 @@
1
1
  use chrono::{DateTime, FixedOffset};
2
2
  use sonic_rs::Value;
3
3
 
4
+ use crate::snapshot_memory::SourceArena;
5
+
4
6
  #[derive(Debug)]
5
7
  pub struct CodexEntry {
6
8
  pub line_index: usize,
7
9
  pub timestamp: Option<DateTime<FixedOffset>>,
8
10
  pub item: CodexItem,
11
+ pub source: Option<SourceArena>,
9
12
  }
10
13
 
11
14
  #[derive(Debug)]
@@ -40,6 +40,7 @@ pub mod snapshot;
40
40
  pub mod snapshot_activity;
41
41
  pub mod snapshot_codec;
42
42
  pub mod snapshot_labels;
43
+ pub mod snapshot_ledger;
43
44
  pub mod snapshot_memory;
44
45
  pub mod snapshot_owned;
45
46
  pub mod snapshot_prepared;