Sync Extension from sentience-chrome #59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Sync Extension from sentience-chrome | |
| on: | |
| repository_dispatch: | |
| types: [extension-updated] | |
| workflow_dispatch: | |
| inputs: | |
| release_tag: | |
| description: 'Release tag from sentience-chrome (e.g., v1.0.0)' | |
| required: true | |
| type: string | |
| schedule: | |
| # Check for new releases daily at 2 AM UTC | |
| - cron: '0 2 * * *' | |
| jobs: | |
| sync-extension: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| steps: | |
| - name: Checkout sdk-ts | |
| uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| fetch-depth: 0 # Fetch all history for proper branching | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Determine release tag | |
| id: release | |
| run: | | |
| if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then | |
| TAG="${{ github.event.inputs.release_tag }}" | |
| elif [ "${{ github.event_name }}" == "repository_dispatch" ]; then | |
| TAG="${{ github.event.client_payload.release_tag }}" | |
| else | |
| # Scheduled check - get latest release | |
| HTTP_CODE=$(curl -s -o latest_release.json -w "%{http_code}" \ | |
| -H "Authorization: token ${{ secrets.SENTIENCE_CHROME_TOKEN }}" \ | |
| "https://api.github.com/repos/${{ secrets.SENTIENCE_CHROME_REPO }}/releases/latest") | |
| if [ "$HTTP_CODE" != "200" ]; then | |
| echo "❌ Failed to fetch latest release. HTTP Code: $HTTP_CODE" | |
| cat latest_release.json | |
| exit 1 | |
| fi | |
| TAG=$(cat latest_release.json | jq -r '.tag_name // empty') | |
| if git ls-remote --exit-code --heads origin "sync-extension-$TAG"; then | |
| echo "Branch for $TAG already exists, skipping." | |
| echo "skip=true" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| fi | |
| if [ -z "$TAG" ]; then | |
| echo "Could not determine release tag." | |
| exit 1 | |
| fi | |
| echo "Syncing tag: $TAG" | |
| echo "tag=$TAG" >> $GITHUB_OUTPUT | |
| - name: Download extension files | |
| if: steps.release.outputs.skip != 'true' | |
| run: | | |
| TAG="${{ steps.release.outputs.tag }}" | |
| REPO="${{ secrets.SENTIENCE_CHROME_REPO }}" | |
| # Setup temp directory | |
| mkdir -p extension-temp | |
| cd extension-temp | |
| echo "⬇️ Fetching release info for $TAG from $REPO..." | |
| # Capture response to file for debugging | |
| HTTP_CODE=$(curl -s -w "%{http_code}" -o release.json \ | |
| -H "Authorization: token ${{ secrets.SENTIENCE_CHROME_TOKEN }}" \ | |
| "https://api.github.com/repos/$REPO/releases/tags/$TAG") | |
| if [ "$HTTP_CODE" != "200" ]; then | |
| echo "❌ Failed to fetch release info. HTTP Code: $HTTP_CODE" | |
| echo "Response Body:" | |
| cat release.json | |
| exit 1 | |
| fi | |
| # Check if we got a valid release object | |
| if grep -q "Not Found" release.json; then | |
| echo "❌ Critical Error: Release tag $TAG not found in repo $REPO" | |
| exit 1 | |
| fi | |
| # Robust extraction | |
| ASSET_URL=$(cat release.json | jq -r '.assets[]? | select(.name == "extension-files.tar.gz") | .url') | |
| if [ -z "$ASSET_URL" ] || [ "$ASSET_URL" == "null" ]; then | |
| echo "❌ Critical Error: extension-files.tar.gz not found in release assets!" | |
| echo "Available assets:" | |
| cat release.json | jq -r '.assets[].name' | |
| exit 1 | |
| fi | |
| # 2. Download the tarball using API URL | |
| echo "📦 Downloading tarball from asset API endpoint..." | |
| HTTP_CODE=$(curl -L -s -w "%{http_code}" -o extension.tar.gz \ | |
| -H "Authorization: token ${{ secrets.SENTIENCE_CHROME_TOKEN }}" \ | |
| -H "Accept: application/octet-stream" \ | |
| "$ASSET_URL") | |
| if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "302" ]; then | |
| echo "❌ Failed to download asset. HTTP Code: $HTTP_CODE" | |
| if [ $(stat -c%s extension.tar.gz) -lt 1000 ]; then | |
| cat extension.tar.gz | |
| fi | |
| exit 1 | |
| fi | |
| # 3. Verify File Type | |
| FILE_TYPE=$(file -b --mime-type extension.tar.gz) | |
| echo "📄 Downloaded file type: $FILE_TYPE" | |
| if [[ "$FILE_TYPE" != *"gzip"* ]] && [[ "$FILE_TYPE" != *"octet-stream"* ]]; then | |
| echo "❌ Error: Downloaded file is not a gzip archive. It is: $FILE_TYPE" | |
| exit 1 | |
| fi | |
| # 4. Extract | |
| echo "📂 Extracting..." | |
| tar -xzf extension.tar.gz | |
| rm extension.tar.gz | |
| if [ ! -f "manifest.json" ]; then | |
| echo "❌ Error: manifest.json missing after extraction" | |
| exit 1 | |
| fi | |
| - name: Update extension files | |
| if: steps.release.outputs.skip != 'true' | |
| run: | | |
| # Target directory in sdk-ts (must match package.json files array) | |
| TARGET_DIR="src/extension" | |
| # Ensure target directory exists and is clean | |
| rm -rf "$TARGET_DIR" | |
| mkdir -p "$TARGET_DIR" | |
| # Copy files from temp directory | |
| cp -r extension-temp/* "$TARGET_DIR/" | |
| # Verify copy | |
| if [ ! -f "$TARGET_DIR/manifest.json" ]; then | |
| echo "❌ Failed to copy manifest.json to $TARGET_DIR" | |
| exit 1 | |
| fi | |
| # Verify findTextRect is in the synced extension | |
| if ! grep -q "findTextRect:" "$TARGET_DIR/injected_api.js"; then | |
| echo "⚠️ Warning: findTextRect not found in synced injected_api.js" | |
| echo "The extension may be outdated. Check sentience-chrome repository." | |
| fi | |
| # Cleanup | |
| rm -rf extension-temp | |
| echo "✅ Extension files updated in $TARGET_DIR" | |
| ls -la "$TARGET_DIR" | |
| - name: Check for changes | |
| if: steps.release.outputs.skip != 'true' | |
| id: changes | |
| run: | | |
| git add src/extension/ | |
| if git diff --staged --quiet; then | |
| echo "No changes detected." | |
| echo "changed=false" >> $GITHUB_OUTPUT | |
| else | |
| echo "Changes detected." | |
| echo "changed=true" >> $GITHUB_OUTPUT | |
| # Show staged files | |
| echo "📊 Staged file sizes:" | |
| git diff --staged --name-only | while read file; do | |
| if [ -f "$file" ]; then | |
| size=$(ls -lh "$file" | awk '{print $5}') | |
| echo " $file: $size" | |
| fi | |
| done | |
| fi | |
| - name: Create Pull Request | |
| if: steps.release.outputs.skip != 'true' && steps.changes.outputs.changed == 'true' | |
| uses: peter-evans/create-pull-request@v5 | |
| with: | |
| token: ${{ secrets.PR_TOKEN || secrets.GITHUB_TOKEN }} | |
| commit-message: "chore: sync extension files from sentience-chrome ${{ steps.release.outputs.tag }}" | |
| title: "Sync Extension: ${{ steps.release.outputs.tag }}" | |
| body: | | |
| This PR syncs extension files from sentience-chrome release ${{ steps.release.outputs.tag }}. | |
| **Files updated:** | |
| - Extension manifest and scripts | |
| - WASM binary and bindings | |
| **Source:** [sentience-chrome release ${{ steps.release.outputs.tag }}](https://github.com/${{ secrets.SENTIENCE_CHROME_REPO }}/releases/tag/${{ steps.release.outputs.tag }}) | |
| branch: sync-extension-${{ steps.release.outputs.tag }} | |
| delete-branch: true | |
| labels: | | |
| automated | |
| extension-sync |