cc-transcript 14.35.0__tar.gz → 14.37.0__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.35.0 → cc_transcript-14.37.0}/PKG-INFO +2 -2
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/extract/correct.py +61 -16
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/config.schema.json +1 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/pyproject.toml +2 -2
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/lower.rs +120 -9
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/parse.rs +13 -3
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/types.rs +3 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/lib.rs +1 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/parse.rs +742 -39
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep.rs +1 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot.rs +6736 -2200
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_activity.rs +601 -23
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_codec.rs +114 -12
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_codex_append.rs +15 -9
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_labels.rs +151 -7
- cc_transcript-14.37.0/rust/crates/core/src/snapshot_ledger.rs +1286 -0
- cc_transcript-14.37.0/rust/crates/core/src/snapshot_ledger_tests.rs +13315 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_memory.rs +112 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_owned.rs +96 -18
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared.rs +1 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared_disk.rs +361 -60
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_prepared_service.rs +1076 -528
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_projection.rs +153 -34
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_root_warm.rs +14 -15
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/toolcall.rs +33 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/types.rs +25 -10
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/value.rs +17 -4
- cc_transcript-14.37.0/rust/crates/core/tests/sonic_arena_model.rs +242 -0
- cc_transcript-14.37.0/rust/crates/core/tests/std_allocation_model.rs +165 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/python.rs +2 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/render.rs +3 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/snapshot_decode.rs +7 -5
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/blocks.rs +41 -2
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/events.rs +2 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/store.rs +4 -3
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/toolcall.rs +20 -7
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/transcript.rs +4 -4
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/watch.rs +2 -1
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/Cargo.lock +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/Cargo.toml +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/LICENSE +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/README.md +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/__init__.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/__init__.pyi +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/command.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/context.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/decision_store.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/models.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/query.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/render.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/context.schema.json +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/request.schema.json +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/response.schema.json +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshots.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/tools.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/blame.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/corpus.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/main.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/cli/src/timearg.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/Cargo.toml +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/blame.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/command.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_checkpoint.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep_stream.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_grep_stream_tests.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_index.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_projection.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_regressions.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/scan_stream.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/schema.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_regressions.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/snapshot_text.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/snapshots.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.35.0 → cc_transcript-14.37.0}/rust/crates/py/src/views/toolresult.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cc-transcript
|
|
3
|
-
Version: 14.
|
|
3
|
+
Version: 14.37.0
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -18,7 +18,7 @@ Requires-Dist: ruff>=0.8 ; extra == 'dev'
|
|
|
18
18
|
Requires-Dist: sqlite-vec>=0.1.9 ; extra == 'judge'
|
|
19
19
|
Requires-Dist: model2vec>=0.8.2 ; extra == 'judge'
|
|
20
20
|
Requires-Dist: numpy>=1.26 ; extra == 'judge'
|
|
21
|
-
Requires-Dist: spawnllm>=0.
|
|
21
|
+
Requires-Dist: spawnllm>=0.17.1,<0.18 ; extra == 'llm'
|
|
22
22
|
Provides-Extra: dev
|
|
23
23
|
Provides-Extra: judge
|
|
24
24
|
Provides-Extra: llm
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
:func:`extract_correction` harvests the candidate incorrect edits around a
|
|
4
4
|
feedback anchor (deterministically, via :mod:`cc_transcript.evidence`), then picks
|
|
5
5
|
the single edit the feedback faults and appends that one row to the shared
|
|
6
|
-
ledger. The pick is
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
tool call, never
|
|
6
|
+
ledger. The pick is a Jev label decision by default; when Jev errors or refuses
|
|
7
|
+
it falls back to an LLM call — lifted from cc-steer's enrich prompt — and to the
|
|
8
|
+
best-overlap candidate when no LLM backend is ready either (:func:`usable_backend`
|
|
9
|
+
returns None). The pick keys to the candidate's index, so the row carries the
|
|
10
|
+
real cross-language ``incorrect_digest`` from the harvested tool call, never
|
|
11
|
+
reconstructed content.
|
|
11
12
|
|
|
12
13
|
Behind the ``[llm]`` extra: this module imports pydantic at definition time and
|
|
13
14
|
``spawnllm`` lazily, so only LLM-capable consumers import it. A hook that merely
|
|
@@ -29,7 +30,7 @@ if TYPE_CHECKING:
|
|
|
29
30
|
from collections.abc import Sequence
|
|
30
31
|
from pathlib import Path
|
|
31
32
|
|
|
32
|
-
from spawnllm import LlmBackend, TModel
|
|
33
|
+
from spawnllm import Label, LlmBackend, TModel
|
|
33
34
|
|
|
34
35
|
from cc_transcript.activity import SessionActivity
|
|
35
36
|
from cc_transcript.corrections import Correction, CorrectionLog
|
|
@@ -38,6 +39,13 @@ if TYPE_CHECKING:
|
|
|
38
39
|
from cc_transcript.tools import Hunk
|
|
39
40
|
|
|
40
41
|
HUNK_BUDGET = Budget(tool_chars=600)
|
|
42
|
+
NO_CANDIDATE = "none"
|
|
43
|
+
|
|
44
|
+
PICK_QUESTION = """\
|
|
45
|
+
Which single candidate edit does the developer FEEDBACK fault? The candidates are edits an AI coding \
|
|
46
|
+
assistant made shortly before the feedback, newest first, each with the correction that later overwrote \
|
|
47
|
+
it when one was found; the correction ranked most likely by content overlap is tagged [likely fix]. \
|
|
48
|
+
Answer none when the feedback faults the approach, a command, or work outside these edits."""
|
|
41
49
|
|
|
42
50
|
PICK_PROMPT = """\
|
|
43
51
|
You are grounding one piece of developer FEEDBACK on an AI coding assistant's work
|
|
@@ -107,17 +115,37 @@ def candidate_block(index: int, pair: CandidatePair, *, anchor_turn: int, likely
|
|
|
107
115
|
)
|
|
108
116
|
|
|
109
117
|
|
|
110
|
-
def
|
|
118
|
+
def candidate_blocks(pairs: Sequence[CandidatePair], *, anchor_turn: int) -> str:
|
|
111
119
|
likely = likely_fix(pairs)
|
|
112
|
-
return
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
120
|
+
return "\n\n".join(
|
|
121
|
+
candidate_block(index, pair, anchor_turn=anchor_turn, likely=pair is likely)
|
|
122
|
+
for index, pair in enumerate(pairs, 1)
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def build_pick_prompt(feedback: str, pairs: Sequence[CandidatePair], *, anchor_turn: int) -> str:
|
|
127
|
+
return PICK_PROMPT.format(candidates=candidate_blocks(pairs, anchor_turn=anchor_turn), feedback=feedback)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def pick_label(pairs: Sequence[CandidatePair]) -> Label:
|
|
131
|
+
from spawnllm import Label
|
|
132
|
+
|
|
133
|
+
return Label(
|
|
134
|
+
PICK_QUESTION,
|
|
135
|
+
{
|
|
136
|
+
NO_CANDIDATE: "The feedback is not about any of these edits",
|
|
137
|
+
**{
|
|
138
|
+
str(index): f"candidate {index}: {pair.incorrect.file_path} ({pair.incorrect.tool})"
|
|
139
|
+
for index, pair in enumerate(pairs, 1)
|
|
140
|
+
},
|
|
141
|
+
},
|
|
118
142
|
)
|
|
119
143
|
|
|
120
144
|
|
|
145
|
+
def pair_for(choice: str, pairs: Sequence[CandidatePair]) -> CandidatePair | None:
|
|
146
|
+
return None if choice == NO_CANDIDATE else pairs[int(choice) - 1]
|
|
147
|
+
|
|
148
|
+
|
|
121
149
|
def usable_backend() -> LlmBackend | None:
|
|
122
150
|
"""The first ready spawnllm backend for the ``review`` specialty, or None when none is ready.
|
|
123
151
|
|
|
@@ -132,11 +160,27 @@ def usable_backend() -> LlmBackend | None:
|
|
|
132
160
|
return None
|
|
133
161
|
|
|
134
162
|
|
|
163
|
+
async def jev_choice(pairs: Sequence[CandidatePair], *, feedback: str, anchor_turn: int) -> str | None:
|
|
164
|
+
from spawnllm import DecideError, DecideKeyMissing, LabelAnswer, decide
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
decision = await decide(
|
|
168
|
+
{"candidate_edits": candidate_blocks(pairs, anchor_turn=anchor_turn), "feedback": feedback},
|
|
169
|
+
{"pick": pick_label(pairs)},
|
|
170
|
+
)
|
|
171
|
+
except (DecideError, DecideKeyMissing, TimeoutError):
|
|
172
|
+
return None
|
|
173
|
+
answer = decision.answers["pick"]
|
|
174
|
+
return answer.choice if isinstance(answer, LabelAnswer) else None
|
|
175
|
+
|
|
176
|
+
|
|
135
177
|
async def choose_pair(
|
|
136
178
|
pairs: Sequence[CandidatePair], *, feedback: str, anchor_turn: int, tier: TModel, backend: LlmBackend | None
|
|
137
179
|
) -> CandidatePair | None:
|
|
138
180
|
from spawnllm import extract
|
|
139
181
|
|
|
182
|
+
if (choice := await jev_choice(pairs, feedback=feedback, anchor_turn=anchor_turn)) is not None:
|
|
183
|
+
return pair_for(choice, pairs)
|
|
140
184
|
if backend is None:
|
|
141
185
|
return max(pairs, key=lambda pair: pair.overlap)
|
|
142
186
|
pick = await extract(
|
|
@@ -158,9 +202,10 @@ async def extract_correction(
|
|
|
158
202
|
) -> Correction | None:
|
|
159
203
|
"""Harvests around ``anchor`` and appends the one correction ``feedback`` faults.
|
|
160
204
|
|
|
161
|
-
The faulted candidate is
|
|
162
|
-
|
|
163
|
-
|
|
205
|
+
The faulted candidate is Jev's pick; when Jev errors or refuses, it is the
|
|
206
|
+
LLM's pick when ``backend`` is given, else the best-overlap candidate.
|
|
207
|
+
Idempotent per anchor: a no-op when this anchor already has a row, so
|
|
208
|
+
re-runs and overlapping producers never duplicate.
|
|
164
209
|
Returns the appended correction, or None when nothing is harvested or picked.
|
|
165
210
|
"""
|
|
166
211
|
if await log.for_anchor(anchor.session_id, anchor.event_uuid):
|
{cc_transcript-14.35.0 → cc_transcript-14.37.0}/cc_transcript/snapshot_schema/config.schema.json
RENAMED
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
},
|
|
82
82
|
"max_retained_bytes": {
|
|
83
83
|
"default": 1073741824,
|
|
84
|
+
"description": "Hard cap on retained accounted bytes. It must be at least the store's startup footprint (the pre-sized delivery and expired-query tables plus the default tool registries); a smaller value is rejected as an invalid configuration. Background admissions are capped at max_retained_bytes - reserved_hook_accounted_bytes, so a footprint above that difference refuses every background admission while foreground hook admissions proceed.",
|
|
84
85
|
"exclusiveMinimum": 0,
|
|
85
86
|
"maximum": 9007199254740991,
|
|
86
87
|
"title": "Max Retained Bytes",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cc-transcript"
|
|
3
|
-
version = "14.
|
|
3
|
+
version = "14.37.0" # 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"
|
|
@@ -41,7 +41,7 @@ dev = [
|
|
|
41
41
|
"ty>=0.0.44",
|
|
42
42
|
"ruff>=0.8",
|
|
43
43
|
]
|
|
44
|
-
llm = ["spawnllm>=0.
|
|
44
|
+
llm = ["spawnllm>=0.17.1,<0.18"]
|
|
45
45
|
judge = [
|
|
46
46
|
"sqlite-vec>=0.1.9",
|
|
47
47
|
"model2vec>=0.8.2",
|
|
@@ -9,6 +9,7 @@ use crate::codex::types::{
|
|
|
9
9
|
CodexEntry, CodexItem, CodexSession, EventMsg, ResponseItem, ResponseItemPayload,
|
|
10
10
|
};
|
|
11
11
|
use crate::pystr;
|
|
12
|
+
use crate::snapshot_memory::{pins_arena, SourceArena};
|
|
12
13
|
use crate::types::{
|
|
13
14
|
AssistantEntry, ContentBlock, Entry, EntryMeta, OtherEntry, ToolResultBlock, ToolUseBlock,
|
|
14
15
|
UserContent, UserEntry,
|
|
@@ -547,15 +548,17 @@ fn payload_tag(payload: &ResponseItemPayload) -> &str {
|
|
|
547
548
|
}
|
|
548
549
|
|
|
549
550
|
fn payload_raw(payload: &ResponseItemPayload) -> Value {
|
|
551
|
+
payload_dom(payload).cloned().unwrap_or_default()
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
fn payload_dom(payload: &ResponseItemPayload) -> Option<&Value> {
|
|
550
555
|
use ResponseItemPayload as R;
|
|
551
556
|
match payload {
|
|
552
|
-
R::ToolSearchCall { arguments, .. } => arguments
|
|
553
|
-
R::LocalShellCall { action, .. } | R::WebSearchCall { action, .. } =>
|
|
554
|
-
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
R::Other { raw, .. } => raw.clone(),
|
|
558
|
-
_ => Value::default(),
|
|
557
|
+
R::ToolSearchCall { arguments, .. } => Some(arguments),
|
|
558
|
+
R::LocalShellCall { action, .. } | R::WebSearchCall { action, .. } => action.as_ref(),
|
|
559
|
+
R::GhostSnapshot(v) => Some(v),
|
|
560
|
+
R::Other { raw, .. } => Some(raw),
|
|
561
|
+
_ => None,
|
|
559
562
|
}
|
|
560
563
|
}
|
|
561
564
|
|
|
@@ -592,6 +595,10 @@ fn event_tag(em: &EventMsg) -> &str {
|
|
|
592
595
|
}
|
|
593
596
|
|
|
594
597
|
fn event_raw(em: &EventMsg) -> Value {
|
|
598
|
+
event_dom(em).cloned().unwrap_or_default()
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
fn event_dom(em: &EventMsg) -> Option<&Value> {
|
|
595
602
|
use EventMsg as E;
|
|
596
603
|
match em {
|
|
597
604
|
E::ExecCommandEnd(v)
|
|
@@ -607,11 +614,75 @@ fn event_raw(em: &EventMsg) -> Value {
|
|
|
607
614
|
| E::CollabAgentSpawnEnd(v)
|
|
608
615
|
| E::CollabWaitingEnd(v)
|
|
609
616
|
| E::CollabCloseEnd(v)
|
|
610
|
-
| E::Other { raw: v, .. } => v
|
|
611
|
-
_ =>
|
|
617
|
+
| E::Other { raw: v, .. } => Some(v),
|
|
618
|
+
_ => None,
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
pub(crate) fn line_dom(item: &CodexItem) -> Option<&Value> {
|
|
623
|
+
use ResponseItemPayload as R;
|
|
624
|
+
match item {
|
|
625
|
+
CodexItem::SessionMeta(m) => Some(&m.raw),
|
|
626
|
+
CodexItem::TurnContext(v) => Some(v),
|
|
627
|
+
CodexItem::WorldState(w) => Some(&w.state),
|
|
628
|
+
CodexItem::ResponseItem(ri) => match &ri.payload {
|
|
629
|
+
R::FunctionCallOutput { output, .. } | R::CustomToolCallOutput { output, .. } => {
|
|
630
|
+
Some(output)
|
|
631
|
+
}
|
|
632
|
+
payload => payload_dom(payload),
|
|
633
|
+
},
|
|
634
|
+
CodexItem::EventMsg(em) => event_dom(em),
|
|
635
|
+
CodexItem::Compacted(_)
|
|
636
|
+
| CodexItem::InterAgentCommunicationMetadata { .. }
|
|
637
|
+
| CodexItem::Other(_) => None,
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
fn retains_line(entry: &Entry) -> bool {
|
|
642
|
+
match entry {
|
|
643
|
+
Entry::Other(other) => pins_arena(&other.raw),
|
|
644
|
+
_ => entry
|
|
645
|
+
.tool_results()
|
|
646
|
+
.any(|result| result.tool_use_result.as_ref().is_some_and(pins_arena)),
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
fn lowered_arenas(source: &CodexEntry, entry: &Entry) -> Vec<SourceArena> {
|
|
651
|
+
match (&source.item, entry) {
|
|
652
|
+
(CodexItem::Other(other), Entry::Other(lowered)) => pins_arena(&lowered.raw)
|
|
653
|
+
.then(|| SourceArena {
|
|
654
|
+
root: lowered.raw.clone(),
|
|
655
|
+
source_len: other.raw.len(),
|
|
656
|
+
})
|
|
657
|
+
.into_iter()
|
|
658
|
+
.collect(),
|
|
659
|
+
_ => source
|
|
660
|
+
.source
|
|
661
|
+
.iter()
|
|
662
|
+
.filter(|_| retains_line(entry))
|
|
663
|
+
.cloned()
|
|
664
|
+
.collect(),
|
|
612
665
|
}
|
|
613
666
|
}
|
|
614
667
|
|
|
668
|
+
pub(crate) fn session_arenas(
|
|
669
|
+
session: &CodexSession,
|
|
670
|
+
entries: &[Entry],
|
|
671
|
+
) -> Vec<(usize, SourceArena)> {
|
|
672
|
+
assert_eq!(session.entries.len(), entries.len());
|
|
673
|
+
session
|
|
674
|
+
.entries
|
|
675
|
+
.iter()
|
|
676
|
+
.zip(entries)
|
|
677
|
+
.enumerate()
|
|
678
|
+
.flat_map(|(index, (source, entry))| {
|
|
679
|
+
lowered_arenas(source, entry)
|
|
680
|
+
.into_iter()
|
|
681
|
+
.map(move |arena| (index, arena))
|
|
682
|
+
})
|
|
683
|
+
.collect()
|
|
684
|
+
}
|
|
685
|
+
|
|
615
686
|
#[cfg(test)]
|
|
616
687
|
mod tests {
|
|
617
688
|
use std::collections::HashSet;
|
|
@@ -1339,4 +1410,44 @@ mod tests {
|
|
|
1339
1410
|
"050b lifted turns must expose the interrupted user entry"
|
|
1340
1411
|
);
|
|
1341
1412
|
}
|
|
1413
|
+
|
|
1414
|
+
#[test]
|
|
1415
|
+
fn lowered_entries_record_the_arenas_they_keep() {
|
|
1416
|
+
let lines = [
|
|
1417
|
+
r#"{"timestamp":"2026-07-19T00:00:00Z","type":"response_item","payload":{"type":"function_call_output","call_id":"c","output":{"stdout":"x"}}}"#,
|
|
1418
|
+
r#"{"timestamp":"2026-07-19T00:00:01Z","type":"response_item","payload":{"type":"function_call","call_id":"c","name":"exec","arguments":"{}"}}"#,
|
|
1419
|
+
r#"{"timestamp":"2026-07-19T00:00:02Z","type":"event_msg","payload":{"type":"task_started","turn_id":"t"}}"#,
|
|
1420
|
+
r#"{"timestamp":"2026-07-19T00:00:03Z","type":"turn_context","payload":{"cwd":"/w","model":"m"}}"#,
|
|
1421
|
+
r#"{"timestamp":"2026-07-19T00:00:04Z","type":"mystery","payload":{"k":1}}"#,
|
|
1422
|
+
r#"{"timestamp":"2026-07-19T00:00:05Z","type":"response_item","payload":{"type":"function_call_output","call_id":"d","output":"plain"}}"#,
|
|
1423
|
+
];
|
|
1424
|
+
let session = parse_codex_bytes(lines.join("\n").as_bytes());
|
|
1425
|
+
let entries = lower(&session).entries;
|
|
1426
|
+
assert_eq!(
|
|
1427
|
+
session
|
|
1428
|
+
.entries
|
|
1429
|
+
.iter()
|
|
1430
|
+
.map(|entry| entry.source.as_ref().map(|source| source.source_len))
|
|
1431
|
+
.collect::<Vec<_>>(),
|
|
1432
|
+
[
|
|
1433
|
+
Some(lines[0].len()),
|
|
1434
|
+
None,
|
|
1435
|
+
None,
|
|
1436
|
+
Some(lines[3].len()),
|
|
1437
|
+
None,
|
|
1438
|
+
Some(lines[5].len())
|
|
1439
|
+
]
|
|
1440
|
+
);
|
|
1441
|
+
assert_eq!(
|
|
1442
|
+
session_arenas(&session, &entries)
|
|
1443
|
+
.iter()
|
|
1444
|
+
.map(|(entry, arena)| (*entry, arena.source_len))
|
|
1445
|
+
.collect::<Vec<_>>(),
|
|
1446
|
+
[
|
|
1447
|
+
(0, lines[0].len()),
|
|
1448
|
+
(3, lines[3].len()),
|
|
1449
|
+
(4, lines[4].len())
|
|
1450
|
+
]
|
|
1451
|
+
);
|
|
1452
|
+
}
|
|
1342
1453
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
use memchr::memchr_iter;
|
|
2
2
|
use sonic_rs::{JsonContainerTrait, JsonValueTrait, Value};
|
|
3
3
|
|
|
4
|
+
use crate::codex::lower::line_dom;
|
|
4
5
|
use crate::codex::types::{
|
|
5
6
|
CodexEntry, CodexItem, CodexOther, CodexSession, Compacted, EventMsg, ResponseItem,
|
|
6
7
|
ResponseItemPayload, SessionMeta, TokenUsage, TokenUsageInfo, WorldState,
|
|
7
8
|
};
|
|
8
9
|
use crate::parse::parse_timestamp;
|
|
9
|
-
use crate::
|
|
10
|
+
use crate::snapshot_memory::{pins_arena, SourceArena};
|
|
11
|
+
use crate::value::{deduplicated, field, field_str};
|
|
10
12
|
|
|
11
13
|
const AVG_CODEX_LINE_BYTES: usize = 700;
|
|
12
14
|
|
|
@@ -65,14 +67,21 @@ fn parse_codex_line(line: &[u8], line_index: usize, entries: &mut Vec<CodexEntry
|
|
|
65
67
|
return;
|
|
66
68
|
}
|
|
67
69
|
match sonic_rs::from_slice::<Value>(line) {
|
|
68
|
-
Ok(
|
|
69
|
-
|
|
70
|
+
Ok(parsed) => {
|
|
71
|
+
let (value, source_len) = deduplicated(&parsed).unwrap_or_else(|| (parsed, line.len()));
|
|
70
72
|
let timestamp = field_str(&value, "timestamp").and_then(|s| parse_timestamp(s).ok());
|
|
71
73
|
let item = parse_codex_item(&value, line);
|
|
74
|
+
let source = line_dom(&item)
|
|
75
|
+
.is_some_and(pins_arena)
|
|
76
|
+
.then(|| SourceArena {
|
|
77
|
+
root: value,
|
|
78
|
+
source_len,
|
|
79
|
+
});
|
|
72
80
|
entries.push(CodexEntry {
|
|
73
81
|
line_index,
|
|
74
82
|
timestamp,
|
|
75
83
|
item,
|
|
84
|
+
source,
|
|
76
85
|
});
|
|
77
86
|
}
|
|
78
87
|
Err(_) => entries.push(CodexEntry {
|
|
@@ -82,6 +91,7 @@ fn parse_codex_line(line: &[u8], line_index: usize, entries: &mut Vec<CodexEntry
|
|
|
82
91
|
ty: None,
|
|
83
92
|
raw: String::from_utf8_lossy(line).into_owned(),
|
|
84
93
|
}),
|
|
94
|
+
source: None,
|
|
85
95
|
}),
|
|
86
96
|
}
|
|
87
97
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
use chrono::{DateTime, FixedOffset};
|
|
2
2
|
use sonic_rs::Value;
|
|
3
3
|
|
|
4
|
+
use crate::snapshot_memory::SourceArena;
|
|
5
|
+
|
|
4
6
|
#[derive(Debug)]
|
|
5
7
|
pub struct CodexEntry {
|
|
6
8
|
pub line_index: usize,
|
|
7
9
|
pub timestamp: Option<DateTime<FixedOffset>>,
|
|
8
10
|
pub item: CodexItem,
|
|
11
|
+
pub source: Option<SourceArena>,
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
#[derive(Debug)]
|