u-chan-secrets 4.0.1 → 5.0.0

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.
@@ -0,0 +1,54 @@
1
+ // User-side half of the disposable Windows browser matrix. The administrator runs the SYSTEM fixture separately.
2
+ import fs from 'node:fs/promises'
3
+ import path from 'node:path'
4
+ import os from 'node:os'
5
+ import { fileURLToPath } from 'node:url'
6
+ import { createServer } from 'node:net'
7
+ import { execFile } from 'node:child_process'
8
+ import { promisify } from 'node:util'
9
+ import { chromium } from 'playwright'
10
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js'
11
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
12
+ import { isElevated } from '../../dist/client/codex-setup.js'
13
+ import { inspectDesktopBrowser } from '../../dist/platform/windows/desktop-browser.js'
14
+ const [command, browser, runId] = process.argv.slice(2)
15
+ if (process.platform !== 'win32' || command !== '--prepare' || !['chrome','edge'].includes(browser) || !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(runId ?? '')) throw new Error('Use --prepare chrome|edge <fresh UUID> on Windows')
16
+ if (await isElevated()) throw new Error('Prepare must run as the non-elevated desktop owner')
17
+ const root = path.join(os.tmpdir(), 'u-chan-v5-matrix-' + runId), home = path.join(root, browser)
18
+ await fs.mkdir(root) // A fresh UUID must never reuse another fixture or personal profile.
19
+ await fs.mkdir(home)
20
+ const port = await new Promise((resolve, reject) => { const server = createServer(); server.once('error', reject); server.listen(0, '127.0.0.1', () => { const selected = server.address().port; server.close(() => resolve(selected)) }) })
21
+ const endpoint = 'http://127.0.0.1:' + port, environment = { ...process.env, U_CHAN_HOME: home, U_CHAN_CDP: endpoint, U_CHAN_BROWSER: browser }
22
+ const report = { runId, browser, ok: false }, exec = promisify(execFile)
23
+ let connection
24
+ try {
25
+ await exec('powershell.exe', ['-NoProfile','-NonInteractive','-ExecutionPolicy','Bypass','-File',fileURLToPath(new URL('../start-browser.ps1',import.meta.url)),'-Browser',browser,'-Background'], { env: environment, windowsHide: true, timeout: 30000 })
26
+ report.desktopIdentity = await inspectDesktopBrowser({ endpoint, browser, profile: path.join(home,browser+'-profile') },environment)
27
+ if (report.desktopIdentity !== 'pass') throw new Error('Disposable browser identity failed')
28
+ connection = await chromium.connectOverCDP(endpoint)
29
+ await fs.writeFile(path.join(root,'prepared.json'),JSON.stringify({runId,browser,home,endpoint}),{flag:'wx'})
30
+ console.log(JSON.stringify({prepared:true,runId,browser,endpoint}))
31
+ const receipt = path.join(process.env.ProgramData ?? 'C:\\ProgramData','UChanSecurityChecks',runId,'report.json'), deadline=Date.now()+600000
32
+ while(Date.now()<deadline&&!await fs.stat(receipt).catch(()=>null))await new Promise(resolve=>setTimeout(resolve,500))
33
+ const native = JSON.parse(await fs.readFile(receipt,'utf8'))
34
+ report.systemFixturePassed = native.ok === true && native.fixtureBrowser === browser && native.desktopIdentity === 'pass'
35
+ const client = new Client({name:'u-chan-browser-matrix',version:'1.0.0'})
36
+ const transport = new StdioClientTransport({command:process.execPath,args:[path.join(path.dirname(process.execPath),'node_modules/npm/bin/npx-cli.js'),'@playwright/mcp@latest','--cdp-endpoint',endpoint],stderr:'pipe'})
37
+ try {
38
+ await client.connect(transport)
39
+ report.playwrightTools=(await client.listTools()).tools.length
40
+ report.sharedBrowserListing=!(await client.callTool({name:'browser_tabs',arguments:{action:'list'}})).isError
41
+ } finally {await client.close().catch(()=>{});await transport.close().catch(()=>{})}
42
+ report.ok=report.systemFixturePassed&&report.playwrightTools>0&&report.sharedBrowserListing
43
+ }catch(error){report.errorType=error.name}
44
+ finally{
45
+ // Only this verified disposable instance may be closed; never enumerate or terminate other browsers.
46
+ if(connection&&await inspectDesktopBrowser({endpoint,browser,profile:path.join(home,browser+'-profile')},environment)==='pass') {
47
+ const session=await connection.newBrowserCDPSession().catch(()=>null)
48
+ await session?.send('Browser.close').catch(()=>{})
49
+ }
50
+ await connection?.close().catch(()=>{})
51
+ await fs.writeFile(path.join(root,'complete.json'),JSON.stringify(report,null,2),{flag:'wx'})
52
+ }
53
+ console.log(JSON.stringify(report))
54
+ if(!report.ok)process.exitCode=1