cc-transcript 14.28.0__tar.gz → 14.28.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/PKG-INFO +1 -1
  2. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshot_schema/request.schema.json +1 -1
  3. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/pyproject.toml +1 -1
  4. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot.rs +173 -45
  5. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/Cargo.lock +0 -0
  6. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/Cargo.toml +0 -0
  7. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/LICENSE +0 -0
  8. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/README.md +0 -0
  9. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/__init__.py +0 -0
  10. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/__init__.pyi +0 -0
  11. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/_native.pyi +0 -0
  12. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/activity.py +0 -0
  13. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/activity_probe.py +0 -0
  14. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/builders.py +0 -0
  15. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/codex.py +0 -0
  16. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/command.py +0 -0
  17. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/context.py +0 -0
  18. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/corrections.py +0 -0
  19. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/cost.py +0 -0
  20. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/decision_store.py +0 -0
  21. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/decisions.py +0 -0
  22. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/discovery.py +0 -0
  23. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/disktruth.py +0 -0
  24. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/evidence.py +0 -0
  25. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/extract/__init__.py +0 -0
  26. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/extract/correct.py +0 -0
  27. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/facts.py +0 -0
  28. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/filterspec.py +0 -0
  29. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/heartbeats.py +0 -0
  30. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/ids.py +0 -0
  31. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/judge/__init__.py +0 -0
  32. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/judge/llm.py +0 -0
  33. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/judge/similar.py +0 -0
  34. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/judge/verdicts.py +0 -0
  35. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/ledger.py +0 -0
  36. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/literals.py +0 -0
  37. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/__init__.py +0 -0
  38. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/candidates.py +0 -0
  39. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/confidence.py +0 -0
  40. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/engine.py +0 -0
  41. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/formats.py +0 -0
  42. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/sampling.py +0 -0
  43. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/signals.py +0 -0
  44. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/sourcekind.py +0 -0
  45. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/spec.py +0 -0
  46. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/mining/store.py +0 -0
  47. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/models.py +0 -0
  48. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/nlp.py +0 -0
  49. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/notifications.py +0 -0
  50. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/parser.py +0 -0
  51. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/py.typed +0 -0
  52. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/query.py +0 -0
  53. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/render.py +0 -0
  54. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/__init__.py +0 -0
  55. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/buckets.py +0 -0
  56. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  57. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  58. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  59. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/engine.py +0 -0
  60. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/lexicon.py +0 -0
  61. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/sentiment/scorespec.py +0 -0
  62. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  63. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  64. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  65. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  66. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/snapshots.py +0 -0
  67. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/synthetic.py +0 -0
  68. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/tools.py +0 -0
  69. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/cc_transcript/watch.py +0 -0
  70. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/Cargo.toml +0 -0
  71. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/blame.rs +0 -0
  72. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/corpus.rs +0 -0
  73. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/corrections.rs +0 -0
  74. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/digest.rs +0 -0
  75. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/facts.rs +0 -0
  76. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/grep.rs +0 -0
  77. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/list.rs +0 -0
  78. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/mod.rs +0 -0
  79. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  80. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/show.rs +0 -0
  81. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/slice.rs +0 -0
  82. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/stats.rs +0 -0
  83. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/commands/watch.rs +0 -0
  84. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/lib.rs +0 -0
  85. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/main.rs +0 -0
  86. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/output.rs +0 -0
  87. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/target.rs +0 -0
  88. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/cli/src/timearg.rs +0 -0
  89. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/Cargo.toml +0 -0
  90. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/benches/parse.rs +0 -0
  91. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/benches/render.rs +0 -0
  92. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/benches/toolcall.rs +0 -0
  93. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/activity.rs +0 -0
  94. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/actor.rs +0 -0
  95. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/blame.rs +0 -0
  96. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/buckets.rs +0 -0
  97. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/discovery.rs +0 -0
  98. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/lower.rs +0 -0
  99. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/mod.rs +0 -0
  100. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/parse.rs +0 -0
  101. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/probe.rs +0 -0
  102. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/protocol.rs +0 -0
  103. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/codex/types.rs +0 -0
  104. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/command.rs +0 -0
  105. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/context.rs +0 -0
  106. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/corrections.rs +0 -0
  107. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/cost.rs +0 -0
  108. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/discovery.rs +0 -0
  109. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/facts.rs +0 -0
  110. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/feedback.rs +0 -0
  111. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/filter.rs +0 -0
  112. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/gateway.rs +0 -0
  113. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/ids.rs +0 -0
  114. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/judge.rs +0 -0
  115. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/lib.rs +0 -0
  116. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/command.rs +0 -0
  117. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/corrections.rs +0 -0
  118. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/feedback.rs +0 -0
  119. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/mining.rs +0 -0
  120. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/mod.rs +0 -0
  121. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/literals/protocol.rs +0 -0
  122. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/notifications.rs +0 -0
  123. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/parse.rs +0 -0
  124. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/protocol.rs +0 -0
  125. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/pystr.rs +0 -0
  126. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/query.rs +0 -0
  127. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/render.rs +0 -0
  128. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/rng.rs +0 -0
  129. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/scan.rs +0 -0
  130. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/scan_grep.rs +0 -0
  131. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/scan_regressions.rs +0 -0
  132. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/schema.rs +0 -0
  133. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_activity.rs +0 -0
  134. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_codec.rs +0 -0
  135. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_labels.rs +0 -0
  136. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_memory.rs +0 -0
  137. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_owned.rs +0 -0
  138. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_projection.rs +0 -0
  139. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  140. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/snapshot_text.rs +0 -0
  141. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/sqlite.rs +0 -0
  142. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/toolcall.rs +0 -0
  143. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/types.rs +0 -0
  144. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/value.rs +0 -0
  145. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/core/src/watch.rs +0 -0
  146. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/Cargo.toml +0 -0
  147. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/build.rs +0 -0
  148. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  149. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/actor_bridge.rs +0 -0
  150. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  151. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/codex.rs +0 -0
  152. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/command.rs +0 -0
  153. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/context.rs +0 -0
  154. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/corrections.rs +0 -0
  155. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/discovery.rs +0 -0
  156. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/feedback.rs +0 -0
  157. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/judge.rs +0 -0
  158. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/lexicon.rs +0 -0
  159. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/lib.rs +0 -0
  160. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/mining.rs +0 -0
  161. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/nlp.rs +0 -0
  162. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/python.rs +0 -0
  163. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/render.rs +0 -0
  164. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/score.rs +0 -0
  165. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/snapshot_decode.rs +0 -0
  166. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/snapshots.rs +0 -0
  167. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/sqlite.rs +0 -0
  168. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/toolcall.rs +0 -0
  169. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/attachment.rs +0 -0
  170. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/blocks.rs +0 -0
  171. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/command.rs +0 -0
  172. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/convert.rs +0 -0
  173. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/dunder.rs +0 -0
  174. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/events.rs +0 -0
  175. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/meta.rs +0 -0
  176. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/mod.rs +0 -0
  177. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/print.rs +0 -0
  178. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/store.rs +0 -0
  179. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/system.rs +0 -0
  180. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/toolcall.rs +0 -0
  181. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/toolresult.rs +0 -0
  182. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/views/transcript.rs +0 -0
  183. {cc_transcript-14.28.0 → cc_transcript-14.28.1}/rust/crates/py/src/watch.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-transcript
3
- Version: 14.28.0
3
+ Version: 14.28.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -1751,7 +1751,7 @@
1751
1751
  "pattern": "^/",
1752
1752
  "type": "string"
1753
1753
  },
1754
- "maxItems": 256,
1754
+ "maxItems": 1024,
1755
1755
  "title": "Attachments",
1756
1756
  "type": "array"
1757
1757
  },
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cc-transcript"
3
- version = "14.28.0" # informational — releases stamp the version from the git tag
3
+ version = "14.28.1" # informational — releases stamp the version from the git tag
4
4
  description = "Grep every Claude Code session you've ever run."
5
5
  readme = "README.md"
6
6
  license = "PolyForm-Noncommercial-1.0.0"
@@ -3937,6 +3937,13 @@ impl NativeStore {
3937
3937
  }
3938
3938
  }
3939
3939
 
3940
+ fn graph_exposes_members(graph: &GraphCursor) -> bool {
3941
+ matches!(
3942
+ graph.request["query"]["kind"].as_str(),
3943
+ Some("sidechain_membership" | "direct_sidechains")
3944
+ )
3945
+ }
3946
+
3940
3947
  fn graph(
3941
3948
  &self,
3942
3949
  request: &Value,
@@ -4181,6 +4188,17 @@ impl NativeStore {
4181
4188
  description,
4182
4189
  transferred: false,
4183
4190
  });
4191
+ if !Self::graph_exposes_members(graph) {
4192
+ self.state
4193
+ .lock()
4194
+ .expect("snapshot state")
4195
+ .leases
4196
+ .remove(str_field(
4197
+ &graph.nodes.last().expect("added graph node").description["handle"],
4198
+ "lease_id",
4199
+ )?)
4200
+ .expect("validated internal graph lease");
4201
+ }
4184
4202
  if graph.request["query"]["kind"].as_str() != Some("direct_sidechains") {
4185
4203
  graph.tasks.push(GraphTask::List {
4186
4204
  parent: path,
@@ -4193,6 +4211,9 @@ impl NativeStore {
4193
4211
  fn renew_graph_members(&self, graph: &mut GraphCursor) -> Result<(), SnapshotError> {
4194
4212
  let mut state = self.state.lock().expect("snapshot state");
4195
4213
  self.lease(&state, &graph.root_handle, &graph.context)?;
4214
+ if !Self::graph_exposes_members(graph) {
4215
+ return Ok(());
4216
+ }
4196
4217
  for node in graph
4197
4218
  .nodes
4198
4219
  .iter_mut()
@@ -4218,6 +4239,60 @@ impl NativeStore {
4218
4239
  Ok(())
4219
4240
  }
4220
4241
 
4242
+ fn advance_graph_source(
4243
+ &self,
4244
+ graph: &mut GraphCursor,
4245
+ pending: GraphPending,
4246
+ cancel: &Cancellation,
4247
+ usage: &mut [u64; 18],
4248
+ work: &mut usize,
4249
+ work_stop: usize,
4250
+ ) -> Result<bool, SnapshotError> {
4251
+ self.authority(
4252
+ &graph.context,
4253
+ Some(&std::fs::canonicalize(&pending.path).map_err(io_error)?),
4254
+ )?;
4255
+ let token = pending.token.clone();
4256
+ graph.pending = Some(pending);
4257
+ loop {
4258
+ if *work >= work_stop {
4259
+ return Ok(false);
4260
+ }
4261
+ *work += 1;
4262
+ let waiter = {
4263
+ let mut state = self.state.lock().expect("snapshot state");
4264
+ let waiter = state.waiters.get_mut(&token).ok_or_else(|| {
4265
+ SnapshotError::new(Status::StaleCursor, "graph source reservation expired")
4266
+ })?;
4267
+ waiter.context = graph.context.clone();
4268
+ waiter.clone()
4269
+ };
4270
+ let before_bytes = usage[1];
4271
+ let before_events = usage[3];
4272
+ let outcome = self.advance(&token, waiter, cancel, usage)?;
4273
+ graph.remaining.max_read_bytes = graph
4274
+ .remaining
4275
+ .max_read_bytes
4276
+ .saturating_sub((usage[1] - before_bytes) as usize);
4277
+ graph.remaining.max_events = graph
4278
+ .remaining
4279
+ .max_events
4280
+ .saturating_sub((usage[3] - before_events) as usize);
4281
+ if outcome.1.is_some() {
4282
+ continue;
4283
+ }
4284
+ let pending = graph.pending.take().expect("completed graph source");
4285
+ self.graph_add_source(
4286
+ graph,
4287
+ pending.path,
4288
+ pending.depth,
4289
+ pending.spawned_by,
4290
+ &outcome.0,
4291
+ )?;
4292
+ return Ok(true);
4293
+ }
4294
+ }
4295
+
4221
4296
  fn graph_work(
4222
4297
  &self,
4223
4298
  graph: &mut GraphCursor,
@@ -4264,49 +4339,25 @@ impl NativeStore {
4264
4339
  return Ok(GraphYield::Complete(projection.data));
4265
4340
  }
4266
4341
  }
4342
+ let work_stop = self.config.event_step.min(self.config.page_items);
4343
+ let mut examined = 0usize;
4267
4344
  if let Some(pending) = graph.pending.take() {
4268
- self.authority(
4269
- &graph.context,
4270
- Some(&std::fs::canonicalize(&pending.path).map_err(io_error)?),
4271
- )?;
4272
- let waiter = {
4273
- let mut state = self.state.lock().expect("snapshot state");
4274
- let waiter = state.waiters.get_mut(&pending.token).ok_or_else(|| {
4275
- SnapshotError::new(Status::StaleCursor, "graph source reservation expired")
4276
- })?;
4277
- waiter.context = graph.context.clone();
4278
- waiter.clone()
4279
- };
4280
- let before_bytes = usage[1];
4281
- let before_events = usage[3];
4282
- let outcome = self.advance(&pending.token, waiter, cancel, usage)?;
4283
- graph.remaining.max_read_bytes = graph
4284
- .remaining
4285
- .max_read_bytes
4286
- .saturating_sub((usage[1] - before_bytes) as usize);
4287
- graph.remaining.max_events = graph
4288
- .remaining
4289
- .max_events
4290
- .saturating_sub((usage[3] - before_events) as usize);
4291
- if outcome.1.is_some() {
4292
- graph.pending = Some(pending);
4293
- } else {
4294
- self.graph_add_source(
4295
- graph,
4296
- pending.path,
4297
- pending.depth,
4298
- pending.spawned_by,
4299
- &outcome.0,
4300
- )?;
4345
+ if !self.advance_graph_source(
4346
+ graph,
4347
+ pending,
4348
+ cancel,
4349
+ usage,
4350
+ &mut examined,
4351
+ work_stop,
4352
+ )? {
4353
+ return Ok(GraphYield::Pending(Value::new_null()));
4301
4354
  }
4302
- return Ok(GraphYield::Pending(Value::new_null()));
4303
4355
  }
4304
- let mut examined = 0usize;
4305
- while !graph.prepared && examined < self.config.event_step {
4356
+ while !graph.prepared && examined < work_stop {
4306
4357
  cancel.check(graph.remaining.deadline_unix_ms)?;
4307
4358
  if let Some(mut listing) = graph.listing.take() {
4308
4359
  loop {
4309
- if examined >= self.config.event_step {
4360
+ if examined >= work_stop {
4310
4361
  graph.listing = Some(listing);
4311
4362
  return Ok(GraphYield::Pending(Value::new_null()));
4312
4363
  }
@@ -4409,6 +4460,7 @@ impl NativeStore {
4409
4460
  depth,
4410
4461
  spawned_by,
4411
4462
  } => {
4463
+ examined += 1;
4412
4464
  let canonical = std::fs::canonicalize(&path).map_err(io_error)?;
4413
4465
  self.authority(&graph.context, Some(&canonical))?;
4414
4466
  let metadata = std::fs::metadata(&canonical).map_err(io_error)?;
@@ -4439,16 +4491,24 @@ impl NativeStore {
4439
4491
  .max_events
4440
4492
  .saturating_sub((usage[3] - before_events) as usize);
4441
4493
  if let Some(token) = outcome.1 {
4442
- graph.pending = Some(GraphPending {
4443
- token,
4444
- path,
4445
- depth,
4446
- spawned_by,
4447
- });
4494
+ if !self.advance_graph_source(
4495
+ graph,
4496
+ GraphPending {
4497
+ token,
4498
+ path,
4499
+ depth,
4500
+ spawned_by,
4501
+ },
4502
+ cancel,
4503
+ usage,
4504
+ &mut examined,
4505
+ work_stop,
4506
+ )? {
4507
+ return Ok(GraphYield::Pending(Value::new_null()));
4508
+ }
4448
4509
  } else {
4449
4510
  self.graph_add_source(graph, path, depth, spawned_by, &outcome.0)?;
4450
4511
  }
4451
- return Ok(GraphYield::Pending(Value::new_null()));
4452
4512
  }
4453
4513
  }
4454
4514
  }
@@ -4465,8 +4525,12 @@ impl NativeStore {
4465
4525
  let mut records = Vec::new();
4466
4526
  let mut output_bytes = 128usize;
4467
4527
  let page_limit = self.config.page_items.min(graph.remaining.max_items);
4528
+ let mut projected = 0usize;
4468
4529
  while graph.projection_at < total || graph.pending_record.is_some() {
4469
4530
  cancel.check(graph.remaining.deadline_unix_ms)?;
4531
+ if boolean && projected >= self.config.page_items {
4532
+ return Ok(GraphYield::Pending(Value::new_null()));
4533
+ }
4470
4534
  if records.len() >= page_limit {
4471
4535
  break;
4472
4536
  }
@@ -4480,7 +4544,9 @@ impl NativeStore {
4480
4544
  };
4481
4545
  let index = position + usize::from(membership || boolean);
4482
4546
  let node = &graph.nodes[index];
4483
- self.validate_scope(&node.description["handle"], &graph.context)?;
4547
+ if membership {
4548
+ self.validate_scope(&node.description["handle"], &graph.context)?;
4549
+ }
4484
4550
  self.authority(&graph.context, Some(&node.snapshot.canonical_path))?;
4485
4551
  if membership {
4486
4552
  if node.snapshot.session_id.len() > 256 {
@@ -4522,6 +4588,7 @@ impl NativeStore {
4522
4588
  }
4523
4589
  graph.projection_at += 1;
4524
4590
  if boolean {
4591
+ projected += 1;
4525
4592
  if projection.data["value"].as_bool() == Some(true) {
4526
4593
  return Ok(GraphYield::Complete(projection.data));
4527
4594
  }
@@ -6380,6 +6447,67 @@ mod tests {
6380
6447
  }
6381
6448
  }
6382
6449
 
6450
+ #[test]
6451
+ fn graph_predicate_scans_918_attachments_without_retaining_member_leases() {
6452
+ let source = Source::new(&format!("{}\n", user("root")));
6453
+ let attachments: Vec<_> = (0..918)
6454
+ .map(|index| {
6455
+ let path = source
6456
+ .directory
6457
+ .join(format!("attachment-{index:04}.jsonl"));
6458
+ std::fs::write(&path, format!("{}\n", user(&format!("attachment-{index}"))))
6459
+ .unwrap();
6460
+ path.to_string_lossy().into_owned()
6461
+ })
6462
+ .collect();
6463
+ let store = NativeStore::new(&json!({
6464
+ "max_retained_bytes":128*1024*1024,
6465
+ "reserved_hook_accounted_bytes":4096,
6466
+ "max_leases":256,
6467
+ "reserved_hook_leases":1,
6468
+ "max_events_per_step":256
6469
+ }))
6470
+ .unwrap();
6471
+ let owner = context("a");
6472
+ let root = finish(
6473
+ &store,
6474
+ store.request(&acquire(&source.path), &owner, &Cancellation::default()),
6475
+ &owner,
6476
+ );
6477
+ let mut request = graph_request(
6478
+ &root,
6479
+ json!({"kind":"has_read","pattern":"absent.rs","subagents":true}),
6480
+ attachments,
6481
+ json!([]),
6482
+ );
6483
+ request["limits"].insert("max_sources", json!(1024));
6484
+ request["limits"].insert("max_discovery_entries", json!(1024));
6485
+ request["limits"].insert("max_events", json!(4096));
6486
+ request["limits"].insert("max_read_bytes", json!(8 * 1024 * 1024));
6487
+ request["limits"].insert("max_items", json!(1024));
6488
+ request.insert("deadline_unix_ms", json!(now_ms() + 120_000));
6489
+ let mut reply = store.request(&request, &owner, &Cancellation::default());
6490
+ let mut peak_leases = store.state.lock().unwrap().leases.len();
6491
+ for _ in 0..1200 {
6492
+ if reply["status"].as_str() != Some("incomplete") {
6493
+ break;
6494
+ }
6495
+ let cursor = reply["cursor"]
6496
+ .as_str()
6497
+ .unwrap_or_else(|| panic!("bounded graph continuation: {reply:?}"));
6498
+ reply = store.request(
6499
+ &json!({"schema":SCHEMA,"id":"resume","operation":"resume","cursor":cursor}),
6500
+ &owner,
6501
+ &Cancellation::default(),
6502
+ );
6503
+ peak_leases = peak_leases.max(store.state.lock().unwrap().leases.len());
6504
+ }
6505
+ assert_eq!(reply["status"].as_str(), Some("ok"), "{reply:?}");
6506
+ assert_eq!(reply["data"]["value"].as_bool(), Some(false));
6507
+ assert!(peak_leases <= 2, "peak leases: {peak_leases}");
6508
+ assert_eq!(store.state.lock().unwrap().leases.len(), 1);
6509
+ }
6510
+
6383
6511
  #[test]
6384
6512
  fn direct_sidechains_skip_unselected_sources_descendants_and_attachments() {
6385
6513
  let source = Source::new(&format!("{}\n{}\n", user("before"), user("current")));
File without changes