Skip to content

Commit b9de8ad

Browse files
authored
Merge pull request #4 from SentienceAPI/week3.5
sync extensions
2 parents 6cfb555 + 0f38335 commit b9de8ad

File tree

2 files changed

+159
-12
lines changed

2 files changed

+159
-12
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
name: Sync Extension from sentience-chrome
2+
3+
on:
4+
repository_dispatch:
5+
types: [extension-updated]
6+
workflow_dispatch:
7+
inputs:
8+
release_tag:
9+
description: 'Release tag from sentience-chrome (e.g., v1.0.0)'
10+
required: true
11+
type: string
12+
schedule:
13+
# Check for new releases daily at 2 AM UTC
14+
- cron: '0 2 * * *'
15+
16+
jobs:
17+
sync-extension:
18+
runs-on: ubuntu-latest
19+
permissions:
20+
contents: write
21+
pull-requests: write
22+
23+
steps:
24+
- name: Checkout sdk-ts
25+
uses: actions/checkout@v4
26+
with:
27+
token: ${{ secrets.GITHUB_TOKEN }}
28+
29+
- name: Set up Node.js
30+
uses: actions/setup-node@v4
31+
with:
32+
node-version: '20'
33+
34+
- name: Determine release tag
35+
id: release
36+
run: |
37+
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
38+
TAG="${{ github.event.inputs.release_tag }}"
39+
elif [ "${{ github.event_name }}" == "repository_dispatch" ]; then
40+
TAG="${{ github.event.client_payload.release_tag }}"
41+
else
42+
# Scheduled check - get latest release
43+
TAG=$(curl -s https://api.github.com/repos/${{ secrets.SENTIENCE_CHROME_REPO }}/releases/latest | jq -r '.tag_name // empty')
44+
fi
45+
46+
if [ -z "$TAG" ] || [ "$TAG" == "null" ]; then
47+
echo "No release found, skipping"
48+
echo "skip=true" >> $GITHUB_OUTPUT
49+
exit 0
50+
fi
51+
52+
echo "tag=$TAG" >> $GITHUB_OUTPUT
53+
echo "Release tag: $TAG"
54+
55+
- name: Download extension files
56+
if: steps.release.outputs.skip != 'true'
57+
run: |
58+
TAG="${{ steps.release.outputs.tag }}"
59+
REPO="${{ secrets.SENTIENCE_CHROME_REPO }}"
60+
61+
# Download release assets
62+
mkdir -p extension-temp
63+
cd extension-temp
64+
65+
# Download each file from release
66+
curl -L -H "Authorization: token ${{ secrets.SENTIENCE_CHROME_TOKEN }}" \
67+
"https://api.github.com/repos/$REPO/releases/tags/$TAG" | \
68+
jq -r '.assets[] | select(.name | endswith(".js") or endswith(".wasm") or endswith(".json") or endswith(".d.ts")) | .browser_download_url' | \
69+
while read url; do
70+
filename=$(basename "$url")
71+
curl -L -H "Authorization: token ${{ secrets.SENTIENCE_CHROME_TOKEN }}" "$url" -o "$filename"
72+
done
73+
74+
- name: Copy extension files
75+
if: steps.release.outputs.skip != 'true'
76+
run: |
77+
# Create extension directory structure
78+
mkdir -p src/extension/pkg
79+
80+
# Copy extension files
81+
cp extension-temp/manifest.json src/extension/ 2>/dev/null || echo "manifest.json not found in release"
82+
cp extension-temp/content.js src/extension/ 2>/dev/null || echo "content.js not found in release"
83+
cp extension-temp/background.js src/extension/ 2>/dev/null || echo "background.js not found in release"
84+
cp extension-temp/injected_api.js src/extension/ 2>/dev/null || echo "injected_api.js not found in release"
85+
86+
# Copy WASM files
87+
cp extension-temp/pkg/sentience_core.js src/extension/pkg/ 2>/dev/null || echo "sentience_core.js not found"
88+
cp extension-temp/pkg/sentience_core_bg.wasm src/extension/pkg/ 2>/dev/null || echo "sentience_core_bg.wasm not found"
89+
cp extension-temp/pkg/*.d.ts src/extension/pkg/ 2>/dev/null || echo "Type definitions not found"
90+
91+
- name: Check for changes
92+
if: steps.release.outputs.skip != 'true'
93+
id: changes
94+
run: |
95+
git config --local user.email "action@github.com"
96+
git config --local user.name "GitHub Action"
97+
git add src/extension/ || true
98+
if git diff --staged --quiet; then
99+
echo "changed=false" >> $GITHUB_OUTPUT
100+
echo "No changes detected"
101+
else
102+
echo "changed=true" >> $GITHUB_OUTPUT
103+
echo "Changes detected"
104+
fi
105+
106+
- name: Create Pull Request
107+
if: steps.release.outputs.skip != 'true' && steps.changes.outputs.changed == 'true'
108+
uses: peter-evans/create-pull-request@v5
109+
with:
110+
token: ${{ secrets.GITHUB_TOKEN }}
111+
commit-message: "chore: sync extension files from sentience-chrome ${{ steps.release.outputs.tag }}"
112+
title: "Sync Extension: ${{ steps.release.outputs.tag }}"
113+
body: |
114+
This PR syncs extension files from sentience-chrome release ${{ steps.release.outputs.tag }}.
115+
116+
**Files updated:**
117+
- Extension manifest and scripts
118+
- WASM binary and bindings
119+
120+
**Source:** [sentience-chrome release ${{ steps.release.outputs.tag }}](${{ secrets.SENTIENCE_CHROME_REPO }}/releases/tag/${{ steps.release.outputs.tag }})
121+
branch: sync-extension-${{ steps.release.outputs.tag }}
122+
delete-branch: true
123+

src/browser.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,44 @@ export class SentienceBrowser {
3434
}
3535

3636
async start(): Promise<void> {
37-
// Get extension source path (relative to project root)
37+
// Try to find extension in multiple locations:
38+
// 1. Embedded extension (src/extension/) - for production/CI
39+
// 2. Development mode (../sentience-chrome/) - for local development
40+
3841
// Handle both ts-node (src/) and compiled (dist/src/) cases
42+
let sdkRoot: string;
3943
let repoRoot: string;
4044
if (__dirname.includes('dist')) {
41-
// Compiled: dist/src/ -> go up 3 levels to project root (Sentience/)
42-
repoRoot = path.resolve(__dirname, '../../..');
45+
// Compiled: dist/src/ -> go up 2 levels to sdk-ts/
46+
sdkRoot = path.resolve(__dirname, '../..');
47+
// Go up 1 more level to project root (Sentience/)
48+
repoRoot = path.resolve(sdkRoot, '..');
4349
} else {
44-
// ts-node: src/ -> go up 2 levels to project root (Sentience/)
45-
repoRoot = path.resolve(__dirname, '../..');
50+
// ts-node: src/ -> go up 1 level to sdk-ts/
51+
sdkRoot = path.resolve(__dirname, '..');
52+
// Go up 1 more level to project root (Sentience/)
53+
repoRoot = path.resolve(sdkRoot, '..');
4654
}
47-
const extensionSource = path.join(repoRoot, 'sentience-chrome');
48-
49-
if (!fs.existsSync(extensionSource)) {
55+
56+
// Check for embedded extension first (production/CI)
57+
const embeddedExtension = path.join(sdkRoot, 'src', 'extension');
58+
59+
// Check for development extension (local development)
60+
const devExtension = path.join(repoRoot, 'sentience-chrome');
61+
62+
// Prefer embedded extension, fall back to dev extension
63+
let extensionSource: string;
64+
if (fs.existsSync(embeddedExtension) && fs.existsSync(path.join(embeddedExtension, 'manifest.json'))) {
65+
extensionSource = embeddedExtension;
66+
} else if (fs.existsSync(devExtension) && fs.existsSync(path.join(devExtension, 'manifest.json'))) {
67+
extensionSource = devExtension;
68+
} else {
5069
throw new Error(
51-
`Extension not found at ${extensionSource}. ` +
52-
'Make sure sentience-chrome directory exists.'
70+
`Extension not found. Checked:\n` +
71+
` 1. ${embeddedExtension}\n` +
72+
` 2. ${devExtension}\n` +
73+
'Make sure extension files are available. ' +
74+
'For development: cd ../sentience-chrome && ./build.sh'
5375
);
5476
}
5577

@@ -87,7 +109,8 @@ export class SentienceBrowser {
87109
if (!fs.existsSync(pkgSource)) {
88110
throw new Error(
89111
`WASM package directory not found at ${pkgSource}\n` +
90-
'Make sure to build the extension: cd sentience-chrome && ./build.sh'
112+
'Make sure extension files are available. ' +
113+
'For development: cd ../sentience-chrome && ./build.sh'
91114
);
92115
}
93116

@@ -99,7 +122,8 @@ export class SentienceBrowser {
99122
`WASM files not found. Expected:\n` +
100123
` - ${wasmJs}\n` +
101124
` - ${wasmBinary}\n` +
102-
'Make sure to build the extension: cd sentience-chrome && ./build.sh'
125+
'Make sure extension files are available. ' +
126+
'For development: cd ../sentience-chrome && ./build.sh'
103127
);
104128
}
105129

0 commit comments

Comments
 (0)