cueward-adapter-macos 0.1.0

macOS adapter for Cueward with Safari, Notes, Messages, Reminders, and OCR integrations.
Documentation
const { chromium } = require('playwright');
const fs = require('fs');
const path = require('path');
const os = require('os');
const { execSync } = require('child_process');

async function extractContent() {
  const originalUserDataDir = '/Users/cyh/Library/Application Support/Google/Chrome';
  const tempUserDataDir = path.join(os.homedir(), '.cueward', 'playwright_profile');
  
  try {
    console.log("Preparing isolated Chrome profile for Playwright...");
    // 建立暫存目錄,避免鎖定原本的 Chrome
    execSync(`mkdir -p "${tempUserDataDir}/Default"`);
    // 只複製最核心的狀態檔案,包含解密 Cookie 需要的檔案 (Local State 是關鍵)
    execSync(`cp "${originalUserDataDir}/Local State" "${tempUserDataDir}/" 2>/dev/null || true`);
    // 同步 Default 目錄下最重要的檔案 (Network, Cookies, Preferences)
    execSync(`rsync -a --include='Cookies*' --include='Preferences' --include='Network*' --exclude='*' "${originalUserDataDir}/Default/" "${tempUserDataDir}/Default/" 2>/dev/null || true`);
    
    console.log("Launching local Chrome with isolated profile...");
    
    const context = await chromium.launchPersistentContext(tempUserDataDir, {
      executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
      headless: true, // 保持無頭模式
      viewport: { width: 1280, height: 800 },
      args: [
        '--disable-blink-features=AutomationControlled', // 嘗試抹除自動化特徵
      ]
    });

    const page = await context.newPage();
    console.log("Navigating to Threads...");
    
    // 偽裝成一般的 macOS Chrome
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
    });
    
    await page.goto('https://www.threads.net/@pycun_yyy/post/DWti4h6D2qA', { waitUntil: 'networkidle' });
    
    console.log("Waiting for content to render...");
    await page.waitForTimeout(5000);
    
    const content = await page.evaluate(() => {
      // 嘗試抓取主要的貼文內容區塊
      const article = document.querySelector('div[data-pressable-container="true"]');
      return article ? article.innerText : document.body.innerText;
    });
    
    console.log("\n--- Extracted Content (Playwright PoC) ---");
    console.log(content.substring(0, 500) + "...\n");
    
    await context.close();
    
  } catch (error) {
    console.error("Failed:", error.message);
  }
}

extractContent();