Sync Extension from sentience-chrome #29
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 | |
| TARGET_DIR="sentience-chrome" | |
| # 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 | |
| # 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 sentience-chrome/ | |
| 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 |