(self, chunk: str)
| 1021 | return self.state == "NORMAL" or (self.state == "IN_BLOCK" and self.current_role != "tool") |
| 1022 | |
| 1023 | def process(self, chunk: str) -> str: |
| 1024 | self.buffer += chunk |
| 1025 | output = [] |
| 1026 | |
| 1027 | while self.buffer: |
| 1028 | if self.state == "IN_TAG_HEADER": |
| 1029 | nl_idx = self.buffer.find("\n") |
| 1030 | if nl_idx != -1: |
| 1031 | self.current_role = self.buffer[:nl_idx].strip().lower() |
| 1032 | self.buffer = self.buffer[nl_idx + 1 :] |
| 1033 | self.stack[-1] = "IN_BLOCK" |
| 1034 | continue |
| 1035 | else: |
| 1036 | break |
| 1037 | |
| 1038 | match = STREAM_MASTER_RE.search(self.buffer) |
| 1039 | if not match: |
| 1040 | tail_match = STREAM_TAIL_RE.search(self.buffer) |
| 1041 | keep_len = len(tail_match.group(0)) if tail_match else 0 |
| 1042 | yield_len = len(self.buffer) - keep_len |
| 1043 | if yield_len > 0: |
| 1044 | if self._is_outputting(): |
| 1045 | output.append(self.buffer[:yield_len]) |
| 1046 | self.buffer = self.buffer[yield_len:] |
| 1047 | break |
| 1048 | |
| 1049 | start, end = match.span() |
| 1050 | matched_group = match.lastgroup |
| 1051 | pre_text = self.buffer[:start] |
| 1052 | |
| 1053 | if self._is_outputting(): |
| 1054 | output.append(pre_text) |
| 1055 | |
| 1056 | if matched_group.endswith("_START"): |
| 1057 | m_type = matched_group.split("_")[0] |
| 1058 | if m_type == "TAG": |
| 1059 | self.stack.append("IN_TAG_HEADER") |
| 1060 | else: |
| 1061 | self.stack.append(f"IN_{m_type}") |
| 1062 | elif matched_group in ("PROTOCOL_EXIT", "TAG_EXIT", "HINT_EXIT"): |
| 1063 | if len(self.stack) > 1: |
| 1064 | self.stack.pop() |
| 1065 | else: |
| 1066 | self.stack = ["NORMAL"] |
| 1067 | |
| 1068 | if self.state == "NORMAL": |
| 1069 | self.current_role = "" |
| 1070 | |
| 1071 | self.buffer = self.buffer[end:] |
| 1072 | |
| 1073 | return "".join(output) |
| 1074 | |
| 1075 | def flush(self) -> str: |
| 1076 | """Release remaining buffer content and perform final cleanup at stream end.""" |
no test coverage detected