cc-transcript 10.5.0__tar.gz → 10.6.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-10.5.0 → cc_transcript-10.6.0}/PKG-INFO +1 -1
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/filterspec.py +7 -4
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/pyproject.toml +1 -1
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/protocol.rs +15 -7
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/Cargo.lock +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/Cargo.toml +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/LICENSE +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/README.md +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/__init__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/__main__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/_parser_rs.pyi +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/activity.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/backend.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/builders.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/cli.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/command.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/context.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/corrections.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/corrections_cli.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/cost.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/decisions.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/discovery.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/evidence.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/facts.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/ids.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/filterspec.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/models.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/notifications.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/parser.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/py.typed +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/query.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/render.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/rust.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/store.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/cc_transcript/tools.py +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/Cargo.toml +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/build.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/data/afinn-en-165.tsv +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/data/domain_overrides.tsv +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/activity.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/command.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/event.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/filter.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/lexicon.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/lib.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/mining.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/model.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/parse.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/python.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/score.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/types.rs +0 -0
- {cc_transcript-10.5.0 → cc_transcript-10.6.0}/rust/src/value.rs +0 -0
|
@@ -59,11 +59,14 @@ STRUCTURAL_GROUPS: tuple[tuple[str, str], ...] = (
|
|
|
59
59
|
("hash_banner", r"(?:###\s+[\w][\w \-]{0,30}\s+){3,}###"),
|
|
60
60
|
)
|
|
61
61
|
|
|
62
|
-
# Agent-injected banners (teammate messages, scheduled tasks, foreign agents).
|
|
62
|
+
# Agent-injected banners (teammate messages, scheduled tasks, foreign agents). Start-anchored
|
|
63
|
+
# so a mid-text mention is not a banner; the follower class replaces \b and Reminder's "i" is
|
|
64
|
+
# ASCII-pinned via (?-i:[Ii]) so Rust regex and Python re stay in parity across combining marks
|
|
65
|
+
# and dotted/dotless-I folding. Mirror any change in rust/src/protocol.rs AGENT_INJECTION_PATTERN.
|
|
63
66
|
AGENT_INJECTION_GROUPS: tuple[tuple[str, str], ...] = (
|
|
64
|
-
("xml_tags_extra", r"
|
|
65
|
-
("augment_agent", r"
|
|
66
|
-
("role_reminder", r"
|
|
67
|
+
("xml_tags_extra", r"\A\s*<(?:teammate-message|scheduled-task)(?:[\s/>]|$)"),
|
|
68
|
+
("augment_agent", r"\A\s*# Augment Agent(?:\s|$)"),
|
|
69
|
+
("role_reminder", r"\A\s*\[Role Rem(?-i:[Ii])nder(?:[\s:\]]|$)"),
|
|
67
70
|
)
|
|
68
71
|
|
|
69
72
|
INTERRUPT_MARKER_GROUPS: tuple[tuple[str, str], ...] = (("interrupt", r"^\s*\[Request interrupted by user"),)
|
|
@@ -14,9 +14,11 @@ const INTERRUPT_MARKER_PATTERN: &str = r"^\s*\[Request interrupted by user";
|
|
|
14
14
|
|
|
15
15
|
// Agent-injected relay banners (filterspec.py AGENT_INJECTION_GROUPS): teammate-message
|
|
16
16
|
// digests, scheduled-task banners, and foreign-agent headers. The alternation mirrors
|
|
17
|
-
// compile_groups(AGENT_INJECTION_GROUPS): `(?:p1)|(?:p2)|(?:p3)`.
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
// compile_groups(AGENT_INJECTION_GROUPS): `(?:p1)|(?:p2)|(?:p3)`. Each alternative is
|
|
18
|
+
// start-anchored (\A\s*), the trailing \b is an explicit follower class agreeing with
|
|
19
|
+
// Python re across combining marks, and Reminder's "i" is ASCII-pinned via (?-i:[Ii]) so
|
|
20
|
+
// dotted/dotless-I case folding stays in parity.
|
|
21
|
+
const AGENT_INJECTION_PATTERN: &str = r"(?:\A\s*<(?:teammate-message|scheduled-task)(?:[\s/>]|$))|(?:\A\s*# Augment Agent(?:\s|$))|(?:\A\s*\[Role Rem(?-i:[Ii])nder(?:[\s:\]]|$))";
|
|
20
22
|
|
|
21
23
|
/// The one interrupt-marker regex (filterspec.py INTERRUPT_MARKER_RE): the pattern
|
|
22
24
|
/// compiled case-insensitively, anchored at the start of the haystack with leading
|
|
@@ -117,15 +119,21 @@ mod tests {
|
|
|
117
119
|
assert!(is_agent_injection("<scheduled-task id='7'>run the suite</scheduled-task>"));
|
|
118
120
|
assert!(is_agent_injection("[Role Reminder: You are a Coordinator."));
|
|
119
121
|
assert!(is_agent_injection("# Augment Agent\nyou have these tools"));
|
|
120
|
-
//
|
|
121
|
-
assert!(is_agent_injection("
|
|
122
|
+
// Leading whitespace before the marker is tolerated.
|
|
123
|
+
assert!(is_agent_injection(" <teammate-message from='mate'>ping</teammate-message>"));
|
|
122
124
|
}
|
|
123
125
|
|
|
124
126
|
#[test]
|
|
125
|
-
fn
|
|
127
|
+
fn agent_injection_rejects_prose_and_mid_text_mentions() {
|
|
126
128
|
assert!(!is_agent_injection("remind me what the teammate coordinator does"));
|
|
127
|
-
//
|
|
129
|
+
// Start-anchored: a relay tag mentioned mid-text is authored, not injected.
|
|
130
|
+
assert!(!is_agent_injection("as noted in the <teammate-message> above"));
|
|
131
|
+
assert!(!is_agent_injection("Why did the transcript contain <teammate-message from=a>?"));
|
|
128
132
|
assert!(!is_agent_injection("we discussed the [Role Reminder] banner mid-sentence"));
|
|
133
|
+
// A combining mark (U+0301) after the tag name is not a portable word boundary; and
|
|
134
|
+
// dotless-I must not fold to ASCII "i" — Python re once matched both, Rust never did.
|
|
135
|
+
assert!(!is_agent_injection("<teammate-message\u{0301}>"));
|
|
136
|
+
assert!(!is_agent_injection("[Role Rem\u{0131}nder: dotless"));
|
|
129
137
|
assert!(!is_agent_injection(""));
|
|
130
138
|
}
|
|
131
139
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|