Files
open-design/apps
Marc ChanandGitHub 18273c01b8 fix(packaged): recover from stale web sidecars (#7279)
* fix(packaged): recover from stale web sidecars

* fix(packaged): stop stamped web owner before socket takeover

Unlinking only the unresponsive web socket left the old Next process
alive. Its later JsonIpcServer.close() could delete the replacement
pathname. Stop the stamped owner through platform primitives first.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(packaged): strip handoff parent pid and skip unsafe web unlink

Strip OD_TOOLS_DEV_PARENT_PID from the legacy payload desktop spawn
environment so the replacement does not exit after waiting for the
outer PID. Skip web socket unlink when a stamped owner is still
running after stop.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(packaged): skip web unlink when process discovery fails

listProcessSnapshots returns [] on enumeration failure, so an empty
table is not proof that no stamped owner exists. Leave the live socket
in place unless discovery succeeded and every matched owner is gone.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(daemon): hold parent monitor until handoff journal commits

Packaged daemons now exit when the outer Electron dies. Desktop
SHUTDOWN acks before asynchronously exiting, so the parent can
disappear while armed handoff, attempt, and runtime writes are
still pending. Hold the parent-death exit across that window.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(daemon): defer SHUTDOWN until handoff journal commits

Packaged beforeShutdown still sends sidecar SHUTDOWN after desktop
acks, and that path ignored the parent-monitor hold. Wait for the
same release before exiting so handoff.json, attempts.json, and
runtime.json can finish.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(daemon): defer SIGTERM until handoff journal commits

Packaged closeManagedChild waits five seconds then stopProcesses()
sends SIGTERM. That handler still exited immediately and could cut
off the held journal writes. Route signal shutdown through the same
hold as SHUTDOWN.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(daemon): hold parent monitor before payload spawn

A crash after the replacement emits spawn but before the journal hold
lets the parent monitor exit the daemon while handoff.json is still
prepared. Acquire the hold before spawn and release it on failure.

Generated-By: looper 0.12.0 (runner=fixer, agent=opencode)

* fix(packaged): wait for deferred handoff shutdown before SIGKILL

Daemon SHUTDOWN now reports deferred:true while the handoff journal hold
is active. closeManagedChild then waits a bounded 30s for self-exit
before stopProcesses, so SIGKILL cannot cut off the three sequential
journal writes. A POSIX regression exercises the real stopProcesses
path and checks all three files commit before forcedPids.
2026-08-24 09:31:54 +00:00
..