Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
dcadf74
fix(ai): Resolve issue #2050 - Stage packaged Windows ARM64 desktop a…
Sep 1, 2026
da0cd57
feat(ai): Implemented the ultrafix follow-up in the four scoped files.
Sep 1, 2026
1414644
feat(ai): Implemented both lifecycle corrections.
Sep 1, 2026
f1aeadf
feat(ai): Implemented the diagnostic-only ultrafix on head `1414644eb…
Sep 1, 2026
9a5cbef
feat(ai): Implemented the diagnostic-only correction on exact head `f…
Sep 2, 2026
b1dff84
feat(ai): Implemented the narrow host-launcher authority fix on head …
Sep 2, 2026
d00b6b0
merge: resolve conflicts from 1953-epic-desktop-transport-api into 20…
Sep 2, 2026
5eb6ba5
feat(ai): Implemented the narrow launcher correction.
Sep 2, 2026
d28cafc
feat(ai): Implemented the narrow two-file correction.
Sep 2, 2026
7079757
feat(ai): Implemented the narrow packaged-launch correction.
Sep 2, 2026
6783e91
feat(ai): Implemented the narrow host-Node producer correction.
Sep 2, 2026
d5d7fbc
feat(ai): Implemented the narrow host-Node producer correction.
Sep 2, 2026
fb61b5b
feat(ai): Implemented the narrow x64 regression fix without committing.
Sep 2, 2026
4316ac8
feat(ai): Implemented the staged-contract transport correction withou…
Sep 2, 2026
dd18460
feat(ai): Implemented the correction on exact head `4316ac83628821929…
Sep 2, 2026
913159d
feat(ai): Implemented the two-schema diagnostic correction on exact h…
Sep 2, 2026
ffa1b47
feat(ai): Implemented the ARM64 capture-authority correction on head …
Sep 2, 2026
dfbcec5
feat(ai): Implemented the ARM64 capture-authority correction on exact…
Sep 2, 2026
47cef9d
feat(ai): Implemented the two focused follow-ups without weakening pr…
Sep 2, 2026
c0c40b3
feat(ai): Implemented the focused attribution split in [run-packaged-…
Sep 2, 2026
b23ac93
feat(ai): Implemented the narrow follow-up without committing or merg…
Sep 2, 2026
89bf42d
feat(ai): Updated [package-lock.json](/tmp/git-processor/worktrees/in…
Sep 2, 2026
a8be898
feat(ai): Implemented the requested correction on exact head `89bf42d…
Sep 2, 2026
944c9ff
feat(ai): Implemented the narrow regression correction:
Sep 2, 2026
710217b
feat(ai): Implemented the narrow capture-read correction without comm…
Sep 2, 2026
f72f5b6
feat(ai): Implemented the narrow logger correction.
Sep 2, 2026
d4270e5
feat(ai): Implemented the production sequencing fix on exact head `f7…
Sep 2, 2026
6e80e70
feat(ai): Implemented the target-compatible correction on head `d4270…
Sep 2, 2026
af1ef83
feat(ai): Implemented the narrow parser-wiring fix without committing…
Sep 2, 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
33 changes: 7 additions & 26 deletions .github/workflows/desktop-connect-discovery-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ jobs:
if: matrix.platform == 'win32'
run: npm run test:windows-fixture-acl -w @propr/desktop

- name: Verify Windows packaged launcher authority
if: matrix.platform == 'win32'
run: node --test apps/desktop/scripts/windows-packaged-connect-staging.test.mjs

- name: Package the target-native desktop app
run: npm run desktop:package

Expand All @@ -99,29 +103,6 @@ jobs:
- name: Run packaged Windows main-to-renderer discovery as an ordinary user
if: matrix.platform == 'win32'
shell: powershell
run: |
$ErrorActionPreference = 'Stop'
$userName = 'propr-connect-ci'
if ($userName.Length -gt 20) { throw 'packaged discovery user name exceeds the local-account limit' }
$plainPassword = [Guid]::NewGuid().ToString('N') + 'aA1!'
$securePassword = ConvertTo-SecureString $plainPassword -AsPlainText -Force
$credential = [PSCredential]::new("$env:COMPUTERNAME\$userName", $securePassword)
$stdout = Join-Path $env:RUNNER_TEMP 'packaged-connect.stdout'
$stderr = Join-Path $env:RUNNER_TEMP 'packaged-connect.stderr'
try {
New-LocalUser -Name $userName -Password $securePassword -PasswordNeverExpires | Out-Null
$administrators = Get-LocalGroupMember -Group 'Administrators' | ForEach-Object { $_.Name }
if ($administrators -contains "$env:COMPUTERNAME\$userName") { throw 'packaged discovery user is an administrator' }
$node = (Get-Command node.exe).Source
$desktopDirectory = Join-Path $env:GITHUB_WORKSPACE 'apps/desktop'
$process = Start-Process -FilePath $node -ArgumentList @('scripts/smoke-packaged-connect.mjs') -WorkingDirectory $desktopDirectory -Credential $credential -LoadUserProfile -Wait -PassThru -RedirectStandardOutput $stdout -RedirectStandardError $stderr
Get-Content -LiteralPath $stdout
if ($process.ExitCode -ne 0) {
Get-Content -LiteralPath $stderr
throw "packaged Connect discovery exited $($process.ExitCode)"
}
if ((Get-Content -Raw -LiteralPath $stderr).Length -ne 0) { throw 'packaged Connect discovery wrote stderr' }
} finally {
Remove-LocalUser -Name $userName -ErrorAction SilentlyContinue
Remove-Item -LiteralPath $stdout,$stderr -Force -ErrorAction SilentlyContinue
}
run: >-
& apps/desktop/scripts/run-packaged-windows-connect-smoke.ps1
-Architecture '${{ matrix.arch }}'
3 changes: 3 additions & 0 deletions apps/desktop/scripts/packaged-layout.d.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const parseEventRecord: (smokeOutput: string, expectedEvent: string) => Record<string, unknown> | undefined;
export const parseEventLayout: (smokeOutput: string, expectedEvent: string) => unknown;
export const assertPackagedLayout: (layout: unknown, platform?: NodeJS.Platform) => void;
17 changes: 17 additions & 0 deletions apps/desktop/scripts/packaged-layout.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
const EXPECTED_WINDOW_SIZE = { width: 1280, height: 820 };
const MINIMUM_WINDOW_SIZE = { width: 880, height: 620 };

export const parseEventRecord = (smokeOutput, expectedEvent) => {
for (const line of smokeOutput.split(/\r?\n/)) {
if (!line.includes(expectedEvent)) continue;
try {
const record = JSON.parse(line.slice(line.indexOf('{')));
if (record.event === expectedEvent) return record;
} catch {
// Ignore non-JSON Chromium output that happens to mention the event name.
}
}
return undefined;
};

export const parseEventLayout = (smokeOutput, expectedEvent) => (
parseEventRecord(smokeOutput, expectedEvent)?.layout
);

const fail = message => {
throw new Error(message);
};
Expand Down
32 changes: 31 additions & 1 deletion apps/desktop/scripts/packaged-layout.test.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { assertPackagedLayout } from './packaged-layout.mjs';
import { assertPackagedLayout, parseEventRecord } from './packaged-layout.mjs';

const bounds = (left, top, width, height) => ({
bottom: top + height,
Expand Down Expand Up @@ -30,6 +30,36 @@ const layout = ({
connectDescription: bounds((viewportWidth - 300) / 2, 270, 300, 18),
});

describe('packaged desktop event parsing', () => {
it('returns the first full record for the exact matching event', () => {
const firstProof = {
event: 'desktop.renderer.mvp_flows.ready',
localProfile: true,
remoteActiveProfile: true,
lifecycleBoundary: true,
connectUiPopulated: true,
};
const output = [
'not JSON: desktop.renderer.mvp_flows.ready',
JSON.stringify({ event: 'desktop.renderer.mvp_flows.ready.extra', localProfile: false }),
JSON.stringify({ event: 'desktop.renderer.other', note: 'desktop.renderer.mvp_flows.ready' }),
JSON.stringify(firstProof),
JSON.stringify({ event: 'desktop.renderer.mvp_flows.ready', localProfile: false }),
].join('\n');

assert.deepEqual(parseEventRecord(output, firstProof.event), firstProof);
});

it('returns undefined when the event is absent', () => {
const output = [
'{malformed',
JSON.stringify({ event: 'desktop.renderer.other' }),
].join('\n');

assert.equal(parseEventRecord(output, 'desktop.renderer.mvp_flows.ready'), undefined);
});
});

describe('packaged desktop layout assertions', () => {
it('retains the exact 1280x820 Linux Xvfb proof', () => {
assert.doesNotThrow(() => assertPackagedLayout(layout(), 'linux'));
Expand Down
Loading
Loading