openmeld 0.3.213 → 0.3.214
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-GbaxKxz-.js → add-me-membership-BaqG9F5c.js} +2 -2
- package/dist/{add-me-membership-GbaxKxz-.js.map → add-me-membership-BaqG9F5c.js.map} +1 -1
- package/dist/{agents-BNoz9DA5.js → agents-y9C8FCyv.js} +8 -8
- package/dist/{agents-BNoz9DA5.js.map → agents-y9C8FCyv.js.map} +1 -1
- package/dist/{api-client-foundation-TEBOwWl1.js → api-client-foundation-BYnU1pbS.js} +1 -1
- package/dist/{api-client-foundation-km8Ol1P4.js → api-client-foundation-CKRP7Ymg.js} +3 -3
- package/dist/{api-client-foundation-km8Ol1P4.js.map → api-client-foundation-CKRP7Ymg.js.map} +1 -1
- package/dist/auth-session-BWKfXWxl.js +4 -0
- package/dist/{auth-session-DgHvRt5i.js → auth-session-gaLjWIKR.js} +8 -6
- package/dist/auth-session-gaLjWIKR.js.map +1 -0
- package/dist/{base-url-C6sHRNGu.js → base-url-BczddvzH.js} +2 -2
- package/dist/{base-url-C6sHRNGu.js.map → base-url-BczddvzH.js.map} +1 -1
- package/dist/{base-url-BE3pFiOZ.js → base-url-CfyKRz89.js} +1 -1
- package/dist/{command-Dsa8gaFe.js → command-C72QNhjP.js} +12 -12
- package/dist/{command-Dsa8gaFe.js.map → command-C72QNhjP.js.map} +1 -1
- package/dist/{computer-connection-D8tX14R_.js → computer-connection-Dv9kex7h.js} +2 -2
- package/dist/{computer-connection-D8tX14R_.js.map → computer-connection-Dv9kex7h.js.map} +1 -1
- package/dist/{computer-connection-review-CjOXBWiV.js → computer-connection-review-_ZLPsdE_.js} +6 -6
- package/dist/{computer-connection-review-CjOXBWiV.js.map → computer-connection-review-_ZLPsdE_.js.map} +1 -1
- package/dist/{computer-disconnect-k6UVCsVF.js → computer-disconnect-BJ-Tl-7q.js} +9 -9
- package/dist/{computer-disconnect-k6UVCsVF.js.map → computer-disconnect-BJ-Tl-7q.js.map} +1 -1
- package/dist/{computer-setup-continuation-DhY_sJis.js → computer-setup-continuation-CN383Vvy.js} +4 -4
- package/dist/{computer-setup-continuation-DhY_sJis.js.map → computer-setup-continuation-CN383Vvy.js.map} +1 -1
- package/dist/{daemon-runtime-lease-Dd4hdHNo.js → daemon-runtime-lease-CIzOT1zx.js} +2 -2
- package/dist/{daemon-runtime-lease-Dd4hdHNo.js.map → daemon-runtime-lease-CIzOT1zx.js.map} +1 -1
- package/dist/{daemon-runtime-lease-y3n1K0-C.js → daemon-runtime-lease-_M6hW8Mg.js} +1 -1
- package/dist/{daemon-service-manager-GiMCiTmu.js → daemon-service-manager-DxS5eH_N.js} +4 -4
- package/dist/{daemon-service-manager-GiMCiTmu.js.map → daemon-service-manager-DxS5eH_N.js.map} +1 -1
- package/dist/{daemon-service-manager-Bh0LoLed.js → daemon-service-manager-fPpyIyrU.js} +1 -1
- package/dist/{daemon-service-runtime-CY6wdBe1.js → daemon-service-runtime-CGT3yVOs.js} +22 -16
- package/dist/{daemon-service-runtime-CY6wdBe1.js.map → daemon-service-runtime-CGT3yVOs.js.map} +1 -1
- package/dist/{daemon-service-update-coordinator-BcbbIDzC.js → daemon-service-update-coordinator--xLHNqDT.js} +625 -55
- package/dist/daemon-service-update-coordinator--xLHNqDT.js.map +1 -0
- package/dist/{daemon-state-C37ZtIZK.js → daemon-state-CoAZLwpi.js} +3 -3
- package/dist/{daemon-state-C37ZtIZK.js.map → daemon-state-CoAZLwpi.js.map} +1 -1
- package/dist/dist-CABuqfdH.js +4 -0
- package/dist/{dist-CAx_kxvt.js → dist-Dj3TOx03.js} +481 -195
- package/dist/dist-Dj3TOx03.js.map +1 -0
- package/dist/distribution-BDQT2ilb.js +20 -0
- package/dist/distribution-BDQT2ilb.js.map +1 -0
- package/dist/{elapsed-time-Do3uIV__.js → elapsed-time-CCFWbCC8.js} +5 -5
- package/dist/{elapsed-time-Do3uIV__.js.map → elapsed-time-CCFWbCC8.js.map} +1 -1
- package/dist/{installation-inventory-C92AkQkA.js → installation-inventory-C4WKcVEj.js} +6 -6
- package/dist/{installation-inventory-C92AkQkA.js.map → installation-inventory-C4WKcVEj.js.map} +1 -1
- package/dist/{lock-Dxp6o_t_.js → lock-CAt9uTnZ.js} +5 -48
- package/dist/lock-CAt9uTnZ.js.map +1 -0
- package/dist/{openmeld-I4pLxQsY.js → openmeld-DpV9lAF-.js} +312 -188
- package/dist/openmeld-DpV9lAF-.js.map +1 -0
- package/dist/openmeld-dev.js +1 -1
- package/dist/{openmeld-environment-target-NtJYJe1D.js → openmeld-environment-target-BWI2adGw.js} +3 -3
- package/dist/{openmeld-environment-target-NtJYJe1D.js.map → openmeld-environment-target-BWI2adGw.js.map} +1 -1
- package/dist/{openmeld-maintenance-worker-D5VAO9GD.js → openmeld-maintenance-worker-Blfu_oOo.js} +9 -9
- package/dist/{openmeld-maintenance-worker-D5VAO9GD.js.map → openmeld-maintenance-worker-Blfu_oOo.js.map} +1 -1
- package/dist/{openmeld-tools-update-join-DsQdgYNw.js → openmeld-tools-update-join-BpLwmowQ.js} +4 -4
- package/dist/{openmeld-tools-update-join-DsQdgYNw.js.map → openmeld-tools-update-join-BpLwmowQ.js.map} +1 -1
- package/dist/openmeld.js +3 -3
- package/dist/{prepare-session-executor-BEzlM0hJ.js → prepare-session-executor-Cfm3EvXl.js} +16 -16
- package/dist/{prepare-session-executor-BEzlM0hJ.js.map → prepare-session-executor-Cfm3EvXl.js.map} +1 -1
- package/dist/process-identity-Clby123a.js +145 -0
- package/dist/process-identity-Clby123a.js.map +1 -0
- package/dist/{runtime-transport-DxISZdzf.js → runtime-transport-D8G8sANa.js} +92 -6
- package/dist/runtime-transport-D8G8sANa.js.map +1 -0
- package/dist/{service-Cev-7yAJ.js → service-Cl_Ge6oJ.js} +720 -35
- package/dist/service-Cl_Ge6oJ.js.map +1 -0
- package/dist/{distribution-DY2fBeSW.js → service-account-admission-Dy2W3n3_.js} +9 -19
- package/dist/service-account-admission-Dy2W3n3_.js.map +1 -0
- package/dist/{service-account-authorization-AbowIr6n.js → service-account-authorization-4oZuo8sT.js} +6 -6
- package/dist/{service-account-authorization-AbowIr6n.js.map → service-account-authorization-4oZuo8sT.js.map} +1 -1
- package/dist/{service-account-control-BV_tBiio.js → service-account-control-CTXv3924.js} +11 -12
- package/dist/service-account-control-CTXv3924.js.map +1 -0
- package/dist/{service-control-capabilities-BGXPenm1.js → service-control-capabilities-B-vCQoBV.js} +1 -1
- package/dist/service-control-capabilities-ptf0u8n5.js +70 -0
- package/dist/service-control-capabilities-ptf0u8n5.js.map +1 -0
- package/dist/service-control-carrier-capability-hvpD7hGf.js +24 -0
- package/dist/service-control-carrier-capability-hvpD7hGf.js.map +1 -0
- package/dist/upgrade-EWdIdoHm.js +4 -0
- package/dist/{upgrade-9h70HCQP.js → upgrade-vuPM1iX3.js} +7 -7
- package/dist/{upgrade-9h70HCQP.js.map → upgrade-vuPM1iX3.js.map} +1 -1
- package/dist/{windows-user-task-DxPN7TzK.js → windows-user-task-FdycoSb4.js} +1 -1
- package/dist/{windows-user-task-DqJWtlAm.js → windows-user-task-i0oHCBc0.js} +49 -19
- package/dist/windows-user-task-i0oHCBc0.js.map +1 -0
- package/package.json +2 -2
- package/dist/auth-session-D6UDl3r3.js +0 -4
- package/dist/auth-session-DgHvRt5i.js.map +0 -1
- package/dist/daemon-service-update-coordinator-BcbbIDzC.js.map +0 -1
- package/dist/dist-Bsz_wafH.js +0 -4
- package/dist/dist-CAx_kxvt.js.map +0 -1
- package/dist/distribution-DY2fBeSW.js.map +0 -1
- package/dist/lock-Dxp6o_t_.js.map +0 -1
- package/dist/openmeld-I4pLxQsY.js.map +0 -1
- package/dist/runtime-transport-DxISZdzf.js.map +0 -1
- package/dist/service-Cev-7yAJ.js.map +0 -1
- package/dist/service-account-control-BV_tBiio.js.map +0 -1
- package/dist/service-control-capabilities-DUudAKoj.js +0 -54
- package/dist/service-control-capabilities-DUudAKoj.js.map +0 -1
- package/dist/upgrade-CXgHeEKK.js +0 -4
- package/dist/windows-user-task-DqJWtlAm.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-account-control-BV_tBiio.js","names":["delay"],"sources":["../src/commands/service-account-control.ts"],"sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport {\n SERVICE_ACCOUNT_STOP_REFUSED_CODE,\n type ServiceAccountControlRequest,\n serviceAccountControlRequestSchema,\n} from \"@openmeld/schemas\";\nimport {\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n readServiceAdmissionSessionWithOwnership,\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../config/auth-session\";\nimport { withAuthSessionTransitionMutationLock } from \"../config/auth-session-transition-lock\";\nimport { readDaemonRuntimeLease } from \"../config/daemon-runtime-lease\";\nimport {\n readDaemonServiceContract,\n upsertDaemonServiceContract,\n} from \"../config/daemon-service-contract\";\nimport { withDaemonServiceRunLock } from \"../config/daemon-state\";\nimport {\n cancelServiceAccountAdmission,\n readServiceAccountAdmission,\n reserveServiceAccountAdmission,\n ServiceAccountAdmissionError,\n} from \"../config/service-account-admission\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../local-service/control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../local-service/core/constants\";\nimport { buildDaemonSystemServiceCommandSpec } from \"../local-service/lifecycle/daemon-service-command-spec\";\nimport {\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveServiceAccountIdentity } from \"../local-service/lifecycle/service-account-authorization\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { readProcessStartIdentity } from \"../system/process-identity\";\nimport { fetchAuthUserSnapshot } from \"./auth-device-session-client\";\nimport { runDaemonServiceDetached, runDaemonStop } from \"./service\";\nimport { createQuietPresenter } from \"./service-output\";\n\ntype Contract = NonNullable<\n Awaited<ReturnType<typeof readDaemonServiceContract>>\n>;\n\nfunction refused(reason: string, message: string): never {\n throw new ServiceAccountAdmissionError(reason, message);\n}\n\nexport async function runServiceAccountControl(\n request: ServiceAccountControlRequest,\n expectedSessionIdentity?: string\n): Promise<void> {\n const parsed = serviceAccountControlRequestSchema.safeParse(request);\n if (!parsed.success) {\n refused(\n \"missing_account\",\n \"Choose a signed-in account before controlling this Service.\"\n );\n }\n const input = parsed.data;\n if (process.platform === \"win32\") {\n refused(\n \"unsupported_platform\",\n \"Account-checked Service control is not available on Windows yet.\"\n );\n }\n const auth = await getAuthSessionState();\n if (auth.state !== \"valid\" || !auth.session) {\n refused(\n \"authentication_required\",\n \"Sign in to the CLI with the matching account and try again.\"\n );\n }\n const preparedSession = auth.session;\n if (preparedSession.user?.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI is signed in to a different account. Sign in with the matching account and try again.\"\n );\n }\n // The shared Auth endpoint proves the principal. Local metadata alone does not.\n const user = await fetchAuthUserSnapshot({\n authBaseUrl: preparedSession.authBaseUrl,\n accessToken: preparedSession.accessToken,\n });\n if (user.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI session belongs to a different account. Sign in again and retry.\"\n );\n }\n\n await withDaemonServiceRunLock(async () => {\n const contract = await readDaemonServiceContract();\n if (!contract) {\n refused(\n \"ownership_unknown\",\n \"Connect this computer through OpenMeld setup before controlling its Service.\"\n );\n }\n const observed = await readCurrentDaemonRuntimeContext();\n const lease = await readDaemonRuntimeLease();\n if (\n input.operation === \"start\" &&\n observed.effectiveRuntimeStatus !== \"not_running\"\n ) {\n refused(\n \"busy\",\n \"The Service is already running or its state is uncertain. Check Service status before trying again.\"\n );\n }\n if (\n input.operation === \"stop\" &&\n (observed.effectiveRuntimeStatus !== \"running\" ||\n !lease ||\n lease.generation !== contract.generation)\n ) {\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not verify the running Service. Check Service status before trying again.\"\n );\n }\n\n let boundSession: StoredAuthSession = preparedSession;\n const reservation = await withAuthSessionTransitionMutationLock(\n async () => {\n boundSession = await readServiceAdmissionSessionWithOwnership();\n if (\n (expectedSessionIdentity !== undefined &&\n buildStoredAuthSessionIdentity(boundSession) !==\n expectedSessionIdentity) ||\n boundSession.accessToken !== preparedSession.accessToken ||\n boundSession.createdAt !== preparedSession.createdAt ||\n boundSession.user?.id !== input.expectedAccount\n ) {\n refused(\n \"account_changed\",\n \"The CLI sign-in changed before this action was accepted. Check the account and try again.\"\n );\n }\n const current = await readDaemonServiceContract();\n if (!current || JSON.stringify(current) !== JSON.stringify(contract)) {\n refused(\n \"ownership_changed\",\n \"The Service changed before this action was accepted. Check its status and try again.\"\n );\n }\n const identity = await resolveServiceAccountIdentity(\n boundSession,\n contract\n );\n if (\n input.operation === \"start\" &&\n contract.desiredState !== \"background\"\n ) {\n identity.contractGeneration += 1;\n }\n return await reserveServiceAccountAdmission({\n operation: input.operation,\n identity,\n ...(input.operation === \"stop\" && lease\n ? {\n target: {\n ownerPid: lease.pid,\n ownerProcessStartedAt:\n readProcessStartIdentity(lease.pid) ??\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not identify the Service process. Check its status and try again.\"\n ),\n },\n }\n : {}),\n });\n }\n );\n\n try {\n await withAdmittedServiceSession(boundSession, async () => {\n if (input.operation === \"stop\") {\n await stopReservedService(contract, reservation.id, lease?.pid ?? 0);\n return;\n }\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n if (\n contract.serviceController !== \"legacy-detached\" &&\n !(manager && (await manager.status()).installed)\n ) {\n refused(\n \"installation_required\",\n \"This Service needs setup before it can start. Run OpenMeld setup and try again.\"\n );\n }\n await upsertDaemonServiceContract({\n ...contract,\n desiredState: \"background\",\n });\n if (contract.serviceController === \"legacy-detached\") {\n const runtime = await resolveRuntimeContext({ view: \"agent\" });\n await runDaemonServiceDetached({\n accountAdmissionId: reservation.id,\n deviceId: contract.deviceId,\n gatewayUrl: contract.gatewayUrl,\n heartbeatMs: contract.heartbeatMs,\n runtime,\n presenter: createQuietPresenter(runtime),\n mode: \"background\",\n });\n } else if (manager) {\n // Refresh the existing stopped supervisor definition with an immutable\n // generation argument. Never install a missing Service.\n await manager.deactivate();\n await manager.install(\n buildDaemonSystemServiceCommandSpec({\n controller: manager.controller,\n accountAdmissionId: reservation.id,\n })\n );\n await manager.start();\n }\n await waitForAdmittedService(reservation.id);\n });\n } finally {\n await cancelServiceAccountAdmission(reservation.id);\n }\n });\n}\n\nasync function waitForAdmittedService(id: string): Promise<void> {\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n const current = await readServiceAccountAdmission();\n const runtime = await readCurrentDaemonRuntimeContext();\n if (\n current?.id === id &&\n current.state === \"admitted\" &&\n current.carrier?.ownerPid === runtime.runtimeStatus.pid &&\n runtime.effectiveRuntimeStatus === \"running\"\n ) {\n return;\n }\n await delay(50);\n }\n refused(\n \"startup_unconfirmed\",\n \"OpenMeld could not confirm that this Service started. Check Service status before trying again.\"\n );\n}\n\nasync function stopReservedService(\n contract: Contract,\n id: string,\n pid: number\n): Promise<void> {\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n await requestAccountCheckedServiceStop({ id, manager });\n const admitted = await readServiceAccountAdmission();\n if (\n admitted?.id !== id ||\n admitted.state !== \"admitted\" ||\n admitted.carrier?.ownerPid !== pid\n ) {\n refused(\n \"admission_unconfirmed\",\n \"OpenMeld could not verify that the matching Service accepted Stop. Check Service status before trying again.\"\n );\n }\n const current = await readCurrentDaemonRuntimeContext();\n if (current.runtimeStatus.pid !== null && current.runtimeStatus.pid !== pid) {\n refused(\n \"ownership_changed\",\n \"Another Service instance is now running. Its state was left unchanged.\"\n );\n }\n await runDaemonStop(\n { json: true, view: \"agent\" },\n {\n completedControlledShutdownOwnerPid: pid,\n }\n );\n}\n\nexport async function requestAccountCheckedServiceStop({\n id,\n manager,\n}: {\n id: string;\n manager: Pick<\n DaemonServiceManager,\n \"status\" | \"disableAutostart\" | \"enableAutostart\"\n > | null;\n}): Promise<void> {\n const wasEnabled = manager ? (await manager.status()).enabled : false;\n if (manager) {\n await manager.disableAutostart();\n }\n // No compatibility fallback: only the verified carrier may admit this stop.\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n accountAdmissionId: id,\n mode: \"graceful\",\n gracePeriodMs: 2000,\n },\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n if (!shutdown.accepted) {\n throw new Error(\"The Service did not confirm controlled shutdown.\");\n }\n } catch (error) {\n if (\n manager &&\n wasEnabled &&\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === SERVICE_ACCOUNT_STOP_REFUSED_CODE\n ) {\n try {\n await manager.enableAutostart();\n } catch (restoreError) {\n throw new AggregateError(\n [error, restoreError],\n \"Stop was refused and its previous autostart setting could not be restored.\"\n );\n }\n }\n if (\n !(\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === SERVICE_ACCOUNT_STOP_REFUSED_CODE\n )\n ) {\n const detail = error instanceof Error ? error.message : String(error);\n refused(\n \"stop_unconfirmed\",\n `Stop may already be in progress. ${manager ? \"Autostart remains disabled. \" : \"\"}Check Service status before trying again. ${detail}`\n );\n }\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { o as serviceControlCapabilitiesSchema, s as serviceControlCarrierCapabilitySchema } from "./distribution-DY2fBeSW.js";
|
|
4
|
-
import { Lt as sendLocalDaemonControlPlaneRequest, S as daemonServiceBinaryExecutablePath, Vt as readDaemonServiceContract, j as readDaemonActiveBundleState, r as readCurrentDaemonRuntimeContext } from "./daemon-service-runtime-CY6wdBe1.js";
|
|
5
|
-
import { S as resolveDaemonServiceManager } from "./daemon-service-manager-GiMCiTmu.js";
|
|
6
|
-
import { realpath } from "node:fs/promises";
|
|
7
|
-
import { execFile } from "node:child_process";
|
|
8
|
-
import { promisify } from "node:util";
|
|
9
|
-
//#region src/commands/service-control-capabilities.ts
|
|
10
|
-
/** Read only: never invoke the repairing npm launcher or a lifecycle operation. */
|
|
11
|
-
async function readServiceControlCapabilities() {
|
|
12
|
-
const unsupported = {
|
|
13
|
-
deviceId: null,
|
|
14
|
-
start: false,
|
|
15
|
-
stop: false
|
|
16
|
-
};
|
|
17
|
-
if (process.platform !== "darwin") return unsupported;
|
|
18
|
-
const contract = await readDaemonServiceContract();
|
|
19
|
-
const bundle = await readDaemonActiveBundleState();
|
|
20
|
-
if (contract?.serviceController !== "launchd" || bundle?.bundleFormat !== "binary_v1") return unsupported;
|
|
21
|
-
const manager = await resolveDaemonServiceManager("launchd");
|
|
22
|
-
if (!(manager && (await manager.status()).installed)) return unsupported;
|
|
23
|
-
const executable = await realpath(daemonServiceBinaryExecutablePath());
|
|
24
|
-
const { stdout } = await promisify(execFile)(executable, [
|
|
25
|
-
"service",
|
|
26
|
-
"control-carrier-capability",
|
|
27
|
-
"--json"
|
|
28
|
-
], {
|
|
29
|
-
timeout: 5e3,
|
|
30
|
-
maxBuffer: 16384
|
|
31
|
-
});
|
|
32
|
-
const carrier = serviceControlCarrierCapabilitySchema.safeParse(JSON.parse(stdout));
|
|
33
|
-
if (!carrier.success || await realpath(carrier.data.executable) !== executable) return unsupported;
|
|
34
|
-
const runtime = await readCurrentDaemonRuntimeContext();
|
|
35
|
-
if (runtime.effectiveRuntimeStatus === "not_running") return {
|
|
36
|
-
deviceId: contract.deviceId,
|
|
37
|
-
start: true,
|
|
38
|
-
stop: false
|
|
39
|
-
};
|
|
40
|
-
if (runtime.effectiveRuntimeStatus !== "running") return unsupported;
|
|
41
|
-
const response = await sendLocalDaemonControlPlaneRequest({ request: {
|
|
42
|
-
v: 1,
|
|
43
|
-
command: "account_control_capabilities"
|
|
44
|
-
} });
|
|
45
|
-
return serviceControlCapabilitiesSchema.parse({
|
|
46
|
-
deviceId: contract.deviceId,
|
|
47
|
-
start: false,
|
|
48
|
-
stop: response.code === "service.account_control_capabilities" && response.payload.supported
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
export { readServiceControlCapabilities as t };
|
|
53
|
-
|
|
54
|
-
//# sourceMappingURL=service-control-capabilities-DUudAKoj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-control-capabilities-DUudAKoj.js","names":[],"sources":["../src/commands/service-control-capabilities.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { realpath } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport {\n serviceControlCapabilitiesSchema,\n serviceControlCarrierCapabilitySchema,\n} from \"@openmeld/schemas\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { sendLocalDaemonControlPlaneRequest } from \"../local-service/control-plane/client\";\nimport {\n daemonServiceBinaryExecutablePath,\n readDaemonActiveBundleState,\n} from \"../local-service/lifecycle/daemon-service-bundle\";\nimport { resolveDaemonServiceManager } from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\n\n/** Read only: never invoke the repairing npm launcher or a lifecycle operation. */\nexport async function readServiceControlCapabilities() {\n const unsupported = { deviceId: null, start: false, stop: false };\n if (process.platform !== \"darwin\") {\n return unsupported;\n }\n const contract = await readDaemonServiceContract();\n const bundle = await readDaemonActiveBundleState();\n if (\n contract?.serviceController !== \"launchd\" ||\n bundle?.bundleFormat !== \"binary_v1\"\n ) {\n return unsupported;\n }\n const manager = await resolveDaemonServiceManager(\"launchd\");\n if (!(manager && (await manager.status()).installed)) {\n return unsupported;\n }\n // Guarded Start refreshes the supervisor command to this canonical executable.\n // Verify the executable that answered, so an old CLI delegating elsewhere\n // cannot advertise another binary's capability as its own.\n const executable = await realpath(daemonServiceBinaryExecutablePath());\n const { stdout } = await promisify(execFile)(\n executable,\n [\"service\", \"control-carrier-capability\", \"--json\"],\n { timeout: 5000, maxBuffer: 16_384 }\n );\n const carrier = serviceControlCarrierCapabilitySchema.safeParse(\n JSON.parse(stdout)\n );\n if (\n !carrier.success ||\n (await realpath(carrier.data.executable)) !== executable\n ) {\n return unsupported;\n }\n const runtime = await readCurrentDaemonRuntimeContext();\n if (runtime.effectiveRuntimeStatus === \"not_running\") {\n return { deviceId: contract.deviceId, start: true, stop: false };\n }\n if (runtime.effectiveRuntimeStatus !== \"running\") {\n return unsupported;\n }\n const response = await sendLocalDaemonControlPlaneRequest({\n request: { v: 1, command: \"account_control_capabilities\" },\n });\n return serviceControlCapabilitiesSchema.parse({\n deviceId: contract.deviceId,\n start: false,\n stop:\n response.code === \"service.account_control_capabilities\" &&\n response.payload.supported,\n });\n}\n"],"mappings":";;;;;;;;;;AAiBA,eAAsB,iCAAiC;CACrD,MAAM,cAAc;EAAE,UAAU;EAAM,OAAO;EAAO,MAAM;CAAM;CAChE,IAAI,QAAQ,aAAa,UACvB,OAAO;CAET,MAAM,WAAW,MAAM,0BAA0B;CACjD,MAAM,SAAS,MAAM,4BAA4B;CACjD,IACE,UAAU,sBAAsB,aAChC,QAAQ,iBAAiB,aAEzB,OAAO;CAET,MAAM,UAAU,MAAM,4BAA4B,SAAS;CAC3D,IAAI,EAAE,YAAY,MAAM,QAAQ,OAAO,EAAA,CAAG,YACxC,OAAO;CAKT,MAAM,aAAa,MAAM,SAAS,kCAAkC,CAAC;CACrE,MAAM,EAAE,WAAW,MAAM,UAAU,QAAQ,CAAC,CAC1C,YACA;EAAC;EAAW;EAA8B;CAAQ,GAClD;EAAE,SAAS;EAAM,WAAW;CAAO,CACrC;CACA,MAAM,UAAU,sCAAsC,UACpD,KAAK,MAAM,MAAM,CACnB;CACA,IACE,CAAC,QAAQ,WACR,MAAM,SAAS,QAAQ,KAAK,UAAU,MAAO,YAE9C,OAAO;CAET,MAAM,UAAU,MAAM,gCAAgC;CACtD,IAAI,QAAQ,2BAA2B,eACrC,OAAO;EAAE,UAAU,SAAS;EAAU,OAAO;EAAM,MAAM;CAAM;CAEjE,IAAI,QAAQ,2BAA2B,WACrC,OAAO;CAET,MAAM,WAAW,MAAM,mCAAmC,EACxD,SAAS;EAAE,GAAG;EAAG,SAAS;CAA+B,EAC3D,CAAC;CACD,OAAO,iCAAiC,MAAM;EAC5C,UAAU,SAAS;EACnB,OAAO;EACP,MACE,SAAS,SAAS,0CAClB,SAAS,QAAQ;CACrB,CAAC;AACH"}
|
package/dist/upgrade-CXgHeEKK.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"windows-user-task-DqJWtlAm.js","names":[],"sources":["../../../packages/schemas/dist/schemas/daemon/windows-user-task.js","../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","import { execFile } from \"node:child_process\";\nimport { win32 } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n type WindowsUserTaskRequest,\n windowsUserTaskActionSchema,\n windowsUserTaskRequestSchema,\n windowsUserTaskStatusSchema,\n} from \"@openmeld/schemas\";\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)))\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$task = $null\ntry { $task = $folder.GetTask($name) } catch {\n if ($_.Exception.GetBaseException().HResult -ne -2147024894) { throw }\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 $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 = $r.executable\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 const root = process.env.SystemRoot;\n if (!(root && win32.isAbsolute(root))) {\n throw new Error(\"Windows system directory is unavailable.\");\n }\n return win32.join(\n root,\n \"System32\",\n \"WindowsPowerShell\",\n \"v1.0\",\n \"powershell.exe\"\n );\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 result = await promisify(execFile)(\n windowsPowerShellPath(),\n [\n \"-NoLogo\",\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-EncodedCommand\",\n Buffer.from(TASK_CONTROL, \"utf16le\").toString(\"base64\"),\n ],\n {\n windowsHide: true,\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n env: {\n ...process.env,\n OPENMELD_TASK_REQUEST: Buffer.from(\n JSON.stringify(windowsUserTaskRequestSchema.parse(request))\n ).toString(\"base64\"),\n },\n }\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}\n"],"mappings":"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"}
|