cc-transcript 14.45.9__tar.gz → 14.45.11__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.9 → cc_transcript-14.45.11}/PKG-INFO +1 -1
  2. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/pyproject.toml +1 -1
  3. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot.rs +263 -5
  4. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared_service.rs +114 -16
  5. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/Cargo.lock +0 -0
  6. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/Cargo.toml +0 -0
  7. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/LICENSE +0 -0
  8. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/README.md +0 -0
  9. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/__init__.py +0 -0
  10. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/__init__.pyi +0 -0
  11. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/_native.pyi +0 -0
  12. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/activity.py +0 -0
  13. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/activity_probe.py +0 -0
  14. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/builders.py +0 -0
  15. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/codex.py +0 -0
  16. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/command.py +0 -0
  17. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/context.py +0 -0
  18. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/corrections.py +0 -0
  19. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/cost.py +0 -0
  20. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/decision_store.py +0 -0
  21. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/decisions.py +0 -0
  22. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/discovery.py +0 -0
  23. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/disktruth.py +0 -0
  24. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/evidence.py +0 -0
  25. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/extract/__init__.py +0 -0
  26. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/extract/correct.py +0 -0
  27. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/facts.py +0 -0
  28. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/filterspec.py +0 -0
  29. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/heartbeats.py +0 -0
  30. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/ids.py +0 -0
  31. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/__init__.py +0 -0
  32. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/llm.py +0 -0
  33. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/similar.py +0 -0
  34. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/verdicts.py +0 -0
  35. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/ledger.py +0 -0
  36. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/literals.py +0 -0
  37. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/__init__.py +0 -0
  38. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/candidates.py +0 -0
  39. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/confidence.py +0 -0
  40. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/engine.py +0 -0
  41. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/formats.py +0 -0
  42. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/sampling.py +0 -0
  43. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/signals.py +0 -0
  44. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/sourcekind.py +0 -0
  45. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/spec.py +0 -0
  46. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/store.py +0 -0
  47. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/models.py +0 -0
  48. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/nlp.py +0 -0
  49. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/notifications.py +0 -0
  50. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/parser.py +0 -0
  51. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/py.typed +0 -0
  52. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/query.py +0 -0
  53. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/render.py +0 -0
  54. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/__init__.py +0 -0
  55. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/buckets.py +0 -0
  56. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
  57. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
  58. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
  59. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/engine.py +0 -0
  60. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/lexicon.py +0 -0
  61. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/scorespec.py +0 -0
  62. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/config.schema.json +0 -0
  63. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/context.schema.json +0 -0
  64. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/request.schema.json +0 -0
  65. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/response.schema.json +0 -0
  66. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
  67. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshots.py +0 -0
  68. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/synthetic.py +0 -0
  69. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/tools.py +0 -0
  70. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/watch.py +0 -0
  71. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/Cargo.toml +0 -0
  72. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/blame.rs +0 -0
  73. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/corpus.rs +0 -0
  74. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/corrections.rs +0 -0
  75. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/digest.rs +0 -0
  76. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/facts.rs +0 -0
  77. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/grep.rs +0 -0
  78. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/list.rs +0 -0
  79. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/mod.rs +0 -0
  80. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
  81. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/show.rs +0 -0
  82. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/slice.rs +0 -0
  83. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/stats.rs +0 -0
  84. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/watch.rs +0 -0
  85. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/lib.rs +0 -0
  86. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/output.rs +0 -0
  87. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/target.rs +0 -0
  88. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/timearg.rs +0 -0
  89. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/Cargo.toml +0 -0
  90. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/parse.rs +0 -0
  91. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/render.rs +0 -0
  92. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/toolcall.rs +0 -0
  93. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/build.rs +0 -0
  94. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/activity.rs +0 -0
  95. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/actor.rs +0 -0
  96. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/blame.rs +0 -0
  97. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/buckets.rs +0 -0
  98. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/discovery.rs +0 -0
  99. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/lower.rs +0 -0
  100. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/mod.rs +0 -0
  101. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/parse.rs +0 -0
  102. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/probe.rs +0 -0
  103. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/protocol.rs +0 -0
  104. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/types.rs +0 -0
  105. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/command.rs +0 -0
  106. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/context.rs +0 -0
  107. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/corrections.rs +0 -0
  108. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/cost.rs +0 -0
  109. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/discovery.rs +0 -0
  110. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/facts.rs +0 -0
  111. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/feedback.rs +0 -0
  112. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/filter.rs +0 -0
  113. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/gateway.rs +0 -0
  114. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/ids.rs +0 -0
  115. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/judge.rs +0 -0
  116. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/lib.rs +0 -0
  117. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/command.rs +0 -0
  118. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/corrections.rs +0 -0
  119. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/feedback.rs +0 -0
  120. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/mining.rs +0 -0
  121. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/mod.rs +0 -0
  122. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/protocol.rs +0 -0
  123. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/notifications.rs +0 -0
  124. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/parse.rs +0 -0
  125. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/protocol.rs +0 -0
  126. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/pystr.rs +0 -0
  127. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/query.rs +0 -0
  128. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/render.rs +0 -0
  129. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/rng.rs +0 -0
  130. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan.rs +0 -0
  131. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_checkpoint.rs +0 -0
  132. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep.rs +0 -0
  133. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep_stream.rs +0 -0
  134. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
  135. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_index.rs +0 -0
  136. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_projection.rs +0 -0
  137. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_regressions.rs +0 -0
  138. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_stream.rs +0 -0
  139. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/schema.rs +0 -0
  140. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_activity.rs +0 -0
  141. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_codec.rs +0 -0
  142. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
  143. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_labels.rs +0 -0
  144. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_ledger.rs +0 -0
  145. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_ledger_tests.rs +0 -0
  146. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_memory.rs +0 -0
  147. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_owned.rs +0 -0
  148. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared.rs +0 -0
  149. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
  150. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_projection.rs +0 -0
  151. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_regressions.rs +0 -0
  152. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
  153. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_text.rs +0 -0
  154. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/sqlite.rs +0 -0
  155. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/toolcall.rs +0 -0
  156. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/types.rs +0 -0
  157. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/value.rs +0 -0
  158. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/watch.rs +0 -0
  159. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/tests/sonic_arena_model.rs +0 -0
  160. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/tests/std_allocation_model.rs +0 -0
  161. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/Cargo.toml +0 -0
  162. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/build.rs +0 -0
  163. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
  164. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/actor_bridge.rs +0 -0
  165. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/bin/stub_gen.rs +0 -0
  166. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/codex.rs +0 -0
  167. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/command.rs +0 -0
  168. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/context.rs +0 -0
  169. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/corrections.rs +0 -0
  170. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/discovery.rs +0 -0
  171. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/feedback.rs +0 -0
  172. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/judge.rs +0 -0
  173. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/lexicon.rs +0 -0
  174. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/lib.rs +0 -0
  175. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/mining.rs +0 -0
  176. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/nlp.rs +0 -0
  177. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/python.rs +0 -0
  178. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/render.rs +0 -0
  179. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/score.rs +0 -0
  180. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/snapshot_decode.rs +0 -0
  181. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/snapshots.rs +0 -0
  182. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/sqlite.rs +0 -0
  183. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/toolcall.rs +0 -0
  184. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/attachment.rs +0 -0
  185. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/blocks.rs +0 -0
  186. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/command.rs +0 -0
  187. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/convert.rs +0 -0
  188. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/dunder.rs +0 -0
  189. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/events.rs +0 -0
  190. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/meta.rs +0 -0
  191. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/mod.rs +0 -0
  192. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/print.rs +0 -0
  193. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/store.rs +0 -0
  194. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/system.rs +0 -0
  195. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/toolcall.rs +0 -0
  196. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/toolresult.rs +0 -0
  197. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/transcript.rs +0 -0
  198. {cc_transcript-14.45.9 → cc_transcript-14.45.11}/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.9
3
+ Version: 14.45.11
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.9" # informational — releases stamp the version from the git tag
3
+ version = "14.45.11" # 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"
@@ -14565,6 +14565,74 @@ mod tests {
14565
14565
  assert!(validate().unwrap_err().status == Status::PermissionDenied);
14566
14566
  }
14567
14567
 
14568
+ #[test]
14569
+ fn source_validation_skips_its_parent_hold_once_cancelled_or_past_its_deadline() {
14570
+ let source = Source::new(&format!("{}\n", user("root")));
14571
+ let sources = canonical_members(&source.directory.join("members"), &["a", "b"], "");
14572
+ let store = store();
14573
+ let owner = context("a");
14574
+ let validate = |cancel: &Cancellation, deadline: u64| {
14575
+ let before = store.source_resolutions.load(Ordering::Relaxed);
14576
+ let validated = store
14577
+ .validate_source_stamps(&sources, &owner, cancel, deadline)
14578
+ .map_err(|error| error.status);
14579
+ (
14580
+ validated,
14581
+ store.source_resolutions.load(Ordering::Relaxed) - before,
14582
+ )
14583
+ };
14584
+ assert_eq!(
14585
+ validate(&Cancellation::default(), now_ms() + 30_000),
14586
+ (Ok(true), 2)
14587
+ );
14588
+ for (cancels, status) in [(true, Status::Cancelled), (false, Status::Deadline)] {
14589
+ let cancel = Cancellation::default();
14590
+ let deadline = now_ms() + 1_000;
14591
+ *store.resolve_hook.lock().unwrap() = Some(Arc::new({
14592
+ let (cancel, last) = (cancel.clone(), sources[1].path.clone());
14593
+ move |path: &Path| {
14594
+ if path != last {
14595
+ return;
14596
+ }
14597
+ if cancels {
14598
+ cancel.cancel();
14599
+ } else {
14600
+ while now_ms() <= deadline {
14601
+ std::thread::sleep(std::time::Duration::from_millis(5));
14602
+ }
14603
+ }
14604
+ }
14605
+ }));
14606
+ assert_eq!(validate(&cancel, deadline), (Err(status), 1));
14607
+ }
14608
+ }
14609
+
14610
+ #[test]
14611
+ fn empty_membership_validation_reports_cancellation_and_an_expired_deadline() {
14612
+ let store = store();
14613
+ let owner = context("a");
14614
+ let cancelled = Cancellation::default();
14615
+ cancelled.cancel();
14616
+ for (cancel, deadline, status) in [
14617
+ (Cancellation::default(), now_ms(), Status::Deadline),
14618
+ (cancelled, now_ms() + 30_000, Status::Cancelled),
14619
+ ] {
14620
+ let before = store.source_resolutions.load(Ordering::Relaxed);
14621
+ assert_eq!(
14622
+ (
14623
+ store
14624
+ .validate_source_stamps(&[], &owner, &cancel, deadline)
14625
+ .map_err(|error| error.status),
14626
+ store
14627
+ .validate_sidechain_dirs(&[], &owner, &cancel, deadline)
14628
+ .map_err(|error| error.status),
14629
+ ),
14630
+ (Err(status), Err(status))
14631
+ );
14632
+ assert_eq!(store.source_resolutions.load(Ordering::Relaxed), before);
14633
+ }
14634
+ }
14635
+
14568
14636
  #[test]
14569
14637
  fn early_positive_query_rejects_a_parent_retargeted_during_its_page() {
14570
14638
  let source = Source::new(&format!("{}\n", user("root")));
@@ -14972,7 +15040,7 @@ mod tests {
14972
15040
  .unwrap();
14973
15041
  registered_pages(&store, &owner, &fresh);
14974
15042
  positions();
14975
- assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
15043
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 1);
14976
15044
  store.assert_conserved();
14977
15045
 
14978
15046
  store.lock_state().remove_warm_membership(&key);
@@ -17221,7 +17289,7 @@ mod tests {
17221
17289
  );
17222
17290
  assert_eq!(resumed["status"].as_str(), Some("ok"), "{resumed:?}");
17223
17291
  assert!(has(&resumed, "Grep"));
17224
- assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17292
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 1);
17225
17293
  }
17226
17294
 
17227
17295
  fn tool_use_line(name: &str) -> String {
@@ -17342,7 +17410,7 @@ mod tests {
17342
17410
  );
17343
17411
  assert_eq!(appended["status"].as_str(), Some("ok"), "{appended:?}");
17344
17412
  assert!(graph_has_tool(&store, &source, &owner, &appended, "Grep"));
17345
- assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17413
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 1);
17346
17414
  let subagents = source.directory.join("thread-a").join("subagents");
17347
17415
  std::fs::create_dir_all(&subagents).unwrap();
17348
17416
  std::fs::write(
@@ -17357,14 +17425,103 @@ mod tests {
17357
17425
  );
17358
17426
  assert_eq!(discovered["status"].as_str(), Some("ok"), "{discovered:?}");
17359
17427
  assert!(graph_has_tool(&store, &source, &owner, &discovered, "Bash"));
17360
- assert_eq!(store.warm_records.load(Ordering::Relaxed), 3);
17428
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17361
17429
  let hot = finish_prepared(
17362
17430
  &store,
17363
17431
  store.request(&prepare, &owner, &Cancellation::default()),
17364
17432
  &owner,
17365
17433
  );
17366
17434
  assert_eq!(hot["status"].as_str(), Some("ok"), "{hot:?}");
17367
- assert_eq!(store.warm_records.load(Ordering::Relaxed), 3);
17435
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17436
+ store.assert_conserved();
17437
+ }
17438
+
17439
+ #[test]
17440
+ fn registered_graph_append_does_not_relist_an_unchanged_sidechain_directory() {
17441
+ let source = Source::new(&format!("{}\n", user("root")));
17442
+ let members = registered_members(&source, &["thread-a", "thread-b"]);
17443
+ let subagents = source.directory.join("thread-a").join("subagents");
17444
+ std::fs::create_dir_all(&subagents).unwrap();
17445
+ std::fs::write(
17446
+ subagents.join("preexisting.jsonl"),
17447
+ format!("{}\n{}\n", user("preexisting"), tool_use_line("Read")),
17448
+ )
17449
+ .unwrap();
17450
+ let store = store();
17451
+ let owner = context("a");
17452
+ let root = finish(
17453
+ &store,
17454
+ store.request(&acquire(&source.path), &owner, &Cancellation::default()),
17455
+ &owner,
17456
+ );
17457
+ let prepare = registered_prepare(&source, &root, &["thread-a", "thread-b"]);
17458
+ let discovery = || store.lock_state().counters[17];
17459
+ let directory_stamp = || SourceStamp::of(&std::fs::metadata(&subagents).unwrap());
17460
+ let graph = finish_prepared(
17461
+ &store,
17462
+ store.request(&prepare, &owner, &Cancellation::default()),
17463
+ &owner,
17464
+ );
17465
+ assert_eq!(graph["status"].as_str(), Some("ok"), "{graph:?}");
17466
+ assert!(graph_has_tool(&store, &source, &owner, &graph, "Read"));
17467
+ assert!(!graph_has_tool(&store, &source, &owner, &graph, "Grep"));
17468
+ assert!(!graph_has_tool(&store, &source, &owner, &graph, "Bash"));
17469
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 1);
17470
+ let listed = directory_stamp();
17471
+ std::fs::OpenOptions::new()
17472
+ .append(true)
17473
+ .open(&members[1])
17474
+ .unwrap()
17475
+ .write_all(format!("{}\n", tool_use_line("Grep")).as_bytes())
17476
+ .unwrap();
17477
+ assert_eq!(directory_stamp(), listed);
17478
+ let before = discovery();
17479
+ let appended = finish_prepared(
17480
+ &store,
17481
+ store.request(&prepare, &owner, &Cancellation::default()),
17482
+ &owner,
17483
+ );
17484
+ assert_eq!(
17485
+ discovery() - before,
17486
+ 0,
17487
+ "a member append listed an unchanged sidechain directory again"
17488
+ );
17489
+ assert_eq!(appended["status"].as_str(), Some("ok"), "{appended:?}");
17490
+ assert!(graph_has_tool(&store, &source, &owner, &appended, "Read"));
17491
+ assert!(graph_has_tool(&store, &source, &owner, &appended, "Grep"));
17492
+ assert!(!graph_has_tool(&store, &source, &owner, &appended, "Bash"));
17493
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 1);
17494
+ store.assert_conserved();
17495
+ std::fs::write(
17496
+ subagents.join("child.jsonl"),
17497
+ format!("{}\n{}\n", user("child"), tool_use_line("Bash")),
17498
+ )
17499
+ .unwrap();
17500
+ assert_ne!(directory_stamp(), listed);
17501
+ let before = discovery();
17502
+ let discovered = finish_prepared(
17503
+ &store,
17504
+ store.request(&prepare, &owner, &Cancellation::default()),
17505
+ &owner,
17506
+ );
17507
+ assert!(discovery() > before);
17508
+ assert_eq!(discovered["status"].as_str(), Some("ok"), "{discovered:?}");
17509
+ for tool in ["Read", "Grep", "Bash"] {
17510
+ assert!(graph_has_tool(&store, &source, &owner, &discovered, tool));
17511
+ }
17512
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17513
+ let before = discovery();
17514
+ let hot = finish_prepared(
17515
+ &store,
17516
+ store.request(&prepare, &owner, &Cancellation::default()),
17517
+ &owner,
17518
+ );
17519
+ assert_eq!(discovery(), before);
17520
+ assert_eq!(hot["status"].as_str(), Some("ok"), "{hot:?}");
17521
+ for tool in ["Read", "Grep", "Bash"] {
17522
+ assert!(graph_has_tool(&store, &source, &owner, &hot, tool));
17523
+ }
17524
+ assert_eq!(store.warm_records.load(Ordering::Relaxed), 2);
17368
17525
  store.assert_conserved();
17369
17526
  }
17370
17527
 
@@ -17525,6 +17682,81 @@ mod tests {
17525
17682
  assert_eq!(store.prepared_disk.stats().writes, writes);
17526
17683
  }
17527
17684
 
17685
+ #[test]
17686
+ fn registered_append_refresh_reserves_the_member_paths_it_copies() {
17687
+ let (source, store, owner, request) = registered_warming(20);
17688
+ let store = Arc::new(store);
17689
+ registered_pages(&store, &owner, &request);
17690
+ let warmed = store
17691
+ .lock_state()
17692
+ .warm_memberships
17693
+ .values()
17694
+ .next()
17695
+ .unwrap()
17696
+ .clone();
17697
+ let live = source_ref_bytes(&warmed.members)
17698
+ + arc_slice_bytes::<(SourceIdentity, usize)>(warmed.positions.len())
17699
+ + sidechain_dir_bytes(&warmed.sidechain_dirs)
17700
+ + warmed.members.len() * size_of::<PreparedSourceRef>();
17701
+ let copied: usize = warmed.members[..warmed.members.len() - 1]
17702
+ .iter()
17703
+ .map(|member| member.path.as_os_str().len())
17704
+ .sum();
17705
+ std::fs::OpenOptions::new()
17706
+ .append(true)
17707
+ .open(source.directory.join("thread-0000.jsonl"))
17708
+ .unwrap()
17709
+ .write_all(format!("{}\n", user("appended")).as_bytes())
17710
+ .unwrap();
17711
+ let resolved = Arc::new(Mutex::new(Vec::new()));
17712
+ *store.resolve_hook.lock().unwrap() = Some(Arc::new({
17713
+ let (store, resolved) = (Arc::downgrade(&store), Arc::clone(&resolved));
17714
+ move |path: &Path| {
17715
+ let store = store.upgrade().unwrap();
17716
+ let state = store.lock_state();
17717
+ resolved.lock().unwrap().push((
17718
+ path.to_path_buf(),
17719
+ state.transient_bytes,
17720
+ state.warm_memberships.is_empty(),
17721
+ ));
17722
+ }
17723
+ }));
17724
+ let mut refresh = request.clone();
17725
+ refresh.insert("deadline_unix_ms", json!(now_ms() + 120_000));
17726
+ let reply = store.request(&refresh, &owner, &Cancellation::default());
17727
+ *store.resolve_hook.lock().unwrap() = None;
17728
+ assert_eq!(reply["status"].as_str(), Some("ok"), "{reply:?}");
17729
+ let resolutions = resolved.lock().unwrap();
17730
+ let uncached: Vec<_> = resolutions
17731
+ .iter()
17732
+ .filter(|(.., uncached)| *uncached)
17733
+ .collect();
17734
+ assert_eq!(
17735
+ uncached.iter().map(|(path, ..)| path).collect::<Vec<_>>(),
17736
+ warmed
17737
+ .members
17738
+ .iter()
17739
+ .map(|member| &member.path)
17740
+ .collect::<Vec<_>>()
17741
+ );
17742
+ assert!(!resolutions[0].2);
17743
+ assert!(
17744
+ uncached.last().unwrap().1 - resolutions[0].1 >= live + copied,
17745
+ "the refresh holds copied member paths its reservation never charged"
17746
+ );
17747
+ assert!(Arc::ptr_eq(
17748
+ &store
17749
+ .lock_state()
17750
+ .warm_memberships
17751
+ .values()
17752
+ .next()
17753
+ .unwrap()
17754
+ .positions,
17755
+ &warmed.positions
17756
+ ));
17757
+ store.assert_conserved();
17758
+ }
17759
+
17528
17760
  #[test]
17529
17761
  fn registered_completion_rejects_an_owner_directory_replaced_between_members() {
17530
17762
  use std::os::unix::fs::DirBuilderExt;
@@ -17682,6 +17914,32 @@ mod tests {
17682
17914
  );
17683
17915
  }
17684
17916
 
17917
+ #[test]
17918
+ fn registered_warmer_cancelled_on_its_last_step_fails_its_final_hold() {
17919
+ let (source, store, owner, mut request) = registered_warming(300);
17920
+ registered_pages(&store, &owner, &request);
17921
+ std::fs::OpenOptions::new()
17922
+ .append(true)
17923
+ .open(source.directory.join("thread-0255.jsonl"))
17924
+ .unwrap()
17925
+ .write_all(format!("{}\n", user("appended")).as_bytes())
17926
+ .unwrap();
17927
+ let cancel = Cancellation::default();
17928
+ *store.built_facts_hook.lock().unwrap() = Some(Arc::new({
17929
+ let cancel = cancel.clone();
17930
+ move |_: &Arc<crate::snapshot_prepared::PreparedFacts>| cancel.cancel()
17931
+ }));
17932
+ let builds = store.fact_builds.load(Ordering::Relaxed);
17933
+ request.insert("deadline_unix_ms", json!(now_ms() + 120_000));
17934
+ let cancelled = store.request(&request, &owner, &cancel);
17935
+ assert_eq!(
17936
+ cancelled["status"].as_str(),
17937
+ Some("cancelled"),
17938
+ "{cancelled:?}"
17939
+ );
17940
+ assert_eq!(store.fact_builds.load(Ordering::Relaxed) - builds, 1);
17941
+ }
17942
+
17685
17943
  #[test]
17686
17944
  fn disk_facts_complete_queries_when_memory_fact_budget_is_smaller() {
17687
17945
  let source = Source::new(&format!("{}\n", user("root")));
@@ -904,7 +904,7 @@ impl NativeStore {
904
904
  return Ok(false);
905
905
  }
906
906
  }
907
- dirs.hold()
907
+ dirs.hold(|| cancel.check(deadline))
908
908
  }
909
909
 
910
910
  fn validate_sidechain_dirs(
@@ -935,7 +935,7 @@ impl NativeStore {
935
935
  return Ok(false);
936
936
  }
937
937
  }
938
- dirs.hold()
938
+ dirs.hold(|| cancel.check(deadline))
939
939
  }
940
940
 
941
941
  fn prepare_graph(
@@ -1598,6 +1598,11 @@ impl NativeStore {
1598
1598
  return Ok((cached, None));
1599
1599
  }
1600
1600
  self.lock_state().remove_warm_membership(key);
1601
+ if let Some((membership, reservation)) =
1602
+ self.refreshed_warm_membership(key, &cached, request, context, cancel, remaining)?
1603
+ {
1604
+ return Ok((membership, Some(reservation)));
1605
+ }
1601
1606
  }
1602
1607
  let (membership, reservation) =
1603
1608
  self.build_warm_membership(key, request, context, cancel, usage, remaining)?;
@@ -1610,6 +1615,103 @@ impl NativeStore {
1610
1615
  Ok((membership, Some(reservation)))
1611
1616
  }
1612
1617
 
1618
+ fn refreshed_warm_membership(
1619
+ &self,
1620
+ key: &str,
1621
+ cached: &WarmMembership,
1622
+ request: &Value,
1623
+ context: &Value,
1624
+ cancel: &Cancellation,
1625
+ remaining: &WorkLimits,
1626
+ ) -> Result<Option<(WarmMembership, ProjectionReservation<'_>)>, SnapshotError> {
1627
+ if cached.expires <= now_ms()
1628
+ || !self.validate_sidechain_dirs(
1629
+ &cached.sidechain_dirs,
1630
+ context,
1631
+ cancel,
1632
+ remaining.deadline_unix_ms,
1633
+ )?
1634
+ {
1635
+ return Ok(None);
1636
+ }
1637
+ let mut reservation = self.reserve_projection(
1638
+ context,
1639
+ key.len()
1640
+ + cached.accounted_bytes()
1641
+ + cached.members.len() * size_of::<PreparedSourceRef>()
1642
+ + source_ref_bytes(&cached.members)
1643
+ + arc_slice_bytes::<(SourceIdentity, usize)>(cached.positions.len())
1644
+ + sidechain_dir_bytes(&cached.sidechain_dirs),
1645
+ )?;
1646
+ let mut dirs = ResolvedDirs::new(self, context);
1647
+ let mut members = Vec::with_capacity(cached.members.len());
1648
+ for member in cached.members.iter() {
1649
+ #[cfg(test)]
1650
+ self.membership_metadata_checks
1651
+ .fetch_add(1, Ordering::Relaxed);
1652
+ cancel.check(remaining.deadline_unix_ms)?;
1653
+ let (canonical, metadata) = match dirs.resolve(&member.path) {
1654
+ Ok(resolved) => resolved,
1655
+ Err(error) if error.status == Status::Missing => return Ok(None),
1656
+ Err(error) => return Err(error),
1657
+ };
1658
+ self.authority(context, Some(&canonical))?;
1659
+ let stamp = SourceStamp::of(&metadata);
1660
+ if canonical != member.path
1661
+ || stamp.identity != member.stamp.identity
1662
+ || (stamp != member.stamp && stamp.size <= member.stamp.size)
1663
+ {
1664
+ return Ok(None);
1665
+ }
1666
+ self.extend_projection_reservation(&mut reservation, context, canonical.capacity())?;
1667
+ members.push(PreparedSourceRef {
1668
+ path: canonical,
1669
+ stamp,
1670
+ });
1671
+ }
1672
+ let since = active_since_ns(request)?;
1673
+ if !dirs.hold(|| cancel.check(remaining.deadline_unix_ms))?
1674
+ || members
1675
+ .iter()
1676
+ .filter(|member| active(member, since))
1677
+ .count()
1678
+ > remaining.max_sources
1679
+ {
1680
+ return Ok(None);
1681
+ }
1682
+ self.extend_projection_reservation(
1683
+ &mut reservation,
1684
+ context,
1685
+ arc_slice_bytes::<PreparedSourceRef>(members.len()),
1686
+ )?;
1687
+ Ok(Some((
1688
+ WarmMembership {
1689
+ revision: Self::warm_membership_revision(&members),
1690
+ members: members.into(),
1691
+ positions: Arc::clone(&cached.positions),
1692
+ sidechain_dirs: Arc::clone(&cached.sidechain_dirs),
1693
+ complete: cached.complete,
1694
+ expires: cached.expires,
1695
+ },
1696
+ reservation,
1697
+ )))
1698
+ }
1699
+
1700
+ fn warm_membership_revision(members: &[PreparedSourceRef]) -> String {
1701
+ use std::fmt::Write as _;
1702
+
1703
+ let revision_len = 2 * <Sha256 as Digest>::output_size();
1704
+ let mut digest = Sha256::new();
1705
+ for source in members {
1706
+ digest.update(source.path.as_os_str().as_encoded_bytes());
1707
+ digest.update(source.stamp.revision().as_bytes());
1708
+ }
1709
+ let mut revision = String::with_capacity(revision_len);
1710
+ write!(revision, "{:x}", digest.finalize()).expect("hex digest");
1711
+ assert_eq!(revision.capacity(), revision_len);
1712
+ revision
1713
+ }
1714
+
1613
1715
  fn build_warm_membership(
1614
1716
  &self,
1615
1717
  key: &str,
@@ -1619,8 +1721,6 @@ impl NativeStore {
1619
1721
  usage: &mut [u64; 20],
1620
1722
  remaining: &mut WorkLimits,
1621
1723
  ) -> Result<(WarmMembership, ProjectionReservation<'_>), SnapshotError> {
1622
- use std::fmt::Write as _;
1623
-
1624
1724
  let ids = request["thread_ids"]
1625
1725
  .as_array()
1626
1726
  .ok_or_else(|| invalid("missing registered thread ids"))?;
@@ -1799,11 +1899,6 @@ impl NativeStore {
1799
1899
  "registered source bound exhausted",
1800
1900
  ));
1801
1901
  }
1802
- let mut digest = Sha256::new();
1803
- for source in &members {
1804
- digest.update(source.path.as_os_str().as_encoded_bytes());
1805
- digest.update(source.stamp.revision().as_bytes());
1806
- }
1807
1902
  self.extend_projection_reservation(
1808
1903
  &mut reservation,
1809
1904
  context,
@@ -1811,15 +1906,12 @@ impl NativeStore {
1811
1906
  + arc_slice_bytes::<(SourceIdentity, usize)>(members.len())
1812
1907
  + arc_slice_bytes::<(PathBuf, Option<SourceStamp>)>(sidechain_dirs.len()),
1813
1908
  )?;
1814
- let mut revision = String::with_capacity(revision_len);
1815
- write!(revision, "{:x}", digest.finalize()).expect("hex digest");
1816
- assert_eq!(revision.capacity(), revision_len);
1817
1909
  Ok((
1818
1910
  WarmMembership {
1911
+ revision: Self::warm_membership_revision(&members),
1819
1912
  positions: member_positions(&members),
1820
1913
  members: members.into(),
1821
1914
  sidechain_dirs: sidechain_dirs.into(),
1822
- revision,
1823
1915
  complete: located.len() == ids.len(),
1824
1916
  expires: now_ms().saturating_add(30 * 60_000),
1825
1917
  },
@@ -2054,7 +2146,10 @@ impl NativeStore {
2054
2146
  steps += 1;
2055
2147
  uncached_steps += usize::from(!cached);
2056
2148
  }
2057
- if !dirs.hold()? {
2149
+ if !dirs.hold(|| match cancel.check(remaining.deadline_unix_ms) {
2150
+ Err(error) if error.status == Status::Deadline => Ok(()),
2151
+ checked => checked,
2152
+ })? {
2058
2153
  return Err(SnapshotError::new(
2059
2154
  Status::Changed,
2060
2155
  "registered source changed",
@@ -2161,7 +2256,7 @@ impl NativeStore {
2161
2256
  let page = self
2162
2257
  .prepared_query_steps(&mut cursor, &mut dirs, context, reservation, cancel, usage)
2163
2258
  .and_then(|page| {
2164
- if dirs.hold()? {
2259
+ if dirs.hold(|| cancel.check(cursor.remaining.deadline_unix_ms))? {
2165
2260
  Ok(page)
2166
2261
  } else {
2167
2262
  Err(SnapshotError::new(
@@ -2983,8 +3078,10 @@ impl<'a> ResolvedDirs<'a> {
2983
3078
  Ok(canonical)
2984
3079
  }
2985
3080
 
2986
- fn hold(&self) -> Result<bool, SnapshotError> {
3081
+ fn hold(&self, check: impl Fn() -> Result<(), SnapshotError>) -> Result<bool, SnapshotError> {
3082
+ check()?;
2987
3083
  for (directory, canonical) in &self.dirs {
3084
+ check()?;
2988
3085
  match self.store.canonical_path(directory) {
2989
3086
  Ok(current) if current == *canonical => {}
2990
3087
  Ok(_) => return Ok(false),
@@ -2992,6 +3089,7 @@ impl<'a> ResolvedDirs<'a> {
2992
3089
  Err(error) => return Err(io_error(error)),
2993
3090
  }
2994
3091
  }
3092
+ check()?;
2995
3093
  Ok(true)
2996
3094
  }
2997
3095
  }