cc-transcript 14.45.13__tar.gz → 14.45.15__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.45.13 → cc_transcript-14.45.15}/PKG-INFO +1 -1
  2. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/pyproject.toml +1 -1
  3. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot.rs +243 -5
  4. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_activity.rs +17 -0
  5. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_projection.rs +615 -48
  6. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/Cargo.lock +0 -0
  7. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/Cargo.toml +0 -0
  8. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/LICENSE +0 -0
  9. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/README.md +0 -0
  10. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/__init__.py +0 -0
  11. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/__init__.pyi +0 -0
  12. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/_native.pyi +0 -0
  13. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/activity.py +0 -0
  14. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/activity_probe.py +0 -0
  15. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/builders.py +0 -0
  16. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/codex.py +0 -0
  17. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/command.py +0 -0
  18. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/context.py +0 -0
  19. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/corrections.py +0 -0
  20. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/cost.py +0 -0
  21. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/decision_store.py +0 -0
  22. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/decisions.py +0 -0
  23. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/discovery.py +0 -0
  24. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/disktruth.py +0 -0
  25. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/evidence.py +0 -0
  26. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/extract/__init__.py +0 -0
  27. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/extract/correct.py +0 -0
  28. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/facts.py +0 -0
  29. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/filterspec.py +0 -0
  30. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/heartbeats.py +0 -0
  31. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/ids.py +0 -0
  32. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/__init__.py +0 -0
  33. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/llm.py +0 -0
  34. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/similar.py +0 -0
  35. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/verdicts.py +0 -0
  36. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/ledger.py +0 -0
  37. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/literals.py +0 -0
  38. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/__init__.py +0 -0
  39. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/candidates.py +0 -0
  40. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/confidence.py +0 -0
  41. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/engine.py +0 -0
  42. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/formats.py +0 -0
  43. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/sampling.py +0 -0
  44. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/signals.py +0 -0
  45. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/sourcekind.py +0 -0
  46. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/spec.py +0 -0
  47. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/store.py +0 -0
  48. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/models.py +0 -0
  49. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/nlp.py +0 -0
  50. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/notifications.py +0 -0
  51. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/parser.py +0 -0
  52. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/py.typed +0 -0
  53. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/query.py +0 -0
  54. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/render.py +0 -0
  55. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/__init__.py +0 -0
  56. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/buckets.py +0 -0
  57. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  58. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  59. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  60. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/engine.py +0 -0
  61. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/lexicon.py +0 -0
  62. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/scorespec.py +0 -0
  63. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  64. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  65. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/request.schema.json +0 -0
  66. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  67. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  68. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshots.py +0 -0
  69. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/synthetic.py +0 -0
  70. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/tools.py +0 -0
  71. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/watch.py +0 -0
  72. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/Cargo.toml +0 -0
  73. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/blame.rs +0 -0
  74. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/corpus.rs +0 -0
  75. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/corrections.rs +0 -0
  76. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/digest.rs +0 -0
  77. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/facts.rs +0 -0
  78. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/grep.rs +0 -0
  79. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/list.rs +0 -0
  80. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/mod.rs +0 -0
  81. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  82. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/show.rs +0 -0
  83. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/slice.rs +0 -0
  84. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/stats.rs +0 -0
  85. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/watch.rs +0 -0
  86. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/lib.rs +0 -0
  87. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/output.rs +0 -0
  88. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/target.rs +0 -0
  89. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/timearg.rs +0 -0
  90. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/Cargo.toml +0 -0
  91. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/parse.rs +0 -0
  92. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/render.rs +0 -0
  93. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/toolcall.rs +0 -0
  94. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/build.rs +0 -0
  95. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/activity.rs +0 -0
  96. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/actor.rs +0 -0
  97. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/blame.rs +0 -0
  98. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/buckets.rs +0 -0
  99. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/discovery.rs +0 -0
  100. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/lower.rs +0 -0
  101. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/mod.rs +0 -0
  102. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/parse.rs +0 -0
  103. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/probe.rs +0 -0
  104. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/protocol.rs +0 -0
  105. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/types.rs +0 -0
  106. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/command.rs +0 -0
  107. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/context.rs +0 -0
  108. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/corrections.rs +0 -0
  109. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/cost.rs +0 -0
  110. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/discovery.rs +0 -0
  111. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/facts.rs +0 -0
  112. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/feedback.rs +0 -0
  113. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/filter.rs +0 -0
  114. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/gateway.rs +0 -0
  115. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/ids.rs +0 -0
  116. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/judge.rs +0 -0
  117. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/lib.rs +0 -0
  118. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/command.rs +0 -0
  119. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/corrections.rs +0 -0
  120. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/feedback.rs +0 -0
  121. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/mining.rs +0 -0
  122. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/mod.rs +0 -0
  123. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/protocol.rs +0 -0
  124. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/notifications.rs +0 -0
  125. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/parse.rs +0 -0
  126. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/protocol.rs +0 -0
  127. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/pystr.rs +0 -0
  128. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/query.rs +0 -0
  129. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/render.rs +0 -0
  130. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/rng.rs +0 -0
  131. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan.rs +0 -0
  132. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_checkpoint.rs +0 -0
  133. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep.rs +0 -0
  134. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep_stream.rs +0 -0
  135. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
  136. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_index.rs +0 -0
  137. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_projection.rs +0 -0
  138. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_regressions.rs +0 -0
  139. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_stream.rs +0 -0
  140. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/schema.rs +0 -0
  141. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_codec.rs +0 -0
  142. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
  143. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_labels.rs +0 -0
  144. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_ledger.rs +0 -0
  145. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_ledger_tests.rs +0 -0
  146. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_memory.rs +0 -0
  147. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_owned.rs +0 -0
  148. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared.rs +0 -0
  149. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
  150. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared_service.rs +0 -0
  151. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  152. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
  153. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_text.rs +0 -0
  154. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/sqlite.rs +0 -0
  155. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/toolcall.rs +0 -0
  156. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/types.rs +0 -0
  157. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/value.rs +0 -0
  158. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/watch.rs +0 -0
  159. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/tests/sonic_arena_model.rs +0 -0
  160. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/tests/std_allocation_model.rs +0 -0
  161. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/Cargo.toml +0 -0
  162. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/build.rs +0 -0
  163. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  164. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/actor_bridge.rs +0 -0
  165. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  166. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/codex.rs +0 -0
  167. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/command.rs +0 -0
  168. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/context.rs +0 -0
  169. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/corrections.rs +0 -0
  170. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/discovery.rs +0 -0
  171. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/feedback.rs +0 -0
  172. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/judge.rs +0 -0
  173. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/lexicon.rs +0 -0
  174. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/lib.rs +0 -0
  175. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/mining.rs +0 -0
  176. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/nlp.rs +0 -0
  177. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/python.rs +0 -0
  178. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/render.rs +0 -0
  179. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/score.rs +0 -0
  180. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/snapshot_decode.rs +0 -0
  181. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/snapshots.rs +0 -0
  182. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/sqlite.rs +0 -0
  183. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/toolcall.rs +0 -0
  184. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/attachment.rs +0 -0
  185. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/blocks.rs +0 -0
  186. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/command.rs +0 -0
  187. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/convert.rs +0 -0
  188. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/dunder.rs +0 -0
  189. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/events.rs +0 -0
  190. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/meta.rs +0 -0
  191. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/mod.rs +0 -0
  192. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/print.rs +0 -0
  193. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/store.rs +0 -0
  194. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/system.rs +0 -0
  195. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/toolcall.rs +0 -0
  196. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/toolresult.rs +0 -0
  197. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/transcript.rs +0 -0
  198. {cc_transcript-14.45.13 → cc_transcript-14.45.15}/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.45.13
3
+ Version: 14.45.15
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.45.13" # informational — releases stamp the version from the git tag
3
+ version = "14.45.15" # 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"
@@ -7143,6 +7143,7 @@ impl NativeStore {
7143
7143
  let mut lines: Vec<(u64, Vec<Entry>)> = Vec::new();
7144
7144
  let mut events = 0usize;
7145
7145
  let mut exhausted = false;
7146
+ let mut read_step = self.config.read_step.min(64 * 1024);
7146
7147
  loop {
7147
7148
  while events < count {
7148
7149
  cancel.check(limits.deadline_unix_ms)?;
@@ -7165,11 +7166,7 @@ impl NativeStore {
7165
7166
  }
7166
7167
  break;
7167
7168
  }
7168
- let step = self
7169
- .config
7170
- .read_step
7171
- .min(budget - read)
7172
- .min(pending_start as usize);
7169
+ let step = read_step.min(budget - read).min(pending_start as usize);
7173
7170
  if step == 0 {
7174
7171
  exhausted = true;
7175
7172
  break;
@@ -7183,6 +7180,7 @@ impl NativeStore {
7183
7180
  file.read_exact(&mut block).map_err(io_error)?;
7184
7181
  usage[1] += step as u64;
7185
7182
  read += step;
7183
+ read_step = read_step.saturating_mul(2).min(self.config.read_step);
7186
7184
  block.extend_from_slice(&pending);
7187
7185
  pending = block;
7188
7186
  pending_start -= step as u64;
@@ -11662,6 +11660,60 @@ mod tests {
11662
11660
  assert_eq!(state.counters[4], 1);
11663
11661
  assert_eq!(state.counters[1], pinned_size + 128);
11664
11662
  }
11663
+ #[test]
11664
+ fn turn_projection_cursor_preserves_native_page_status_and_zero_item_incompleteness() {
11665
+ let source = Source::new(
11666
+ &(0..600)
11667
+ .map(|index| format!("{}\n", user(&format!("u{index}"))))
11668
+ .collect::<String>(),
11669
+ );
11670
+ let store = NativeStore::new(&json!({})).unwrap();
11671
+ let owner = context("turn-pages");
11672
+ let cancel = Cancellation::default();
11673
+ let mut acquiring = acquire(&source.path);
11674
+ acquiring["limits"].insert("max_events", json!(10000));
11675
+ let root = finish(&store, store.request(&acquiring, &owner, &cancel), &owner);
11676
+ assert_eq!(root["status"].as_str(), Some("ok"));
11677
+ for reverse in [false, true] {
11678
+ let mut req = graph_request(
11679
+ &root,
11680
+ json!({"kind":"turns","order":if reverse {"reverse"} else {"forward"}}),
11681
+ Vec::new(),
11682
+ json!([]),
11683
+ );
11684
+ req["limits"].insert("max_events", json!(10000));
11685
+ req["limits"].insert("max_items", json!(600));
11686
+ req["limits"].insert("max_read_bytes", json!(16 * 1024 * 1024));
11687
+ let mut response = store.request(&req, &owner, &cancel);
11688
+ for (page_index, expected_items) in [256, 256, 88].into_iter().enumerate() {
11689
+ assert_eq!(
11690
+ response["data"]["records_json"].as_array().unwrap().len(),
11691
+ expected_items
11692
+ );
11693
+ if page_index == 2 {
11694
+ assert_eq!(response["status"].as_str(), Some("ok"));
11695
+ assert!(response["cursor"].is_null());
11696
+ assert!(response["reason"].is_null());
11697
+ } else {
11698
+ assert_eq!(response["status"].as_str(), Some("incomplete"));
11699
+ assert_eq!(response["reason"].as_str(), Some("item_limit"));
11700
+ let cursor = response["cursor"].as_str().unwrap().to_owned();
11701
+ response = store.request(
11702
+ &json!({"schema":SCHEMA,"id":"turn-resume","operation":"resume","cursor":cursor}),
11703
+ &owner,
11704
+ &cancel,
11705
+ );
11706
+ }
11707
+ }
11708
+ req["limits"].insert("max_items", json!(0));
11709
+ let zero = store.request(&req, &owner, &cancel);
11710
+ assert_eq!(zero["status"].as_str(), Some("incomplete"));
11711
+ assert_eq!(zero["reason"].as_str(), Some("item_limit"));
11712
+ assert!(zero["cursor"].is_null());
11713
+ assert!(zero["data"]["records_json"].as_array().unwrap().is_empty());
11714
+ }
11715
+ }
11716
+
11665
11717
  fn graph_request(
11666
11718
  root: &Value,
11667
11719
  query: Value,
@@ -12203,6 +12255,192 @@ mod tests {
12203
12255
  .collect()
12204
12256
  }
12205
12257
 
12258
+ fn tail_with_small_step_reference(source: &Source, count: usize, budget: usize) -> Value {
12259
+ let owner = context("a");
12260
+ let request = tail_request(&source.path, count, budget);
12261
+ let store = NativeStore::new(&json!({})).unwrap();
12262
+ let response = store.request(&request, &owner, &Cancellation::default());
12263
+ let reference = NativeStore::new(&json!({"max_read_bytes_per_step":4096})).unwrap();
12264
+ let reference = reference.request(&request, &owner, &Cancellation::default());
12265
+ assert_eq!(response["status"], reference["status"], "{response:?}");
12266
+ assert_eq!(response["reason"], reference["reason"], "{response:?}");
12267
+ assert_eq!(response["data"], reference["data"], "{response:?}");
12268
+ response
12269
+ }
12270
+
12271
+ #[test]
12272
+ fn tail_default_steps_read_only_the_newest_event_window() {
12273
+ let suffix = (0..256)
12274
+ .map(|index| format!("{}\n", user_text(&index.to_string(), &"x".repeat(1400))))
12275
+ .collect::<String>();
12276
+ assert!((256 * 1024..448 * 1024).contains(&suffix.len()));
12277
+ let prefix = format!("{}\n", " ".repeat(8 * 1024 * 1024));
12278
+ let source = Source::new(&format!("{prefix}{suffix}"));
12279
+ let response = tail_with_small_step_reference(&source, 256, 8 * 1024 * 1024);
12280
+ assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
12281
+ assert_eq!(
12282
+ tail_uuids(&response),
12283
+ (0..256).map(|index| index.to_string()).collect::<Vec<_>>()
12284
+ );
12285
+ assert_eq!(
12286
+ response["data"]["source_bytes"].as_u64(),
12287
+ Some((prefix.len() + suffix.len()) as u64)
12288
+ );
12289
+ assert_eq!(
12290
+ response["data"]["window_start_byte"].as_u64(),
12291
+ Some(prefix.len() as u64)
12292
+ );
12293
+ let read = response["usage"]["source_bytes_read"].as_u64().unwrap();
12294
+ assert!(read >= suffix.len() as u64 && read <= 512 * 1024, "{read}");
12295
+ }
12296
+
12297
+ #[test]
12298
+ fn tail_grows_reads_for_a_long_partial_line() {
12299
+ fn count_reads(store: &Arc<NativeStore>, reads: &Arc<AtomicUsize>) {
12300
+ let next = Arc::downgrade(store);
12301
+ let reads = Arc::clone(reads);
12302
+ *store.read_hook.lock().unwrap() = Some(Arc::new(move || {
12303
+ reads.fetch_add(1, Ordering::Relaxed);
12304
+ count_reads(&next.upgrade().unwrap(), &reads);
12305
+ }));
12306
+ }
12307
+
12308
+ let prefix = format!("{}\n", " ".repeat(8 * 1024 * 1024));
12309
+ let suffix = format!("{}\n", user_text("large", &"x".repeat(512 * 1024)));
12310
+ let source = Source::new(&format!("{prefix}{suffix}"));
12311
+ let owner = context("a");
12312
+ let request = tail_request(&source.path, 1, 8 * 1024 * 1024);
12313
+ let store = Arc::new(NativeStore::new(&json!({})).unwrap());
12314
+ let reads = Arc::new(AtomicUsize::new(0));
12315
+ count_reads(&store, &reads);
12316
+ let response = store.request(&request, &owner, &Cancellation::default());
12317
+ assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
12318
+ assert_eq!(tail_uuids(&response), ["large"]);
12319
+ assert_eq!(
12320
+ response["data"]["window_start_byte"].as_u64(),
12321
+ Some(prefix.len() as u64)
12322
+ );
12323
+ assert!(response["usage"]["source_bytes_read"].as_u64().unwrap() <= 1024 * 1024);
12324
+ assert!(reads.load(Ordering::Relaxed) <= 4);
12325
+ let bounded = NativeStore::new(&json!({"max_entry_bytes":256*1024})).unwrap();
12326
+ let refused = bounded.request(&request, &owner, &Cancellation::default());
12327
+ assert_eq!(
12328
+ refused["status"].as_str(),
12329
+ Some("entry_limit"),
12330
+ "{refused:?}"
12331
+ );
12332
+ }
12333
+
12334
+ #[test]
12335
+ fn tail_preserves_utf8_across_growing_read_boundaries() {
12336
+ let mut split_scalars = 0;
12337
+ for ending in ["", "\n"] {
12338
+ let contents = format!(
12339
+ "{}\n{}{ending}",
12340
+ user("old"),
12341
+ user_text("unicode", &"é".repeat(128 * 1024))
12342
+ );
12343
+ let boundary = contents.len() - 64 * 1024;
12344
+ split_scalars += usize::from(contents.as_bytes()[boundary] & 0xc0 == 0x80);
12345
+ let source = Source::new(&contents);
12346
+ let response = tail_with_small_step_reference(&source, 1, 1024 * 1024);
12347
+ assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
12348
+ assert_eq!(tail_uuids(&response), ["unicode"]);
12349
+ assert_eq!(
12350
+ response["data"]["window_start_byte"].as_u64(),
12351
+ Some((user("old").len() + 1) as u64)
12352
+ );
12353
+ }
12354
+ assert_eq!(split_scalars, 1);
12355
+ }
12356
+
12357
+ #[test]
12358
+ fn tail_read_budget_requires_the_oldest_line_delimiter() {
12359
+ let prefix = format!("{}\n", user("old"));
12360
+ let first = format!("{}\n", user_text("a", &"x".repeat(128 * 1024)));
12361
+ let last = format!("{}\n", user_text("b", &"x".repeat(128 * 1024)));
12362
+ let source = Source::new(&format!("{prefix}{first}{last}"));
12363
+ let budget = first.len() + last.len();
12364
+ let incomplete = tail_with_small_step_reference(&source, 2, budget);
12365
+ assert_eq!(
12366
+ incomplete["status"].as_str(),
12367
+ Some("incomplete"),
12368
+ "{incomplete:?}"
12369
+ );
12370
+ assert_eq!(
12371
+ incomplete["reason"].as_str(),
12372
+ Some("tail read budget exhausted")
12373
+ );
12374
+ assert!(incomplete["cursor"].is_null());
12375
+ assert_eq!(tail_uuids(&incomplete), ["b"]);
12376
+ assert_eq!(
12377
+ incomplete["data"]["window_start_byte"].as_u64(),
12378
+ Some((prefix.len() + first.len()) as u64)
12379
+ );
12380
+ let complete = tail_with_small_step_reference(&source, 2, budget + 1);
12381
+ assert_eq!(complete["status"].as_str(), Some("ok"), "{complete:?}");
12382
+ assert_eq!(tail_uuids(&complete), ["a", "b"]);
12383
+ assert_eq!(
12384
+ complete["data"]["window_start_byte"].as_u64(),
12385
+ Some(prefix.len() as u64)
12386
+ );
12387
+ }
12388
+
12389
+ #[test]
12390
+ fn tail_counts_metadata_events_and_skips_non_events_across_steps() {
12391
+ let source = Source::new(&format!(
12392
+ "{}\n{}\nnot json\n[]\nnull\n42\n{{\"type\":\"queue-operation\",\"operation\":\"enqueue\"}}\n{}\n",
12393
+ user("a"),
12394
+ " ".repeat(96 * 1024),
12395
+ user_text("b", &"x".repeat(128 * 1024)),
12396
+ ));
12397
+ let response = tail_with_small_step_reference(&source, 3, 1024 * 1024);
12398
+ assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
12399
+ let records = response["data"]["records_json"]
12400
+ .as_array()
12401
+ .unwrap()
12402
+ .iter()
12403
+ .map(|record| record.as_str().unwrap().to_owned())
12404
+ .collect::<Vec<_>>();
12405
+ let records = crate::snapshot_codec::decode_events(&records, 1024 * 1024).unwrap();
12406
+ assert_eq!(records.len(), 3);
12407
+ assert_eq!(records[0].event.meta().unwrap().uuid, "a");
12408
+ assert!(matches!(&records[1].event, Entry::Other(other) if other.ty == "queue-operation"));
12409
+ assert_eq!(records[2].event.meta().unwrap().uuid, "b");
12410
+ assert_eq!(response["data"]["window_start_byte"].as_u64(), Some(0));
12411
+ }
12412
+
12413
+ #[test]
12414
+ fn tail_preserves_the_pinned_source_while_reads_grow() {
12415
+ let prefix = format!("{}\n", user("old"));
12416
+ let suffix = format!("{}\n", user_text("new", &"x".repeat(256 * 1024)));
12417
+ let source = Source::new(&format!("{prefix}{suffix}"));
12418
+ let path = source.path.clone();
12419
+ let store = NativeStore::new(&json!({})).unwrap();
12420
+ *store.read_hook.lock().unwrap() = Some(Arc::new(move || {
12421
+ std::fs::OpenOptions::new()
12422
+ .append(true)
12423
+ .open(&path)
12424
+ .unwrap()
12425
+ .write_all(format!("{}\n", user("appended")).as_bytes())
12426
+ .unwrap();
12427
+ }));
12428
+ let response = store.request(
12429
+ &tail_request(&source.path, 1, 1024 * 1024),
12430
+ &context("a"),
12431
+ &Cancellation::default(),
12432
+ );
12433
+ assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
12434
+ assert_eq!(tail_uuids(&response), ["new"]);
12435
+ assert_eq!(
12436
+ response["data"]["source_bytes"].as_u64(),
12437
+ Some((prefix.len() + suffix.len()) as u64)
12438
+ );
12439
+ assert_eq!(
12440
+ response["data"]["window_start_byte"].as_u64(),
12441
+ Some(prefix.len() as u64)
12442
+ );
12443
+ }
12206
12444
  #[test]
12207
12445
  fn tail_returns_the_newest_events_reading_backwards_in_bounded_steps() {
12208
12446
  let source = Source::new(&users(0..50));
@@ -41,6 +41,7 @@ pub(crate) struct CachedCall {
41
41
  #[derive(Debug, Clone)]
42
42
  pub(crate) struct CachedTurn {
43
43
  prompt: String,
44
+ prompt_count: usize,
44
45
  bounds: Range<usize>,
45
46
  started: Option<usize>,
46
47
  ended: Option<usize>,
@@ -252,6 +253,8 @@ impl ActivityIndex {
252
253
  }
253
254
  }
254
255
  let turn = CachedTurn {
256
+ prompt_count: next.prompt_count_before(next.turn_count())
257
+ + usize::from(!indexed.prompt.is_empty()),
255
258
  prompt: indexed.prompt,
256
259
  bounds: first_new_index + indexed.start..first_new_index + indexed.end,
257
260
  started: indexed.started_idx.map(|i| first_new_index + i),
@@ -299,6 +302,19 @@ impl ActivityIndex {
299
302
  self.turns.get(index).map(|turn| turn.prompt.as_str())
300
303
  }
301
304
 
305
+ pub(crate) fn prompt_count_before(&self, turn: usize) -> usize {
306
+ if turn == 0 {
307
+ 0
308
+ } else {
309
+ self.turns[turn - 1].prompt_count
310
+ }
311
+ }
312
+
313
+ pub(crate) fn prompt_turn(&self, ordinal: usize) -> usize {
314
+ self.turns
315
+ .partition_point(|turn| turn.prompt_count <= ordinal)
316
+ }
317
+
302
318
  pub fn turn_bounds(&self, index: usize) -> Option<Range<usize>> {
303
319
  self.turns.get(index).map(|turn| turn.bounds.clone())
304
320
  }
@@ -558,6 +574,7 @@ impl ActivityIndex {
558
574
  for turn in turns.iter() {
559
575
  let CachedTurn {
560
576
  prompt,
577
+ prompt_count: _,
561
578
  bounds: _,
562
579
  started: _,
563
580
  ended: _,