opensteer 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +158 -165
  2. package/dist/{chunk-UM2Q4JD2.js → chunk-7D45QUZ3.js} +5 -7
  3. package/dist/chunk-7D45QUZ3.js.map +1 -0
  4. package/dist/{chunk-GREXSYNC.js → chunk-7LQL5YUR.js} +578 -224
  5. package/dist/chunk-7LQL5YUR.js.map +1 -0
  6. package/dist/{chunk-2TIVULZY.js → chunk-GSCQQKZZ.js} +53 -9
  7. package/dist/chunk-GSCQQKZZ.js.map +1 -0
  8. package/dist/{chunk-BMPUL66S.js → chunk-T5P2QGZ3.js} +58 -53
  9. package/dist/chunk-T5P2QGZ3.js.map +1 -0
  10. package/dist/{chunk-FIMNKEG5.js → chunk-ZRF7WMS3.js} +4 -4
  11. package/dist/{chunk-FIMNKEG5.js.map → chunk-ZRF7WMS3.js.map} +1 -1
  12. package/dist/cli/bin.cjs +707 -278
  13. package/dist/cli/bin.cjs.map +1 -1
  14. package/dist/cli/bin.js +30 -34
  15. package/dist/cli/bin.js.map +1 -1
  16. package/dist/index.cjs +733 -473
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +25 -460
  19. package/dist/index.d.ts +25 -460
  20. package/dist/index.js +4 -5
  21. package/dist/local-view/serve-entry.cjs +106 -57
  22. package/dist/local-view/serve-entry.cjs.map +1 -1
  23. package/dist/local-view/serve-entry.js +2 -2
  24. package/dist/opensteer-T2JENADR.js +6 -0
  25. package/dist/{opensteer-IBDPRIEX.js.map → opensteer-T2JENADR.js.map} +1 -1
  26. package/dist/{session-control-IFE3IPS3.js → session-control-M3JD7ZKA.js} +4 -4
  27. package/dist/{session-control-IFE3IPS3.js.map → session-control-M3JD7ZKA.js.map} +1 -1
  28. package/package.json +6 -6
  29. package/skills/opensteer/SKILL.md +134 -95
  30. package/skills/recorder/SKILL.md +43 -48
  31. package/dist/chunk-2TIVULZY.js.map +0 -1
  32. package/dist/chunk-BMPUL66S.js.map +0 -1
  33. package/dist/chunk-GREXSYNC.js.map +0 -1
  34. package/dist/chunk-KCINASQC.js +0 -3
  35. package/dist/chunk-KCINASQC.js.map +0 -1
  36. package/dist/chunk-UM2Q4JD2.js.map +0 -1
  37. package/dist/opensteer-IBDPRIEX.js +0 -6
  38. package/skills/recorder/references/recorder-reference.md +0 -71
@@ -67,32 +67,33 @@ var BROWSER_BRANDS = [
67
67
  }
68
68
  },
69
69
  {
70
- id: "chromium",
71
- displayName: "Chromium",
70
+ id: "edge",
71
+ displayName: "Microsoft Edge",
72
72
  darwin: {
73
- executableCandidates: ["/Applications/Chromium.app/Contents/MacOS/Chromium"],
74
- userDataDir: "~/Library/Application Support/Chromium",
75
- bundleId: "org.chromium.Chromium",
76
- processNames: ["/Applications/Chromium.app/Contents/MacOS/Chromium"]
73
+ executableCandidates: ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"],
74
+ userDataDir: "~/Library/Application Support/Microsoft Edge",
75
+ bundleId: "com.microsoft.edgemac",
76
+ processNames: ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"]
77
77
  },
78
78
  win32: {
79
79
  executableCandidates: [
80
- join(WINDOWS_PROGRAM_FILES, "Chromium", "Application", "chrome.exe"),
81
- join(WINDOWS_PROGRAM_FILES_X86, "Chromium", "Application", "chrome.exe"),
82
- join("~", "AppData", "Local", "Chromium", "Application", "chrome.exe")
80
+ join(WINDOWS_PROGRAM_FILES, "Microsoft", "Edge", "Application", "msedge.exe"),
81
+ join(WINDOWS_PROGRAM_FILES_X86, "Microsoft", "Edge", "Application", "msedge.exe"),
82
+ join("~", "AppData", "Local", "Microsoft", "Edge", "Application", "msedge.exe")
83
83
  ],
84
- userDataDir: "~/AppData/Local/Chromium/User Data",
85
- processNames: ["/chromium/application/chrome.exe"]
84
+ userDataDir: "~/AppData/Local/Microsoft/Edge/User Data",
85
+ processNames: ["/microsoft/edge/application/msedge.exe"]
86
86
  },
87
87
  linux: {
88
88
  executableCandidates: [
89
- "/usr/bin/chromium",
90
- "/usr/bin/chromium-browser",
91
- resolveBinaryFromPath("chromium"),
92
- resolveBinaryFromPath("chromium-browser")
89
+ "/usr/bin/microsoft-edge",
90
+ "/usr/bin/microsoft-edge-stable",
91
+ "/opt/microsoft/msedge/msedge",
92
+ resolveBinaryFromPath("microsoft-edge"),
93
+ resolveBinaryFromPath("microsoft-edge-stable")
93
94
  ],
94
- userDataDir: "~/.config/chromium",
95
- processNames: ["/chromium", "/chromium-browser"]
95
+ userDataDir: "~/.config/microsoft-edge",
96
+ processNames: ["/microsoft-edge", "/microsoft-edge-stable", "/opt/microsoft/msedge/msedge"]
96
97
  }
97
98
  },
98
99
  {
@@ -129,36 +130,6 @@ var BROWSER_BRANDS = [
129
130
  processNames: ["/brave-browser", "/opt/brave.com/brave/brave-browser"]
130
131
  }
131
132
  },
132
- {
133
- id: "edge",
134
- displayName: "Microsoft Edge",
135
- darwin: {
136
- executableCandidates: ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"],
137
- userDataDir: "~/Library/Application Support/Microsoft Edge",
138
- bundleId: "com.microsoft.edgemac",
139
- processNames: ["/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"]
140
- },
141
- win32: {
142
- executableCandidates: [
143
- join(WINDOWS_PROGRAM_FILES, "Microsoft", "Edge", "Application", "msedge.exe"),
144
- join(WINDOWS_PROGRAM_FILES_X86, "Microsoft", "Edge", "Application", "msedge.exe"),
145
- join("~", "AppData", "Local", "Microsoft", "Edge", "Application", "msedge.exe")
146
- ],
147
- userDataDir: "~/AppData/Local/Microsoft/Edge/User Data",
148
- processNames: ["/microsoft/edge/application/msedge.exe"]
149
- },
150
- linux: {
151
- executableCandidates: [
152
- "/usr/bin/microsoft-edge",
153
- "/usr/bin/microsoft-edge-stable",
154
- "/opt/microsoft/msedge/msedge",
155
- resolveBinaryFromPath("microsoft-edge"),
156
- resolveBinaryFromPath("microsoft-edge-stable")
157
- ],
158
- userDataDir: "~/.config/microsoft-edge",
159
- processNames: ["/microsoft-edge", "/microsoft-edge-stable", "/opt/microsoft/msedge/msedge"]
160
- }
161
- },
162
133
  {
163
134
  id: "vivaldi",
164
135
  displayName: "Vivaldi",
@@ -197,6 +168,35 @@ var BROWSER_BRANDS = [
197
168
  userDataDir: "~/Library/Application Support/net.imput.helium",
198
169
  processNames: ["/Applications/Helium.app/Contents/MacOS/Helium"]
199
170
  }
171
+ },
172
+ {
173
+ id: "chromium",
174
+ displayName: "Chromium",
175
+ darwin: {
176
+ executableCandidates: ["/Applications/Chromium.app/Contents/MacOS/Chromium"],
177
+ userDataDir: "~/Library/Application Support/Chromium",
178
+ bundleId: "org.chromium.Chromium",
179
+ processNames: ["/Applications/Chromium.app/Contents/MacOS/Chromium"]
180
+ },
181
+ win32: {
182
+ executableCandidates: [
183
+ join(WINDOWS_PROGRAM_FILES, "Chromium", "Application", "chrome.exe"),
184
+ join(WINDOWS_PROGRAM_FILES_X86, "Chromium", "Application", "chrome.exe"),
185
+ join("~", "AppData", "Local", "Chromium", "Application", "chrome.exe")
186
+ ],
187
+ userDataDir: "~/AppData/Local/Chromium/User Data",
188
+ processNames: ["/chromium/application/chrome.exe"]
189
+ },
190
+ linux: {
191
+ executableCandidates: [
192
+ "/usr/bin/chromium",
193
+ "/usr/bin/chromium-browser",
194
+ resolveBinaryFromPath("chromium"),
195
+ resolveBinaryFromPath("chromium-browser")
196
+ ],
197
+ userDataDir: "~/.config/chromium",
198
+ processNames: ["/chromium", "/chromium-browser"]
199
+ }
200
200
  }
201
201
  ];
202
202
  function getBrowserBrand(id) {
@@ -279,10 +279,15 @@ function resolveChromeExecutablePath(executablePath) {
279
279
  }
280
280
  return resolvedPath;
281
281
  }
282
- for (const installation of detectLocalChromeInstallations()) {
283
- if (installation.executablePath) {
284
- return installation.executablePath;
285
- }
282
+ const chromeInstallation = detectLocalChromeInstallations().find(
283
+ (installation) => installation.brand === "chrome" && installation.executablePath !== null
284
+ );
285
+ if (chromeInstallation?.executablePath) {
286
+ return chromeInstallation.executablePath;
287
+ }
288
+ const brandedInstallation = detectInstalledBrowserBrands()[0];
289
+ if (brandedInstallation) {
290
+ return brandedInstallation.executablePath;
286
291
  }
287
292
  throw new Error(
288
293
  "Could not find a Chrome or Chromium executable. Pass browser.executablePath or --executable-path."
@@ -1166,5 +1171,5 @@ function isPersistedLocalViewServiceState(value) {
1166
1171
  }
1167
1172
 
1168
1173
  export { CURRENT_PROCESS_OWNER, OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT, OPENSTEER_LOCAL_VIEW_SERVICE_VERSION, OpensteerAttachAmbiguousError, __require, buildLocalViewSessionId, canonicalJsonString, clearLocalViewServiceState, clearPersistedSessionRecord, createLocalViewSessionManifest, deleteLocalViewSessionManifest, detectInstalledBrowserBrands, discoverLocalCdpBrowsers, encodePathSegment, ensureDirectory, expandHome, filePathToUri, getBrowserBrand, getLocalViewServiceStateLiveness, getProcessLiveness, inspectCdpEndpoint, isAlreadyExistsError, isLocalViewServiceStateLive, isProcessRunning, joinStoragePath, listJsonFiles, listLocalChromeProfiles, listLocalViewSessionManifests, normalizeNonEmptyString, normalizeTimestamp, parseProcessOwner, pathExists, processOwnersEqual, readBinaryFile, readDevToolsActivePort, readJsonFile, readLocalViewServiceState, readLocalViewSessionManifest, readPersistedCloudSessionRecord, readPersistedLocalBrowserSessionRecord, readPersistedSessionRecord, resolveBrandUserDataDir, resolveChromeExecutablePath, resolveCloudSessionRecordPath, resolveLiveSessionRecordPath, resolveLocalSessionRecordPath, resolveLocalViewPreferencesPath, resolveLocalViewServiceLockDir, resolveStoragePath, selectAttachBrowserCandidate, sha256Hex, toCanonicalJsonValue, withFilesystemLock, writeBufferIfMissing, writeJsonFileAtomic, writeJsonFileExclusive, writeLocalViewServiceState, writeLocalViewSessionManifest, writePersistedSessionRecord };
1169
- //# sourceMappingURL=chunk-BMPUL66S.js.map
1170
- //# sourceMappingURL=chunk-BMPUL66S.js.map
1174
+ //# sourceMappingURL=chunk-T5P2QGZ3.js.map
1175
+ //# sourceMappingURL=chunk-T5P2QGZ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/local-browser/browser-brands.ts","../src/local-browser/chrome-discovery.ts","../src/local-browser/cdp-discovery.ts","../../runtime-core/src/json.ts","../../runtime-core/src/internal/filesystem.ts","../src/live-session.ts","../src/local-view/runtime-dir.ts","../src/local-view/session-manifest.ts","../src/local-browser/process-owner.ts","../src/local-view/service-state.ts"],"names":["join","existsSync","resolve","execFileSync","path","rm","homedir","createHash","PROCESS_LIST_MAX_BUFFER_BYTES","PS_COMMAND_ENV","readFile"],"mappings":"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","file":"chunk-T5P2QGZ3.js","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nimport { expandHome, firstExistingPath, resolveBinaryFromPath } from \"./chrome-discovery.js\";\n\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst WINDOWS_PROGRAM_FILES = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\nconst WINDOWS_PROGRAM_FILES_X86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n\nexport type BrowserBrandId =\n | \"chrome\"\n | \"chrome-canary\"\n | \"chromium\"\n | \"brave\"\n | \"edge\"\n | \"vivaldi\"\n | \"helium\";\n\nexport interface BrowserBrandPlatformConfig {\n readonly executableCandidates: readonly (string | null)[];\n readonly userDataDir: string;\n readonly bundleId?: string;\n readonly processNames: readonly string[];\n}\n\nexport interface BrowserBrandRecord {\n readonly id: BrowserBrandId;\n readonly displayName: string;\n readonly darwin?: BrowserBrandPlatformConfig;\n readonly win32?: BrowserBrandPlatformConfig;\n readonly linux?: BrowserBrandPlatformConfig;\n}\n\nexport interface InstalledBrowserBrand {\n readonly brand: BrowserBrandRecord;\n readonly brandId: BrowserBrandId;\n readonly displayName: string;\n readonly executablePath: string;\n readonly userDataDir: string;\n}\n\nconst BROWSER_BRANDS: readonly BrowserBrandRecord[] = [\n {\n id: \"chrome\",\n displayName: \"Google Chrome\",\n darwin: {\n executableCandidates: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n userDataDir: \"~/Library/Application Support/Google/Chrome\",\n bundleId: \"com.google.Chrome\",\n processNames: [\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome/User Data\",\n processNames: [\"/google/chrome/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n \"/opt/google/chrome/chrome\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ],\n userDataDir: \"~/.config/google-chrome\",\n processNames: [\"/google-chrome\", \"/google-chrome-stable\", \"/opt/google/chrome/chrome\"],\n },\n },\n {\n id: \"chrome-canary\",\n displayName: \"Google Chrome Canary\",\n darwin: {\n executableCandidates: [\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ],\n userDataDir: \"~/Library/Application Support/Google/Chrome Canary\",\n bundleId: \"com.google.Chrome.canary\",\n processNames: [\"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"],\n },\n win32: {\n executableCandidates: [\n join(\"~\", \"AppData\", \"Local\", \"Google\", \"Chrome SxS\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Google/Chrome SxS/User Data\",\n processNames: [\"/google/chrome sxs/application/chrome.exe\"],\n },\n },\n {\n id: \"edge\",\n displayName: \"Microsoft Edge\",\n darwin: {\n executableCandidates: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n userDataDir: \"~/Library/Application Support/Microsoft Edge\",\n bundleId: \"com.microsoft.edgemac\",\n processNames: [\"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Microsoft/Edge/User Data\",\n processNames: [\"/microsoft/edge/application/msedge.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/microsoft-edge\",\n \"/usr/bin/microsoft-edge-stable\",\n \"/opt/microsoft/msedge/msedge\",\n resolveBinaryFromPath(\"microsoft-edge\"),\n resolveBinaryFromPath(\"microsoft-edge-stable\"),\n ],\n userDataDir: \"~/.config/microsoft-edge\",\n processNames: [\"/microsoft-edge\", \"/microsoft-edge-stable\", \"/opt/microsoft/msedge/msedge\"],\n },\n },\n {\n id: \"brave\",\n displayName: \"Brave Browser\",\n darwin: {\n executableCandidates: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n userDataDir: \"~/Library/Application Support/BraveSoftware/Brave-Browser\",\n bundleId: \"com.brave.Browser\",\n processNames: [\"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n join(\n WINDOWS_PROGRAM_FILES_X86,\n \"BraveSoftware\",\n \"Brave-Browser\",\n \"Application\",\n \"brave.exe\",\n ),\n join(\"~\", \"AppData\", \"Local\", \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n ],\n userDataDir: \"~/AppData/Local/BraveSoftware/Brave-Browser/User Data\",\n processNames: [\"/bravesoftware/brave-browser/application/brave.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/brave-browser\",\n \"/opt/brave.com/brave/brave-browser\",\n resolveBinaryFromPath(\"brave-browser\"),\n ],\n userDataDir: \"~/.config/BraveSoftware/Brave-Browser\",\n processNames: [\"/brave-browser\", \"/opt/brave.com/brave/brave-browser\"],\n },\n },\n {\n id: \"vivaldi\",\n displayName: \"Vivaldi\",\n darwin: {\n executableCandidates: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n userDataDir: \"~/Library/Application Support/Vivaldi\",\n bundleId: \"com.vivaldi.Vivaldi\",\n processNames: [\"/Applications/Vivaldi.app/Contents/MacOS/Vivaldi\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Vivaldi\", \"Application\", \"vivaldi.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Vivaldi/User Data\",\n processNames: [\"/vivaldi/application/vivaldi.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/vivaldi\",\n \"/usr/bin/vivaldi-stable\",\n \"/opt/vivaldi/vivaldi\",\n resolveBinaryFromPath(\"vivaldi\"),\n resolveBinaryFromPath(\"vivaldi-stable\"),\n ],\n userDataDir: \"~/.config/vivaldi\",\n processNames: [\"/vivaldi\", \"/vivaldi-stable\", \"/opt/vivaldi/vivaldi\"],\n },\n },\n {\n id: \"helium\",\n displayName: \"Helium\",\n darwin: {\n executableCandidates: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n userDataDir: \"~/Library/Application Support/net.imput.helium\",\n processNames: [\"/Applications/Helium.app/Contents/MacOS/Helium\"],\n },\n },\n {\n id: \"chromium\",\n displayName: \"Chromium\",\n darwin: {\n executableCandidates: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n userDataDir: \"~/Library/Application Support/Chromium\",\n bundleId: \"org.chromium.Chromium\",\n processNames: [\"/Applications/Chromium.app/Contents/MacOS/Chromium\"],\n },\n win32: {\n executableCandidates: [\n join(WINDOWS_PROGRAM_FILES, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(WINDOWS_PROGRAM_FILES_X86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(\"~\", \"AppData\", \"Local\", \"Chromium\", \"Application\", \"chrome.exe\"),\n ],\n userDataDir: \"~/AppData/Local/Chromium/User Data\",\n processNames: [\"/chromium/application/chrome.exe\"],\n },\n linux: {\n executableCandidates: [\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ],\n userDataDir: \"~/.config/chromium\",\n processNames: [\"/chromium\", \"/chromium-browser\"],\n },\n },\n] as const;\n\nexport function getAllBrowserBrands(): readonly BrowserBrandRecord[] {\n return BROWSER_BRANDS;\n}\n\nexport function getBrowserBrand(id: BrowserBrandId): BrowserBrandRecord {\n const brand = BROWSER_BRANDS.find((candidate) => candidate.id === id);\n if (!brand) {\n throw new Error(`Unknown browser brand \"${id}\".`);\n }\n return brand;\n}\n\nexport function resolveBrandPlatformConfig(\n brand: BrowserBrandRecord,\n platform: NodeJS.Platform = process.platform,\n): BrowserBrandPlatformConfig | undefined {\n if (platform === \"darwin\") {\n return brand.darwin;\n }\n if (platform === \"win32\") {\n return brand.win32;\n }\n if (platform === \"linux\") {\n return brand.linux;\n }\n return undefined;\n}\n\nexport function detectInstalledBrowserBrands(): readonly InstalledBrowserBrand[] {\n const installations: InstalledBrowserBrand[] = [];\n\n for (const brand of BROWSER_BRANDS) {\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n continue;\n }\n\n const executablePath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!executablePath) {\n continue;\n }\n\n installations.push({\n brand,\n brandId: brand.id,\n displayName: brand.displayName,\n executablePath,\n userDataDir: resolve(expandHome(platformConfig.userDataDir)),\n });\n }\n\n return installations;\n}\n\nexport function resolveBrandExecutablePath(\n brand: BrowserBrandRecord,\n explicitPath?: string,\n): string {\n if (explicitPath !== undefined) {\n const resolvedPath = resolve(expandHome(explicitPath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`${brand.displayName} executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n const resolvedPath = firstExistingPath(\n resolveExecutableCandidates(platformConfig.executableCandidates),\n );\n if (!resolvedPath) {\n throw new Error(\n `Could not find a ${brand.displayName} executable. Pass --executable-path or browser.executablePath.`,\n );\n }\n return resolvedPath;\n}\n\nexport function resolveBrandUserDataDir(brand: BrowserBrandRecord, explicitDir?: string): string {\n if (explicitDir !== undefined) {\n return resolve(expandHome(explicitDir));\n }\n\n const platformConfig = resolveBrandPlatformConfig(brand);\n if (!platformConfig) {\n throw new Error(`${brand.displayName} is not supported on ${process.platform}.`);\n }\n\n return resolve(expandHome(platformConfig.userDataDir));\n}\n\nexport function isBrandProcess(brand: BrowserBrandRecord, commandLine: string): boolean {\n const normalizedCommand = normalizeCommand(commandLine);\n if (!normalizedCommand) {\n return false;\n }\n if (normalizedCommand.includes(\"crashpad_handler\")) {\n return false;\n }\n if (/\\s--type=/.test(normalizedCommand)) {\n return false;\n }\n\n return getBrandProcessMarkers(brand).some((marker) => normalizedCommand.includes(marker));\n}\n\nexport function findBrandProcess(brand: BrowserBrandRecord): {\n readonly pid: number;\n} | null {\n for (const processEntry of listProcesses()) {\n if (isBrandProcess(brand, processEntry.commandLine)) {\n return { pid: processEntry.pid };\n }\n }\n\n return null;\n}\n\nfunction getBrandProcessMarkers(brand: BrowserBrandRecord): readonly string[] {\n const markers = new Set<string>();\n\n for (const config of [brand.darwin, brand.win32, brand.linux]) {\n if (!config) {\n continue;\n }\n\n for (const processName of config.processNames) {\n const normalized = normalizeCommand(processName);\n if (normalized) {\n markers.add(normalized);\n }\n }\n\n for (const candidate of config.executableCandidates) {\n if (!candidate) {\n continue;\n }\n\n const normalized = normalizeCommand(resolve(expandHome(candidate)));\n if (normalized) {\n markers.add(normalized);\n }\n }\n }\n\n return [...markers];\n}\n\nfunction resolveExecutableCandidates(\n candidates: readonly (string | null)[],\n): readonly (string | null)[] {\n return candidates.map((candidate) => (candidate ? resolve(expandHome(candidate)) : null));\n}\n\nfunction listProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n if (process.platform === \"win32\") {\n return listWindowsProcesses();\n }\n return listUnixProcesses();\n}\n\nfunction listUnixProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\"ps\", [\"-A\", \"-o\", \"pid=,command=\"], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => {\n const match = /^(\\d+)\\s+(.*)$/.exec(line);\n if (!match) {\n return null;\n }\n\n const pid = Number.parseInt(match[1] ?? \"\", 10);\n const commandLine = match[2]?.trim() ?? \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction listWindowsProcesses(): readonly {\n readonly pid: number;\n readonly commandLine: string;\n}[] {\n try {\n const output = execFileSync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n \"Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine | ConvertTo-Json -Compress\",\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n if (!output) {\n return [];\n }\n\n const parsed = JSON.parse(output) as\n | {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }\n | readonly {\n readonly ProcessId?: unknown;\n readonly CommandLine?: unknown;\n }[];\n const records = Array.isArray(parsed) ? parsed : [parsed];\n\n return records\n .map((record) => {\n const pid = Number(record.ProcessId);\n const commandLine = typeof record.CommandLine === \"string\" ? record.CommandLine.trim() : \"\";\n if (!Number.isInteger(pid) || pid <= 0 || commandLine.length === 0) {\n return null;\n }\n\n return {\n pid,\n commandLine,\n };\n })\n .filter(\n (entry): entry is { readonly pid: number; readonly commandLine: string } => entry !== null,\n )\n .sort((left, right) => left.pid - right.pid);\n } catch {\n return [];\n }\n}\n\nfunction normalizeCommand(value: string): string {\n return value.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\n\nimport { detectInstalledBrowserBrands } from \"./browser-brands.js\";\nimport type {\n LocalBrowserInstallation,\n LocalChromeInstallation,\n LocalChromeProfileDescriptor,\n} from \"./types.js\";\n\nexport function expandHome(value: string): string {\n if (value === \"~\" || value.startsWith(\"~/\")) {\n return join(homedir(), value.slice(1));\n }\n return value;\n}\n\nexport function resolveChromeUserDataDir(userDataDir: string | undefined): string {\n if (userDataDir !== undefined) {\n return resolve(expandHome(userDataDir));\n }\n\n const installation = detectLocalChromeInstallations().find(\n (candidate) =>\n existsSync(join(candidate.userDataDir, \"Local State\")) || candidate.executablePath !== null,\n );\n if (!installation) {\n throw new Error(\"Could not find a local Chrome or Chromium profile directory.\");\n }\n return installation.userDataDir;\n}\n\nexport function resolveChromeExecutablePath(executablePath: string | undefined): string {\n if (executablePath !== undefined) {\n const resolvedPath = resolve(expandHome(executablePath));\n if (!existsSync(resolvedPath)) {\n throw new Error(`Chrome executable was not found at \"${resolvedPath}\".`);\n }\n return resolvedPath;\n }\n\n const chromeInstallation = detectLocalChromeInstallations().find(\n (installation) => installation.brand === \"chrome\" && installation.executablePath !== null,\n );\n if (chromeInstallation?.executablePath) {\n return chromeInstallation.executablePath;\n }\n\n const brandedInstallation = detectInstalledBrowserBrands()[0];\n if (brandedInstallation) {\n return brandedInstallation.executablePath;\n }\n\n throw new Error(\n \"Could not find a Chrome or Chromium executable. Pass browser.executablePath or --executable-path.\",\n );\n}\n\nfunction detectLocalChromeInstallations(): readonly LocalChromeInstallation[] {\n if (process.platform === \"darwin\") {\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n ]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\"/Applications/Chromium.app/Contents/MacOS/Chromium\"]),\n userDataDir: join(homedir(), \"Library\", \"Application Support\", \"Chromium\"),\n },\n ];\n }\n\n if (process.platform === \"win32\") {\n const programFiles = process.env.PROGRAMFILES ?? \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"PROGRAMFILES(X86)\"] ?? \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\");\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n join(programFiles, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n join(programFiles, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Chromium\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Chromium\", \"Application\", \"chrome.exe\"),\n ]),\n userDataDir: join(localAppData, \"Chromium\", \"User Data\"),\n },\n ];\n }\n\n return [\n {\n brand: \"chrome\",\n executablePath: firstExistingPath([\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n resolveBinaryFromPath(\"google-chrome\"),\n resolveBinaryFromPath(\"google-chrome-stable\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"google-chrome\"),\n },\n {\n brand: \"chromium\",\n executablePath: firstExistingPath([\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n resolveBinaryFromPath(\"chromium\"),\n resolveBinaryFromPath(\"chromium-browser\"),\n ]),\n userDataDir: join(homedir(), \".config\", \"chromium\"),\n },\n ];\n}\n\nexport function detectLocalBrowserInstallations(): readonly LocalBrowserInstallation[] {\n return detectInstalledBrowserBrands().map((installation) => ({\n brand: installation.brandId,\n executablePath: installation.executablePath,\n userDataDir: installation.userDataDir,\n }));\n}\n\nexport function listLocalChromeProfiles(\n userDataDir = resolveChromeUserDataDir(undefined),\n): readonly LocalChromeProfileDescriptor[] {\n const resolvedUserDataDir = resolve(expandHome(userDataDir));\n const localStatePath = join(resolvedUserDataDir, \"Local State\");\n if (!existsSync(localStatePath)) {\n return [];\n }\n\n try {\n const raw = JSON.parse(readFileSync(localStatePath, \"utf8\")) as {\n readonly profile?: {\n readonly info_cache?: Record<string, unknown>;\n };\n };\n const infoCache = raw.profile?.info_cache;\n if (!infoCache || typeof infoCache !== \"object\") {\n return [];\n }\n\n return Object.entries(infoCache)\n .map(([directory, info]) => {\n const record =\n info && typeof info === \"object\" && !Array.isArray(info)\n ? (info as Record<string, unknown>)\n : {};\n const name =\n typeof record.name === \"string\" && record.name.trim().length > 0\n ? record.name.trim()\n : directory || basename(directory);\n return {\n directory,\n name,\n userDataDir: resolvedUserDataDir,\n };\n })\n .filter((profile) => profile.directory.trim().length > 0)\n .sort((left, right) => left.directory.localeCompare(right.directory));\n } catch {\n return [];\n }\n}\n\nexport function readDevToolsActivePort(userDataDir: string): {\n readonly port: number;\n readonly webSocketPath: string;\n} | null {\n const devToolsPath = join(userDataDir, \"DevToolsActivePort\");\n if (!existsSync(devToolsPath)) {\n return null;\n }\n\n try {\n const lines = readFileSync(devToolsPath, \"utf8\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const port = Number.parseInt(lines[0] ?? \"\", 10);\n if (!Number.isInteger(port) || port <= 0) {\n return null;\n }\n\n return {\n port,\n webSocketPath: lines[1] ?? \"/devtools/browser\",\n };\n } catch {\n return null;\n }\n}\n\nexport function firstExistingPath(\n candidates: readonly (string | null | undefined)[],\n): string | null {\n for (const candidate of candidates) {\n if (candidate && existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nexport function resolveBinaryFromPath(name: string): string | null {\n try {\n const output = execFileSync(\"which\", [name], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return output.length > 0 ? output : null;\n } catch {\n return null;\n }\n}\n","import { detectLocalBrowserInstallations, readDevToolsActivePort } from \"./chrome-discovery.js\";\nimport type { InspectedCdpEndpoint, LocalCdpBrowserCandidate } from \"./types.js\";\n\nconst DEFAULT_DISCOVERY_TIMEOUT_MS = 2_000;\nconst DISCOVERY_FALLBACK_PORT = 9222;\n\ninterface InspectCdpEndpointInput {\n readonly endpoint: string;\n readonly headers?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n}\n\ninterface ProbeCdpEndpointInput extends InspectCdpEndpointInput {\n readonly fallbackBrowserWebSocketPath?: string;\n}\n\ninterface NormalizedProbeTarget {\n readonly fallbackBrowserWebSocketUrl?: string;\n readonly httpUrl: URL;\n}\n\ninterface CdpVersionResponse {\n readonly Browser?: string;\n readonly \"Protocol-Version\"?: string;\n readonly webSocketDebuggerUrl?: string;\n}\n\nexport class OpensteerAttachAmbiguousError extends Error {\n readonly code = \"attach-ambiguous\";\n\n constructor(readonly candidates: readonly LocalCdpBrowserCandidate[]) {\n super(\n \"Multiple running Chromium DevTools endpoints were discovered. Specify the desired endpoint explicitly.\",\n );\n this.name = \"OpensteerAttachAmbiguousError\";\n }\n}\n\nexport async function inspectCdpEndpoint(\n input: InspectCdpEndpointInput,\n): Promise<InspectedCdpEndpoint> {\n const inspected = await probeCdpEndpoint(input);\n if (inspected === null) {\n throw new Error(`Could not inspect CDP endpoint \"${input.endpoint}\".`);\n }\n return inspected;\n}\n\nexport async function discoverLocalCdpBrowsers(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<readonly LocalCdpBrowserCandidate[]> {\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n const candidates: LocalCdpBrowserCandidate[] = [];\n\n for (const installation of detectLocalBrowserInstallations()) {\n const activePort = readDevToolsActivePort(installation.userDataDir);\n if (!activePort) {\n continue;\n }\n\n const inspected = await probeCdpEndpoint({\n endpoint: `http://127.0.0.1:${String(activePort.port)}`,\n timeoutMs,\n fallbackBrowserWebSocketPath: activePort.webSocketPath,\n });\n if (inspected === null) {\n continue;\n }\n\n candidates.push({\n ...inspected,\n source: \"devtools-active-port\",\n installationBrand: installation.brand,\n userDataDir: installation.userDataDir,\n });\n }\n\n const fallbackCandidate = await probeCdpEndpoint({\n endpoint: String(DISCOVERY_FALLBACK_PORT),\n timeoutMs,\n });\n if (fallbackCandidate !== null) {\n candidates.push({\n ...fallbackCandidate,\n source: \"fallback-port\",\n });\n }\n\n return dedupeAndSortCandidates(candidates);\n}\n\nexport async function selectAttachBrowserCandidate(\n input: {\n readonly timeoutMs?: number;\n } = {},\n): Promise<LocalCdpBrowserCandidate> {\n const candidates = await discoverLocalCdpBrowsers(input);\n if (candidates.length === 0) {\n throw new Error(\n \"No running Chromium browser instance found. Enable remote debugging or specify an attach endpoint explicitly.\",\n );\n }\n\n const highestPriority = Math.max(...candidates.map(getAttachCandidatePriority));\n const winners = candidates.filter(\n (candidate) => getAttachCandidatePriority(candidate) === highestPriority,\n );\n if (winners.length === 1) {\n return winners[0]!;\n }\n\n throw new OpensteerAttachAmbiguousError(candidates);\n}\n\nasync function probeCdpEndpoint(\n input: ProbeCdpEndpointInput,\n): Promise<InspectedCdpEndpoint | null> {\n const trimmedEndpoint = input.endpoint.trim();\n if (!trimmedEndpoint) {\n return null;\n }\n\n const target = normalizeProbeTarget(trimmedEndpoint);\n const timeoutMs = input.timeoutMs ?? DEFAULT_DISCOVERY_TIMEOUT_MS;\n\n const versionPayload = await fetchJson<CdpVersionResponse>(\n new URL(\"/json/version\", target.httpUrl),\n input.headers,\n timeoutMs,\n );\n if (versionPayload !== null) {\n const payload = versionPayload;\n if (\n typeof payload.webSocketDebuggerUrl === \"string\" &&\n payload.webSocketDebuggerUrl.length > 0\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n payload.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n ...(payload.Browser === undefined ? {} : { browser: payload.Browser }),\n ...(payload[\"Protocol-Version\"] === undefined\n ? {}\n : { protocolVersion: payload[\"Protocol-Version\"] }),\n });\n }\n }\n\n const listPayload = await fetchJson<\n readonly {\n readonly type?: unknown;\n readonly webSocketDebuggerUrl?: unknown;\n }[]\n >(new URL(\"/json/list\", target.httpUrl), input.headers, timeoutMs);\n if (listPayload !== null) {\n const browserTarget =\n listPayload.find((candidate) => candidate.type === \"browser\") ??\n listPayload.find((candidate) => typeof candidate.webSocketDebuggerUrl === \"string\");\n if (typeof browserTarget?.webSocketDebuggerUrl === \"string\") {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: rewriteBrowserWebSocketHost(\n browserTarget.webSocketDebuggerUrl,\n target.httpUrl,\n ),\n httpUrl: target.httpUrl,\n });\n }\n }\n\n if (\n input.fallbackBrowserWebSocketPath !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: buildBrowserWebSocketUrl(\n target.httpUrl,\n input.fallbackBrowserWebSocketPath,\n ),\n httpUrl: target.httpUrl,\n });\n }\n\n if (\n target.fallbackBrowserWebSocketUrl !== undefined &&\n (await isHttpEndpointReachable(target.httpUrl, timeoutMs))\n ) {\n return createInspectedCdpEndpoint({\n browserWebSocketUrl: target.fallbackBrowserWebSocketUrl,\n httpUrl: target.httpUrl,\n });\n }\n\n return null;\n}\n\nfunction dedupeAndSortCandidates(\n candidates: readonly LocalCdpBrowserCandidate[],\n): readonly LocalCdpBrowserCandidate[] {\n const deduped = new Map<string, LocalCdpBrowserCandidate>();\n\n for (const candidate of [...candidates].sort(compareCandidates)) {\n const existing = deduped.get(candidate.endpoint);\n if (!existing || compareCandidates(candidate, existing) < 0) {\n deduped.set(candidate.endpoint, candidate);\n }\n }\n\n return [...deduped.values()].sort(compareCandidates);\n}\n\nfunction compareCandidates(\n left: LocalCdpBrowserCandidate,\n right: LocalCdpBrowserCandidate,\n): number {\n return (\n getAttachCandidatePriority(right) - getAttachCandidatePriority(left) ||\n left.endpoint.localeCompare(right.endpoint) ||\n (left.userDataDir ?? \"\").localeCompare(right.userDataDir ?? \"\")\n );\n}\n\nfunction getAttachCandidatePriority(candidate: LocalCdpBrowserCandidate): number {\n return candidate.source === \"devtools-active-port\" ? 2 : 1;\n}\n\nfunction createInspectedCdpEndpoint(input: {\n readonly browser?: string;\n readonly browserWebSocketUrl: string;\n readonly httpUrl: URL;\n readonly protocolVersion?: string;\n}): InspectedCdpEndpoint {\n const port = readPort(input.httpUrl);\n return {\n endpoint: input.browserWebSocketUrl,\n ...(input.browser === undefined ? {} : { browser: input.browser }),\n ...(input.protocolVersion === undefined ? {} : { protocolVersion: input.protocolVersion }),\n httpUrl: input.httpUrl.toString(),\n ...(port === undefined ? {} : { port }),\n };\n}\n\nfunction normalizeProbeTarget(endpoint: string): NormalizedProbeTarget {\n if (/^\\d+$/.test(endpoint)) {\n return {\n httpUrl: new URL(`http://127.0.0.1:${endpoint}`),\n };\n }\n\n if (endpoint.startsWith(\"ws://\") || endpoint.startsWith(\"wss://\")) {\n const url = new URL(endpoint);\n return {\n fallbackBrowserWebSocketUrl: url.toString(),\n httpUrl: new URL(`${url.protocol === \"wss:\" ? \"https:\" : \"http:\"}//${url.host}`),\n };\n }\n\n try {\n const url =\n endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")\n ? new URL(endpoint)\n : new URL(`http://${endpoint}`);\n return {\n httpUrl: new URL(`${url.protocol}//${url.host}`),\n };\n } catch {\n throw new Error(`Invalid CDP endpoint \"${endpoint}\".`);\n }\n}\n\nasync function fetchJson<T>(\n url: URL,\n headers: Readonly<Record<string, string>> | undefined,\n timeoutMs: number,\n): Promise<T | null> {\n const response = await fetch(url, {\n ...(headers === undefined ? {} : { headers }),\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n if (!response?.ok) {\n return null;\n }\n\n return (await response.json()) as T;\n}\n\nasync function isHttpEndpointReachable(url: URL, timeoutMs: number): Promise<boolean> {\n const response = await fetch(url, {\n signal: AbortSignal.timeout(timeoutMs),\n }).catch(() => null);\n return response !== null;\n}\n\nfunction buildBrowserWebSocketUrl(httpUrl: URL, webSocketPath: string): string {\n const protocol = httpUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return `${protocol}//${httpUrl.host}${normalizeWebSocketPath(webSocketPath)}`;\n}\n\nfunction normalizeWebSocketPath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nfunction rewriteBrowserWebSocketHost(browserWsUrl: string, requestedUrl: URL): string {\n try {\n const parsed = new URL(browserWsUrl);\n parsed.protocol = requestedUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n parsed.hostname = requestedUrl.hostname;\n parsed.port = requestedUrl.port;\n return parsed.toString();\n } catch {\n return browserWsUrl;\n }\n}\n\nfunction readPort(url: URL): number | undefined {\n const port = Number.parseInt(url.port, 10);\n return Number.isInteger(port) && port > 0 ? port : undefined;\n}\n","export type JsonPrimitive = boolean | number | string | null;\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\nexport type JsonArray = readonly JsonValue[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction canonicalizeJsonValue(value: unknown, path: string): JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new TypeError(`${path} must be a finite JSON number`);\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry, index) => canonicalizeJsonValue(entry, `${path}[${index}]`));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(`${path} must be a plain JSON object`);\n }\n\n const sorted = Object.keys(value).sort((left, right) => left.localeCompare(right));\n const result: Record<string, JsonValue> = {};\n\n for (const key of sorted) {\n const entry = value[key];\n if (entry === undefined) {\n throw new TypeError(`${path}.${key} must not be undefined`);\n }\n\n result[key] = canonicalizeJsonValue(entry, `${path}.${key}`);\n }\n\n return result;\n}\n\nexport function toCanonicalJsonValue(value: unknown): JsonValue {\n return canonicalizeJsonValue(value, \"value\");\n}\n\nexport function canonicalJsonString(value: unknown): string {\n return JSON.stringify(toCanonicalJsonValue(value));\n}\n\nexport function stableJsonString(value: unknown): string {\n return `${JSON.stringify(toCanonicalJsonValue(value), null, 2)}\\n`;\n}\n","import { access, mkdir, open, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport { stableJsonString } from \"../json.js\";\n\nconst LOCK_RETRY_DELAYS_MS = [1, 2, 5, 10, 20, 50] as const;\n\nexport function normalizeNonEmptyString(name: string, value: string): string {\n const normalized = value.trim();\n if (normalized.length === 0) {\n throw new TypeError(`${name} must not be empty`);\n }\n\n return normalized;\n}\n\nexport function normalizeTimestamp(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative integer`);\n }\n\n return value;\n}\n\nexport function encodePathSegment(value: string): string {\n return encodeURIComponent(normalizeNonEmptyString(\"path segment\", value));\n}\n\nexport function joinStoragePath(...segments: readonly string[]): string {\n return segments.join(\"/\");\n}\n\nexport function resolveStoragePath(rootPath: string, relativePath: string): string {\n if (path.isAbsolute(relativePath)) {\n throw new TypeError(`storage path ${relativePath} must be relative`);\n }\n\n const segments = relativePath.split(\"/\");\n if (segments.length === 0 || segments.some((segment) => segment.length === 0)) {\n throw new TypeError(`storage path ${relativePath} is invalid`);\n }\n\n for (const segment of segments) {\n if (segment === \".\" || segment === \"..\") {\n throw new TypeError(`storage path ${relativePath} must not contain path traversal`);\n }\n }\n\n return path.join(rootPath, ...segments);\n}\n\nexport async function ensureDirectory(directoryPath: string): Promise<void> {\n await mkdir(directoryPath, { recursive: true });\n}\n\nexport async function pathExists(targetPath: string): Promise<boolean> {\n try {\n await access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n}\n\nexport async function writeJsonFileAtomic(filePath: string, value: unknown): Promise<void> {\n await writeTextFileAtomic(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileAtomic(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const temporaryPath = `${filePath}.${randomUUID()}.tmp`;\n\n await writeFile(temporaryPath, value, \"utf8\");\n await rename(temporaryPath, filePath);\n}\n\nexport async function writeJsonFileExclusive(filePath: string, value: unknown): Promise<void> {\n await writeTextFileExclusive(filePath, stableJsonString(value));\n}\n\nasync function writeTextFileExclusive(filePath: string, value: string): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n const handle = await open(filePath, \"wx\");\n\n try {\n await handle.writeFile(value, \"utf8\");\n } finally {\n await handle.close();\n }\n}\n\nexport async function writeBufferIfMissing(filePath: string, value: Uint8Array): Promise<void> {\n await ensureDirectory(path.dirname(filePath));\n\n try {\n const handle = await open(filePath, \"wx\");\n try {\n await handle.writeFile(value);\n } finally {\n await handle.close();\n }\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nexport async function readBinaryFile(filePath: string): Promise<Uint8Array> {\n return new Uint8Array(await readFile(filePath));\n}\n\nexport async function listJsonFiles(directoryPath: string): Promise<readonly string[]> {\n if (!(await pathExists(directoryPath))) {\n return [];\n }\n\n return (await readdir(directoryPath))\n .filter((entry) => entry.endsWith(\".json\"))\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport function sha256Hex(value: Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function filePathToUri(filePath: string): string {\n return pathToFileURL(filePath).toString();\n}\n\nexport function fileUriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return (error as NodeJS.ErrnoException | undefined)?.code === \"EEXIST\";\n}\n\nexport async function withFilesystemLock<T>(lockPath: string, task: () => Promise<T>): Promise<T> {\n await ensureDirectory(path.dirname(lockPath));\n\n let attempt = 0;\n while (true) {\n try {\n await mkdir(lockPath);\n break;\n } catch (error) {\n if (!isAlreadyExistsError(error)) {\n throw error;\n }\n\n const delayMs = LOCK_RETRY_DELAYS_MS[Math.min(attempt, LOCK_RETRY_DELAYS_MS.length - 1)];\n attempt += 1;\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n try {\n return await task();\n } finally {\n await rm(lockPath, { recursive: true, force: true });\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionCapabilities } from \"@opensteer/protocol\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"./internal/filesystem.js\";\n\nexport const OPENSTEER_LIVE_SESSION_LAYOUT = \"opensteer-session\";\nexport const OPENSTEER_LIVE_SESSION_VERSION = 1;\n\nexport type OpensteerLiveSessionProvider = \"local\" | \"cloud\";\n\ninterface PersistedSessionRecordBase {\n readonly layout: typeof OPENSTEER_LIVE_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LIVE_SESSION_VERSION;\n readonly provider: OpensteerLiveSessionProvider;\n readonly workspace?: string;\n readonly updatedAt: number;\n readonly activePageRef?: string;\n readonly reconnectable?: boolean;\n readonly capabilities?: OpensteerSessionCapabilities;\n}\n\nexport interface PersistedLocalBrowserSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"local\";\n readonly engine: \"playwright\" | \"abp\";\n readonly endpoint?: string;\n readonly baseUrl?: string;\n readonly remoteDebuggingUrl?: string;\n readonly sessionDir?: string;\n readonly pid: number;\n readonly startedAt: number;\n readonly executablePath?: string;\n readonly userDataDir: string;\n}\n\nexport interface PersistedCloudSessionRecord extends PersistedSessionRecordBase {\n readonly provider: \"cloud\";\n readonly sessionId: string;\n readonly startedAt: number;\n}\n\nexport type PersistedSessionRecord =\n | PersistedLocalBrowserSessionRecord\n | PersistedCloudSessionRecord;\n\nexport function resolveLiveSessionRecordPath(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): string {\n return path.join(rootPath, \"live\", provider === \"local\" ? \"local.json\" : \"cloud.json\");\n}\n\nexport function resolveLocalSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"local\");\n}\n\nexport function resolveCloudSessionRecordPath(rootPath: string): string {\n return resolveLiveSessionRecordPath(rootPath, \"cloud\");\n}\n\nexport async function readPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<PersistedSessionRecord | undefined> {\n const sessionPath = resolveLiveSessionRecordPath(rootPath, provider);\n if (!(await pathExists(sessionPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedSessionRecord>>(sessionPath);\n if (provider === \"local\" && isPersistedLocalBrowserSessionRecord(parsed)) {\n return parsed;\n }\n if (provider === \"cloud\" && isPersistedCloudSessionRecord(parsed)) {\n return parsed;\n }\n return undefined;\n}\n\nexport async function readPersistedCloudSessionRecord(\n rootPath: string,\n): Promise<PersistedCloudSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"cloud\");\n return record?.provider === \"cloud\" ? record : undefined;\n}\n\nexport async function readPersistedLocalBrowserSessionRecord(\n rootPath: string,\n): Promise<PersistedLocalBrowserSessionRecord | undefined> {\n const record = await readPersistedSessionRecord(rootPath, \"local\");\n return record?.provider === \"local\" ? record : undefined;\n}\n\nexport async function writePersistedSessionRecord(\n rootPath: string,\n record: PersistedSessionRecord,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLiveSessionRecordPath(rootPath, record.provider), record);\n}\n\nexport async function clearPersistedSessionRecord(\n rootPath: string,\n provider: OpensteerLiveSessionProvider,\n): Promise<void> {\n await rm(resolveLiveSessionRecordPath(rootPath, provider), { force: true });\n}\n\nfunction isPersistedCloudSessionRecord(\n value: Partial<PersistedCloudSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedCloudSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"cloud\" &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n\nfunction isPersistedLocalBrowserSessionRecord(\n value: Partial<PersistedLocalBrowserSessionRecord> | Partial<PersistedSessionRecord>,\n): value is PersistedLocalBrowserSessionRecord {\n return (\n value.layout === OPENSTEER_LIVE_SESSION_LAYOUT &&\n value.version === OPENSTEER_LIVE_SESSION_VERSION &&\n value.provider === \"local\" &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt) &&\n typeof value.userDataDir === \"string\" &&\n value.userDataDir.length > 0\n );\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport function resolveOpensteerStateDir(): string {\n const explicit = process.env.OPENSTEER_HOME?.trim();\n if (explicit) {\n return path.resolve(explicit);\n }\n\n if (process.platform === \"win32\") {\n return path.join(\n process.env.LOCALAPPDATA ?? path.join(homedir(), \"AppData\", \"Local\"),\n \"Opensteer\",\n );\n }\n\n if (process.platform === \"darwin\") {\n return path.join(homedir(), \"Library\", \"Application Support\", \"Opensteer\");\n }\n\n return path.join(\n process.env.XDG_STATE_HOME ?? path.join(homedir(), \".local\", \"state\"),\n \"opensteer\",\n );\n}\n\nexport function resolveLocalViewRootDir(): string {\n return path.join(resolveOpensteerStateDir(), \"local-view\");\n}\n\nexport function resolveLocalViewPreferencesPath(): string {\n return path.join(resolveLocalViewRootDir(), \"preferences.json\");\n}\n\nexport function resolveLocalViewServiceDir(): string {\n return path.join(resolveLocalViewRootDir(), \"service\");\n}\n\nexport function resolveLocalViewSessionsDir(): string {\n return path.join(resolveLocalViewRootDir(), \"sessions\");\n}\n\nexport function resolveLocalViewServiceLockDir(): string {\n return path.join(resolveLocalViewServiceDir(), \"startup.lock\");\n}\n\nexport function resolveLocalViewServiceStatePath(): string {\n return path.join(resolveLocalViewServiceDir(), \"state.json\");\n}\n","import { createHash } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { OpensteerSessionOwnership } from \"@opensteer/protocol\";\n\nimport {\n ensureDirectory,\n listJsonFiles,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n} from \"../internal/filesystem.js\";\nimport type { PersistedLocalBrowserSessionRecord } from \"../live-session.js\";\nimport { resolveLocalViewSessionsDir } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT = \"opensteer-local-view-session\";\nexport const OPENSTEER_LOCAL_VIEW_SESSION_VERSION = 1;\n\nexport interface PersistedLocalViewSessionManifest {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SESSION_VERSION;\n readonly sessionId: string;\n readonly rootPath: string;\n readonly workspace?: string;\n readonly engine: PersistedLocalBrowserSessionRecord[\"engine\"];\n readonly ownership: OpensteerSessionOwnership;\n readonly pid: number;\n readonly startedAt: number;\n readonly updatedAt: number;\n}\n\nexport function buildLocalViewSessionId(input: {\n readonly rootPath: string;\n readonly pid: number;\n readonly startedAt: number;\n}): string {\n const hash = createHash(\"sha256\")\n .update(`${input.rootPath}\\n${String(input.pid)}\\n${String(input.startedAt)}`)\n .digest(\"hex\");\n return `local_${hash.slice(0, 24)}`;\n}\n\nexport function createLocalViewSessionManifest(input: {\n readonly rootPath: string;\n readonly workspace?: string;\n readonly live: PersistedLocalBrowserSessionRecord;\n readonly ownership: OpensteerSessionOwnership;\n}): PersistedLocalViewSessionManifest {\n return {\n layout: OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT,\n version: OPENSTEER_LOCAL_VIEW_SESSION_VERSION,\n sessionId: buildLocalViewSessionId({\n rootPath: input.rootPath,\n pid: input.live.pid,\n startedAt: input.live.startedAt,\n }),\n rootPath: input.rootPath,\n ...(input.workspace === undefined ? {} : { workspace: input.workspace }),\n engine: input.live.engine,\n ownership: input.ownership,\n pid: input.live.pid,\n startedAt: input.live.startedAt,\n updatedAt: Date.now(),\n };\n}\n\nexport async function writeLocalViewSessionManifest(\n manifest: PersistedLocalViewSessionManifest,\n): Promise<void> {\n await ensureDirectory(resolveLocalViewSessionsDir());\n await writeJsonFileAtomic(resolveLocalViewSessionManifestPath(manifest.sessionId), manifest);\n}\n\nexport async function deleteLocalViewSessionManifest(sessionId: string): Promise<void> {\n await rm(resolveLocalViewSessionManifestPath(sessionId), { force: true }).catch(() => undefined);\n}\n\nexport async function readLocalViewSessionManifest(\n sessionId: string,\n): Promise<PersistedLocalViewSessionManifest | undefined> {\n const manifestPath = resolveLocalViewSessionManifestPath(sessionId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(manifestPath);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n}\n\nexport async function listLocalViewSessionManifests(): Promise<\n readonly PersistedLocalViewSessionManifest[]\n> {\n const directoryPath = resolveLocalViewSessionsDir();\n const fileNames = await listJsonFiles(directoryPath);\n const manifests = await Promise.all(\n fileNames.map(async (fileName) => {\n const parsed = await readJsonFile<Partial<PersistedLocalViewSessionManifest>>(\n path.join(directoryPath, fileName),\n ).catch(() => undefined);\n return isPersistedLocalViewSessionManifest(parsed) ? parsed : undefined;\n }),\n );\n return manifests\n .filter((manifest): manifest is PersistedLocalViewSessionManifest => manifest !== undefined)\n .sort(\n (left, right) =>\n left.startedAt - right.startedAt || left.sessionId.localeCompare(right.sessionId),\n );\n}\n\nexport function resolveLocalViewSessionManifestPath(sessionId: string): string {\n return path.join(resolveLocalViewSessionsDir(), `${sessionId}.json`);\n}\n\nfunction isPersistedLocalViewSessionManifest(\n value: Partial<PersistedLocalViewSessionManifest> | null | undefined,\n): value is PersistedLocalViewSessionManifest {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SESSION_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SESSION_VERSION &&\n typeof value.sessionId === \"string\" &&\n value.sessionId.length > 0 &&\n typeof value.rootPath === \"string\" &&\n value.rootPath.length > 0 &&\n (value.engine === \"playwright\" || value.engine === \"abp\") &&\n (value.ownership === \"owned\" ||\n value.ownership === \"attached\" ||\n value.ownership === \"managed\") &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst PROCESS_STARTED_AT_MS = Math.floor(Date.now() - process.uptime() * 1_000);\nconst PROCESS_START_TIME_TOLERANCE_MS = 1_000;\nconst PROCESS_LIST_MAX_BUFFER_BYTES = 16 * 1024 * 1024;\nconst PS_COMMAND_ENV = { ...process.env, LC_ALL: \"C\" };\nconst LINUX_STAT_START_TIME_FIELD_INDEX = 19;\n\nexport interface ProcessOwner {\n readonly pid: number;\n readonly processStartedAtMs: number;\n}\n\nexport type ProcessLiveness = \"live\" | \"dead\" | \"unknown\";\n\nexport const CURRENT_PROCESS_OWNER: ProcessOwner = {\n pid: process.pid,\n processStartedAtMs: PROCESS_STARTED_AT_MS,\n};\n\nlet linuxClockTicksPerSecondPromise: Promise<number | null> | null = null;\n\nexport function parseProcessOwner(value: unknown): ProcessOwner | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const parsed = value as Partial<ProcessOwner>;\n const pid = Number(parsed.pid);\n const processStartedAtMs = Number(parsed.processStartedAtMs);\n if (!Number.isInteger(pid) || pid <= 0) {\n return null;\n }\n if (!Number.isInteger(processStartedAtMs) || processStartedAtMs <= 0) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nexport function processOwnersEqual(left: ProcessOwner | null, right: ProcessOwner | null): boolean {\n if (!left || !right) {\n return left === right;\n }\n\n return left.pid === right.pid && left.processStartedAtMs === right.processStartedAtMs;\n}\n\nexport async function getProcessLiveness(owner: ProcessOwner): Promise<ProcessLiveness> {\n if (\n owner.pid === process.pid &&\n hasMatchingProcessStartTime(owner.processStartedAtMs, PROCESS_STARTED_AT_MS)\n ) {\n return \"live\";\n }\n\n const startedAtMs = await readProcessStartedAtMs(owner.pid);\n if (typeof startedAtMs === \"number\") {\n return hasMatchingProcessStartTime(owner.processStartedAtMs, startedAtMs) ? \"live\" : \"dead\";\n }\n\n return isProcessRunning(owner.pid) ? \"unknown\" : \"dead\";\n}\n\nexport function isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\"\n ? error.code\n : undefined;\n return code !== \"ESRCH\";\n }\n}\n\nexport async function readProcessOwner(pid: number): Promise<ProcessOwner | null> {\n const processStartedAtMs = await readProcessStartedAtMs(pid);\n if (processStartedAtMs === null) {\n return null;\n }\n\n return {\n pid,\n processStartedAtMs,\n };\n}\n\nfunction hasMatchingProcessStartTime(\n expectedStartedAtMs: number,\n actualStartedAtMs: number,\n): boolean {\n return Math.abs(expectedStartedAtMs - actualStartedAtMs) <= PROCESS_START_TIME_TOLERANCE_MS;\n}\n\nasync function readProcessStartedAtMs(pid: number): Promise<number | null> {\n if (pid <= 0) {\n return null;\n }\n\n if (process.platform === \"linux\") {\n return readLinuxProcessStartedAtMs(pid);\n }\n\n if (process.platform === \"win32\") {\n return readWindowsProcessStartedAtMs(pid);\n }\n\n return readPsProcessStartedAtMs(pid);\n}\n\nasync function readLinuxProcessStartedAtMs(pid: number): Promise<number | null> {\n let statRaw: string;\n try {\n statRaw = await readFile(`/proc/${String(pid)}/stat`, \"utf8\");\n } catch {\n return null;\n }\n\n const startTicks = parseLinuxProcessStartTicks(statRaw);\n if (startTicks === null) {\n return null;\n }\n\n const [bootTimeMs, clockTicksPerSecond] = await Promise.all([\n readLinuxBootTimeMs(),\n readLinuxClockTicksPerSecond(),\n ]);\n if (bootTimeMs === null || clockTicksPerSecond === null) {\n return null;\n }\n\n return Math.floor(bootTimeMs + (startTicks * 1_000) / clockTicksPerSecond);\n}\n\nfunction parseLinuxProcessStartTicks(statRaw: string): number | null {\n const closingParenIndex = statRaw.lastIndexOf(\")\");\n if (closingParenIndex === -1) {\n return null;\n }\n\n const fields = statRaw\n .slice(closingParenIndex + 2)\n .trim()\n .split(/\\s+/);\n const startTicks = Number(fields[LINUX_STAT_START_TIME_FIELD_INDEX]);\n return Number.isFinite(startTicks) && startTicks >= 0 ? startTicks : null;\n}\n\nasync function readLinuxBootTimeMs(): Promise<number | null> {\n try {\n const statRaw = await readFile(\"/proc/stat\", \"utf8\");\n const bootTimeLine = statRaw.split(\"\\n\").find((line) => line.startsWith(\"btime \"));\n if (!bootTimeLine) {\n return null;\n }\n\n const bootTimeSeconds = Number.parseInt(bootTimeLine.slice(\"btime \".length), 10);\n return Number.isFinite(bootTimeSeconds) ? bootTimeSeconds * 1_000 : null;\n } catch {\n return null;\n }\n}\n\nasync function readLinuxClockTicksPerSecond(): Promise<number | null> {\n if (!linuxClockTicksPerSecondPromise) {\n linuxClockTicksPerSecondPromise = execFileAsync(\"getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n })\n .then(({ stdout }) => {\n const value = Number.parseInt(stdout.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : null;\n })\n .catch(() => null);\n }\n\n return linuxClockTicksPerSecondPromise;\n}\n\nasync function readWindowsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-Command\",\n `(Get-Process -Id ${String(pid)}).StartTime.ToUniversalTime().ToString(\"o\")`,\n ],\n {\n encoding: \"utf8\",\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n },\n );\n const isoTimestamp = stdout.trim();\n if (!isoTimestamp) {\n return null;\n }\n const startedAtMs = Date.parse(isoTimestamp);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n\nasync function readPsProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: PS_COMMAND_ENV,\n maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,\n });\n const startedAt = stdout.trim();\n if (!startedAt) {\n return null;\n }\n\n const startedAtMs = Date.parse(startedAt.replace(/\\s+/g, \" \"));\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n","import { rm } from \"node:fs/promises\";\n\nimport { pathExists, readJsonFile, writeJsonFileAtomic } from \"../internal/filesystem.js\";\nimport { getProcessLiveness, type ProcessLiveness } from \"../local-browser/process-owner.js\";\nimport { resolveLocalViewServiceStatePath } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT = \"opensteer-local-view-service\";\nexport const OPENSTEER_LOCAL_VIEW_SERVICE_VERSION = 3;\n\nexport interface PersistedLocalViewServiceState {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_SERVICE_VERSION;\n readonly pid: number;\n readonly processStartedAtMs: number;\n readonly startedAt: number;\n readonly port: number;\n readonly token: string;\n readonly url: string;\n}\n\nexport async function readLocalViewServiceState(): Promise<\n PersistedLocalViewServiceState | undefined\n> {\n const statePath = resolveLocalViewServiceStatePath();\n if (!(await pathExists(statePath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewServiceState>>(statePath);\n if (!isPersistedLocalViewServiceState(parsed)) {\n return undefined;\n }\n\n return parsed;\n}\n\nexport async function writeLocalViewServiceState(\n state: PersistedLocalViewServiceState,\n): Promise<void> {\n await writeJsonFileAtomic(resolveLocalViewServiceStatePath(), state);\n}\n\nexport async function clearLocalViewServiceState(\n match:\n | {\n readonly pid: number;\n readonly token: string;\n }\n | undefined = undefined,\n): Promise<void> {\n if (match !== undefined) {\n const current = await readLocalViewServiceState();\n if (current === undefined || current.pid !== match.pid || current.token !== match.token) {\n return;\n }\n }\n\n await rm(resolveLocalViewServiceStatePath(), { force: true });\n}\n\nexport async function isLocalViewServiceStateLive(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<boolean> {\n return (await getLocalViewServiceStateLiveness(state)) !== \"dead\";\n}\n\nexport async function getLocalViewServiceStateLiveness(\n state: PersistedLocalViewServiceState | undefined,\n): Promise<ProcessLiveness> {\n if (state === undefined) {\n return \"dead\";\n }\n\n return getProcessLiveness({\n pid: state.pid,\n processStartedAtMs: state.processStartedAtMs,\n });\n}\n\nfunction isPersistedLocalViewServiceState(\n value: Partial<PersistedLocalViewServiceState> | null | undefined,\n): value is PersistedLocalViewServiceState {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_SERVICE_VERSION &&\n typeof value.pid === \"number\" &&\n Number.isFinite(value.pid) &&\n typeof value.processStartedAtMs === \"number\" &&\n Number.isFinite(value.processStartedAtMs) &&\n typeof value.startedAt === \"number\" &&\n Number.isFinite(value.startedAt) &&\n typeof value.port === \"number\" &&\n Number.isFinite(value.port) &&\n typeof value.token === \"string\" &&\n value.token.length > 0 &&\n typeof value.url === \"string\" &&\n value.url.length > 0\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { writeLocalViewServiceState, CURRENT_PROCESS_OWNER, OPENSTEER_LOCAL_VIEW_SERVICE_VERSION, OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT, clearLocalViewServiceState, readLocalViewSessionManifest, listLocalViewSessionManifests, deleteLocalViewSessionManifest, isProcessRunning, pathExists, readPersistedLocalBrowserSessionRecord, inspectCdpEndpoint } from './chunk-BMPUL66S.js';
1
+ import { writeLocalViewServiceState, CURRENT_PROCESS_OWNER, OPENSTEER_LOCAL_VIEW_SERVICE_VERSION, OPENSTEER_LOCAL_VIEW_SERVICE_LAYOUT, clearLocalViewServiceState, readLocalViewSessionManifest, listLocalViewSessionManifests, deleteLocalViewSessionManifest, isProcessRunning, pathExists, readPersistedLocalBrowserSessionRecord, inspectCdpEndpoint } from './chunk-T5P2QGZ3.js';
2
2
  import { randomBytes } from 'crypto';
3
3
  import { createServer } from 'http';
4
4
  import { readFile } from 'fs/promises';
@@ -1661,7 +1661,7 @@ async function handleHttpRequest(args) {
1661
1661
  return;
1662
1662
  }
1663
1663
  const sessionId = decodeURIComponent(closeMatch[1]);
1664
- const { closeLocalViewSessionBrowser, LocalViewSessionCloseError } = await import('./session-control-IFE3IPS3.js');
1664
+ const { closeLocalViewSessionBrowser, LocalViewSessionCloseError } = await import('./session-control-M3JD7ZKA.js');
1665
1665
  try {
1666
1666
  await closeLocalViewSessionBrowser(sessionId);
1667
1667
  } catch (error) {
@@ -1796,5 +1796,5 @@ async function runLocalViewService() {
1796
1796
  }
1797
1797
 
1798
1798
  export { runLocalViewService };
1799
- //# sourceMappingURL=chunk-FIMNKEG5.js.map
1800
- //# sourceMappingURL=chunk-FIMNKEG5.js.map
1799
+ //# sourceMappingURL=chunk-ZRF7WMS3.js.map
1800
+ //# sourceMappingURL=chunk-ZRF7WMS3.js.map