openmeld 0.3.218 → 0.3.220
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/dist/{add-me-membership-CY6oMdtz.js → add-me-membership-GzOoooxS.js} +2 -2
- package/dist/{add-me-membership-CY6oMdtz.js.map → add-me-membership-GzOoooxS.js.map} +1 -1
- package/dist/{agents-CzSR8rmW.js → agents-C8ATowD6.js} +9 -9
- package/dist/{agents-CzSR8rmW.js.map → agents-C8ATowD6.js.map} +1 -1
- package/dist/{api-client-foundation-BOBrz3Lx.js → api-client-foundation-CDlVc0zT.js} +3 -3
- package/dist/{api-client-foundation-BOBrz3Lx.js.map → api-client-foundation-CDlVc0zT.js.map} +1 -1
- package/dist/{api-client-foundation-D1M0bkwm.js → api-client-foundation-Dv2OE-Pi.js} +1 -1
- package/dist/{auth-session-BAq7KkIa.js → auth-session-CDhQANWx.js} +2 -2
- package/dist/{auth-session-BAq7KkIa.js.map → auth-session-CDhQANWx.js.map} +1 -1
- package/dist/auth-session-DsBkEFct.js +4 -0
- package/dist/{channel-DAZr7cKE.js → channel-D5ABuavH.js} +3 -3
- package/dist/{channel-DAZr7cKE.js.map → channel-D5ABuavH.js.map} +1 -1
- package/dist/{cli-space-api-Ccr8COpr.js → cli-space-api-skevaFSC.js} +6 -6
- package/dist/{cli-space-api-Ccr8COpr.js.map → cli-space-api-skevaFSC.js.map} +1 -1
- package/dist/{command-tsXWNPpM.js → command-CmlgCUU2.js} +15 -15
- package/dist/{command-tsXWNPpM.js.map → command-CmlgCUU2.js.map} +1 -1
- package/dist/{computer-connection-BK9TsQjc.js → computer-connection-DYnof5Xw.js} +2 -2
- package/dist/{computer-connection-BK9TsQjc.js.map → computer-connection-DYnof5Xw.js.map} +1 -1
- package/dist/{computer-connection-review-jPtrO484.js → computer-connection-review-Bjyn3UbU.js} +5 -5
- package/dist/{computer-connection-review-jPtrO484.js.map → computer-connection-review-Bjyn3UbU.js.map} +1 -1
- package/dist/{computer-disconnect-DzvN_Cbv.js → computer-disconnect-CRWsoihu.js} +7 -7
- package/dist/{computer-disconnect-DzvN_Cbv.js.map → computer-disconnect-CRWsoihu.js.map} +1 -1
- package/dist/{computer-setup-continuation-bJzZPnNU.js → computer-setup-continuation-D0kC6-l2.js} +3 -3
- package/dist/{computer-setup-continuation-bJzZPnNU.js.map → computer-setup-continuation-D0kC6-l2.js.map} +1 -1
- package/dist/{context-DN_LvdgC.js → context-D9Ebb5wl.js} +4 -4
- package/dist/{context-DN_LvdgC.js.map → context-D9Ebb5wl.js.map} +1 -1
- package/dist/{daemon-device-id-bP58j3NL.js → daemon-device-id-YnLMx1kN.js} +4 -4
- package/dist/{daemon-device-id-bP58j3NL.js.map → daemon-device-id-YnLMx1kN.js.map} +1 -1
- package/dist/{daemon-frame-transport-DFfxVRi2.js → daemon-frame-transport-E-H3DjWA.js} +27 -7
- package/dist/daemon-frame-transport-E-H3DjWA.js.map +1 -0
- package/dist/{daemon-lifecycle-journal-57QR_a3_.js → daemon-lifecycle-journal-DDrWgEzN.js} +4 -4
- package/dist/{daemon-lifecycle-journal-57QR_a3_.js.map → daemon-lifecycle-journal-DDrWgEzN.js.map} +1 -1
- package/dist/{daemon-service-manager-ReGjcyjq.js → daemon-service-manager-B-QrDe5p.js} +1 -1
- package/dist/{daemon-service-manager-rNRRVrj1.js → daemon-service-manager-HL4VKbIU.js} +2 -2
- package/dist/{daemon-service-manager-rNRRVrj1.js.map → daemon-service-manager-HL4VKbIU.js.map} +1 -1
- package/dist/{daemon-service-runtime-686fUcq9.js → daemon-service-runtime-M-kfrWro.js} +5 -5
- package/dist/{daemon-service-runtime-686fUcq9.js.map → daemon-service-runtime-M-kfrWro.js.map} +1 -1
- package/dist/{daemon-service-update-coordinator-DaoVYK6k.js → daemon-service-update-coordinator-Clqxj3A1.js} +12 -12
- package/dist/{daemon-service-update-coordinator-DaoVYK6k.js.map → daemon-service-update-coordinator-Clqxj3A1.js.map} +1 -1
- package/dist/{dist-CBWePGgY.js → dist-ChS52b_E.js} +2 -2
- package/dist/{dist-CBWePGgY.js.map → dist-ChS52b_E.js.map} +1 -1
- package/dist/{dist-CiLvbjZA.js → dist-YPzkhLLp.js} +74 -6
- package/dist/dist-YPzkhLLp.js.map +1 -0
- package/dist/{dist-C1fbc-VK.js → dist-kTVDInkZ.js} +1 -1
- package/dist/{elapsed-time-DslUBczL.js → elapsed-time-4PuBjDUi.js} +5 -5
- package/dist/{elapsed-time-DslUBczL.js.map → elapsed-time-4PuBjDUi.js.map} +1 -1
- package/dist/{entry-B3x5OX3x.js → entry-q_QHht2-.js} +7 -7
- package/dist/{entry-B3x5OX3x.js.map → entry-q_QHht2-.js.map} +1 -1
- package/dist/{installation-inventory-BZJmaCVr.js → installation-inventory-CuPmLaLZ.js} +3 -3
- package/dist/{installation-inventory-BZJmaCVr.js.map → installation-inventory-CuPmLaLZ.js.map} +1 -1
- package/dist/{installer-BRcaSYgu.js → installer-mSB-Oiwx.js} +2 -2
- package/dist/{installer-BRcaSYgu.js.map → installer-mSB-Oiwx.js.map} +1 -1
- package/dist/{openmeld-Bbffsx9Y.js → openmeld-CFXnmBH6.js} +36 -34
- package/dist/{openmeld-Bbffsx9Y.js.map → openmeld-CFXnmBH6.js.map} +1 -1
- package/dist/{openmeld-maintenance-worker-CDd4d01O.js → openmeld-maintenance-worker-K-nEox6k.js} +10 -10
- package/dist/{openmeld-maintenance-worker-CDd4d01O.js.map → openmeld-maintenance-worker-K-nEox6k.js.map} +1 -1
- package/dist/{openmeld-tools-update-join-htb9JVUN.js → openmeld-tools-update-join-CN4mjp4-.js} +4 -4
- package/dist/{openmeld-tools-update-join-htb9JVUN.js.map → openmeld-tools-update-join-CN4mjp4-.js.map} +1 -1
- package/dist/openmeld.js +4 -4
- package/dist/{prepare-provider-runtime-3eIWxGgM.js → prepare-provider-runtime-iA3g-8MS.js} +16 -11
- package/dist/prepare-provider-runtime-iA3g-8MS.js.map +1 -0
- package/dist/{prepare-session-executor-DO2p7uLE.js → prepare-session-executor-DbewUeyQ.js} +19 -19
- package/dist/{prepare-session-executor-DO2p7uLE.js.map → prepare-session-executor-DbewUeyQ.js.map} +1 -1
- package/dist/{process-channel-48ZNmEF6.js → process-channel-B2BU2X7x.js} +2 -2
- package/dist/{process-channel-48ZNmEF6.js.map → process-channel-B2BU2X7x.js.map} +1 -1
- package/dist/{runtime-C49hR7fG.js → runtime-D_AGEH9G.js} +16 -16
- package/dist/{runtime-C49hR7fG.js.map → runtime-D_AGEH9G.js.map} +1 -1
- package/dist/{runtime-agent-controller-reporting-submission-BJuVnZqs.js → runtime-agent-controller-reporting-submission-CB25cpq0.js} +8 -8
- package/dist/{runtime-agent-controller-reporting-submission-BJuVnZqs.js.map → runtime-agent-controller-reporting-submission-CB25cpq0.js.map} +1 -1
- package/dist/{runtime-reporting-health-state-4Y-fo13l.js → runtime-reporting-health-state-205lHdBE.js} +9 -9
- package/dist/{runtime-reporting-health-state-4Y-fo13l.js.map → runtime-reporting-health-state-205lHdBE.js.map} +1 -1
- package/dist/{runtime-transport-KEwcSZ89.js → runtime-transport-0F5E6So6.js} +11 -1
- package/dist/{runtime-transport-KEwcSZ89.js.map → runtime-transport-0F5E6So6.js.map} +1 -1
- package/dist/{service-account-authorization-A5Ly0UFD.js → service-account-authorization-DAPQy2yP.js} +2 -2
- package/dist/{service-account-authorization-A5Ly0UFD.js.map → service-account-authorization-DAPQy2yP.js.map} +1 -1
- package/dist/{service-account-control-DCz_pwrV.js → service-account-control-BQ1e5Y1X.js} +10 -10
- package/dist/{service-account-control-DCz_pwrV.js.map → service-account-control-BQ1e5Y1X.js.map} +1 -1
- package/dist/{service-control-capabilities-plI5rUzP.js → service-control-capabilities-C4520NIi.js} +4 -4
- package/dist/{service-control-capabilities-plI5rUzP.js.map → service-control-capabilities-C4520NIi.js.map} +1 -1
- package/dist/{service-control-capabilities-BPL-T8xI.js → service-control-capabilities-DPYmrWgX.js} +1 -1
- package/dist/{service-BlcIfxYE.js → service-yziCG6lR.js} +20 -20
- package/dist/service-yziCG6lR.js.map +1 -0
- package/dist/{state-Dj3YS3aV.js → state-DLMkZqd8.js} +2 -2
- package/dist/{state-Dj3YS3aV.js.map → state-DLMkZqd8.js.map} +1 -1
- package/dist/{upgrade-CRKSer_1.js → upgrade-BmM1hEB3.js} +7 -7
- package/dist/{upgrade-CRKSer_1.js.map → upgrade-BmM1hEB3.js.map} +1 -1
- package/dist/upgrade-neqPXWyw.js +4 -0
- package/dist/{windows-user-task-hNE24Gqr.js → windows-user-task-Bx2yYnOM.js} +1 -1
- package/dist/{windows-user-task-D4uMvea3.js → windows-user-task-CRGbKggi.js} +18 -3
- package/dist/windows-user-task-CRGbKggi.js.map +1 -0
- package/package.json +12 -12
- package/dist/auth-session-D-HTJNKZ.js +0 -4
- package/dist/daemon-frame-transport-DFfxVRi2.js.map +0 -1
- package/dist/dist-CiLvbjZA.js.map +0 -1
- package/dist/prepare-provider-runtime-3eIWxGgM.js.map +0 -1
- package/dist/service-BlcIfxYE.js.map +0 -1
- package/dist/upgrade-DdetA0-U.js +0 -4
- package/dist/windows-user-task-D4uMvea3.js.map +0 -1
package/dist/upgrade-DdetA0-U.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"windows-user-task-D4uMvea3.js","names":[],"sources":["../../../packages/schemas/dist/schemas/daemon/windows-user-task.js","../src/local-service/lifecycle/windows-task-host.ts","../src/local-service/lifecycle/windows-user-task.ts"],"sourcesContent":["import * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/windows-user-task.ts\nconst windowsUserTaskRequestSchema = z$1.strictObject({\n\tname: z$1.string().min(1),\n\tlegacyScript: z$1.string().min(1),\n\toperation: z$1.enum([\n\t\t\"install\",\n\t\t\"status\",\n\t\t\"start\",\n\t\t\"stop\",\n\t\t\"enable\",\n\t\t\"disable\",\n\t\t\"uninstall\"\n\t]),\n\texecutable: z$1.string().optional(),\n\targuments: z$1.string().optional(),\n\tworkingDirectory: z$1.string().optional(),\n\tperiodic: z$1.boolean().optional()\n});\nconst windowsUserTaskStatusSchema = z$1.strictObject({\n\tinstalled: z$1.boolean(),\n\trunning: z$1.boolean(),\n\tenabled: z$1.boolean(),\n\tlegacy: z$1.boolean(),\n\tactionArguments: z$1.string().nullable()\n});\nconst windowsUserTaskActionSchema = z$1.strictObject({\n\texecutable: z$1.string().min(1),\n\targs: z$1.array(z$1.string()),\n\tenv: z$1.record(z$1.string(), z$1.string()),\n\tlogPath: z$1.string().min(1)\n});\n//#endregion\nexport { windowsUserTaskActionSchema, windowsUserTaskRequestSchema, windowsUserTaskStatusSchema };\n\n//# sourceMappingURL=windows-user-task.js.map","// Task Scheduler must start a Windows-subsystem executable, not a console\n// executable that hides its window after startup. Keep the existing encoded\n// PowerShell action as the command/environment/logging owner.\n// Windows PowerShell 5.1 compiles this fixed source during guarded installation;\n// no SDK, downloaded executable, WSH/VBScript, or administrator access is needed.\nexport const WINDOWS_TASK_HOST_SOURCE = String.raw`\nusing System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\npublic static class OpenMeldTaskHostV1 {\n public static int Main(string[] args) {\n string logPath = Assembly.GetExecutingAssembly().Location + \".log\";\n try {\n // Accept only the existing OpenMeld action, never an arbitrary executable\n // or a shell-interpolated command line. Base64 contains no quoting syntax.\n if (args.Length != 7 || args[0] != \"-NoLogo\" || args[1] != \"-NoProfile\" ||\n args[2] != \"-NonInteractive\" || args[3] != \"-WindowStyle\" ||\n args[4] != \"Hidden\" || args[5] != \"-EncodedCommand\" ||\n !Regex.IsMatch(args[6], @\"\\A[A-Za-z0-9+/]+={0,2}\\z\"))\n throw new ArgumentException(\"Invalid OpenMeld task arguments.\");\n Convert.FromBase64String(args[6]);\n var start = new ProcessStartInfo();\n start.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),\n @\"WindowsPowerShell\\v1.0\\powershell.exe\");\n start.Arguments = String.Join(\" \", args);\n start.UseShellExecute = false;\n start.CreateNoWindow = true;\n start.RedirectStandardInput = true;\n start.RedirectStandardOutput = true;\n start.RedirectStandardError = true;\n using (var log = Stream.Synchronized(new FileStream(logPath, FileMode.Append,\n FileAccess.Write, FileShare.ReadWrite)))\n using (var child = new Process()) {\n child.StartInfo = start;\n child.Start();\n child.StandardInput.Close();\n var stdout = child.StandardOutput.BaseStream.CopyToAsync(log);\n var stderr = child.StandardError.BaseStream.CopyToAsync(log);\n // Do not detach or break away from Task Scheduler's process ownership.\n // The task remains running until the action completes, and restart-on-\n // failure still receives the action's real exit code.\n child.WaitForExit();\n stdout.GetAwaiter().GetResult();\n stderr.GetAwaiter().GetResult();\n return child.ExitCode;\n }\n } catch (Exception error) {\n try { File.AppendAllText(logPath, DateTime.UtcNow.ToString(\"o\") + \" \" +\n error.GetType().Name + \": \" + error.Message + Environment.NewLine, Encoding.UTF8); }\n catch { /* Task Scheduler still receives a nonzero result if logging fails. */ }\n return 1;\n }\n }\n}\n`;\n\n// Per-task, lane-owned path: updating the maintenance host cannot replace the\n// executable of a running main Service, or vice versa. Keep v1 stable; a future\n// host format must explicitly support migration from this path.\nexport const WINDOWS_TASK_HOST_SUFFIX = \".task-host-v1.exe\";\n\n// The caller has already verified identity and acquired the lifecycle grant.\n// Build beside the target and replace atomically, never overwrite a running\n// host or fall back to a flashing console when compilation is unavailable.\nexport const WINDOWS_TASK_HOST_INSTALL_SCRIPT = `\n$hostDirectory = [IO.Path]::GetDirectoryName($hostPath)\n$null = [IO.Directory]::CreateDirectory($hostDirectory)\n$temporaryHost = Join-Path $hostDirectory ([Guid]::NewGuid().ToString('N') + '.exe')\ntry {\n Add-Type -TypeDefinition @'\n${WINDOWS_TASK_HOST_SOURCE}\n'@ -OutputAssembly $temporaryHost -OutputType WindowsApplication -ErrorAction Stop\n if ($task -and $task.State -eq 4) { throw 'OpenMeld cannot replace a background task while it is running.' }\n if ([IO.File]::Exists($hostPath)) {\n # PowerShell coerces bare $null to an empty string for this .NET parameter.\n # Pass a real null backup path; an empty path breaks repeat setup/repair.\n [IO.File]::Replace($temporaryHost, $hostPath, [NullString]::Value)\n } else {\n [IO.File]::Move($temporaryHost, $hostPath)\n }\n} finally {\n if ([IO.File]::Exists($temporaryHost)) { [IO.File]::Delete($temporaryHost) }\n}\n`;\n","import { type ExecFileException, execFile } from \"node:child_process\";\nimport { normalizeCommandEnvironment } from \"@openmeld/adapter-core/process-environment\";\nimport {\n powerShellEncodedArguments,\n resolveWindowsPowerShellPath,\n} from \"@openmeld/adapter-core/windows-system\";\nimport {\n type WindowsUserTaskRequest,\n windowsUserTaskActionSchema,\n windowsUserTaskRequestSchema,\n windowsUserTaskStatusSchema,\n} from \"@openmeld/schemas\";\nimport { currentDaemonServiceLifecycleLock } from \"../../config/daemon-state\";\nimport {\n attachLockProcess,\n type OpenMeldLock,\n releaseLock,\n} from \"../../config/lock\";\nimport {\n WINDOWS_TASK_HOST_INSTALL_SCRIPT,\n WINDOWS_TASK_HOST_SUFFIX,\n} from \"./windows-task-host\";\n\n// Task Scheduler runs in the signed-in user's session, with that user's tokens\n// and ordinary permissions. No password, elevation, or third-party service host.\n// Native COM contracts: learn.microsoft.com/windows/win32/taskschd/\nconst TASK_CONTROL = String.raw`\n$ErrorActionPreference = 'Stop'\n$ProgressPreference = 'SilentlyContinue'\n[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)\n$r = ConvertFrom-Json ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($env:OPENMELD_TASK_REQUEST)))\nif ($env:OPENMELD_TASK_GRANT_REQUIRED -eq '1' -and [Console]::In.ReadLine() -ne 'execute') { exit 125 }\n$env:OPENMELD_TASK_GRANT_REQUIRED = $null\n$sid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value\nif ($sid -in @('S-1-5-18','S-1-5-19','S-1-5-20')) { throw 'Run OpenMeld setup from your own Windows account, not a system account.' }\n$scheduler = New-Object -ComObject 'Schedule.Service'\n$scheduler.Connect()\n$folder = $scheduler.GetFolder('\\')\n$name = $r.name + '-' + $sid\n$hostPath = $r.legacyScript + '${WINDOWS_TASK_HOST_SUFFIX}'\n$task = $null\ntry { $task = $folder.GetTask($name) } catch {\n if ($_.Exception.GetBaseException().HResult -ne -2147024894) { throw }\n}\nif ($task) {\n $principal = $task.Definition.Principal\n $taskSid = $principal.UserId\n if ($taskSid -notmatch '^S-\\d-') { $taskSid = ([Security.Principal.NTAccount]$taskSid).Translate([Security.Principal.SecurityIdentifier]).Value }\n $actionPath = $task.Definition.Actions.Item(1).Path\n if ($taskSid -ne $sid -or $principal.LogonType -ne 3 -or $principal.RunLevel -ne 0 -or $task.Definition.Actions.Count -ne 1 -or ($actionPath -ne (Join-Path $PSHOME 'powershell.exe') -and $actionPath -ne $hostPath)) {\n throw 'An existing OpenMeld task uses a different user or launch configuration. Resolve that installation before continuing.'\n }\n}\n# Migration only owns the exact legacy script in this lane. Never stop another\n# user's or an administrator-customized service merely because its name matches.\n$legacy = Get-CimInstance Win32_Service -Filter (\"Name='\" + $r.name.Replace(\"'\",\"''\") + \"'\")\nif ($legacy -and $legacy.PathName.Trim('\"') -ne $r.legacyScript) {\n throw 'An existing Windows service uses a different installation. Resolve that installation before continuing.'\n}\nswitch ($r.operation) {\n 'install' {\n if ($legacy -and $legacy.State -ne 'Stopped') { throw 'The previous OpenMeld Service must finish stopping before migration.' }\n if ($task -and $task.State -eq 4) { throw 'OpenMeld cannot replace a background task while it is running.' }\n if ($r.executable -ne (Join-Path $PSHOME 'powershell.exe')) { throw 'OpenMeld tasks must launch the system PowerShell action.' }\n ${WINDOWS_TASK_HOST_INSTALL_SCRIPT}\n $definition = $scheduler.NewTask(0)\n $definition.RegistrationInfo.Description = 'OpenMeld background process for the signed-in user.'\n $definition.Principal.UserId = $sid\n $definition.Principal.LogonType = 3\n $definition.Principal.RunLevel = 0\n $definition.Settings.Enabled = ($null -eq $legacy)\n $definition.Settings.Hidden = $true\n $definition.Settings.AllowDemandStart = $true\n $definition.Settings.DisallowStartIfOnBatteries = $false\n $definition.Settings.StopIfGoingOnBatteries = $false\n $definition.Settings.RunOnlyIfNetworkAvailable = $false\n $definition.Settings.StartWhenAvailable = $true\n $definition.Settings.ExecutionTimeLimit = 'PT0S'\n $definition.Settings.MultipleInstances = 2\n $definition.Settings.RestartInterval = 'PT1M'\n $definition.Settings.RestartCount = 999\n $trigger = $definition.Triggers.Create(9)\n $trigger.UserId = $sid\n if ($r.periodic) {\n $timer = $definition.Triggers.Create(1)\n $timer.StartBoundary = (Get-Date).AddMinutes(1).ToString('yyyy-MM-ddTHH:mm:ss')\n $timer.Repetition.Interval = 'PT1H'\n }\n $action = $definition.Actions.Create(0)\n $action.Path = $hostPath\n $action.Arguments = $r.arguments\n $action.WorkingDirectory = $r.workingDirectory\n $task = $folder.RegisterTaskDefinition($name, $definition, 6, $sid, $null, 3, $null)\n if ($legacy) {\n try {\n $deleted = Invoke-CimMethod -InputObject $legacy -MethodName Delete\n if ($deleted.ReturnValue -ne 0) { throw ('Cannot remove the old Windows Service (code ' + $deleted.ReturnValue + '). An administrator must remove the old registration before setup can continue.') }\n } catch {\n $folder.DeleteTask($name,0)\n throw\n }\n $task.Enabled = $true\n }\n $legacy = $null\n }\n 'start' { if (!$task) { throw 'OpenMeld background task is not installed. Run setup to repair it.' }; $null = $task.Run($null) }\n 'enable' { if ($task) { $task.Enabled = $true } }\n 'disable' { if ($task) { $task.Enabled = $false }; if ($legacy) { $result = Invoke-CimMethod -InputObject $legacy -MethodName ChangeStartMode -Arguments @{StartMode='Manual'}; if ($result.ReturnValue -ne 0) { throw 'Cannot disable the old Windows Service. Administrator assistance is required.' } } }\n 'stop' {\n if ($task) { $task.Stop(0) }\n if ($legacy -and $legacy.State -ne 'Stopped') {\n $result = Invoke-CimMethod -InputObject $legacy -MethodName StopService\n if ($result.ReturnValue -notin @(0,6)) { throw 'Cannot stop the old Windows Service. Administrator assistance is required.' }\n }\n }\n 'uninstall' {\n if ($task) { $task.Stop(0); $folder.DeleteTask($name,0); $task = $null }\n if ($legacy) {\n if ($legacy.State -ne 'Stopped') { throw 'The old OpenMeld Service is still running.' }\n $result = Invoke-CimMethod -InputObject $legacy -MethodName Delete\n if ($result.ReturnValue -ne 0) { throw 'Cannot remove the old Windows Service. Administrator assistance is required.' }\n $legacy = $null\n }\n }\n 'status' { }\n default { throw 'Unknown OpenMeld task operation.' }\n}\n@{ installed=($null -ne $task -or $null -ne $legacy); running=($(if ($task) { $task.State -eq 4 } else { $legacy -and $legacy.State -ne 'Stopped' })); enabled=($(if ($task) { [bool]$task.Enabled } else { $legacy -and $legacy.StartMode -eq 'Auto' })); legacy=($null -ne $legacy); actionArguments=($(if ($task) { $task.Definition.Actions.Item(1).Arguments } else { $null })) } | ConvertTo-Json -Compress\n`;\n\nexport function windowsPowerShellPath(): string {\n return resolveWindowsPowerShellPath();\n}\n\nexport function windowsTaskActionArguments(input: {\n executable: string;\n args: string[];\n env: Record<string, string>;\n logPath: string;\n}): string {\n const data = Buffer.from(JSON.stringify(input)).toString(\"base64\");\n const script = String.raw`\n$ErrorActionPreference = 'Stop'\n$c = ConvertFrom-Json ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('${data}')))\nfunction Quote-ProcessArgument([string]$value) {\n '\"' + [regex]::Replace([regex]::Replace($value, '(\\\\*)\"', '$1$1\\\"'), '(\\\\+)$', '$1$1') + '\"'\n}\n$start = New-Object Diagnostics.ProcessStartInfo\n$start.FileName = $c.executable\n$start.Arguments = (@($c.args | ForEach-Object { Quote-ProcessArgument $_ }) -join ' ')\n$start.UseShellExecute = $false\n$start.CreateNoWindow = $true\n$start.RedirectStandardOutput = $true\n$start.RedirectStandardError = $true\nforeach ($property in $c.env.PSObject.Properties) { $start.EnvironmentVariables[$property.Name] = [string]$property.Value }\n$log = [IO.Stream]::Synchronized([IO.File]::Open($c.logPath, [IO.FileMode]::Append, [IO.FileAccess]::Write, [IO.FileShare]::ReadWrite))\n$process = New-Object Diagnostics.Process\n$process.StartInfo = $start\ntry {\n $null = $process.Start()\n $stdout = $process.StandardOutput.BaseStream.CopyToAsync($log)\n $stderr = $process.StandardError.BaseStream.CopyToAsync($log)\n $process.WaitForExit()\n $stdout.GetAwaiter().GetResult()\n $stderr.GetAwaiter().GetResult()\n $exitCode = $process.ExitCode\n} finally {\n $log.Dispose()\n $process.Dispose()\n}\nexit $exitCode\n`;\n return `-NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -EncodedCommand ${Buffer.from(script, \"utf16le\").toString(\"base64\")}`;\n}\n\nconst ENCODED_ACTION_PATTERN = /-EncodedCommand ([A-Za-z0-9+/=]+)$/u;\nconst ACTION_DATA_PATTERN = /FromBase64String\\('([A-Za-z0-9+/=]+)'\\)/u;\n\nexport function readWindowsTaskAction(argumentsText: string) {\n const encoded = argumentsText.match(ENCODED_ACTION_PATTERN)?.[1];\n const data =\n encoded &&\n Buffer.from(encoded, \"base64\")\n .toString(\"utf16le\")\n .match(ACTION_DATA_PATTERN)?.[1];\n if (!data) {\n throw new Error(\n \"Windows task does not contain an OpenMeld launch command.\"\n );\n }\n const action = windowsUserTaskActionSchema.safeParse(\n JSON.parse(Buffer.from(data, \"base64\").toString(\"utf8\"))\n );\n if (!action.success) {\n throw new Error(\n \"Windows task contains an invalid OpenMeld launch command.\"\n );\n }\n return action.data;\n}\n\nexport async function runWindowsUserTask(\n request: WindowsUserTaskRequest\n): Promise<{\n installed: boolean;\n running: boolean;\n enabled: boolean;\n legacy: boolean;\n actionArguments: string | null;\n}> {\n const lock = currentDaemonServiceLifecycleLock();\n const payload = Buffer.from(\n JSON.stringify(windowsUserTaskRequestSchema.parse(request))\n ).toString(\"base64\");\n let finish!: (value: {\n error: ExecFileException | null;\n stdout: string;\n }) => void;\n const completed = new Promise<{\n error: ExecFileException | null;\n stdout: string;\n }>((resolve) => {\n finish = resolve;\n });\n const child = execFile(\n windowsPowerShellPath(),\n powerShellEncodedArguments(TASK_CONTROL),\n {\n encoding: \"utf8\",\n windowsHide: true,\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n env: {\n ...normalizeCommandEnvironment(process.env),\n OPENMELD_TASK_REQUEST: payload,\n OPENMELD_TASK_GRANT_REQUIRED: lock ? \"1\" : \"0\",\n },\n },\n (error, stdout) => finish({ error, stdout })\n );\n // EOF before the grant prevents the COM operation. Once granted, this exact\n // PowerShell instance retains the existing lifecycle fence if its CLI dies.\n // This is not a Wake Job: the independently scheduled Service must survive it.\n child.stdin?.on(\"error\", () => undefined);\n let participant: OpenMeldLock | undefined;\n try {\n if (lock) {\n if (!child.pid) {\n throw new Error(\"Windows task control did not establish a process.\");\n }\n participant = await attachLockProcess(lock, child.pid);\n }\n child.stdin?.end(lock ? \"execute\\n\" : undefined);\n const result = await completed;\n if (result.error) {\n throw result.error;\n }\n const status = windowsUserTaskStatusSchema.safeParse(\n JSON.parse(result.stdout.trim())\n );\n if (!status.success) {\n throw new Error(\"Windows returned an invalid OpenMeld task status.\");\n }\n return status.data;\n } finally {\n child.stdin?.destroy();\n if (child.exitCode === null && child.signalCode === null) {\n child.kill();\n }\n await completed;\n if (participant) {\n await releaseLock(participant);\n }\n }\n}\n"],"mappings":"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"}
|