diff --git a/src/main/pi/titlebar-extension-service.test.ts b/src/main/pi/titlebar-extension-service.test.ts index ea1551a1c25..027b4c0a0c7 100644 --- a/src/main/pi/titlebar-extension-service.test.ts +++ b/src/main/pi/titlebar-extension-service.test.ts @@ -10,7 +10,9 @@ import { readFileSync, readdirSync, rmSync, + statSync, symlinkSync, + utimesSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' @@ -512,6 +514,19 @@ describe('PiTitlebarExtensionService', () => { ) }) + it('leaves current Orca-owned extensions untouched on later spawns', () => { + const svc = new PiTitlebarExtensionService() + svc.buildPtyEnv('pty-current-1', piHome, 'pi') + const installed = ['orca-titlebar-spinner.ts', 'orca-prefill.ts', 'orca-agent-status.ts'].map( + (name) => join(piHome, 'extensions', name) + ) + installed.forEach((path) => utimesSync(path, 0, 0)) + + svc.buildPtyEnv('pty-current-2', piHome, 'pi') + + expect(installed.map((path) => statSync(path).mtimeMs)).toEqual([0, 0, 0]) + }) + it("does not overwrite a user's same-named Orca extension file", () => { const userStatusExtension = 'user-owned status extension' writeFileSync(join(piHome, 'extensions', 'orca-agent-status.ts'), userStatusExtension, 'utf-8') diff --git a/src/main/pi/titlebar-extension-service.ts b/src/main/pi/titlebar-extension-service.ts index 6d1b42060fc..d29701eee1a 100644 --- a/src/main/pi/titlebar-extension-service.ts +++ b/src/main/pi/titlebar-extension-service.ts @@ -87,16 +87,17 @@ export class PiTitlebarExtensionService { safeRemoveOverlay(overlayDir, this.getOverlayRoot(kind)) } - private canOverwriteManagedExtension(path: string): boolean { - try { - return readFileSync(path, 'utf8').includes(ORCA_MANAGED_EXTENSION_MARKER) - } catch { - return true - } - } - private writeManagedExtension(path: string, source: string): ManagedExtensionWriteResult { - if (existsSync(path) && !this.canOverwriteManagedExtension(path)) { + let installed: string | undefined + try { + installed = readFileSync(path, 'utf8') + } catch { + installed = undefined + } + if (installed === source) { + return 'written' + } + if (installed !== undefined && !installed.includes(ORCA_MANAGED_EXTENSION_MARKER)) { return 'skipped-user-owned' }