cc-transcript 14.45.11__tar.gz → 14.45.13__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.11 → cc_transcript-14.45.13}/PKG-INFO +1 -1
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/pyproject.toml +1 -1
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot.rs +260 -55
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_activity.rs +160 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_ledger_tests.rs +71 -10
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_prepared_disk.rs +214 -7
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_prepared_service.rs +32 -14
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_projection.rs +81 -60
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_root_warm.rs +2 -2
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/Cargo.lock +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/Cargo.toml +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/LICENSE +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/README.md +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/__init__.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/__init__.pyi +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/command.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/context.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/decision_store.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/models.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/query.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/render.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshot_schema/config.schema.json +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshot_schema/context.schema.json +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshot_schema/request.schema.json +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshot_schema/response.schema.json +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/snapshots.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/tools.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/blame.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/corpus.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/cli/src/timearg.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/Cargo.toml +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/build.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/blame.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/lower.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/parse.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/codex/types.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/command.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/lib.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/parse.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_checkpoint.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_grep.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_grep_stream.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_index.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_projection.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_regressions.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/scan_stream.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/schema.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_codec.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_labels.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_ledger.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_memory.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_owned.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_prepared.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_regressions.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/snapshot_text.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/toolcall.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/types.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/value.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/tests/sonic_arena_model.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/core/tests/std_allocation_model.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/python.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/render.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/snapshot_decode.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/snapshots.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/blocks.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/events.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/store.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/toolcall.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/toolresult.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/rust/crates/py/src/views/transcript.rs +0 -0
- {cc_transcript-14.45.11 → cc_transcript-14.45.13}/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.13" # 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"
|
|
@@ -32,7 +32,9 @@ use crate::snapshot_memory::{
|
|
|
32
32
|
use crate::snapshot_prepared::FactsNeed;
|
|
33
33
|
use crate::snapshot_prepared_disk::PreparedDiskKey;
|
|
34
34
|
use crate::snapshot_projection::JSON_LITERAL_OBJECT_CAPACITY;
|
|
35
|
-
use crate::types::
|
|
35
|
+
use crate::types::Entry;
|
|
36
|
+
#[cfg(test)]
|
|
37
|
+
use crate::types::SYNTHETIC_MODEL;
|
|
36
38
|
|
|
37
39
|
pub const SCHEMA: &str = "cc-transcript.snapshot/1";
|
|
38
40
|
pub const PARSER_VERSION: &str = "cc-transcript.snapshot/1";
|
|
@@ -375,23 +377,15 @@ impl TranscriptSnapshot {
|
|
|
375
377
|
if self.window_start == 0 {
|
|
376
378
|
return None;
|
|
377
379
|
}
|
|
378
|
-
self.
|
|
379
|
-
.iter()
|
|
380
|
-
.flat_map(|chunk| chunk.entries.iter())
|
|
381
|
-
.find_map(Entry::meta)
|
|
382
|
-
.map(|meta| meta.timestamp.timestamp_millis())
|
|
380
|
+
self.activity.started_unix_ms()
|
|
383
381
|
}
|
|
384
382
|
|
|
385
383
|
pub fn model(&self) -> Option<&str> {
|
|
386
|
-
self.
|
|
387
|
-
.
|
|
388
|
-
.
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
Entry::Assistant(assistant) if assistant.model != SYNTHETIC_MODEL => {
|
|
392
|
-
Some(assistant.model.as_str())
|
|
393
|
-
}
|
|
394
|
-
_ => None,
|
|
384
|
+
self.activity
|
|
385
|
+
.last_model_event()
|
|
386
|
+
.map(|position| match self.entry(position) {
|
|
387
|
+
Entry::Assistant(assistant) => assistant.model.as_str(),
|
|
388
|
+
_ => unreachable!("indexed model is an assistant event"),
|
|
395
389
|
})
|
|
396
390
|
}
|
|
397
391
|
|
|
@@ -533,11 +527,10 @@ struct Lease {
|
|
|
533
527
|
registry: Arc<crate::toolcall::ToolRegistrySnapshot>,
|
|
534
528
|
}
|
|
535
529
|
|
|
536
|
-
struct
|
|
530
|
+
struct LeasedScope {
|
|
537
531
|
snapshot: Arc<TranscriptSnapshot>,
|
|
538
532
|
classifier: Value,
|
|
539
533
|
expires: u64,
|
|
540
|
-
description_bytes: usize,
|
|
541
534
|
}
|
|
542
535
|
|
|
543
536
|
// Sized exactly like an acquire reply's re-serialized copy, whose bytes admit graph members.
|
|
@@ -2889,6 +2882,8 @@ pub struct NativeStore {
|
|
|
2889
2882
|
#[cfg(test)]
|
|
2890
2883
|
pub(crate) fact_builds: AtomicUsize,
|
|
2891
2884
|
#[cfg(test)]
|
|
2885
|
+
pub(crate) description_builds: AtomicUsize,
|
|
2886
|
+
#[cfg(test)]
|
|
2892
2887
|
pub(crate) fact_lookups: AtomicUsize,
|
|
2893
2888
|
#[cfg(test)]
|
|
2894
2889
|
pub(crate) fact_read_waits: AtomicUsize,
|
|
@@ -3372,6 +3367,8 @@ impl NativeStore {
|
|
|
3372
3367
|
#[cfg(test)]
|
|
3373
3368
|
fact_builds: AtomicUsize::new(0),
|
|
3374
3369
|
#[cfg(test)]
|
|
3370
|
+
description_builds: AtomicUsize::new(0),
|
|
3371
|
+
#[cfg(test)]
|
|
3375
3372
|
fact_lookups: AtomicUsize::new(0),
|
|
3376
3373
|
#[cfg(test)]
|
|
3377
3374
|
fact_read_waits: AtomicUsize::new(0),
|
|
@@ -3520,7 +3517,7 @@ impl NativeStore {
|
|
|
3520
3517
|
deadline: u64,
|
|
3521
3518
|
) -> Result<u64, SnapshotError> {
|
|
3522
3519
|
for handle in handles {
|
|
3523
|
-
self.
|
|
3520
|
+
self.pin_record(handle, context)?;
|
|
3524
3521
|
}
|
|
3525
3522
|
let state = self.lock_state();
|
|
3526
3523
|
let mut expires = (now_ms() + self.config.ttl).min(deadline);
|
|
@@ -3955,11 +3952,9 @@ impl NativeStore {
|
|
|
3955
3952
|
mut bounds: WorkLimits,
|
|
3956
3953
|
) -> Result<Value, SnapshotError> {
|
|
3957
3954
|
cancel.check(bounds.deadline_unix_ms)?;
|
|
3958
|
-
let (
|
|
3959
|
-
|
|
3960
|
-
bounds.deadline_unix_ms = bounds
|
|
3961
|
-
.deadline_unix_ms
|
|
3962
|
-
.min(number(&description, "lease_expires_unix_ms")? as u64);
|
|
3955
|
+
let scope = self.renew_scope_for_work(handle, context, bounds.deadline_unix_ms)?;
|
|
3956
|
+
let source = scope.snapshot;
|
|
3957
|
+
bounds.deadline_unix_ms = bounds.deadline_unix_ms.min(scope.expires);
|
|
3963
3958
|
bounds.deadline_unix_ms = bounds
|
|
3964
3959
|
.deadline_unix_ms
|
|
3965
3960
|
.min(now_ms() + self.config.preparation);
|
|
@@ -4983,6 +4978,29 @@ impl NativeStore {
|
|
|
4983
4978
|
|
|
4984
4979
|
#[cfg(test)]
|
|
4985
4980
|
fn audit_snapshot_allocations(snapshot: &Arc<TranscriptSnapshot>) -> Vec<(usize, usize)> {
|
|
4981
|
+
let started = if snapshot.window_start == 0 {
|
|
4982
|
+
None
|
|
4983
|
+
} else {
|
|
4984
|
+
snapshot
|
|
4985
|
+
.chunks
|
|
4986
|
+
.iter()
|
|
4987
|
+
.flat_map(|chunk| chunk.entries.iter())
|
|
4988
|
+
.find_map(Entry::meta)
|
|
4989
|
+
.map(|meta| meta.timestamp.timestamp_millis())
|
|
4990
|
+
};
|
|
4991
|
+
assert_eq!(snapshot.window_started_unix_ms(), started);
|
|
4992
|
+
let model = snapshot
|
|
4993
|
+
.chunks
|
|
4994
|
+
.iter()
|
|
4995
|
+
.rev()
|
|
4996
|
+
.flat_map(|chunk| chunk.entries.iter().rev())
|
|
4997
|
+
.find_map(|entry| match entry {
|
|
4998
|
+
Entry::Assistant(assistant) if assistant.model != SYNTHETIC_MODEL => {
|
|
4999
|
+
Some(assistant.model.as_str())
|
|
5000
|
+
}
|
|
5001
|
+
_ => None,
|
|
5002
|
+
});
|
|
5003
|
+
assert_eq!(snapshot.model(), model);
|
|
4986
5004
|
let TranscriptSnapshot {
|
|
4987
5005
|
ledger: _,
|
|
4988
5006
|
id,
|
|
@@ -5863,6 +5881,8 @@ impl NativeStore {
|
|
|
5863
5881
|
lease: &str,
|
|
5864
5882
|
expires: u64,
|
|
5865
5883
|
) -> Value {
|
|
5884
|
+
#[cfg(test)]
|
|
5885
|
+
self.description_builds.fetch_add(1, Ordering::Relaxed);
|
|
5866
5886
|
json!({"handle": LeaseHandle {owner_epoch: &self.owner_epoch, snapshot_id: &snapshot.id, generation: &snapshot.id, lease_id: lease},
|
|
5867
5887
|
"canonical_path": snapshot.canonical_path.to_string_lossy().as_ref(),
|
|
5868
5888
|
"source_id": format!("{}:{}", snapshot.stamp.identity.device, snapshot.stamp.identity.inode),
|
|
@@ -5879,8 +5899,7 @@ impl NativeStore {
|
|
|
5879
5899
|
handle: &Value,
|
|
5880
5900
|
context: &Value,
|
|
5881
5901
|
) -> Result<Arc<TranscriptSnapshot>, SnapshotError> {
|
|
5882
|
-
self.
|
|
5883
|
-
.map(|(snapshot, _)| snapshot)
|
|
5902
|
+
self.pin_record(handle, context).map(|scope| scope.snapshot)
|
|
5884
5903
|
}
|
|
5885
5904
|
|
|
5886
5905
|
pub fn validate_scope(&self, handle: &Value, context: &Value) -> Result<(), SnapshotError> {
|
|
@@ -5893,23 +5912,36 @@ impl NativeStore {
|
|
|
5893
5912
|
handle: &Value,
|
|
5894
5913
|
context: &Value,
|
|
5895
5914
|
) -> Result<(Arc<TranscriptSnapshot>, Value), SnapshotError> {
|
|
5915
|
+
let scope = self.capture_scope(handle, context)?;
|
|
5916
|
+
let description = self.description(
|
|
5917
|
+
&scope.snapshot,
|
|
5918
|
+
&scope.classifier,
|
|
5919
|
+
str_field(handle, "lease_id")?,
|
|
5920
|
+
scope.expires,
|
|
5921
|
+
);
|
|
5922
|
+
self.authority(context, Some(&scope.snapshot.canonical_path))?;
|
|
5923
|
+
Ok((scope.snapshot, description))
|
|
5924
|
+
}
|
|
5925
|
+
|
|
5926
|
+
fn pin_record(&self, handle: &Value, context: &Value) -> Result<LeasedScope, SnapshotError> {
|
|
5927
|
+
let scope = self.capture_scope(handle, context)?;
|
|
5928
|
+
self.authority(context, Some(&scope.snapshot.canonical_path))?;
|
|
5929
|
+
Ok(scope)
|
|
5930
|
+
}
|
|
5931
|
+
|
|
5932
|
+
fn capture_scope(&self, handle: &Value, context: &Value) -> Result<LeasedScope, SnapshotError> {
|
|
5896
5933
|
self.authority(context, None)?;
|
|
5897
|
-
let
|
|
5934
|
+
let scope = {
|
|
5898
5935
|
let mut state = self.lock_state();
|
|
5899
5936
|
Self::prune(&mut state);
|
|
5900
5937
|
let lease = self.lease(&state, handle, context)?;
|
|
5901
|
-
|
|
5902
|
-
Arc::clone(&lease.snapshot),
|
|
5903
|
-
|
|
5904
|
-
|
|
5905
|
-
|
|
5906
|
-
str_field(handle, "lease_id")?,
|
|
5907
|
-
lease.expires,
|
|
5908
|
-
),
|
|
5909
|
-
)
|
|
5938
|
+
LeasedScope {
|
|
5939
|
+
snapshot: Arc::clone(&lease.snapshot),
|
|
5940
|
+
classifier: lease.classifier.clone(),
|
|
5941
|
+
expires: lease.expires,
|
|
5942
|
+
}
|
|
5910
5943
|
};
|
|
5911
|
-
|
|
5912
|
-
Ok((snapshot, description))
|
|
5944
|
+
Ok(scope)
|
|
5913
5945
|
}
|
|
5914
5946
|
|
|
5915
5947
|
pub fn pin_scope_for_work(
|
|
@@ -5933,7 +5965,7 @@ impl NativeStore {
|
|
|
5933
5965
|
handle: &Value,
|
|
5934
5966
|
context: &Value,
|
|
5935
5967
|
deadline: u64,
|
|
5936
|
-
) -> Result<
|
|
5968
|
+
) -> Result<LeasedScope, SnapshotError> {
|
|
5937
5969
|
#[cfg(test)]
|
|
5938
5970
|
{
|
|
5939
5971
|
let hook = self.pin_hook.lock().expect("pin hook").clone();
|
|
@@ -5950,7 +5982,7 @@ impl NativeStore {
|
|
|
5950
5982
|
"borrow deadline expired",
|
|
5951
5983
|
));
|
|
5952
5984
|
}
|
|
5953
|
-
let
|
|
5985
|
+
let scope = self.pin_record(handle, context)?;
|
|
5954
5986
|
let mut state = self.lock_state();
|
|
5955
5987
|
let lease = self.lease(&state, handle, context)?;
|
|
5956
5988
|
let expires = lease.expires.max(deadline.min(lease.absolute_deadline));
|
|
@@ -5960,11 +5992,10 @@ impl NativeStore {
|
|
|
5960
5992
|
.get_mut(str_field(handle, "lease_id")?)
|
|
5961
5993
|
.expect("validated lease")
|
|
5962
5994
|
.expires = expires;
|
|
5963
|
-
Ok(
|
|
5964
|
-
snapshot,
|
|
5995
|
+
Ok(LeasedScope {
|
|
5996
|
+
snapshot: scope.snapshot,
|
|
5965
5997
|
classifier,
|
|
5966
5998
|
expires,
|
|
5967
|
-
description_bytes: value_bytes(&probe),
|
|
5968
5999
|
})
|
|
5969
6000
|
}
|
|
5970
6001
|
|
|
@@ -8764,6 +8795,12 @@ impl NativeStore {
|
|
|
8764
8795
|
let claimant = str_field(context, "claimant")?;
|
|
8765
8796
|
let lease_id = str_field(root_handle, "lease_id")?;
|
|
8766
8797
|
let root_path = scope.snapshot.canonical_path.as_os_str().len();
|
|
8798
|
+
let description_bytes = value_bytes(&self.description(
|
|
8799
|
+
&scope.snapshot,
|
|
8800
|
+
&scope.classifier,
|
|
8801
|
+
lease_id,
|
|
8802
|
+
scope.expires,
|
|
8803
|
+
));
|
|
8767
8804
|
let mut reservation = self.reserve_projection(
|
|
8768
8805
|
context,
|
|
8769
8806
|
size_of::<GraphCursor>()
|
|
@@ -8773,7 +8810,7 @@ impl NativeStore {
|
|
|
8773
8810
|
+ value_bytes(root_handle)
|
|
8774
8811
|
+ size_of::<GraphNode>()
|
|
8775
8812
|
+ root_path
|
|
8776
|
-
+
|
|
8813
|
+
+ description_bytes
|
|
8777
8814
|
+ set_growth(&HashSet::<SourceIdentity>::new(), 1)
|
|
8778
8815
|
+ task_count * size_of::<GraphTask>()
|
|
8779
8816
|
+ attachment_bytes
|
|
@@ -8781,7 +8818,7 @@ impl NativeStore {
|
|
|
8781
8818
|
)?;
|
|
8782
8819
|
#[cfg(test)]
|
|
8783
8820
|
self.graph_records.fetch_add(1, Ordering::Relaxed);
|
|
8784
|
-
let
|
|
8821
|
+
let LeasedScope {
|
|
8785
8822
|
snapshot: root,
|
|
8786
8823
|
classifier,
|
|
8787
8824
|
expires,
|
|
@@ -9097,7 +9134,7 @@ impl NativeStore {
|
|
|
9097
9134
|
usage: &mut [u64; 20],
|
|
9098
9135
|
) -> Result<GraphYield, SnapshotError> {
|
|
9099
9136
|
cancel.check(graph.remaining.deadline_unix_ms)?;
|
|
9100
|
-
self.
|
|
9137
|
+
self.renew_scope_for_work(
|
|
9101
9138
|
&graph.root_handle,
|
|
9102
9139
|
&graph.context,
|
|
9103
9140
|
graph.remaining.deadline_unix_ms,
|
|
@@ -9538,12 +9575,10 @@ impl NativeStore {
|
|
|
9538
9575
|
let handle = view
|
|
9539
9576
|
.get("handle")
|
|
9540
9577
|
.ok_or_else(|| invalid("missing view handle"))?;
|
|
9541
|
-
let (
|
|
9542
|
-
|
|
9543
|
-
bound.deadline_unix_ms = bound
|
|
9544
|
-
|
|
9545
|
-
.min(number(&description, "lease_expires_unix_ms")? as u64);
|
|
9546
|
-
if !classifier_eq(&view["classifier"], &description["classifier"])? {
|
|
9578
|
+
let scope = self.renew_scope_for_work(handle, context, bound.deadline_unix_ms)?;
|
|
9579
|
+
let snapshot = scope.snapshot;
|
|
9580
|
+
bound.deadline_unix_ms = bound.deadline_unix_ms.min(scope.expires);
|
|
9581
|
+
if !classifier_eq(&view["classifier"], &scope.classifier)? {
|
|
9547
9582
|
return Err(invalid("view classifier differs from leased generation"));
|
|
9548
9583
|
}
|
|
9549
9584
|
let mut page = bound;
|
|
@@ -9671,16 +9706,15 @@ impl NativeStore {
|
|
|
9671
9706
|
.ok_or_else(|| invalid("missing windows_json"))?;
|
|
9672
9707
|
let mut sessions = HashMap::new();
|
|
9673
9708
|
for handle in handles.iter() {
|
|
9674
|
-
let
|
|
9709
|
+
let scope = self.renew_scope_for_work(
|
|
9675
9710
|
handle
|
|
9676
9711
|
.get("handle")
|
|
9677
9712
|
.ok_or_else(|| invalid("missing handle"))?,
|
|
9678
9713
|
context,
|
|
9679
9714
|
bound.deadline_unix_ms,
|
|
9680
9715
|
)?;
|
|
9681
|
-
|
|
9682
|
-
|
|
9683
|
-
.min(number(&description, "lease_expires_unix_ms")? as u64);
|
|
9716
|
+
let snapshot = scope.snapshot;
|
|
9717
|
+
bound.deadline_unix_ms = bound.deadline_unix_ms.min(scope.expires);
|
|
9684
9718
|
let session = str_field(handle, "session_id")?;
|
|
9685
9719
|
if session != snapshot.session_id {
|
|
9686
9720
|
return Err(invalid("hydration session differs from handle"));
|
|
@@ -15491,6 +15525,58 @@ mod tests {
|
|
|
15491
15525
|
store.assert_conserved();
|
|
15492
15526
|
}
|
|
15493
15527
|
|
|
15528
|
+
#[test]
|
|
15529
|
+
fn a_stopped_fact_read_keeps_the_entry_for_the_next_member_reader() {
|
|
15530
|
+
for (expected, cancels) in [("cancelled", true), ("deadline", false)] {
|
|
15531
|
+
let EvictedMembers {
|
|
15532
|
+
source,
|
|
15533
|
+
members,
|
|
15534
|
+
store,
|
|
15535
|
+
owner,
|
|
15536
|
+
indexed,
|
|
15537
|
+
..
|
|
15538
|
+
} = evicted_members(&["thread-a"]);
|
|
15539
|
+
let key = fact_entry_key(&members[0], &owner);
|
|
15540
|
+
let cancellation = Cancellation::default();
|
|
15541
|
+
let stop = cancellation.clone();
|
|
15542
|
+
let deadline = now_ms() + if cancels { 30_000 } else { 1_500 };
|
|
15543
|
+
store.prepared_disk.set_read_hook(Some(Box::new(move || {
|
|
15544
|
+
if cancels {
|
|
15545
|
+
stop.cancel();
|
|
15546
|
+
} else {
|
|
15547
|
+
while now_ms() < deadline {
|
|
15548
|
+
std::thread::sleep(Duration::from_millis(5));
|
|
15549
|
+
}
|
|
15550
|
+
}
|
|
15551
|
+
})));
|
|
15552
|
+
let stopped = store.request(
|
|
15553
|
+
&warm_request(&source, &["thread-a"], deadline),
|
|
15554
|
+
&owner,
|
|
15555
|
+
&cancellation,
|
|
15556
|
+
);
|
|
15557
|
+
store.prepared_disk.set_read_hook(None);
|
|
15558
|
+
assert_eq!(stopped["status"].as_str(), Some(expected), "{stopped:?}");
|
|
15559
|
+
assert_eq!(cache_reads(&stopped), (Some(0), Some(0), Some(0)));
|
|
15560
|
+
assert_eq!(store.fact_lookups.load(Ordering::Relaxed), 1);
|
|
15561
|
+
assert!(store.prepared_disk.has_entry(&key).unwrap());
|
|
15562
|
+
assert!(!store.lock_state().fact_read_in_flight);
|
|
15563
|
+
store.assert_conserved();
|
|
15564
|
+
let reused = store.request(
|
|
15565
|
+
&warm_request(&source, &["thread-a"], now_ms() + 30_000),
|
|
15566
|
+
&owner,
|
|
15567
|
+
&Cancellation::default(),
|
|
15568
|
+
);
|
|
15569
|
+
assert_eq!(reused["status"].as_str(), Some("ok"), "{reused:?}");
|
|
15570
|
+
assert_eq!(reused["data"]["complete"].as_bool(), Some(true));
|
|
15571
|
+
assert_eq!(cache_reads(&reused), (Some(1), Some(indexed), Some(0)));
|
|
15572
|
+
assert_eq!(store.fact_lookups.load(Ordering::Relaxed), 2);
|
|
15573
|
+
assert!(resident_member_facts(&store, &members)
|
|
15574
|
+
.iter()
|
|
15575
|
+
.all(Option::is_some));
|
|
15576
|
+
store.assert_conserved();
|
|
15577
|
+
}
|
|
15578
|
+
}
|
|
15579
|
+
|
|
15494
15580
|
fn user_text(id: &str, text: &str) -> String {
|
|
15495
15581
|
format!(
|
|
15496
15582
|
r#"{{"type":"user","uuid":"{id}","sessionId":"s","timestamp":"2026-01-02T03:04:05Z","message":{{"content":"{text}"}}}}"#
|
|
@@ -16092,6 +16178,77 @@ mod tests {
|
|
|
16092
16178
|
store.assert_conserved();
|
|
16093
16179
|
}
|
|
16094
16180
|
|
|
16181
|
+
#[test]
|
|
16182
|
+
fn repeated_root_predicates_keep_scope_metadata_typed() {
|
|
16183
|
+
let skill = json!({"type":"assistant","uuid":"skill","sessionId":"s","timestamp":"2026-01-02T03:04:06Z","message":{"model":"m","content":[{"type":"tool_use","id":"skill","name":"Skill","input":{"skill":"skill-4"}}]}});
|
|
16184
|
+
let source = Source::new(&format!("{}\n{skill}\n", user_text("prompt", "ready")));
|
|
16185
|
+
let store = fact_budget_store(16 * 1024 * 1024);
|
|
16186
|
+
let owner = context("a");
|
|
16187
|
+
let template = acquire(&source.path);
|
|
16188
|
+
let root = finish(
|
|
16189
|
+
&store,
|
|
16190
|
+
store.request(&template, &owner, &Cancellation::default()),
|
|
16191
|
+
&owner,
|
|
16192
|
+
);
|
|
16193
|
+
let graph = finish(
|
|
16194
|
+
&store,
|
|
16195
|
+
store.request(&json!({"schema":SCHEMA,"id":"prepare","operation":"prepare_graph","view":{"handle":handle(&root),"classifier":{"id":"native","version":"1"},"selectors":[],"attachments":[]},"thread_ids":[],"roots":[],"direct_paths":[],"deadline_unix_ms":template["deadline_unix_ms"],"limits":template["limits"]}), &owner, &Cancellation::default()),
|
|
16196
|
+
&owner,
|
|
16197
|
+
);
|
|
16198
|
+
assert_eq!(graph["status"].as_str(), Some("ok"), "{graph:?}");
|
|
16199
|
+
let before = store.description_builds.load(Ordering::Relaxed);
|
|
16200
|
+
for index in 0..24 {
|
|
16201
|
+
let request = prepared_graph_request(
|
|
16202
|
+
&graph,
|
|
16203
|
+
&template,
|
|
16204
|
+
json!([]),
|
|
16205
|
+
json!({"kind":"has_skill","values":[format!("skill-{index}")],"subagents":true}),
|
|
16206
|
+
None,
|
|
16207
|
+
);
|
|
16208
|
+
let answer = single_step(store.request(&request, &owner, &Cancellation::default()));
|
|
16209
|
+
assert_eq!(value_of(&answer), Some(index == 4), "{answer:?}");
|
|
16210
|
+
}
|
|
16211
|
+
assert_eq!(store.description_builds.load(Ordering::Relaxed), before);
|
|
16212
|
+
let (_, description) = store
|
|
16213
|
+
.pin_scope_for_work(
|
|
16214
|
+
&handle(&root),
|
|
16215
|
+
&owner,
|
|
16216
|
+
template["deadline_unix_ms"].as_u64().unwrap(),
|
|
16217
|
+
)
|
|
16218
|
+
.unwrap();
|
|
16219
|
+
assert_eq!(store.description_builds.load(Ordering::Relaxed), before + 1);
|
|
16220
|
+
assert_eq!(
|
|
16221
|
+
description["classifier"],
|
|
16222
|
+
json!({"id":"native","version":"1"})
|
|
16223
|
+
);
|
|
16224
|
+
assert_eq!(description["model"].as_str(), Some("m"));
|
|
16225
|
+
assert_eq!(
|
|
16226
|
+
description["canonical_path"].as_str(),
|
|
16227
|
+
std::fs::canonicalize(&source.path).unwrap().to_str()
|
|
16228
|
+
);
|
|
16229
|
+
let later = json!({"type":"assistant","uuid":"later","sessionId":"s","timestamp":"2026-01-02T03:04:07Z","message":{"model":"later","content":[]}});
|
|
16230
|
+
std::fs::OpenOptions::new()
|
|
16231
|
+
.append(true)
|
|
16232
|
+
.open(&source.path)
|
|
16233
|
+
.unwrap()
|
|
16234
|
+
.write_all(format!("{later}\n").as_bytes())
|
|
16235
|
+
.unwrap();
|
|
16236
|
+
let newer = finish(
|
|
16237
|
+
&store,
|
|
16238
|
+
store.request(&acquire(&source.path), &owner, &Cancellation::default()),
|
|
16239
|
+
&owner,
|
|
16240
|
+
);
|
|
16241
|
+
assert_eq!(
|
|
16242
|
+
store.pin(&handle(&root), &owner).unwrap().model(),
|
|
16243
|
+
Some("m")
|
|
16244
|
+
);
|
|
16245
|
+
assert_eq!(
|
|
16246
|
+
store.pin(&handle(&newer), &owner).unwrap().model(),
|
|
16247
|
+
Some("later")
|
|
16248
|
+
);
|
|
16249
|
+
store.assert_conserved();
|
|
16250
|
+
}
|
|
16251
|
+
|
|
16095
16252
|
#[test]
|
|
16096
16253
|
fn selected_root_slices_answer_has_override_within_their_view() {
|
|
16097
16254
|
let source = Source::new(&format!(
|
|
@@ -16515,6 +16672,54 @@ mod tests {
|
|
|
16515
16672
|
store.assert_conserved();
|
|
16516
16673
|
}
|
|
16517
16674
|
|
|
16675
|
+
#[test]
|
|
16676
|
+
fn a_cancelled_root_fact_read_keeps_the_entry_and_builds_nothing() {
|
|
16677
|
+
let source = Source::new(&format!("{}\n{}\n", user("root"), user("child")));
|
|
16678
|
+
let store = fact_budget_store(16 * 1024 * 1024);
|
|
16679
|
+
let owner = context("a");
|
|
16680
|
+
let bounds = limits(&acquire(&source.path)).unwrap();
|
|
16681
|
+
let root = pinned_root(&store, &source, &owner);
|
|
16682
|
+
assert_eq!(root_facts_read(&store, &root, &owner, &bounds).1, 0);
|
|
16683
|
+
assert_eq!(
|
|
16684
|
+
store
|
|
16685
|
+
.lock_state()
|
|
16686
|
+
.remove_identity_facts(root.stamp.identity),
|
|
16687
|
+
1
|
|
16688
|
+
);
|
|
16689
|
+
let key = fact_entry_key(&source.path, &owner);
|
|
16690
|
+
let builds = store.fact_builds.load(Ordering::Relaxed);
|
|
16691
|
+
let cancellation = Cancellation::default();
|
|
16692
|
+
let stop = cancellation.clone();
|
|
16693
|
+
store
|
|
16694
|
+
.prepared_disk
|
|
16695
|
+
.set_read_hook(Some(Box::new(move || stop.cancel())));
|
|
16696
|
+
let mut usage = [0u64; 20];
|
|
16697
|
+
let stopped = store
|
|
16698
|
+
.prepared_root_facts(
|
|
16699
|
+
&root,
|
|
16700
|
+
&json!({"id":"native","version":"1"}),
|
|
16701
|
+
&owner,
|
|
16702
|
+
&bounds,
|
|
16703
|
+
PreparedCacheReads::Unmetered,
|
|
16704
|
+
&cancellation,
|
|
16705
|
+
&mut usage,
|
|
16706
|
+
FactsNeed::Index,
|
|
16707
|
+
)
|
|
16708
|
+
.err()
|
|
16709
|
+
.map(|error| error.status);
|
|
16710
|
+
store.prepared_disk.set_read_hook(None);
|
|
16711
|
+
assert_eq!(stopped, Some(Status::Cancelled));
|
|
16712
|
+
assert_eq!((usage[18], usage[19]), (0, 0));
|
|
16713
|
+
assert_eq!(store.fact_lookups.load(Ordering::Relaxed), 1);
|
|
16714
|
+
assert_eq!(store.fact_builds.load(Ordering::Relaxed), builds);
|
|
16715
|
+
assert!(store.prepared_disk.has_entry(&key).unwrap());
|
|
16716
|
+
assert!(!store.lock_state().fact_read_in_flight);
|
|
16717
|
+
store.assert_conserved();
|
|
16718
|
+
assert_eq!(root_facts_read(&store, &root, &owner, &bounds).1, 1);
|
|
16719
|
+
assert_eq!(store.fact_builds.load(Ordering::Relaxed), builds);
|
|
16720
|
+
store.assert_conserved();
|
|
16721
|
+
}
|
|
16722
|
+
|
|
16518
16723
|
#[test]
|
|
16519
16724
|
fn waiting_reader_with_a_different_binding_never_reuses_the_published_facts() {
|
|
16520
16725
|
let source = Source::new(&format!("{}\n{}\n", user("root"), user("child")));
|