cc-transcript 14.7.0__tar.gz → 14.9.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.7.0 → cc_transcript-14.9.0}/Cargo.lock +15 -44
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/PKG-INFO +1 -1
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/__init__.py +9 -1
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/__init__.pyi +4 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/query.py +137 -11
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/tools.py +1 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/pyproject.toml +1 -1
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/Cargo.toml +3 -5
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/command.rs +610 -507
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/toolcall.rs +16 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/Cargo.toml +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/LICENSE +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/README.md +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/command.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/context.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/models.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/render.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/main.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/lower.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/parse.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/codex/types.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/lib.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/parse.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/types.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/value.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/python.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/render.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/blocks.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/events.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/store.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/toolcall.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/toolresult.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/views/transcript.rs +0 -0
- {cc_transcript-14.7.0 → cc_transcript-14.9.0}/rust/crates/py/src/watch.rs +0 -0
|
@@ -189,13 +189,12 @@ dependencies = [
|
|
|
189
189
|
"criterion",
|
|
190
190
|
"memchr",
|
|
191
191
|
"once_cell",
|
|
192
|
+
"rable",
|
|
192
193
|
"regex",
|
|
193
194
|
"rusqlite",
|
|
194
195
|
"ryu-js",
|
|
195
196
|
"sha2",
|
|
196
197
|
"sonic-rs",
|
|
197
|
-
"tree-sitter",
|
|
198
|
-
"tree-sitter-bash",
|
|
199
198
|
]
|
|
200
199
|
|
|
201
200
|
[[package]]
|
|
@@ -490,7 +489,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
|
490
489
|
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
|
491
490
|
dependencies = [
|
|
492
491
|
"libc",
|
|
493
|
-
"windows-sys 0.
|
|
492
|
+
"windows-sys 0.61.2",
|
|
494
493
|
]
|
|
495
494
|
|
|
496
495
|
[[package]]
|
|
@@ -731,7 +730,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
|
|
|
731
730
|
dependencies = [
|
|
732
731
|
"hermit-abi",
|
|
733
732
|
"libc",
|
|
734
|
-
"windows-sys 0.
|
|
733
|
+
"windows-sys 0.61.2",
|
|
735
734
|
]
|
|
736
735
|
|
|
737
736
|
[[package]]
|
|
@@ -1240,6 +1239,15 @@ version = "5.3.0"
|
|
|
1240
1239
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1241
1240
|
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
|
1242
1241
|
|
|
1242
|
+
[[package]]
|
|
1243
|
+
name = "rable"
|
|
1244
|
+
version = "0.2.1"
|
|
1245
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1246
|
+
checksum = "3f601efcd059ce48cd6350771ca52e5a079274b88058a5fcec8c383bfaebe69c"
|
|
1247
|
+
dependencies = [
|
|
1248
|
+
"thiserror",
|
|
1249
|
+
]
|
|
1250
|
+
|
|
1243
1251
|
[[package]]
|
|
1244
1252
|
name = "rancor"
|
|
1245
1253
|
version = "0.1.1"
|
|
@@ -1439,7 +1447,7 @@ dependencies = [
|
|
|
1439
1447
|
"errno",
|
|
1440
1448
|
"libc",
|
|
1441
1449
|
"linux-raw-sys",
|
|
1442
|
-
"windows-sys 0.
|
|
1450
|
+
"windows-sys 0.61.2",
|
|
1443
1451
|
]
|
|
1444
1452
|
|
|
1445
1453
|
[[package]]
|
|
@@ -1591,7 +1599,6 @@ version = "1.0.150"
|
|
|
1591
1599
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1592
1600
|
checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
|
|
1593
1601
|
dependencies = [
|
|
1594
|
-
"indexmap",
|
|
1595
1602
|
"itoa",
|
|
1596
1603
|
"memchr",
|
|
1597
1604
|
"serde",
|
|
@@ -1700,12 +1707,6 @@ version = "1.1.0"
|
|
|
1700
1707
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1701
1708
|
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
|
|
1702
1709
|
|
|
1703
|
-
[[package]]
|
|
1704
|
-
name = "streaming-iterator"
|
|
1705
|
-
version = "0.1.9"
|
|
1706
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1707
|
-
checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520"
|
|
1708
|
-
|
|
1709
1710
|
[[package]]
|
|
1710
1711
|
name = "strsim"
|
|
1711
1712
|
version = "0.11.1"
|
|
@@ -1801,7 +1802,7 @@ dependencies = [
|
|
|
1801
1802
|
"getrandom 0.3.4",
|
|
1802
1803
|
"once_cell",
|
|
1803
1804
|
"rustix",
|
|
1804
|
-
"windows-sys 0.
|
|
1805
|
+
"windows-sys 0.61.2",
|
|
1805
1806
|
]
|
|
1806
1807
|
|
|
1807
1808
|
[[package]]
|
|
@@ -1916,36 +1917,6 @@ version = "1.1.2+spec-1.1.0"
|
|
|
1916
1917
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1917
1918
|
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
|
1918
1919
|
|
|
1919
|
-
[[package]]
|
|
1920
|
-
name = "tree-sitter"
|
|
1921
|
-
version = "0.26.10"
|
|
1922
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1923
|
-
checksum = "3c343ed63e3f5c64d1acdecb5d2c13d4e169cb5fde0052106ebaa6c6f27f9e55"
|
|
1924
|
-
dependencies = [
|
|
1925
|
-
"cc",
|
|
1926
|
-
"regex",
|
|
1927
|
-
"regex-syntax",
|
|
1928
|
-
"serde_json",
|
|
1929
|
-
"streaming-iterator",
|
|
1930
|
-
"tree-sitter-language",
|
|
1931
|
-
]
|
|
1932
|
-
|
|
1933
|
-
[[package]]
|
|
1934
|
-
name = "tree-sitter-bash"
|
|
1935
|
-
version = "0.25.1"
|
|
1936
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1937
|
-
checksum = "9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062"
|
|
1938
|
-
dependencies = [
|
|
1939
|
-
"cc",
|
|
1940
|
-
"tree-sitter-language",
|
|
1941
|
-
]
|
|
1942
|
-
|
|
1943
|
-
[[package]]
|
|
1944
|
-
name = "tree-sitter-language"
|
|
1945
|
-
version = "0.1.7"
|
|
1946
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1947
|
-
checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782"
|
|
1948
|
-
|
|
1949
1920
|
[[package]]
|
|
1950
1921
|
name = "typenum"
|
|
1951
1922
|
version = "1.20.1"
|
|
@@ -2202,7 +2173,7 @@ version = "0.1.11"
|
|
|
2202
2173
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2203
2174
|
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
|
2204
2175
|
dependencies = [
|
|
2205
|
-
"windows-sys 0.
|
|
2176
|
+
"windows-sys 0.61.2",
|
|
2206
2177
|
]
|
|
2207
2178
|
|
|
2208
2179
|
[[package]]
|
|
@@ -235,7 +235,15 @@ EXPORTS: dict[str, str] = {
|
|
|
235
235
|
),
|
|
236
236
|
"cc_transcript.render": ("Budget", "render_session", "render_tool_call", "render_turn"),
|
|
237
237
|
"cc_transcript.notifications": ("Notifications",),
|
|
238
|
-
"cc_transcript.query": (
|
|
238
|
+
"cc_transcript.query": (
|
|
239
|
+
"DeepSession",
|
|
240
|
+
"DeepView",
|
|
241
|
+
"FileRef",
|
|
242
|
+
"Session",
|
|
243
|
+
"SubagentIndex",
|
|
244
|
+
"SubagentSession",
|
|
245
|
+
"ToolCallQuery",
|
|
246
|
+
),
|
|
239
247
|
"cc_transcript.decisions": ("DECISIONS_DDL", "Action", "Decision", "DecisionLog"),
|
|
240
248
|
"cc_transcript.disktruth": (
|
|
241
249
|
"AttributionRange",
|
|
@@ -203,6 +203,8 @@ from cc_transcript.parser import (
|
|
|
203
203
|
)
|
|
204
204
|
|
|
205
205
|
from cc_transcript.query import (
|
|
206
|
+
DeepSession as DeepSession,
|
|
207
|
+
DeepView as DeepView,
|
|
206
208
|
FileRef as FileRef,
|
|
207
209
|
Session as Session,
|
|
208
210
|
SubagentIndex as SubagentIndex,
|
|
@@ -335,6 +337,8 @@ __all__ = [
|
|
|
335
337
|
"DECISIONS_DDL",
|
|
336
338
|
"Decision",
|
|
337
339
|
"DecisionLog",
|
|
340
|
+
"DeepSession",
|
|
341
|
+
"DeepView",
|
|
338
342
|
"DiskTruth",
|
|
339
343
|
"Edit",
|
|
340
344
|
"EditCall",
|
|
@@ -14,13 +14,14 @@ import re
|
|
|
14
14
|
from collections.abc import Mapping
|
|
15
15
|
from dataclasses import dataclass
|
|
16
16
|
from fnmatch import fnmatch
|
|
17
|
+
from functools import cached_property
|
|
17
18
|
from pathlib import PurePath
|
|
18
19
|
from typing import TYPE_CHECKING, ClassVar
|
|
19
20
|
|
|
20
21
|
from cc_transcript.activity import SessionActivity, Turn, event_stamps, native_user_classifier
|
|
21
22
|
from cc_transcript.discovery import TranscriptExpiredError, resolve, subagent_paths, subagent_transcripts
|
|
22
23
|
from cc_transcript.filterspec import event_meta, session_id_of
|
|
23
|
-
from cc_transcript.ids import SessionId
|
|
24
|
+
from cc_transcript.ids import SessionId, ToolUseId
|
|
24
25
|
from cc_transcript.models import AssistantEvent, SystemEvent, ToolResultBlock, UserEvent
|
|
25
26
|
from cc_transcript.notifications import Notifications
|
|
26
27
|
from cc_transcript.parser import parse
|
|
@@ -41,7 +42,7 @@ if TYPE_CHECKING:
|
|
|
41
42
|
|
|
42
43
|
from cc_transcript.activity import ToolUse, UserClassifier
|
|
43
44
|
from cc_transcript.command import CommandLine
|
|
44
|
-
from cc_transcript.ids import EventUuid
|
|
45
|
+
from cc_transcript.ids import EventUuid
|
|
45
46
|
from cc_transcript.models import TranscriptEvent
|
|
46
47
|
|
|
47
48
|
|
|
@@ -246,6 +247,9 @@ class Session:
|
|
|
246
247
|
turns: The turns in the window.
|
|
247
248
|
path: The transcript file the session was loaded from, when known —
|
|
248
249
|
required for sidechain (subagent) lookups.
|
|
250
|
+
attachments: External transcript files (e.g. codex rollouts) registered
|
|
251
|
+
with this session; :meth:`walk` and :attr:`deep` fold them in at
|
|
252
|
+
depth 1. Empty for a session loaded straight from disk.
|
|
249
253
|
|
|
250
254
|
Example:
|
|
251
255
|
>>> session.prior().after(tool="Write", file=str(fp)).has_tool("ExitPlanMode")
|
|
@@ -253,11 +257,14 @@ class Session:
|
|
|
253
257
|
|
|
254
258
|
turns: tuple[Turn, ...]
|
|
255
259
|
path: Path | None = None
|
|
260
|
+
attachments: tuple[Path, ...] = ()
|
|
256
261
|
|
|
257
262
|
@classmethod
|
|
258
|
-
def from_activity(
|
|
263
|
+
def from_activity(
|
|
264
|
+
cls, activity: SessionActivity, *, path: Path | None = None, attachments: tuple[Path, ...] = ()
|
|
265
|
+
) -> Session:
|
|
259
266
|
"""Views ``activity``'s full turn range as a session."""
|
|
260
|
-
return cls(activity.turns, path)
|
|
267
|
+
return cls(activity.turns, path, attachments)
|
|
261
268
|
|
|
262
269
|
@classmethod
|
|
263
270
|
def from_path(cls, path: Path, *, user_classifier: UserClassifier = native_user_classifier) -> Session:
|
|
@@ -326,6 +333,25 @@ class Session:
|
|
|
326
333
|
)
|
|
327
334
|
)
|
|
328
335
|
|
|
336
|
+
def walk(self) -> Iterator[DeepSession]:
|
|
337
|
+
"""Every transcript reachable from this session, lazily and depth-first.
|
|
338
|
+
|
|
339
|
+
Yields each descendant sidechain (subagent/teammate) transcript at every
|
|
340
|
+
depth in DFS path order, then each registered attachment at depth 1 —
|
|
341
|
+
never this session itself. A resolved-path seen-set (seeded with
|
|
342
|
+
:attr:`path`) dedupes: the first occurrence of a path wins, so a
|
|
343
|
+
tree-discovered sidechain outranks an equal attachment, and symlink
|
|
344
|
+
cycles terminate. An unreadable transcript is skipped but its children
|
|
345
|
+
are still walked; a structurally malformed line raises, as
|
|
346
|
+
:attr:`subagents` does.
|
|
347
|
+
"""
|
|
348
|
+
return deep_sessions(self)
|
|
349
|
+
|
|
350
|
+
@property
|
|
351
|
+
def deep(self) -> DeepView:
|
|
352
|
+
"""The recursive union view over this session and every transcript it reaches."""
|
|
353
|
+
return DeepView(self)
|
|
354
|
+
|
|
329
355
|
def after(self, *, tool: str, file: str | None = None) -> Session:
|
|
330
356
|
"""The window strictly after the last call matching ``tool``.
|
|
331
357
|
|
|
@@ -369,7 +395,7 @@ class Session:
|
|
|
369
395
|
@property
|
|
370
396
|
def current_turn(self) -> Session:
|
|
371
397
|
"""The one-turn view of the window's last turn."""
|
|
372
|
-
return Session(self.turns[-1:], self.path)
|
|
398
|
+
return Session(self.turns[-1:], self.path, self.attachments)
|
|
373
399
|
|
|
374
400
|
@property
|
|
375
401
|
def user_text(self) -> str:
|
|
@@ -394,7 +420,7 @@ class Session:
|
|
|
394
420
|
def has_tool(self, name: str, *, subagents: bool = True) -> bool:
|
|
395
421
|
"""Whether any call in the window matches the pipe spec ``name``."""
|
|
396
422
|
return self.tool_calls.named(name).any() or (
|
|
397
|
-
subagents and any(
|
|
423
|
+
subagents and any(deep.session.has_tool(name, subagents=False) for deep in self.walk())
|
|
398
424
|
)
|
|
399
425
|
|
|
400
426
|
def has_command(self, *argv: str, subagents: bool = True) -> bool:
|
|
@@ -405,19 +431,19 @@ class Session:
|
|
|
405
431
|
``sudo git push -f`` and ``cd x && git push`` but not ``echo "git push"``.
|
|
406
432
|
"""
|
|
407
433
|
return any(cmd.runs(*argv) for line in self.command_lines() for cmd in line) or (
|
|
408
|
-
subagents and any(
|
|
434
|
+
subagents and any(deep.session.has_command(*argv, subagents=False) for deep in self.walk())
|
|
409
435
|
)
|
|
410
436
|
|
|
411
437
|
def has_edit_to(self, *globs: str, subagents: bool = True) -> bool:
|
|
412
438
|
"""Whether any edit-shaped call in the window targets a file matching any glob."""
|
|
413
439
|
return any(file.matches(*globs) for file in self.edited_files) or (
|
|
414
|
-
subagents and any(
|
|
440
|
+
subagents and any(deep.session.has_edit_to(*globs, subagents=False) for deep in self.walk())
|
|
415
441
|
)
|
|
416
442
|
|
|
417
443
|
def has_read(self, pattern: str, *, subagents: bool = True) -> bool:
|
|
418
444
|
"""Whether any Read in the window targets a path containing ``pattern``."""
|
|
419
445
|
return any(pattern in str(file) for file in self.tool_calls.named("Read").files()) or (
|
|
420
|
-
subagents and any(
|
|
446
|
+
subagents and any(deep.session.has_read(pattern, subagents=False) for deep in self.walk())
|
|
421
447
|
)
|
|
422
448
|
|
|
423
449
|
def has_skill(self, *names: str, subagents: bool = True) -> bool:
|
|
@@ -425,7 +451,7 @@ class Session:
|
|
|
425
451
|
return any(
|
|
426
452
|
isinstance(call := use.call, SkillCall) and call.skill in names
|
|
427
453
|
for use in self.tool_calls.named("Skill")
|
|
428
|
-
) or (subagents and any(
|
|
454
|
+
) or (subagents and any(deep.session.has_skill(*names, subagents=False) for deep in self.walk()))
|
|
429
455
|
|
|
430
456
|
def has_override(self, token: str, *, invalidated_by: Sequence[str] = ("Edit", "Write")) -> bool:
|
|
431
457
|
"""Whether ``token`` appears in the window without a later invalidating call.
|
|
@@ -530,6 +556,69 @@ class SubagentIndex:
|
|
|
530
556
|
return bool(self.items)
|
|
531
557
|
|
|
532
558
|
|
|
559
|
+
@dataclass(frozen=True, slots=True)
|
|
560
|
+
class DeepSession:
|
|
561
|
+
"""One transcript reached by :meth:`Session.walk`.
|
|
562
|
+
|
|
563
|
+
Attributes:
|
|
564
|
+
session: The whole-session view of the reached transcript.
|
|
565
|
+
path: The transcript file it was loaded from.
|
|
566
|
+
provider: Its source provider, ``"claude"`` or ``"codex"``.
|
|
567
|
+
depth: Distance from the root; ``1`` is a direct sidechain or attachment.
|
|
568
|
+
spawned_by: The dispatching tool-use id parsed from an ``agent-<id>``
|
|
569
|
+
sidechain stem, or None for an attachment.
|
|
570
|
+
"""
|
|
571
|
+
|
|
572
|
+
session: Session
|
|
573
|
+
path: Path
|
|
574
|
+
provider: str
|
|
575
|
+
depth: int
|
|
576
|
+
spawned_by: ToolUseId | None
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
@dataclass(frozen=True) # non-slots: the cached_property below needs __dict__
|
|
580
|
+
class DeepView:
|
|
581
|
+
"""The recursive union of a session and every transcript reachable from it.
|
|
582
|
+
|
|
583
|
+
Sidechain (subagent/teammate) transcripts at every depth and registered
|
|
584
|
+
attachments contribute their tool calls and events to one window-spanning
|
|
585
|
+
view. The root axis respects the session's window; descendants and
|
|
586
|
+
attachments are window-invariant, mirroring how ``has_tool`` already scans
|
|
587
|
+
the whole sidechain tree.
|
|
588
|
+
|
|
589
|
+
Example:
|
|
590
|
+
>>> session.deep.tool_calls.named("Edit|Write").files()
|
|
591
|
+
"""
|
|
592
|
+
|
|
593
|
+
root: Session
|
|
594
|
+
|
|
595
|
+
@cached_property
|
|
596
|
+
def sessions(self) -> tuple[DeepSession, ...]:
|
|
597
|
+
"""Every reached :class:`DeepSession`, materialized once: DFS, then attachments."""
|
|
598
|
+
return tuple(self.root.walk())
|
|
599
|
+
|
|
600
|
+
@property
|
|
601
|
+
def tool_calls(self) -> ToolCallQuery:
|
|
602
|
+
"""The root window's calls, then every descendant's and attachment's calls.
|
|
603
|
+
|
|
604
|
+
Positional, not chronological: root-window order, then DFS path order,
|
|
605
|
+
then attachment registration order — so :meth:`ToolCallQuery.first` and
|
|
606
|
+
:meth:`ToolCallQuery.last` read positionally.
|
|
607
|
+
"""
|
|
608
|
+
return ToolCallQuery(
|
|
609
|
+
self.root.tool_calls.all_items
|
|
610
|
+
+ tuple(use for deep in self.sessions for use in deep.session.tool_calls.all_items)
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
@property
|
|
614
|
+
def events(self) -> tuple[TranscriptEvent, ...]:
|
|
615
|
+
"""Every event across the root window and every reached transcript, in walk order."""
|
|
616
|
+
return self.root.events + tuple(event for deep in self.sessions for event in deep.session.events)
|
|
617
|
+
|
|
618
|
+
def __iter__(self) -> Iterator[DeepSession]:
|
|
619
|
+
return iter(self.sessions)
|
|
620
|
+
|
|
621
|
+
|
|
533
622
|
def windowed(session: Session, start: int, stop: int) -> Session:
|
|
534
623
|
turns: list[Turn] = []
|
|
535
624
|
base = 0
|
|
@@ -539,10 +628,47 @@ def windowed(session: Session, start: int, stop: int) -> Session:
|
|
|
539
628
|
if lo < hi:
|
|
540
629
|
turns.append(turn if (lo, hi) == (0, size) else trim_turn(turn, lo, hi))
|
|
541
630
|
base += size
|
|
542
|
-
return Session(tuple(turns), session.path)
|
|
631
|
+
return Session(tuple(turns), session.path, session.attachments)
|
|
543
632
|
|
|
544
633
|
|
|
545
634
|
def sidechain_sessions(path: Path | None) -> tuple[Session, ...]:
|
|
546
635
|
if path is None:
|
|
547
636
|
return ()
|
|
548
637
|
return tuple(Session.from_path(entry) for entry in subagent_paths(path))
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
def deep_sessions(root: Session) -> Iterator[DeepSession]:
|
|
641
|
+
seen: set[Path] = {root.path.resolve()} if root.path is not None else set()
|
|
642
|
+
if root.path is not None:
|
|
643
|
+
yield from descend_sidechains(root.path, 1, seen)
|
|
644
|
+
for attachment in root.attachments:
|
|
645
|
+
yield from visit_transcript(attachment, 1, None, seen)
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
def descend_sidechains(parent: Path, depth: int, seen: set[Path]) -> Iterator[DeepSession]:
|
|
649
|
+
for child in subagent_paths(parent):
|
|
650
|
+
yield from visit_transcript(child, depth, ToolUseId(child.stem.removeprefix("agent-")), seen)
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
def visit_transcript(path: Path, depth: int, spawned_by: ToolUseId | None, seen: set[Path]) -> Iterator[DeepSession]:
|
|
654
|
+
if (resolved := path.resolve()) in seen:
|
|
655
|
+
return
|
|
656
|
+
seen.add(resolved)
|
|
657
|
+
if (deep := load_deep_session(path, depth, spawned_by)) is not None:
|
|
658
|
+
yield deep
|
|
659
|
+
yield from descend_sidechains(path, depth + 1, seen)
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
def load_deep_session(path: Path, depth: int, spawned_by: ToolUseId | None) -> DeepSession | None:
|
|
663
|
+
try:
|
|
664
|
+
transcript = parse(path)
|
|
665
|
+
except OSError:
|
|
666
|
+
return None
|
|
667
|
+
session_id = session_id_of(transcript.events) or SessionId(path.stem)
|
|
668
|
+
return DeepSession(
|
|
669
|
+
session=Session.from_activity(SessionActivity.from_events(session_id, transcript.events), path=path),
|
|
670
|
+
path=path,
|
|
671
|
+
provider=transcript.provider,
|
|
672
|
+
depth=depth,
|
|
673
|
+
spawned_by=spawned_by,
|
|
674
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cc-transcript"
|
|
3
|
-
version = "14.
|
|
3
|
+
version = "14.9.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"
|
|
@@ -13,11 +13,9 @@ chrono = { version = "0.4", default-features = false, features = ["std"] }
|
|
|
13
13
|
memchr = "2.7"
|
|
14
14
|
once_cell = "1"
|
|
15
15
|
regex = "1"
|
|
16
|
-
# Gated behind `command
|
|
17
|
-
# both sides, tree-sitter core 0.26 matching the wheel's 0.26.0). The Swift/CI build
|
|
16
|
+
# Gated behind `command`: a real bash AST (rable) backs the command parser. The Swift/CI build
|
|
18
17
|
# takes core with default-features off, so this stays out of the python-free path.
|
|
19
|
-
|
|
20
|
-
tree-sitter-bash = { version = "0.25", optional = true }
|
|
18
|
+
rable = { version = "0.2.1", optional = true }
|
|
21
19
|
# ids.rs computes the cross-language tool-content digest; default features only
|
|
22
20
|
# (no `asm`), so the python-free core stays pure-Rust for the Swift consumer.
|
|
23
21
|
sha2 = "0.10"
|
|
@@ -32,7 +30,7 @@ rusqlite = { version = "0.32", features = ["bundled", "load_extension"], optiona
|
|
|
32
30
|
|
|
33
31
|
[features]
|
|
34
32
|
default = ["command", "sqlite"]
|
|
35
|
-
command = ["dep:
|
|
33
|
+
command = ["dep:rable"]
|
|
36
34
|
sqlite = ["dep:rusqlite"]
|
|
37
35
|
|
|
38
36
|
[dev-dependencies]
|