cc-transcript 14.45.13__tar.gz → 14.45.15__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.13 → cc_transcript-14.45.15}/PKG-INFO +1 -1
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/pyproject.toml +1 -1
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot.rs +243 -5
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_activity.rs +17 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_projection.rs +615 -48
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/Cargo.lock +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/Cargo.toml +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/LICENSE +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/README.md +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/__init__.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/__init__.pyi +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/command.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/context.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/decision_store.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/models.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/query.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/render.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/config.schema.json +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/context.schema.json +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/request.schema.json +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/response.schema.json +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/snapshots.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/tools.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/blame.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/corpus.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/cli/src/timearg.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/Cargo.toml +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/build.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/blame.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/lower.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/parse.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/codex/types.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/command.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/lib.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/parse.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_checkpoint.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep_stream.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_index.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_projection.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_regressions.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/scan_stream.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/schema.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_codec.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_labels.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_ledger.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_ledger_tests.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_memory.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_owned.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_prepared_service.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_regressions.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/snapshot_text.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/toolcall.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/types.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/value.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/tests/sonic_arena_model.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/core/tests/std_allocation_model.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/python.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/render.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/snapshot_decode.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/snapshots.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/blocks.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/events.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/store.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/toolcall.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/toolresult.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/rust/crates/py/src/views/transcript.rs +0 -0
- {cc_transcript-14.45.13 → cc_transcript-14.45.15}/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.15" # 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"
|
|
@@ -7143,6 +7143,7 @@ impl NativeStore {
|
|
|
7143
7143
|
let mut lines: Vec<(u64, Vec<Entry>)> = Vec::new();
|
|
7144
7144
|
let mut events = 0usize;
|
|
7145
7145
|
let mut exhausted = false;
|
|
7146
|
+
let mut read_step = self.config.read_step.min(64 * 1024);
|
|
7146
7147
|
loop {
|
|
7147
7148
|
while events < count {
|
|
7148
7149
|
cancel.check(limits.deadline_unix_ms)?;
|
|
@@ -7165,11 +7166,7 @@ impl NativeStore {
|
|
|
7165
7166
|
}
|
|
7166
7167
|
break;
|
|
7167
7168
|
}
|
|
7168
|
-
let step =
|
|
7169
|
-
.config
|
|
7170
|
-
.read_step
|
|
7171
|
-
.min(budget - read)
|
|
7172
|
-
.min(pending_start as usize);
|
|
7169
|
+
let step = read_step.min(budget - read).min(pending_start as usize);
|
|
7173
7170
|
if step == 0 {
|
|
7174
7171
|
exhausted = true;
|
|
7175
7172
|
break;
|
|
@@ -7183,6 +7180,7 @@ impl NativeStore {
|
|
|
7183
7180
|
file.read_exact(&mut block).map_err(io_error)?;
|
|
7184
7181
|
usage[1] += step as u64;
|
|
7185
7182
|
read += step;
|
|
7183
|
+
read_step = read_step.saturating_mul(2).min(self.config.read_step);
|
|
7186
7184
|
block.extend_from_slice(&pending);
|
|
7187
7185
|
pending = block;
|
|
7188
7186
|
pending_start -= step as u64;
|
|
@@ -11662,6 +11660,60 @@ mod tests {
|
|
|
11662
11660
|
assert_eq!(state.counters[4], 1);
|
|
11663
11661
|
assert_eq!(state.counters[1], pinned_size + 128);
|
|
11664
11662
|
}
|
|
11663
|
+
#[test]
|
|
11664
|
+
fn turn_projection_cursor_preserves_native_page_status_and_zero_item_incompleteness() {
|
|
11665
|
+
let source = Source::new(
|
|
11666
|
+
&(0..600)
|
|
11667
|
+
.map(|index| format!("{}\n", user(&format!("u{index}"))))
|
|
11668
|
+
.collect::<String>(),
|
|
11669
|
+
);
|
|
11670
|
+
let store = NativeStore::new(&json!({})).unwrap();
|
|
11671
|
+
let owner = context("turn-pages");
|
|
11672
|
+
let cancel = Cancellation::default();
|
|
11673
|
+
let mut acquiring = acquire(&source.path);
|
|
11674
|
+
acquiring["limits"].insert("max_events", json!(10000));
|
|
11675
|
+
let root = finish(&store, store.request(&acquiring, &owner, &cancel), &owner);
|
|
11676
|
+
assert_eq!(root["status"].as_str(), Some("ok"));
|
|
11677
|
+
for reverse in [false, true] {
|
|
11678
|
+
let mut req = graph_request(
|
|
11679
|
+
&root,
|
|
11680
|
+
json!({"kind":"turns","order":if reverse {"reverse"} else {"forward"}}),
|
|
11681
|
+
Vec::new(),
|
|
11682
|
+
json!([]),
|
|
11683
|
+
);
|
|
11684
|
+
req["limits"].insert("max_events", json!(10000));
|
|
11685
|
+
req["limits"].insert("max_items", json!(600));
|
|
11686
|
+
req["limits"].insert("max_read_bytes", json!(16 * 1024 * 1024));
|
|
11687
|
+
let mut response = store.request(&req, &owner, &cancel);
|
|
11688
|
+
for (page_index, expected_items) in [256, 256, 88].into_iter().enumerate() {
|
|
11689
|
+
assert_eq!(
|
|
11690
|
+
response["data"]["records_json"].as_array().unwrap().len(),
|
|
11691
|
+
expected_items
|
|
11692
|
+
);
|
|
11693
|
+
if page_index == 2 {
|
|
11694
|
+
assert_eq!(response["status"].as_str(), Some("ok"));
|
|
11695
|
+
assert!(response["cursor"].is_null());
|
|
11696
|
+
assert!(response["reason"].is_null());
|
|
11697
|
+
} else {
|
|
11698
|
+
assert_eq!(response["status"].as_str(), Some("incomplete"));
|
|
11699
|
+
assert_eq!(response["reason"].as_str(), Some("item_limit"));
|
|
11700
|
+
let cursor = response["cursor"].as_str().unwrap().to_owned();
|
|
11701
|
+
response = store.request(
|
|
11702
|
+
&json!({"schema":SCHEMA,"id":"turn-resume","operation":"resume","cursor":cursor}),
|
|
11703
|
+
&owner,
|
|
11704
|
+
&cancel,
|
|
11705
|
+
);
|
|
11706
|
+
}
|
|
11707
|
+
}
|
|
11708
|
+
req["limits"].insert("max_items", json!(0));
|
|
11709
|
+
let zero = store.request(&req, &owner, &cancel);
|
|
11710
|
+
assert_eq!(zero["status"].as_str(), Some("incomplete"));
|
|
11711
|
+
assert_eq!(zero["reason"].as_str(), Some("item_limit"));
|
|
11712
|
+
assert!(zero["cursor"].is_null());
|
|
11713
|
+
assert!(zero["data"]["records_json"].as_array().unwrap().is_empty());
|
|
11714
|
+
}
|
|
11715
|
+
}
|
|
11716
|
+
|
|
11665
11717
|
fn graph_request(
|
|
11666
11718
|
root: &Value,
|
|
11667
11719
|
query: Value,
|
|
@@ -12203,6 +12255,192 @@ mod tests {
|
|
|
12203
12255
|
.collect()
|
|
12204
12256
|
}
|
|
12205
12257
|
|
|
12258
|
+
fn tail_with_small_step_reference(source: &Source, count: usize, budget: usize) -> Value {
|
|
12259
|
+
let owner = context("a");
|
|
12260
|
+
let request = tail_request(&source.path, count, budget);
|
|
12261
|
+
let store = NativeStore::new(&json!({})).unwrap();
|
|
12262
|
+
let response = store.request(&request, &owner, &Cancellation::default());
|
|
12263
|
+
let reference = NativeStore::new(&json!({"max_read_bytes_per_step":4096})).unwrap();
|
|
12264
|
+
let reference = reference.request(&request, &owner, &Cancellation::default());
|
|
12265
|
+
assert_eq!(response["status"], reference["status"], "{response:?}");
|
|
12266
|
+
assert_eq!(response["reason"], reference["reason"], "{response:?}");
|
|
12267
|
+
assert_eq!(response["data"], reference["data"], "{response:?}");
|
|
12268
|
+
response
|
|
12269
|
+
}
|
|
12270
|
+
|
|
12271
|
+
#[test]
|
|
12272
|
+
fn tail_default_steps_read_only_the_newest_event_window() {
|
|
12273
|
+
let suffix = (0..256)
|
|
12274
|
+
.map(|index| format!("{}\n", user_text(&index.to_string(), &"x".repeat(1400))))
|
|
12275
|
+
.collect::<String>();
|
|
12276
|
+
assert!((256 * 1024..448 * 1024).contains(&suffix.len()));
|
|
12277
|
+
let prefix = format!("{}\n", " ".repeat(8 * 1024 * 1024));
|
|
12278
|
+
let source = Source::new(&format!("{prefix}{suffix}"));
|
|
12279
|
+
let response = tail_with_small_step_reference(&source, 256, 8 * 1024 * 1024);
|
|
12280
|
+
assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
|
|
12281
|
+
assert_eq!(
|
|
12282
|
+
tail_uuids(&response),
|
|
12283
|
+
(0..256).map(|index| index.to_string()).collect::<Vec<_>>()
|
|
12284
|
+
);
|
|
12285
|
+
assert_eq!(
|
|
12286
|
+
response["data"]["source_bytes"].as_u64(),
|
|
12287
|
+
Some((prefix.len() + suffix.len()) as u64)
|
|
12288
|
+
);
|
|
12289
|
+
assert_eq!(
|
|
12290
|
+
response["data"]["window_start_byte"].as_u64(),
|
|
12291
|
+
Some(prefix.len() as u64)
|
|
12292
|
+
);
|
|
12293
|
+
let read = response["usage"]["source_bytes_read"].as_u64().unwrap();
|
|
12294
|
+
assert!(read >= suffix.len() as u64 && read <= 512 * 1024, "{read}");
|
|
12295
|
+
}
|
|
12296
|
+
|
|
12297
|
+
#[test]
|
|
12298
|
+
fn tail_grows_reads_for_a_long_partial_line() {
|
|
12299
|
+
fn count_reads(store: &Arc<NativeStore>, reads: &Arc<AtomicUsize>) {
|
|
12300
|
+
let next = Arc::downgrade(store);
|
|
12301
|
+
let reads = Arc::clone(reads);
|
|
12302
|
+
*store.read_hook.lock().unwrap() = Some(Arc::new(move || {
|
|
12303
|
+
reads.fetch_add(1, Ordering::Relaxed);
|
|
12304
|
+
count_reads(&next.upgrade().unwrap(), &reads);
|
|
12305
|
+
}));
|
|
12306
|
+
}
|
|
12307
|
+
|
|
12308
|
+
let prefix = format!("{}\n", " ".repeat(8 * 1024 * 1024));
|
|
12309
|
+
let suffix = format!("{}\n", user_text("large", &"x".repeat(512 * 1024)));
|
|
12310
|
+
let source = Source::new(&format!("{prefix}{suffix}"));
|
|
12311
|
+
let owner = context("a");
|
|
12312
|
+
let request = tail_request(&source.path, 1, 8 * 1024 * 1024);
|
|
12313
|
+
let store = Arc::new(NativeStore::new(&json!({})).unwrap());
|
|
12314
|
+
let reads = Arc::new(AtomicUsize::new(0));
|
|
12315
|
+
count_reads(&store, &reads);
|
|
12316
|
+
let response = store.request(&request, &owner, &Cancellation::default());
|
|
12317
|
+
assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
|
|
12318
|
+
assert_eq!(tail_uuids(&response), ["large"]);
|
|
12319
|
+
assert_eq!(
|
|
12320
|
+
response["data"]["window_start_byte"].as_u64(),
|
|
12321
|
+
Some(prefix.len() as u64)
|
|
12322
|
+
);
|
|
12323
|
+
assert!(response["usage"]["source_bytes_read"].as_u64().unwrap() <= 1024 * 1024);
|
|
12324
|
+
assert!(reads.load(Ordering::Relaxed) <= 4);
|
|
12325
|
+
let bounded = NativeStore::new(&json!({"max_entry_bytes":256*1024})).unwrap();
|
|
12326
|
+
let refused = bounded.request(&request, &owner, &Cancellation::default());
|
|
12327
|
+
assert_eq!(
|
|
12328
|
+
refused["status"].as_str(),
|
|
12329
|
+
Some("entry_limit"),
|
|
12330
|
+
"{refused:?}"
|
|
12331
|
+
);
|
|
12332
|
+
}
|
|
12333
|
+
|
|
12334
|
+
#[test]
|
|
12335
|
+
fn tail_preserves_utf8_across_growing_read_boundaries() {
|
|
12336
|
+
let mut split_scalars = 0;
|
|
12337
|
+
for ending in ["", "\n"] {
|
|
12338
|
+
let contents = format!(
|
|
12339
|
+
"{}\n{}{ending}",
|
|
12340
|
+
user("old"),
|
|
12341
|
+
user_text("unicode", &"é".repeat(128 * 1024))
|
|
12342
|
+
);
|
|
12343
|
+
let boundary = contents.len() - 64 * 1024;
|
|
12344
|
+
split_scalars += usize::from(contents.as_bytes()[boundary] & 0xc0 == 0x80);
|
|
12345
|
+
let source = Source::new(&contents);
|
|
12346
|
+
let response = tail_with_small_step_reference(&source, 1, 1024 * 1024);
|
|
12347
|
+
assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
|
|
12348
|
+
assert_eq!(tail_uuids(&response), ["unicode"]);
|
|
12349
|
+
assert_eq!(
|
|
12350
|
+
response["data"]["window_start_byte"].as_u64(),
|
|
12351
|
+
Some((user("old").len() + 1) as u64)
|
|
12352
|
+
);
|
|
12353
|
+
}
|
|
12354
|
+
assert_eq!(split_scalars, 1);
|
|
12355
|
+
}
|
|
12356
|
+
|
|
12357
|
+
#[test]
|
|
12358
|
+
fn tail_read_budget_requires_the_oldest_line_delimiter() {
|
|
12359
|
+
let prefix = format!("{}\n", user("old"));
|
|
12360
|
+
let first = format!("{}\n", user_text("a", &"x".repeat(128 * 1024)));
|
|
12361
|
+
let last = format!("{}\n", user_text("b", &"x".repeat(128 * 1024)));
|
|
12362
|
+
let source = Source::new(&format!("{prefix}{first}{last}"));
|
|
12363
|
+
let budget = first.len() + last.len();
|
|
12364
|
+
let incomplete = tail_with_small_step_reference(&source, 2, budget);
|
|
12365
|
+
assert_eq!(
|
|
12366
|
+
incomplete["status"].as_str(),
|
|
12367
|
+
Some("incomplete"),
|
|
12368
|
+
"{incomplete:?}"
|
|
12369
|
+
);
|
|
12370
|
+
assert_eq!(
|
|
12371
|
+
incomplete["reason"].as_str(),
|
|
12372
|
+
Some("tail read budget exhausted")
|
|
12373
|
+
);
|
|
12374
|
+
assert!(incomplete["cursor"].is_null());
|
|
12375
|
+
assert_eq!(tail_uuids(&incomplete), ["b"]);
|
|
12376
|
+
assert_eq!(
|
|
12377
|
+
incomplete["data"]["window_start_byte"].as_u64(),
|
|
12378
|
+
Some((prefix.len() + first.len()) as u64)
|
|
12379
|
+
);
|
|
12380
|
+
let complete = tail_with_small_step_reference(&source, 2, budget + 1);
|
|
12381
|
+
assert_eq!(complete["status"].as_str(), Some("ok"), "{complete:?}");
|
|
12382
|
+
assert_eq!(tail_uuids(&complete), ["a", "b"]);
|
|
12383
|
+
assert_eq!(
|
|
12384
|
+
complete["data"]["window_start_byte"].as_u64(),
|
|
12385
|
+
Some(prefix.len() as u64)
|
|
12386
|
+
);
|
|
12387
|
+
}
|
|
12388
|
+
|
|
12389
|
+
#[test]
|
|
12390
|
+
fn tail_counts_metadata_events_and_skips_non_events_across_steps() {
|
|
12391
|
+
let source = Source::new(&format!(
|
|
12392
|
+
"{}\n{}\nnot json\n[]\nnull\n42\n{{\"type\":\"queue-operation\",\"operation\":\"enqueue\"}}\n{}\n",
|
|
12393
|
+
user("a"),
|
|
12394
|
+
" ".repeat(96 * 1024),
|
|
12395
|
+
user_text("b", &"x".repeat(128 * 1024)),
|
|
12396
|
+
));
|
|
12397
|
+
let response = tail_with_small_step_reference(&source, 3, 1024 * 1024);
|
|
12398
|
+
assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
|
|
12399
|
+
let records = response["data"]["records_json"]
|
|
12400
|
+
.as_array()
|
|
12401
|
+
.unwrap()
|
|
12402
|
+
.iter()
|
|
12403
|
+
.map(|record| record.as_str().unwrap().to_owned())
|
|
12404
|
+
.collect::<Vec<_>>();
|
|
12405
|
+
let records = crate::snapshot_codec::decode_events(&records, 1024 * 1024).unwrap();
|
|
12406
|
+
assert_eq!(records.len(), 3);
|
|
12407
|
+
assert_eq!(records[0].event.meta().unwrap().uuid, "a");
|
|
12408
|
+
assert!(matches!(&records[1].event, Entry::Other(other) if other.ty == "queue-operation"));
|
|
12409
|
+
assert_eq!(records[2].event.meta().unwrap().uuid, "b");
|
|
12410
|
+
assert_eq!(response["data"]["window_start_byte"].as_u64(), Some(0));
|
|
12411
|
+
}
|
|
12412
|
+
|
|
12413
|
+
#[test]
|
|
12414
|
+
fn tail_preserves_the_pinned_source_while_reads_grow() {
|
|
12415
|
+
let prefix = format!("{}\n", user("old"));
|
|
12416
|
+
let suffix = format!("{}\n", user_text("new", &"x".repeat(256 * 1024)));
|
|
12417
|
+
let source = Source::new(&format!("{prefix}{suffix}"));
|
|
12418
|
+
let path = source.path.clone();
|
|
12419
|
+
let store = NativeStore::new(&json!({})).unwrap();
|
|
12420
|
+
*store.read_hook.lock().unwrap() = Some(Arc::new(move || {
|
|
12421
|
+
std::fs::OpenOptions::new()
|
|
12422
|
+
.append(true)
|
|
12423
|
+
.open(&path)
|
|
12424
|
+
.unwrap()
|
|
12425
|
+
.write_all(format!("{}\n", user("appended")).as_bytes())
|
|
12426
|
+
.unwrap();
|
|
12427
|
+
}));
|
|
12428
|
+
let response = store.request(
|
|
12429
|
+
&tail_request(&source.path, 1, 1024 * 1024),
|
|
12430
|
+
&context("a"),
|
|
12431
|
+
&Cancellation::default(),
|
|
12432
|
+
);
|
|
12433
|
+
assert_eq!(response["status"].as_str(), Some("ok"), "{response:?}");
|
|
12434
|
+
assert_eq!(tail_uuids(&response), ["new"]);
|
|
12435
|
+
assert_eq!(
|
|
12436
|
+
response["data"]["source_bytes"].as_u64(),
|
|
12437
|
+
Some((prefix.len() + suffix.len()) as u64)
|
|
12438
|
+
);
|
|
12439
|
+
assert_eq!(
|
|
12440
|
+
response["data"]["window_start_byte"].as_u64(),
|
|
12441
|
+
Some(prefix.len() as u64)
|
|
12442
|
+
);
|
|
12443
|
+
}
|
|
12206
12444
|
#[test]
|
|
12207
12445
|
fn tail_returns_the_newest_events_reading_backwards_in_bounded_steps() {
|
|
12208
12446
|
let source = Source::new(&users(0..50));
|
|
@@ -41,6 +41,7 @@ pub(crate) struct CachedCall {
|
|
|
41
41
|
#[derive(Debug, Clone)]
|
|
42
42
|
pub(crate) struct CachedTurn {
|
|
43
43
|
prompt: String,
|
|
44
|
+
prompt_count: usize,
|
|
44
45
|
bounds: Range<usize>,
|
|
45
46
|
started: Option<usize>,
|
|
46
47
|
ended: Option<usize>,
|
|
@@ -252,6 +253,8 @@ impl ActivityIndex {
|
|
|
252
253
|
}
|
|
253
254
|
}
|
|
254
255
|
let turn = CachedTurn {
|
|
256
|
+
prompt_count: next.prompt_count_before(next.turn_count())
|
|
257
|
+
+ usize::from(!indexed.prompt.is_empty()),
|
|
255
258
|
prompt: indexed.prompt,
|
|
256
259
|
bounds: first_new_index + indexed.start..first_new_index + indexed.end,
|
|
257
260
|
started: indexed.started_idx.map(|i| first_new_index + i),
|
|
@@ -299,6 +302,19 @@ impl ActivityIndex {
|
|
|
299
302
|
self.turns.get(index).map(|turn| turn.prompt.as_str())
|
|
300
303
|
}
|
|
301
304
|
|
|
305
|
+
pub(crate) fn prompt_count_before(&self, turn: usize) -> usize {
|
|
306
|
+
if turn == 0 {
|
|
307
|
+
0
|
|
308
|
+
} else {
|
|
309
|
+
self.turns[turn - 1].prompt_count
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
pub(crate) fn prompt_turn(&self, ordinal: usize) -> usize {
|
|
314
|
+
self.turns
|
|
315
|
+
.partition_point(|turn| turn.prompt_count <= ordinal)
|
|
316
|
+
}
|
|
317
|
+
|
|
302
318
|
pub fn turn_bounds(&self, index: usize) -> Option<Range<usize>> {
|
|
303
319
|
self.turns.get(index).map(|turn| turn.bounds.clone())
|
|
304
320
|
}
|
|
@@ -558,6 +574,7 @@ impl ActivityIndex {
|
|
|
558
574
|
for turn in turns.iter() {
|
|
559
575
|
let CachedTurn {
|
|
560
576
|
prompt,
|
|
577
|
+
prompt_count: _,
|
|
561
578
|
bounds: _,
|
|
562
579
|
started: _,
|
|
563
580
|
ended: _,
|