Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
db32f7b
fix(desktop): make Windows package replacement fully transactional (#…
andrexibiza Aug 21, 2026
fe4d539
ci: materialize final PR 91079 Python rollback blob
andrexibiza Aug 21, 2026
df2a3b6
ci: fix PR 91079 rollback blob materializer
andrexibiza Aug 21, 2026
4940568
ci: publish PR 91079 generated tree and retire materializer
andrexibiza Aug 23, 2026
d989f19
ci: export immutable PR 91079 final tree on reopen
andrexibiza Aug 23, 2026
d81bf1b
probe
andrexibiza Aug 23, 2026
a2d9e0b
ci: install PR 91079 final-tree publisher
andrexibiza Aug 23, 2026
b5c8990
ci: trigger PR 91079 publisher through server-side merge
andrexibiza Aug 23, 2026
e91a57f
ci: trigger PR 91079 final-tree publisher
andrexibiza Aug 23, 2026
ef46232
ci(desktop): retrigger #91079 final publisher
andrexibiza Aug 23, 2026
48fe960
ci(desktop): rebase final publisher target to current main
andrexibiza Aug 23, 2026
84fc3e2
ci(pr91079): publish canonical current-main delivery
andrexibiza Aug 23, 2026
59cf93e
ci(pr91079): materialize exact live-main final object
andrexibiza Aug 23, 2026
da23d30
fix(ci): preserve renderer build in PR 91079 final publisher
andrexibiza Aug 23, 2026
0e95911
chore(ci): trigger #91079 final-tree publisher
andrexibiza Aug 25, 2026
ae14304
chore(ci): retrigger #91079 final-tree publisher via ref update
andrexibiza Aug 25, 2026
ef6cef5
chore(ci): retrigger PR 91079 final-tree publisher
andrexibiza Aug 25, 2026
3e7ebe8
ci(pr91079): probe fork Actions execution
andrexibiza Aug 26, 2026
b56f697
ci(pr91079): probe upstream commit-object authority
andrexibiza Aug 27, 2026
b38b2e7
ci(pr91079): bind authority probe to metadata event
andrexibiza Aug 27, 2026
b0bf313
ci: retrigger PR 91079 current-main materializer
andrexibiza Aug 27, 2026
f84cecb
ci: materialize PR 91079 current-main Windows transaction
andrexibiza Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/pr91079-actions-kick
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
retrigger fork final-tree publisher from ae143040a06d04210b6449624a6ebd13b12ccc73
1 change: 1 addition & 0 deletions .github/pr91079-actions-kick-2
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
retrigger exact-current-main materializer
406 changes: 406 additions & 0 deletions .github/workflows/pr91079-finalize-current-main.yml

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions .github/workflows/pr91079-materialize-patch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: PR 91079 upstream commit-object authority probe

on:
pull_request:
types: [synchronize, edited]

permissions:
contents: write

jobs:
probe:
if: >-
github.event.pull_request.number == 91079 &&
github.event.pull_request.head.repo.full_name == 'andrexibiza/hermes-agent' &&
github.event.pull_request.head.ref == 'fix/windows-desktop-pack-transaction'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Create one unreferenced exact-author commit object
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: |
set -Eeuo pipefail
repo="$GITHUB_REPOSITORY"
main_sha="$(gh api "repos/$repo/git/ref/heads/main" --jq '.object.sha')"
main_tree="$(gh api "repos/$repo/git/commits/$main_sha" --jq '.tree.sha')"
authored_at="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"

jq -n \
--arg message 'chore(pr91079): verify upstream commit-object authority' \
--arg tree "$main_tree" \
--arg parent "$main_sha" \
--arg name 'Axl Ibiza, MBA' \
--arg email 'andrexibiza@gmail.com' \
--arg date "$authored_at" \
'{message:$message, tree:$tree, parents:[$parent], author:{name:$name,email:$email,date:$date}, committer:{name:$name,email:$email,date:$date}}' \
| gh api --method POST "repos/$repo/git/commits" --input - > "$RUNNER_TEMP/commit.json"

object_sha="$(jq -r '.sha' "$RUNNER_TEMP/commit.json")"
test -n "$object_sha"
gh api "repos/$repo/git/commits/$object_sha" > "$RUNNER_TEMP/verified.json"
test "$(jq -r '.author.name' "$RUNNER_TEMP/verified.json")" = 'Axl Ibiza, MBA'
test "$(jq -r '.author.email' "$RUNNER_TEMP/verified.json")" = 'andrexibiza@gmail.com'
test "$(jq -r '.committer.name' "$RUNNER_TEMP/verified.json")" = 'Axl Ibiza, MBA'
test "$(jq -r '.committer.email' "$RUNNER_TEMP/verified.json")" = 'andrexibiza@gmail.com'
echo "created_unreferenced_commit_object=$object_sha"
23 changes: 23 additions & 0 deletions .github/workflows/pr91079-publish-final.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: PR 91079 Actions execution probe

on:
push:
branches:
- fix/windows-desktop-pack-transaction

permissions:
contents: read

jobs:
probe:
runs-on: ubuntu-latest
steps:
- name: Record exact event object
shell: bash
run: |
set -euo pipefail
echo "repository=$GITHUB_REPOSITORY"
echo "ref=$GITHUB_REF"
echo "sha=$GITHUB_SHA"
test "$GITHUB_REPOSITORY" = "andrexibiza/hermes-agent"
test "$GITHUB_REF_NAME" = "fix/windows-desktop-pack-transaction"
6 changes: 3 additions & 3 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"profile:main:cpu": "tsc --build tsconfig.electron.json && wait-on http://127.0.0.1:5174 && node scripts/bundle-electron-main.mjs --dev && cross-env XCURSOR_SIZE=24 NODE_OPTIONS=--cpu-prof HERMES_DESKTOP_DEV_SERVER=http://127.0.0.1:5174 electron .",
"start": "npm run build && electron .",
"prebuild": "npm run clean",
"build": "node scripts/assert-root-install.mjs && node scripts/write-build-stamp.mjs && vite build && node scripts/bundle-electron-main.mjs && node scripts/stage-native-deps.mjs",
"build": "node scripts/assert-root-install.mjs && node scripts/write-build-stamp.mjs && vite build && node scripts/bundle-electron-main.mjs && node scripts/stage-native-deps-recovery.mjs",
"postbuild": "node scripts/assert-dist-built.mjs",
"prebuilder": "node scripts/patch-electron-builder-mac-binary.mjs",
"builder": "cross-env NODE_OPTIONS=--max-old-space-size=16384 node scripts/run-electron-builder.mjs",
Expand Down Expand Up @@ -71,7 +71,7 @@
"check:test:ui:shard-1of3": "node scripts/run-ui-shard.mjs",
"check:test:ui:shard-2of3": "node scripts/run-ui-shard.mjs",
"check:test:ui:shard-3of3": "node scripts/run-ui-shard.mjs",
"check:test:desktop:all": "npm run test:desktop:all",
"check:test:desktop:all": "node --test scripts/stage-native-deps-recovery.test.mjs && npm run test:desktop:all",
"check:lint": "npm run typecheck && npm run lint",
"check": "npm run check:lint && npm run test:ui && npm run test:desktop:platforms && npm run test:desktop:all",
"test:e2e": "npm run build && playwright test e2e/",
Expand Down Expand Up @@ -212,7 +212,7 @@
"package.json"
],
"beforeBuild": "scripts/before-build.mjs",
"beforePack": "scripts/before-pack.mjs",
"beforePack": "scripts/before-pack-recovery.mjs",
"afterPack": "scripts/after-pack.mjs",
"extraResources": [
{
Expand Down
45 changes: 45 additions & 0 deletions apps/desktop/scripts/before-pack-recovery.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Recovery wrapper around the canonical electron-builder beforePack hook.
// The base hook remains the owner of stale-app cleanup, rollback preservation,
// and native staging. This wrapper handles only one residual: a corrupt or
// unresolvable get-windows package root on a supported native build host.

import { Arch } from 'electron-builder'

import beforePack from './before-pack.mjs'
import {
isMissingGetWindowsPackageError,
stageGetWindowsWithRecovery
} from './stage-native-deps-recovery.mjs'

function errorMessage(error) {
return error instanceof Error ? error.message : String(error)
}

export default async function beforePackWithRecovery(context) {
try {
return await beforePack(context)
} catch (error) {
if (!isMissingGetWindowsPackageError(error)) {
throw error
}

const platform = context && context.electronPlatformName
const arch = context && typeof context.arch === 'number' ? Arch[context.arch] : undefined
if (!platform || !arch) {
throw error
}

console.warn(
`[before-pack] canonical native staging found a corrupt get-windows package root; ` +
`retrying ${platform}-${arch} from an isolated dependency realization`
)
try {
stageGetWindowsWithRecovery({ platform, arch })
console.log(`[before-pack] recovered and staged get-windows for target ${platform}-${arch}`)
} catch (recoveryError) {
throw new Error(
`[before-pack] isolated get-windows recovery failed for ${platform}-${arch}: ${errorMessage(recoveryError)}`
)
}
}
}
Loading