cc-transcript 14.28.2__tar.gz → 14.28.4__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.28.2 → cc_transcript-14.28.4}/PKG-INFO +1 -1
  2. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/pyproject.toml +1 -1
  3. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/target.rs +39 -14
  4. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/scan.rs +39 -1
  5. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/scan_regressions.rs +36 -0
  6. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot.rs +37 -1
  7. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_prepared_service.rs +35 -6
  8. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/Cargo.lock +0 -0
  9. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/Cargo.toml +0 -0
  10. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/LICENSE +0 -0
  11. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/README.md +0 -0
  12. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/__init__.py +0 -0
  13. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/__init__.pyi +0 -0
  14. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/_native.pyi +0 -0
  15. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/activity.py +0 -0
  16. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/activity_probe.py +0 -0
  17. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/builders.py +0 -0
  18. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/codex.py +0 -0
  19. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/command.py +0 -0
  20. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/context.py +0 -0
  21. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/corrections.py +0 -0
  22. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/cost.py +0 -0
  23. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/decision_store.py +0 -0
  24. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/decisions.py +0 -0
  25. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/discovery.py +0 -0
  26. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/disktruth.py +0 -0
  27. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/evidence.py +0 -0
  28. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/extract/__init__.py +0 -0
  29. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/extract/correct.py +0 -0
  30. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/facts.py +0 -0
  31. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/filterspec.py +0 -0
  32. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/heartbeats.py +0 -0
  33. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/ids.py +0 -0
  34. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/judge/__init__.py +0 -0
  35. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/judge/llm.py +0 -0
  36. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/judge/similar.py +0 -0
  37. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/judge/verdicts.py +0 -0
  38. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/ledger.py +0 -0
  39. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/literals.py +0 -0
  40. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/__init__.py +0 -0
  41. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/candidates.py +0 -0
  42. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/confidence.py +0 -0
  43. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/engine.py +0 -0
  44. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/formats.py +0 -0
  45. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/sampling.py +0 -0
  46. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/signals.py +0 -0
  47. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/sourcekind.py +0 -0
  48. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/spec.py +0 -0
  49. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/mining/store.py +0 -0
  50. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/models.py +0 -0
  51. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/nlp.py +0 -0
  52. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/notifications.py +0 -0
  53. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/parser.py +0 -0
  54. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/py.typed +0 -0
  55. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/query.py +0 -0
  56. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/render.py +0 -0
  57. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/__init__.py +0 -0
  58. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/buckets.py +0 -0
  59. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  60. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  61. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  62. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/engine.py +0 -0
  63. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/lexicon.py +0 -0
  64. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/sentiment/scorespec.py +0 -0
  65. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  66. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  67. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshot_schema/request.schema.json +0 -0
  68. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  69. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  70. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/snapshots.py +0 -0
  71. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/synthetic.py +0 -0
  72. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/tools.py +0 -0
  73. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/cc_transcript/watch.py +0 -0
  74. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/Cargo.toml +0 -0
  75. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/blame.rs +0 -0
  76. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/corpus.rs +0 -0
  77. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/corrections.rs +0 -0
  78. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/digest.rs +0 -0
  79. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/facts.rs +0 -0
  80. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/grep.rs +0 -0
  81. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/list.rs +0 -0
  82. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/mod.rs +0 -0
  83. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  84. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/show.rs +0 -0
  85. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/slice.rs +0 -0
  86. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/stats.rs +0 -0
  87. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/commands/watch.rs +0 -0
  88. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/lib.rs +0 -0
  89. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/main.rs +0 -0
  90. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/output.rs +0 -0
  91. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/cli/src/timearg.rs +0 -0
  92. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/Cargo.toml +0 -0
  93. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/benches/parse.rs +0 -0
  94. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/benches/render.rs +0 -0
  95. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/benches/toolcall.rs +0 -0
  96. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/activity.rs +0 -0
  97. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/actor.rs +0 -0
  98. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/blame.rs +0 -0
  99. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/buckets.rs +0 -0
  100. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/discovery.rs +0 -0
  101. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/lower.rs +0 -0
  102. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/mod.rs +0 -0
  103. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/parse.rs +0 -0
  104. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/probe.rs +0 -0
  105. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/protocol.rs +0 -0
  106. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/codex/types.rs +0 -0
  107. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/command.rs +0 -0
  108. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/context.rs +0 -0
  109. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/corrections.rs +0 -0
  110. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/cost.rs +0 -0
  111. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/discovery.rs +0 -0
  112. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/facts.rs +0 -0
  113. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/feedback.rs +0 -0
  114. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/filter.rs +0 -0
  115. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/gateway.rs +0 -0
  116. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/ids.rs +0 -0
  117. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/judge.rs +0 -0
  118. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/lib.rs +0 -0
  119. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/command.rs +0 -0
  120. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/corrections.rs +0 -0
  121. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/feedback.rs +0 -0
  122. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/mining.rs +0 -0
  123. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/mod.rs +0 -0
  124. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/literals/protocol.rs +0 -0
  125. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/notifications.rs +0 -0
  126. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/parse.rs +0 -0
  127. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/protocol.rs +0 -0
  128. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/pystr.rs +0 -0
  129. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/query.rs +0 -0
  130. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/render.rs +0 -0
  131. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/rng.rs +0 -0
  132. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/scan_grep.rs +0 -0
  133. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/schema.rs +0 -0
  134. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_activity.rs +0 -0
  135. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_codec.rs +0 -0
  136. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
  137. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_labels.rs +0 -0
  138. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_memory.rs +0 -0
  139. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_owned.rs +0 -0
  140. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_prepared.rs +0 -0
  141. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
  142. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_projection.rs +0 -0
  143. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  144. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
  145. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/snapshot_text.rs +0 -0
  146. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/sqlite.rs +0 -0
  147. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/toolcall.rs +0 -0
  148. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/types.rs +0 -0
  149. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/value.rs +0 -0
  150. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/core/src/watch.rs +0 -0
  151. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/Cargo.toml +0 -0
  152. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/build.rs +0 -0
  153. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  154. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/actor_bridge.rs +0 -0
  155. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  156. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/codex.rs +0 -0
  157. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/command.rs +0 -0
  158. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/context.rs +0 -0
  159. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/corrections.rs +0 -0
  160. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/discovery.rs +0 -0
  161. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/feedback.rs +0 -0
  162. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/judge.rs +0 -0
  163. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/lexicon.rs +0 -0
  164. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/lib.rs +0 -0
  165. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/mining.rs +0 -0
  166. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/nlp.rs +0 -0
  167. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/python.rs +0 -0
  168. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/render.rs +0 -0
  169. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/score.rs +0 -0
  170. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/snapshot_decode.rs +0 -0
  171. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/snapshots.rs +0 -0
  172. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/sqlite.rs +0 -0
  173. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/toolcall.rs +0 -0
  174. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/attachment.rs +0 -0
  175. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/blocks.rs +0 -0
  176. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/command.rs +0 -0
  177. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/convert.rs +0 -0
  178. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/dunder.rs +0 -0
  179. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/events.rs +0 -0
  180. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/meta.rs +0 -0
  181. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/mod.rs +0 -0
  182. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/print.rs +0 -0
  183. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/store.rs +0 -0
  184. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/system.rs +0 -0
  185. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/toolcall.rs +0 -0
  186. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/toolresult.rs +0 -0
  187. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/rust/crates/py/src/views/transcript.rs +0 -0
  188. {cc_transcript-14.28.2 → cc_transcript-14.28.4}/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.28.2
3
+ Version: 14.28.4
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.28.2" # informational — releases stamp the version from the git tag
3
+ version = "14.28.4" # 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"
@@ -1,6 +1,7 @@
1
1
  //! Target discovery and parsing shared by every transcript command (cli.py's
2
2
  //! discover / resolve_targets / parse_transcripts / scope_note plumbing).
3
3
 
4
+ use std::fs;
4
5
  use std::path::{Path, PathBuf};
5
6
 
6
7
  use cc_transcript_core::discovery::{find_in, mtime_secs};
@@ -26,23 +27,26 @@ pub struct Targets {
26
27
  pub total: usize,
27
28
  }
28
29
 
29
- fn project_matches(path: &Path, root: &Path, project: Option<&str>) -> bool {
30
- let Some(project) = project else { return true };
31
- let Ok(rel) = path.strip_prefix(root) else {
32
- return false;
33
- };
34
- let parts: Vec<_> = rel.components().collect();
35
- parts[..parts.len().saturating_sub(1)]
36
- .iter()
37
- .any(|part| part.as_os_str().to_string_lossy().contains(project))
38
- }
39
-
40
30
  /// Newest-first discovery under `root` (cli.py discover): find_in order, project
41
31
  /// filtered, stable-sorted by mtime descending.
42
32
  pub fn discover(root: &Path, project: Option<&str>, contains: Option<&str>) -> Vec<(PathBuf, f64)> {
43
- let mut found: Vec<(PathBuf, f64)> = find_in(root, contains, None, None)
44
- .into_iter()
45
- .filter(|(path, _)| project_matches(path, root, project))
33
+ let roots = if let Some(project) = project {
34
+ fs::read_dir(root)
35
+ .map(|entries| {
36
+ entries
37
+ .flatten()
38
+ .filter(|entry| entry.file_type().is_ok_and(|kind| kind.is_dir()))
39
+ .filter(|entry| entry.file_name().to_string_lossy().contains(project))
40
+ .map(|entry| entry.path())
41
+ .collect()
42
+ })
43
+ .unwrap_or_default()
44
+ } else {
45
+ vec![root.to_path_buf()]
46
+ };
47
+ let mut found: Vec<(PathBuf, f64)> = roots
48
+ .iter()
49
+ .flat_map(|root| find_in(root, contains, None, None))
46
50
  .collect();
47
51
  found.sort_by(|a, b| b.1.partial_cmp(&a.1).expect("mtimes are finite"));
48
52
  found
@@ -237,3 +241,24 @@ pub fn py_path(arg: &str) -> PathBuf {
237
241
  };
238
242
  PathBuf::from(text)
239
243
  }
244
+
245
+ #[cfg(test)]
246
+ mod tests {
247
+ use super::discover;
248
+
249
+ #[test]
250
+ fn project_discovery_only_walks_matching_roots() {
251
+ let root = tempfile::tempdir().unwrap();
252
+ let wanted = root.path().join("wanted-project");
253
+ let other = root.path().join("other-project");
254
+ std::fs::create_dir(&wanted).unwrap();
255
+ std::fs::create_dir(&other).unwrap();
256
+ std::fs::write(wanted.join("match.jsonl"), "{}").unwrap();
257
+ std::fs::write(other.join("match.jsonl"), "{}").unwrap();
258
+
259
+ let found = discover(root.path(), Some("wanted"), None);
260
+
261
+ assert_eq!(found.len(), 1);
262
+ assert_eq!(found[0].0, wanted.join("match.jsonl"));
263
+ }
264
+ }
@@ -292,8 +292,46 @@ impl<'a> ScanSession<'a> {
292
292
  }
293
293
  let canonical_root =
294
294
  std::fs::canonicalize(&plan.root).map_err(|error| incomplete(error.to_string()))?;
295
+ let roots = if let Some(project) = &plan.project {
296
+ let mut roots = Vec::new();
297
+ for entry in
298
+ std::fs::read_dir(&plan.root).map_err(|error| incomplete(error.to_string()))?
299
+ {
300
+ self.budget.checkpoint(&self.cancel)?;
301
+ self.budget.progress.discovery_entries += 1;
302
+ if self.budget.progress.discovery_entries > self.budget.limits.max_discovery_entries
303
+ {
304
+ return Err(incomplete("project discovery budget exhausted"));
305
+ }
306
+ let entry = entry.map_err(|error| incomplete(error.to_string()))?;
307
+ if entry
308
+ .file_type()
309
+ .map_err(|error| incomplete(error.to_string()))?
310
+ .is_dir()
311
+ && entry.file_name().to_string_lossy().contains(project)
312
+ {
313
+ roots.push(entry.path());
314
+ }
315
+ }
316
+ roots
317
+ } else {
318
+ vec![plan.root.clone()]
319
+ };
320
+ if roots.is_empty() {
321
+ return Ok((Vec::new(), 0));
322
+ }
295
323
  let mut request = self.bounded_request("discover");
296
- request.insert("roots", json!([plan.root.to_string_lossy().as_ref()]));
324
+ request.insert(
325
+ "roots",
326
+ json!(roots
327
+ .iter()
328
+ .map(|root| root.to_string_lossy().into_owned())
329
+ .collect::<Vec<_>>()),
330
+ );
331
+ request["limits"].insert(
332
+ "max_items",
333
+ json!(self.budget.remaining().max_discovery_entries),
334
+ );
297
335
  request.insert("preserve_aliases", json!(true));
298
336
  request.insert("follow_directory_symlinks", json!(false));
299
337
  let mut paths = Vec::new();
@@ -85,6 +85,42 @@ fn exhausted_discovery_does_not_read_a_body() {
85
85
  assert_eq!(result.progress.source_opens, 0);
86
86
  }
87
87
 
88
+ #[test]
89
+ fn project_filter_skips_other_directories_before_the_scan() {
90
+ let fixture = Fixture::new();
91
+ let wanted = fixture.0.join("wanted-project");
92
+ let other = fixture.0.join("other-project");
93
+ std::fs::create_dir(&wanted).unwrap();
94
+ std::fs::create_dir(&other).unwrap();
95
+ let event = "{\"type\":\"user\",\"uuid\":\"a\",\"sessionId\":\"s\",\"timestamp\":\"2026-01-01T00:00:00Z\",\"message\":{\"role\":\"user\",\"content\":\"match\"}}\n";
96
+ for name in ["first.jsonl", "second.jsonl"] {
97
+ std::fs::write(wanted.join(name), event).unwrap();
98
+ }
99
+ for index in 0..10 {
100
+ std::fs::write(other.join(format!("{index}.jsonl")), event).unwrap();
101
+ }
102
+ let mut bound = limits();
103
+ bound.max_items = 1;
104
+ bound.max_discovery_entries = 6;
105
+ let store = NativeStore::new(&json!({})).unwrap();
106
+ let mut scan = ScanSession::new(&store, bound, Cancellation::default());
107
+ let plan = ScanPlan {
108
+ project: Some("wanted".to_owned()),
109
+ ..fixture.plan(vec![])
110
+ };
111
+ let mut visited = Vec::new();
112
+ let result = scan.run(&plan, |path, _, _, _| {
113
+ visited.push(path.file_name().unwrap().to_string_lossy().into_owned());
114
+ Ok(ScanControl::Continue)
115
+ });
116
+ assert!(result.complete, "{:?}", result.reason);
117
+ assert_eq!(result.selected_sources, 2);
118
+ assert_eq!(result.available_sources, 2);
119
+ assert!(result.progress.discovery_entries <= 6);
120
+ visited.sort();
121
+ assert_eq!(visited, ["first.jsonl", "second.jsonl"]);
122
+ }
123
+
88
124
  #[test]
89
125
  fn explicit_paths_keep_their_order() {
90
126
  let fixture = Fixture::new();
@@ -559,7 +559,11 @@ struct CachedPreparedFacts {
559
559
  }
560
560
 
561
561
  enum PreparedSourceOutcome {
562
- Ready(SourceStamp, Arc<crate::snapshot_prepared::PreparedFacts>),
562
+ Ready {
563
+ stamp: SourceStamp,
564
+ facts: Arc<crate::snapshot_prepared::PreparedFacts>,
565
+ cached: bool,
566
+ },
563
567
  Pending(String),
564
568
  }
565
569
 
@@ -7439,6 +7443,38 @@ mod tests {
7439
7443
  checks <= 5 * 929,
7440
7444
  "warm verification made {checks} metadata checks"
7441
7445
  );
7446
+ let deadline = now_ms() + 750;
7447
+ let started = std::time::Instant::now();
7448
+ let before_query_bytes = store.state.lock().unwrap().counters[1];
7449
+ for query in [
7450
+ json!({"kind":"has_edit_to","values":["src/**"]}),
7451
+ json!({"kind":"has_read","pattern":"missing","subagents":true}),
7452
+ ] {
7453
+ let mut reply = store.request(
7454
+ &json!({"schema":SCHEMA,"id":"query","operation":"query_graph","handle":graph["data"]["handle"],"selectors":[],"query":query,"deadline_unix_ms":deadline,"limits":template["limits"]}),
7455
+ &owner,
7456
+ &Cancellation::default(),
7457
+ );
7458
+ let mut pages = 1;
7459
+ while reply["status"].as_str() == Some("incomplete") {
7460
+ let cursor = reply["cursor"].as_str().expect("cached query cursor");
7461
+ reply = store.request(
7462
+ &json!({"schema":SCHEMA,"id":"resume","operation":"resume","cursor":cursor}),
7463
+ &owner,
7464
+ &Cancellation::default(),
7465
+ );
7466
+ pages += 1;
7467
+ }
7468
+ assert_eq!(reply["status"].as_str(), Some("ok"), "{reply:?}");
7469
+ assert_eq!(reply["data"]["value"].as_bool(), Some(false));
7470
+ assert!(pages <= 4, "cached query took {pages} pages");
7471
+ }
7472
+ assert_eq!(store.state.lock().unwrap().counters[1], before_query_bytes);
7473
+ assert!(
7474
+ started.elapsed().as_millis() < 750,
7475
+ "two cached queries took {:?}",
7476
+ started.elapsed()
7477
+ );
7442
7478
  }
7443
7479
 
7444
7480
  #[test]
@@ -208,7 +208,14 @@ impl NativeStore {
208
208
  })
209
209
  } {
210
210
  usage[7] += 1;
211
- return Ok((stamp, PreparedSourceOutcome::Ready(stamp, facts)));
211
+ return Ok((
212
+ stamp,
213
+ PreparedSourceOutcome::Ready {
214
+ stamp,
215
+ facts,
216
+ cached: true,
217
+ },
218
+ ));
212
219
  }
213
220
  let key = crate::snapshot_prepared_disk::PreparedDiskKey::new(
214
221
  stamp,
@@ -222,7 +229,11 @@ impl NativeStore {
222
229
  usage[7] += 1;
223
230
  return Ok((
224
231
  stamp,
225
- PreparedSourceOutcome::Ready(stamp, Arc::new(facts)),
232
+ PreparedSourceOutcome::Ready {
233
+ stamp,
234
+ facts: Arc::new(facts),
235
+ cached: true,
236
+ },
226
237
  ));
227
238
  }
228
239
  crate::snapshot_prepared_disk::DiskLookup::Retired => {
@@ -376,7 +387,11 @@ impl NativeStore {
376
387
  .expect("snapshot state")
377
388
  .prepared_loads
378
389
  .remove(&stamp.identity);
379
- Ok(PreparedSourceOutcome::Ready(stamp, facts))
390
+ Ok(PreparedSourceOutcome::Ready {
391
+ stamp,
392
+ facts,
393
+ cached: false,
394
+ })
380
395
  }
381
396
 
382
397
  fn warm_membership_key(
@@ -1247,7 +1262,7 @@ impl NativeStore {
1247
1262
  let mut rounds = 0;
1248
1263
  loop {
1249
1264
  match outcome {
1250
- PreparedSourceOutcome::Ready(stamp, _) => {
1265
+ PreparedSourceOutcome::Ready { stamp, .. } => {
1251
1266
  if stamp != source.stamp {
1252
1267
  return Err(SnapshotError::new(
1253
1268
  Status::Changed,
@@ -1440,6 +1455,8 @@ impl NativeStore {
1440
1455
  let mut records = Vec::new();
1441
1456
  let mut bytes = 128usize;
1442
1457
  let mut steps = 0usize;
1458
+ let mut uncached_steps = 0usize;
1459
+ let page_steps = if inputs { 8 } else { 256 };
1443
1460
  let page_items = self.config.page_items.min(cursor.remaining.max_items);
1444
1461
  let output_limit = cursor
1445
1462
  .page_output_bytes
@@ -1451,7 +1468,11 @@ impl NativeStore {
1451
1468
  "prepared query output budget exhausted",
1452
1469
  ));
1453
1470
  }
1454
- while cursor.next < total && steps < 8 && (!inputs || records.len() < page_items) {
1471
+ while cursor.next < total
1472
+ && steps < page_steps
1473
+ && uncached_steps < 8
1474
+ && (!inputs || records.len() < page_items)
1475
+ {
1455
1476
  cancel.check(cursor.remaining.deadline_unix_ms)?;
1456
1477
  if inputs && cursor.next == 0 {
1457
1478
  let record = cursor.root_record.as_ref().expect("input root record").clone();
@@ -1491,6 +1512,7 @@ impl NativeStore {
1491
1512
  pending.token = next;
1492
1513
  cursor.pending = Some(pending);
1493
1514
  steps += 1;
1515
+ uncached_steps += 1;
1494
1516
  continue;
1495
1517
  }
1496
1518
  Ok(ready) => ready,
@@ -1518,12 +1540,18 @@ impl NativeStore {
1518
1540
  stamp: source.stamp,
1519
1541
  });
1520
1542
  steps += 1;
1543
+ uncached_steps += 1;
1521
1544
  continue;
1522
1545
  }
1523
1546
  (_, ready) => ready,
1524
1547
  }
1525
1548
  };
1526
- let PreparedSourceOutcome::Ready(stamp, facts) = outcome else {
1549
+ let PreparedSourceOutcome::Ready {
1550
+ stamp,
1551
+ facts,
1552
+ cached,
1553
+ } = outcome
1554
+ else {
1527
1555
  return Err(invalid("prepared source did not finish"));
1528
1556
  };
1529
1557
  if stamp != source.stamp {
@@ -1554,6 +1582,7 @@ impl NativeStore {
1554
1582
  }
1555
1583
  cursor.next += 1;
1556
1584
  steps += 1;
1585
+ uncached_steps += usize::from(!cached);
1557
1586
  }
1558
1587
  if cursor.next == total {
1559
1588
  if !self.validate_source_stamps(
File without changes