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.
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/PKG-INFO +1 -1
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/pyproject.toml +1 -1
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot.rs +263 -5
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared_service.rs +114 -16
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/Cargo.lock +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/Cargo.toml +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/LICENSE +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/README.md +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/__init__.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/__init__.pyi +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/command.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/context.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/decision_store.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/models.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/query.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/render.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/config.schema.json +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/context.schema.json +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/request.schema.json +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/response.schema.json +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/snapshots.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/tools.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/blame.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/corpus.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/cli/src/timearg.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/Cargo.toml +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/build.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/blame.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/lower.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/parse.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/codex/types.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/command.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/lib.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/parse.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_checkpoint.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep_stream.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_index.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_projection.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_regressions.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/scan_stream.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/schema.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_activity.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_codec.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_labels.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_ledger.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_ledger_tests.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_memory.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_owned.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_projection.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_regressions.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_text.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/toolcall.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/types.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/value.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/tests/sonic_arena_model.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/tests/std_allocation_model.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/python.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/render.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/snapshot_decode.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/snapshots.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/blocks.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/events.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/store.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/toolcall.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/toolresult.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/views/transcript.rs +0 -0
- {cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/py/src/watch.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cc-transcript"
|
|
3
|
-
version = "14.45.
|
|
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),
|
|
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),
|
|
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),
|
|
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),
|
|
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),
|
|
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")));
|
{cc_transcript-14.45.9 → cc_transcript-14.45.11}/rust/crates/core/src/snapshot_prepared_service.rs
RENAMED
|
@@ -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
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|