Skip to content

Commit ce179dd

Browse files
authored
Fix remote mobile drift for 26.707.91948 (#1018)
* Automate private feature upstream sync * Limit sync workflow credentials * Update private sync actions (#2) * Update GitHub Actions to Node 24 runtimes (#3) * fix(remote-mobile): follow 26.707.91948 runtime bundles
1 parent 4f0470d commit ce179dd

13 files changed

Lines changed: 232 additions & 40 deletions

.github/workflows/cachix.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
runs-on: ubuntu-latest
2828
timeout-minutes: 150
2929
steps:
30-
- uses: actions/checkout@v4
30+
- uses: actions/checkout@v7
3131

3232
- uses: cachix/install-nix-action@v31
3333

.github/workflows/ci.yml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,14 @@ permissions:
1313

1414
env:
1515
CARGO_TERM_COLOR: always
16-
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
1716
CI_PACKAGE_VERSION: 2026.04.28.000000+ci${{ github.run_number }}
1817

1918
jobs:
2019
rust-and-smoke:
2120
name: Rust and Smoke Tests
2221
runs-on: ubuntu-latest
2322
steps:
24-
- uses: actions/checkout@v4
23+
- uses: actions/checkout@v7
2524

2625
- name: Install Rust components
2726
run: rustup component add rustfmt clippy
@@ -72,7 +71,7 @@ jobs:
7271
name: Build Debian Package
7372
runs-on: ubuntu-latest
7473
steps:
75-
- uses: actions/checkout@v4
74+
- uses: actions/checkout@v7
7675

7776
- name: Create minimal packaged app fixture
7877
run: |
@@ -110,9 +109,9 @@ jobs:
110109
experimental-features = nix-command flakes
111110
max-jobs = 1
112111
steps:
113-
- uses: actions/checkout@v4
112+
- uses: actions/checkout@v7
114113

115-
- uses: actions/setup-node@v4
114+
- uses: actions/setup-node@v7
116115
with:
117116
node-version: 24
118117

@@ -234,7 +233,7 @@ jobs:
234233
name: Build RPM Package
235234
runs-on: ubuntu-latest
236235
steps:
237-
- uses: actions/checkout@v4
236+
- uses: actions/checkout@v7
238237

239238
- name: Install RPM tooling
240239
run: |
@@ -274,7 +273,7 @@ jobs:
274273
name: Build Pacman Package
275274
runs-on: ubuntu-latest
276275
steps:
277-
- uses: actions/checkout@v4
276+
- uses: actions/checkout@v7
278277

279278
- name: Build and inspect pacman package in Arch Linux
280279
run: |

.github/workflows/computer-use-sync-reminder.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ jobs:
2626
runs-on: ubuntu-latest
2727
steps:
2828
- name: Check out the label policy
29-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
29+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
3030
with:
3131
persist-credentials: false
3232

3333
- name: Open or update the sync reminder
34-
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
34+
uses: actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71 # v9.0.0
3535
with:
3636
script: |
3737
const policy = require(

.github/workflows/contributor-pr-limit.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ jobs:
1919
# pull_request_target grants write access for fork PRs. Always load the
2020
# enforcement code from the trusted default branch, never from the PR.
2121
- name: Check out trusted enforcement code
22-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
22+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
2323
with:
2424
ref: ${{ github.event.repository.default_branch }}
2525
persist-credentials: false
2626

2727
- name: Enforce open pull request limit
28-
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
28+
uses: actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71 # v9.0.0
2929
env:
3030
MAX_OPEN_PRS_PER_CONTRIBUTOR: ${{ vars.MAX_OPEN_PRS_PER_CONTRIBUTOR }}
3131
MAX_OPEN_PRS_PER_CONTRIBUTOR_OVERRIDES: ${{ vars.MAX_OPEN_PRS_PER_CONTRIBUTOR_OVERRIDES }}

.github/workflows/install-deps.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
env:
3434
DEBIAN_FRONTEND: noninteractive
3535
steps:
36-
- uses: actions/checkout@v4
36+
- uses: actions/checkout@v7
3737

3838
- name: Bootstrap sudo
3939
run: |

.github/workflows/manage-labels.yml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ on:
2020

2121
permissions: {}
2222

23-
env:
24-
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
25-
2623
concurrency:
2724
group: repository-label-governance
2825
cancel-in-progress: false
@@ -39,7 +36,7 @@ jobs:
3936
pull-requests: read
4037
steps:
4138
- name: Check out trusted governance code
42-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
39+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
4340
with:
4441
ref: ${{ github.event.repository.default_branch }}
4542
persist-credentials: false
@@ -88,7 +85,7 @@ jobs:
8885
# A write-capable dispatch must run only code already reviewed on the
8986
# default branch, even when the dispatcher selects another ref in the UI.
9087
- name: Check out trusted governance code
91-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
88+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
9289
with:
9390
ref: ${{ github.event.repository.default_branch }}
9491
persist-credentials: false
@@ -125,7 +122,7 @@ jobs:
125122
--snapshot "$RUNNER_TEMP/repository-labels-before.json"
126123
127124
- name: Preserve the pre-change audit snapshot
128-
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
125+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
129126
with:
130127
name: repository-labels-before-${{ github.run_id }}
131128
path: ${{ runner.temp }}/repository-labels-before.json
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
name: Sync private features with upstream
2+
3+
on:
4+
schedule:
5+
- cron: "17 */6 * * *"
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: write
10+
issues: write
11+
12+
concurrency:
13+
group: sync-private-features-with-upstream
14+
cancel-in-progress: false
15+
16+
env:
17+
PRIVATE_BRANCH: agent/private-quick-chat-window-zoom
18+
UPSTREAM_REPOSITORY: ilysenko/codex-desktop-linux
19+
20+
jobs:
21+
sync:
22+
name: Merge, validate, and publish upstream
23+
runs-on: ubuntu-latest
24+
timeout-minutes: 45
25+
steps:
26+
- uses: actions/checkout@v7
27+
with:
28+
fetch-depth: 0
29+
persist-credentials: false
30+
ref: ${{ env.PRIVATE_BRANCH }}
31+
32+
- name: Merge current upstream main
33+
id: merge
34+
env:
35+
UPSTREAM_URL: https://github.com/${{ env.UPSTREAM_REPOSITORY }}.git
36+
run: |
37+
set -euo pipefail
38+
39+
git config user.name github-actions[bot]
40+
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
41+
git remote add upstream "$UPSTREAM_URL"
42+
git fetch --no-tags upstream main
43+
44+
if git merge-base --is-ancestor upstream/main HEAD; then
45+
echo 'changed=false' >> "$GITHUB_OUTPUT"
46+
exit 0
47+
fi
48+
49+
git merge --no-edit upstream/main
50+
echo 'changed=true' >> "$GITHUB_OUTPUT"
51+
52+
- name: Test private Quick Chat feature
53+
if: steps.merge.outputs.changed == 'true'
54+
run: node --test linux-features/local/quick-chat-window-zoom/test.js
55+
56+
- name: Test the complete patch engine
57+
if: steps.merge.outputs.changed == 'true'
58+
run: node --test scripts/patch-linux-window-ui.test.js
59+
60+
- name: Install Nix
61+
if: steps.merge.outputs.changed == 'true'
62+
uses: cachix/install-nix-action@v31
63+
64+
- name: Evaluate the merged Nix flake
65+
if: steps.merge.outputs.changed == 'true'
66+
run: nix flake check --no-build --print-build-logs
67+
68+
- name: Publish the validated private branch
69+
if: steps.merge.outputs.changed == 'true'
70+
env:
71+
GH_TOKEN: ${{ github.token }}
72+
run: |
73+
set -euo pipefail
74+
auth_header="$(printf 'x-access-token:%s' "$GH_TOKEN" | base64 -w0)"
75+
git -c http.https://github.com/.extraheader="AUTHORIZATION: basic ${auth_header}" \
76+
push origin "HEAD:${PRIVATE_BRANCH}"
77+
78+
- name: Record synchronization failure
79+
if: failure()
80+
uses: actions/github-script@v9
81+
with:
82+
script: |
83+
const title = "Automated private-feature upstream sync failed";
84+
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
85+
const body = [
86+
"The scheduled merge of `ilysenko/codex-desktop-linux:main` into the private feature branch failed.",
87+
"",
88+
`Workflow run: ${runUrl}`,
89+
"",
90+
"The private branch and deployed package were not advanced. Resolve the merge or patch drift locally, then rerun the workflow.",
91+
].join("\n");
92+
const { data: issues } = await github.rest.issues.listForRepo({
93+
...context.repo,
94+
state: "open",
95+
per_page: 100,
96+
});
97+
const existing = issues.find((issue) => issue.title === title);
98+
if (existing) {
99+
await github.rest.issues.createComment({
100+
...context.repo,
101+
issue_number: existing.number,
102+
body,
103+
});
104+
} else {
105+
await github.rest.issues.create({ ...context.repo, title, body });
106+
}
107+
108+
- name: Close resolved synchronization failure
109+
if: success()
110+
uses: actions/github-script@v9
111+
with:
112+
script: |
113+
const title = "Automated private-feature upstream sync failed";
114+
const { data: issues } = await github.rest.issues.listForRepo({
115+
...context.repo,
116+
state: "open",
117+
per_page: 100,
118+
});
119+
const existing = issues.find((issue) => issue.title === title);
120+
if (existing) {
121+
await github.rest.issues.update({
122+
...context.repo,
123+
issue_number: existing.number,
124+
state: "closed",
125+
state_reason: "completed",
126+
});
127+
}

.github/workflows/update-codex-hash.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ jobs:
3030
NIX_CONFIG: experimental-features = nix-command flakes
3131
CACHIX_CACHE_NAME: codex-desktop-linux
3232
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
33-
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
3433
steps:
35-
- uses: actions/checkout@v4
34+
- uses: actions/checkout@v7
3635
with:
3736
fetch-depth: 0
3837
ref: ${{ inputs.expected_main_sha }}
@@ -69,7 +68,7 @@ jobs:
6968
echo "skip_refresh=true" >> "$GITHUB_OUTPUT"
7069
fi
7170
72-
- uses: actions/setup-node@v4
71+
- uses: actions/setup-node@v7
7372
if: steps.dedupe.outputs.skip_refresh != 'true'
7473
with:
7574
node-version: 24

.github/workflows/upstream-build-app.yml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ concurrency:
4949
cancel-in-progress: false
5050

5151
env:
52-
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
5352
UPSTREAM_DMG_URL: https://persistent.oaistatic.com/codex-app-prod/ChatGPT.dmg
5453
UPSTREAM_DMG_PATH: /tmp/codex-upstream-ci/Codex.dmg
5554
DMG_CACHE_SCHEMA_VERSION: v1
@@ -61,10 +60,10 @@ jobs:
6160
timeout-minutes: 60
6261

6362
steps:
64-
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
63+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
6564

6665
- name: Set up Node.js
67-
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
66+
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
6867
with:
6968
node-version: 24
7069

@@ -111,7 +110,7 @@ jobs:
111110
112111
- name: Restore cached upstream DMG
113112
id: dmg-cache
114-
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
113+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
115114
with:
116115
path: /tmp/codex-upstream-ci/Codex.dmg
117116
key: upstream-dmg-${{ env.DMG_CACHE_SCHEMA_VERSION }}-${{ steps.upstream-metadata.outputs.cache_segment }}
@@ -169,7 +168,7 @@ jobs:
169168
# The transactional installer records a decision before returning a
170169
# rejected status, so diagnostics remain available on failed runs.
171170
if: always()
172-
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
171+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
173172
with:
174173
name: upstream-dmg-metadata
175174
path: |
@@ -211,15 +210,15 @@ jobs:
211210

212211
steps:
213212
- name: Check out trusted reconciliation code
214-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
213+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
215214
with:
216215
ref: ${{ github.event.repository.default_branch }}
217216
persist-credentials: false
218217

219218
- name: Download acceptance artifact
220219
id: download
221220
continue-on-error: true
222-
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
221+
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
223222
with:
224223
name: upstream-dmg-metadata
225224
path: acceptance-artifact
@@ -250,7 +249,7 @@ jobs:
250249
251250
- name: Create, update, or close the drift issue
252251
if: steps.current-identity.outcome == 'success'
253-
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
252+
uses: actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71 # v9.0.0
254253
with:
255254
script: |
256255
const fs = require('fs');

linux-features/remote-mobile-control/patch.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ const REMOTE_MOBILE_APP_SERVER_REMOTE_CONTROL_MARKER = "codexLinuxRemoteMobileAp
5353
const REMOTE_MOBILE_APP_SERVER_ARGS_NEEDLE =
5454
"[`-c`,`features.code_mode_host=true`,`app-server`,`--analytics-default-enabled`]";
5555
const REMOTE_MOBILE_RUNTIME_ASSET_PATTERN =
56-
/^app-initial~app-main~hotkey-window-new-thread-page~hotkey-window-home-page~composer-utility-bar-[^.]+\.js$/u;
56+
/^app-initial~app-main~pull-request-route~new-thread-panel-page~onboarding-page~settings-page~i2dgsl27-[^.]+\.js$/u;
57+
const REMOTE_MOBILE_TERMINAL_STATUS_ASSET_PATTERN =
58+
/^app-initial~artifact-tab-content\.electron~app-main~pull-request-route~pull-request-code-rev~[^.]+\.js$/u;
5759
const REMOTE_CONTROL_APP_MAIN_PAGE_ASSET_PATTERN =
5860
/^app-initial~app-main~page-[^.]+\.js$/u;
5961
const REMOTE_MOBILE_ACTIVE_STATUS_ASSET_PATTERN =
@@ -1513,7 +1515,7 @@ module.exports = [
15131515
{
15141516
id: "linux-remote-terminal-status-recovery",
15151517
phase: "webview-asset",
1516-
pattern: REMOTE_MOBILE_RUNTIME_ASSET_PATTERN,
1518+
pattern: REMOTE_MOBILE_TERMINAL_STATUS_ASSET_PATTERN,
15171519
order: 20_152,
15181520
ciPolicy: "optional",
15191521
missingDescription: "app-server conversation manager bundle",

0 commit comments

Comments
 (0)