Warp to 半成品(Opus 4.1)

Warp每次调用一次工具都算是一个次数,实测下来效果真的不太好。不太想继续写了。但是模型比较保真



这个Cookie也比较离谱很快会过期一次

也可以在客户端抓这个包自动刷新Cookie


欢迎各位佬参观我的石山

import struct
import httpx
import asyncio
import sys
import time
import subprocess
import base64
import re
import json


# ============================================================
# Protobuf 构建器
# ============================================================

class PreciseProtobufBuilder:
    """精确的 Protobuf 消息构建器"""
    
    def __init__(self):
        self.buffer = bytearray()
    
    def encode_varint(self, value: int) -> bytes:
        """编码变长整数"""
        result = bytearray()
        while value >= 0x80:
            result.append((value & 0x7F) | 0x80)
            value >>= 7
        result.append(value & 0x7F)
        return bytes(result)
    
    def encode_tag(self, field_number: int, wire_type: int) -> bytes:
        """编码 protobuf 标签"""
        tag = (field_number << 3) | wire_type
        return self.encode_varint(tag)
    
    def add_length_delimited(self, field_number: int, data: bytes):
        """添加长度限定字段"""
        self.buffer.extend(self.encode_tag(field_number, 2))
        self.buffer.extend(self.encode_varint(len(data)))
        self.buffer.extend(data)
    
    def add_string(self, field_number: int, value: str):
        """添加字符串字段"""
        data = value.encode('utf-8')
        self.add_length_delimited(field_number, data)
    
    def add_varint(self, field_number: int, value: int):
        """添加变长整数字段"""
        self.buffer.extend(self.encode_tag(field_number, 0))
        self.buffer.extend(self.encode_varint(value))
    
    def add_raw_bytes(self, data: bytes):
        """直接添加原始字节"""
        self.buffer.extend(data)
    
    def get_bytes(self) -> bytes:
        """获取构建的字节数据"""
        return bytes(self.buffer)


# ============================================================
# Protobuf 解析工具
# ============================================================

def decode_varint(data, offset=0):
    """解码变长整数"""
    result = 0
    shift = 0
    while offset < len(data):
        if shift >= 64:  # 防止无限循环
            break
        byte = data[offset]
        offset += 1
        result |= (byte & 0x7f) << shift
        if (byte & 0x80) == 0:
            break
        shift += 7
    return result, offset


def extract_field(buffer, target_field_number):
    """提取指定字段号的字段"""
    offset = 0
    
    while offset < len(buffer):
        try:
            if offset >= len(buffer):
                break
                
            tag_result, new_offset = decode_varint(buffer, offset)
            tag = tag_result
            wire_type = tag & 0x7
            field_number = tag >> 3
            offset = new_offset
            
            if field_number == target_field_number:
                if wire_type == 2:  # LENGTH_DELIMITED
                    length_result, new_offset = decode_varint(buffer, offset)
                    length = length_result
                    offset = new_offset
                    
                    if offset + length <= len(buffer):
                        value = buffer[offset:offset + length]
                        return {'wireType': wire_type, 'value': value, 'size': new_offset - offset + length}
                elif wire_type == 0:  # VARINT
                    value_result, new_offset = decode_varint(buffer, offset)
                    return {'wireType': wire_type, 'value': value_result, 'size': new_offset - offset}
                elif wire_type == 1:  # FIXED64
                    if offset + 8 <= len(buffer):
                        value = buffer[offset:offset + 8]
                        return {'wireType': wire_type, 'value': value, 'size': 8}
                elif wire_type == 5:  # FIXED32
                    if offset + 4 <= len(buffer):
                        value = buffer[offset:offset + 4]
                        return {'wireType': wire_type, 'value': value, 'size': 4}
            
            # 跳过这个字段
            if wire_type == 0:  # VARINT
                _, offset = decode_varint(buffer, offset)
            elif wire_type == 1:  # FIXED64
                offset += 8
            elif wire_type == 2:  # LENGTH_DELIMITED
                length_result, new_offset = decode_varint(buffer, offset)
                length = length_result
                offset = new_offset + length
            elif wire_type == 5:  # FIXED32
                offset += 4
            else:
                break
                
        except Exception:
            break
    
    return None


def extract_field_by_path(buffer, field_path):
    """按路径提取字段"""
    current_buffer = buffer
    
    for field_number in field_path:
        field = extract_field(current_buffer, field_number)
        if not field or field.get('wireType') != 2:
            return None
        current_buffer = field['value']
    
    return current_buffer


# ============================================================
# 数据解析工具
# ============================================================

def parse_input(input_str):
    """解析输入 - 支持hex和base64"""
    clean = re.sub(r'\s', '', input_str)
    
    if re.match(r'^[0-9a-fA-F]+$', clean):
        return bytes.fromhex(clean)
    
    # 处理base64 padding
    missing = len(clean) % 4
    if missing:
        clean += '=' * (4 - missing)
    
    try:
        return base64.b64decode(clean)
    except:
        return None


def _urlsafe_b64decode_padded(s: str) -> bytes:
    """URL安全的base64解码,自动补齐填充"""
    clean = re.sub(r'\s', '', s)
    missing = len(clean) % 4
    if missing:
        clean += '=' * (4 - missing)
    return base64.urlsafe_b64decode(clean)


# ============================================================
# AI 文本提取与验证
# ============================================================

def extract_ai_text_from_message(buffer):
    """从单个消息提取AI文本"""
    # 主要路径:初始消息和流式更新
    primary_paths = [
        [2, 1, 3, 2, 3, 1],  # initial message
        [2, 1, 5, 1, 3, 1]   # stream update
    ]
    
    for path in primary_paths:
        try:
            text_buffer = extract_field_by_path(buffer, path)
            if text_buffer:
                try:
                    text = text_buffer.decode('utf-8')
                    if is_valid_ai_text(text):
                        return clean_ai_text(text)
                except:
                    continue
        except:
            continue
    
    return None


def is_valid_ai_text(text):
    """验证是否为有效AI文本"""
    if not text or len(text.strip()) == 0:
        return False
    
    # 过滤系统字符串
    system_strings = ['agent_output.text', 'server_message_data', 'USER_INITIATED']
    if text.strip() in system_strings:
        return False
    
    # 过滤纯UUID
    if re.match(r'^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$', text.strip(), re.I):
        return False
    
    # 过滤纯base64/hex
    if re.match(r'^[A-Za-z0-9+/=]{10,}$', text.strip()):
        return False
    
    # 检查是否包含有意义的字符
    if re.search(r"[\u4e00-\u9fff\w,。!?、;:()《》【】#\s-]", text):
        return True
    
    return False


def clean_ai_text(text):
    """清理AI文本"""
    # 移除控制字符但保留换行
    text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]', ' ', text)
    # 移除UUID噪声
    text = re.sub(r'\$[a-f0-9-]+Z\$[a-f0-9-]+', '', text, flags=re.I)
    text = re.sub(r'[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}', '', text, flags=re.I)
    # 规范化空格
    text = re.sub(r'[ \t]+', ' ', text)
    return text.strip()


# ============================================================
# Python 代码提取(从文件)
# ============================================================

def _try_extract_python_segment(text: str):
    """尝试从文本中提取Python代码段"""
    start_markers = [
        '#!/usr/bin/env python3',
        '#!/usr/bin/env python',
    ]
    
    start = -1
    for marker in start_markers:
        pos = text.find(marker)
        if pos != -1:
            start = pos
            break
    
    if start == -1:
        triple = text.find('"""')
        imp = text.find('import ')
        if triple != -1 and (imp == -1 or triple < imp):
            start = triple
        else:
            for keyword in ('class ', 'def ', 'import ', 'from '):
                pos = text.find(keyword)
                if pos != -1:
                    start = pos
                    break
    
    if start == -1:
        return None

    end_markers = [
        'tool_call.apply_file_diffs',
        '\n"tool_call',
        '\n$tool_call',
    ]
    
    end = len(text)
    for marker in end_markers:
        pos = text.find(marker, start)
        if pos != -1:
            end = min(end, pos)
            break

    segment = text[start:end]
    # 清理末尾异常字符
    segment = re.sub(r'[\x00-\x1F\x7F-\x9F]+$', '', segment).rstrip()
    return segment if segment.strip() else None


def extract_python_code_from_file(path: str = '1.txt'):
    """从文件中提取Python代码"""
    candidates = []
    
    try:
        with open(path, 'r', encoding='utf-8') as f:
            for line in f:
                if not line.startswith('data:'):
                    continue
                
                payload = line[5:].strip()
                if not payload or payload == '[DONE]':
                    continue
                
                raw = None
                try:
                    raw = _urlsafe_b64decode_padded(payload)
                except Exception:
                    try:
                        clean = re.sub(r'\s', '', payload)
                        pad = '=' * ((4 - len(clean) % 4) % 4)
                        raw = base64.b64decode(clean + pad)
                    except Exception:
                        continue
                
                if not raw:
                    continue
                
                text = raw.decode('utf-8', errors='ignore')
                code = _try_extract_python_segment(text)
                
                if code:
                    score = 0
                    if '#!/usr/bin' in code:
                        score += 10
                    if 'TaskManager' in code:
                        score += 5
                    if 'class ' in code:
                        score += 3
                    if 'def ' in code:
                        score += 2
                    if ('import ' in code) or ('from ' in code):
                        score += 2
                    score += code.count('\n')
                    candidates.append((score, code))
                    
    except Exception:
        return None

    if not candidates:
        return None
    
    candidates.sort(key=lambda x: x[0], reverse=True)
    return candidates[0][1]


# ============================================================
# 输入格式解析
# ============================================================

def parse_openai_format(content):
    """解析OpenAI兼容格式的输入"""
    try:
        # 尝试解析JSON格式
        data = json.loads(content)
        
        # 支持OpenAI API格式
        if 'messages' in data:
            messages = data['messages']
            query_parts = []
            
            for msg in messages:
                role = msg.get('role', 'user')
                text = msg.get('content', '')
                
                if role == 'system':
                    query_parts.append(f"[系统指令] {text}")
                elif role == 'user':
                    query_parts.append(text)
                elif role == 'assistant':
                    query_parts.append(f"[助手回复] {text}")
            
            return '\n'.join(query_parts)
        
        # 支持简单的prompt格式
        elif 'prompt' in data:
            return data['prompt']
        
        # 如果有model字段,忽略它(因为我们总是使用Warp AI)
        elif 'model' in data and 'content' in data:
            return data['content']
            
    except json.JSONDecodeError:
        # 不是JSON格式,返回原文
        return content
    
    return content


# ============================================================
# Protobuf 请求构建
# ============================================================

def build_protobuf_request(query: str = "你好"):
    """基于标准模板构建protobuf请求"""
    
    try:
        # 读取标准模板
        with open('standard_template.hex', 'r') as f:
            template_hex = ''.join(f.read().split())
        
        # 如果查询是"燃尽了",直接返回模板
        if query == "燃尽了":
            return bytes.fromhex(template_hex)
        
        # 动态替换查询
        
        # 分析模板结构
        original_query_field = "320F0A0D0A0B0A09E78783E5B0BDE4BA86"
        query_pos = template_hex.find(original_query_field)
        
        if query_pos == -1:
            raise ValueError("无法在模板中找到查询字段")
        
        # 构建新的查询字段
        query_bytes = query.encode('utf-8')
        query_length = len(query_bytes)
        
        if query_length > 4000:
            raise ValueError("查询文本过长,请控制在4000字节以内")
        
        # 编码函数
        def encode_varint_for_length(value):
            if value < 128:
                return f"{value:02X}"
            else:
                result = ""
                while value >= 128:
                    result += f"{(value & 0x7f) | 0x80:02X}"
                    value >>= 7
                result += f"{value:02X}"
                return result
        
        def get_varint_byte_count(value):
            if value < 128:
                return 1
            count = 1
            while value >= 128:
                count += 1
                value >>= 7
            return count
        
        # 计算嵌套长度
        text_length = query_length
        text_length_varint_bytes = get_varint_byte_count(text_length)
        level3_total = 1 + text_length_varint_bytes + text_length
        
        level3_length_varint_bytes = get_varint_byte_count(level3_total)
        level2_total = 1 + level3_length_varint_bytes + level3_total
        
        level2_length_varint_bytes = get_varint_byte_count(level2_total)
        level1_total = 1 + level2_length_varint_bytes + level2_total
        
        new_query_field = (
            f"32{encode_varint_for_length(level1_total)}" +
            f"0A{encode_varint_for_length(level2_total)}" +
            f"0A{encode_varint_for_length(level3_total)}" +
            f"0A{encode_varint_for_length(text_length)}" +
            query_bytes.hex().upper()
        )
        
        # 计算长度差异并更新系统字段
        original_query_len = len(original_query_field) // 2
        new_query_len = len(new_query_field) // 2
        length_diff = new_query_len - original_query_len
        
        original_system_length = 0x60
        new_system_length = original_system_length + length_diff
        
        # 替换查询字段
        modified_hex = template_hex.replace(original_query_field, new_query_field)
        
        # 更新系统字段长度
        def encode_varint(value):
            if value < 128:
                return f"{value:02X}"
            else:
                result = ""
                while value >= 128:
                    result += f"{(value & 0x7f) | 0x80:02X}"
                    value >>= 7
                result += f"{value:02X}"
                return result
        
        old_system_header = "1260"
        new_system_varint = encode_varint(new_system_length)
        new_system_header = f"12{new_system_varint}"
        
        modified_hex = modified_hex.replace(old_system_header, new_system_header)
        
        # 生成完成
        
        return bytes.fromhex(modified_hex)
        
    except FileNotFoundError:
        raise ValueError("未找到模板文件")


# ============================================================
# 输出工具
# ============================================================

def print_char_by_char(text, delay=0.01):
    """逐字打印文本"""
    for char in text:
        print(char, end='', flush=True)
        time.sleep(delay)


def show_result(content):
    """显示结果,使用统一格式"""
    print("Get:")
    print("=" * 60)
    print(content)
    print("=" * 60)


# ============================================================
# 主要功能
# ============================================================

async def send_warp_request(query: str):
    """发送请求到Warp AI并返回结果"""
    
    # JWT token
    auth_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiN2JhZmIyZjEwY2FlMmIxZjA3ZjM4MTZjNTQyMmJlY2NhNWMyMjMiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoi5a2Z5a2ZIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0luSHkybFJoM0ZtaE1lTkd1VWt1a0dHckRiOTVQLU5FcFRhaFV6Mk1MeGhkUU10dz1zOTYtYyIsImlzcyI6Imh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS9hc3RyYWwtZmllbGQtMjk0NjIxIiwiYXVkIjoiYXN0cmFsLWZpZWxkLTI5NDYyMSIsImF1dGhfdGltZSI6MTc1NTExODk5NywidXNlcl9pZCI6IjJhNUNROWNMTUhPMGJ3V2ZOdGh2MG1jaEp0czEiLCJzdWIiOiIyYTVDUTljTE1ITzBid1dmTnRodjBtY2hKdHMxIiwiaWF0IjoxNzU1MTI0Mzc2LCJleHAiOjE3NTUxMjc5NzYsImVtYWlsIjoic3Vuc3VuYWFiYmNjMUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJnb29nbGUuY29tIjpbIjExNzQ1ODIzNzU2NTI1ODkwMTc1NyJdLCJlbWFpbCI6WyJzdW5zdW5hYWJiY2MxQGdtYWlsLmNvbSJdfSwic2lnbl9pbl9wcm92aWRlciI6Imdvb2dsZS5jb20ifX0.aM5ZjgINCyeUY0DNklDcwZ_0Yf5BNaPxtNWHL1J8Z5C2HSf4dM9a-KiZ5qOeeBBR8CEAEBOQkYAzht51wP0JXTjxIofRREklxZcmBiaptOfgQM2mO8kXr7FblZlQqPPR3xEnPUjsRc4dFEJJryqt5IyvTegwcMDNf6pBATM54kUHZegNRPJaLrxrKzaUwiq2gvhC-W5TQt6cLJNrih5Uf8hYqI3SJAzptQKTpGtPC4-H_1b7pAWdvap5ru_nJ4T_FWMTkBnQYJ_nBGiCvbLf2FYkfTrAfysCaKiNP19AywKvPEspVJ_dKclPma6uvFCYXzIkEGeLtxYf031HaJkVLw"
    
    # 构建protobuf请求
    try:
        protobuf_data = build_protobuf_request(query)
    except Exception as e:
        show_result(f"构建请求失败: {str(e)}")
        return
    
    # 构建请求头
    headers = {
        'Accept': 'text/event-stream',
        'Accept-Encoding': 'gzip, br',
        'Content-Type': 'application/octet-stream',
        'x-warp-client-version': 'v0.2025.08.06.08.12.stable_02',
        'x-warp-os-category': 'Windows',
        'x-warp-os-name': 'Windows',
        'x-warp-os-version': '11 (26100)',
        'content-type': 'application/x-protobuf',
        'authorization': f'Bearer {auth_token}',
        'Content-Length': str(len(protobuf_data))
    }
    
    # 发送请求并将结果写入1.txt
    with open('1.txt', 'w', encoding='utf-8') as output_file:
        async with httpx.AsyncClient(
            verify=False,
            timeout=httpx.Timeout(600.0),
            follow_redirects=True,
            http2=True
        ) as client:
            try:
                async with client.stream(
                    'POST',
                    'https://app.warp.dev/ai/multi-agent',
                    headers=headers,
                    content=protobuf_data
                ) as response:
                    
                    if response.status_code != 200:
                        error_content = await response.aread()
                        show_result(f"请求失败: {response.status_code}")
                        return
                    
                    data_count = 0
                    
                    # 静默接收数据
                    async for line in response.aiter_lines():
                        if line.strip():
                            # 保存原始数据到文件
                            output_file.write(line + '\n')
                            output_file.flush()
                            
                            # 计数数据块
                            if line.startswith('data:') and not line.startswith('event:'):
                                data_content = line[5:].strip()
                                if data_content and data_content != '[DONE]':
                                    data_count += 1
                        
                        if line.startswith('data: ') and line[6:] == '[DONE]':
                            break
                    
                    # 静默处理
                    
                    # 使用JavaScript解析器获取完整准确的回复
                    try:
                        result = subprocess.run(['node', 'precise_ai_text_extractor.js'], 
                                              capture_output=True, text=True, encoding='utf-8', cwd='.')
                        if result.returncode == 0:
                            # 从输出中提取完整AI回复
                            output_lines = result.stdout.split('\n')
                            in_ai_reply = False
                            ai_reply_lines = []
                            
                            for line in output_lines:
                                if '🎯 完整AI回复' in line:
                                    in_ai_reply = True
                                    continue
                                elif '─' in line and in_ai_reply:
                                    if ai_reply_lines:  # 结束线
                                        break
                                    else:  # 开始线
                                        continue
                                elif in_ai_reply and line.strip():
                                    ai_reply_lines.append(line)
                            
                            if ai_reply_lines:
                                full_ai_reply = '\n'.join(ai_reply_lines)
                                show_result(full_ai_reply)
                            else:
                                show_result("无法提取完整回复")
                        else:
                            # 静默处理解析失败
                            pass
                    except Exception as e:
                        # 静默处理异常
                        pass
                            
            except httpx.ConnectError as e:
                show_result("网络连接失败")
            except httpx.TimeoutException:
                show_result("请求超时")
            except Exception as e:
                show_result("请求失败")
    
    # 静默保存文件
    
    # 自动提取并打印 Python 代码
    try:
        code = extract_python_code_from_file('1.txt')
        if code:
            print("\n" + code)
    except Exception:
        pass


async def main():
    """主函数"""
    
    # 获取查询内容
    if len(sys.argv) > 1:
        candidate = sys.argv[1]
        try:
            import os
            if os.path.exists(candidate) and os.path.isfile(candidate):
                with open(candidate, 'r', encoding='utf-8') as f:
                    raw_content = f.read().strip()
            else:
                raw_content = candidate
        except Exception:
            raw_content = candidate
        
        # 解析OpenAI兼容格式
        query = parse_openai_format(raw_content)
        
    else:
        query = input("请输入你的问题: ")
        query = parse_openai_format(query)
    
    # 发送请求并自动解析
    await send_warp_request(query)


if __name__ == "__main__":
    asyncio.run(main()) 
const fs = require('fs');
const { Buffer } = require('buffer');

function decodeVarint(buffer, offset) {
    let result = 0n;
    let shift = 0;
    let byte = 0;
    let bytesRead = 0;

    do {
        if (offset >= buffer.length) throw new RangeError("Buffer overflow");
        if (bytesRead >= 10) throw new Error("Varint too long");

        byte = buffer[offset++];
        bytesRead++;
        
        const dataBits = BigInt(byte & 0x7f);
        result = result + (dataBits << BigInt(shift));
        shift += 7;
        
    } while (byte >= 0x80);

    return { value: result, bytesConsumed: bytesRead };
}

function parseInput(input) {
    const clean = input.replace(/\s/g, "");
    if (/^[0-9a-fA-F]+$/.test(clean)) {
        return Buffer.from(clean, "hex");
    }
    const missing = clean.length % 4;
    return Buffer.from(missing ? clean + '='.repeat(4 - missing) : clean, "base64");
}

function extractField(buffer, targetFieldNumber) {
    let offset = 0;
    
    while (offset < buffer.length) {
        try {
            const tagResult = decodeVarint(buffer, offset);
            const tag = Number(tagResult.value);
            const wireType = tag & 0x7;
            const fieldNumber = tag >> 3;
            
            offset += tagResult.bytesConsumed;
            
            if (fieldNumber === targetFieldNumber) {
                let value = null;
                let valueSize = 0;
                
                switch (wireType) {
                    case 0:
                        const varintResult = decodeVarint(buffer, offset);
                        value = varintResult.value;
                        valueSize = varintResult.bytesConsumed;
                        break;
                    case 1:
                        if (offset + 8 <= buffer.length) {
                            value = buffer.readBigUInt64LE(offset);
                            valueSize = 8;
                        }
                        break;
                    case 2:
                        const lengthResult = decodeVarint(buffer, offset);
                        const length = Number(lengthResult.value);
                        const lengthSize = lengthResult.bytesConsumed;
                        
                        if (offset + lengthSize + length <= buffer.length) {
                            value = buffer.slice(offset + lengthSize, offset + lengthSize + length);
                            valueSize = lengthSize + length;
                        }
                        break;
                    case 5:
                        if (offset + 4 <= buffer.length) {
                            value = buffer.readUInt32LE(offset);
                            valueSize = 4;
                        }
                        break;
                }
                
                if (value !== null) {
                    return { wireType, value, size: valueSize };
                }
            }
            
            switch (wireType) {
                case 0:
                    const skipVarint = decodeVarint(buffer, offset);
                    offset += skipVarint.bytesConsumed;
                    break;
                case 1:
                    offset += 8;
                    break;
                case 2:
                    const skipLength = decodeVarint(buffer, offset);
                    offset += skipLength.bytesConsumed + Number(skipLength.value);
                    break;
                case 5:
                    offset += 4;
                    break;
                default:
                    return null;
            }
            
        } catch (e) {
            break;
        }
    }
    
    return null;
}

function extractFieldByPath(buffer, fieldPath) {
    let currentBuffer = buffer;
    
    for (const fieldNumber of fieldPath) {
        const field = extractField(currentBuffer, fieldNumber);
        if (!field || field.wireType !== 2) {
            return null;
        }
        currentBuffer = field.value;
    }
    
    return currentBuffer;
}

function extractAITextFromMessage(buffer) {
    const primaryPaths = [
        [2, 1, 3, 2, 3, 1],
        [2, 1, 5, 1, 3, 1]
    ];
    
    for (const path of primaryPaths) {
        try {
            const textBuffer = extractFieldByPath(buffer, path);
            
            if (textBuffer) {
                const text = textBuffer.toString('utf-8');
                
                if (isValidAIText(text)) {
                    return cleanAIText(text);
                }
            }
        } catch (e) {
            continue;
        }
    }
    
    return null;
}

function isValidAIText(text) {
    if (!text || text.length === 0) return false;
    
    const systemStrings = [
        'agent_output.text',
        'server_message_data', 
        'USER_INITIATED'
    ];
    if (systemStrings.includes(text.trim())) {
        return false;
    }
    
    if (/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(text.trim())) {
        return false;
    }
    
    if (/^[A-Za-z0-9+/=]{20,}$/.test(text.trim())) {
        return false;
    }
    
    const hasValidContent = /[\u4e00-\u9fff\w,。!?、;:""''()《》【】\-#\s]/.test(text);
    
    return hasValidContent && text.length >= 1;
}

function cleanAIText(text) {
    return text
        .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g, ' ')
        .replace(/\$[a-f0-9-]+Z\$[a-f0-9-]+/gi, '')
        .replace(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi, '')
        .replace(/[ \t]+/g, ' ')
        .replace(/[ \t]*\n[ \t]*/g, '\n')
        .replace(/\n{3,}/g, '\n\n')
        .trim();
}

function extractAllAITexts() {
    try {
        const content = fs.readFileSync('./1.txt', 'utf-8');
        const dataLines = content.split('\n')
            .filter(line => line.trim().startsWith('data:'))
            .map(line => line.trim().substring(5));
        
        const extractedTexts = [];
        const seenTexts = new Set(); // 避免重复文本
        
        for (let i = 0; i < dataLines.length; i++) {
            try {
                const buffer = parseInput(dataLines[i]);
                const aiText = extractAITextFromMessage(buffer);
                
                if (aiText && !seenTexts.has(aiText)) {
                    seenTexts.add(aiText);
                    extractedTexts.push(aiText);
                }
                
            } catch (error) {
                continue;
            }
        }
        
        if (extractedTexts.length > 0) {
            // 打印调试信息
            console.log('🔍 找到的文本片段数量:', extractedTexts.length);
            console.log('─'.repeat(60));
            
            // 打印每个片段用于调试
            extractedTexts.forEach((text, index) => {
                console.log(`片段 ${index + 1}: "${text}"`);
            });
            
            console.log('─'.repeat(60));
            console.log('🎯 完整AI回复');
            console.log('─'.repeat(60));
            
            // 直接拼接所有文本片段
            const fullReply = extractedTexts.join('');
            console.log(fullReply);
            
            console.log('─'.repeat(60));
        } else {
            console.log('未找到有效的AI文本内容');
        }
        
    } catch (error) {
        console.log('处理过程中发生错误:', error.message);
    }
}

if (require.main === module) {
    extractAllAITexts();
} 
0A 26 12 24 65 34 35 35 33 66 64 33 2D 64 32 61 31 2D 34 36 33 33 2D 61 34 33 39 2D 31 32 33 36 
38 61 39 37 65 35 31 34 12 60 0A 4D 0A 20 0A 0E 43 3A 5C 55 73 65 72 73 5C 68 75 69 79 65 12 0E 
43 3A 5C 55 73 65 72 73 5C 68 75 69 79 65 12 09 0A 07 57 69 6E 64 6F 77 73 1A 16 0A 04 70 77 73 
68 12 0E 35 2E 31 2E 32 36 31 30 30 2E 34 36 35 32 22 06 08 B5 97 F1 C4 06 32 0F 0A 0D 0A 0B 0A 
09 E7 87 83 E5 B0 BD E4 BA 86 1A 39 0A 1B 0A 0F 63 6C 61 75 64 65 2D 34 2E 31 2D 6F 70 75 73 12 
02 6F 33 1A 04 61 75 74 6F 10 01 18 01 20 01 38 01 40 01 4A 0C 04 05 06 07 0C 08 09 00 02 03 01 
0B 58 01 60 01 22 42 12 1E 0A 0A 65 6E 74 72 79 70 6F 69 6E 74 12 10 1A 0E 55 53 45 52 5F 49 4E 
49 54 49 41 54 45 44 12 20 0A 1A 69 73 5F 61 75 74 6F 64 65 74 65 63 74 65 64 5F 75 73 65 72 5F 
71 75 65 72 79 12 02 20 00

依靠字段替换和解析,菜菜佬带带0.0

30 个赞

前排,原来你说是warp啊

2 个赞

阿尼亚 加油:tieba_013: ,已经很棒了

2 个赞

谢谢佬!

2 个赞

支持佬!

阿尼亚好强

另外warp本体真的难用 :tieba_087:

真的太难用了

3 个赞

太强了!

1 个赞

现在都还没搞懂怎么用 warp,还是太多选择了,没到万不得已的时候不会去碰这个,感觉 cc 都比这个上手的快,warp 虽然有 gui,但是完全不知道怎么用 :tieba_087:

1 个赞

是真的!

1 个赞

其实送的会员那个调用次数不太够的

1 个赞

厉害了,佬,加油

之前有幸抽中有个佬友的10000次的体验,不过就用了3天,体感一般般。

主要是没找到checkpoint的,不能回撤。

而且次数消耗也很快。

pb吗?我最近就在重写cursor-api的protobuf依赖,这熟啊

感觉肉眼一眼看就是,太熟了

对的佬!!

你完全不用写protobuf的解析啊,python有官方库的,写个.proto文件作为定义就好了

可以用protoc生成文件:

protoc --python_out=. --pyi_out=. your_.proto

js的话也有第三方库,就连Rust也有(虽然我在重写就是了)

说起来我也有Opus 4.1的资源,笑

1 个赞

大佬加油,小白就坐等大佬的成品了 :tieba_025:

1 个赞

昨天刚下的warp 这么巧啊

啊 难用吗?

难用是真的,命令行版Cursor