@my-life-buddies/cli-windowscompat 0.0.0-stage → 0.29.0-dev.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.
- package/README.md +19 -2
- package/dist/bin/buddy.js +542 -0
- package/dist/bin/buddy.js.map +7 -0
- package/dist/bin/command-runner.js +529 -0
- package/dist/bin/command-runner.js.map +7 -0
- package/dist/bin/core.js +9939 -0
- package/dist/bin/core.js.map +7 -0
- package/dist/bin/platform.js +543 -0
- package/dist/bin/platform.js.map +7 -0
- package/dist/bin/preview.js +2924 -0
- package/dist/bin/preview.js.map +7 -0
- package/dist/bin/resources/widget-document.js +41 -0
- package/package.json +54 -4
- package/resources/README.md +10 -0
- package/resources/agent-template/buddy-dev-control.mjs +49 -0
- package/resources/agent-template/package-lock.json +23 -0
- package/resources/agent-template/package.json +14 -0
- package/resources/brand/README.md +11 -0
- package/resources/brand/login-result.css +25 -0
- package/resources/brand/logo.png +0 -0
- package/resources/brand/tokens.css +100 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<define:__BUDDY_CLI_LANE_BUILD__>", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/build-target.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/platform/npm.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/npm-registry.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/platform/support.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/platform/open.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/platform/windows.ts", "../../../../../../cli-prod-release-20261022/packages/cli-core/src/platform/private-files.ts"],
|
|
4
|
+
"sourcesContent": ["{\"schemaVersion\":1,\"id\":\"windowscompat\",\"origin\":\"https://buddies-windowscompat.devops.sl.sit.xiaohongshu.com\",\"command\":\"buddy-cli-windowscompat\",\"runtimePackage\":\"@my-life-buddies/buddy-runtime-windowscompat\",\"runtimeTag\":\"dev\",\"runtimePrerelease\":\"dev\",\"sourceVersion\":\"0.29.0-dev.0\",\"distribution\":\"npm\",\"packageName\":\"@my-life-buddies/cli-windowscompat\",\"version\":\"0.29.0-dev.0\",\"validationScope\":\"mac-config-only\"}", "/** Replaced only by the local lane builder. Runtime environment variables cannot select a target. */\nexport interface LaneBuild {\n readonly schemaVersion: 1;\n readonly id: string;\n readonly origin: string;\n readonly command: string;\n readonly distribution: \"local\" | \"npm\";\n readonly packageName: string;\n readonly runtimePackage: string;\n readonly runtimeTag: \"dev\";\n readonly runtimePrerelease: string;\n readonly sourceVersion: string;\n readonly version: string;\n readonly validationScope: \"mac-config-only\" | \"windows-candidate\";\n}\ndeclare const __BUDDY_CLI_LANE_BUILD__: LaneBuild | undefined;\n\nexport const LANE_BUILD: Readonly<LaneBuild> | undefined = typeof __BUDDY_CLI_LANE_BUILD__ === \"undefined\"\n ? undefined : Object.freeze(__BUDDY_CLI_LANE_BUILD__);\nexport const CLI_COMMAND_NAME = LANE_BUILD?.command ?? \"buddy-cli-sit\";\nexport const CLI_PACKAGE_NAME = LANE_BUILD?.packageName ?? \"@my-life-buddies/cli\";\nexport const PLATFORM_ORIGIN = LANE_BUILD?.origin ?? \"https://buddies.sit.dots.chat\";\nexport const RUNTIME_PACKAGE_NAME = LANE_BUILD?.runtimePackage ?? \"@my-life-buddies/buddy-runtime\";\nexport const RUNTIME_DIST_TAG = LANE_BUILD?.runtimeTag ?? \"dev\";\nexport const RUNTIME_SOURCE_LABEL = LANE_BUILD ? `${RUNTIME_PACKAGE_NAME} \u7684 npm ${RUNTIME_DIST_TAG}` : \"npm dev\";\nexport const CLI_UPDATE_GUIDANCE = LANE_BUILD\n ? LANE_BUILD.distribution === \"npm\"\n ? `\u6CF3\u9053 npm \u6D4B\u8BD5\u5305\u5DF2\u7981\u7528\u81EA\u52A8\u66F4\u65B0\u3001update \u548C setup\u3002\u624B\u52A8\u66F4\u65B0\u8BF7\u5728\u539F\u5B89\u88C5\u76EE\u5F55\u6267\u884C npm install --global --prefix <\u539F\u5B89\u88C5\u524D\u7F00> ${CLI_PACKAGE_NAME}@dev --registry=https://registry.npmjs.org/ --@my-life-buddies:registry=https://registry.npmjs.org/\uFF1B\u4E0D\u4F1A\u5207\u56DE\u539F CLI \u5305\u3002\u5F53\u524D\u4EC5\u652F\u6301 macOS\u3002`\n : \"\u672C\u5730\u6CF3\u9053\u6D4B\u8BD5\u5236\u54C1\u5DF2\u7981\u7528\u81EA\u52A8\u66F4\u65B0\u3001update \u548C setup\uFF1B\u66F4\u6362\u7248\u672C\u987B\u91CD\u65B0\u5B89\u88C5\u540C\u6CF3\u9053\u6D4B\u8BD5\u5236\u54C1\u3002\"\n : \"\u6B63\u5E38\u547D\u4EE4\u5148\u8054\u7F51\u81EA\u68C0\uFF0C\u65E7\u7248\u81EA\u52A8\u66F4\u65B0\u540E\u7EE7\u7EED\u6267\u884C\uFF1B\u5931\u8D25\u65F6\u505C\u6B62\u3002\u5E2E\u52A9\u3001--version \u548C dev stop \u79BB\u7EBF\u53EF\u7528\u3002\";\n\n/** A copied executable or mixed install must not silently acquire a different target identity. */\nexport function assertBuildManifest(manifest: { name?: unknown; version?: unknown; private?: unknown; bin?: unknown; buddyCliLane?: unknown; os?: unknown }, platform: NodeJS.Platform = process.platform): void {\n if (!LANE_BUILD) {\n if (manifest.buddyCliLane !== undefined) throw new Error(\"\u6CF3\u9053\u5236\u54C1\u4E0E\u6267\u884C\u5165\u53E3\u4E0D\u5339\u914D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u5B8C\u6574\u6D4B\u8BD5\u5236\u54C1\u3002\");\n return;\n }\n const actual = manifest.buddyCliLane;\n if (!actual || typeof actual !== \"object\" || Array.isArray(actual)\n || Object.keys(actual).length !== Object.keys(LANE_BUILD).length\n || Object.entries(LANE_BUILD).some(([key, value]) => (actual as Record<string, unknown>)[key] !== value)\n || manifest.name !== CLI_PACKAGE_NAME || manifest.version !== LANE_BUILD.version\n || (LANE_BUILD.distribution === \"local\" ? manifest.private !== true : manifest.private !== undefined)\n || !manifest.bin || typeof manifest.bin !== \"object\"\n || Object.keys(manifest.bin).length !== 1\n || (manifest.bin as Record<string, unknown>)[LANE_BUILD.command] !== \"dist/bin/buddy.js\") {\n throw new Error(\"\u6CF3\u9053\u5236\u54C1\u6807\u8BC6\u3001\u7248\u672C\u6216\u5165\u53E3\u4E0D\u5339\u914D\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5\u5B8C\u6574\u6D4B\u8BD5\u5236\u54C1\uFF1B\u4E0D\u4F1A\u5207\u56DE\u516C\u5171 SIT\u3002\");\n }\n if (LANE_BUILD.validationScope === \"mac-config-only\" && platform !== \"darwin\") {\n throw new Error(\"\u6B64\u6CF3\u9053\u5236\u54C1\u4EC5\u652F\u6301 macOS\uFF08mac-config-only\uFF09\uFF1B\u7F3A\u5C11 Windows \u539F\u751F\u5236\u54C1\uFF0C\u5F3A\u5236\u5B89\u88C5\u4E5F\u4E0D\u80FD\u4F5C\u4E3A Windows \u5019\u9009\u8FD0\u884C\u3002\");\n }\n if (LANE_BUILD.distribution === \"npm\" && LANE_BUILD.validationScope === \"mac-config-only\"\n && JSON.stringify(manifest.os) !== JSON.stringify([\"darwin\"])) throw new Error(\"macOS \u6CF3\u9053 npm \u5236\u54C1\u7684 os \u5FC5\u987B\u4EC5\u4E3A darwin\u3002\");\n}\n", "import { execFile } from \"node:child_process\";\nimport { readFile, realpath, stat } from \"node:fs/promises\";\nimport { delimiter, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nexport { npmPackageManifest } from \"../npm-registry.js\";\n\nconst execute = promisify(execFile);\nexport interface NpmExecutionOptions {\n cwd: string;\n signal?: AbortSignal;\n timeout: number;\n env?: NodeJS.ProcessEnv;\n maxBuffer?: number;\n}\nexport interface NpmDiscoveryOptions {\n execPath?: string;\n env?: NodeJS.ProcessEnv;\n platform?: NodeJS.Platform;\n}\n\n/** Locate npm belonging to this Node installation; never execute a shell shim. */\nexport async function resolveNpmEntry(options: NpmDiscoveryOptions = {}): Promise<{ node: string; entry: string }> {\n const node = options.execPath ?? process.execPath;\n const env = options.env ?? process.env;\n const platform = options.platform ?? process.platform;\n const realNode = await realpath(node);\n const candidates = new Set<string>();\n // npm/npx provide the actual Node used to launch the lifecycle command.\n if (env.npm_execpath && env.npm_node_execpath && isAbsolute(env.npm_execpath)) {\n try {\n if (await realpath(env.npm_node_execpath) === realNode) {\n candidates.add(join(dirname(await realpath(env.npm_execpath)), \"npm-cli.js\"));\n }\n } catch { /* Continue with verified installation locations. */ }\n }\n for (const bin of new Set([dirname(node), dirname(realNode)])) {\n candidates.add(join(bin, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"));\n candidates.add(resolve(bin, \"..\", \"lib\", \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"));\n }\n const pathKey = Object.keys(env).find(key => key.toLowerCase() === \"path\");\n const paths = (env[pathKey ?? \"PATH\"] ?? \"\").split(platform === \"win32\" ? \";\" : delimiter);\n for (const directory of paths) {\n if (!directory || !isAbsolute(directory)) continue;\n try {\n if (await realpath(join(directory, platform === \"win32\" ? \"node.exe\" : \"node\")) !== realNode) continue;\n if (platform === \"win32\") candidates.add(join(directory, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"));\n else candidates.add(await realpath(join(directory, \"npm\")));\n } catch { /* A different Node or an incomplete PATH entry is not a fallback. */ }\n }\n for (const candidate of candidates) {\n try {\n const entry = await realpath(candidate);\n const root = dirname(dirname(entry));\n const manifest = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n if (manifest.name !== \"npm\" || manifest.bin?.npm !== \"bin/npm-cli.js\") continue;\n if (await realpath(join(root, manifest.bin.npm)) !== entry || !(await stat(entry)).isFile()) continue;\n return { node, entry };\n } catch { /* Try the next location, never a bare npm command. */ }\n }\n throw new Error(\"\u627E\u4E0D\u5230\u4E0E\u5F53\u524D Node.js \u5B89\u88C5\u5339\u914D\u7684 npm \u5165\u53E3\u3002\u8BF7\u4FEE\u590D\u6216\u91CD\u65B0\u5B89\u88C5\u5F53\u524D Node.js\uFF0C\u518D\u91CD\u8BD5\uFF1B\u672A\u8C03\u7528\u5176\u4ED6 Node \u7684 npm\u3002\");\n}\n\n/** All arguments remain separate, including Unicode and shell metacharacters in paths. */\nexport async function runNpm(args: readonly string[], options: NpmExecutionOptions): Promise<{ stdout: string; stderr: string }> {\n options.signal?.throwIfAborted();\n const npm = await resolveNpmEntry({ env: options.env });\n return execute(npm.node, [npm.entry, ...args], {\n ...options, encoding: \"utf8\", maxBuffer: options.maxBuffer ?? 4 * 1024 * 1024,\n shell: false, windowsHide: true,\n });\n}\n", "const REGISTRY = \"https://registry.npmjs.org/\";\n\n/** Resolve tags and exact releases from the same document npm uses for installs. */\nexport async function npmPackageManifest(name: string, selector: string, options: {\n fetch?: typeof globalThis.fetch;\n signal?: AbortSignal;\n timeoutMs?: number;\n} = {}): Promise<Record<string, any>> {\n options.signal?.throwIfAborted();\n const timeout = AbortSignal.timeout(options.timeoutMs ?? 10_000);\n const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;\n const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(name)}`, {\n signal, headers: { Accept: \"application/json\" }, redirect: \"error\",\n });\n if (!response.ok) throw new Error(`npm HTTP ${response.status}`);\n const text = await response.text();\n if (text.length > 8 * 1024 * 1024) throw new Error(\"npm \u5143\u6570\u636E\u8FC7\u5927\");\n const metadata = JSON.parse(text);\n if (metadata?.name !== name) throw new Error(\"npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D\");\n const version = Object.hasOwn(metadata[\"dist-tags\"] ?? {}, selector) ? metadata[\"dist-tags\"][selector] : selector;\n const manifest = typeof version === \"string\" && Object.hasOwn(metadata.versions ?? {}, version)\n ? metadata.versions[version] : undefined;\n if (!manifest || manifest.name !== name || manifest.version !== version) {\n throw new Error(`npm ${selector} \u672A\u8FD4\u56DE\u6B64\u5305\u7684\u51C6\u786E\u7248\u672C`);\n }\n return manifest;\n}\n", "import { machine, release, version } from \"node:os\";\n\nexport class UnsupportedDeveloperPlatformError extends Error {\n constructor(readonly platform: NodeJS.Platform, message?: string) {\n super(message ?? `\u642D\u642D CLI \u652F\u6301 macOS\u3001Windows 10 22H2 x64 \u548C Windows 11 x64/ARM64\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}\u3002`);\n this.name = \"UnsupportedDeveloperPlatformError\";\n }\n}\n\nexport interface DeveloperHostInfo {\n arch?: string;\n osRelease?: string;\n osVersion?: string;\n hostMachine?: string;\n nodeVersion?: string;\n}\n\n/** Check the actual process architecture separately from the host processor. */\nexport function assertSupportedDeveloperPlatform(platform: NodeJS.Platform = process.platform, info: DeveloperHostInfo = {}): void {\n const arch = info.arch ?? process.arch;\n if (![\"darwin\", \"win32\"].includes(platform)) throw new UnsupportedDeveloperPlatformError(platform);\n if (![\"x64\", \"arm64\"].includes(arch)) {\n throw new UnsupportedDeveloperPlatformError(platform, `\u642D\u642D CLI \u9700\u8981 x64 \u6216 ARM64 Node.js\uFF0C\u5F53\u524D\u8FDB\u7A0B\u67B6\u6784\u662F ${arch}\u3002`);\n }\n const node = info.nodeVersion ?? process.versions.node;\n if (!/^\\d+\\./u.test(node) || Number(node.split(\".\")[0]) < 24) {\n throw new UnsupportedDeveloperPlatformError(platform, \"\u642D\u642D CLI \u9700\u8981 Node.js 24 \u6216\u66F4\u9AD8\u7248\u672C\u3002\");\n }\n if (platform === \"darwin\") return;\n const osRelease = info.osRelease ?? release();\n const osVersion = info.osVersion ?? version();\n const [major, minor, build] = osRelease.split(\".\").map(Number);\n if (major !== 10 || minor !== 0 || !Number.isSafeInteger(build) || build! < 19045 || /Server|LTSC|LTSB/iu.test(osVersion)) {\n throw new UnsupportedDeveloperPlatformError(platform, `\u642D\u642D CLI \u9700\u8981 Windows 10 22H2\uFF0819045\uFF09\u6216 Windows 11 \u684C\u9762\u7CFB\u7EDF\uFF0C\u5F53\u524D\u7248\u672C\u662F ${osRelease}\u3002`);\n }\n const host = (info.hostMachine ?? machine()).toLowerCase();\n if (arch === \"arm64\" && build! < 22000 || /^(arm64|aarch64)$/u.test(host) && arch !== \"arm64\") {\n throw new UnsupportedDeveloperPlatformError(platform, \"Windows ARM64 \u9700\u8981 Windows 11 \u548C\u539F\u751F ARM64 Node.js\uFF0C\u8BF7\u5B89\u88C5\u5339\u914D\u7684 Node.js \u7248\u672C\u3002\");\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport { posix, win32 } from \"node:path\";\n\nimport { windowsOperation, type WindowsCommand, type WindowsCommandRunner } from \"./windows.js\";\n\nexport interface OpenExternalTargetOptions {\n readonly platform?: NodeJS.Platform;\n readonly env?: NodeJS.ProcessEnv;\n readonly runner?: WindowsCommandRunner;\n}\n\nfunction externalTarget(target: string | URL, platform: NodeJS.Platform): string {\n const value = target instanceof URL ? target.href : target;\n if (!value || /[\\u0000-\\u001f\\u007f]/u.test(value)) throw new TypeError(\"\u53EA\u80FD\u6253\u5F00 HTTP(S) \u5730\u5740\u6216\u672C\u5730\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\");\n if (platform === \"win32\"\n ? /^[A-Za-z]:[\\\\/]/u.test(value) && win32.isAbsolute(value)\n : value.startsWith(\"/\") && !value.startsWith(\"//\") && posix.isAbsolute(value)) return value;\n let url: URL;\n try { url = new URL(value); } catch { throw new TypeError(\"\u53EA\u80FD\u6253\u5F00 HTTP(S) \u5730\u5740\u6216\u672C\u5730\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\"); }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") throw new TypeError(\"\u53EA\u80FD\u6253\u5F00 HTTP(S) \u5730\u5740\u6216\u672C\u5730\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\u3002\");\n return url.href;\n}\n\nasync function runMacOpen(command: WindowsCommand): Promise<{ code: number; stdout: string; stderr: string }> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command.command, [...command.args], { shell: false, stdio: \"ignore\" });\n child.once(\"error\", reject);\n child.once(\"close\", code => resolve({ code: code ?? 1, stdout: \"\", stderr: \"\" }));\n });\n}\n\n/** Open a validated URL or local file without interpreting the target as shell code. */\nexport async function openExternalTarget(target: string | URL, options: OpenExternalTargetOptions = {}): Promise<void> {\n const platform = options.platform ?? process.platform;\n if (platform !== \"darwin\" && platform !== \"win32\") throw new Error(\"\u6253\u5F00\u6D4F\u89C8\u5668\u6216\u6587\u4EF6\u4EC5\u652F\u6301 macOS \u548C Windows\u3002\");\n const value = externalTarget(target, platform);\n if (platform === \"win32\") {\n await windowsOperation({ operation: \"open\", target: value }, { runner: options.runner, env: options.env });\n return;\n }\n const result = await (options.runner ?? runMacOpen)({ command: \"open\", args: [value] });\n if (result.code !== 0) throw new Error(\"\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\u6216\u6587\u4EF6\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\u7EC8\u7AEF\u4E2D\u663E\u793A\u7684\u5730\u5740\u6216\u8DEF\u5F84\u3002\");\n}\n", "import { spawn } from \"node:child_process\";\nimport { win32 } from \"node:path\";\n\nexport interface WindowsCommand { command: string; args: readonly string[]; input?: string }\nexport interface WindowsCommandResult { code: number; stdout: string; stderr: string }\nexport type WindowsCommandRunner = (command: WindowsCommand) => Promise<WindowsCommandResult>;\n\n// This script is constant. Paths, URLs and secrets travel only through UTF-8 stdin.\nconst SCRIPT = String.raw`\n$ErrorActionPreference = 'Stop'\n[Console]::InputEncoding = New-Object System.Text.UTF8Encoding($false)\n[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)\n$sid = [Security.Principal.WindowsIdentity]::GetCurrent().User\nfunction PathAttributes([string]$path) {\n try { return [IO.File]::GetAttributes($path) }\n catch [IO.FileNotFoundException] { return $null }\n catch [IO.DirectoryNotFoundException] { return $null }\n}\nfunction SafePath([string]$path) {\n if ($path -notmatch '^[A-Za-z]:[\\\\/]' -or $path -match '[\\x00-\\x1f\\x7f]' -or $path.Substring(2).Contains(':')) { throw 'INVALID_PATH' }\n $full = [IO.Path]::GetFullPath($path)\n $drive = New-Object IO.DriveInfo([IO.Path]::GetPathRoot($full))\n if ($drive.DriveType -eq [IO.DriveType]::Network) { throw 'NETWORK_PATH' }\n $part = $full\n while ($part) {\n $attributes = PathAttributes $part\n if ($null -ne $attributes -and ($attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw 'LINK_PATH' }\n if ($part -eq [IO.Path]::GetPathRoot($part)) { break }\n $parent = [IO.Path]::GetDirectoryName($part.TrimEnd('\\'))\n if ($parent -eq $part) { break }; $part = $parent\n }\n return $full\n}\nfunction PrivateAcl([bool]$directory) {\n if ($directory) { $acl = New-Object Security.AccessControl.DirectorySecurity }\n else { $acl = New-Object Security.AccessControl.FileSecurity }\n $acl.SetOwner($sid); $acl.SetAccessRuleProtection($true, $false)\n if ($directory) {\n $rule = New-Object Security.AccessControl.FileSystemAccessRule($sid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow')\n } else { $rule = New-Object Security.AccessControl.FileSystemAccessRule($sid, 'FullControl', 'Allow') }\n $acl.AddAccessRule($rule); return $acl\n}\nfunction CheckOwner([string]$path) {\n $acl = Get-Acl -LiteralPath $path\n if ($acl.GetOwner([Security.Principal.SecurityIdentifier]).Value -ne $sid.Value) { throw 'FOREIGN_OWNER' }\n return $acl\n}\nfunction CheckFileLinks([string]$path) {\n $attributes = PathAttributes $path\n if ($null -eq $attributes -or ($attributes -band [IO.FileAttributes]::Directory) -ne 0) { return }\n if (!('BuddyPrivateFileInfo' -as [type])) {\n Add-Type -TypeDefinition @'\nusing System;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing Microsoft.Win32.SafeHandles;\npublic static class BuddyPrivateFileInfo {\n [StructLayout(LayoutKind.Sequential)]\n private struct Info {\n public uint Attributes;\n public System.Runtime.InteropServices.ComTypes.FILETIME Created, Accessed, Written;\n public uint Volume, SizeHigh, SizeLow, Links, IndexHigh, IndexLow;\n }\n [DllImport(\"kernel32.dll\", SetLastError = true)]\n private static extern bool GetFileInformationByHandle(SafeFileHandle file, out Info info);\n public static uint Links(string path) {\n using (var file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) {\n Info info;\n if (!GetFileInformationByHandle(file.SafeFileHandle, out info)) throw new IOException(\"FILE_INFO_FAILED\");\n return info.Links;\n }\n }\n}\n'@\n }\n if ([BuddyPrivateFileInfo]::Links($path) -ne 1) { throw 'LINK_PATH' }\n}\nfunction CheckPrivate([string]$path) {\n $path = SafePath $path\n if ($null -eq (PathAttributes $path)) { throw 'ENOENT' }\n CheckFileLinks $path\n $acl = CheckOwner $path\n if (!$acl.AreAccessRulesProtected) { throw 'UNSAFE_ACL' }\n $allowed = $false\n foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.SecurityIdentifier])) {\n if ($rule.AccessControlType -eq 'Allow') {\n if ($rule.IdentityReference.Value -ne $sid.Value) { throw 'UNSAFE_ACL' }\n if (($rule.FileSystemRights -band [Security.AccessControl.FileSystemRights]::FullControl) -eq [Security.AccessControl.FileSystemRights]::FullControl) { $allowed = $true }\n }\n }\n if (!$allowed) { throw 'UNSAFE_ACL' }\n}\nfunction PrivateDirectory([string]$path) {\n $path = SafePath $path\n $attributes = PathAttributes $path\n if ($null -ne $attributes) {\n if (($attributes -band [IO.FileAttributes]::Directory) -eq 0) { throw 'INVALID_PATH' }\n $null = CheckOwner $path\n [IO.Directory]::SetAccessControl($path, (PrivateAcl $true))\n } else {\n $parent = [IO.Path]::GetDirectoryName($path)\n if ($null -eq (PathAttributes $parent)) { PrivateDirectory $parent }\n $null = [IO.Directory]::CreateDirectory($path, (PrivateAcl $true))\n }\n CheckPrivate $path\n}\nfunction AtomicPrivateWrite([string]$path, [byte[]]$bytes) {\n $path = SafePath $path\n $attributes = PathAttributes $path\n if ($null -ne $attributes) {\n if (($attributes -band [IO.FileAttributes]::Directory) -ne 0) { throw 'INVALID_PATH' }\n $null = CheckOwner $path; CheckFileLinks $path\n }\n $temporary = $path + '.' + [Guid]::NewGuid().ToString('N') + '.tmp'\n $stream = $null\n try {\n $stream = New-Object IO.FileStream($temporary, [IO.FileMode]::CreateNew, [Security.AccessControl.FileSystemRights]::Write, [IO.FileShare]::None, 4096, [IO.FileOptions]::WriteThrough, (PrivateAcl $false))\n $stream.Write($bytes, 0, $bytes.Length); $stream.Flush($true); $stream.Dispose(); $stream = $null\n $null = SafePath $path\n if ($null -ne (PathAttributes $path)) {\n $null = CheckOwner $path; CheckFileLinks $path\n # Replace preserves the destination ACL, so secure it before replacement.\n [IO.File]::SetAccessControl($path, (PrivateAcl $false))\n [IO.File]::Replace($temporary, $path, $null)\n } else { [IO.File]::Move($temporary, $path) }\n CheckPrivate $path\n } finally {\n if ($stream) { $stream.Dispose() }\n [IO.File]::Delete($temporary)\n }\n}\nfunction Credential($request) {\n if ([string]$request.scope -cnotmatch '^[a-f0-9]{64}$') { throw 'INVALID_SCOPE' }\n $directory = SafePath $request.directory\n $application = [IO.Path]::GetDirectoryName($directory)\n $path = Join-Path $directory ($request.scope + '.json')\n $null = SafePath $path\n if ($request.operation -eq 'credential-save') { PrivateDirectory $application; PrivateDirectory $directory }\n elseif ($null -eq (PathAttributes $directory)) { return $null }\n if (((PathAttributes $directory) -band [IO.FileAttributes]::Directory) -eq 0) { throw 'INVALID_PATH' }\n CheckPrivate $directory\n CheckPrivate $application\n $attributes = PathAttributes $path\n if ($null -ne $attributes -and ($attributes -band [IO.FileAttributes]::Directory) -ne 0) { throw 'INVALID_PATH' }\n if ($request.operation -eq 'credential-clear') {\n if ($null -ne $attributes) { CheckPrivate $path; [IO.File]::Delete($path) }\n return $null\n }\n Add-Type -AssemblyName System.Security\n $entropy = [Convert]::FromBase64String($request.entropy)\n if ($request.operation -eq 'credential-save') {\n $plain = [Convert]::FromBase64String($request.data)\n if ($plain.Length -eq 0 -or $plain.Length -gt 32768) { throw 'CREDENTIAL_CORRUPT' }\n $encrypted = [Security.Cryptography.ProtectedData]::Protect($plain, $entropy, [Security.Cryptography.DataProtectionScope]::CurrentUser)\n $record = @{version=1; scope=$request.scope; ciphertext=[Convert]::ToBase64String($encrypted)} | ConvertTo-Json -Compress\n AtomicPrivateWrite $path ([Text.Encoding]::UTF8.GetBytes($record))\n return $null\n }\n if ($null -eq $attributes) { return $null }\n CheckPrivate $path\n if ((Get-Item -LiteralPath $path).Length -gt 65536) { throw 'CREDENTIAL_CORRUPT' }\n try {\n $record = (New-Object Text.UTF8Encoding($false, $true)).GetString([IO.File]::ReadAllBytes($path)) | ConvertFrom-Json\n if ($record.version -ne 1 -or $record.scope -cne $request.scope -or !($record.ciphertext -is [string])) { throw 'CREDENTIAL_CORRUPT' }\n $plain = [Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($record.ciphertext), $entropy, [Security.Cryptography.DataProtectionScope]::CurrentUser)\n if ($plain.Length -eq 0 -or $plain.Length -gt 32768) { throw 'CREDENTIAL_CORRUPT' }\n return [Convert]::ToBase64String($plain)\n } catch { throw 'CREDENTIAL_CORRUPT' }\n}\nfunction PrependUserPath([string]$old, [string]$path) {\n $target = $path.TrimEnd('\\')\n $entries = @($old -split ';' | Where-Object { $_ -and $_.Trim().Trim('\"').TrimEnd('\\', '/').Replace('/', '\\') -ine $target })\n return ((@($path) + $entries) -join ';')\n}\ntry {\n $request = [Console]::In.ReadToEnd() | ConvertFrom-Json\n $value = $null\n switch ($request.operation) {\n 'private-directory' { PrivateDirectory $request.path }\n 'private-check' { CheckPrivate $request.path }\n 'safe-path' { $null = SafePath $request.path }\n 'private-write' { AtomicPrivateWrite $request.path ([Convert]::FromBase64String($request.data)) }\n 'credential-save' { $value = Credential $request }\n 'credential-load' { $value = Credential $request }\n 'credential-clear' { $value = Credential $request }\n 'open' {\n $start = New-Object Diagnostics.ProcessStartInfo\n $start.FileName = [string]$request.target; $start.UseShellExecute = $true\n $null = [Diagnostics.Process]::Start($start)\n }\n 'user-path' {\n $path = SafePath $request.path\n if ($path.Contains(';')) { throw 'INVALID_PATH' }\n $old = [Environment]::GetEnvironmentVariable('Path', 'User')\n [Environment]::SetEnvironmentVariable('Path', (PrependUserPath $old $path), 'User')\n try {\n Add-Type -TypeDefinition @'\nusing System;\nusing System.Runtime.InteropServices;\npublic static class BuddyEnvironmentNotify {\n [DllImport(\"user32.dll\", CharSet = CharSet.Unicode, SetLastError = true)]\n public static extern IntPtr SendMessageTimeout(IntPtr window, uint message, UIntPtr wParam, string lParam, uint flags, uint timeout, out UIntPtr result);\n}\n'@\n $broadcastResult = [UIntPtr]::Zero\n $notified = [BuddyEnvironmentNotify]::SendMessageTimeout([IntPtr]65535, 26, [UIntPtr]::Zero, 'Environment', 34, 1000, [ref]$broadcastResult)\n if ($notified -eq [IntPtr]::Zero) { throw 'ENVIRONMENT_BROADCAST_FAILED' }\n } catch { throw 'ENVIRONMENT_BROADCAST_FAILED' }\n }\n default { throw 'INVALID_OPERATION' }\n }\n [Console]::Out.Write((@{ok=$true; value=$value} | ConvertTo-Json -Compress))\n} catch {\n $code = if ($_.Exception.Message -eq 'ENOENT') { 'ENOENT' } elseif ($_.Exception.Message -eq 'CREDENTIAL_CORRUPT') { 'EBADMSG' } elseif ($_.Exception.Message -eq 'ENVIRONMENT_BROADCAST_FAILED') { 'ERELOGIN' } else { 'EPERM' }\n # Exception text can contain input. Never send it to logs or the terminal.\n [Console]::Out.Write((@{ok=$false; code=$code} | ConvertTo-Json -Compress)); exit 1\n}\n`;\n\nexport function windowsCommand(request: Record<string, unknown>, env: NodeJS.ProcessEnv = process.env): WindowsCommand {\n if (request.operation === \"user-path\" && (typeof request.path !== \"string\" || request.path.includes(\";\"))) {\n throw new Error(\"Windows PATH \u76EE\u5F55\u4E0D\u80FD\u5305\u542B\u5206\u53F7\uFF0C\u8BF7\u9009\u62E9\u6709\u6548\u7684\u672C\u5730\u5B89\u88C5\u76EE\u5F55\u3002\");\n }\n const systemRoot = env.SystemRoot ?? env.SYSTEMROOT;\n if (!systemRoot || !/^[A-Za-z]:[\\\\/]/u.test(systemRoot)) throw new Error(\"\u65E0\u6CD5\u5B9A\u4F4D Windows PowerShell\uFF0C\u8BF7\u68C0\u67E5 SystemRoot\u3002\");\n const command: WindowsCommand = {\n command: win32.join(systemRoot, \"System32\", \"WindowsPowerShell\", \"v1.0\", \"powershell.exe\"),\n args: [\"-NoLogo\", \"-NoProfile\", \"-NonInteractive\", \"-EncodedCommand\", Buffer.from(SCRIPT, \"utf16le\").toString(\"base64\")],\n input: JSON.stringify(request),\n };\n // CreateProcessW allows 32767 UTF-16 code units including the terminator.\n // Budget for quoting/escaping as well as the executable, leaving 2767 units spare.\n const commandLineBound = 1 + [command.command, ...command.args].reduce((size, part) => size + part.length + (part.match(/[\\\\\"]/gu)?.length ?? 0) + 3, 0);\n if (commandLineBound > 30000) throw new Error(\"Windows \u7CFB\u7EDF\u64CD\u4F5C\u547D\u4EE4\u8D85\u51FA\u5B89\u5168\u957F\u5EA6\uFF0C\u8BF7\u66F4\u65B0\u6216\u4FEE\u590D CLI \u5B89\u88C5\u3002\");\n return command;\n}\n\nexport async function runWindowsCommand(command: WindowsCommand): Promise<WindowsCommandResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command.command, [...command.args], { shell: false, windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const output: Buffer[] = []; let size = 0; let failure: Error | undefined;\n const timer = setTimeout(() => { failure = new Error(\"Windows \u7CFB\u7EDF\u64CD\u4F5C\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5 PowerShell \u662F\u5426\u88AB\u7CFB\u7EDF\u7B56\u7565\u963B\u6B62\u3002\"); child.kill(); }, 15_000);\n child.stdout.on(\"data\", (chunk: Buffer) => { size += chunk.length; if (size > 2 * 1024 * 1024) { failure = new Error(\"Windows \u7CFB\u7EDF\u64CD\u4F5C\u8FD4\u56DE\u8FC7\u591A\u6570\u636E\u3002\"); child.kill(); } else output.push(chunk); });\n child.stderr.resume();\n child.stdin.on(\"error\", () => undefined);\n child.once(\"error\", () => { clearTimeout(timer); reject(new Error(\"\u65E0\u6CD5\u8FD0\u884C Windows PowerShell\uFF0C\u8BF7\u68C0\u67E5\u7CFB\u7EDF\u7B56\u7565\u3002\")); });\n child.once(\"close\", code => { clearTimeout(timer); if (failure) reject(failure); else resolve({ code: code ?? 1, stdout: Buffer.concat(output).toString(\"utf8\"), stderr: \"\" }); });\n child.stdin.end(command.input, \"utf8\");\n });\n}\n\nexport async function windowsOperation(request: Record<string, unknown>, options: { runner?: WindowsCommandRunner; env?: NodeJS.ProcessEnv } = {}): Promise<unknown> {\n const command = windowsCommand(request, options.env);\n let result: WindowsCommandResult;\n try { result = await (options.runner ?? runWindowsCommand)(command); }\n catch (cause) {\n if (request.operation === \"user-path\") throw new Error(\"\u65E0\u6CD5\u786E\u8BA4\u7528\u6237 PATH \u66F4\u65B0\u4E0E\u684C\u9762\u901A\u77E5\u662F\u5426\u5B8C\u6210\uFF1B\u8BF7\u91CD\u65B0\u767B\u5F55 Windows \u540E\u68C0\u67E5 CLI\uFF0C\u4ECD\u4E0D\u53EF\u7528\u65F6\u91CD\u65B0\u8FD0\u884C setup\u3002\");\n throw cause;\n }\n let response: { ok?: boolean; value?: unknown; code?: string };\n try { response = JSON.parse(result.stdout.replace(/^\\uFEFF/u, \"\")); } catch { response = {}; }\n if (result.code !== 0 || response.ok !== true) {\n if (response.code === \"ERELOGIN\") throw Object.assign(new Error(\"\u7528\u6237 PATH \u5DF2\u4FDD\u5B58\uFF0C\u4F46\u672A\u80FD\u901A\u77E5 Windows \u684C\u9762\uFF1B\u8BF7\u91CD\u65B0\u767B\u5F55 Windows \u540E\u4F7F\u7528 CLI\u3002\"), { code: \"ERELOGIN\" });\n throw Object.assign(new Error(\"Windows \u5B89\u5168\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5F53\u524D\u7528\u6237\u7684\u6587\u4EF6\u6743\u9650\u548C PowerShell \u7CFB\u7EDF\u7B56\u7565\u3002\"), { code: response.code === \"ENOENT\" || response.code === \"EBADMSG\" ? response.code : \"EPERM\" });\n }\n return response.value;\n}\n", "import { constants } from \"node:fs\";\nimport { chmod, lstat, mkdir, open, rename, unlink } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { isAbsolute } from \"node:path\";\nimport { windowsOperation } from \"./windows.js\";\n\n/** Windows checks every ancestor for reparse points; POSIX rejects a linked target. */\nexport async function assertUnlinkedPath(path: string): Promise<void> {\n if (!isAbsolute(path)) throw new Error(\"\u79C1\u5BC6\u6587\u4EF6\u5FC5\u987B\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\u3002\");\n if (process.platform === \"win32\") await windowsOperation({ operation: \"safe-path\", path });\n const stat = await lstat(path).catch(cause => { if (cause.code !== \"ENOENT\") throw cause; return undefined; });\n if (stat && (stat.isSymbolicLink() || stat.isFile() && stat.nlink !== 1)) throw new Error(\"\u79C1\u5BC6\u6587\u4EF6\u4E0D\u80FD\u4F7F\u7528\u7B26\u53F7\u94FE\u63A5\u3001\u76EE\u5F55\u8054\u63A5\u6216\u786C\u94FE\u63A5\u3002\");\n}\n\nexport async function assertPrivatePath(path: string): Promise<void> {\n await assertUnlinkedPath(path);\n const stat = await lstat(path);\n if (!stat.isFile() && !stat.isDirectory()) throw new Error(\"\u79C1\u5BC6\u8DEF\u5F84\u5FC5\u987B\u662F\u666E\u901A\u6587\u4EF6\u6216\u76EE\u5F55\u3002\");\n if (process.platform === \"win32\") await windowsOperation({ operation: \"private-check\", path });\n else if (stat.uid !== process.getuid?.() || (stat.mode & 0o077) !== 0) throw new Error(\"\u79C1\u5BC6\u8DEF\u5F84\u5FC5\u987B\u5F52\u5F53\u524D\u7528\u6237\u6240\u6709\uFF0C\u4E14\u4EC5\u5F53\u524D\u7528\u6237\u53EF\u8BBF\u95EE\u3002\");\n}\n\nexport async function ensurePrivateDirectory(path: string): Promise<void> {\n await assertUnlinkedPath(path);\n if (process.platform === \"win32\") await windowsOperation({ operation: \"private-directory\", path });\n else {\n await mkdir(path, { recursive: true, mode: 0o700 });\n const stat = await lstat(path);\n if (!stat.isDirectory() || stat.uid !== process.getuid?.()) throw new Error(\"\u79C1\u5BC6\u76EE\u5F55\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7528\u6237\u3002\");\n await chmod(path, 0o700);\n }\n await assertPrivatePath(path);\n}\n\n/** Create with restricted access before writing any bytes, then atomically replace. */\nexport async function writePrivateFile(path: string, data: string | Uint8Array): Promise<void> {\n await assertUnlinkedPath(path);\n if (process.platform === \"win32\") {\n await windowsOperation({ operation: \"private-write\", path, data: Buffer.from(data).toString(\"base64\") });\n } else {\n const temporary = `${path}.${randomUUID()}.tmp`;\n let file;\n try {\n file = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);\n await file.writeFile(data); await file.sync(); await file.close(); file = undefined;\n await assertUnlinkedPath(path);\n await rename(temporary, path);\n } finally { await file?.close(); await unlink(temporary).catch(cause => { if (cause.code !== \"ENOENT\") throw cause; }); }\n }\n await assertPrivatePath(path);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["version", "spawn", "win32", "resolve", "win32", "resolve", "spawn", "isAbsolute", "isAbsolute", "stat"]
|
|
7
|
+
}
|