openmeld 0.3.209 → 0.3.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{add-me-membership-Ck31xM9l.js → add-me-membership-BgDujS4W.js} +2 -2
  2. package/dist/{add-me-membership-Ck31xM9l.js.map → add-me-membership-BgDujS4W.js.map} +1 -1
  3. package/dist/{agents-Caxxitma.js → agents-DdYL--Rj.js} +8 -8
  4. package/dist/{agents-Caxxitma.js.map → agents-DdYL--Rj.js.map} +1 -1
  5. package/dist/{api-client-foundation-LfQQZwak.js → api-client-foundation--H_ib5Vh.js} +1 -1
  6. package/dist/{api-client-foundation-BGGVYxgq.js → api-client-foundation-CQsXMqnr.js} +2 -2
  7. package/dist/{api-client-foundation-BGGVYxgq.js.map → api-client-foundation-CQsXMqnr.js.map} +1 -1
  8. package/dist/{command-DqXu9TET.js → command-DNIZzJuu.js} +6 -6
  9. package/dist/{command-DqXu9TET.js.map → command-DNIZzJuu.js.map} +1 -1
  10. package/dist/{computer-connection-review-Dg4TZc8O.js → computer-connection-review-DqJTijzX.js} +4 -4
  11. package/dist/{computer-connection-review-Dg4TZc8O.js.map → computer-connection-review-DqJTijzX.js.map} +1 -1
  12. package/dist/{computer-setup-continuation-Imn8Ykr-.js → computer-setup-continuation-DFUxl9kf.js} +3 -3
  13. package/dist/{computer-setup-continuation-Imn8Ykr-.js.map → computer-setup-continuation-DFUxl9kf.js.map} +1 -1
  14. package/dist/{daemon-service-runtime-CRHAVnEX.js → daemon-service-runtime-D7cb3-Ov.js} +2 -2
  15. package/dist/{daemon-service-runtime-CRHAVnEX.js.map → daemon-service-runtime-D7cb3-Ov.js.map} +1 -1
  16. package/dist/{dist-CtoP6msP.js → dist-Ccbpt6rT.js} +94 -10
  17. package/dist/dist-Ccbpt6rT.js.map +1 -0
  18. package/dist/dist-Cs3dH2Of.js +4 -0
  19. package/dist/{elapsed-time-D6DCEnz7.js → elapsed-time-B2UGqUlR.js} +3 -3
  20. package/dist/{elapsed-time-D6DCEnz7.js.map → elapsed-time-B2UGqUlR.js.map} +1 -1
  21. package/dist/{installation-inventory-uRDaBzO_.js → installation-inventory-DJiJh9nP.js} +3 -3
  22. package/dist/{installation-inventory-uRDaBzO_.js.map → installation-inventory-DJiJh9nP.js.map} +1 -1
  23. package/dist/{openmeld-DYSsGBFL.js → openmeld-BqTI30JS.js} +15 -15
  24. package/dist/{openmeld-DYSsGBFL.js.map → openmeld-BqTI30JS.js.map} +1 -1
  25. package/dist/{openmeld-maintenance-worker-sNN5314u.js → openmeld-maintenance-worker-DeOu5U2Q.js} +5 -5
  26. package/dist/{openmeld-maintenance-worker-sNN5314u.js.map → openmeld-maintenance-worker-DeOu5U2Q.js.map} +1 -1
  27. package/dist/{openmeld-tools-update-coordinator-jJrVAHgC.js → openmeld-tools-update-coordinator-i1zATb9g.js} +6 -6
  28. package/dist/{openmeld-tools-update-coordinator-jJrVAHgC.js.map → openmeld-tools-update-coordinator-i1zATb9g.js.map} +1 -1
  29. package/dist/openmeld.js +3 -3
  30. package/dist/{prepare-session-executor-DtWDB9RM.js → prepare-session-executor-BSTToACx.js} +8 -8
  31. package/dist/{prepare-session-executor-DtWDB9RM.js.map → prepare-session-executor-BSTToACx.js.map} +1 -1
  32. package/dist/{service-account-authorization-Aft4cBFn.js → service-account-authorization-BM7a5V4I.js} +2 -2
  33. package/dist/{service-account-authorization-Aft4cBFn.js.map → service-account-authorization-BM7a5V4I.js.map} +1 -1
  34. package/dist/{service-control-capabilities-12ePIPVW.js → service-control-capabilities--ktpSDhp.js} +1 -1
  35. package/dist/{service-control-capabilities-B8pv0P4V.js → service-control-capabilities-BL8hTCE6.js} +2 -2
  36. package/dist/{service-control-capabilities-B8pv0P4V.js.map → service-control-capabilities-BL8hTCE6.js.map} +1 -1
  37. package/dist/upgrade-C5r5IT_8.js +4 -0
  38. package/dist/{upgrade-DrUXCeru.js → upgrade-JMsVlRjL.js} +4 -4
  39. package/dist/{upgrade-DrUXCeru.js.map → upgrade-JMsVlRjL.js.map} +1 -1
  40. package/package.json +1 -1
  41. package/dist/dist-CtoP6msP.js.map +0 -1
  42. package/dist/dist-DVciurWV.js +0 -4
  43. package/dist/upgrade-Cie6yXZc.js +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-service-runtime-CRHAVnEX.js","names":["process","getErrorCode","packageJson","process","exhaustive","packageJson","getErrorCode","fsConstants","process","fsConstants","delay","process","resolveDaemonServiceExecutableWrapperPaths","resolveDaemonServiceRecognizedExecutablePaths","process","daemonServiceRecognizedExecutablePaths","process","process"],"sources":["../../../packages/schemas/dist/schemas/daemon/service-update-job.js","../src/config/daemon-service-contract.ts","../src/local-service/control-plane/client.ts","../../../runtime/local-service/src/cli-binary-delta.ts","../../../runtime/local-service/src/cli-binary-update-artifact.ts","../src/config/daemon-service-update-worker-registration.ts","../package.json","../src/config/service-release.ts","../src/config/version-state.ts","../src/local-service/lifecycle/daemon-service-update-state.ts","../src/runtime/version.ts","../src/local-components/managed-version-pruning.ts","../src/local-components/managed-install.ts","../src/system/local-operation-diagnostics.ts","../src/local-service/lifecycle/daemon-lifecycle-journal.ts","../src/local-service/lifecycle/daemon-service-artifact.ts","../src/local-service/lifecycle/daemon-service-bundle.ts","../src/local-service/lifecycle/daemon-managed-binary-path.ts","../src/local-service/lifecycle/daemon-service-manager-command-match.ts","../src/local-service/lifecycle/daemon-service-command-path.ts","../src/local-service/lifecycle/daemon-service-process-inventory.ts","../src/local-service/lifecycle/daemon-service-legacy-shared.ts","../src/local-service/lifecycle/daemon-service-runtime-observer.ts","../src/local-service/lifecycle/daemon-service-runtime.ts"],"sourcesContent":["import { openMeldToolsUpdateOperationPhaseSchema, openMeldToolsUpdateRequestSourceSchema } from \"../local-components.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/service-update-job.ts\nconst OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA = \"openmeld-daemon-service-update-job-v2\";\nconst daemonServiceUpdatePreparedBundleSchema = z$1.strictObject({\n\tv: z$1.literal(2),\n\tschema: z$1.literal(\"openmeld-daemon-active-bundle-v2\"),\n\tbundleId: z$1.string().min(1),\n\tdaemonVersion: z$1.string().min(1),\n\tentryScriptRelativePath: z$1.string().min(1),\n\tbundleFormat: z$1.enum([\n\t\t\"legacy_linked_v1\",\n\t\t\"self_contained_v1\",\n\t\t\"binary_v1\"\n\t]),\n\tsourceEntryScriptPath: z$1.string().min(1),\n\tsourcePackageRootPath: z$1.string().min(1),\n\tsourceDistRootPath: z$1.string().min(1),\n\tsourceDistFingerprint: z$1.string().min(1).nullable().optional(),\n\tsourceKind: z$1.enum([\n\t\t\"workspace\",\n\t\t\"package_install\",\n\t\t\"npx_cache\",\n\t\t\"unknown\"\n\t]),\n\tcreatedAt: z$1.iso.datetime({ offset: true }),\n\tupdatedAt: z$1.iso.datetime({ offset: true })\n});\nconst daemonServiceUpdateJobBodySchema = z$1.strictObject({\n\tattempts: z$1.number().int().nonnegative(),\n\tdesiredState: z$1.enum([\"background\", \"stopped\"]),\n\terrorMessage: z$1.string().min(1).nullable(),\n\tjobId: z$1.string().min(1),\n\tpreparedBundle: daemonServiceUpdatePreparedBundleSchema,\n\trequestedAt: z$1.iso.datetime({ offset: true }),\n\ttargetVersion: z$1.string().min(1),\n\tupdatedAt: z$1.iso.datetime({ offset: true }),\n\turgency: z$1.enum([\"available\", \"required\"])\n});\nconst daemonServiceUpdateJobV1Schema = daemonServiceUpdateJobBodySchema.extend({\n\tv: z$1.literal(1),\n\tschema: z$1.literal(\"openmeld-daemon-service-update-job-v1\"),\n\tstatus: z$1.enum([\n\t\t\"scheduled\",\n\t\t\"running\",\n\t\t\"completed\",\n\t\t\"failed\"\n\t])\n});\nconst daemonServiceUpdateJobSchema = daemonServiceUpdateJobBodySchema.extend({\n\tv: z$1.literal(2),\n\tschema: z$1.literal(OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA),\n\tphase: openMeldToolsUpdateOperationPhaseSchema,\n\trequestSource: openMeldToolsUpdateRequestSourceSchema\n});\nconst storedDaemonServiceUpdateJobSchema = z$1.discriminatedUnion(\"v\", [daemonServiceUpdateJobV1Schema, daemonServiceUpdateJobSchema]);\n//#endregion\nexport { OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA, daemonServiceUpdateJobSchema, daemonServiceUpdateJobV1Schema, daemonServiceUpdatePreparedBundleSchema, storedDaemonServiceUpdateJobSchema };\n\n//# sourceMappingURL=service-update-job.js.map","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonServiceContractSchema } from \"@openmeld/schemas\";\nimport type {\n DaemonServiceContract,\n DaemonServiceController,\n DaemonServiceDesiredState,\n} from \"@openmeld/schemas/types\";\nimport {\n readDaemonLocalStateFile,\n writeDaemonLocalStateFile,\n} from \"./daemon-local-state-file\";\nimport { daemonRuntimeStateRootPath } from \"./daemon-state\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"./paths\";\nimport {\n assertNoPublishedProductionMutationDuringTests,\n isPublishedProductionOpenMeldRoot,\n isTestProcess,\n} from \"./published-production-safety\";\n\nconst DAEMON_SERVICE_CONTRACT_FILENAME = \"service-contract.json\";\n\nexport type DaemonServiceContractStateInput = {\n daemonVersion: string;\n bundleId: string;\n desiredState: DaemonServiceDesiredState;\n serviceController: DaemonServiceController;\n autoStart: boolean;\n gatewayUrl: string;\n ownerUserId?: string;\n profileId?: string;\n deviceId: string;\n connectedComputerId?: string;\n heartbeatMs: number;\n lane?: OpenMeldEnvPreset;\n};\n\nexport function daemonServiceContractPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_SERVICE_CONTRACT_FILENAME\n );\n}\n\nexport async function readDaemonServiceContract(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceContract | null> {\n return await readDaemonLocalStateFile({\n path: daemonServiceContractPath(pathInput),\n schema: daemonServiceContractSchema,\n });\n}\n\nexport async function upsertDaemonServiceContract(\n input: DaemonServiceContractStateInput,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceContract> {\n assertDaemonServiceContractMutationAllowed(pathInput);\n const current = await readDaemonServiceContract(pathInput);\n const candidate = buildContractCandidate(input, pathInput, current);\n assertDaemonServiceContractIdentityAllowed(candidate, pathInput);\n if (current && isSameContractState(current, candidate)) {\n return current;\n }\n\n const next: DaemonServiceContract = {\n ...candidate,\n generation: current ? current.generation + 1 : 1,\n updatedAt: new Date().toISOString(),\n };\n await writeDaemonLocalStateFile({\n path: daemonServiceContractPath(pathInput),\n schema: daemonServiceContractSchema,\n value: next,\n mode: 0o600,\n });\n return next;\n}\n\nexport async function clearDaemonServiceContract(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertDaemonServiceContractMutationAllowed(pathInput);\n await rm(daemonServiceContractPath(pathInput), { force: true });\n}\n\nfunction assertDaemonServiceContractMutationAllowed(\n pathInput: OpenMeldPathResolutionInput\n): void {\n assertNoPublishedProductionMutationDuringTests(\n pathInput,\n \"OpenMeld Service contract\"\n );\n}\n\nfunction assertDaemonServiceContractIdentityAllowed(\n candidate: Omit<DaemonServiceContract, \"generation\" | \"updatedAt\">,\n pathInput: OpenMeldPathResolutionInput\n): void {\n if (!isUnsafeProductionDaemonServiceContractIdentity(candidate)) {\n return;\n }\n if (\n isTestProcess(pathInput) &&\n !isPublishedProductionOpenMeldRoot(pathInput)\n ) {\n return;\n }\n throw new Error(\n [\n \"Refusing to write OpenMeld Service contract with a test fixture identity in the published production lane.\",\n \"Run `openmeld service repair --profile <profile-id>` from the signed-in production lane, or clear the polluted local service state before retrying.\",\n ].join(\" \")\n );\n}\n\nexport function isDaemonServiceContractIdentityReusable(\n contract: Pick<\n DaemonServiceContract,\n \"deviceId\" | \"lane\" | \"profileId\"\n > | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n if (!contract) {\n return false;\n }\n if (contract.lane !== resolveOpenMeldEnvPreset(pathInput)) {\n return false;\n }\n return !isUnsafeProductionDaemonServiceContractIdentity(contract);\n}\n\nexport function isUnsafeProductionDaemonServiceContractIdentity(\n contract: Pick<DaemonServiceContract, \"deviceId\" | \"lane\" | \"profileId\">\n): boolean {\n if (contract.lane !== \"prod\") {\n return false;\n }\n return (\n isUnsafeProductionDeviceId(contract.deviceId) ||\n (contract.profileId\n ? isUnsafeProductionProfileId(contract.profileId)\n : false)\n );\n}\n\nexport function isUnsafeProductionDeviceId(deviceId: string): boolean {\n return normalizeFixtureText(deviceId) === \"device_123\";\n}\n\nfunction isUnsafeProductionProfileId(profileId: string): boolean {\n return UNSAFE_PRODUCTION_PROFILE_IDS.has(normalizeFixtureText(profileId));\n}\n\nconst UNSAFE_PRODUCTION_PROFILE_IDS = new Set([\n \"agt_existing\",\n \"11111111-1111-1111-1111-111111111111\",\n \"agt_11111111-1111-1111-1111-111111111111\",\n \"11111111-1111-4111-8111-111111111111\",\n \"agt_11111111-1111-4111-8111-111111111111\",\n]);\n\nfunction normalizeFixtureText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction buildContractCandidate(\n input: DaemonServiceContractStateInput,\n pathInput: OpenMeldPathResolutionInput,\n current: DaemonServiceContract | null\n): Omit<DaemonServiceContract, \"generation\" | \"updatedAt\"> {\n const lane = input.lane ?? resolveOpenMeldEnvPreset(pathInput);\n const connectedComputerId =\n input.connectedComputerId ??\n (current && canReuseConnectedComputerEvidence(current, input, lane)\n ? current.connectedComputerId\n : undefined);\n\n return {\n schema: \"openmeld-daemon-service-contract-v1\",\n v: 1,\n lane,\n daemonVersion: input.daemonVersion,\n bundleId: input.bundleId,\n desiredState: input.desiredState,\n serviceController: input.serviceController,\n autoStart: input.autoStart,\n gatewayUrl: input.gatewayUrl,\n ...(input.ownerUserId ? { ownerUserId: input.ownerUserId } : {}),\n ...(input.profileId ? { profileId: input.profileId } : {}),\n deviceId: input.deviceId,\n ...(connectedComputerId ? { connectedComputerId } : {}),\n heartbeatMs: input.heartbeatMs,\n };\n}\n\nfunction canReuseConnectedComputerEvidence(\n current: DaemonServiceContract,\n input: DaemonServiceContractStateInput,\n lane: OpenMeldEnvPreset\n): boolean {\n if (\n current.lane !== lane ||\n current.gatewayUrl !== input.gatewayUrl ||\n current.deviceId !== input.deviceId\n ) {\n return false;\n }\n if (current.ownerUserId && input.ownerUserId) {\n return current.ownerUserId === input.ownerUserId;\n }\n if (current.profileId && input.profileId) {\n return current.profileId === input.profileId;\n }\n return !(current.ownerUserId || input.ownerUserId);\n}\n\nfunction isSameContractState(\n current: DaemonServiceContract,\n candidate: Omit<DaemonServiceContract, \"generation\" | \"updatedAt\">\n): boolean {\n return (\n current.schema === candidate.schema &&\n current.v === candidate.v &&\n current.lane === candidate.lane &&\n current.daemonVersion === candidate.daemonVersion &&\n current.bundleId === candidate.bundleId &&\n current.desiredState === candidate.desiredState &&\n current.serviceController === candidate.serviceController &&\n current.autoStart === candidate.autoStart &&\n current.gatewayUrl === candidate.gatewayUrl &&\n current.ownerUserId === candidate.ownerUserId &&\n current.profileId === candidate.profileId &&\n current.deviceId === candidate.deviceId &&\n current.connectedComputerId === candidate.connectedComputerId &&\n current.heartbeatMs === candidate.heartbeatMs\n );\n}\n","import { createConnection } from \"node:net\";\nimport type {\n OpenMeldDaemonControlPlaneRequest,\n OpenMeldDaemonConversationExecutionStatusPayload,\n OpenMeldDaemonConversationExecutionStatusRequestPayload,\n OpenMeldDaemonRequestAgentActivitySyncPayload,\n OpenMeldDaemonRequestAgentActivitySyncRequestPayload,\n OpenMeldDaemonServiceUpdateReadinessPayload,\n OpenMeldDaemonSetLocalAgentEnabledPayload,\n OpenMeldDaemonSetLocalAgentEnabledRequestPayload,\n OpenMeldDaemonShutdownRequestPayload,\n OpenMeldDaemonSyncRouteCatalogPayload,\n OpenMeldDaemonSyncRouteCatalogRequestPayload,\n} from \"@openmeld/schemas\";\nimport {\n OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n openMeldDaemonControlPlaneResponseSchema,\n} from \"@openmeld/schemas\";\nimport type { OpenMeldDaemonControlPlaneResponse } from \"@openmeld/schemas/types\";\nimport {\n readDaemonControlPlaneToken,\n resolveDaemonControlPlaneEndpoint,\n} from \"../../config/daemon-state\";\n\nconst DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS = 5000;\n\nexport class LocalDaemonControlPlaneClientError extends Error {\n code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport async function sendLocalDaemonControlPlaneRequest(input: {\n endpoint?: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonControlPlaneResponse> {\n const endpoint = input.endpoint ?? resolveDaemonControlPlaneEndpoint();\n const authToken = await readDaemonControlPlaneToken();\n if (!authToken) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.auth_token_missing\",\n \"daemon control token is missing\"\n );\n }\n\n const request = {\n ...input.request,\n authToken,\n } satisfies OpenMeldDaemonControlPlaneRequest;\n\n const rawResponse = await writeControlPlaneRequest({\n endpoint,\n request,\n timeoutMs: input.timeoutMs ?? DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS,\n });\n const parsed =\n openMeldDaemonControlPlaneResponseSchema.safeParse(rawResponse);\n if (!parsed.success) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an invalid response\"\n );\n }\n if (parsed.data.code === \"service.error\") {\n throw new LocalDaemonControlPlaneClientError(\n parsed.data.payload.errorCode,\n parsed.data.payload.errorMessage\n );\n }\n return parsed.data;\n}\n\nexport async function requestLocalConversationExecutionStatus(input: {\n endpoint?: string;\n payload: OpenMeldDaemonConversationExecutionStatusRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonConversationExecutionStatusPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"conversation_execution_status\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.conversation_execution_status\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for conversation execution status\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSyncRouteCatalog(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSyncRouteCatalogRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSyncRouteCatalogPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"sync_route_catalog\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.sync_route_catalog\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for route catalog sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalAgentActivitySync(input: {\n endpoint?: string;\n payload: OpenMeldDaemonRequestAgentActivitySyncRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonRequestAgentActivitySyncPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"request_agent_activity_sync\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.agent_activity_sync_requested\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for Agent Activity sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSetLocalAgentEnabled(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSetLocalAgentEnabledRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSetLocalAgentEnabledPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"set_local_agent_enabled\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.set_local_agent_enabled\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for local agent enablement\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonShutdown(input: {\n endpoint?: string;\n payload: OpenMeldDaemonShutdownRequestPayload;\n timeoutMs?: number;\n}): Promise<\n Extract<\n OpenMeldDaemonControlPlaneResponse,\n { code: \"service.shutdown\" }\n >[\"payload\"]\n> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"shutdown\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.shutdown\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for shutdown\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonServiceUpdateReadiness(\n input: { endpoint?: string; timeoutMs?: number } = {}\n): Promise<OpenMeldDaemonServiceUpdateReadinessPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"service_update_readiness\",\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.update_readiness\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for service update readiness\"\n );\n }\n return response.payload;\n}\n\nfunction rewriteDaemonControlPlaneContractMismatch(error: unknown): unknown {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"service.invalid_request\"\n ) {\n return new LocalDaemonControlPlaneClientError(\n \"daemon.control.contract_mismatch\",\n \"local OpenMeld Service must be restarted because the daemon control-plane contract changed on this device\"\n );\n }\n return error;\n}\n\nasync function writeControlPlaneRequest(input: {\n endpoint: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs: number;\n}): Promise<unknown> {\n return await new Promise<unknown>((resolve, reject) => {\n const socket = createConnection(input.endpoint);\n let responseBuffer = \"\";\n let settled = false;\n const cleanup = () => {\n socket.setTimeout(0);\n socket.off(\"connect\", handleConnect);\n socket.off(\"data\", handleData);\n socket.off(\"end\", handleEnd);\n socket.off(\"error\", handleError);\n socket.off(\"timeout\", handleTimeout);\n };\n const settle = (action: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n action();\n };\n const fail = (error: LocalDaemonControlPlaneClientError) => {\n settle(() => {\n socket.destroy();\n reject(error);\n });\n };\n\n const handleConnect = () => {\n socket.write(`${JSON.stringify(input.request)}\\n`);\n };\n const handleData = (chunk: string) => {\n responseBuffer += chunk;\n };\n const handleEnd = () => {\n settle(() => {\n const rawResponse = responseBuffer.trim();\n if (!rawResponse) {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.empty_response\",\n \"local daemon control returned an empty response\"\n )\n );\n return;\n }\n try {\n resolve(JSON.parse(rawResponse) as unknown);\n } catch {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_json\",\n \"local daemon control returned malformed JSON\"\n )\n );\n }\n });\n };\n const handleError = (error: Error | NodeJS.ErrnoException) => {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as NodeJS.ErrnoException).code)\n : \"daemon.control.connection_failed\";\n fail(\n new LocalDaemonControlPlaneClientError(\n code === \"ENOENT\" || code === \"ECONNREFUSED\"\n ? \"daemon.control.endpoint_missing\"\n : code,\n error instanceof Error\n ? error.message\n : \"failed to connect to local daemon control\"\n )\n );\n };\n const handleTimeout = () => {\n fail(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.timeout\",\n `local daemon control timed out after ${String(input.timeoutMs)}ms`\n )\n );\n };\n\n socket.setEncoding(\"utf8\");\n socket.setTimeout(input.timeoutMs);\n socket.once(\"connect\", handleConnect);\n socket.on(\"data\", handleData);\n socket.once(\"end\", handleEnd);\n socket.once(\"error\", handleError);\n socket.once(\"timeout\", handleTimeout);\n });\n}\n","import { createHash } from \"node:crypto\";\nimport {\n type CliBinaryDeltaPatch,\n type CliBinaryDeltaTransport,\n cliBinaryDeltaPatchSchema,\n} from \"@openmeld/schemas\";\n\nexport function reconstructCliBinaryDelta(input: {\n baseBytes: Buffer;\n delta: CliBinaryDeltaTransport;\n patchPayloadBytes: Buffer;\n targetSha256: string;\n targetSizeBytes: number;\n}): Buffer {\n verifyBytes({\n bytes: input.baseBytes,\n expectedSha256: input.delta.fromSha256,\n expectedSizeBytes: input.delta.fromSizeBytes,\n label: \"delta base\",\n });\n\n const patch = parseCliBinaryDeltaPatch(input.patchPayloadBytes);\n assertPatchMatchesRelease({\n delta: input.delta,\n patch,\n targetSha256: input.targetSha256,\n targetSizeBytes: input.targetSizeBytes,\n });\n\n const targetBytes = Buffer.alloc(input.targetSizeBytes);\n input.baseBytes.copy(\n targetBytes,\n 0,\n 0,\n Math.min(input.baseBytes.byteLength, targetBytes.byteLength)\n );\n\n let previousEnd = 0;\n for (const segment of patch.segments) {\n const bytes = Buffer.from(segment.dataBase64, \"base64\");\n const segmentEnd = segment.offset + bytes.byteLength;\n if (segment.offset < previousEnd) {\n throw new Error(\n \"delta patch segments must be sorted and non-overlapping\"\n );\n }\n if (segmentEnd > targetBytes.byteLength) {\n throw new Error(\"delta patch segment exceeds the target binary size\");\n }\n bytes.copy(targetBytes, segment.offset);\n previousEnd = segmentEnd;\n }\n\n verifyBytes({\n bytes: targetBytes,\n expectedSha256: input.targetSha256,\n expectedSizeBytes: input.targetSizeBytes,\n label: \"reconstructed binary\",\n });\n return targetBytes;\n}\n\nfunction parseCliBinaryDeltaPatch(bytes: Buffer): CliBinaryDeltaPatch {\n let value: unknown;\n try {\n value = JSON.parse(bytes.toString(\"utf8\"));\n } catch (error) {\n throw new Error(\n `delta patch is not valid JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n const parsed = cliBinaryDeltaPatchSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`delta patch is invalid: ${parsed.error.message}`);\n }\n return parsed.data;\n}\n\nfunction assertPatchMatchesRelease(input: {\n delta: CliBinaryDeltaTransport;\n patch: CliBinaryDeltaPatch;\n targetSha256: string;\n targetSizeBytes: number;\n}): void {\n const mismatches = [\n [\"format\", input.patch.patchFormat, input.delta.patchFormat],\n [\"base sha256\", input.patch.baseSha256, input.delta.fromSha256],\n [\"base size\", input.patch.baseSizeBytes, input.delta.fromSizeBytes],\n [\"target sha256\", input.patch.targetSha256, input.targetSha256],\n [\"target size\", input.patch.targetSizeBytes, input.targetSizeBytes],\n ].filter(([, actual, expected]) => actual !== expected);\n if (mismatches.length > 0) {\n throw new Error(\n `delta patch metadata mismatch: ${mismatches.map(([label]) => label).join(\", \")}`\n );\n }\n}\n\nfunction verifyBytes(input: {\n bytes: Buffer;\n expectedSha256: string;\n expectedSizeBytes: number;\n label: string;\n}): void {\n if (input.bytes.byteLength !== input.expectedSizeBytes) {\n throw new Error(\n `${input.label} size mismatch: expected ${input.expectedSizeBytes} bytes, received ${input.bytes.byteLength} bytes`\n );\n }\n const actualSha256 = createHash(\"sha256\").update(input.bytes).digest(\"hex\");\n if (actualSha256 !== input.expectedSha256.toLowerCase()) {\n throw new Error(\n `${input.label} sha256 mismatch: expected ${input.expectedSha256.toLowerCase()}, received ${actualSha256}`\n );\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { gunzipSync } from \"node:zlib\";\nimport type { CliBinaryRelease } from \"@openmeld/schemas\";\nimport { reconstructCliBinaryDelta } from \"./cli-binary-delta.js\";\n\ntype CommandResult = {\n code: number;\n stderr: string;\n stdout: string;\n};\n\nconst HARDENED_RUNTIME_FLAG_RE = /flags=.*runtime/iu;\nconst SIGNING_TIMESTAMP_RE = /^Timestamp=/mu;\n\ntype CliBinaryDelta = NonNullable<CliBinaryRelease[\"deltas\"]>[number];\ntype CliBinaryFullUpdatePlan =\n | {\n downloadSha256: string;\n downloadSizeBytes: number;\n downloadUrl: string;\n transport: \"archive\";\n }\n | {\n downloadSha256: string;\n downloadSizeBytes: number;\n downloadUrl: string;\n transport: \"raw\";\n };\n\nexport type CliBinaryUpdatePlan =\n | CliBinaryFullUpdatePlan\n | {\n baseBytes: Buffer;\n delta: CliBinaryDelta;\n downloadSizeBytes: number;\n transport: \"delta\";\n };\n\nexport async function resolveCliBinaryUpdatePlan(input: {\n baseBinaryPath: string;\n currentVersion: string;\n onDeltaFallback: (error: Error) => void;\n release: CliBinaryRelease;\n}): Promise<CliBinaryUpdatePlan> {\n const fullDownloadPlan = resolveFullCliBinaryUpdatePlan(input.release);\n const versionDeltas = input.release.deltas?.filter(\n (candidate) => candidate.fromVersion === input.currentVersion\n );\n if (!versionDeltas?.length) {\n return fullDownloadPlan;\n }\n\n let baseBytes: Buffer;\n try {\n baseBytes = await readFile(input.baseBinaryPath);\n } catch (error) {\n input.onDeltaFallback(toError(error));\n return fullDownloadPlan;\n }\n const baseSha256 = createHash(\"sha256\").update(baseBytes).digest(\"hex\");\n const delta = versionDeltas.find(\n (candidate) =>\n candidate.fromSizeBytes === baseBytes.byteLength &&\n candidate.fromSha256.toLowerCase() === baseSha256\n );\n if (!delta) {\n return fullDownloadPlan;\n }\n return {\n baseBytes,\n delta,\n downloadSizeBytes: delta.patchSizeBytes,\n transport: \"delta\",\n };\n}\n\nexport async function downloadCliBinaryUpdateArtifact(input: {\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n onDeltaFallback: (error: Error) => void;\n plan: CliBinaryUpdatePlan;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n if (input.plan.transport === \"delta\") {\n try {\n return await downloadCliBinaryDelta({\n ...input,\n baseBytes: input.plan.baseBytes,\n delta: input.plan.delta,\n });\n } catch (error) {\n input.onDeltaFallback(toError(error));\n }\n return downloadFullCliBinaryArtifact({\n ...input,\n plan: resolveFullCliBinaryUpdatePlan(input.release),\n });\n }\n return downloadFullCliBinaryArtifact({ ...input, plan: input.plan });\n}\n\nexport async function verifyCliBinaryCodeSignature(input: {\n artifactPath: string;\n release: CliBinaryRelease;\n runCommand: (command: string, args: string[]) => Promise<CommandResult>;\n}): Promise<void> {\n const { codeIdentifier, teamIdentifier } = input.release;\n if (!(codeIdentifier && teamIdentifier)) {\n return;\n }\n if (process.platform !== \"darwin\") {\n throw new Error(\"signed OpenMeld CLI verification requires macOS\");\n }\n\n const verification = await input.runCommand(\"/usr/bin/codesign\", [\n \"--verify\",\n \"--strict\",\n \"--verbose=2\",\n input.artifactPath,\n ]);\n if (verification.code !== 0) {\n throw new Error(\n `binary code signature verification failed: ${commandFailureDetails(verification)}`\n );\n }\n\n const inspection = await input.runCommand(\"/usr/bin/codesign\", [\n \"--display\",\n \"--verbose=4\",\n input.artifactPath,\n ]);\n if (inspection.code !== 0) {\n throw new Error(\n `binary code signature inspection failed: ${commandFailureDetails(inspection)}`\n );\n }\n const details = `${inspection.stdout}\\n${inspection.stderr}`;\n for (const expected of [\n `Identifier=${codeIdentifier}`,\n `TeamIdentifier=${teamIdentifier}`,\n \"Authority=Developer ID Application:\",\n ]) {\n if (!details.includes(expected)) {\n throw new Error(\n `binary code signature is missing expected identity: ${expected}`\n );\n }\n }\n if (!HARDENED_RUNTIME_FLAG_RE.test(details)) {\n throw new Error(\"binary code signature is missing the hardened runtime\");\n }\n if (!SIGNING_TIMESTAMP_RE.test(details)) {\n throw new Error(\"binary code signature is missing a trusted timestamp\");\n }\n}\n\nasync function downloadCliBinaryDelta(input: {\n baseBytes: Buffer;\n delta: CliBinaryDelta;\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n const response = await input.fetchImpl(input.delta.patchUrl, {\n method: \"GET\",\n signal: AbortSignal.timeout(input.downloadTimeoutMs),\n });\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `binary delta download failed: HTTP ${response.status}${body ? `: ${body}` : \"\"}`\n );\n }\n const patchBytes = Buffer.from(await response.arrayBuffer());\n verifyBinaryBytes({\n bytes: patchBytes,\n expectedSha256: input.delta.patchSha256,\n expectedSizeBytes: input.delta.patchSizeBytes,\n label: \"binary delta archive\",\n });\n\n let patchPayloadBytes: Buffer;\n try {\n patchPayloadBytes = gunzipSync(patchBytes, {\n maxOutputLength: input.delta.patchPayloadSizeBytes,\n });\n } catch (error) {\n throw new Error(\n `binary delta could not be decompressed: ${toError(error).message}`\n );\n }\n if (patchPayloadBytes.byteLength !== input.delta.patchPayloadSizeBytes) {\n throw new Error(\n `binary delta payload size mismatch: expected ${input.delta.patchPayloadSizeBytes} bytes, received ${patchPayloadBytes.byteLength} bytes`\n );\n }\n\n return reconstructCliBinaryDelta({\n baseBytes: input.baseBytes,\n delta: input.delta,\n patchPayloadBytes,\n targetSha256: input.release.sha256,\n targetSizeBytes: input.release.sizeBytes,\n });\n}\n\nexport function resolveFullCliBinaryUpdatePlan(\n release: CliBinaryRelease\n): CliBinaryFullUpdatePlan {\n if (hasCompressedCliBinaryTransport(release)) {\n return {\n downloadSha256: release.archiveSha256,\n downloadSizeBytes: release.archiveSizeBytes,\n downloadUrl: release.archiveUrl,\n transport: \"archive\",\n };\n }\n return {\n downloadSha256: release.sha256,\n downloadSizeBytes: release.sizeBytes,\n downloadUrl: release.url,\n transport: \"raw\",\n };\n}\n\nasync function downloadFullCliBinaryArtifact(input: {\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n plan: CliBinaryFullUpdatePlan;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n const response = await input.fetchImpl(input.plan.downloadUrl, {\n method: \"GET\",\n signal: AbortSignal.timeout(input.downloadTimeoutMs),\n });\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `binary download failed: HTTP ${response.status}${body ? `: ${body}` : \"\"}`\n );\n }\n const downloadBytes = Buffer.from(await response.arrayBuffer());\n verifyBinaryBytes({\n bytes: downloadBytes,\n expectedSha256: input.plan.downloadSha256,\n expectedSizeBytes: input.plan.downloadSizeBytes,\n label:\n input.plan.transport === \"archive\" ? \"binary archive\" : \"binary download\",\n });\n let artifactBytes = downloadBytes;\n if (input.plan.transport === \"archive\") {\n try {\n artifactBytes = gunzipSync(downloadBytes, {\n maxOutputLength: input.release.sizeBytes,\n });\n } catch (error) {\n throw new Error(\n `binary archive could not be decompressed: ${toError(error).message}`\n );\n }\n }\n verifyBinaryBytes({\n bytes: artifactBytes,\n expectedSha256: input.release.sha256,\n expectedSizeBytes: input.release.sizeBytes,\n label: \"binary download\",\n });\n return artifactBytes;\n}\n\nfunction hasCompressedCliBinaryTransport(\n release: CliBinaryRelease\n): release is CliBinaryRelease & {\n archiveFormat: \"gzip\";\n archiveUrl: string;\n archiveSha256: string;\n archiveSizeBytes: number;\n} {\n return (\n release.archiveFormat === \"gzip\" &&\n typeof release.archiveUrl === \"string\" &&\n typeof release.archiveSha256 === \"string\" &&\n typeof release.archiveSizeBytes === \"number\"\n );\n}\n\nfunction verifyBinaryBytes(input: {\n bytes: Buffer;\n expectedSha256: string;\n expectedSizeBytes: number;\n label: string;\n}): void {\n if (input.bytes.byteLength !== input.expectedSizeBytes) {\n throw new Error(\n `${input.label} size mismatch: expected ${input.expectedSizeBytes} bytes, received ${input.bytes.byteLength} bytes`\n );\n }\n const actualSha256 = createHash(\"sha256\").update(input.bytes).digest(\"hex\");\n if (actualSha256 !== input.expectedSha256.toLowerCase()) {\n throw new Error(\n `${input.label} sha256 mismatch: expected ${input.expectedSha256.toLowerCase()}, received ${actualSha256}`\n );\n }\n}\n\nfunction commandFailureDetails(result: CommandResult): string {\n return result.stderr.trim() || result.stdout.trim() || `exit ${result.code}`;\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n DAEMON_SERVICE_RUNTIME_AUTO_START_ENV,\n DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV,\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV,\n daemonRuntimeRootPath,\n} from \"./daemon-state\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n resolveOpenMeldServiceScope,\n} from \"./paths\";\n\nconst MANAGED_VERSION_FROM_EXECUTABLE_PATTERN =\n /[\\\\/]versions[\\\\/](v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)[\\\\/]openmeld(?:\\.exe)?/gu;\nconst SELF_CONTAINED_BUNDLE_FROM_EXECUTABLE_PATTERN =\n /[\\\\/]runtime[\\\\/]daemon[\\\\/]bundles[\\\\/]([0-9A-Za-z._-]+)[\\\\/]/gu;\n\nexport const INDEPENDENT_MAINTENANCE_REGISTRATION =\n \"openmeld-independent-maintenance-v1\";\n\n// Maintenance may call normal Service commands, but it is never the main\n// Service process. Also normalize registrations written by older versions.\nexport function configureDaemonMaintenanceEnvironment(\n env: NodeJS.ProcessEnv\n): void {\n for (const key of [\n DAEMON_SERVICE_RUNTIME_AUTO_START_ENV,\n DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV,\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV,\n ]) {\n delete env[key];\n }\n env.OPENMELD_INTERNAL_MAINTENANCE_WORKER = \"1\";\n}\nconst NPM_ENTRY_IMPORT_PATTERN = /^await import\\((\".*\")\\);$/mu;\n\nexport function daemonServiceUpdateWorkerNpmEntryPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-update-worker.mjs\");\n}\n\nexport async function hasIndependentMaintenanceRegistration(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform,\n expectedDefinition?: string\n): Promise<boolean> {\n if (platform === \"win32\") {\n const { runWindowsUserTask, readWindowsTaskAction } = await import(\n \"../local-service/lifecycle/windows-user-task\"\n );\n const task = await runWindowsUserTask({\n name: resolveDaemonServiceUpdateWorkerIdentity(pathInput)\n .windowsServiceName,\n legacyScript:\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput),\n operation: \"status\",\n });\n return Boolean(\n task.installed &&\n !task.legacy &&\n task.actionArguments &&\n (expectedDefinition === undefined ||\n task.actionArguments === expectedDefinition) &&\n resolveOpenMeldRootDir({\n env: readWindowsTaskAction(task.actionArguments).env,\n }) === resolveOpenMeldRootDir(pathInput)\n );\n }\n const registration = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n if (!registration?.includes(INDEPENDENT_MAINTENANCE_REGISTRATION)) {\n return false;\n }\n if (expectedDefinition !== undefined && registration !== expectedDefinition) {\n return false;\n }\n const { parseDaemonServiceEnvironmentFromDefinition } = await import(\n \"../local-service/lifecycle/daemon-service-manager\"\n );\n const env = parseDaemonServiceEnvironmentFromDefinition({\n controller: platform === \"darwin\" ? \"launchd\" : \"systemd\",\n definition: registration,\n });\n return resolveOpenMeldRootDir({ env }) === resolveOpenMeldRootDir(pathInput);\n}\n\nexport type DaemonServiceUpdateWorkerIdentity = {\n launchdLabel: string;\n serviceName: string;\n windowsDisplayName: string;\n windowsServiceName: string;\n};\n\nexport function resolveDaemonServiceUpdateWorkerIdentity(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceUpdateWorkerIdentity {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n const scope = resolveOpenMeldServiceScope(pathInput);\n const suffix =\n (preset === \"prod\" ? \"\" : `-${preset}`) + (scope ? `-${scope}` : \"\");\n const dotSuffix =\n (preset === \"prod\" ? \"\" : `.${preset}`) + (scope ? `.${scope}` : \"\");\n return {\n launchdLabel: `com.openmeld.openmeld-service-update${dotSuffix}`,\n serviceName: `openmeld-service-update${suffix}`,\n windowsDisplayName: `OpenMeld Service Update${\n preset === \"prod\" ? \"\" : ` (${preset})`\n }`,\n windowsServiceName: `OpenMeld-Service-Update${suffix}`,\n };\n}\n\nexport function resolveDaemonServiceUpdateWorkerLaunchdPlistPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \"Library\",\n \"LaunchAgents\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).launchdLabel}.plist`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.service`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.path`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerWindowsScriptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-update-worker.bat\");\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.timer`\n );\n}\n\nexport async function readDaemonServiceUpdateWorkerProtectedManagedVersions(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform\n): Promise<Set<string>> {\n const contents = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n return contents === null\n ? new Set()\n : readManagedVersionsFromUpdateWorkerRegistration(contents);\n}\n\nexport async function readDaemonServiceUpdateWorkerProtectedBundleIds(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform\n): Promise<Set<string>> {\n const contents = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n const protectedIds =\n contents === null\n ? new Set<string>()\n : readBundleIdsFromUpdateWorkerRegistration(contents);\n const launcherPath = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n const launcher = await readFile(launcherPath, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (launcher !== null) {\n const importLine = launcher.trim().match(NPM_ENTRY_IMPORT_PATTERN);\n if (!importLine?.[1]) {\n throw new Error(\n \"OpenMeld maintenance launcher is invalid; bundle cleanup was stopped.\"\n );\n }\n const entryPath = fileURLToPath(JSON.parse(importLine[1]) as string);\n for (const id of readBundleIdsFromUpdateWorkerRegistration(entryPath)) {\n protectedIds.add(id);\n }\n }\n return protectedIds;\n}\n\nexport function readManagedVersionsFromUpdateWorkerRegistration(\n contents: string\n): Set<string> {\n const versions = new Set<string>();\n for (const match of contents.matchAll(\n MANAGED_VERSION_FROM_EXECUTABLE_PATTERN\n )) {\n const version = match[1];\n if (version) {\n versions.add(version);\n }\n }\n return versions;\n}\n\nexport function readBundleIdsFromUpdateWorkerRegistration(\n contents: string\n): Set<string> {\n const bundleIds = new Set<string>();\n for (const match of contents.matchAll(\n SELF_CONTAINED_BUNDLE_FROM_EXECUTABLE_PATTERN\n )) {\n const bundleId = match[1];\n if (bundleId) {\n bundleIds.add(bundleId);\n }\n }\n return bundleIds;\n}\n\nexport function resolveDaemonServiceUpdateWorkerRegistrationPath(\n pathInput: OpenMeldPathResolutionInput,\n platform: NodeJS.Platform\n): string | null {\n if (platform === \"darwin\") {\n return resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput);\n }\n if (platform === \"linux\") {\n return resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput);\n }\n if (platform === \"win32\") {\n return resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n }\n return null;\n}\n\nasync function readDaemonServiceUpdateWorkerRegistration(\n pathInput: OpenMeldPathResolutionInput,\n platform: NodeJS.Platform\n): Promise<string | null> {\n const registrationPath = resolveDaemonServiceUpdateWorkerRegistrationPath(\n pathInput,\n platform\n );\n if (registrationPath === null) {\n return null;\n }\n return await readFile(registrationPath, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n}\n\nfunction getErrorCode(error: unknown): string | null {\n return error && typeof error === \"object\" && \"code\" in error\n ? String(error.code)\n : null;\n}\n","","import { cliBinaryServiceReleaseSchema } from \"@openmeld/schemas\";\nimport packageJson from \"../../package.json\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport type { CliBinaryReleaseInfo } from \"./version-state\";\n\ndeclare const __OPENMELD_SERVICE_RELEASE__: unknown;\n\n// The release embeds its selected Service artifact so setup and repair use the\n// same target offline, without a second mutable version cache. Legacy releases\n// continue to use their own CLI binary as the Service carrier.\nexport function resolveBundledServiceRelease():\n | CliBinaryReleaseInfo\n | undefined {\n if (!isBinaryDistribution()) {\n return undefined;\n }\n const metadata = packageJson as { openmeld?: { service?: unknown } };\n const selection =\n typeof __OPENMELD_SERVICE_RELEASE__ === \"undefined\"\n ? metadata.openmeld?.service\n : __OPENMELD_SERVICE_RELEASE__;\n if (selection === undefined) {\n return undefined;\n }\n const parsed = cliBinaryServiceReleaseSchema.safeParse(selection);\n if (!parsed.success) {\n throw new Error(\n \"The installed CLI contains invalid Service release metadata.\"\n );\n }\n const platform = `${process.platform}-${process.arch}`;\n const artifact = parsed.data.platforms[platform];\n if (!artifact) {\n throw new Error(\n `The installed CLI has no Service artifact for ${platform}.`\n );\n }\n return {\n ...artifact,\n version: parsed.data.version,\n platform,\n minRequiredCliVersion: null,\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type CliBinaryManifest,\n type CliBinaryRelease,\n cliBinaryManifestSchema,\n} from \"@openmeld/schemas\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport { openMeldRootDir } from \"./paths\";\n\nconst VERSION_STATE_FILENAME = \"version.json\";\nconst NPM_REGISTRY_LATEST_TIMEOUT_MS = 5000;\nconst VERSION_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst LEADING_V_PREFIX_REGEX = /^v/;\nconst SEMVER_CORE_REGEX =\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+.*)?$/;\nconst NUMERIC_SEMVER_IDENTIFIER_REGEX = /^\\d+$/;\nconst versionCache = new Map<\n string,\n { info: PackageLatestInfo; fetchedAt: number }\n>();\nconst versionMetadataCache = new Map<\n string,\n {\n metadata: PackageVersionMetadata;\n fetchedAt: number;\n }\n>();\nconst inFlightVersionRequests = new Map<string, Promise<PackageLatestInfo>>();\nconst inFlightVersionMetadataRequests = new Map<\n string,\n Promise<PackageVersionMetadata>\n>();\n\nexport type OpenMeldVersionStateV1 = {\n v: 1;\n last_version?: string;\n latest_version?: string;\n last_checked_at?: string;\n dismissed_version?: string | null;\n // Projection of the published \"minimum required CLI version\" floor\n // (`openmeld.minRequiredCliVersion` on the npm `latest` manifest). Cached so the\n // forced-update gate can read it without a network probe on every command.\n required_floor?: string | null;\n updated_at: string;\n};\n\nexport type PackageVersionMetadata = {\n version: string;\n deprecated: string | null;\n};\n\nexport type PackageLatestInfo = {\n version: string;\n minRequiredCliVersion: string | null;\n serviceVersion?: string;\n};\n\nexport type CliBinaryReleaseInfo = PackageLatestInfo &\n CliBinaryRelease & {\n platform: string;\n service?: CliBinaryRelease & { version: string; platform: string };\n };\n\nexport function versionStatePath(): string {\n return join(openMeldRootDir(), VERSION_STATE_FILENAME);\n}\n\nexport async function readVersionState(): Promise<OpenMeldVersionStateV1 | null> {\n const raw = await readFile(versionStatePath(), \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<OpenMeldVersionStateV1>;\n if (parsed.v !== 1 || typeof parsed.updated_at !== \"string\") {\n return null;\n }\n const lastVersion = toNonEmptyString(parsed.last_version);\n const latestVersion = toNonEmptyString(parsed.latest_version);\n const lastCheckedAt = toNonEmptyString(parsed.last_checked_at);\n const dismissedVersion =\n parsed.dismissed_version === null\n ? null\n : toNonEmptyString(parsed.dismissed_version);\n const requiredFloor = parseStoredRequiredFloor(parsed.required_floor);\n const next: OpenMeldVersionStateV1 = {\n v: 1,\n ...(lastVersion ? { last_version: lastVersion } : {}),\n ...(latestVersion ? { latest_version: latestVersion } : {}),\n ...(lastCheckedAt ? { last_checked_at: lastCheckedAt } : {}),\n ...(dismissedVersion === undefined\n ? {}\n : { dismissed_version: dismissedVersion }),\n ...(requiredFloor === undefined ? {} : { required_floor: requiredFloor }),\n updated_at: parsed.updated_at,\n };\n return next;\n } catch {\n return null;\n }\n}\n\nexport async function writeVersionState(\n state: OpenMeldVersionStateV1\n): Promise<void> {\n await mkdir(openMeldRootDir(), { recursive: true });\n await writeFile(versionStatePath(), `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nexport function createInitialVersionState(input: {\n currentVersion: string;\n checkedAt?: string;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: input.currentVersion,\n last_checked_at: checkedAt,\n dismissed_version: null,\n updated_at: checkedAt,\n };\n}\n\nexport function hasValidLastVersion(\n state: OpenMeldVersionStateV1 | null\n): boolean {\n return Boolean(toNonEmptyString(state?.last_version));\n}\n\nexport async function ensureVersionStateReady(input: {\n currentVersion: string;\n}): Promise<OpenMeldVersionStateV1> {\n const previousVersionState = await readVersionState();\n if (!previousVersionState) {\n const nextState = createInitialVersionState({\n currentVersion: input.currentVersion,\n });\n await writeVersionState(nextState);\n return nextState;\n }\n\n if (hasValidLastVersion(previousVersionState)) {\n return previousVersionState;\n }\n\n const nextState: OpenMeldVersionStateV1 = {\n ...previousVersionState,\n last_version: input.currentVersion,\n latest_version: previousVersionState.latest_version ?? input.currentVersion,\n };\n await writeVersionState(nextState);\n return nextState;\n}\n\nexport function buildNextVersionState(input: {\n previous: OpenMeldVersionStateV1 | null;\n currentVersion: string;\n latestVersion?: string;\n checkedAt?: string;\n dismissedVersion?: string | null;\n // When provided (including `null`), overwrites the cached floor with the\n // freshly observed value; when omitted, the previous floor is carried\n // forward so callers that do not resolve the floor leave it untouched.\n requiredFloor?: string | null;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n const latestVersion =\n toNonEmptyString(input.latestVersion) ??\n toNonEmptyString(input.previous?.latest_version) ??\n input.currentVersion;\n const requiredFloor =\n input.requiredFloor === undefined\n ? (input.previous?.required_floor ?? null)\n : input.requiredFloor;\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: latestVersion,\n last_checked_at: checkedAt,\n dismissed_version:\n input.dismissedVersion ?? input.previous?.dismissed_version ?? null,\n ...(requiredFloor ? { required_floor: requiredFloor } : {}),\n updated_at: checkedAt,\n };\n}\n\nfunction parseStoredRequiredFloor(value: unknown): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n return toNonEmptyString(value);\n}\n\nexport async function fetchLatestPackageInfo(\n packageName: string,\n input: { forceRefresh?: boolean } = {}\n): Promise<PackageLatestInfo> {\n const now = Date.now();\n const cached = input.forceRefresh ? undefined : versionCache.get(packageName);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.info;\n }\n\n const requestKey = input.forceRefresh\n ? `${packageName}:force_refresh`\n : packageName;\n const inFlight = inFlightVersionRequests.get(requestKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestLatestPackageInfo(packageName);\n inFlightVersionRequests.set(requestKey, request);\n\n try {\n const info = await request;\n versionCache.set(packageName, {\n info,\n fetchedAt: Date.now(),\n });\n return info;\n } finally {\n inFlightVersionRequests.delete(requestKey);\n }\n}\n\nexport async function fetchLatestPackageVersion(\n packageName: string\n): Promise<string> {\n const info = await fetchLatestPackageInfo(packageName);\n return info.version;\n}\n\nexport async function fetchLatestCliBinaryRelease(input?: {\n platform?: string;\n}): Promise<CliBinaryReleaseInfo> {\n const manifest = await requestCliBinaryManifest();\n const platform =\n toNonEmptyString(input?.platform) ?? `${process.platform}-${process.arch}`;\n const release = manifest.platforms[platform];\n if (!release) {\n throw new Error(\n `version check failed: invalid CLI manifest response: missing platform ${platform}`\n );\n }\n const serviceRelease = manifest.service?.platforms[platform];\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n platform,\n ...release,\n ...(manifest.service && serviceRelease\n ? {\n service: {\n ...serviceRelease,\n version: manifest.service.version,\n platform,\n },\n }\n : {}),\n };\n}\n\nexport async function fetchPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n const packageName = input.packageName.trim();\n const version = input.version.trim();\n const cacheKey = `${packageName}@${version}`;\n const now = Date.now();\n const cached = versionMetadataCache.get(cacheKey);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.metadata;\n }\n\n const inFlight = inFlightVersionMetadataRequests.get(cacheKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestPackageVersionMetadata({\n packageName,\n version,\n });\n inFlightVersionMetadataRequests.set(cacheKey, request);\n\n try {\n const metadata = await request;\n versionMetadataCache.set(cacheKey, {\n metadata,\n fetchedAt: Date.now(),\n });\n return metadata;\n } finally {\n inFlightVersionMetadataRequests.delete(cacheKey);\n }\n}\n\nexport function resetVersionCheckCacheForTests(): void {\n versionCache.clear();\n versionMetadataCache.clear();\n inFlightVersionRequests.clear();\n inFlightVersionMetadataRequests.clear();\n}\n\nasync function requestLatestPackageInfo(\n packageName: string\n): Promise<PackageLatestInfo> {\n if (isBinaryDistribution()) {\n return await requestLatestPackageInfoFromCliManifest();\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as { version?: unknown; openmeld?: unknown };\n const version =\n typeof parsed.version === \"string\" ? parsed.version.trim() : \"\";\n if (!version) {\n throw new Error(\"missing version\");\n }\n return {\n version,\n minRequiredCliVersion: readMinRequiredCliVersion(parsed.openmeld),\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// Binary distribution reads the same version-gate inputs (latest version +\n// minRequiredCliVersion floor) from the R2 cli/manifest.json instead of the npm\n// registry. The gate logic (floorBreached) is unchanged; only the data source\n// differs. The URL is a production Web route; override with\n// OPENMELD_CLI_BINARY_MANIFEST_URL for non-prod lanes.\nconst CLI_BINARY_MANIFEST_URL =\n toNonEmptyString(process.env.OPENMELD_CLI_BINARY_MANIFEST_URL) ??\n \"https://openmeld.ai/cli/manifest.json\";\n\nasync function requestLatestPackageInfoFromCliManifest(): Promise<PackageLatestInfo> {\n const manifest = await requestCliBinaryManifest();\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n ...(manifest.service ? { serviceVersion: manifest.service.version } : {}),\n };\n}\n\ntype ParsedCliBinaryManifest = CliBinaryManifest[\"channels\"][\"stable\"] & {\n minRequiredCliVersion: string | null;\n};\n\nasync function requestCliBinaryManifest(): Promise<ParsedCliBinaryManifest> {\n const response = await fetch(CLI_BINARY_MANIFEST_URL, {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n return parseCliBinaryManifest(raw);\n } catch (error) {\n throw new Error(\n `version check failed: invalid CLI manifest response: ${toErrorMessage(error)}`\n );\n }\n}\n\nfunction parseCliBinaryManifest(raw: string): ParsedCliBinaryManifest {\n const parsed = cliBinaryManifestSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const stable = parsed.data.channels.stable;\n return {\n ...stable,\n minRequiredCliVersion: stable.minRequiredCliVersion ?? null,\n };\n}\n\nfunction readMinRequiredCliVersion(openmeld: unknown): string | null {\n if (!openmeld || typeof openmeld !== \"object\") {\n return null;\n }\n const value = (openmeld as { minRequiredCliVersion?: unknown })\n .minRequiredCliVersion;\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n // A malformed floor must be treated as \"no signal\", never a hard gate:\n // `compareSemver` falls back to lexical compare on unparseable input, which\n // could wrongly read as a floor breach. Validate before trusting it.\n return trimmed.length > 0 && isPlainReleaseVersion(trimmed) ? trimmed : null;\n}\n\nasync function requestPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n if (isBinaryDistribution()) {\n // Binary distribution has no npm-style per-version deprecation metadata.\n return { version: input.version, deprecated: null };\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(input.packageName)}/${encodeURIComponent(input.version)}`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as {\n version?: unknown;\n deprecated?: unknown;\n };\n const resolvedVersion =\n typeof parsed.version === \"string\" && parsed.version.trim().length > 0\n ? parsed.version.trim()\n : input.version;\n const deprecated =\n typeof parsed.deprecated === \"string\" &&\n parsed.deprecated.trim().length > 0\n ? parsed.deprecated.trim()\n : null;\n return {\n version: resolvedVersion,\n deprecated,\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// A forced-update floor must be a plain published release version — no\n// prerelease, no build metadata. This is stricter than general semver on\n// purpose: it rejects malformed values (e.g. \"9.0.0+bad meta\") so they fail\n// open instead of hard-gating, and sidesteps prerelease-precedence ambiguity\n// since a floor is always a shipped stable release. Must match the release\n// tool's plain-version check in scripts/release/local-components.mjs.\nconst PLAIN_RELEASE_VERSION_RE = /^\\d+\\.\\d+\\.\\d+$/;\n\nexport function isPlainReleaseVersion(value: string): boolean {\n return PLAIN_RELEASE_VERSION_RE.test(value.trim());\n}\n\nexport function compareSemver(a: string, b: string): number {\n const left = parseSemver(a);\n const right = parseSemver(b);\n if (!(left && right)) {\n return a.localeCompare(b);\n }\n if (left.major !== right.major) {\n return left.major > right.major ? 1 : -1;\n }\n if (left.minor !== right.minor) {\n return left.minor > right.minor ? 1 : -1;\n }\n if (left.patch !== right.patch) {\n return left.patch > right.patch ? 1 : -1;\n }\n return comparePrereleaseIdentifiers(left.prerelease, right.prerelease);\n}\n\nfunction parseSemver(value: string): {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n} | null {\n const normalized = value.trim().replace(LEADING_V_PREFIX_REGEX, \"\");\n const match = normalized.match(SEMVER_CORE_REGEX);\n if (!match) {\n return null;\n }\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : null,\n };\n}\n\nfunction comparePrereleaseIdentifiers(\n left: string[] | null,\n right: string[] | null\n): number {\n if (!(left || right)) {\n return 0;\n }\n if (!left) {\n return 1;\n }\n if (!right) {\n return -1;\n }\n\n const maxLength = Math.max(left.length, right.length);\n for (let index = 0; index < maxLength; index += 1) {\n const leftIdentifier = left[index];\n const rightIdentifier = right[index];\n const lengthComparison = comparePrereleaseLengthAtIndex(\n leftIdentifier,\n rightIdentifier\n );\n if (lengthComparison !== 0) {\n return lengthComparison;\n }\n if (!(leftIdentifier && rightIdentifier)) {\n continue;\n }\n const compared = compareSinglePrereleaseIdentifier(\n leftIdentifier,\n rightIdentifier\n );\n if (compared !== 0) {\n return compared;\n }\n }\n return 0;\n}\n\nfunction comparePrereleaseLengthAtIndex(\n leftIdentifier: string | undefined,\n rightIdentifier: string | undefined\n): number {\n if (leftIdentifier === undefined && rightIdentifier === undefined) {\n return 0;\n }\n if (leftIdentifier === undefined) {\n return -1;\n }\n if (rightIdentifier === undefined) {\n return 1;\n }\n return 0;\n}\n\nfunction compareSinglePrereleaseIdentifier(\n leftIdentifier: string,\n rightIdentifier: string\n): number {\n if (leftIdentifier === rightIdentifier) {\n return 0;\n }\n\n const leftNumber = toNumericPrereleaseIdentifier(leftIdentifier);\n const rightNumber = toNumericPrereleaseIdentifier(rightIdentifier);\n if (leftNumber !== null && rightNumber !== null) {\n if (leftNumber === rightNumber) {\n return 0;\n }\n return leftNumber > rightNumber ? 1 : -1;\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return leftIdentifier > rightIdentifier ? 1 : -1;\n}\n\nfunction toNumericPrereleaseIdentifier(identifier: string): number | null {\n if (!NUMERIC_SEMVER_IDENTIFIER_REGEX.test(identifier)) {\n return null;\n }\n return Number(identifier);\n}\n\nfunction toNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n daemonServiceUpdateJobSchema,\n OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n storedDaemonServiceUpdateJobSchema,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldToolsUpdateOperation,\n DaemonServiceUpdateJob as SharedDaemonServiceUpdateJob,\n} from \"@openmeld/schemas/types\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\n\nconst TERMINAL_UPDATE_VISIBILITY_MS = 24 * 60 * 60 * 1000;\n\nexport const DAEMON_SERVICE_UPDATE_JOB_SCHEMA =\n OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA;\nexport type DaemonServiceUpdateJob = SharedDaemonServiceUpdateJob;\n\nexport function daemonServicePendingUpdatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"service-update.json\");\n}\n\nexport function daemonServiceLastUpdatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n \"service-update-last.json\"\n );\n}\n\nexport async function readPendingDaemonServiceUpdate(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateJob | null> {\n return await readDaemonServiceUpdateJob(\n daemonServicePendingUpdatePath(pathInput)\n );\n}\n\nexport async function readLastDaemonServiceUpdate(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateJob | null> {\n return await readDaemonServiceUpdateJob(\n daemonServiceLastUpdatePath(pathInput)\n );\n}\n\nexport async function persistPendingDaemonServiceUpdate(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeUpdateJobAtomically({\n job,\n path: daemonServicePendingUpdatePath(pathInput),\n });\n}\n\nexport async function completePendingDaemonServiceUpdate(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {},\n retainPending = false\n): Promise<void> {\n await writeUpdateJobAtomically({\n job,\n path: daemonServiceLastUpdatePath(pathInput),\n });\n if (retainPending) {\n // Keep the existing OS trigger until Prepare and its auth handoff finish.\n // The update itself is terminal; this does not schedule another update.\n await persistPendingDaemonServiceUpdate(job, pathInput);\n return;\n }\n await rm(daemonServicePendingUpdatePath(pathInput), { force: true });\n}\n\nexport async function resolveDaemonServiceUpdateOperation(\n pathInput: OpenMeldPathResolutionInput = {},\n nowMs = Date.now()\n): Promise<OpenMeldToolsUpdateOperation | null> {\n const pending = await readPendingDaemonServiceUpdate(pathInput);\n if (pending) {\n return projectUpdateOperation(pending);\n }\n const last = await readLastDaemonServiceUpdate(pathInput);\n if (!(last && isRecentTerminalUpdate(last, nowMs))) {\n return null;\n }\n return projectUpdateOperation(last);\n}\n\nfunction isRecentTerminalUpdate(\n job: DaemonServiceUpdateJob,\n nowMs: number\n): boolean {\n if (\n job.phase !== \"updated\" &&\n job.phase !== \"restored\" &&\n job.phase !== \"needs_help\"\n ) {\n return false;\n }\n const updatedAtMs = Date.parse(job.updatedAt);\n return (\n Number.isFinite(updatedAtMs) &&\n nowMs >= updatedAtMs &&\n nowMs - updatedAtMs <= TERMINAL_UPDATE_VISIBILITY_MS\n );\n}\n\nfunction projectUpdateOperation(\n job: DaemonServiceUpdateJob\n): OpenMeldToolsUpdateOperation {\n return {\n operationId: job.jobId,\n phase: job.phase,\n requestSource: job.requestSource,\n requestedAt: job.requestedAt,\n targetVersion: job.targetVersion,\n updatedAt: job.updatedAt,\n urgency: job.urgency,\n };\n}\n\nasync function readDaemonServiceUpdateJob(\n path: string\n): Promise<DaemonServiceUpdateJob | null> {\n const raw = await readFile(path, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n if (raw === null) {\n return null;\n }\n const parsed = storedDaemonServiceUpdateJobSchema.safeParse(\n JSON.parse(raw) as unknown\n );\n if (!parsed.success) {\n throw new Error(\"OpenMeld Service update state is invalid.\");\n }\n if (parsed.data.v === 2) {\n return parsed.data;\n }\n const { status, ...legacyJob } = parsed.data;\n return daemonServiceUpdateJobSchema.parse({\n ...legacyJob,\n v: 2,\n schema: DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n phase: migrateLegacyPhase(status),\n requestSource: \"cli\",\n });\n}\n\nfunction migrateLegacyPhase(\n status: \"scheduled\" | \"running\" | \"completed\" | \"failed\"\n): DaemonServiceUpdateJob[\"phase\"] {\n switch (status) {\n case \"scheduled\":\n return \"waiting_for_work\";\n case \"running\":\n return \"updating\";\n case \"completed\":\n return \"updated\";\n case \"failed\":\n return \"needs_help\";\n default: {\n const exhaustive: never = status;\n return exhaustive;\n }\n }\n}\n\nasync function writeUpdateJobAtomically(input: {\n job: DaemonServiceUpdateJob;\n path: string;\n}): Promise<void> {\n const temporaryPath = `${input.path}.${String(process.pid)}.tmp`;\n await mkdir(dirname(input.path), { recursive: true });\n await writeFile(temporaryPath, `${JSON.stringify(input.job, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, input.path);\n}\n","import packageJson from \"../../package.json\";\n\ndeclare const __OPENMELD_VERSION__: string | undefined;\n\n/**\n * The version of the running CLI and Service bundle.\n *\n * npm builds use package.json. Binary builds may inject an isolated staging\n * prerelease so the real update lifecycle can be exercised before a production\n * version exists.\n */\nexport function resolveOpenMeldVersion(): string {\n const injected =\n typeof __OPENMELD_VERSION__ === \"string\" ? __OPENMELD_VERSION__.trim() : \"\";\n return injected || packageJson.version;\n}\n\nexport const OPENMELD_VERSION = resolveOpenMeldVersion();\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readdir, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n type OpenMeldPathResolutionInput,\n openMeldVersionsDir,\n} from \"../config/paths\";\nimport { compareSemver } from \"../config/version-state\";\n\nconst MANAGED_VERSION_DIRECTORY_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport async function pruneManagedVersions(input: {\n currentVersion: string;\n pathInput?: OpenMeldPathResolutionInput;\n preferredRollbackVersion?: string | null;\n protectedVersions?: Iterable<string>;\n}): Promise<void> {\n const versionsDir = openMeldVersionsDir(input.pathInput);\n const entries = await readdir(versionsDir, { withFileTypes: true });\n const managedVersions = entries\n .filter(\n (entry) =>\n entry.isDirectory() &&\n MANAGED_VERSION_DIRECTORY_PATTERN.test(entry.name)\n )\n .map((entry) => entry.name);\n const usableManagedVersions = new Set(\n (\n await Promise.all(\n managedVersions.map(async (version) => ({\n usable: await isUsableManagedVersion(version, versionsDir),\n version,\n }))\n )\n )\n .filter((entry) => entry.usable)\n .map((entry) => entry.version)\n );\n const retainedVersions = new Set([input.currentVersion]);\n let rollbackVersion: string | null = null;\n\n if (\n input.preferredRollbackVersion &&\n input.preferredRollbackVersion !== input.currentVersion &&\n usableManagedVersions.has(input.preferredRollbackVersion)\n ) {\n rollbackVersion = input.preferredRollbackVersion;\n }\n\n rollbackVersion ??=\n [...usableManagedVersions]\n .filter((version) => compareSemver(version, input.currentVersion) < 0)\n .sort((left, right) => compareSemver(right, left))[0] ?? null;\n\n if (rollbackVersion) {\n retainedVersions.add(rollbackVersion);\n }\n\n // A legacy worker can still point at a versioned binary until its service\n // registration is rewritten to the stable carrier. Protect that executable\n // independently from the last-known-good rollback selection; the worker\n // manager prunes again after the stable registration is active.\n for (const protectedVersion of input.protectedVersions ?? []) {\n if (usableManagedVersions.has(protectedVersion)) {\n retainedVersions.add(protectedVersion);\n }\n }\n\n await Promise.all(\n managedVersions\n .filter((version) => !retainedVersions.has(version))\n .map((version) =>\n rm(path.join(versionsDir, version), { recursive: true })\n )\n );\n}\n\nasync function isUsableManagedVersion(\n version: string,\n versionsDir: string\n): Promise<boolean> {\n const target = path.join(versionsDir, version, \"openmeld\");\n const stats = await stat(target).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (!stats?.isFile()) {\n return false;\n }\n return await access(target, fsConstants.X_OK).then(\n () => true,\n (error) => {\n if (\n getErrorCode(error) === \"EACCES\" ||\n getErrorCode(error) === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n );\n}\n\nfunction getErrorCode(error: unknown): string | null {\n return error && typeof error === \"object\" && \"code\" in error\n ? String(error.code)\n : null;\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport {\n access,\n chmod,\n copyFile,\n lstat,\n mkdir,\n readlink,\n rename,\n rm,\n stat,\n symlink,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { readDaemonServiceUpdateWorkerProtectedManagedVersions } from \"../config/daemon-service-update-worker-registration\";\nimport {\n acquireLock,\n isOpenMeldLockError,\n isOpenMeldOrphanedLockError,\n runWithHeldLock,\n} from \"../config/lock\";\nimport {\n type OpenMeldPathResolutionInput,\n openMeldBinDir,\n openMeldManagedBinaryPath,\n openMeldManagedVersionBinaryPath,\n openMeldManagedVersionDir,\n} from \"../config/paths\";\nimport { assertNoPublishedProductionMutationDuringTests } from \"../config/published-production-safety\";\nimport { compareSemver } from \"../config/version-state\";\nimport { readDaemonActiveBundleState } from \"../local-service/lifecycle/daemon-service-bundle\";\nimport { readPendingDaemonServiceUpdate } from \"../local-service/lifecycle/daemon-service-update-state\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\nimport { pruneManagedVersions } from \"./managed-version-pruning\";\n\nexport type CliInstallSelfResult =\n | \"installed\"\n | \"noop_same_version\"\n | \"noop_newer_present\";\n\nconst MANAGED_INSTALL_LOCK_PROFILE = \"managed-cli\";\nconst MANAGED_INSTALL_LOCK_KEY = \"install\";\nconst MANAGED_INSTALL_LOCK_RETRY_DELAY_MS = 100;\nconst MANAGED_INSTALL_LOCK_TIMEOUT_MS = 30_000;\n\n/**\n * Result of installing this binary into the managed layout. This is the shape\n * `openmeld install-self --json` emits and the seam Desktop consumes, so it is\n * treated as a frozen contract (covered by shape tests).\n */\nexport type CliInstallSelfOutcome = {\n result: CliInstallSelfResult;\n version: string;\n platform: string;\n // Absolute path of the versioned binary: <root>/versions/<version>/openmeld.\n managedBinaryPath: string;\n // Absolute path of the current-version pointer: <root>/bin/openmeld.\n currentPointerPath: string;\n // Version the current pointer resolved to before this run, if any.\n previousVersion: string | null;\n forced: boolean;\n};\n\nexport function resolveCliPlatformToken(): string {\n return `${process.platform}-${process.arch}`;\n}\n\nexport function resolveCliSelfVersion(): string {\n return OPENMELD_VERSION;\n}\n\nasync function isUsableManagedBinary(target: string): Promise<boolean> {\n const stats = await stat(target).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\")) {\n return null;\n }\n throw error;\n });\n if (!stats?.isFile()) {\n return false;\n }\n return await access(target, fsConstants.X_OK).then(\n () => true,\n (error) => {\n if (\n isErrorWithCode(error, \"EACCES\") ||\n isErrorWithCode(error, \"ENOENT\")\n ) {\n return false;\n }\n throw error;\n }\n );\n}\n\n// The version the current pointer resolves to, read from its symlink target's\n// versions/<version>/ segment. Returns null when there is no pointer yet or it\n// does not resolve into the managed layout.\nasync function readCurrentPointerVersion(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n const pointerPath = openMeldManagedBinaryPath(pathInput);\n const target = await readlink(pointerPath).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\") || isErrorWithCode(error, \"EINVAL\")) {\n return null;\n }\n throw error;\n });\n if (!target) {\n return null;\n }\n const resolved = path.isAbsolute(target)\n ? target\n : path.resolve(path.dirname(pointerPath), target);\n const version = path.basename(path.dirname(resolved));\n return version.length > 0 &&\n path.resolve(resolved) ===\n openMeldManagedVersionBinaryPath(version, pathInput)\n ? version\n : null;\n}\n\nexport async function readManagedCliInstallation(): Promise<{\n version: string;\n binaryPath: string;\n} | null> {\n const version = await readCurrentPointerVersion();\n if (!version) {\n return null;\n }\n const binaryPath = openMeldManagedVersionBinaryPath(version);\n if (!(await isUsableManagedBinary(binaryPath))) {\n return null;\n }\n return { version, binaryPath };\n}\n\n/**\n * Install the currently-running binary (process.execPath) into the managed\n * layout and point bin/openmeld at it. Idempotent with semver arbitration:\n * a same-or-newer pointer is left in place (install only goes up), unless\n * `force` is set. Both the versioned binary and the pointer are swapped in\n * atomically via a temp name + rename.\n */\nexport async function performManagedInstall(input?: {\n force?: boolean;\n // Defaults to process.execPath (this running binary); injectable for tests.\n sourceBinaryPath?: string;\n}): Promise<CliInstallSelfOutcome> {\n return await withManagedInstallTransaction(async () =>\n performManagedInstallLocked(input)\n );\n}\n\nexport async function withManagedInstallTransaction<T>(\n run: () => Promise<T>,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<T> {\n const startedAtMs = Date.now();\n\n for (;;) {\n try {\n const lock = await acquireLock({\n openMeldProfileId: MANAGED_INSTALL_LOCK_PROFILE,\n key: MANAGED_INSTALL_LOCK_KEY,\n meta: { component: \"managed_cli.install\" },\n pathResolution: pathInput,\n });\n return await runWithHeldLock({\n lock,\n run,\n releaseContext: {\n component: \"managed_cli.install\",\n lockKey: MANAGED_INSTALL_LOCK_KEY,\n openMeldProfileId: MANAGED_INSTALL_LOCK_PROFILE,\n },\n });\n } catch (error) {\n if (\n !isOpenMeldLockError(error) ||\n isOpenMeldOrphanedLockError(error) ||\n Date.now() - startedAtMs >= MANAGED_INSTALL_LOCK_TIMEOUT_MS\n ) {\n throw error;\n }\n await delay(MANAGED_INSTALL_LOCK_RETRY_DELAY_MS);\n }\n }\n}\n\n/**\n * Prune managed CLI versions only while holding the install transaction lock.\n * The current pointer and every durable Service update target are re-read in\n * the lock, so cleanup cannot race an install or use a stale pending snapshot.\n */\nexport async function pruneManagedInstallVersions(input: {\n pathInput: OpenMeldPathResolutionInput;\n preferredRollbackVersion?: string | null;\n}): Promise<void> {\n const pathInput = input.pathInput;\n assertNoPublishedProductionMutationDuringTests(\n pathInput,\n \"managed CLI versions\"\n );\n await withManagedInstallTransaction(async () => {\n const currentVersion = await readCurrentPointerVersion(pathInput);\n if (currentVersion === null) {\n return;\n }\n const protectedVersions =\n await readManagedInstallProtectedVersions(pathInput);\n await pruneManagedVersions({\n currentVersion,\n pathInput,\n preferredRollbackVersion: input.preferredRollbackVersion,\n protectedVersions,\n });\n }, pathInput);\n}\n\nasync function performManagedInstallLocked(input?: {\n force?: boolean;\n sourceBinaryPath?: string;\n}): Promise<CliInstallSelfOutcome> {\n const force = input?.force ?? false;\n const version = resolveCliSelfVersion();\n const platform = resolveCliPlatformToken();\n const currentPointerPath = openMeldManagedBinaryPath();\n const managedBinaryPath = openMeldManagedVersionBinaryPath(version);\n const previousVersion = await readCurrentPointerVersion();\n const protectedVersions = await readManagedInstallProtectedVersions();\n\n const baseOutcome = {\n version,\n platform,\n managedBinaryPath,\n currentPointerPath,\n previousVersion,\n forced: force,\n };\n\n if (previousVersion !== null) {\n const comparison = compareSemver(version, previousVersion);\n if (\n !force &&\n comparison === 0 &&\n (await isUsableManagedBinary(managedBinaryPath))\n ) {\n await pruneManagedVersions({\n currentVersion: previousVersion,\n protectedVersions,\n });\n return { ...baseOutcome, result: \"noop_same_version\" };\n }\n if (comparison < 0 && !force) {\n if (!(await isUsableManagedBinary(managedBinaryPath))) {\n await placeVersionedBinary(\n input?.sourceBinaryPath ?? process.execPath,\n version,\n managedBinaryPath\n );\n }\n await pruneManagedVersions({\n currentVersion: previousVersion,\n preferredRollbackVersion: version,\n protectedVersions,\n });\n return { ...baseOutcome, result: \"noop_newer_present\" };\n }\n }\n\n await placeVersionedBinary(\n input?.sourceBinaryPath ?? process.execPath,\n version,\n managedBinaryPath\n );\n await pruneManagedVersions({\n currentVersion: version,\n preferredRollbackVersion: previousVersion,\n protectedVersions,\n });\n await swapCurrentPointer(currentPointerPath, managedBinaryPath);\n\n return { ...baseOutcome, result: \"installed\" };\n}\n\nasync function readManagedInstallProtectedVersions(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<Set<string>> {\n const [protectedVersions, pendingServiceUpdate, activeBundle] =\n await Promise.all([\n readDaemonServiceUpdateWorkerProtectedManagedVersions(pathInput),\n readPendingDaemonServiceUpdate(pathInput),\n readDaemonActiveBundleState(pathInput),\n ]);\n // CLI releases may advance while this Service remains active. Its immutable\n // executable is still a recovery and task-tool dependency, not CLI rollback.\n if (activeBundle?.bundleFormat === \"binary_v1\") {\n protectedVersions.add(activeBundle.daemonVersion);\n }\n if (pendingServiceUpdate?.preparedBundle.bundleFormat === \"binary_v1\") {\n protectedVersions.add(pendingServiceUpdate.preparedBundle.daemonVersion);\n }\n return protectedVersions;\n}\n\nasync function placeVersionedBinary(\n sourceBinary: string,\n version: string,\n managedBinaryPath: string\n): Promise<void> {\n await mkdir(openMeldManagedVersionDir(version), { recursive: true });\n const tmpPath = `${managedBinaryPath}.tmp-${process.pid}-${Date.now()}`;\n await rm(tmpPath, { force: true }).catch(() => undefined);\n await copyFile(sourceBinary, tmpPath);\n await chmod(tmpPath, 0o755);\n const existingTarget = await lstat(managedBinaryPath).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\")) {\n return null;\n }\n throw error;\n });\n if (existingTarget?.isDirectory()) {\n await rm(managedBinaryPath, { recursive: true });\n }\n await rename(tmpPath, managedBinaryPath);\n}\n\nasync function swapCurrentPointer(\n currentPointerPath: string,\n managedBinaryPath: string\n): Promise<void> {\n await mkdir(openMeldBinDir(), { recursive: true });\n const relativeTarget = path.relative(\n path.dirname(currentPointerPath),\n managedBinaryPath\n );\n const tmpPath = `${currentPointerPath}.tmp-${process.pid}-${Date.now()}`;\n await rm(tmpPath, { force: true }).catch(() => undefined);\n await symlink(relativeTarget, tmpPath);\n await rename(tmpPath, currentPointerPath);\n}\n\nexport function buildInstallSelfJsonPayload(outcome: CliInstallSelfOutcome) {\n return {\n schemaVersion: 1 as const,\n type: \"cli.install_self\" as const,\n result: outcome.result,\n version: outcome.version,\n platform: outcome.platform,\n managedBinaryPath: outcome.managedBinaryPath,\n currentPointerPath: outcome.currentPointerPath,\n previousVersion: outcome.previousVersion,\n forced: outcome.forced,\n };\n}\n\nfunction isErrorWithCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { isAbsolute } from \"node:path\";\nimport type { PrepareStepDiagnosticsBundle } from \"@openmeld/schemas/types\";\n\nconst ERROR_CODES = new Set([\n \"EPERM\",\n \"EACCES\",\n \"ENOENT\",\n \"ENOTDIR\",\n \"EISDIR\",\n \"EROFS\",\n \"ENOSPC\",\n \"EBUSY\",\n \"ETXTBSY\",\n \"EEXIST\",\n \"EIO\",\n \"EMFILE\",\n \"ENFILE\",\n \"EINVAL\",\n \"ENAMETOOLONG\",\n]);\nconst SYSCALLS = new Set([\n \"access\",\n \"open\",\n \"read\",\n \"write\",\n \"chmod\",\n \"chown\",\n \"copyfile\",\n \"rename\",\n \"unlink\",\n \"rmdir\",\n \"mkdir\",\n \"stat\",\n \"lstat\",\n \"realpath\",\n \"spawn\",\n]);\nconst APP_BUNDLE_PATH_PATTERN = /(?:^|[/\\\\])[^/\\\\]+\\.app(?:[/\\\\]|$)/iu;\n\n// Categories are safe to upload. Exact paths remain in local errors/journals.\nexport function classifyDiagnosticPath(\n value: unknown\n): \"app_bundle\" | \"absolute_other\" | \"relative\" | \"unknown\" {\n if (typeof value !== \"string\" || !value) {\n return \"unknown\";\n }\n if (APP_BUNDLE_PATH_PATTERN.test(value)) {\n return \"app_bundle\";\n }\n return isAbsolute(value) ? \"absolute_other\" : \"relative\";\n}\n\n// Do not copy message, path, spawnargs, environment, or arbitrary error fields.\n// EPERM/EACCES identify an operation failure, never an inferred TCC verdict.\nexport function collectLocalOperationFailure(\n error: unknown\n): PrepareStepDiagnosticsBundle[\"operationFailure\"] {\n let current = error;\n for (let depth = 0; depth < 4 && current instanceof Error; depth += 1) {\n const native = current as NodeJS.ErrnoException & { dest?: unknown };\n if (native.code && ERROR_CODES.has(native.code)) {\n return {\n code: native.code,\n ...(Number.isSafeInteger(native.errno) ? { errno: native.errno } : {}),\n ...(native.syscall && SYSCALLS.has(native.syscall)\n ? { syscall: native.syscall }\n : {}),\n pathCategory: classifyDiagnosticPath(native.path),\n ...(native.dest === undefined\n ? {}\n : {\n destinationCategory: classifyDiagnosticPath(native.dest),\n }),\n };\n }\n current = current.cause;\n }\n return undefined;\n}\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type DaemonLifecycleIntent,\n daemonLifecycleJournalPath,\n readDaemonServiceLifecycleLockMeta,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { assertNoPublishedProductionMutationDuringTests } from \"../../config/published-production-safety\";\nimport { resolveCliContextId } from \"../../config/session-profile\";\n\nconst DAEMON_LIFECYCLE_EVENT_TYPES = [\n \"connection.state\",\n \"daemon.crash\",\n \"lifecycle.command.begin\",\n \"lifecycle.command.end\",\n \"owner.snapshot\",\n \"route_catalog.initial_load\",\n \"runtime_state.takeover\",\n \"stop.controlled_drain\",\n \"stop.strategy.selected\",\n \"service_manager.action\",\n \"service_manager.registration_reconcile\",\n \"process_stop.action\",\n \"service_contract.write\",\n \"stop.signal.observed\",\n] as const;\n\nconst DAEMON_STOP_CAUSES = [\n \"user_stop\",\n \"controlled_service_update\",\n \"service_crash\",\n \"network_disconnect\",\n \"unknown\",\n] as const;\n\nexport type DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\";\n v: 1;\n type: DaemonLifecycleEventType;\n timestamp: string;\n lane: string;\n intent: string;\n command: string;\n pid: number;\n sessionId: string | null;\n stopCause?: DaemonStopCause;\n result: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type DaemonStopCause =\n | \"user_stop\"\n | \"controlled_service_update\"\n | \"service_crash\"\n | \"network_disconnect\"\n | \"unknown\";\n\nexport type DaemonLifecycleAttribution = {\n command: string;\n intent: DaemonLifecycleIntent | \"unknown\";\n lane: string;\n pid: number;\n sessionId: string | null;\n};\n\ntype DaemonLifecycleEventType = (typeof DAEMON_LIFECYCLE_EVENT_TYPES)[number];\n\nfunction toJournalErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction normalizeSessionId(value: string | undefined | null): string | null {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveDaemonStopCause(input: {\n explicitCause?: DaemonStopCause;\n intent: DaemonLifecycleIntent | \"unknown\";\n result: string;\n type: DaemonLifecycleEventType;\n}): DaemonStopCause {\n if (input.explicitCause) {\n return input.explicitCause;\n }\n if (input.type === \"daemon.crash\") {\n return \"service_crash\";\n }\n // A transport observation does not establish why the connection was lost,\n // and must not inherit a concurrent CLI command's stop/update attribution.\n if (input.type === \"connection.state\") {\n return \"unknown\";\n }\n if (input.intent === \"stop\") {\n return \"user_stop\";\n }\n if (\n input.intent === \"upgrade_reconcile\" ||\n input.intent === \"reinstall\" ||\n input.intent === \"startup_check\" ||\n input.intent === \"status_cleanup\"\n ) {\n return \"controlled_service_update\";\n }\n return \"unknown\";\n}\n\nfunction isDaemonLifecycleEvent(event: unknown): event is DaemonLifecycleEvent {\n if (typeof event !== \"object\" || event === null) {\n return false;\n }\n const candidate = event as Partial<DaemonLifecycleEvent>;\n return (\n candidate.schema === \"openmeld-daemon-lifecycle-event-v1\" &&\n candidate.v === 1 &&\n DAEMON_LIFECYCLE_EVENT_TYPES.includes(\n candidate.type as DaemonLifecycleEventType\n ) &&\n typeof candidate.timestamp === \"string\" &&\n candidate.timestamp.length > 0 &&\n typeof candidate.lane === \"string\" &&\n candidate.lane.length > 0 &&\n typeof candidate.intent === \"string\" &&\n candidate.intent.length > 0 &&\n typeof candidate.command === \"string\" &&\n candidate.command.length > 0 &&\n typeof candidate.pid === \"number\" &&\n Number.isInteger(candidate.pid) &&\n candidate.pid > 0 &&\n (candidate.sessionId === null ||\n (typeof candidate.sessionId === \"string\" &&\n candidate.sessionId.length > 0)) &&\n (candidate.stopCause === undefined ||\n DAEMON_STOP_CAUSES.includes(candidate.stopCause)) &&\n typeof candidate.result === \"string\" &&\n candidate.result.length > 0\n );\n}\n\nasync function resolveDaemonLifecycleAttribution(input: {\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleAttribution> {\n const lockMeta = await readDaemonServiceLifecycleLockMeta().catch(() => null);\n const command =\n input.command?.trim() ||\n (typeof lockMeta?.command === \"string\" ? lockMeta.command.trim() : \"\") ||\n \"unknown\";\n const intent =\n input.intent ??\n (typeof lockMeta?.intent === \"string\" ? lockMeta.intent : \"unknown\");\n return {\n command,\n intent,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid:\n typeof lockMeta?.pid === \"number\" && lockMeta.pid > 0\n ? lockMeta.pid\n : process.pid,\n sessionId: normalizeSessionId(lockMeta?.sessionId) ?? resolveCliContextId(),\n };\n}\n\nexport async function emitDaemonLifecycleEvent(input: {\n type: DaemonLifecycleEventType;\n result: string;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n stopCause?: DaemonStopCause;\n}): Promise<void> {\n assertNoPublishedProductionMutationDuringTests(\n input.pathInput ?? {},\n \"OpenMeld Service lifecycle journal\"\n );\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n const timestamp = new Date().toISOString();\n const attribution =\n input.type === \"connection.state\"\n ? {\n command: \"openmeld service run\",\n intent: \"unknown\" as const,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid: process.pid,\n sessionId: resolveCliContextId(),\n }\n : await resolveDaemonLifecycleAttribution(input);\n const event: DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\",\n v: 1,\n type: input.type,\n timestamp,\n lane: attribution.lane,\n intent: attribution.intent,\n command: attribution.command,\n pid: attribution.pid,\n sessionId: attribution.sessionId,\n stopCause: resolveDaemonStopCause({\n explicitCause: input.stopCause,\n intent: attribution.intent,\n result: input.result,\n type: input.type,\n }),\n result: input.result,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n\n if (!isDaemonLifecycleEvent(event)) {\n console.warn(\n `[openmeld:lifecycle-journal] rejected invalid event ${input.type}`\n );\n return;\n }\n\n try {\n await mkdir(dirname(journalPath), { recursive: true });\n await appendFile(journalPath, `${JSON.stringify(event)}\\n`, \"utf8\");\n } catch (error) {\n console.warn(\n `[openmeld:lifecycle-journal] failed to append event ${input.type}: ${toJournalErrorMessage(error)}`\n );\n }\n}\n\nexport async function runWithDaemonLifecycleCommandJournal<T>(input: {\n command: string;\n intent: DaemonLifecycleIntent;\n /**\n * Stamps the begin event with `processUptimeMs`, the milliseconds this\n * process has been running when the command begins. It is opt-in because it\n * is only meaningful for the long-lived daemon run: `begin timestamp -\n * processUptimeMs` recovers the process spawn moment, which splits the gap\n * between the previous `service_manager.action start` and this begin into\n * launchd/BTM spawn-decision latency versus daemon early initialization.\n * Local diagnostic evidence only; it must never feed readiness decisions.\n */\n includeProcessUptime?: boolean;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n resolveResult?: (result: T) => {\n metadata?: Record<string, unknown>;\n result: string;\n };\n run: () => Promise<T>;\n}): Promise<T> {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.begin\",\n result: \"started\",\n metadata: input.includeProcessUptime\n ? {\n ...input.metadata,\n processUptimeMs: Math.round(process.uptime() * 1000),\n }\n : input.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n\n try {\n const result = await input.run();\n const resolvedResult = input.resolveResult?.(result) ?? {\n result: \"completed\",\n };\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: resolvedResult.result,\n metadata: resolvedResult.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: \"failed\",\n metadata: {\n errorMessage: toJournalErrorMessage(error),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nexport async function runDaemonServiceManagerAction<T>(input: {\n action:\n | \"deactivate\"\n | \"install\"\n | \"start\"\n | \"stop\"\n | \"uninstall\"\n | \"wait_running\";\n command?: string;\n controller: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n /**\n * Extracts structured failure evidence from the thrown error so the\n * journal entry alone carries the diagnosis (e.g. launchd job state on a\n * wait_running timeout). Extraction failures are swallowed: journaling\n * must never change the thrown error.\n */\n resolveErrorMetadata?: (error: unknown) => Record<string, unknown> | null;\n run: () => Promise<T>;\n}): Promise<T> {\n const startedAtMs = Date.now();\n try {\n const result = await input.run();\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"completed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n let errorMetadata: Record<string, unknown> | null = null;\n try {\n errorMetadata = input.resolveErrorMetadata?.(error) ?? null;\n } catch {\n errorMetadata = null;\n }\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"failed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n errorMessage: toJournalErrorMessage(error),\n ...(errorMetadata ?? {}),\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nconst DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES = new Set<DaemonLifecycleEventType>([\n \"daemon.crash\",\n \"lifecycle.command.end\",\n \"process_stop.action\",\n \"runtime_state.takeover\",\n \"service_contract.write\",\n \"service_manager.action\",\n]);\n\nexport async function readLatestDaemonLifecycleOriginEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES,\n });\n}\n\nexport async function readLatestDaemonLifecycleConnectionStateEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: new Set<DaemonLifecycleEventType>([\"connection.state\"]),\n });\n}\n\nasync function readLatestDaemonLifecycleEvent(input: {\n pathInput?: OpenMeldPathResolutionInput;\n typeFilter: ReadonlySet<DaemonLifecycleEventType>;\n}): Promise<DaemonLifecycleEvent | null> {\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed) && input.typeFilter.has(parsed.type)) {\n return parsed;\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return null;\n}\n\nexport async function readRecentDaemonLifecycleEvents(input: {\n maxEntries: number;\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleEvent[]> {\n if (input.maxEntries <= 0) {\n return [];\n }\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const recent: DaemonLifecycleEvent[] = [];\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed)) {\n recent.push(parsed);\n if (recent.length >= input.maxEntries) {\n break;\n }\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return recent.reverse();\n}\n\nexport async function resolveRecentDaemonSignalStopCause(\n input: { maxAgeMs?: number; pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<\n | Extract<DaemonStopCause, \"user_stop\" | \"controlled_service_update\">\n | \"unknown\"\n> {\n const nowMs = Date.now();\n const maxAgeMs = input.maxAgeMs ?? 30_000;\n const events = await readRecentDaemonLifecycleEvents({\n maxEntries: 32,\n pathInput: input.pathInput,\n });\n for (const event of events.toReversed()) {\n const eventAtMs = Date.parse(event.timestamp);\n if (\n !Number.isFinite(eventAtMs) ||\n nowMs - eventAtMs < 0 ||\n nowMs - eventAtMs > maxAgeMs\n ) {\n continue;\n }\n if (\n event.stopCause === \"user_stop\" ||\n event.stopCause === \"controlled_service_update\"\n ) {\n return event.stopCause;\n }\n }\n return \"unknown\";\n}\n\nexport function formatDaemonLifecycleOriginSummary(\n event: DaemonLifecycleEvent\n): string {\n const intent = formatDaemonLifecycleIntent(event.intent);\n return `${event.result} ${intent} from ${event.command} at ${event.timestamp} (pid ${event.pid})`;\n}\n\nfunction formatDaemonLifecycleIntent(intent: string): string {\n if (intent === \"unknown\") {\n return \"OpenMeld Service task\";\n }\n return intent.replaceAll(\"_\", \" \");\n}\n","import type { DaemonServiceContract } from \"@openmeld/schemas/types\";\nimport type { DaemonStatus } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport {\n type DaemonActiveBundleState,\n isDaemonBundleSourceAllowedForLane,\n} from \"./daemon-service-bundle\";\n\nexport type DaemonServiceArtifactDriftReasonCode =\n | \"bundle_missing\"\n | \"bundle_content_drift\"\n | \"bundle_id_drift\"\n | \"bundle_version_drift\"\n | \"bundle_lane_drift\"\n | \"bundle_strategy_legacy\"\n | \"bundle_provenance_drift\"\n | \"bundle_path_invalid\";\n\nexport type ResolvedDaemonServiceArtifact = {\n expectedVersion: string;\n installVersion: string | null;\n activeBundleVersion: string | null;\n resolvedEntryPath: string | null;\n driftReasonCodes: DaemonServiceArtifactDriftReasonCode[];\n isAligned: boolean;\n};\n\nexport function resolveDaemonServiceArtifact(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n serviceContract?: DaemonServiceContract | null;\n activeBundle: DaemonActiveBundleState | null;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n installedBundleFingerprint: string | null;\n pathInput?: OpenMeldPathResolutionInput;\n}): ResolvedDaemonServiceArtifact {\n const installVersion = input.installStatus.installed\n ? input.installStatus.state.daemonVersion\n : null;\n const expectedBundleId = input.serviceContract?.bundleId ?? null;\n const expectedDaemonVersion = input.expectedVersion;\n const activeBundleVersion = input.activeBundle?.daemonVersion ?? null;\n const driftReasonCodes = input.activeBundle\n ? collectActiveBundleDriftReasonCodes({\n activeBundle: input.activeBundle,\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceAvailable: input.activeBundleSourceAvailable,\n installedBundleFingerprint: input.installedBundleFingerprint,\n expectedBundleId,\n expectedDaemonVersion,\n pathInput: input.pathInput,\n })\n : ([\"bundle_missing\"] satisfies DaemonServiceArtifactDriftReasonCode[]);\n\n const isAligned = driftReasonCodes.length === 0;\n\n return {\n expectedVersion: input.expectedVersion,\n installVersion,\n activeBundleVersion,\n resolvedEntryPath: isAligned ? input.activeBundleEntryPath : null,\n driftReasonCodes,\n isAligned,\n };\n}\n\nfunction collectActiveBundleDriftReasonCodes(input: {\n activeBundle: DaemonActiveBundleState;\n activeBundleEntryPath: string | null;\n activeBundleSourceAvailable: boolean | null;\n installedBundleFingerprint: string | null;\n expectedBundleId: string | null;\n expectedDaemonVersion: string;\n pathInput?: OpenMeldPathResolutionInput;\n}): DaemonServiceArtifactDriftReasonCode[] {\n const driftReasonCodes: DaemonServiceArtifactDriftReasonCode[] = [];\n\n if (hasBundleVersionDrift(input)) {\n driftReasonCodes.push(\"bundle_version_drift\");\n }\n if (hasBundleIdDrift(input)) {\n driftReasonCodes.push(\"bundle_id_drift\");\n }\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: input.activeBundle.sourceKind,\n pathInput: input.pathInput,\n })\n ) {\n driftReasonCodes.push(\"bundle_lane_drift\");\n }\n if (input.activeBundle.bundleFormat === \"legacy_linked_v1\") {\n driftReasonCodes.push(\"bundle_strategy_legacy\");\n if (input.activeBundleSourceAvailable === false) {\n driftReasonCodes.push(\"bundle_provenance_drift\");\n }\n } else if (hasBundleContentDrift(input)) {\n driftReasonCodes.push(\"bundle_content_drift\");\n }\n if (!input.activeBundleEntryPath) {\n driftReasonCodes.push(\"bundle_path_invalid\");\n }\n\n return driftReasonCodes;\n}\n\nfunction hasBundleVersionDrift(input: {\n activeBundle: DaemonActiveBundleState;\n expectedDaemonVersion: string;\n}): boolean {\n return input.activeBundle.daemonVersion !== input.expectedDaemonVersion;\n}\n\nfunction hasBundleIdDrift(input: {\n activeBundle: DaemonActiveBundleState;\n expectedBundleId: string | null;\n}): boolean {\n return (\n input.expectedBundleId !== null &&\n input.activeBundle.bundleId !== input.expectedBundleId\n );\n}\n\nfunction hasBundleContentDrift(input: {\n activeBundle: DaemonActiveBundleState;\n installedBundleFingerprint: string | null;\n}): boolean {\n return (\n input.installedBundleFingerprint === null ||\n input.activeBundle.sourceDistFingerprint !==\n input.installedBundleFingerprint\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n chmod,\n copyFile,\n cp,\n lstat,\n mkdir,\n readdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { basename, dirname, isAbsolute, join, relative, sep } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport {\n downloadCliBinaryUpdateArtifact,\n resolveCliBinaryUpdatePlan,\n verifyCliBinaryCodeSignature,\n} from \"@openmeld/local-service/cli-binary-update-artifact\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { readDaemonServiceUpdateWorkerProtectedBundleIds } from \"../../config/daemon-service-update-worker-registration\";\nimport {\n daemonRuntimeBundlesPath,\n daemonRuntimeRootPath,\n daemonRuntimeServiceManagerPath,\n daemonRuntimeStateRootPath,\n daemonServiceActiveBundleStatePath,\n daemonServiceLegacyExecutableWrapperPath,\n daemonServiceStableBinaryExecutablePath,\n daemonServiceStableExecutableWrapperPath,\n daemonServiceStableLauncherPath,\n daemonServiceUpdateWorkerBinaryExecutablePath,\n daemonStatePath,\n getDaemonStatus,\n daemonServiceExecutableWrapperPaths as resolveDaemonServiceExecutableWrapperPaths,\n daemonServiceRecognizedExecutablePaths as resolveDaemonServiceRecognizedExecutablePaths,\n} from \"../../config/daemon-state\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport { resolveBundledServiceRelease } from \"../../config/service-release\";\nimport type { CliBinaryReleaseInfo } from \"../../config/version-state\";\nimport {\n performManagedInstall,\n resolveCliSelfVersion,\n} from \"../../local-components/managed-install\";\nimport {\n isBinaryDistribution,\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n classifyDiagnosticPath,\n collectLocalOperationFailure,\n} from \"../../system/local-operation-diagnostics\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\nimport { resolveDaemonServiceArtifact } from \"./daemon-service-artifact\";\nimport { readPendingDaemonServiceUpdate } from \"./daemon-service-update-state\";\n\nconst DAEMON_ACTIVE_BUNDLE_SCHEMA = \"openmeld-daemon-active-bundle-v2\";\nconst DAEMON_ACTIVE_BUNDLE_LEGACY_SCHEMA = \"openmeld-daemon-active-bundle-v1\";\nconst DAEMON_CLI_ENTRY_NAMES = [\"openmeld-dev.js\", \"openmeld.js\"] as const;\nconst DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE = \"workspace\";\nconst DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL = \"package_install\";\nconst DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE = \"npx_cache\";\nconst DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN = \"unknown\";\n// The npm Service bundle copies the platform-neutral JavaScript runtime only.\n// CLI binary and native secure-storage artifacts are verified and released by\n// the CLI artifact lane; the Service does not load them.\nconst DAEMON_SOURCE_DIST_IGNORED_TOP_LEVEL_DIRS = new Set([\"binary\", \"native\"]);\n\nexport type DaemonBundleFormat =\n | \"legacy_linked_v1\"\n | \"self_contained_v1\"\n | \"binary_v1\";\nexport type DaemonBundleSourceKind =\n | typeof DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE\n | typeof DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL\n | typeof DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE\n | typeof DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN;\n\nexport type DaemonActiveBundleState = {\n v: 2;\n schema: typeof DAEMON_ACTIVE_BUNDLE_SCHEMA;\n bundleId: string;\n daemonVersion: string;\n entryScriptRelativePath: string;\n bundleFormat: DaemonBundleFormat;\n sourceEntryScriptPath: string;\n sourcePackageRootPath: string;\n sourceDistRootPath: string;\n sourceDistFingerprint?: string | null;\n sourceKind: DaemonBundleSourceKind;\n createdAt: string;\n updatedAt: string;\n};\n\nexport function daemonServiceActiveBundlePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceActiveBundleStatePath(pathInput);\n}\n\nexport function daemonServiceLauncherPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableLauncherPath(pathInput);\n}\n\nexport function daemonServiceExecutableWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableExecutableWrapperPath(pathInput);\n}\n\nexport function daemonServiceBinaryExecutablePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableBinaryExecutablePath(pathInput);\n}\n\nexport function daemonServiceUpdateWorkerBinaryPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceUpdateWorkerBinaryExecutablePath(pathInput);\n}\n\nexport function daemonServiceExecutableWrapperPaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return resolveDaemonServiceExecutableWrapperPaths(pathInput);\n}\n\nexport function daemonServiceRecognizedExecutablePaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return resolveDaemonServiceRecognizedExecutablePaths(pathInput);\n}\n\nexport function daemonServiceLegacyWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceLegacyExecutableWrapperPath(pathInput);\n}\n\nexport function resolveDaemonBundleRootPath(\n bundleId: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeBundlesPath(pathInput), bundleId);\n}\n\nexport function isDaemonBundleSourceAllowedForLane(input: {\n sourceKind: DaemonBundleSourceKind;\n pathInput?: OpenMeldPathResolutionInput;\n}): boolean {\n if (input.sourceKind !== DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE) {\n return true;\n }\n return resolveOpenMeldEnvPreset(input.pathInput) === \"dev-local\";\n}\n\nexport async function readDaemonActiveBundleState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonActiveBundleState | null> {\n const raw = await readFile(\n daemonServiceActiveBundlePath(pathInput),\n \"utf8\"\n ).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonActiveBundleState>;\n if (parsed.v === 2 && parsed.schema === DAEMON_ACTIVE_BUNDLE_SCHEMA) {\n if (\n typeof parsed.bundleId !== \"string\" ||\n parsed.bundleId.length === 0 ||\n typeof parsed.daemonVersion !== \"string\" ||\n parsed.daemonVersion.length === 0 ||\n typeof parsed.entryScriptRelativePath !== \"string\" ||\n parsed.entryScriptRelativePath.length === 0 ||\n !isDaemonBundleFormat(parsed.bundleFormat) ||\n typeof parsed.sourceEntryScriptPath !== \"string\" ||\n parsed.sourceEntryScriptPath.length === 0 ||\n typeof parsed.sourcePackageRootPath !== \"string\" ||\n parsed.sourcePackageRootPath.length === 0 ||\n typeof parsed.sourceDistRootPath !== \"string\" ||\n parsed.sourceDistRootPath.length === 0 ||\n !isDaemonBundleSourceKind(parsed.sourceKind) ||\n typeof parsed.createdAt !== \"string\" ||\n parsed.createdAt.length === 0 ||\n typeof parsed.updatedAt !== \"string\" ||\n parsed.updatedAt.length === 0\n ) {\n return null;\n }\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: parsed.bundleId,\n daemonVersion: parsed.daemonVersion,\n entryScriptRelativePath: parsed.entryScriptRelativePath,\n bundleFormat: parsed.bundleFormat,\n sourceEntryScriptPath: parsed.sourceEntryScriptPath,\n sourcePackageRootPath: parsed.sourcePackageRootPath,\n sourceDistRootPath: parsed.sourceDistRootPath,\n sourceDistFingerprint: normalizeOptionalText(\n parsed.sourceDistFingerprint\n ),\n sourceKind: parsed.sourceKind,\n createdAt: parsed.createdAt,\n updatedAt: parsed.updatedAt,\n };\n }\n\n const legacyParsed = parsed as Partial<{\n v: 1;\n schema: string;\n bundleId: string;\n daemonVersion: string;\n entryScriptRelativePath: string;\n sourceDistRootPath: string;\n createdAt: string;\n updatedAt: string;\n }>;\n if (\n legacyParsed.v !== 1 ||\n legacyParsed.schema !== DAEMON_ACTIVE_BUNDLE_LEGACY_SCHEMA ||\n typeof legacyParsed.bundleId !== \"string\" ||\n legacyParsed.bundleId.length === 0 ||\n typeof legacyParsed.daemonVersion !== \"string\" ||\n legacyParsed.daemonVersion.length === 0 ||\n typeof legacyParsed.entryScriptRelativePath !== \"string\" ||\n legacyParsed.entryScriptRelativePath.length === 0 ||\n typeof legacyParsed.sourceDistRootPath !== \"string\" ||\n legacyParsed.sourceDistRootPath.length === 0 ||\n typeof legacyParsed.createdAt !== \"string\" ||\n legacyParsed.createdAt.length === 0 ||\n typeof legacyParsed.updatedAt !== \"string\" ||\n legacyParsed.updatedAt.length === 0\n ) {\n return null;\n }\n const sourceEntryScriptPath = join(\n legacyParsed.sourceDistRootPath,\n basename(legacyParsed.entryScriptRelativePath)\n );\n const sourcePackageRootPath = dirname(legacyParsed.sourceDistRootPath);\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: legacyParsed.bundleId,\n daemonVersion: legacyParsed.daemonVersion,\n entryScriptRelativePath: legacyParsed.entryScriptRelativePath,\n bundleFormat: \"legacy_linked_v1\",\n sourceEntryScriptPath,\n sourcePackageRootPath,\n sourceDistRootPath: legacyParsed.sourceDistRootPath,\n sourceDistFingerprint: null,\n sourceKind: inferDaemonBundleSourceKind(sourcePackageRootPath),\n createdAt: legacyParsed.createdAt,\n updatedAt: legacyParsed.updatedAt,\n };\n } catch {\n return null;\n }\n}\n\nexport async function resolveAlignedDaemonActiveBundleEntryPath(\n input: { expectedVersion?: string } = {}\n): Promise<string | null> {\n const [installStatus, serviceContract, state] = await Promise.all([\n getDaemonStatus(),\n readDaemonServiceContract().catch(() => null),\n readDaemonActiveBundleState(),\n ]);\n const expectedVersion =\n input.expectedVersion ??\n serviceContract?.daemonVersion ??\n (installStatus.installed\n ? installStatus.state.daemonVersion\n : (state?.daemonVersion ?? \"unknown\"));\n const matchingServiceContract =\n input.expectedVersion &&\n serviceContract?.daemonVersion !== input.expectedVersion\n ? null\n : serviceContract;\n const activeBundleEntryPath =\n await resolveDaemonBundleEntryPathFromState(state);\n const installedBundleFingerprint = activeBundleEntryPath\n ? await resolveInstalledDaemonBundleFingerprint(state)\n : null;\n const activeBundleSourceAvailable =\n state && state.bundleFormat === \"legacy_linked_v1\"\n ? await pathExists(state.sourcePackageRootPath).catch(() => null)\n : null;\n const artifact = resolveDaemonServiceArtifact({\n expectedVersion,\n installStatus,\n serviceContract: matchingServiceContract,\n activeBundle: state,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n installedBundleFingerprint,\n });\n return artifact.resolvedEntryPath;\n}\n\nexport async function resolveInstalledDaemonBundleFingerprint(\n state: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n if (state?.bundleFormat === \"binary_v1\") {\n const entryPath = await resolveDaemonBundleEntryPathFromState(\n state,\n pathInput\n );\n return entryPath ? await hashDaemonBinaryFile(entryPath) : null;\n }\n if (state?.bundleFormat === \"self_contained_v1\") {\n const bundleRootPath = resolveDaemonBundleRootPath(\n state.bundleId,\n pathInput\n );\n const distRootPath = join(\n bundleRootPath,\n dirname(state.entryScriptRelativePath)\n );\n const relativeDistRootPath = relative(bundleRootPath, distRootPath);\n if (\n relativeDistRootPath === \"..\" ||\n relativeDistRootPath.startsWith(`..${sep}`) ||\n isAbsolute(relativeDistRootPath)\n ) {\n return null;\n }\n return await computeDaemonSourceDistFingerprint(distRootPath);\n }\n return null;\n}\n\nexport async function resolveDaemonBundleEntryPathFromState(\n state: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n if (!state) {\n return null;\n }\n if (state.bundleFormat === \"binary_v1\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(pathInput);\n if (await pathExists(stableExecutablePath)) {\n return stableExecutablePath;\n }\n return (await pathExists(state.sourceEntryScriptPath))\n ? state.sourceEntryScriptPath\n : null;\n }\n const entryPath = join(\n resolveDaemonBundleRootPath(state.bundleId, pathInput),\n state.entryScriptRelativePath\n );\n return (await pathExists(entryPath)) ? entryPath : null;\n}\n\nexport async function prepareDaemonServiceBundle(input: {\n activate?: boolean;\n daemonVersion: string;\n cliScriptPath?: string;\n binaryRelease?: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n const preparedBundle = isBinaryDistribution()\n ? await prepareBinaryDaemonServiceBundle(input)\n : await prepareNodeDaemonServiceBundle(input);\n if (input.activate !== false) {\n await activateDaemonServiceBundle(preparedBundle);\n }\n return preparedBundle;\n}\n\nasync function prepareNodeDaemonServiceBundle(input: {\n daemonVersion: string;\n cliScriptPath?: string;\n}): Promise<DaemonActiveBundleState> {\n const sourceProvenance = await resolveDaemonBundleSourceProvenance(\n input.cliScriptPath\n );\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: sourceProvenance.sourceKind,\n })\n ) {\n throw new Error(\n \"OpenMeld Service cannot use repo-local workspace service files in this lane. Repo-local service files are only allowed through `openmeld-dev`.\"\n );\n }\n const { sourceEntryScriptPath, sourceDistRootPath, sourcePackageRootPath } =\n sourceProvenance;\n const sourceDistFingerprint =\n await computeDaemonSourceDistFingerprint(sourceDistRootPath);\n const entryScriptRelativePath = basename(sourceEntryScriptPath);\n const now = new Date().toISOString();\n const bundleId = createBundleId(input.daemonVersion);\n const bundleRootPath = resolveDaemonBundleRootPath(bundleId);\n const targetDistRootPath = join(bundleRootPath, \"dist\");\n\n await Promise.all([\n mkdir(daemonRuntimeRootPath(), { recursive: true }),\n mkdir(daemonRuntimeBundlesPath(), { recursive: true }),\n mkdir(daemonRuntimeStateRootPath(), { recursive: true }),\n mkdir(daemonRuntimeServiceManagerPath(), { recursive: true }),\n ]);\n\n try {\n await rm(bundleRootPath, { recursive: true, force: true });\n await mkdir(bundleRootPath, { recursive: true });\n await cp(sourceDistRootPath, targetDistRootPath, {\n recursive: true,\n force: true,\n filter: (sourcePath) =>\n isDaemonSourceDistPathIncluded(sourceDistRootPath, sourcePath),\n });\n await writeDaemonBundlePackageManifest({\n bundleRootPath,\n daemonVersion: input.daemonVersion,\n });\n await copyDaemonBundleRuntimeDependencies({\n bundleRootPath,\n sourcePackageRootPath,\n });\n } catch (error) {\n await rm(bundleRootPath, { recursive: true, force: true }).catch(\n () => undefined\n );\n throw error;\n }\n\n const nextState: DaemonActiveBundleState = {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId,\n daemonVersion: input.daemonVersion,\n entryScriptRelativePath: join(\"dist\", entryScriptRelativePath),\n bundleFormat: \"self_contained_v1\",\n sourceEntryScriptPath,\n sourcePackageRootPath,\n sourceDistRootPath,\n sourceDistFingerprint,\n sourceKind: sourceProvenance.sourceKind,\n createdAt: now,\n updatedAt: now,\n };\n\n return nextState;\n}\n\n// Binary distribution: the daemon runs this same binary via `service run`, so\n// there is no dist copy or node_modules dependency closure. Anchor the daemon\n// to the managed install (versions/<version>/openmeld) and record a binary_v1\n// active-bundle state (path fields kept non-empty for the read whitelist). No\n// launcher/wrapper is generated; command-spec points straight at the binary.\nasync function prepareBinaryDaemonServiceBundle(input: {\n daemonVersion: string;\n binaryRelease?: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n const { daemonVersion } = input;\n const bundledRelease = resolveBundledServiceRelease();\n const binaryRelease =\n input.binaryRelease ??\n (bundledRelease?.version === daemonVersion ? bundledRelease : undefined);\n if (daemonVersion !== resolveCliSelfVersion()) {\n const active = await readDaemonActiveBundleState();\n if (\n active?.bundleFormat === \"binary_v1\" &&\n active.daemonVersion === daemonVersion &&\n active.sourceDistFingerprint &&\n (!binaryRelease ||\n binaryRelease.sha256 === active.sourceDistFingerprint) &&\n (await pathExists(active.sourceEntryScriptPath)) &&\n (await hashDaemonBinaryFile(active.sourceEntryScriptPath)) ===\n active.sourceDistFingerprint\n ) {\n return active;\n }\n }\n if (binaryRelease) {\n return await prepareSelectedBinaryDaemonServiceBundle({\n daemonVersion,\n release: binaryRelease,\n });\n }\n if (daemonVersion !== resolveCliSelfVersion()) {\n throw new Error(\n `Cannot prepare OpenMeld Service ${daemonVersion} from CLI ${resolveCliSelfVersion()}. Acquire the selected Service release before preparing the update.`\n );\n }\n const outcome = await performManagedInstall();\n const managedBinaryPath = outcome.managedBinaryPath;\n if (!(await pathExists(managedBinaryPath))) {\n throw new Error(\n `OpenMeld managed binary is missing at ${managedBinaryPath}; cannot prepare binary OpenMeld Service.`\n );\n }\n const managedVersionDir = dirname(managedBinaryPath);\n const now = new Date().toISOString();\n\n await Promise.all([\n mkdir(daemonRuntimeRootPath(), { recursive: true }),\n mkdir(daemonRuntimeStateRootPath(), { recursive: true }),\n mkdir(daemonRuntimeServiceManagerPath(), { recursive: true }),\n ]);\n\n const nextState: DaemonActiveBundleState = {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: createBundleId(outcome.version),\n daemonVersion: outcome.version,\n entryScriptRelativePath: \"openmeld\",\n bundleFormat: \"binary_v1\",\n sourceEntryScriptPath: managedBinaryPath,\n sourcePackageRootPath: managedVersionDir,\n sourceDistRootPath: managedVersionDir,\n sourceDistFingerprint: await hashDaemonBinaryFile(managedBinaryPath),\n sourceKind: DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL,\n createdAt: now,\n updatedAt: now,\n };\n\n return nextState;\n}\n\nasync function prepareSelectedBinaryDaemonServiceBundle(input: {\n daemonVersion: string;\n release: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n if (input.release.version !== input.daemonVersion) {\n throw new Error(\n \"The selected Service artifact does not match the update target.\"\n );\n }\n const bundleId = createBundleId(input.daemonVersion);\n const bundleRootPath = resolveDaemonBundleRootPath(bundleId);\n const executablePath = join(bundleRootPath, \"openmeld\");\n const onDeltaFallback = (error: Error): void => {\n console.warn(\"[openmeld.service.artifact_delta_fallback]\", error.message);\n };\n const plan = await resolveCliBinaryUpdatePlan({\n baseBinaryPath: process.execPath,\n currentVersion: resolveCliSelfVersion(),\n onDeltaFallback,\n release: input.release,\n });\n const bytes = await downloadCliBinaryUpdateArtifact({\n downloadTimeoutMs: 60_000,\n fetchImpl: fetch,\n onDeltaFallback,\n plan,\n release: input.release,\n });\n await mkdir(bundleRootPath, { recursive: true });\n try {\n await writeFile(executablePath, bytes, { mode: 0o755 });\n await verifyCliBinaryCodeSignature({\n artifactPath: executablePath,\n release: input.release,\n runCommand: async (command, args) => {\n const result = await promisify(execFile)(command, args, {\n encoding: \"utf8\",\n });\n return { code: 0, stdout: result.stdout, stderr: result.stderr };\n },\n });\n } catch (error) {\n await rm(bundleRootPath, { recursive: true, force: true });\n throw error;\n }\n const now = new Date().toISOString();\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId,\n daemonVersion: input.daemonVersion,\n entryScriptRelativePath: \"openmeld\",\n bundleFormat: \"binary_v1\",\n sourceEntryScriptPath: executablePath,\n sourcePackageRootPath: bundleRootPath,\n sourceDistRootPath: bundleRootPath,\n sourceDistFingerprint: input.release.sha256.toLowerCase(),\n sourceKind: DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL,\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport async function activateDaemonServiceBundle(\n preparedBundle: DaemonActiveBundleState\n): Promise<void> {\n await mkdir(daemonRuntimeStateRootPath(), { recursive: true });\n await writeFile(\n daemonServiceActiveBundlePath(),\n `${JSON.stringify(preparedBundle, null, 2)}\\n`,\n { encoding: \"utf8\", mode: 0o600 }\n );\n if (preparedBundle.bundleFormat !== \"binary_v1\") {\n await ensureDaemonServiceManagerExecutables();\n }\n}\n\nexport async function discardPreparedDaemonServiceBundle(\n preparedBundle: DaemonActiveBundleState\n): Promise<void> {\n if (preparedBundle.bundleFormat === \"legacy_linked_v1\") {\n return;\n }\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleId === preparedBundle.bundleId) {\n return;\n }\n await rm(resolveDaemonBundleRootPath(preparedBundle.bundleId), {\n recursive: true,\n force: true,\n });\n}\n\nasync function hashDaemonBinaryFile(filePath: string): Promise<string> {\n const hash = createHash(\"sha256\");\n hash.update(await readFile(filePath));\n return hash.digest(\"hex\");\n}\n\nexport async function runAuditedServiceManagerCarrierMutation<T>(input: {\n distribution?: OpenMeldDistribution;\n operation: string;\n pathInput?: OpenMeldPathResolutionInput;\n run: () => Promise<T>;\n targetPath: string;\n}): Promise<T> {\n const pathInput = input.pathInput ?? {};\n const metadata = {\n distribution: input.distribution ?? resolveOpenMeldDistribution(),\n executable: process.execPath,\n operation: input.operation,\n preset: resolveOpenMeldEnvPreset(pathInput),\n targetPath: input.targetPath,\n targetCategory: classifyDiagnosticPath(input.targetPath),\n actorPid: process.pid,\n parentPid: process.ppid,\n };\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata,\n pathInput,\n result: \"attempted\",\n type: \"service_manager.registration_reconcile\",\n });\n try {\n const result = await input.run();\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata,\n pathInput,\n result: \"completed\",\n type: \"service_manager.registration_reconcile\",\n });\n return result;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata: {\n ...metadata,\n errorMessage: error instanceof Error ? error.message : String(error),\n operationFailure: collectLocalOperationFailure(error),\n },\n pathInput,\n result: \"failed\",\n type: \"service_manager.registration_reconcile\",\n });\n throw error;\n }\n}\n\nexport async function ensureDaemonServiceStableBinaryExecutable(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string> {\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleFormat !== \"binary_v1\") {\n throw new Error(\n \"OpenMeld cannot prepare the stable macOS Service executable without an active binary bundle.\"\n );\n }\n return await ensureVerifiedBinaryCarrier({\n bundle: activeBundle,\n operationName: \"stable_binary\",\n pathInput,\n targetPath: daemonServiceBinaryExecutablePath(pathInput),\n });\n}\n\nexport async function ensureDaemonServiceUpdateWorkerBinaryExecutable(\n preparedBundle: DaemonActiveBundleState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string> {\n if (preparedBundle.bundleFormat !== \"binary_v1\") {\n throw new Error(\n \"OpenMeld cannot prepare the update worker binary without a binary Service bundle.\"\n );\n }\n return await ensureVerifiedBinaryCarrier({\n bundle: preparedBundle,\n operationName: \"update_worker_binary\",\n pathInput,\n targetPath: daemonServiceUpdateWorkerBinaryPath(pathInput),\n });\n}\n\nexport async function clearDaemonServiceUpdateWorkerBinaryExecutable(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const targetPath = daemonServiceUpdateWorkerBinaryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: \"remove_update_worker_binary\",\n pathInput,\n targetPath,\n run: async () => await rm(targetPath, { force: true }),\n });\n}\n\nasync function ensureVerifiedBinaryCarrier(input: {\n bundle: DaemonActiveBundleState;\n operationName: \"stable_binary\" | \"update_worker_binary\";\n pathInput: OpenMeldPathResolutionInput;\n targetPath: string;\n}): Promise<string> {\n const sourcePath = input.bundle.sourceEntryScriptPath;\n const expectedFingerprint =\n input.bundle.sourceDistFingerprint ??\n (await hashDaemonBinaryFile(sourcePath));\n const stableExecutablePath = input.targetPath;\n const stableExecutableStat = await lstat(stableExecutablePath).catch(\n () => null\n );\n if (\n stableExecutableStat?.isFile() === true &&\n !stableExecutableStat.isSymbolicLink() &&\n (await hashDaemonBinaryFile(stableExecutablePath).catch(() => null)) ===\n expectedFingerprint\n ) {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `refresh_${input.operationName}_permissions`,\n pathInput: input.pathInput,\n targetPath: stableExecutablePath,\n run: async () => await chmod(stableExecutablePath, 0o700),\n });\n return stableExecutablePath;\n }\n\n await mkdir(dirname(stableExecutablePath), { recursive: true });\n const preparedPath = `${stableExecutablePath}.next-${String(process.pid)}`;\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `clear_prepared_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => await rm(preparedPath, { force: true }),\n });\n try {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `prepare_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => {\n await copyFile(sourcePath, preparedPath);\n await chmod(preparedPath, 0o700);\n },\n });\n const preparedFingerprint = await hashDaemonBinaryFile(preparedPath);\n if (preparedFingerprint !== expectedFingerprint) {\n throw new Error(\n \"OpenMeld could not verify the prepared Service carrier executable.\"\n );\n }\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `replace_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: stableExecutablePath,\n run: async () => await rename(preparedPath, stableExecutablePath),\n });\n return stableExecutablePath;\n } finally {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `clear_prepared_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => await rm(preparedPath, { force: true }),\n }).catch(() => undefined);\n }\n}\n\nexport async function verifyDaemonActiveBundleIntegrity(\n activeBundle: DaemonActiveBundleState\n): Promise<boolean> {\n const expectedFingerprint = activeBundle.sourceDistFingerprint?.trim();\n if (\n !expectedFingerprint ||\n activeBundle.bundleFormat === \"legacy_linked_v1\"\n ) {\n return false;\n }\n const entryPath = await resolveDaemonBundleEntryPathFromState(activeBundle);\n if (!entryPath) {\n return false;\n }\n return (\n (await resolveInstalledDaemonBundleFingerprint(activeBundle)) ===\n expectedFingerprint\n );\n}\n\nasync function writeDaemonBundlePackageManifest(input: {\n bundleRootPath: string;\n daemonVersion: string;\n}): Promise<void> {\n const packageManifestPath = join(input.bundleRootPath, \"package.json\");\n await writeFile(\n packageManifestPath,\n `${JSON.stringify(\n {\n name: \"openmeld-daemon-service-bundle\",\n private: true,\n type: \"module\",\n version: input.daemonVersion,\n },\n null,\n 2\n )}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o600,\n }\n );\n}\n\nasync function copyDaemonBundleRuntimeDependencies(input: {\n bundleRootPath: string;\n sourcePackageRootPath: string;\n}): Promise<void> {\n const runtimeDependencies = await collectDaemonBundleRuntimeDependencyClosure(\n {\n sourcePackageRootPath: input.sourcePackageRootPath,\n }\n );\n\n const targetNodeModulesPath = join(input.bundleRootPath, \"node_modules\");\n await rm(targetNodeModulesPath, {\n recursive: true,\n force: true,\n });\n await mkdir(targetNodeModulesPath, { recursive: true });\n for (const runtimeDependency of runtimeDependencies) {\n await copyDaemonBundleDependencyDirectory({\n dependencyName: runtimeDependency.dependencyName,\n sourceDependencyPath: runtimeDependency.packageRootPath,\n targetNodeModulesPath,\n });\n }\n}\n\nasync function copyDaemonBundleDependencyDirectory(input: {\n dependencyName: string;\n sourceDependencyPath: string;\n targetNodeModulesPath: string;\n}): Promise<void> {\n if (!(await pathExists(input.sourceDependencyPath))) {\n throw new Error(\n `OpenMeld could not copy runtime dependency ${input.dependencyName} for background service bundling from ${input.sourceDependencyPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n const targetDependencyPath = join(\n input.targetNodeModulesPath,\n ...input.dependencyName.split(\"/\")\n );\n await mkdir(dirname(targetDependencyPath), { recursive: true });\n await cp(input.sourceDependencyPath, targetDependencyPath, {\n recursive: true,\n force: true,\n dereference: true,\n preserveTimestamps: true,\n });\n}\n\nexport async function writeDaemonServiceLauncher(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(daemonRuntimeServiceManagerPath(pathInput), { recursive: true });\n const targetPath = daemonServiceLauncherPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"write_launcher\",\n pathInput,\n targetPath,\n run: async () =>\n await writeFile(\n targetPath,\n `${buildDaemonServiceLauncherSource(pathInput)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o700,\n }\n ),\n });\n}\n\nexport async function writeDaemonServiceExecutableWrapper(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(daemonRuntimeServiceManagerPath(pathInput), { recursive: true });\n await Promise.all(\n daemonServiceExecutableWrapperPaths(pathInput).map(async (wrapperPath) => {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"write_executable_wrapper\",\n pathInput,\n targetPath: wrapperPath,\n run: async () => {\n await writeFile(\n wrapperPath,\n `${buildDaemonServiceExecutableWrapperSource(pathInput)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o700,\n }\n );\n await chmod(wrapperPath, 0o700);\n },\n });\n })\n );\n}\n\nexport async function ensureDaemonServiceManagerExecutables(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeDaemonServiceLauncher(pathInput);\n await writeDaemonServiceExecutableWrapper(pathInput);\n}\n\nexport async function restoreDaemonActiveBundleStateSnapshot(\n snapshot: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (!snapshot) {\n await rm(daemonServiceActiveBundlePath(pathInput), { force: true });\n return;\n }\n await mkdir(daemonRuntimeStateRootPath(pathInput), { recursive: true });\n await writeFile(\n daemonServiceActiveBundlePath(pathInput),\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o600,\n }\n );\n}\n\nexport async function clearDaemonServiceBundles(): Promise<void> {\n await Promise.all([\n rm(daemonServiceActiveBundlePath(), { force: true }),\n runAuditedServiceManagerCarrierMutation({\n operation: \"remove_launcher\",\n targetPath: daemonServiceLauncherPath(),\n run: async () => await rm(daemonServiceLauncherPath(), { force: true }),\n }),\n runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: \"remove_stable_binary\",\n targetPath: daemonServiceBinaryExecutablePath(),\n run: async () =>\n await rm(daemonServiceBinaryExecutablePath(), { force: true }),\n }),\n clearDaemonServiceUpdateWorkerBinaryExecutable(),\n ...daemonServiceExecutableWrapperPaths().map((wrapperPath) =>\n runAuditedServiceManagerCarrierMutation({\n operation: \"remove_executable_wrapper\",\n targetPath: wrapperPath,\n run: async () => await rm(wrapperPath, { force: true }),\n })\n ),\n rm(daemonRuntimeBundlesPath(), { recursive: true, force: true }),\n ]);\n}\n\nexport async function cleanupInactiveDaemonServiceBundles(\n input: { retainBundleIds?: string[] } = {}\n): Promise<void> {\n const [\n active,\n serviceContract,\n runtimeLease,\n registeredWorkerBundleIds,\n pendingUpdate,\n ] = await Promise.all([\n readDaemonActiveBundleState(),\n readDaemonServiceContract().catch(() => null),\n readDaemonRuntimeLease().catch(() => null),\n readDaemonServiceUpdateWorkerProtectedBundleIds(),\n readPendingDaemonServiceUpdate(),\n ]);\n const retain = new Set([\n ...(active ? [active.bundleId] : []),\n ...(serviceContract?.bundleId ? [serviceContract.bundleId] : []),\n ...(runtimeLease?.bundleId ? [runtimeLease.bundleId] : []),\n ...registeredWorkerBundleIds,\n ...(pendingUpdate?.preparedBundle.bundleFormat === \"self_contained_v1\"\n ? [pendingUpdate.preparedBundle.bundleId]\n : []),\n ...(input.retainBundleIds ?? []),\n ]);\n const bundleEntries = await readDirectoryNames(daemonRuntimeBundlesPath());\n await Promise.all(\n bundleEntries\n .filter((bundleId) => !retain.has(bundleId))\n .map(async (bundleId) => {\n await rm(resolveDaemonBundleRootPath(bundleId), {\n recursive: true,\n force: true,\n });\n })\n );\n}\n\nasync function resolveDaemonBundleSourceProvenance(\n explicitPath?: string\n): Promise<{\n sourceEntryScriptPath: string;\n sourceDistRootPath: string;\n sourcePackageRootPath: string;\n sourceKind: DaemonBundleSourceKind;\n}> {\n const sourceEntryScriptPath = await resolveCliScriptPath(explicitPath);\n const sourceDistRootPath = dirname(sourceEntryScriptPath);\n const sourcePackageRootPath = dirname(sourceDistRootPath);\n return {\n sourceEntryScriptPath,\n sourceDistRootPath,\n sourcePackageRootPath,\n sourceKind: inferDaemonBundleSourceKind(sourcePackageRootPath),\n };\n}\n\nasync function resolveCliScriptPath(explicitPath?: string): Promise<string> {\n const rawPath = explicitPath ?? process.argv[1];\n if (!rawPath) {\n throw new Error(\n \"Cannot determine CLI script path for OpenMeld background service bundle.\"\n );\n }\n const resolvedPath = await realpath(rawPath).catch(async () => {\n const fallbackPath = await resolvePreferredCliScriptPath(rawPath);\n if (fallbackPath) {\n return fallbackPath;\n }\n throw new Error(\n `OpenMeld could not resolve a CLI dist entry for service bundling from ${rawPath}.`\n );\n });\n const preferredPath = await resolvePreferredCliScriptPath(resolvedPath);\n if (preferredPath) {\n return preferredPath;\n }\n throw new Error(\n `OpenMeld could not find a supported CLI dist entry for service bundling from ${resolvedPath}.`\n );\n}\n\nfunction createBundleId(version: string): string {\n const normalizedVersion = version.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n return `${normalizedVersion}-${Date.now()}`;\n}\n\nasync function computeDaemonSourceDistFingerprint(\n sourceDistRootPath: string\n): Promise<string> {\n const filePaths = await listDaemonSourceDistFiles(sourceDistRootPath);\n const hash = createHash(\"sha256\");\n for (const filePath of filePaths) {\n const relativePath = relative(sourceDistRootPath, filePath).replaceAll(\n \"\\\\\",\n \"/\"\n );\n hash.update(relativePath, \"utf8\");\n hash.update(\"\\0\", \"utf8\");\n hash.update(await readFile(filePath));\n hash.update(\"\\0\", \"utf8\");\n }\n return hash.digest(\"hex\");\n}\n\nasync function listDaemonSourceDistFiles(path: string): Promise<string[]> {\n return await listIncludedDaemonSourceDistFiles(path, path);\n}\n\nasync function listIncludedDaemonSourceDistFiles(\n sourceDistRootPath: string,\n currentPath: string\n): Promise<string[]> {\n const entries = await readdir(currentPath, { withFileTypes: true });\n const filePaths: string[] = [];\n\n for (const entry of entries) {\n const entryPath = join(currentPath, entry.name);\n if (!isDaemonSourceDistPathIncluded(sourceDistRootPath, entryPath)) {\n continue;\n }\n if (entry.isDirectory()) {\n filePaths.push(\n ...(await listIncludedDaemonSourceDistFiles(\n sourceDistRootPath,\n entryPath\n ))\n );\n continue;\n }\n if (entry.isFile()) {\n filePaths.push(entryPath);\n }\n }\n\n return filePaths.sort((left, right) => {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n });\n}\n\nfunction isDaemonSourceDistPathIncluded(\n sourceDistRootPath: string,\n candidatePath: string\n): boolean {\n const relativePath = relative(sourceDistRootPath, candidatePath).replaceAll(\n \"\\\\\",\n \"/\"\n );\n if (!relativePath || relativePath.startsWith(\"..\")) {\n return true;\n }\n const topLevelPathSegment = relativePath.split(\"/\")[0] ?? \"\";\n return !DAEMON_SOURCE_DIST_IGNORED_TOP_LEVEL_DIRS.has(topLevelPathSegment);\n}\n\nasync function collectDaemonBundleRuntimeDependencyClosure(input: {\n sourcePackageRootPath: string;\n}): Promise<Array<{ dependencyName: string; packageRootPath: string }>> {\n const packageManifestPath = join(input.sourcePackageRootPath, \"package.json\");\n const packageManifestRaw = await readFile(packageManifestPath, \"utf8\").catch(\n (error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n throw new Error(\n `OpenMeld could not find the CLI package manifest for background service bundling at ${packageManifestPath}.`\n );\n }\n throw error;\n }\n );\n const packageManifest = JSON.parse(packageManifestRaw) as {\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n };\n const resolvedDependencies = new Map<string, string>();\n const queue = [\n ...Object.keys(packageManifest.dependencies ?? {}).map(\n (dependencyName) => ({\n dependencyName,\n required: true,\n resolverPackageRootPath: input.sourcePackageRootPath,\n })\n ),\n ...Object.keys(packageManifest.optionalDependencies ?? {}).map(\n (dependencyName) => ({\n dependencyName,\n required: false,\n resolverPackageRootPath: input.sourcePackageRootPath,\n })\n ),\n ];\n\n while (queue.length > 0) {\n const nextDependency = queue.shift();\n if (!nextDependency) {\n continue;\n }\n if (isTypeOnlyDependencyName(nextDependency.dependencyName)) {\n continue;\n }\n if (resolvedDependencies.has(nextDependency.dependencyName)) {\n continue;\n }\n const dependencyManifest = await readDaemonBundleDependencyManifest({\n dependencyName: nextDependency.dependencyName,\n required: nextDependency.required,\n resolverPackageRootPath: nextDependency.resolverPackageRootPath,\n });\n if (!dependencyManifest) {\n continue;\n }\n\n resolvedDependencies.set(\n nextDependency.dependencyName,\n dependencyManifest.packageRootPath\n );\n const nestedRequiredDependencies = Object.keys(\n dependencyManifest.dependencies ?? {}\n );\n const nestedOptionalDependencies = Object.keys(\n dependencyManifest.optionalDependencies ?? {}\n );\n const nestedPeerDependencies = Object.keys(\n dependencyManifest.peerDependencies ?? {}\n );\n for (const dependencyName of nestedRequiredDependencies) {\n queue.push({\n dependencyName,\n required: true,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n for (const dependencyName of nestedOptionalDependencies) {\n queue.push({\n dependencyName,\n required: false,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n for (const dependencyName of nestedPeerDependencies) {\n queue.push({\n dependencyName,\n required: false,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n }\n\n return [...resolvedDependencies.entries()]\n .map(([dependencyName, packageRootPath]) => ({\n dependencyName,\n packageRootPath,\n }))\n .sort((left, right) =>\n left.dependencyName.localeCompare(right.dependencyName)\n );\n}\n\nfunction isTypeOnlyDependencyName(dependencyName: string): boolean {\n return dependencyName.startsWith(\"@types/\");\n}\n\nasync function readDaemonBundleDependencyManifest(input: {\n dependencyName: string;\n required: boolean;\n resolverPackageRootPath: string;\n}): Promise<{\n packageRootPath: string;\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n} | null> {\n const dependencyPackageRootPath = await resolveDaemonDependencyPackageRoot({\n dependencyName: input.dependencyName,\n resolverPackageRootPath: input.resolverPackageRootPath,\n required: input.required,\n });\n if (!dependencyPackageRootPath) {\n return null;\n }\n const dependencyManifestPath = join(\n dependencyPackageRootPath,\n \"package.json\"\n );\n const dependencyManifestRaw = await readFile(\n dependencyManifestPath,\n \"utf8\"\n ).catch((error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n if (!input.required) {\n return null;\n }\n throw new Error(\n `OpenMeld could not find runtime dependency ${input.dependencyName} for background service bundling at ${dependencyManifestPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n throw error;\n });\n if (dependencyManifestRaw === null) {\n return null;\n }\n const dependencyManifest = JSON.parse(dependencyManifestRaw) as {\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n return {\n packageRootPath: dependencyPackageRootPath,\n ...dependencyManifest,\n };\n}\n\nasync function resolveDaemonDependencyPackageRoot(input: {\n dependencyName: string;\n resolverPackageRootPath: string;\n required: boolean;\n}): Promise<string | null> {\n const resolver = createRequire(\n join(input.resolverPackageRootPath, \"package.json\")\n );\n const dependencyPackageRootPath =\n await resolveDaemonDependencyPackageRootFromManifest({\n dependencyName: input.dependencyName,\n resolver,\n });\n if (dependencyPackageRootPath) {\n return dependencyPackageRootPath;\n }\n try {\n const dependencyEntryPath = await realpath(\n resolver.resolve(input.dependencyName)\n );\n return await findDaemonDependencyPackageRoot(dependencyEntryPath);\n } catch (error) {\n if (isPackageEntryResolutionError(error)) {\n const dependencyPackageRootPath =\n await findDaemonDependencyPackageRootFromResolutionPaths({\n dependencyName: input.dependencyName,\n resolver,\n });\n if (dependencyPackageRootPath) {\n return dependencyPackageRootPath;\n }\n if (!input.required) {\n return null;\n }\n throw new Error(\n `OpenMeld could not find runtime dependency ${input.dependencyName} for background service bundling from ${input.resolverPackageRootPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n throw error;\n }\n}\n\nasync function resolveDaemonDependencyPackageRootFromManifest(input: {\n dependencyName: string;\n resolver: NodeJS.Require;\n}): Promise<string | null> {\n try {\n const dependencyManifestPath = await realpath(\n input.resolver.resolve(`${input.dependencyName}/package.json`)\n );\n return await findDaemonDependencyPackageRootFromManifestPath({\n dependencyManifestPath,\n dependencyName: input.dependencyName,\n });\n } catch (error) {\n if (isPackageEntryResolutionError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function findDaemonDependencyPackageRootFromManifestPath(input: {\n dependencyManifestPath: string;\n dependencyName: string;\n}): Promise<string | null> {\n let currentPath = dirname(input.dependencyManifestPath);\n while (true) {\n const packageManifestPath = join(currentPath, \"package.json\");\n const packageManifestRaw = await readFile(\n packageManifestPath,\n \"utf8\"\n ).catch((error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (packageManifestRaw !== null) {\n const packageManifest = JSON.parse(packageManifestRaw) as {\n name?: unknown;\n };\n if (packageManifest.name === input.dependencyName) {\n return currentPath;\n }\n }\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n return null;\n }\n currentPath = parentPath;\n }\n}\n\nasync function findDaemonDependencyPackageRootFromResolutionPaths(input: {\n dependencyName: string;\n resolver: NodeJS.Require;\n}): Promise<string | null> {\n const resolutionPaths = input.resolver.resolve.paths(input.dependencyName);\n if (!resolutionPaths) {\n return null;\n }\n for (const nodeModulesPath of resolutionPaths) {\n const candidatePackageRootPath = join(\n nodeModulesPath,\n ...input.dependencyName.split(\"/\")\n );\n if (await pathExists(join(candidatePackageRootPath, \"package.json\"))) {\n return await realpath(candidatePackageRootPath);\n }\n }\n return null;\n}\n\nasync function findDaemonDependencyPackageRoot(\n resolvedEntryPath: string\n): Promise<string> {\n let currentPath = dirname(resolvedEntryPath);\n while (true) {\n const packageManifestPath = join(currentPath, \"package.json\");\n if (await pathExists(packageManifestPath)) {\n return currentPath;\n }\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n break;\n }\n currentPath = parentPath;\n }\n throw new Error(\n `OpenMeld could not determine the package root for background service dependency entry ${resolvedEntryPath}.`\n );\n}\n\nfunction buildDaemonServiceLauncherSource(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const activeBundleStatePath = JSON.stringify(\n daemonServiceActiveBundlePath(pathInput)\n );\n const installStatePath = JSON.stringify(daemonStatePath(pathInput));\n const bundleRootPath = JSON.stringify(daemonRuntimeBundlesPath(pathInput));\n const allowWorkspaceBundleSource = JSON.stringify(\n resolveOpenMeldEnvPreset(pathInput) === \"dev-local\"\n );\n return `import { access, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { spawn } from \"node:child_process\";\n\nconst ACTIVE_BUNDLE_PATH = ${activeBundleStatePath};\nconst INSTALL_STATE_PATH = ${installStatePath};\nconst BUNDLE_ROOT_PATH = ${bundleRootPath};\nconst ALLOW_WORKSPACE_BUNDLE_SOURCE = ${allowWorkspaceBundleSource};\n\nconst ACTIVE_BUNDLE_SCHEMA = \"openmeld-daemon-active-bundle-v2\";\nconst ACTIVE_BUNDLE_LEGACY_SCHEMA = \"openmeld-daemon-active-bundle-v1\";\nconst INSTALL_STATE_SCHEMA = \"openmeld-daemon-install-v1\";\n\nasync function readJsonFile(path) {\n try {\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function pathExists(path) {\n try {\n await access(path);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction normalizeInstallState(parsed) {\n if (!parsed || parsed.schema !== INSTALL_STATE_SCHEMA || typeof parsed.daemonVersion !== \"string\" || parsed.daemonVersion.length === 0) {\n return null;\n }\n return {\n daemonVersion: parsed.daemonVersion,\n };\n}\n\nfunction normalizeBundleState(parsed) {\n if (\n parsed &&\n parsed.v === 2 &&\n parsed.schema === ACTIVE_BUNDLE_SCHEMA &&\n typeof parsed.bundleId === \"string\" &&\n parsed.bundleId.length > 0 &&\n typeof parsed.daemonVersion === \"string\" &&\n parsed.daemonVersion.length > 0 &&\n typeof parsed.entryScriptRelativePath === \"string\" &&\n parsed.entryScriptRelativePath.length > 0 &&\n (parsed.bundleFormat === \"self_contained_v1\" || parsed.bundleFormat === \"legacy_linked_v1\")\n ) {\n return parsed;\n }\n if (\n parsed &&\n parsed.v === 1 &&\n parsed.schema === ACTIVE_BUNDLE_LEGACY_SCHEMA &&\n typeof parsed.bundleId === \"string\" &&\n parsed.bundleId.length > 0 &&\n typeof parsed.daemonVersion === \"string\" &&\n parsed.daemonVersion.length > 0 &&\n typeof parsed.entryScriptRelativePath === \"string\" &&\n parsed.entryScriptRelativePath.length > 0\n ) {\n return {\n ...parsed,\n bundleFormat: \"legacy_linked_v1\",\n };\n }\n return null;\n}\n\nfunction normalizeBundlePackageManifest(parsed) {\n if (!parsed || typeof parsed.version !== \"string\" || parsed.version.length === 0) {\n return null;\n }\n return {\n version: parsed.version,\n };\n}\n\nfunction uniqueNonEmptyStrings(values) {\n return [...new Set(values.filter((value) => typeof value === \"string\" && value.length > 0))];\n}\n\nasync function findFallbackSelfContainedBundle(input) {\n const directories = await readdir(BUNDLE_ROOT_PATH, { withFileTypes: true }).catch((error) => {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n });\n const entryScriptRelativePaths = uniqueNonEmptyStrings([\n input.preferredEntryScriptRelativePath,\n \"dist/openmeld.js\",\n \"dist/openmeld-dev.js\",\n ]);\n const candidates = [];\n for (const directory of directories) {\n if (!directory.isDirectory()) {\n continue;\n }\n const bundleId = directory.name;\n const bundlePath = join(BUNDLE_ROOT_PATH, bundleId);\n const manifest = normalizeBundlePackageManifest(\n await readJsonFile(join(bundlePath, \"package.json\"))\n );\n if (manifest?.version !== input.installState.daemonVersion) {\n continue;\n }\n for (const entryScriptRelativePath of entryScriptRelativePaths) {\n const entryPath = join(bundlePath, entryScriptRelativePath);\n if (!(await pathExists(entryPath))) {\n continue;\n }\n const entryStat = await stat(entryPath).catch(() => null);\n candidates.push({\n bundleId,\n entryPath,\n entryScriptRelativePath,\n mtimeMs: entryStat?.mtimeMs ?? 0,\n });\n break;\n }\n }\n candidates.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) {\n return b.mtimeMs - a.mtimeMs;\n }\n return b.bundleId.localeCompare(a.bundleId);\n });\n return candidates[0] ?? null;\n}\n\nasync function persistFallbackActiveBundleState(input) {\n const now = new Date().toISOString();\n const bundleRootPath = join(BUNDLE_ROOT_PATH, input.bundleId);\n const nextState = {\n v: 2,\n schema: ACTIVE_BUNDLE_SCHEMA,\n bundleId: input.bundleId,\n daemonVersion: input.installState.daemonVersion,\n entryScriptRelativePath: input.entryScriptRelativePath,\n bundleFormat: \"self_contained_v1\",\n sourceEntryScriptPath: input.entryPath,\n sourcePackageRootPath: bundleRootPath,\n sourceDistRootPath: join(bundleRootPath, \"dist\"),\n sourceDistFingerprint: null,\n sourceKind: \"package_install\",\n createdAt: input.previousBundleState?.createdAt ?? now,\n updatedAt: now,\n };\n await writeFile(ACTIVE_BUNDLE_PATH, \\`\\${JSON.stringify(nextState, null, 2)}\\\\n\\`, {\n encoding: \"utf8\",\n mode: 0o600,\n }).catch((error) => {\n console.error(\\`OpenMeld Service launcher recovered a matching bundle but could not update active bundle state: \\${String(error)}\\`);\n });\n}\n\nasync function resolveEntryPath() {\n const installState = normalizeInstallState(await readJsonFile(INSTALL_STATE_PATH));\n const bundleState = normalizeBundleState(await readJsonFile(ACTIVE_BUNDLE_PATH));\n if (!installState) {\n throw new Error(\"OpenMeld Service launcher could not read a valid install state.\");\n }\n if (!bundleState) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: null,\n });\n if (!fallback) {\n throw new Error(\"OpenMeld Service launcher could not read a valid active bundle state.\");\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: null,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state was missing or invalid.\\`);\n return fallback.entryPath;\n }\n if (bundleState.bundleFormat !== \"self_contained_v1\") {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher refused to start legacy bundle format \\${String(bundleState.bundleFormat)}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state used legacy bundle format \\${String(bundleState.bundleFormat)}.\\`);\n return fallback.entryPath;\n }\n if (bundleState.sourceKind === \"workspace\" && !ALLOW_WORKSPACE_BUNDLE_SOURCE) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\"OpenMeld Service launcher refused to start repo-local workspace service files in this lane. Repo-local service files are only allowed through \\`openmeld-dev\\`.\");\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state pointed at a repo-local workspace bundle in this lane.\\`);\n return fallback.entryPath;\n }\n if (bundleState.daemonVersion !== installState.daemonVersion) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher detected bundle version drift: bundle v\\${String(bundleState.daemonVersion)} != install v\\${String(installState.daemonVersion)}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state had version drift.\\`);\n return fallback.entryPath;\n }\n const entryPath = join(BUNDLE_ROOT_PATH, bundleState.bundleId, bundleState.entryScriptRelativePath);\n if (await pathExists(entryPath)) {\n return entryPath;\n }\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher could not find active bundle entry \\${entryPath}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle entry was missing.\\`);\n return fallback.entryPath;\n}\n\nasync function main() {\n const entryPath = await resolveEntryPath();\n const child = spawn(process.execPath, [entryPath, ...process.argv.slice(2)], {\n stdio: \"inherit\",\n env: process.env,\n windowsHide: true,\n });\n\n const forwardSignal = (signal) => {\n if (!child.killed) {\n child.kill(signal);\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"]) {\n process.on(signal, () => {\n forwardSignal(signal);\n });\n }\n\n child.once(\"error\", (error) => {\n console.error(String(error));\n process.exitCode = 1;\n });\n\n child.once(\"close\", (code, signal) => {\n if (typeof code === \"number\") {\n process.exitCode = code;\n return;\n }\n if (signal) {\n process.kill(process.pid, signal);\n return;\n }\n process.exitCode = 1;\n });\n}\n\nawait main();`;\n}\n\nfunction buildDaemonServiceExecutableWrapperSource(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return [\n \"#!/bin/sh\",\n `exec ${quoteShellSingle(process.execPath)} ${quoteShellSingle(\n daemonServiceLauncherPath(pathInput)\n )} \"$@\"`,\n ].join(\"\\n\");\n}\n\nfunction quoteShellSingle(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\"'\\\"'\")}'`;\n}\n\nasync function readDirectoryNames(path: string): Promise<string[]> {\n const entries = await readdir(path, { withFileTypes: true }).catch(\n (error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n );\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n}\n\nfunction inferDaemonBundleSourceKind(\n sourcePackageRootPath: string\n): DaemonBundleSourceKind {\n const normalized = sourcePackageRootPath.replaceAll(\"\\\\\", \"/\").toLowerCase();\n if (normalized.includes(\"/.npm/\") && normalized.includes(\"_npx\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE;\n }\n if (normalized.includes(\"/node_modules/\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL;\n }\n if (normalized.includes(\"/openmeld/\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE;\n }\n return DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN;\n}\n\nfunction isDaemonBundleFormat(value: unknown): value is DaemonBundleFormat {\n return (\n value === \"legacy_linked_v1\" ||\n value === \"self_contained_v1\" ||\n value === \"binary_v1\"\n );\n}\n\nfunction isDaemonBundleSourceKind(\n value: unknown\n): value is DaemonBundleSourceKind {\n return (\n value === DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE ||\n value === DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL ||\n value === DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE ||\n value === DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN\n );\n}\n\nfunction isPackageEntryResolutionError(error: unknown): boolean {\n const code = getErrorCode(error);\n return (\n code === \"MODULE_NOT_FOUND\" || code === \"ERR_PACKAGE_PATH_NOT_EXPORTED\"\n );\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function resolvePreferredCliScriptPath(\n rawPath: string\n): Promise<string | null> {\n const preferredScriptNames = buildPreferredCliScriptNames(rawPath);\n const candidateRoots = [\n dirname(rawPath),\n join(process.cwd(), \"dist\"),\n join(process.cwd(), \"clients\", \"openmeld-cli\", \"dist\"),\n dirname(fileURLToPath(import.meta.url)),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"dist\"),\n ];\n for (const scriptName of preferredScriptNames) {\n for (const candidateRoot of candidateRoots) {\n const candidatePath = join(candidateRoot, scriptName);\n if (await pathExists(candidatePath)) {\n return candidatePath;\n }\n }\n }\n return null;\n}\n\nfunction buildPreferredCliScriptNames(rawPath: string): string[] {\n const requestedScriptName = basename(rawPath).endsWith(\".js\")\n ? basename(rawPath)\n : `${basename(rawPath)}.js`;\n if (isSupportedDaemonCliEntryName(requestedScriptName)) {\n return [requestedScriptName];\n }\n if (String(process.env.OPENMELD_DEV_MODE ?? \"\").trim() === \"1\") {\n return [...DAEMON_CLI_ENTRY_NAMES];\n }\n return [...DAEMON_CLI_ENTRY_NAMES].reverse();\n}\n\nfunction isSupportedDaemonCliEntryName(\n value: string\n): value is (typeof DAEMON_CLI_ENTRY_NAMES)[number] {\n return DAEMON_CLI_ENTRY_NAMES.includes(\n value as (typeof DAEMON_CLI_ENTRY_NAMES)[number]\n );\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n","import {\n type OpenMeldPathResolutionInput,\n openMeldManagedBinaryPath,\n openMeldVersionsDir,\n} from \"../../config/paths\";\n\nconst MANAGED_BINARY_NAME = \"openmeld\";\nconst PATH_BOUNDARY_PATTERN = /[\\s\"'<>]/u;\nconst TRAILING_SLASHES_PATTERN = /\\/+$/u;\nconst VERSION_SEGMENT_BOUNDARY_PATTERN = /[\\s\"'<>/]/u;\n\nexport function isOpenMeldManagedBinaryPath(\n value: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n const normalizedPath = normalizeManagedBinaryPathText(value);\n if (\n normalizedPath ===\n normalizeManagedBinaryPathText(openMeldManagedBinaryPath(pathInput))\n ) {\n return true;\n }\n return isManagedVersionBinaryPath(normalizedPath, pathInput);\n}\n\nexport function containsOpenMeldManagedBinaryPath(\n value: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n const normalizedValue = normalizeManagedBinaryPathText(value);\n return (\n containsExactManagedPath(\n normalizedValue,\n normalizeManagedBinaryPathText(openMeldManagedBinaryPath(pathInput))\n ) || containsManagedVersionBinaryPath(normalizedValue, pathInput)\n );\n}\n\nexport function resolveOpenMeldManagedVersionBinaryRootPath(\n value: string\n): string | null {\n const normalizedPath = normalizeManagedBinaryPathText(value);\n const segments = normalizedPath.split(\"/\");\n const binaryName = segments.pop();\n const versionSegment = segments.pop();\n const versionsDirectory = segments.pop();\n if (\n binaryName !== MANAGED_BINARY_NAME ||\n versionsDirectory !== \"versions\" ||\n !versionSegment ||\n !isValidManagedVersionSegment(versionSegment)\n ) {\n return null;\n }\n const rootPath = segments.join(\"/\");\n if (rootPath.length > 0) {\n return rootPath;\n }\n return normalizedPath.startsWith(\"/\") ? \"/\" : null;\n}\n\nfunction isManagedVersionBinaryPath(\n normalizedPath: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const versionsRoot = normalizeVersionsRoot(pathInput);\n if (!normalizedPath.startsWith(versionsRoot)) {\n return false;\n }\n const relative = normalizedPath.slice(versionsRoot.length);\n const segments = relative.split(\"/\");\n const versionSegment = segments[0] ?? \"\";\n const binaryName = segments[1] ?? \"\";\n return (\n segments.length === 2 &&\n versionSegment.length > 0 &&\n binaryName === MANAGED_BINARY_NAME\n );\n}\n\nfunction containsManagedVersionBinaryPath(\n normalizedValue: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const versionsRoot = normalizeVersionsRoot(pathInput);\n let index = normalizedValue.indexOf(versionsRoot);\n while (index >= 0) {\n const before = index > 0 ? (normalizedValue[index - 1] ?? \"\") : \"\";\n const afterRoot = normalizedValue.slice(index + versionsRoot.length);\n const versionSeparatorIndex = afterRoot.indexOf(\"/\");\n if (\n isPathBoundary(before) &&\n versionSeparatorIndex > 0 &&\n isValidManagedVersionSegment(afterRoot.slice(0, versionSeparatorIndex))\n ) {\n const afterVersion = afterRoot.slice(versionSeparatorIndex + 1);\n if (afterVersion.startsWith(MANAGED_BINARY_NAME)) {\n const afterBinary = afterVersion[MANAGED_BINARY_NAME.length] ?? \"\";\n if (isPathBoundary(afterBinary)) {\n return true;\n }\n }\n }\n index = normalizedValue.indexOf(versionsRoot, index + 1);\n }\n return false;\n}\n\nfunction containsExactManagedPath(\n normalizedValue: string,\n normalizedPath: string\n): boolean {\n let index = normalizedValue.indexOf(normalizedPath);\n while (index >= 0) {\n const before = index > 0 ? (normalizedValue[index - 1] ?? \"\") : \"\";\n const after = normalizedValue[index + normalizedPath.length] ?? \"\";\n if (isPathBoundary(before) && isPathBoundary(after)) {\n return true;\n }\n index = normalizedValue.indexOf(normalizedPath, index + 1);\n }\n return false;\n}\n\nfunction normalizeVersionsRoot(pathInput: OpenMeldPathResolutionInput): string {\n return `${normalizeManagedBinaryPathText(\n openMeldVersionsDir(pathInput)\n ).replace(TRAILING_SLASHES_PATTERN, \"\")}/`;\n}\n\nfunction normalizeManagedBinaryPathText(value: string): string {\n return value.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nfunction isPathBoundary(value: string): boolean {\n return value === \"\" || PATH_BOUNDARY_PATTERN.test(value);\n}\n\nfunction isValidManagedVersionSegment(value: string): boolean {\n return value.length > 0 && !VERSION_SEGMENT_BOUNDARY_PATTERN.test(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport { containsOpenMeldManagedBinaryPath } from \"./daemon-managed-binary-path\";\nimport {\n daemonServiceBinaryExecutablePath,\n daemonServiceExecutableWrapperPath,\n daemonServiceLauncherPath,\n daemonServiceLegacyWrapperPath,\n} from \"./daemon-service-bundle\";\nimport {\n type DaemonServiceCommandSpec,\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nexport async function assertDaemonMaintenanceInstallationOwnership(): Promise<void> {\n const manager = await resolveDaemonServiceManager();\n if (!manager) {\n throw new Error(\n \"OpenMeld cannot verify the background service installation.\"\n );\n }\n const status = await manager.status();\n // A missing registration can be restored from this installation's saved job.\n if (!status.installed) {\n return;\n }\n if (\n !(await matchesExpectedDaemonServiceManagerDefinition({\n controller: manager.controller,\n definitionPath: status.definitionPath ?? null,\n commandSpec: status.commandSpec,\n }))\n ) {\n throw new Error(\n \"OpenMeld background service belongs to a different installation. Automatic maintenance was stopped without changing it.\"\n );\n }\n}\n\nexport function matchesExpectedDaemonServiceManagerCommand(input: {\n controller: DaemonServiceManager[\"controller\"] | null;\n commandSummary: string;\n commandSpec?: DaemonServiceCommandSpec;\n definitionPath: string | null;\n distribution?: OpenMeldDistribution;\n includeLegacyExecutableWrappers?: boolean;\n pathInput?: OpenMeldPathResolutionInput;\n}): boolean {\n if (input.controller === \"windows-service\") {\n if (input.commandSpec) {\n return matchesWindowsTaskInstallation(input.commandSpec, input.pathInput);\n }\n return (\n typeof input.definitionPath === \"string\" &&\n input.definitionPath.length > 0 &&\n input.commandSummary.includes(input.definitionPath)\n );\n }\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(\n input.pathInput\n );\n return [\n `${stableExecutablePath} service run`,\n `\"${stableExecutablePath}\" service run`,\n `'${stableExecutablePath}' service run`,\n ].some((expectedPrefix) => input.commandSummary.includes(expectedPrefix));\n }\n return containsOpenMeldManagedBinaryPath(\n input.commandSummary,\n input.pathInput\n );\n }\n return resolveExpectedDaemonServiceManagerCommandPaths({\n controller: input.controller,\n includeLegacyExecutableWrappers:\n input.includeLegacyExecutableWrappers === true,\n pathInput: input.pathInput,\n }).some((path) => input.commandSummary.includes(path));\n}\n\nexport async function matchesExpectedDaemonServiceManagerDefinition(input: {\n controller?: DaemonServiceManager[\"controller\"] | null;\n definitionPath: string | null;\n commandSpec?: DaemonServiceCommandSpec;\n distribution?: OpenMeldDistribution;\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<boolean> {\n if (input.controller === \"windows-service\" && input.commandSpec) {\n return matchesWindowsTaskInstallation(input.commandSpec, input.pathInput);\n }\n if (\n typeof input.definitionPath !== \"string\" ||\n input.definitionPath.trim().length === 0\n ) {\n return false;\n }\n\n const definition = await readFile(input.definitionPath, \"utf8\").catch(\n () => null\n );\n if (definition === null) {\n return false;\n }\n\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(\n input.pathInput\n );\n return definition.includes(`<string>${stableExecutablePath}</string>`);\n }\n return containsOpenMeldManagedBinaryPath(definition, input.pathInput);\n }\n\n return resolveExpectedDaemonServiceManagerCommandPaths({\n controller: input.controller ?? null,\n pathInput: input.pathInput,\n }).some((path) => definition.includes(path));\n}\n\nfunction matchesWindowsTaskInstallation(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n return (\n spec.args[0] === daemonServiceLauncherPath(pathInput) &&\n spec.args[1] === \"service\" &&\n spec.args[2] === \"run\" &&\n resolveOpenMeldRootDir({ env: spec.env }) ===\n resolveOpenMeldRootDir(pathInput)\n );\n}\n\nfunction resolveExpectedDaemonServiceManagerCommandPaths(input: {\n controller: DaemonServiceManager[\"controller\"] | null;\n includeLegacyExecutableWrappers?: boolean;\n pathInput?: OpenMeldPathResolutionInput;\n}): string[] {\n if (input.controller === \"launchd\") {\n return [\n daemonServiceExecutableWrapperPath(input.pathInput),\n ...(input.includeLegacyExecutableWrappers === true\n ? [daemonServiceLegacyWrapperPath(input.pathInput)]\n : []),\n ];\n }\n return [daemonServiceLauncherPath(input.pathInput)];\n}\n","import { basename } from \"node:path\";\nimport {\n daemonRuntimeBundlesPath,\n daemonServiceRecognizedExecutablePaths,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { isOpenMeldManagedBinaryPath } from \"./daemon-managed-binary-path\";\n\nconst COMMAND_TOKEN_PATTERN = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\nconst COMMAND_ARGUMENT_BOUNDARY_PATTERN = /\\s/u;\n\nexport type DaemonServiceProcessMode = \"foreground\" | \"background\" | null;\n\nexport type DaemonServiceProcessCommand = {\n action: \"run\" | \"start\";\n mode: DaemonServiceProcessMode;\n};\n\nexport function tokenizeDaemonCommand(command: string): string[] {\n const tokens: string[] = [];\n for (const match of command.matchAll(COMMAND_TOKEN_PATTERN)) {\n const token = match[1] ?? match[2] ?? match[3];\n if (token) {\n tokens.push(token);\n }\n }\n return tokens;\n}\n\nexport function normalizeDaemonCommandPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nexport function daemonCommandContainsExactPath(\n command: string,\n path: string\n): boolean {\n const normalizedCommand = normalizeDaemonCommandPath(command);\n const normalizedPath = normalizeDaemonCommandPath(path);\n let pathIndex = normalizedCommand.indexOf(normalizedPath);\n\n while (pathIndex >= 0) {\n const beforePath = normalizedCommand[pathIndex - 1];\n const afterPath = normalizedCommand[pathIndex + normalizedPath.length];\n if (\n isCommandArgumentBoundary(beforePath) &&\n isCommandArgumentBoundary(afterPath)\n ) {\n return true;\n }\n pathIndex = normalizedCommand.indexOf(\n normalizedPath,\n pathIndex + normalizedPath.length\n );\n }\n\n return false;\n}\n\nexport function extractDaemonCommandEntryPath(\n command: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string | null {\n const unquotedWrapperPath = extractUnquotedDaemonWrapperPath(\n command,\n pathInput\n );\n if (unquotedWrapperPath) {\n return unquotedWrapperPath;\n }\n\n const tokens = tokenizeDaemonCommand(command);\n if (tokens.length === 0) {\n return null;\n }\n const serviceRunIndex = findDaemonServiceCommandIndex(tokens);\n const candidateTokens =\n serviceRunIndex > 0 ? tokens.slice(0, serviceRunIndex) : tokens;\n\n for (let index = candidateTokens.length - 1; index >= 0; index -= 1) {\n const token = candidateTokens[index];\n if (!(token && looksLikeDaemonEntryPath(token, pathInput))) {\n continue;\n }\n return token;\n }\n\n return null;\n}\n\nexport function isDaemonRuntimeProcessCommand(command: string): boolean {\n const serviceCommand = parseDaemonServiceProcessCommand(command);\n return (\n serviceCommand?.action === \"run\" ||\n (serviceCommand?.action === \"start\" && serviceCommand.mode === \"foreground\")\n );\n}\n\nexport function parseDaemonServiceProcessCommand(\n command: string\n): DaemonServiceProcessCommand | null {\n const tokens = tokenizeDaemonCommand(command).map((token) =>\n token.toLowerCase()\n );\n const serviceCommandIndex = findDaemonServiceCommandIndex(tokens);\n if (serviceCommandIndex < 0) {\n return null;\n }\n\n const action = tokens[serviceCommandIndex + 1];\n if (action !== \"run\" && action !== \"start\") {\n return null;\n }\n\n return {\n action,\n mode: resolveDaemonServiceProcessMode(\n tokens.slice(serviceCommandIndex + 2)\n ),\n };\n}\n\nexport function resolveDaemonBundleIdFromEntryPath(\n entryPath: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string | null {\n const normalizedEntryPath = normalizeDaemonCommandPath(entryPath);\n const normalizedBundleRoot = `${normalizeDaemonCommandPath(\n daemonRuntimeBundlesPath(pathInput)\n )}/`;\n if (!normalizedEntryPath.startsWith(normalizedBundleRoot)) {\n return null;\n }\n const relative = normalizedEntryPath.slice(normalizedBundleRoot.length);\n const bundleId = relative.split(\"/\")[0];\n return bundleId && bundleId.length > 0 ? bundleId : null;\n}\n\nfunction looksLikeDaemonEntryPath(\n token: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n return (\n token.includes(\"/bundles/\") ||\n token.includes(\"openmeld/dist/openmeld.js\") ||\n token.endsWith(\"/openmeld.js\") ||\n token.endsWith(\"/openmeld-dev.js\") ||\n token.endsWith(\"/daemon-service-launcher.mjs\") ||\n isRecognizedDaemonServiceExecutableWrapperPath(token, pathInput) ||\n isOpenMeldManagedBinaryPath(token, pathInput)\n );\n}\n\nfunction findDaemonServiceCommandIndex(tokens: readonly string[]): number {\n return tokens.findIndex(\n (token, index) =>\n token === \"service\" &&\n (tokens[index + 1] === \"run\" || tokens[index + 1] === \"start\")\n );\n}\n\nfunction resolveDaemonServiceProcessMode(\n serviceArguments: readonly string[]\n): DaemonServiceProcessMode {\n let mode: DaemonServiceProcessMode = null;\n for (let index = 0; index < serviceArguments.length; index += 1) {\n const argument = serviceArguments[index];\n let modeValue: string | undefined;\n if (argument === \"--mode\") {\n modeValue = serviceArguments[index + 1];\n } else if (argument?.startsWith(\"--mode=\")) {\n modeValue = argument.slice(\"--mode=\".length);\n }\n if (modeValue === \"foreground\" || modeValue === \"background\") {\n mode = modeValue;\n }\n }\n return mode;\n}\n\nfunction isRecognizedDaemonServiceExecutableWrapperPath(\n token: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const normalizedToken = normalizeDaemonCommandPath(token);\n return daemonServiceRecognizedExecutablePaths(pathInput).some(\n (wrapperPath) => {\n const normalizedWrapperPath = normalizeDaemonCommandPath(wrapperPath);\n return (\n normalizedToken === normalizedWrapperPath ||\n normalizedToken.endsWith(\n `/${normalizeDaemonCommandPath(basename(wrapperPath))}`\n )\n );\n }\n );\n}\n\nfunction extractUnquotedDaemonWrapperPath(\n command: string,\n pathInput: OpenMeldPathResolutionInput\n): string | null {\n const normalizedCommand = normalizeDaemonCommandPath(command);\n const serviceRunIndex = normalizedCommand.indexOf(\" service run\");\n if (serviceRunIndex <= 0) {\n return null;\n }\n\n const commandPrefix = command.slice(0, serviceRunIndex);\n const normalizedPrefix = normalizedCommand.slice(0, serviceRunIndex);\n for (const wrapperPath of daemonServiceRecognizedExecutablePaths(pathInput)) {\n const normalizedWrapperPath = normalizeDaemonCommandPath(wrapperPath);\n const wrapperPathIndex = normalizedPrefix.lastIndexOf(\n normalizedWrapperPath\n );\n if (\n wrapperPathIndex >= 0 &&\n daemonCommandContainsExactPath(commandPrefix, wrapperPath)\n ) {\n return commandPrefix.slice(\n wrapperPathIndex,\n wrapperPathIndex + normalizedWrapperPath.length\n );\n }\n\n const wrapperName = basename(wrapperPath);\n if (!wrapperName.includes(\" \")) {\n continue;\n }\n const normalizedSuffix = `/${normalizeDaemonCommandPath(wrapperName)}`;\n const wrapperNameIndex = normalizedPrefix.lastIndexOf(normalizedSuffix);\n if (\n wrapperNameIndex < 0 ||\n wrapperNameIndex + normalizedSuffix.length !== normalizedPrefix.length\n ) {\n continue;\n }\n return commandPrefix.slice(0, wrapperNameIndex + normalizedSuffix.length);\n }\n return null;\n}\n\nfunction isCommandArgumentBoundary(char: string | undefined): boolean {\n return (\n char === undefined ||\n char === \"'\" ||\n char === '\"' ||\n COMMAND_ARGUMENT_BOUNDARY_PATTERN.test(char)\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport process from \"node:process\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport {\n containsOpenMeldManagedBinaryPath,\n resolveOpenMeldManagedVersionBinaryRootPath,\n} from \"./daemon-managed-binary-path\";\nimport {\n daemonServiceLauncherPath,\n daemonServiceRecognizedExecutablePaths,\n} from \"./daemon-service-bundle\";\nimport {\n type DaemonServiceProcessMode,\n daemonCommandContainsExactPath,\n extractDaemonCommandEntryPath,\n isDaemonRuntimeProcessCommand,\n parseDaemonServiceProcessCommand,\n tokenizeDaemonCommand,\n} from \"./daemon-service-command-path\";\nimport { resolveDaemonServiceIdentity } from \"./daemon-service-identity\";\n\nexport type DaemonOwnedProcess = {\n pid: number;\n parentPid: number | null;\n command: string;\n mode: DaemonServiceProcessMode;\n ownership: \"stable_launcher\" | \"legacy_detached\" | \"cli_direct\" | \"unknown\";\n};\n\ntype ListedProcess = {\n pid: number;\n parentPid: number | null;\n command: string;\n};\n\nconst POSIX_PROCESS_LINE_PATTERN = /^(\\d+)\\s+(\\d+)\\s+(.+)$/;\nconst TRAILING_PATH_SEPARATOR_PATTERN = /\\/+$/u;\nconst OPENMELD_PACKAGE_INSTALL_ENTRY_SEGMENT =\n \"/node_modules/openmeld/dist/openmeld.js\";\nconst OPENMELD_DEV_LOCAL_ENTRY_SEGMENT = \"/openmeld-dev.js\";\nconst ALL_OPENMELD_ENV_PRESETS = [\n \"prod\",\n \"dev-local\",\n \"canary\",\n] as const satisfies readonly OpenMeldEnvPreset[];\nconst DAEMON_BIN_COMMAND_PATTERN_BY_PRESET = {\n prod: buildOpenMeldBinCommandPatternForPreset(\"prod\"),\n \"dev-local\": buildOpenMeldBinCommandPatternForPreset(\"dev-local\"),\n canary: buildOpenMeldBinCommandPatternForPreset(\"canary\"),\n} as const satisfies Record<OpenMeldEnvPreset, RegExp>;\n\nexport async function listDaemonOwnedProcesses(\n overrides: {\n listProcesses?: () => Promise<ListedProcess[]>;\n ignoreProcessIds?: Iterable<number>;\n pathInput?: OpenMeldPathResolutionInput;\n } = {}\n): Promise<DaemonOwnedProcess[]> {\n const listProcesses =\n overrides.listProcesses ?? listProcessesForCurrentPlatform;\n const ignoredProcessIds = new Set(\n Array.from(overrides.ignoreProcessIds ?? []).filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n )\n );\n const processes = await listProcesses();\n const ownedProcesses = processes\n .map((processInfo) =>\n classifyDaemonOwnedProcess(\n processInfo,\n ignoredProcessIds,\n overrides.pathInput\n )\n )\n .filter(\n (processInfo): processInfo is DaemonOwnedProcess => processInfo !== null\n );\n return collapseLauncherWrapperProcesses(ownedProcesses);\n}\n\nfunction classifyDaemonOwnedProcess(\n processInfo: ListedProcess,\n ignoredProcessIds: ReadonlySet<number>,\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonOwnedProcess | null {\n if (ignoredProcessIds.has(processInfo.pid)) {\n return null;\n }\n const normalizedCommand = normalizeProcessCommand(processInfo.command);\n const isRuntimeProcess = isDaemonRuntimeProcessCommand(normalizedCommand);\n const isLegacyDetachedProcess = normalizedCommand.includes(\"legacy-detached\");\n if (!(isRuntimeProcess || isLegacyDetachedProcess)) {\n return null;\n }\n const launcherPath = normalizeProcessCommand(\n daemonServiceLauncherPath(pathInput)\n );\n const wrapperPaths = daemonServiceRecognizedExecutablePaths(pathInput).map(\n normalizeProcessCommand\n );\n if (\n wrapperPaths.some(\n (wrapperPath) =>\n normalizedCommand.includes(wrapperPath) &&\n !daemonCommandContainsExactPath(normalizedCommand, wrapperPath)\n )\n ) {\n return null;\n }\n if (\n !looksLikeCurrentLaneDaemonCandidate({\n launcherPath,\n normalizedCommand,\n wrapperPaths,\n })\n ) {\n return null;\n }\n if (\n resolveDaemonCommandLaneScope({\n launcherPath,\n normalizedCommand,\n pathInput,\n }) !== \"current_lane\"\n ) {\n return null;\n }\n const ownership = resolveDaemonProcessOwnership(\n normalizedCommand,\n launcherPath,\n wrapperPaths,\n pathInput\n );\n const mode =\n parseDaemonServiceProcessCommand(normalizedCommand)?.mode ?? null;\n return {\n pid: processInfo.pid,\n parentPid: processInfo.parentPid,\n command: processInfo.command,\n mode,\n ownership,\n };\n}\n\nasync function listProcessesForCurrentPlatform(): Promise<ListedProcess[]> {\n if (process.platform === \"win32\") {\n return await listWindowsProcesses();\n }\n return await listPosixProcesses();\n}\n\nasync function listPosixProcesses(): Promise<ListedProcess[]> {\n const output = await runCommand(\"ps\", [\"-axo\", \"pid=,ppid=,command=\"]);\n const processes: ListedProcess[] = [];\n for (const line of output.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const match = trimmed.match(POSIX_PROCESS_LINE_PATTERN);\n if (!(match?.[1] && match[2] && match[3])) {\n continue;\n }\n processes.push({\n pid: Number(match[1]),\n parentPid: Number(match[2]),\n command: match[3],\n });\n }\n return processes;\n}\n\nfunction resolveDaemonProcessOwnership(\n normalizedCommand: string,\n launcherPath: string,\n wrapperPaths: readonly string[],\n pathInput: OpenMeldPathResolutionInput\n): DaemonOwnedProcess[\"ownership\"] {\n const isRuntimeProcess = isDaemonRuntimeProcessCommand(normalizedCommand);\n if (\n normalizedCommand.includes(launcherPath) ||\n wrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(normalizedCommand, wrapperPath)\n ) ||\n (isRuntimeProcess &&\n containsOpenMeldManagedBinaryPath(normalizedCommand, pathInput))\n ) {\n return \"stable_launcher\";\n }\n if (normalizedCommand.includes(\"legacy-detached\")) {\n return \"legacy_detached\";\n }\n if (isRuntimeProcess) {\n return \"cli_direct\";\n }\n return \"unknown\";\n}\n\nfunction looksLikeCurrentLaneDaemonCandidate(input: {\n normalizedCommand: string;\n launcherPath: string;\n wrapperPaths: readonly string[];\n}): boolean {\n return (\n isDaemonRuntimeProcessCommand(input.normalizedCommand) ||\n input.normalizedCommand.includes(input.launcherPath) ||\n input.wrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(input.normalizedCommand, wrapperPath)\n ) ||\n input.normalizedCommand.includes(\"legacy-detached\")\n );\n}\n\nfunction resolveDaemonCommandLaneScope(input: {\n normalizedCommand: string;\n launcherPath: string;\n pathInput: OpenMeldPathResolutionInput;\n}): \"current_lane\" | \"other_lane\" | \"not_openmeld\" {\n const managedVersionRoot = resolveDaemonCommandManagedVersionRoot(\n input.normalizedCommand\n );\n if (managedVersionRoot) {\n const currentRoot = normalizeRootPath(\n resolveOpenMeldRootDir(input.pathInput)\n );\n return managedVersionRoot === currentRoot ? \"current_lane\" : \"other_lane\";\n }\n\n const currentLane = resolveOpenMeldEnvPreset(input.pathInput);\n const managedLane = resolveManagedDaemonPathLane({\n normalizedCommand: input.normalizedCommand,\n pathInput: input.pathInput,\n });\n if (managedLane) {\n return managedLane === currentLane ? \"current_lane\" : \"other_lane\";\n }\n\n if (hasExplicitOpenMeldHome(input.pathInput)) {\n return \"not_openmeld\";\n }\n\n const detectedLane = resolveDaemonCliCommandLane(\n input.normalizedCommand,\n input.pathInput\n );\n if (!detectedLane) {\n return \"not_openmeld\";\n }\n return detectedLane === currentLane ? \"current_lane\" : \"other_lane\";\n}\n\nfunction hasExplicitOpenMeldHome(\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const value = (pathInput.env ?? process.env)[OPENMELD_HOME_ENV_KEY];\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction resolveDaemonCommandManagedVersionRoot(\n normalizedCommand: string\n): string | null {\n for (const token of tokenizeDaemonCommand(normalizedCommand)) {\n const rootPath = resolveOpenMeldManagedVersionBinaryRootPath(token);\n if (rootPath) {\n return normalizeRootPath(rootPath);\n }\n }\n return null;\n}\n\nfunction resolveManagedDaemonPathLane(input: {\n normalizedCommand: string;\n pathInput: OpenMeldPathResolutionInput;\n}): OpenMeldEnvPreset | null {\n const currentPreset = resolveOpenMeldEnvPreset(input.pathInput);\n for (const preset of ALL_OPENMELD_ENV_PRESETS) {\n const lanePathInput = resolveLanePathInput(input.pathInput, preset);\n const laneLauncherPath = normalizeProcessCommand(\n daemonServiceLauncherPath(lanePathInput)\n );\n const laneWrapperPaths = daemonServiceRecognizedExecutablePaths(\n lanePathInput\n ).map(normalizeProcessCommand);\n const laneRuntimeRoot = normalizeProcessCommand(\n daemonRuntimeRootPath(lanePathInput)\n );\n const laneEntryPath = extractDaemonCommandEntryPath(\n input.normalizedCommand,\n lanePathInput\n );\n const laneExecutableNames = laneWrapperPaths.map((candidatePath) =>\n basename(candidatePath)\n );\n if (\n input.normalizedCommand.includes(laneLauncherPath) ||\n laneWrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(input.normalizedCommand, wrapperPath)\n ) ||\n (preset !== currentPreset &&\n laneEntryPath !== null &&\n laneExecutableNames.includes(\n normalizeProcessCommand(basename(laneEntryPath))\n )) ||\n input.normalizedCommand.includes(laneRuntimeRoot) ||\n containsOpenMeldManagedBinaryPath(input.normalizedCommand, lanePathInput)\n ) {\n return preset;\n }\n }\n return null;\n}\n\nfunction resolveDaemonCliCommandLane(\n normalizedCommand: string,\n pathInput: OpenMeldPathResolutionInput\n): OpenMeldEnvPreset | null {\n if (!isDaemonRuntimeProcessCommand(normalizedCommand)) {\n return null;\n }\n if (matchesDaemonCliLane(normalizedCommand, \"dev-local\", pathInput)) {\n return \"dev-local\";\n }\n if (matchesDaemonCliLane(normalizedCommand, \"canary\", pathInput)) {\n return \"canary\";\n }\n if (matchesDaemonCliLane(normalizedCommand, \"prod\", pathInput)) {\n return \"prod\";\n }\n return null;\n}\n\nfunction matchesDaemonCliLane(\n normalizedCommand: string,\n preset: OpenMeldEnvPreset,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n if (DAEMON_BIN_COMMAND_PATTERN_BY_PRESET[preset].test(normalizedCommand)) {\n return true;\n }\n\n if (preset === \"dev-local\") {\n return normalizedCommand.includes(OPENMELD_DEV_LOCAL_ENTRY_SEGMENT);\n }\n\n const canaryPackageInstallRoot = resolveCanaryPackageInstallRoot(pathInput);\n if (preset === \"canary\") {\n return (\n normalizedCommand.includes(canaryPackageInstallRoot) ||\n normalizedCommand.includes(\n \"/.local/share/openmeld-canary/package-install/\"\n )\n );\n }\n\n return (\n normalizedCommand.includes(OPENMELD_PACKAGE_INSTALL_ENTRY_SEGMENT) &&\n !normalizedCommand.includes(canaryPackageInstallRoot) &&\n !normalizedCommand.includes(\n \"/.local/share/openmeld-canary/package-install/\"\n ) &&\n !normalizedCommand.includes(OPENMELD_DEV_LOCAL_ENTRY_SEGMENT)\n );\n}\n\nfunction collapseLauncherWrapperProcesses(\n processes: DaemonOwnedProcess[]\n): DaemonOwnedProcess[] {\n const launcherPidSet = new Set<number>();\n\n for (const processInfo of processes) {\n if (processInfo.ownership === \"stable_launcher\") {\n launcherPidSet.add(processInfo.pid);\n }\n }\n if (launcherPidSet.size === 0) {\n return processes;\n }\n\n const collapsedProcesses: DaemonOwnedProcess[] = [];\n for (const processInfo of processes) {\n if (processInfo.ownership === \"stable_launcher\") {\n const hasManagedChild = processes.some(\n (candidate) =>\n candidate.pid !== processInfo.pid &&\n candidate.parentPid === processInfo.pid &&\n candidate.ownership !== \"stable_launcher\"\n );\n if (hasManagedChild) {\n continue;\n }\n collapsedProcesses.push(processInfo);\n continue;\n }\n\n if (\n processInfo.parentPid !== null &&\n launcherPidSet.has(processInfo.parentPid)\n ) {\n collapsedProcesses.push({\n ...processInfo,\n ownership:\n processInfo.ownership === \"unknown\"\n ? processInfo.ownership\n : \"stable_launcher\",\n });\n continue;\n }\n\n collapsedProcesses.push(processInfo);\n }\n\n return collapsedProcesses;\n}\n\nasync function listWindowsProcesses(): Promise<ListedProcess[]> {\n const script =\n \"Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,CommandLine | ConvertTo-Json -Compress\";\n const output = await runCommand(\"powershell\", [\n \"-NoProfile\",\n \"-Command\",\n script,\n ]);\n const parsed = JSON.parse(output) as\n | Array<{\n ProcessId?: number;\n ParentProcessId?: number;\n CommandLine?: string | null;\n }>\n | {\n ProcessId?: number;\n ParentProcessId?: number;\n CommandLine?: string | null;\n };\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n const processes: ListedProcess[] = [];\n for (const row of rows) {\n if (\n typeof row.ProcessId !== \"number\" ||\n typeof row.ParentProcessId !== \"number\" ||\n typeof row.CommandLine !== \"string\" ||\n row.CommandLine.trim().length === 0\n ) {\n continue;\n }\n processes.push({\n pid: row.ProcessId,\n parentPid: row.ParentProcessId,\n command: row.CommandLine,\n });\n }\n return processes;\n}\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n windowsHide: true,\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n if (code !== 0) {\n reject(\n new Error(\n `process inventory command failed: ${command} ${args.join(\" \")} ${stderr.trim()}`\n )\n );\n return;\n }\n resolve(stdout);\n });\n });\n}\n\nfunction buildOpenMeldBinCommandPatternForPreset(\n preset: OpenMeldEnvPreset\n): RegExp {\n const aliases = resolveDaemonServiceIdentity({\n env: {\n OPENMELD_ENV_PRESET: preset,\n },\n }).cliEntryAliases.map(escapeRegex);\n return new RegExp(\n `(^|[\\\\s\\\\/])(${aliases.join(\"|\")})(?:\\\\.cmd|\\\\.exe|\\\\.js)?(?=\\\\s|$)`,\n \"u\"\n );\n}\n\nfunction escapeRegex(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction resolveCanaryPackageInstallRoot(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return normalizeProcessCommand(\n join(\n pathInput.homeDir ?? homedir(),\n \".local\",\n \"share\",\n \"openmeld-canary\",\n \"package-install\"\n )\n );\n}\n\nfunction resolveLanePathInput(\n pathInput: OpenMeldPathResolutionInput,\n preset: OpenMeldEnvPreset\n): OpenMeldPathResolutionInput {\n const currentPreset = resolveOpenMeldEnvPreset(pathInput);\n const env: NodeJS.ProcessEnv = {\n ...(pathInput.env ?? process.env),\n OPENMELD_ENV_PRESET: preset,\n };\n if (preset !== currentPreset && env[OPENMELD_HOME_ENV_KEY]) {\n delete env[OPENMELD_HOME_ENV_KEY];\n }\n return {\n ...pathInput,\n env,\n };\n}\n\nfunction normalizeProcessCommand(command: string): string {\n return command.trim().toLowerCase().replaceAll(\"\\\\\", \"/\");\n}\n\nfunction normalizeRootPath(path: string): string {\n const normalized = normalizeProcessCommand(path);\n return normalized === \"/\"\n ? normalized\n : normalized.replace(TRAILING_PATH_SEPARATOR_PATTERN, \"\");\n}\n","import {\n type DaemonServiceRuntimeStatus,\n type DaemonStatus,\n getDaemonRuntimeStatus,\n getDaemonStatus,\n uninstallDaemon,\n} from \"../../config/daemon-state\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport type {\n DaemonServiceManager,\n DaemonServiceManagerRuntimeStatus,\n} from \"./daemon-service-manager\";\nimport { resolveDaemonServiceManager } from \"./daemon-service-manager\";\nimport { matchesExpectedDaemonServiceManagerCommand } from \"./daemon-service-manager-command-match\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\nexport type LegacySharedDaemonServiceInspection = {\n present: boolean;\n pathInput: OpenMeldPathResolutionInput;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n};\n\nconst PROD_ENV_PRESET = \"prod\";\n\nexport function shouldInspectLegacySharedDaemonService(\n input: OpenMeldPathResolutionInput = {}\n): boolean {\n const env = input.env ?? process.env;\n if (String(env[OPENMELD_HOME_ENV_KEY] ?? \"\").trim()) {\n return false;\n }\n return resolveOpenMeldEnvPreset(input) === PROD_ENV_PRESET;\n}\n\nexport function resolveLegacySharedDaemonPathInput(\n input: OpenMeldPathResolutionInput = {}\n): OpenMeldPathResolutionInput | null {\n if (!shouldInspectLegacySharedDaemonService(input)) {\n return null;\n }\n return {\n ...input,\n env: {\n ...(input.env ?? process.env),\n OPENMELD_ENV_PRESET: PROD_ENV_PRESET,\n },\n };\n}\n\nexport function requiresLegacySharedDaemonServiceMigration(input: {\n pathInput: OpenMeldPathResolutionInput;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n}): boolean {\n if (hasLegacySharedServiceManagerResidual(input)) {\n return true;\n }\n return hasLegacyDetachedResidual(input);\n}\n\nexport async function inspectLegacySharedDaemonService(\n input: OpenMeldPathResolutionInput = {}\n): Promise<LegacySharedDaemonServiceInspection | null> {\n const pathInput = resolveLegacySharedDaemonPathInput(input);\n if (!pathInput) {\n return null;\n }\n\n const [installStatus, runtimeStatus, serviceManager, ownedProcesses] =\n await Promise.all([\n getDaemonStatus(pathInput),\n getDaemonRuntimeStatus(pathInput),\n resolveDaemonServiceManager(undefined, pathInput).catch(() => null),\n listDaemonOwnedProcesses({ pathInput }).catch(() => []),\n ]);\n\n const serviceManagerStatus = serviceManager\n ? await serviceManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null)\n : null;\n\n const present = requiresLegacySharedDaemonServiceMigration({\n pathInput,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n ownedProcesses,\n });\n\n return {\n present,\n pathInput,\n installStatus,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n ownedProcesses,\n };\n}\n\nfunction hasLegacySharedServiceManagerResidual(input: {\n pathInput: OpenMeldPathResolutionInput;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): boolean {\n if (!input.serviceManagerStatus?.installed) {\n return false;\n }\n if (!input.serviceManagerStatus.commandSummary) {\n return true;\n }\n return !matchesExpectedDaemonServiceManagerCommand({\n controller: input.serviceManager?.controller ?? null,\n commandSummary: input.serviceManagerStatus.commandSummary,\n commandSpec: input.serviceManagerStatus.commandSpec,\n definitionPath: input.serviceManagerStatus.definitionPath ?? null,\n includeLegacyExecutableWrappers: true,\n pathInput: input.pathInput,\n });\n}\n\nfunction hasLegacyDetachedResidual(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n ownedProcesses: DaemonOwnedProcess[];\n}): boolean {\n if (input.runtimeStatus.serviceController === \"legacy-detached\") {\n return true;\n }\n return input.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"legacy_detached\"\n );\n}\n\nexport async function cleanupLegacySharedDaemonServiceState(\n input: OpenMeldPathResolutionInput = {}\n): Promise<{ removed: boolean }> {\n const pathInput = resolveLegacySharedDaemonPathInput(input);\n if (!pathInput) {\n return { removed: false };\n }\n const legacySharedService = await inspectLegacySharedDaemonService(input);\n let removedServiceManager = false;\n if (\n legacySharedService?.present &&\n legacySharedService.serviceManager &&\n legacySharedService.serviceManagerStatus?.installed\n ) {\n await legacySharedService.serviceManager.uninstall();\n await legacySharedService.serviceManager.waitUntilAbsent();\n removedServiceManager = true;\n }\n const uninstallResult = await uninstallDaemon(pathInput);\n return {\n removed: removedServiceManager || uninstallResult.removed,\n };\n}\n","import process from \"node:process\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport {\n DAEMON_HEARTBEAT_STALE_MS,\n type DaemonServiceRuntimeStatus,\n} from \"../../config/daemon-state\";\nimport { extractDaemonCommandEntryPath } from \"./daemon-service-command-path\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\n\nexport function resolveObservedDaemonRuntimeStatus(input: {\n runtimeLease: DaemonRuntimeLease | null;\n ownedProcesses: readonly DaemonOwnedProcess[];\n}): DaemonServiceRuntimeStatus {\n const runtimeLeaseIssue = resolveRuntimeLeaseIssue(input.runtimeLease);\n const observedProcess = selectObservedRuntimeProcess(input.ownedProcesses);\n\n if (!runtimeLeaseIssue && input.runtimeLease) {\n return {\n status: \"running\",\n mode: input.runtimeLease.mode,\n pid: input.runtimeLease.pid,\n startedAt: input.runtimeLease.startedAt,\n updatedAt: input.runtimeLease.updatedAt,\n managedBySystemService: input.runtimeLease.managedBySystemService,\n serviceController: input.runtimeLease.serviceController,\n autoStart: input.runtimeLease.managedBySystemService,\n };\n }\n\n if (observedProcess) {\n return {\n status: \"stale\",\n mode: observedProcess.mode,\n pid: observedProcess.pid,\n startedAt: input.runtimeLease?.startedAt ?? null,\n updatedAt: input.runtimeLease?.updatedAt ?? null,\n managedBySystemService: observedProcess.ownership === \"stable_launcher\",\n serviceController:\n observedProcess.ownership === \"legacy_detached\"\n ? \"legacy-detached\"\n : \"unknown\",\n autoStart: observedProcess.ownership === \"stable_launcher\",\n reason: runtimeLeaseIssue ?? \"runtime_lease_missing\",\n };\n }\n\n if (!input.runtimeLease) {\n return {\n status: \"not_running\",\n mode: null,\n pid: null,\n startedAt: null,\n updatedAt: null,\n managedBySystemService: false,\n serviceController: \"unknown\",\n autoStart: false,\n };\n }\n\n return {\n status: \"stale\",\n mode: input.runtimeLease.mode,\n pid: input.runtimeLease.pid,\n startedAt: input.runtimeLease.startedAt,\n updatedAt: input.runtimeLease.updatedAt,\n managedBySystemService: input.runtimeLease.managedBySystemService,\n serviceController: input.runtimeLease.serviceController,\n autoStart: input.runtimeLease.managedBySystemService,\n reason: runtimeLeaseIssue ?? \"runtime_lease_missing\",\n };\n}\n\nexport function resolveObservedRuntimeCommandEntryPath(input: {\n ownedProcesses: readonly DaemonOwnedProcess[];\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): string | null {\n const runtimePid =\n typeof input.runtimeStatus.pid === \"number\"\n ? input.runtimeStatus.pid\n : null;\n if (!runtimePid) {\n return null;\n }\n const runtimeProcess = input.ownedProcesses.find(\n (processInfo) => processInfo.pid === runtimePid\n );\n if (!runtimeProcess) {\n return null;\n }\n return extractDaemonCommandEntryPath(runtimeProcess.command);\n}\n\nfunction resolveRuntimeLeaseIssue(\n runtimeLease: DaemonRuntimeLease | null\n): string | null {\n if (!runtimeLease) {\n return \"runtime_lease_missing\";\n }\n\n if (!Number.isInteger(runtimeLease.pid) || runtimeLease.pid <= 0) {\n return \"invalid_pid\";\n }\n\n if (!isPidAlive(runtimeLease.pid)) {\n return \"process_not_alive\";\n }\n\n if (isRuntimeLeaseHeartbeatStale(runtimeLease)) {\n return \"heartbeat_stale\";\n }\n\n return null;\n}\n\nfunction selectObservedRuntimeProcess(\n ownedProcesses: readonly DaemonOwnedProcess[]\n): DaemonOwnedProcess | null {\n const sortedProcesses = [...ownedProcesses].sort((left, right) => {\n const priorityDifference =\n resolveOwnershipPriority(left.ownership) -\n resolveOwnershipPriority(right.ownership);\n if (priorityDifference !== 0) {\n return priorityDifference;\n }\n const modeDifference =\n resolveModePriority(left.mode) - resolveModePriority(right.mode);\n if (modeDifference !== 0) {\n return modeDifference;\n }\n return left.pid - right.pid;\n });\n return sortedProcesses[0] ?? null;\n}\n\nfunction resolveOwnershipPriority(\n ownership: DaemonOwnedProcess[\"ownership\"]\n): number {\n switch (ownership) {\n case \"stable_launcher\":\n return 0;\n case \"legacy_detached\":\n return 1;\n case \"cli_direct\":\n return 2;\n default:\n return 3;\n }\n}\n\nfunction resolveModePriority(mode: DaemonOwnedProcess[\"mode\"]): number {\n switch (mode) {\n case \"background\":\n return 0;\n case \"foreground\":\n return 1;\n default:\n return 2;\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isRuntimeLeaseHeartbeatStale(\n runtimeLease: DaemonRuntimeLease\n): boolean {\n const freshnessTimestamp = runtimeLease.heartbeatAt ?? runtimeLease.updatedAt;\n const heartbeatMs = Date.parse(freshnessTimestamp);\n if (Number.isNaN(heartbeatMs)) {\n return true;\n }\n return Date.now() - heartbeatMs > DAEMON_HEARTBEAT_STALE_MS;\n}\n","import process from \"node:process\";\nimport { sleep } from \"@openmeld/utils\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n clearDaemonServiceRuntimeState,\n getDaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n inspectLegacySharedDaemonService,\n type LegacySharedDaemonServiceInspection,\n} from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\nimport { resolveObservedDaemonRuntimeStatus } from \"./daemon-service-runtime-observer\";\n\nconst DEFAULT_SYSTEM_SERVICE_STOP_WAIT_MS = 3000;\nconst DEFAULT_SYSTEM_SERVICE_STOP_POLL_MS = 200;\n\nexport type CurrentDaemonRuntimeContext = {\n status: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n};\n\nexport type DaemonRuntimeCleanupDecision = {\n context: CurrentDaemonRuntimeContext;\n cleared: boolean;\n};\n\nexport async function readCurrentObservedDaemonRuntimeStatus(): Promise<DaemonServiceRuntimeStatus> {\n return await readObservedRuntimeState();\n}\n\nexport async function clearDaemonRuntimeStateIfDefinitelyStopped(): Promise<DaemonRuntimeCleanupDecision> {\n const context = await readCurrentDaemonRuntimeContext();\n const isDefinitelyStopped =\n context.effectiveRuntimeStatus === \"not_running\" ||\n (await isStoppedSystemServiceSnapshot(context));\n if (!isDefinitelyStopped) {\n return {\n context,\n cleared: false,\n };\n }\n await clearDaemonServiceRuntimeState();\n return {\n context,\n cleared: true,\n };\n}\n\nasync function isStoppedSystemServiceSnapshot(\n context: CurrentDaemonRuntimeContext\n): Promise<boolean> {\n if (\n context.runtimeStatus.status !== \"stale\" ||\n !context.runtimeStatus.managedBySystemService ||\n context.serviceManagerStatus?.running !== false\n ) {\n return false;\n }\n\n const ownedProcesses = await listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid],\n });\n return ownedProcesses.length === 0;\n}\n\nexport async function readCurrentDaemonRuntimeContext(\n input: { status?: DaemonStatus | null } = {}\n): Promise<CurrentDaemonRuntimeContext> {\n const status = input.status ?? (await getDaemonStatus());\n const runtimeStatus = await readCurrentObservedDaemonRuntimeStatus();\n const { serviceManager, serviceManagerStatus, legacySharedService } =\n await resolveDaemonServiceManagerForRuntimeState({\n status,\n runtimeState: runtimeStatus,\n });\n const effectiveRuntimeStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState: runtimeStatus,\n serviceManagerStatus,\n });\n\n return {\n status,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n legacySharedService,\n effectiveRuntimeStatus,\n };\n}\n\nexport async function resolveDaemonRuntimeState(\n status: DaemonStatus\n): Promise<DaemonServiceRuntimeStatus | null> {\n if (!status.installed) {\n return null;\n }\n return await readCurrentObservedDaemonRuntimeStatus();\n}\n\nexport async function resolveDaemonServiceManagerFromRuntimeState(\n runtimeState: DaemonServiceRuntimeStatus | null\n): Promise<DaemonServiceManager | null> {\n if (!runtimeState?.managedBySystemService) {\n return null;\n }\n\n if (runtimeState.serviceController === \"legacy-detached\") {\n return null;\n }\n\n return await resolveDaemonServiceManager(runtimeState.serviceController);\n}\n\nexport async function resolveDaemonServiceManagerForRuntimeState(input: {\n status: DaemonStatus;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): Promise<{\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n}> {\n const initialManager = await resolveDaemonServiceManagerFromRuntimeState(\n input.runtimeState\n );\n const initialManagerStatus = initialManager\n ? await initialManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null)\n : null;\n\n if (\n input.status.installed &&\n input.runtimeState?.managedBySystemService !== true &&\n !initialManagerStatus?.installed\n ) {\n const detectedManager = await resolveDaemonServiceManager().catch<null>(\n () => null\n );\n if (detectedManager) {\n const detectedManagerStatus = await detectedManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null);\n if (detectedManagerStatus?.installed) {\n return {\n serviceManager: detectedManager,\n serviceManagerStatus: detectedManagerStatus,\n legacySharedService: null,\n };\n }\n }\n }\n\n const legacySharedService = await inspectLegacySharedDaemonService().catch(\n () => null\n );\n if (\n legacySharedService?.present &&\n legacySharedService.serviceManagerStatus?.installed\n ) {\n const legacyManager =\n legacySharedService.serviceManager ??\n (await resolveDaemonServiceManager(\n legacySharedService.runtimeStatus.serviceController === \"unknown\"\n ? undefined\n : legacySharedService.runtimeStatus.serviceController,\n legacySharedService.pathInput\n ).catch(() => null));\n if (legacyManager) {\n return {\n serviceManager: legacyManager,\n serviceManagerStatus: legacySharedService.serviceManagerStatus,\n legacySharedService,\n };\n }\n }\n\n return {\n serviceManager: initialManager,\n serviceManagerStatus: initialManagerStatus,\n legacySharedService,\n };\n}\n\nexport function getEffectiveDaemonRuntimeStatus(input: {\n runtimeState: DaemonServiceRuntimeStatus;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): DaemonServiceRuntimeStatus[\"status\"] {\n if (input.runtimeState.status === \"running\") {\n return \"running\";\n }\n\n if (\n !(input.runtimeState.managedBySystemService && input.serviceManagerStatus)\n ) {\n return input.runtimeState.status;\n }\n\n if (input.runtimeState.status === \"stale\") {\n if (input.runtimeState.reason === \"heartbeat_stale\") {\n return \"stale\";\n }\n if (input.serviceManagerStatus.running) {\n return \"running\";\n }\n if (!input.serviceManagerStatus.enabled) {\n return \"not_running\";\n }\n }\n\n if (!input.serviceManagerStatus.running) {\n return \"not_running\";\n }\n\n return input.runtimeState.status;\n}\n\nexport async function waitForDaemonSystemServiceToStop(input: {\n manager: DaemonServiceManager;\n waitMs?: number;\n pollMs?: number;\n}): Promise<boolean> {\n const waitMs = input.waitMs ?? DEFAULT_SYSTEM_SERVICE_STOP_WAIT_MS;\n const pollMs = input.pollMs ?? DEFAULT_SYSTEM_SERVICE_STOP_POLL_MS;\n const deadlineMs = Date.now() + waitMs;\n\n while (Date.now() < deadlineMs) {\n const currentRuntime = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n const managerStatus = await input.manager.status().catch(() => null);\n\n if (\n managerStatus?.running === false &&\n currentRuntime !== null &&\n currentRuntime.status !== \"running\"\n ) {\n return true;\n }\n\n if (\n currentRuntime?.status === \"stale\" &&\n !currentRuntime.managedBySystemService\n ) {\n return true;\n }\n\n if (currentRuntime?.status === \"not_running\") {\n return true;\n }\n\n await sleep(pollMs);\n }\n\n const finalRuntime = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (finalRuntime?.status === \"not_running\") {\n return true;\n }\n\n if (\n finalRuntime?.status === \"stale\" &&\n !finalRuntime.managedBySystemService\n ) {\n return true;\n }\n\n if (finalRuntime?.status === \"running\") {\n return false;\n }\n\n if (finalRuntime === null) {\n return false;\n }\n\n const finalManagerStatus = await input.manager.status().catch(() => null);\n return finalManagerStatus?.running === false;\n}\n\nasync function readObservedRuntimeState(): Promise<DaemonServiceRuntimeStatus> {\n const ignoredProcessIds = [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n );\n const [runtimeLease, ownedProcesses] = await Promise.all([\n readDaemonRuntimeLease().catch(() => null),\n listDaemonOwnedProcesses({\n ignoreProcessIds: ignoredProcessIds,\n }),\n ]);\n return resolveObservedDaemonRuntimeStatus({\n runtimeLease,\n ownedProcesses,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"daemon-service-runtime-D7cb3-Ov.js","names":["process","getErrorCode","packageJson","process","exhaustive","packageJson","getErrorCode","fsConstants","process","fsConstants","delay","process","resolveDaemonServiceExecutableWrapperPaths","resolveDaemonServiceRecognizedExecutablePaths","process","daemonServiceRecognizedExecutablePaths","process","process"],"sources":["../../../packages/schemas/dist/schemas/daemon/service-update-job.js","../src/config/daemon-service-contract.ts","../src/local-service/control-plane/client.ts","../../../runtime/local-service/src/cli-binary-delta.ts","../../../runtime/local-service/src/cli-binary-update-artifact.ts","../src/config/daemon-service-update-worker-registration.ts","../package.json","../src/config/service-release.ts","../src/config/version-state.ts","../src/local-service/lifecycle/daemon-service-update-state.ts","../src/runtime/version.ts","../src/local-components/managed-version-pruning.ts","../src/local-components/managed-install.ts","../src/system/local-operation-diagnostics.ts","../src/local-service/lifecycle/daemon-lifecycle-journal.ts","../src/local-service/lifecycle/daemon-service-artifact.ts","../src/local-service/lifecycle/daemon-service-bundle.ts","../src/local-service/lifecycle/daemon-managed-binary-path.ts","../src/local-service/lifecycle/daemon-service-manager-command-match.ts","../src/local-service/lifecycle/daemon-service-command-path.ts","../src/local-service/lifecycle/daemon-service-process-inventory.ts","../src/local-service/lifecycle/daemon-service-legacy-shared.ts","../src/local-service/lifecycle/daemon-service-runtime-observer.ts","../src/local-service/lifecycle/daemon-service-runtime.ts"],"sourcesContent":["import { openMeldToolsUpdateOperationPhaseSchema, openMeldToolsUpdateRequestSourceSchema } from \"../local-components.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/service-update-job.ts\nconst OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA = \"openmeld-daemon-service-update-job-v2\";\nconst daemonServiceUpdatePreparedBundleSchema = z$1.strictObject({\n\tv: z$1.literal(2),\n\tschema: z$1.literal(\"openmeld-daemon-active-bundle-v2\"),\n\tbundleId: z$1.string().min(1),\n\tdaemonVersion: z$1.string().min(1),\n\tentryScriptRelativePath: z$1.string().min(1),\n\tbundleFormat: z$1.enum([\n\t\t\"legacy_linked_v1\",\n\t\t\"self_contained_v1\",\n\t\t\"binary_v1\"\n\t]),\n\tsourceEntryScriptPath: z$1.string().min(1),\n\tsourcePackageRootPath: z$1.string().min(1),\n\tsourceDistRootPath: z$1.string().min(1),\n\tsourceDistFingerprint: z$1.string().min(1).nullable().optional(),\n\tsourceKind: z$1.enum([\n\t\t\"workspace\",\n\t\t\"package_install\",\n\t\t\"npx_cache\",\n\t\t\"unknown\"\n\t]),\n\tcreatedAt: z$1.iso.datetime({ offset: true }),\n\tupdatedAt: z$1.iso.datetime({ offset: true })\n});\nconst daemonServiceUpdateJobBodySchema = z$1.strictObject({\n\tattempts: z$1.number().int().nonnegative(),\n\tdesiredState: z$1.enum([\"background\", \"stopped\"]),\n\terrorMessage: z$1.string().min(1).nullable(),\n\tjobId: z$1.string().min(1),\n\tpreparedBundle: daemonServiceUpdatePreparedBundleSchema,\n\trequestedAt: z$1.iso.datetime({ offset: true }),\n\ttargetVersion: z$1.string().min(1),\n\tupdatedAt: z$1.iso.datetime({ offset: true }),\n\turgency: z$1.enum([\"available\", \"required\"])\n});\nconst daemonServiceUpdateJobV1Schema = daemonServiceUpdateJobBodySchema.extend({\n\tv: z$1.literal(1),\n\tschema: z$1.literal(\"openmeld-daemon-service-update-job-v1\"),\n\tstatus: z$1.enum([\n\t\t\"scheduled\",\n\t\t\"running\",\n\t\t\"completed\",\n\t\t\"failed\"\n\t])\n});\nconst daemonServiceUpdateJobSchema = daemonServiceUpdateJobBodySchema.extend({\n\tv: z$1.literal(2),\n\tschema: z$1.literal(OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA),\n\tphase: openMeldToolsUpdateOperationPhaseSchema,\n\trequestSource: openMeldToolsUpdateRequestSourceSchema\n});\nconst storedDaemonServiceUpdateJobSchema = z$1.discriminatedUnion(\"v\", [daemonServiceUpdateJobV1Schema, daemonServiceUpdateJobSchema]);\n//#endregion\nexport { OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA, daemonServiceUpdateJobSchema, daemonServiceUpdateJobV1Schema, daemonServiceUpdatePreparedBundleSchema, storedDaemonServiceUpdateJobSchema };\n\n//# sourceMappingURL=service-update-job.js.map","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonServiceContractSchema } from \"@openmeld/schemas\";\nimport type {\n DaemonServiceContract,\n DaemonServiceController,\n DaemonServiceDesiredState,\n} from \"@openmeld/schemas/types\";\nimport {\n readDaemonLocalStateFile,\n writeDaemonLocalStateFile,\n} from \"./daemon-local-state-file\";\nimport { daemonRuntimeStateRootPath } from \"./daemon-state\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"./paths\";\nimport {\n assertNoPublishedProductionMutationDuringTests,\n isPublishedProductionOpenMeldRoot,\n isTestProcess,\n} from \"./published-production-safety\";\n\nconst DAEMON_SERVICE_CONTRACT_FILENAME = \"service-contract.json\";\n\nexport type DaemonServiceContractStateInput = {\n daemonVersion: string;\n bundleId: string;\n desiredState: DaemonServiceDesiredState;\n serviceController: DaemonServiceController;\n autoStart: boolean;\n gatewayUrl: string;\n ownerUserId?: string;\n profileId?: string;\n deviceId: string;\n connectedComputerId?: string;\n heartbeatMs: number;\n lane?: OpenMeldEnvPreset;\n};\n\nexport function daemonServiceContractPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_SERVICE_CONTRACT_FILENAME\n );\n}\n\nexport async function readDaemonServiceContract(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceContract | null> {\n return await readDaemonLocalStateFile({\n path: daemonServiceContractPath(pathInput),\n schema: daemonServiceContractSchema,\n });\n}\n\nexport async function upsertDaemonServiceContract(\n input: DaemonServiceContractStateInput,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceContract> {\n assertDaemonServiceContractMutationAllowed(pathInput);\n const current = await readDaemonServiceContract(pathInput);\n const candidate = buildContractCandidate(input, pathInput, current);\n assertDaemonServiceContractIdentityAllowed(candidate, pathInput);\n if (current && isSameContractState(current, candidate)) {\n return current;\n }\n\n const next: DaemonServiceContract = {\n ...candidate,\n generation: current ? current.generation + 1 : 1,\n updatedAt: new Date().toISOString(),\n };\n await writeDaemonLocalStateFile({\n path: daemonServiceContractPath(pathInput),\n schema: daemonServiceContractSchema,\n value: next,\n mode: 0o600,\n });\n return next;\n}\n\nexport async function clearDaemonServiceContract(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertDaemonServiceContractMutationAllowed(pathInput);\n await rm(daemonServiceContractPath(pathInput), { force: true });\n}\n\nfunction assertDaemonServiceContractMutationAllowed(\n pathInput: OpenMeldPathResolutionInput\n): void {\n assertNoPublishedProductionMutationDuringTests(\n pathInput,\n \"OpenMeld Service contract\"\n );\n}\n\nfunction assertDaemonServiceContractIdentityAllowed(\n candidate: Omit<DaemonServiceContract, \"generation\" | \"updatedAt\">,\n pathInput: OpenMeldPathResolutionInput\n): void {\n if (!isUnsafeProductionDaemonServiceContractIdentity(candidate)) {\n return;\n }\n if (\n isTestProcess(pathInput) &&\n !isPublishedProductionOpenMeldRoot(pathInput)\n ) {\n return;\n }\n throw new Error(\n [\n \"Refusing to write OpenMeld Service contract with a test fixture identity in the published production lane.\",\n \"Run `openmeld service repair --profile <profile-id>` from the signed-in production lane, or clear the polluted local service state before retrying.\",\n ].join(\" \")\n );\n}\n\nexport function isDaemonServiceContractIdentityReusable(\n contract: Pick<\n DaemonServiceContract,\n \"deviceId\" | \"lane\" | \"profileId\"\n > | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n if (!contract) {\n return false;\n }\n if (contract.lane !== resolveOpenMeldEnvPreset(pathInput)) {\n return false;\n }\n return !isUnsafeProductionDaemonServiceContractIdentity(contract);\n}\n\nexport function isUnsafeProductionDaemonServiceContractIdentity(\n contract: Pick<DaemonServiceContract, \"deviceId\" | \"lane\" | \"profileId\">\n): boolean {\n if (contract.lane !== \"prod\") {\n return false;\n }\n return (\n isUnsafeProductionDeviceId(contract.deviceId) ||\n (contract.profileId\n ? isUnsafeProductionProfileId(contract.profileId)\n : false)\n );\n}\n\nexport function isUnsafeProductionDeviceId(deviceId: string): boolean {\n return normalizeFixtureText(deviceId) === \"device_123\";\n}\n\nfunction isUnsafeProductionProfileId(profileId: string): boolean {\n return UNSAFE_PRODUCTION_PROFILE_IDS.has(normalizeFixtureText(profileId));\n}\n\nconst UNSAFE_PRODUCTION_PROFILE_IDS = new Set([\n \"agt_existing\",\n \"11111111-1111-1111-1111-111111111111\",\n \"agt_11111111-1111-1111-1111-111111111111\",\n \"11111111-1111-4111-8111-111111111111\",\n \"agt_11111111-1111-4111-8111-111111111111\",\n]);\n\nfunction normalizeFixtureText(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction buildContractCandidate(\n input: DaemonServiceContractStateInput,\n pathInput: OpenMeldPathResolutionInput,\n current: DaemonServiceContract | null\n): Omit<DaemonServiceContract, \"generation\" | \"updatedAt\"> {\n const lane = input.lane ?? resolveOpenMeldEnvPreset(pathInput);\n const connectedComputerId =\n input.connectedComputerId ??\n (current && canReuseConnectedComputerEvidence(current, input, lane)\n ? current.connectedComputerId\n : undefined);\n\n return {\n schema: \"openmeld-daemon-service-contract-v1\",\n v: 1,\n lane,\n daemonVersion: input.daemonVersion,\n bundleId: input.bundleId,\n desiredState: input.desiredState,\n serviceController: input.serviceController,\n autoStart: input.autoStart,\n gatewayUrl: input.gatewayUrl,\n ...(input.ownerUserId ? { ownerUserId: input.ownerUserId } : {}),\n ...(input.profileId ? { profileId: input.profileId } : {}),\n deviceId: input.deviceId,\n ...(connectedComputerId ? { connectedComputerId } : {}),\n heartbeatMs: input.heartbeatMs,\n };\n}\n\nfunction canReuseConnectedComputerEvidence(\n current: DaemonServiceContract,\n input: DaemonServiceContractStateInput,\n lane: OpenMeldEnvPreset\n): boolean {\n if (\n current.lane !== lane ||\n current.gatewayUrl !== input.gatewayUrl ||\n current.deviceId !== input.deviceId\n ) {\n return false;\n }\n if (current.ownerUserId && input.ownerUserId) {\n return current.ownerUserId === input.ownerUserId;\n }\n if (current.profileId && input.profileId) {\n return current.profileId === input.profileId;\n }\n return !(current.ownerUserId || input.ownerUserId);\n}\n\nfunction isSameContractState(\n current: DaemonServiceContract,\n candidate: Omit<DaemonServiceContract, \"generation\" | \"updatedAt\">\n): boolean {\n return (\n current.schema === candidate.schema &&\n current.v === candidate.v &&\n current.lane === candidate.lane &&\n current.daemonVersion === candidate.daemonVersion &&\n current.bundleId === candidate.bundleId &&\n current.desiredState === candidate.desiredState &&\n current.serviceController === candidate.serviceController &&\n current.autoStart === candidate.autoStart &&\n current.gatewayUrl === candidate.gatewayUrl &&\n current.ownerUserId === candidate.ownerUserId &&\n current.profileId === candidate.profileId &&\n current.deviceId === candidate.deviceId &&\n current.connectedComputerId === candidate.connectedComputerId &&\n current.heartbeatMs === candidate.heartbeatMs\n );\n}\n","import { createConnection } from \"node:net\";\nimport type {\n OpenMeldDaemonControlPlaneRequest,\n OpenMeldDaemonConversationExecutionStatusPayload,\n OpenMeldDaemonConversationExecutionStatusRequestPayload,\n OpenMeldDaemonRequestAgentActivitySyncPayload,\n OpenMeldDaemonRequestAgentActivitySyncRequestPayload,\n OpenMeldDaemonServiceUpdateReadinessPayload,\n OpenMeldDaemonSetLocalAgentEnabledPayload,\n OpenMeldDaemonSetLocalAgentEnabledRequestPayload,\n OpenMeldDaemonShutdownRequestPayload,\n OpenMeldDaemonSyncRouteCatalogPayload,\n OpenMeldDaemonSyncRouteCatalogRequestPayload,\n} from \"@openmeld/schemas\";\nimport {\n OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n openMeldDaemonControlPlaneResponseSchema,\n} from \"@openmeld/schemas\";\nimport type { OpenMeldDaemonControlPlaneResponse } from \"@openmeld/schemas/types\";\nimport {\n readDaemonControlPlaneToken,\n resolveDaemonControlPlaneEndpoint,\n} from \"../../config/daemon-state\";\n\nconst DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS = 5000;\n\nexport class LocalDaemonControlPlaneClientError extends Error {\n code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport async function sendLocalDaemonControlPlaneRequest(input: {\n endpoint?: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonControlPlaneResponse> {\n const endpoint = input.endpoint ?? resolveDaemonControlPlaneEndpoint();\n const authToken = await readDaemonControlPlaneToken();\n if (!authToken) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.auth_token_missing\",\n \"daemon control token is missing\"\n );\n }\n\n const request = {\n ...input.request,\n authToken,\n } satisfies OpenMeldDaemonControlPlaneRequest;\n\n const rawResponse = await writeControlPlaneRequest({\n endpoint,\n request,\n timeoutMs: input.timeoutMs ?? DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS,\n });\n const parsed =\n openMeldDaemonControlPlaneResponseSchema.safeParse(rawResponse);\n if (!parsed.success) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an invalid response\"\n );\n }\n if (parsed.data.code === \"service.error\") {\n throw new LocalDaemonControlPlaneClientError(\n parsed.data.payload.errorCode,\n parsed.data.payload.errorMessage\n );\n }\n return parsed.data;\n}\n\nexport async function requestLocalConversationExecutionStatus(input: {\n endpoint?: string;\n payload: OpenMeldDaemonConversationExecutionStatusRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonConversationExecutionStatusPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"conversation_execution_status\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.conversation_execution_status\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for conversation execution status\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSyncRouteCatalog(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSyncRouteCatalogRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSyncRouteCatalogPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"sync_route_catalog\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.sync_route_catalog\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for route catalog sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalAgentActivitySync(input: {\n endpoint?: string;\n payload: OpenMeldDaemonRequestAgentActivitySyncRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonRequestAgentActivitySyncPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"request_agent_activity_sync\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.agent_activity_sync_requested\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for Agent Activity sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSetLocalAgentEnabled(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSetLocalAgentEnabledRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSetLocalAgentEnabledPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"set_local_agent_enabled\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.set_local_agent_enabled\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for local agent enablement\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonShutdown(input: {\n endpoint?: string;\n payload: OpenMeldDaemonShutdownRequestPayload;\n timeoutMs?: number;\n}): Promise<\n Extract<\n OpenMeldDaemonControlPlaneResponse,\n { code: \"service.shutdown\" }\n >[\"payload\"]\n> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"shutdown\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.shutdown\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for shutdown\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonServiceUpdateReadiness(\n input: { endpoint?: string; timeoutMs?: number } = {}\n): Promise<OpenMeldDaemonServiceUpdateReadinessPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"service_update_readiness\",\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.update_readiness\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for service update readiness\"\n );\n }\n return response.payload;\n}\n\nfunction rewriteDaemonControlPlaneContractMismatch(error: unknown): unknown {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"service.invalid_request\"\n ) {\n return new LocalDaemonControlPlaneClientError(\n \"daemon.control.contract_mismatch\",\n \"local OpenMeld Service must be restarted because the daemon control-plane contract changed on this device\"\n );\n }\n return error;\n}\n\nasync function writeControlPlaneRequest(input: {\n endpoint: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs: number;\n}): Promise<unknown> {\n return await new Promise<unknown>((resolve, reject) => {\n const socket = createConnection(input.endpoint);\n let responseBuffer = \"\";\n let settled = false;\n const cleanup = () => {\n socket.setTimeout(0);\n socket.off(\"connect\", handleConnect);\n socket.off(\"data\", handleData);\n socket.off(\"end\", handleEnd);\n socket.off(\"error\", handleError);\n socket.off(\"timeout\", handleTimeout);\n };\n const settle = (action: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n action();\n };\n const fail = (error: LocalDaemonControlPlaneClientError) => {\n settle(() => {\n socket.destroy();\n reject(error);\n });\n };\n\n const handleConnect = () => {\n socket.write(`${JSON.stringify(input.request)}\\n`);\n };\n const handleData = (chunk: string) => {\n responseBuffer += chunk;\n };\n const handleEnd = () => {\n settle(() => {\n const rawResponse = responseBuffer.trim();\n if (!rawResponse) {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.empty_response\",\n \"local daemon control returned an empty response\"\n )\n );\n return;\n }\n try {\n resolve(JSON.parse(rawResponse) as unknown);\n } catch {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_json\",\n \"local daemon control returned malformed JSON\"\n )\n );\n }\n });\n };\n const handleError = (error: Error | NodeJS.ErrnoException) => {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as NodeJS.ErrnoException).code)\n : \"daemon.control.connection_failed\";\n fail(\n new LocalDaemonControlPlaneClientError(\n code === \"ENOENT\" || code === \"ECONNREFUSED\"\n ? \"daemon.control.endpoint_missing\"\n : code,\n error instanceof Error\n ? error.message\n : \"failed to connect to local daemon control\"\n )\n );\n };\n const handleTimeout = () => {\n fail(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.timeout\",\n `local daemon control timed out after ${String(input.timeoutMs)}ms`\n )\n );\n };\n\n socket.setEncoding(\"utf8\");\n socket.setTimeout(input.timeoutMs);\n socket.once(\"connect\", handleConnect);\n socket.on(\"data\", handleData);\n socket.once(\"end\", handleEnd);\n socket.once(\"error\", handleError);\n socket.once(\"timeout\", handleTimeout);\n });\n}\n","import { createHash } from \"node:crypto\";\nimport {\n type CliBinaryDeltaPatch,\n type CliBinaryDeltaTransport,\n cliBinaryDeltaPatchSchema,\n} from \"@openmeld/schemas\";\n\nexport function reconstructCliBinaryDelta(input: {\n baseBytes: Buffer;\n delta: CliBinaryDeltaTransport;\n patchPayloadBytes: Buffer;\n targetSha256: string;\n targetSizeBytes: number;\n}): Buffer {\n verifyBytes({\n bytes: input.baseBytes,\n expectedSha256: input.delta.fromSha256,\n expectedSizeBytes: input.delta.fromSizeBytes,\n label: \"delta base\",\n });\n\n const patch = parseCliBinaryDeltaPatch(input.patchPayloadBytes);\n assertPatchMatchesRelease({\n delta: input.delta,\n patch,\n targetSha256: input.targetSha256,\n targetSizeBytes: input.targetSizeBytes,\n });\n\n const targetBytes = Buffer.alloc(input.targetSizeBytes);\n input.baseBytes.copy(\n targetBytes,\n 0,\n 0,\n Math.min(input.baseBytes.byteLength, targetBytes.byteLength)\n );\n\n let previousEnd = 0;\n for (const segment of patch.segments) {\n const bytes = Buffer.from(segment.dataBase64, \"base64\");\n const segmentEnd = segment.offset + bytes.byteLength;\n if (segment.offset < previousEnd) {\n throw new Error(\n \"delta patch segments must be sorted and non-overlapping\"\n );\n }\n if (segmentEnd > targetBytes.byteLength) {\n throw new Error(\"delta patch segment exceeds the target binary size\");\n }\n bytes.copy(targetBytes, segment.offset);\n previousEnd = segmentEnd;\n }\n\n verifyBytes({\n bytes: targetBytes,\n expectedSha256: input.targetSha256,\n expectedSizeBytes: input.targetSizeBytes,\n label: \"reconstructed binary\",\n });\n return targetBytes;\n}\n\nfunction parseCliBinaryDeltaPatch(bytes: Buffer): CliBinaryDeltaPatch {\n let value: unknown;\n try {\n value = JSON.parse(bytes.toString(\"utf8\"));\n } catch (error) {\n throw new Error(\n `delta patch is not valid JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n const parsed = cliBinaryDeltaPatchSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`delta patch is invalid: ${parsed.error.message}`);\n }\n return parsed.data;\n}\n\nfunction assertPatchMatchesRelease(input: {\n delta: CliBinaryDeltaTransport;\n patch: CliBinaryDeltaPatch;\n targetSha256: string;\n targetSizeBytes: number;\n}): void {\n const mismatches = [\n [\"format\", input.patch.patchFormat, input.delta.patchFormat],\n [\"base sha256\", input.patch.baseSha256, input.delta.fromSha256],\n [\"base size\", input.patch.baseSizeBytes, input.delta.fromSizeBytes],\n [\"target sha256\", input.patch.targetSha256, input.targetSha256],\n [\"target size\", input.patch.targetSizeBytes, input.targetSizeBytes],\n ].filter(([, actual, expected]) => actual !== expected);\n if (mismatches.length > 0) {\n throw new Error(\n `delta patch metadata mismatch: ${mismatches.map(([label]) => label).join(\", \")}`\n );\n }\n}\n\nfunction verifyBytes(input: {\n bytes: Buffer;\n expectedSha256: string;\n expectedSizeBytes: number;\n label: string;\n}): void {\n if (input.bytes.byteLength !== input.expectedSizeBytes) {\n throw new Error(\n `${input.label} size mismatch: expected ${input.expectedSizeBytes} bytes, received ${input.bytes.byteLength} bytes`\n );\n }\n const actualSha256 = createHash(\"sha256\").update(input.bytes).digest(\"hex\");\n if (actualSha256 !== input.expectedSha256.toLowerCase()) {\n throw new Error(\n `${input.label} sha256 mismatch: expected ${input.expectedSha256.toLowerCase()}, received ${actualSha256}`\n );\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { gunzipSync } from \"node:zlib\";\nimport type { CliBinaryRelease } from \"@openmeld/schemas\";\nimport { reconstructCliBinaryDelta } from \"./cli-binary-delta.js\";\n\ntype CommandResult = {\n code: number;\n stderr: string;\n stdout: string;\n};\n\nconst HARDENED_RUNTIME_FLAG_RE = /flags=.*runtime/iu;\nconst SIGNING_TIMESTAMP_RE = /^Timestamp=/mu;\n\ntype CliBinaryDelta = NonNullable<CliBinaryRelease[\"deltas\"]>[number];\ntype CliBinaryFullUpdatePlan =\n | {\n downloadSha256: string;\n downloadSizeBytes: number;\n downloadUrl: string;\n transport: \"archive\";\n }\n | {\n downloadSha256: string;\n downloadSizeBytes: number;\n downloadUrl: string;\n transport: \"raw\";\n };\n\nexport type CliBinaryUpdatePlan =\n | CliBinaryFullUpdatePlan\n | {\n baseBytes: Buffer;\n delta: CliBinaryDelta;\n downloadSizeBytes: number;\n transport: \"delta\";\n };\n\nexport async function resolveCliBinaryUpdatePlan(input: {\n baseBinaryPath: string;\n currentVersion: string;\n onDeltaFallback: (error: Error) => void;\n release: CliBinaryRelease;\n}): Promise<CliBinaryUpdatePlan> {\n const fullDownloadPlan = resolveFullCliBinaryUpdatePlan(input.release);\n const versionDeltas = input.release.deltas?.filter(\n (candidate) => candidate.fromVersion === input.currentVersion\n );\n if (!versionDeltas?.length) {\n return fullDownloadPlan;\n }\n\n let baseBytes: Buffer;\n try {\n baseBytes = await readFile(input.baseBinaryPath);\n } catch (error) {\n input.onDeltaFallback(toError(error));\n return fullDownloadPlan;\n }\n const baseSha256 = createHash(\"sha256\").update(baseBytes).digest(\"hex\");\n const delta = versionDeltas.find(\n (candidate) =>\n candidate.fromSizeBytes === baseBytes.byteLength &&\n candidate.fromSha256.toLowerCase() === baseSha256\n );\n if (!delta) {\n return fullDownloadPlan;\n }\n return {\n baseBytes,\n delta,\n downloadSizeBytes: delta.patchSizeBytes,\n transport: \"delta\",\n };\n}\n\nexport async function downloadCliBinaryUpdateArtifact(input: {\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n onDeltaFallback: (error: Error) => void;\n plan: CliBinaryUpdatePlan;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n if (input.plan.transport === \"delta\") {\n try {\n return await downloadCliBinaryDelta({\n ...input,\n baseBytes: input.plan.baseBytes,\n delta: input.plan.delta,\n });\n } catch (error) {\n input.onDeltaFallback(toError(error));\n }\n return downloadFullCliBinaryArtifact({\n ...input,\n plan: resolveFullCliBinaryUpdatePlan(input.release),\n });\n }\n return downloadFullCliBinaryArtifact({ ...input, plan: input.plan });\n}\n\nexport async function verifyCliBinaryCodeSignature(input: {\n artifactPath: string;\n release: CliBinaryRelease;\n runCommand: (command: string, args: string[]) => Promise<CommandResult>;\n}): Promise<void> {\n const { codeIdentifier, teamIdentifier } = input.release;\n if (!(codeIdentifier && teamIdentifier)) {\n return;\n }\n if (process.platform !== \"darwin\") {\n throw new Error(\"signed OpenMeld CLI verification requires macOS\");\n }\n\n const verification = await input.runCommand(\"/usr/bin/codesign\", [\n \"--verify\",\n \"--strict\",\n \"--verbose=2\",\n input.artifactPath,\n ]);\n if (verification.code !== 0) {\n throw new Error(\n `binary code signature verification failed: ${commandFailureDetails(verification)}`\n );\n }\n\n const inspection = await input.runCommand(\"/usr/bin/codesign\", [\n \"--display\",\n \"--verbose=4\",\n input.artifactPath,\n ]);\n if (inspection.code !== 0) {\n throw new Error(\n `binary code signature inspection failed: ${commandFailureDetails(inspection)}`\n );\n }\n const details = `${inspection.stdout}\\n${inspection.stderr}`;\n for (const expected of [\n `Identifier=${codeIdentifier}`,\n `TeamIdentifier=${teamIdentifier}`,\n \"Authority=Developer ID Application:\",\n ]) {\n if (!details.includes(expected)) {\n throw new Error(\n `binary code signature is missing expected identity: ${expected}`\n );\n }\n }\n if (!HARDENED_RUNTIME_FLAG_RE.test(details)) {\n throw new Error(\"binary code signature is missing the hardened runtime\");\n }\n if (!SIGNING_TIMESTAMP_RE.test(details)) {\n throw new Error(\"binary code signature is missing a trusted timestamp\");\n }\n}\n\nasync function downloadCliBinaryDelta(input: {\n baseBytes: Buffer;\n delta: CliBinaryDelta;\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n const response = await input.fetchImpl(input.delta.patchUrl, {\n method: \"GET\",\n signal: AbortSignal.timeout(input.downloadTimeoutMs),\n });\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `binary delta download failed: HTTP ${response.status}${body ? `: ${body}` : \"\"}`\n );\n }\n const patchBytes = Buffer.from(await response.arrayBuffer());\n verifyBinaryBytes({\n bytes: patchBytes,\n expectedSha256: input.delta.patchSha256,\n expectedSizeBytes: input.delta.patchSizeBytes,\n label: \"binary delta archive\",\n });\n\n let patchPayloadBytes: Buffer;\n try {\n patchPayloadBytes = gunzipSync(patchBytes, {\n maxOutputLength: input.delta.patchPayloadSizeBytes,\n });\n } catch (error) {\n throw new Error(\n `binary delta could not be decompressed: ${toError(error).message}`\n );\n }\n if (patchPayloadBytes.byteLength !== input.delta.patchPayloadSizeBytes) {\n throw new Error(\n `binary delta payload size mismatch: expected ${input.delta.patchPayloadSizeBytes} bytes, received ${patchPayloadBytes.byteLength} bytes`\n );\n }\n\n return reconstructCliBinaryDelta({\n baseBytes: input.baseBytes,\n delta: input.delta,\n patchPayloadBytes,\n targetSha256: input.release.sha256,\n targetSizeBytes: input.release.sizeBytes,\n });\n}\n\nexport function resolveFullCliBinaryUpdatePlan(\n release: CliBinaryRelease\n): CliBinaryFullUpdatePlan {\n if (hasCompressedCliBinaryTransport(release)) {\n return {\n downloadSha256: release.archiveSha256,\n downloadSizeBytes: release.archiveSizeBytes,\n downloadUrl: release.archiveUrl,\n transport: \"archive\",\n };\n }\n return {\n downloadSha256: release.sha256,\n downloadSizeBytes: release.sizeBytes,\n downloadUrl: release.url,\n transport: \"raw\",\n };\n}\n\nasync function downloadFullCliBinaryArtifact(input: {\n downloadTimeoutMs: number;\n fetchImpl: typeof fetch;\n plan: CliBinaryFullUpdatePlan;\n release: CliBinaryRelease;\n}): Promise<Buffer> {\n const response = await input.fetchImpl(input.plan.downloadUrl, {\n method: \"GET\",\n signal: AbortSignal.timeout(input.downloadTimeoutMs),\n });\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new Error(\n `binary download failed: HTTP ${response.status}${body ? `: ${body}` : \"\"}`\n );\n }\n const downloadBytes = Buffer.from(await response.arrayBuffer());\n verifyBinaryBytes({\n bytes: downloadBytes,\n expectedSha256: input.plan.downloadSha256,\n expectedSizeBytes: input.plan.downloadSizeBytes,\n label:\n input.plan.transport === \"archive\" ? \"binary archive\" : \"binary download\",\n });\n let artifactBytes = downloadBytes;\n if (input.plan.transport === \"archive\") {\n try {\n artifactBytes = gunzipSync(downloadBytes, {\n maxOutputLength: input.release.sizeBytes,\n });\n } catch (error) {\n throw new Error(\n `binary archive could not be decompressed: ${toError(error).message}`\n );\n }\n }\n verifyBinaryBytes({\n bytes: artifactBytes,\n expectedSha256: input.release.sha256,\n expectedSizeBytes: input.release.sizeBytes,\n label: \"binary download\",\n });\n return artifactBytes;\n}\n\nfunction hasCompressedCliBinaryTransport(\n release: CliBinaryRelease\n): release is CliBinaryRelease & {\n archiveFormat: \"gzip\";\n archiveUrl: string;\n archiveSha256: string;\n archiveSizeBytes: number;\n} {\n return (\n release.archiveFormat === \"gzip\" &&\n typeof release.archiveUrl === \"string\" &&\n typeof release.archiveSha256 === \"string\" &&\n typeof release.archiveSizeBytes === \"number\"\n );\n}\n\nfunction verifyBinaryBytes(input: {\n bytes: Buffer;\n expectedSha256: string;\n expectedSizeBytes: number;\n label: string;\n}): void {\n if (input.bytes.byteLength !== input.expectedSizeBytes) {\n throw new Error(\n `${input.label} size mismatch: expected ${input.expectedSizeBytes} bytes, received ${input.bytes.byteLength} bytes`\n );\n }\n const actualSha256 = createHash(\"sha256\").update(input.bytes).digest(\"hex\");\n if (actualSha256 !== input.expectedSha256.toLowerCase()) {\n throw new Error(\n `${input.label} sha256 mismatch: expected ${input.expectedSha256.toLowerCase()}, received ${actualSha256}`\n );\n }\n}\n\nfunction commandFailureDetails(result: CommandResult): string {\n return result.stderr.trim() || result.stdout.trim() || `exit ${result.code}`;\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n DAEMON_SERVICE_RUNTIME_AUTO_START_ENV,\n DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV,\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV,\n daemonRuntimeRootPath,\n} from \"./daemon-state\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n resolveOpenMeldServiceScope,\n} from \"./paths\";\n\nconst MANAGED_VERSION_FROM_EXECUTABLE_PATTERN =\n /[\\\\/]versions[\\\\/](v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)[\\\\/]openmeld(?:\\.exe)?/gu;\nconst SELF_CONTAINED_BUNDLE_FROM_EXECUTABLE_PATTERN =\n /[\\\\/]runtime[\\\\/]daemon[\\\\/]bundles[\\\\/]([0-9A-Za-z._-]+)[\\\\/]/gu;\n\nexport const INDEPENDENT_MAINTENANCE_REGISTRATION =\n \"openmeld-independent-maintenance-v1\";\n\n// Maintenance may call normal Service commands, but it is never the main\n// Service process. Also normalize registrations written by older versions.\nexport function configureDaemonMaintenanceEnvironment(\n env: NodeJS.ProcessEnv\n): void {\n for (const key of [\n DAEMON_SERVICE_RUNTIME_AUTO_START_ENV,\n DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV,\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV,\n ]) {\n delete env[key];\n }\n env.OPENMELD_INTERNAL_MAINTENANCE_WORKER = \"1\";\n}\nconst NPM_ENTRY_IMPORT_PATTERN = /^await import\\((\".*\")\\);$/mu;\n\nexport function daemonServiceUpdateWorkerNpmEntryPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-update-worker.mjs\");\n}\n\nexport async function hasIndependentMaintenanceRegistration(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform,\n expectedDefinition?: string\n): Promise<boolean> {\n if (platform === \"win32\") {\n const { runWindowsUserTask, readWindowsTaskAction } = await import(\n \"../local-service/lifecycle/windows-user-task\"\n );\n const task = await runWindowsUserTask({\n name: resolveDaemonServiceUpdateWorkerIdentity(pathInput)\n .windowsServiceName,\n legacyScript:\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput),\n operation: \"status\",\n });\n return Boolean(\n task.installed &&\n !task.legacy &&\n task.actionArguments &&\n (expectedDefinition === undefined ||\n task.actionArguments === expectedDefinition) &&\n resolveOpenMeldRootDir({\n env: readWindowsTaskAction(task.actionArguments).env,\n }) === resolveOpenMeldRootDir(pathInput)\n );\n }\n const registration = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n if (!registration?.includes(INDEPENDENT_MAINTENANCE_REGISTRATION)) {\n return false;\n }\n if (expectedDefinition !== undefined && registration !== expectedDefinition) {\n return false;\n }\n const { parseDaemonServiceEnvironmentFromDefinition } = await import(\n \"../local-service/lifecycle/daemon-service-manager\"\n );\n const env = parseDaemonServiceEnvironmentFromDefinition({\n controller: platform === \"darwin\" ? \"launchd\" : \"systemd\",\n definition: registration,\n });\n return resolveOpenMeldRootDir({ env }) === resolveOpenMeldRootDir(pathInput);\n}\n\nexport type DaemonServiceUpdateWorkerIdentity = {\n launchdLabel: string;\n serviceName: string;\n windowsDisplayName: string;\n windowsServiceName: string;\n};\n\nexport function resolveDaemonServiceUpdateWorkerIdentity(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceUpdateWorkerIdentity {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n const scope = resolveOpenMeldServiceScope(pathInput);\n const suffix =\n (preset === \"prod\" ? \"\" : `-${preset}`) + (scope ? `-${scope}` : \"\");\n const dotSuffix =\n (preset === \"prod\" ? \"\" : `.${preset}`) + (scope ? `.${scope}` : \"\");\n return {\n launchdLabel: `com.openmeld.openmeld-service-update${dotSuffix}`,\n serviceName: `openmeld-service-update${suffix}`,\n windowsDisplayName: `OpenMeld Service Update${\n preset === \"prod\" ? \"\" : ` (${preset})`\n }`,\n windowsServiceName: `OpenMeld-Service-Update${suffix}`,\n };\n}\n\nexport function resolveDaemonServiceUpdateWorkerLaunchdPlistPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \"Library\",\n \"LaunchAgents\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).launchdLabel}.plist`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.service`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.path`\n );\n}\n\nexport function resolveDaemonServiceUpdateWorkerWindowsScriptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-update-worker.bat\");\n}\n\nexport function resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n pathInput.homeDir ?? homedir(),\n \".config\",\n \"systemd\",\n \"user\",\n `${resolveDaemonServiceUpdateWorkerIdentity(pathInput).serviceName}.timer`\n );\n}\n\nexport async function readDaemonServiceUpdateWorkerProtectedManagedVersions(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform\n): Promise<Set<string>> {\n const contents = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n return contents === null\n ? new Set()\n : readManagedVersionsFromUpdateWorkerRegistration(contents);\n}\n\nexport async function readDaemonServiceUpdateWorkerProtectedBundleIds(\n pathInput: OpenMeldPathResolutionInput = {},\n platform: NodeJS.Platform = process.platform\n): Promise<Set<string>> {\n const contents = await readDaemonServiceUpdateWorkerRegistration(\n pathInput,\n platform\n );\n const protectedIds =\n contents === null\n ? new Set<string>()\n : readBundleIdsFromUpdateWorkerRegistration(contents);\n const launcherPath = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n const launcher = await readFile(launcherPath, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (launcher !== null) {\n const importLine = launcher.trim().match(NPM_ENTRY_IMPORT_PATTERN);\n if (!importLine?.[1]) {\n throw new Error(\n \"OpenMeld maintenance launcher is invalid; bundle cleanup was stopped.\"\n );\n }\n const entryPath = fileURLToPath(JSON.parse(importLine[1]) as string);\n for (const id of readBundleIdsFromUpdateWorkerRegistration(entryPath)) {\n protectedIds.add(id);\n }\n }\n return protectedIds;\n}\n\nexport function readManagedVersionsFromUpdateWorkerRegistration(\n contents: string\n): Set<string> {\n const versions = new Set<string>();\n for (const match of contents.matchAll(\n MANAGED_VERSION_FROM_EXECUTABLE_PATTERN\n )) {\n const version = match[1];\n if (version) {\n versions.add(version);\n }\n }\n return versions;\n}\n\nexport function readBundleIdsFromUpdateWorkerRegistration(\n contents: string\n): Set<string> {\n const bundleIds = new Set<string>();\n for (const match of contents.matchAll(\n SELF_CONTAINED_BUNDLE_FROM_EXECUTABLE_PATTERN\n )) {\n const bundleId = match[1];\n if (bundleId) {\n bundleIds.add(bundleId);\n }\n }\n return bundleIds;\n}\n\nexport function resolveDaemonServiceUpdateWorkerRegistrationPath(\n pathInput: OpenMeldPathResolutionInput,\n platform: NodeJS.Platform\n): string | null {\n if (platform === \"darwin\") {\n return resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput);\n }\n if (platform === \"linux\") {\n return resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput);\n }\n if (platform === \"win32\") {\n return resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n }\n return null;\n}\n\nasync function readDaemonServiceUpdateWorkerRegistration(\n pathInput: OpenMeldPathResolutionInput,\n platform: NodeJS.Platform\n): Promise<string | null> {\n const registrationPath = resolveDaemonServiceUpdateWorkerRegistrationPath(\n pathInput,\n platform\n );\n if (registrationPath === null) {\n return null;\n }\n return await readFile(registrationPath, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n}\n\nfunction getErrorCode(error: unknown): string | null {\n return error && typeof error === \"object\" && \"code\" in error\n ? String(error.code)\n : null;\n}\n","","import { cliBinaryServiceReleaseSchema } from \"@openmeld/schemas\";\nimport packageJson from \"../../package.json\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport type { CliBinaryReleaseInfo } from \"./version-state\";\n\ndeclare const __OPENMELD_SERVICE_RELEASE__: unknown;\n\n// The release embeds its selected Service artifact so setup and repair use the\n// same target offline, without a second mutable version cache. Legacy releases\n// continue to use their own CLI binary as the Service carrier.\nexport function resolveBundledServiceRelease():\n | CliBinaryReleaseInfo\n | undefined {\n if (!isBinaryDistribution()) {\n return undefined;\n }\n const metadata = packageJson as { openmeld?: { service?: unknown } };\n const selection =\n typeof __OPENMELD_SERVICE_RELEASE__ === \"undefined\"\n ? metadata.openmeld?.service\n : __OPENMELD_SERVICE_RELEASE__;\n if (selection === undefined) {\n return undefined;\n }\n const parsed = cliBinaryServiceReleaseSchema.safeParse(selection);\n if (!parsed.success) {\n throw new Error(\n \"The installed CLI contains invalid Service release metadata.\"\n );\n }\n const platform = `${process.platform}-${process.arch}`;\n const artifact = parsed.data.platforms[platform];\n if (!artifact) {\n throw new Error(\n `The installed CLI has no Service artifact for ${platform}.`\n );\n }\n return {\n ...artifact,\n version: parsed.data.version,\n platform,\n minRequiredCliVersion: null,\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type CliBinaryManifest,\n type CliBinaryRelease,\n cliBinaryManifestSchema,\n} from \"@openmeld/schemas\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport { openMeldRootDir } from \"./paths\";\n\nconst VERSION_STATE_FILENAME = \"version.json\";\nconst NPM_REGISTRY_LATEST_TIMEOUT_MS = 5000;\nconst VERSION_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst LEADING_V_PREFIX_REGEX = /^v/;\nconst SEMVER_CORE_REGEX =\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+.*)?$/;\nconst NUMERIC_SEMVER_IDENTIFIER_REGEX = /^\\d+$/;\nconst versionCache = new Map<\n string,\n { info: PackageLatestInfo; fetchedAt: number }\n>();\nconst versionMetadataCache = new Map<\n string,\n {\n metadata: PackageVersionMetadata;\n fetchedAt: number;\n }\n>();\nconst inFlightVersionRequests = new Map<string, Promise<PackageLatestInfo>>();\nconst inFlightVersionMetadataRequests = new Map<\n string,\n Promise<PackageVersionMetadata>\n>();\n\nexport type OpenMeldVersionStateV1 = {\n v: 1;\n last_version?: string;\n latest_version?: string;\n last_checked_at?: string;\n dismissed_version?: string | null;\n // Projection of the published \"minimum required CLI version\" floor\n // (`openmeld.minRequiredCliVersion` on the npm `latest` manifest). Cached so the\n // forced-update gate can read it without a network probe on every command.\n required_floor?: string | null;\n updated_at: string;\n};\n\nexport type PackageVersionMetadata = {\n version: string;\n deprecated: string | null;\n};\n\nexport type PackageLatestInfo = {\n version: string;\n minRequiredCliVersion: string | null;\n serviceVersion?: string;\n};\n\nexport type CliBinaryReleaseInfo = PackageLatestInfo &\n CliBinaryRelease & {\n platform: string;\n service?: CliBinaryRelease & { version: string; platform: string };\n };\n\nexport function versionStatePath(): string {\n return join(openMeldRootDir(), VERSION_STATE_FILENAME);\n}\n\nexport async function readVersionState(): Promise<OpenMeldVersionStateV1 | null> {\n const raw = await readFile(versionStatePath(), \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<OpenMeldVersionStateV1>;\n if (parsed.v !== 1 || typeof parsed.updated_at !== \"string\") {\n return null;\n }\n const lastVersion = toNonEmptyString(parsed.last_version);\n const latestVersion = toNonEmptyString(parsed.latest_version);\n const lastCheckedAt = toNonEmptyString(parsed.last_checked_at);\n const dismissedVersion =\n parsed.dismissed_version === null\n ? null\n : toNonEmptyString(parsed.dismissed_version);\n const requiredFloor = parseStoredRequiredFloor(parsed.required_floor);\n const next: OpenMeldVersionStateV1 = {\n v: 1,\n ...(lastVersion ? { last_version: lastVersion } : {}),\n ...(latestVersion ? { latest_version: latestVersion } : {}),\n ...(lastCheckedAt ? { last_checked_at: lastCheckedAt } : {}),\n ...(dismissedVersion === undefined\n ? {}\n : { dismissed_version: dismissedVersion }),\n ...(requiredFloor === undefined ? {} : { required_floor: requiredFloor }),\n updated_at: parsed.updated_at,\n };\n return next;\n } catch {\n return null;\n }\n}\n\nexport async function writeVersionState(\n state: OpenMeldVersionStateV1\n): Promise<void> {\n await mkdir(openMeldRootDir(), { recursive: true });\n await writeFile(versionStatePath(), `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nexport function createInitialVersionState(input: {\n currentVersion: string;\n checkedAt?: string;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: input.currentVersion,\n last_checked_at: checkedAt,\n dismissed_version: null,\n updated_at: checkedAt,\n };\n}\n\nexport function hasValidLastVersion(\n state: OpenMeldVersionStateV1 | null\n): boolean {\n return Boolean(toNonEmptyString(state?.last_version));\n}\n\nexport async function ensureVersionStateReady(input: {\n currentVersion: string;\n}): Promise<OpenMeldVersionStateV1> {\n const previousVersionState = await readVersionState();\n if (!previousVersionState) {\n const nextState = createInitialVersionState({\n currentVersion: input.currentVersion,\n });\n await writeVersionState(nextState);\n return nextState;\n }\n\n if (hasValidLastVersion(previousVersionState)) {\n return previousVersionState;\n }\n\n const nextState: OpenMeldVersionStateV1 = {\n ...previousVersionState,\n last_version: input.currentVersion,\n latest_version: previousVersionState.latest_version ?? input.currentVersion,\n };\n await writeVersionState(nextState);\n return nextState;\n}\n\nexport function buildNextVersionState(input: {\n previous: OpenMeldVersionStateV1 | null;\n currentVersion: string;\n latestVersion?: string;\n checkedAt?: string;\n dismissedVersion?: string | null;\n // When provided (including `null`), overwrites the cached floor with the\n // freshly observed value; when omitted, the previous floor is carried\n // forward so callers that do not resolve the floor leave it untouched.\n requiredFloor?: string | null;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n const latestVersion =\n toNonEmptyString(input.latestVersion) ??\n toNonEmptyString(input.previous?.latest_version) ??\n input.currentVersion;\n const requiredFloor =\n input.requiredFloor === undefined\n ? (input.previous?.required_floor ?? null)\n : input.requiredFloor;\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: latestVersion,\n last_checked_at: checkedAt,\n dismissed_version:\n input.dismissedVersion ?? input.previous?.dismissed_version ?? null,\n ...(requiredFloor ? { required_floor: requiredFloor } : {}),\n updated_at: checkedAt,\n };\n}\n\nfunction parseStoredRequiredFloor(value: unknown): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n return toNonEmptyString(value);\n}\n\nexport async function fetchLatestPackageInfo(\n packageName: string,\n input: { forceRefresh?: boolean } = {}\n): Promise<PackageLatestInfo> {\n const now = Date.now();\n const cached = input.forceRefresh ? undefined : versionCache.get(packageName);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.info;\n }\n\n const requestKey = input.forceRefresh\n ? `${packageName}:force_refresh`\n : packageName;\n const inFlight = inFlightVersionRequests.get(requestKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestLatestPackageInfo(packageName);\n inFlightVersionRequests.set(requestKey, request);\n\n try {\n const info = await request;\n versionCache.set(packageName, {\n info,\n fetchedAt: Date.now(),\n });\n return info;\n } finally {\n inFlightVersionRequests.delete(requestKey);\n }\n}\n\nexport async function fetchLatestPackageVersion(\n packageName: string\n): Promise<string> {\n const info = await fetchLatestPackageInfo(packageName);\n return info.version;\n}\n\nexport async function fetchLatestCliBinaryRelease(input?: {\n platform?: string;\n}): Promise<CliBinaryReleaseInfo> {\n const manifest = await requestCliBinaryManifest();\n const platform =\n toNonEmptyString(input?.platform) ?? `${process.platform}-${process.arch}`;\n const release = manifest.platforms[platform];\n if (!release) {\n throw new Error(\n `version check failed: invalid CLI manifest response: missing platform ${platform}`\n );\n }\n const serviceRelease = manifest.service?.platforms[platform];\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n platform,\n ...release,\n ...(manifest.service && serviceRelease\n ? {\n service: {\n ...serviceRelease,\n version: manifest.service.version,\n platform,\n },\n }\n : {}),\n };\n}\n\nexport async function fetchPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n const packageName = input.packageName.trim();\n const version = input.version.trim();\n const cacheKey = `${packageName}@${version}`;\n const now = Date.now();\n const cached = versionMetadataCache.get(cacheKey);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.metadata;\n }\n\n const inFlight = inFlightVersionMetadataRequests.get(cacheKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestPackageVersionMetadata({\n packageName,\n version,\n });\n inFlightVersionMetadataRequests.set(cacheKey, request);\n\n try {\n const metadata = await request;\n versionMetadataCache.set(cacheKey, {\n metadata,\n fetchedAt: Date.now(),\n });\n return metadata;\n } finally {\n inFlightVersionMetadataRequests.delete(cacheKey);\n }\n}\n\nexport function resetVersionCheckCacheForTests(): void {\n versionCache.clear();\n versionMetadataCache.clear();\n inFlightVersionRequests.clear();\n inFlightVersionMetadataRequests.clear();\n}\n\nasync function requestLatestPackageInfo(\n packageName: string\n): Promise<PackageLatestInfo> {\n if (isBinaryDistribution()) {\n return await requestLatestPackageInfoFromCliManifest();\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as { version?: unknown; openmeld?: unknown };\n const version =\n typeof parsed.version === \"string\" ? parsed.version.trim() : \"\";\n if (!version) {\n throw new Error(\"missing version\");\n }\n return {\n version,\n minRequiredCliVersion: readMinRequiredCliVersion(parsed.openmeld),\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// Binary distribution reads the same version-gate inputs (latest version +\n// minRequiredCliVersion floor) from the R2 cli/manifest.json instead of the npm\n// registry. The gate logic (floorBreached) is unchanged; only the data source\n// differs. The URL is a production Web route; override with\n// OPENMELD_CLI_BINARY_MANIFEST_URL for non-prod lanes.\nconst CLI_BINARY_MANIFEST_URL =\n toNonEmptyString(process.env.OPENMELD_CLI_BINARY_MANIFEST_URL) ??\n \"https://openmeld.ai/cli/manifest.json\";\n\nasync function requestLatestPackageInfoFromCliManifest(): Promise<PackageLatestInfo> {\n const manifest = await requestCliBinaryManifest();\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n ...(manifest.service ? { serviceVersion: manifest.service.version } : {}),\n };\n}\n\ntype ParsedCliBinaryManifest = CliBinaryManifest[\"channels\"][\"stable\"] & {\n minRequiredCliVersion: string | null;\n};\n\nasync function requestCliBinaryManifest(): Promise<ParsedCliBinaryManifest> {\n const response = await fetch(CLI_BINARY_MANIFEST_URL, {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n return parseCliBinaryManifest(raw);\n } catch (error) {\n throw new Error(\n `version check failed: invalid CLI manifest response: ${toErrorMessage(error)}`\n );\n }\n}\n\nfunction parseCliBinaryManifest(raw: string): ParsedCliBinaryManifest {\n const parsed = cliBinaryManifestSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const stable = parsed.data.channels.stable;\n return {\n ...stable,\n minRequiredCliVersion: stable.minRequiredCliVersion ?? null,\n };\n}\n\nfunction readMinRequiredCliVersion(openmeld: unknown): string | null {\n if (!openmeld || typeof openmeld !== \"object\") {\n return null;\n }\n const value = (openmeld as { minRequiredCliVersion?: unknown })\n .minRequiredCliVersion;\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n // A malformed floor must be treated as \"no signal\", never a hard gate:\n // `compareSemver` falls back to lexical compare on unparseable input, which\n // could wrongly read as a floor breach. Validate before trusting it.\n return trimmed.length > 0 && isPlainReleaseVersion(trimmed) ? trimmed : null;\n}\n\nasync function requestPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n if (isBinaryDistribution()) {\n // Binary distribution has no npm-style per-version deprecation metadata.\n return { version: input.version, deprecated: null };\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(input.packageName)}/${encodeURIComponent(input.version)}`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as {\n version?: unknown;\n deprecated?: unknown;\n };\n const resolvedVersion =\n typeof parsed.version === \"string\" && parsed.version.trim().length > 0\n ? parsed.version.trim()\n : input.version;\n const deprecated =\n typeof parsed.deprecated === \"string\" &&\n parsed.deprecated.trim().length > 0\n ? parsed.deprecated.trim()\n : null;\n return {\n version: resolvedVersion,\n deprecated,\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// A forced-update floor must be a plain published release version — no\n// prerelease, no build metadata. This is stricter than general semver on\n// purpose: it rejects malformed values (e.g. \"9.0.0+bad meta\") so they fail\n// open instead of hard-gating, and sidesteps prerelease-precedence ambiguity\n// since a floor is always a shipped stable release. Must match the release\n// tool's plain-version check in scripts/release/local-components.mjs.\nconst PLAIN_RELEASE_VERSION_RE = /^\\d+\\.\\d+\\.\\d+$/;\n\nexport function isPlainReleaseVersion(value: string): boolean {\n return PLAIN_RELEASE_VERSION_RE.test(value.trim());\n}\n\nexport function compareSemver(a: string, b: string): number {\n const left = parseSemver(a);\n const right = parseSemver(b);\n if (!(left && right)) {\n return a.localeCompare(b);\n }\n if (left.major !== right.major) {\n return left.major > right.major ? 1 : -1;\n }\n if (left.minor !== right.minor) {\n return left.minor > right.minor ? 1 : -1;\n }\n if (left.patch !== right.patch) {\n return left.patch > right.patch ? 1 : -1;\n }\n return comparePrereleaseIdentifiers(left.prerelease, right.prerelease);\n}\n\nfunction parseSemver(value: string): {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n} | null {\n const normalized = value.trim().replace(LEADING_V_PREFIX_REGEX, \"\");\n const match = normalized.match(SEMVER_CORE_REGEX);\n if (!match) {\n return null;\n }\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : null,\n };\n}\n\nfunction comparePrereleaseIdentifiers(\n left: string[] | null,\n right: string[] | null\n): number {\n if (!(left || right)) {\n return 0;\n }\n if (!left) {\n return 1;\n }\n if (!right) {\n return -1;\n }\n\n const maxLength = Math.max(left.length, right.length);\n for (let index = 0; index < maxLength; index += 1) {\n const leftIdentifier = left[index];\n const rightIdentifier = right[index];\n const lengthComparison = comparePrereleaseLengthAtIndex(\n leftIdentifier,\n rightIdentifier\n );\n if (lengthComparison !== 0) {\n return lengthComparison;\n }\n if (!(leftIdentifier && rightIdentifier)) {\n continue;\n }\n const compared = compareSinglePrereleaseIdentifier(\n leftIdentifier,\n rightIdentifier\n );\n if (compared !== 0) {\n return compared;\n }\n }\n return 0;\n}\n\nfunction comparePrereleaseLengthAtIndex(\n leftIdentifier: string | undefined,\n rightIdentifier: string | undefined\n): number {\n if (leftIdentifier === undefined && rightIdentifier === undefined) {\n return 0;\n }\n if (leftIdentifier === undefined) {\n return -1;\n }\n if (rightIdentifier === undefined) {\n return 1;\n }\n return 0;\n}\n\nfunction compareSinglePrereleaseIdentifier(\n leftIdentifier: string,\n rightIdentifier: string\n): number {\n if (leftIdentifier === rightIdentifier) {\n return 0;\n }\n\n const leftNumber = toNumericPrereleaseIdentifier(leftIdentifier);\n const rightNumber = toNumericPrereleaseIdentifier(rightIdentifier);\n if (leftNumber !== null && rightNumber !== null) {\n if (leftNumber === rightNumber) {\n return 0;\n }\n return leftNumber > rightNumber ? 1 : -1;\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return leftIdentifier > rightIdentifier ? 1 : -1;\n}\n\nfunction toNumericPrereleaseIdentifier(identifier: string): number | null {\n if (!NUMERIC_SEMVER_IDENTIFIER_REGEX.test(identifier)) {\n return null;\n }\n return Number(identifier);\n}\n\nfunction toNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n daemonServiceUpdateJobSchema,\n OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n storedDaemonServiceUpdateJobSchema,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldToolsUpdateOperation,\n DaemonServiceUpdateJob as SharedDaemonServiceUpdateJob,\n} from \"@openmeld/schemas/types\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\n\nconst TERMINAL_UPDATE_VISIBILITY_MS = 24 * 60 * 60 * 1000;\n\nexport const DAEMON_SERVICE_UPDATE_JOB_SCHEMA =\n OPENMELD_DAEMON_SERVICE_UPDATE_JOB_SCHEMA;\nexport type DaemonServiceUpdateJob = SharedDaemonServiceUpdateJob;\n\nexport function daemonServicePendingUpdatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"service-update.json\");\n}\n\nexport function daemonServiceLastUpdatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n \"service-update-last.json\"\n );\n}\n\nexport async function readPendingDaemonServiceUpdate(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateJob | null> {\n return await readDaemonServiceUpdateJob(\n daemonServicePendingUpdatePath(pathInput)\n );\n}\n\nexport async function readLastDaemonServiceUpdate(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateJob | null> {\n return await readDaemonServiceUpdateJob(\n daemonServiceLastUpdatePath(pathInput)\n );\n}\n\nexport async function persistPendingDaemonServiceUpdate(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeUpdateJobAtomically({\n job,\n path: daemonServicePendingUpdatePath(pathInput),\n });\n}\n\nexport async function completePendingDaemonServiceUpdate(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {},\n retainPending = false\n): Promise<void> {\n await writeUpdateJobAtomically({\n job,\n path: daemonServiceLastUpdatePath(pathInput),\n });\n if (retainPending) {\n // Keep the existing OS trigger until Prepare and its auth handoff finish.\n // The update itself is terminal; this does not schedule another update.\n await persistPendingDaemonServiceUpdate(job, pathInput);\n return;\n }\n await rm(daemonServicePendingUpdatePath(pathInput), { force: true });\n}\n\nexport async function resolveDaemonServiceUpdateOperation(\n pathInput: OpenMeldPathResolutionInput = {},\n nowMs = Date.now()\n): Promise<OpenMeldToolsUpdateOperation | null> {\n const pending = await readPendingDaemonServiceUpdate(pathInput);\n if (pending) {\n return projectUpdateOperation(pending);\n }\n const last = await readLastDaemonServiceUpdate(pathInput);\n if (!(last && isRecentTerminalUpdate(last, nowMs))) {\n return null;\n }\n return projectUpdateOperation(last);\n}\n\nfunction isRecentTerminalUpdate(\n job: DaemonServiceUpdateJob,\n nowMs: number\n): boolean {\n if (\n job.phase !== \"updated\" &&\n job.phase !== \"restored\" &&\n job.phase !== \"needs_help\"\n ) {\n return false;\n }\n const updatedAtMs = Date.parse(job.updatedAt);\n return (\n Number.isFinite(updatedAtMs) &&\n nowMs >= updatedAtMs &&\n nowMs - updatedAtMs <= TERMINAL_UPDATE_VISIBILITY_MS\n );\n}\n\nfunction projectUpdateOperation(\n job: DaemonServiceUpdateJob\n): OpenMeldToolsUpdateOperation {\n return {\n operationId: job.jobId,\n phase: job.phase,\n requestSource: job.requestSource,\n requestedAt: job.requestedAt,\n targetVersion: job.targetVersion,\n updatedAt: job.updatedAt,\n urgency: job.urgency,\n };\n}\n\nasync function readDaemonServiceUpdateJob(\n path: string\n): Promise<DaemonServiceUpdateJob | null> {\n const raw = await readFile(path, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n if (raw === null) {\n return null;\n }\n const parsed = storedDaemonServiceUpdateJobSchema.safeParse(\n JSON.parse(raw) as unknown\n );\n if (!parsed.success) {\n throw new Error(\"OpenMeld Service update state is invalid.\");\n }\n if (parsed.data.v === 2) {\n return parsed.data;\n }\n const { status, ...legacyJob } = parsed.data;\n return daemonServiceUpdateJobSchema.parse({\n ...legacyJob,\n v: 2,\n schema: DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n phase: migrateLegacyPhase(status),\n requestSource: \"cli\",\n });\n}\n\nfunction migrateLegacyPhase(\n status: \"scheduled\" | \"running\" | \"completed\" | \"failed\"\n): DaemonServiceUpdateJob[\"phase\"] {\n switch (status) {\n case \"scheduled\":\n return \"waiting_for_work\";\n case \"running\":\n return \"updating\";\n case \"completed\":\n return \"updated\";\n case \"failed\":\n return \"needs_help\";\n default: {\n const exhaustive: never = status;\n return exhaustive;\n }\n }\n}\n\nasync function writeUpdateJobAtomically(input: {\n job: DaemonServiceUpdateJob;\n path: string;\n}): Promise<void> {\n const temporaryPath = `${input.path}.${String(process.pid)}.tmp`;\n await mkdir(dirname(input.path), { recursive: true });\n await writeFile(temporaryPath, `${JSON.stringify(input.job, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, input.path);\n}\n","import packageJson from \"../../package.json\";\n\ndeclare const __OPENMELD_VERSION__: string | undefined;\n\n/**\n * The version of the running CLI and Service bundle.\n *\n * npm builds use package.json. Binary builds may inject an isolated staging\n * prerelease so the real update lifecycle can be exercised before a production\n * version exists.\n */\nexport function resolveOpenMeldVersion(): string {\n const injected =\n typeof __OPENMELD_VERSION__ === \"string\" ? __OPENMELD_VERSION__.trim() : \"\";\n return injected || packageJson.version;\n}\n\nexport const OPENMELD_VERSION = resolveOpenMeldVersion();\n","import { constants as fsConstants } from \"node:fs\";\nimport { access, readdir, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n type OpenMeldPathResolutionInput,\n openMeldVersionsDir,\n} from \"../config/paths\";\nimport { compareSemver } from \"../config/version-state\";\n\nconst MANAGED_VERSION_DIRECTORY_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport async function pruneManagedVersions(input: {\n currentVersion: string;\n pathInput?: OpenMeldPathResolutionInput;\n preferredRollbackVersion?: string | null;\n protectedVersions?: Iterable<string>;\n}): Promise<void> {\n const versionsDir = openMeldVersionsDir(input.pathInput);\n const entries = await readdir(versionsDir, { withFileTypes: true });\n const managedVersions = entries\n .filter(\n (entry) =>\n entry.isDirectory() &&\n MANAGED_VERSION_DIRECTORY_PATTERN.test(entry.name)\n )\n .map((entry) => entry.name);\n const usableManagedVersions = new Set(\n (\n await Promise.all(\n managedVersions.map(async (version) => ({\n usable: await isUsableManagedVersion(version, versionsDir),\n version,\n }))\n )\n )\n .filter((entry) => entry.usable)\n .map((entry) => entry.version)\n );\n const retainedVersions = new Set([input.currentVersion]);\n let rollbackVersion: string | null = null;\n\n if (\n input.preferredRollbackVersion &&\n input.preferredRollbackVersion !== input.currentVersion &&\n usableManagedVersions.has(input.preferredRollbackVersion)\n ) {\n rollbackVersion = input.preferredRollbackVersion;\n }\n\n rollbackVersion ??=\n [...usableManagedVersions]\n .filter((version) => compareSemver(version, input.currentVersion) < 0)\n .sort((left, right) => compareSemver(right, left))[0] ?? null;\n\n if (rollbackVersion) {\n retainedVersions.add(rollbackVersion);\n }\n\n // A legacy worker can still point at a versioned binary until its service\n // registration is rewritten to the stable carrier. Protect that executable\n // independently from the last-known-good rollback selection; the worker\n // manager prunes again after the stable registration is active.\n for (const protectedVersion of input.protectedVersions ?? []) {\n if (usableManagedVersions.has(protectedVersion)) {\n retainedVersions.add(protectedVersion);\n }\n }\n\n await Promise.all(\n managedVersions\n .filter((version) => !retainedVersions.has(version))\n .map((version) =>\n rm(path.join(versionsDir, version), { recursive: true })\n )\n );\n}\n\nasync function isUsableManagedVersion(\n version: string,\n versionsDir: string\n): Promise<boolean> {\n const target = path.join(versionsDir, version, \"openmeld\");\n const stats = await stat(target).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (!stats?.isFile()) {\n return false;\n }\n return await access(target, fsConstants.X_OK).then(\n () => true,\n (error) => {\n if (\n getErrorCode(error) === \"EACCES\" ||\n getErrorCode(error) === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n );\n}\n\nfunction getErrorCode(error: unknown): string | null {\n return error && typeof error === \"object\" && \"code\" in error\n ? String(error.code)\n : null;\n}\n","import { constants as fsConstants } from \"node:fs\";\nimport {\n access,\n chmod,\n copyFile,\n lstat,\n mkdir,\n readlink,\n rename,\n rm,\n stat,\n symlink,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { readDaemonServiceUpdateWorkerProtectedManagedVersions } from \"../config/daemon-service-update-worker-registration\";\nimport {\n acquireLock,\n isOpenMeldLockError,\n isOpenMeldOrphanedLockError,\n runWithHeldLock,\n} from \"../config/lock\";\nimport {\n type OpenMeldPathResolutionInput,\n openMeldBinDir,\n openMeldManagedBinaryPath,\n openMeldManagedVersionBinaryPath,\n openMeldManagedVersionDir,\n} from \"../config/paths\";\nimport { assertNoPublishedProductionMutationDuringTests } from \"../config/published-production-safety\";\nimport { compareSemver } from \"../config/version-state\";\nimport { readDaemonActiveBundleState } from \"../local-service/lifecycle/daemon-service-bundle\";\nimport { readPendingDaemonServiceUpdate } from \"../local-service/lifecycle/daemon-service-update-state\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\nimport { pruneManagedVersions } from \"./managed-version-pruning\";\n\nexport type CliInstallSelfResult =\n | \"installed\"\n | \"noop_same_version\"\n | \"noop_newer_present\";\n\nconst MANAGED_INSTALL_LOCK_PROFILE = \"managed-cli\";\nconst MANAGED_INSTALL_LOCK_KEY = \"install\";\nconst MANAGED_INSTALL_LOCK_RETRY_DELAY_MS = 100;\nconst MANAGED_INSTALL_LOCK_TIMEOUT_MS = 30_000;\n\n/**\n * Result of installing this binary into the managed layout. This is the shape\n * `openmeld install-self --json` emits and the seam Desktop consumes, so it is\n * treated as a frozen contract (covered by shape tests).\n */\nexport type CliInstallSelfOutcome = {\n result: CliInstallSelfResult;\n version: string;\n platform: string;\n // Absolute path of the versioned binary: <root>/versions/<version>/openmeld.\n managedBinaryPath: string;\n // Absolute path of the current-version pointer: <root>/bin/openmeld.\n currentPointerPath: string;\n // Version the current pointer resolved to before this run, if any.\n previousVersion: string | null;\n forced: boolean;\n};\n\nexport function resolveCliPlatformToken(): string {\n return `${process.platform}-${process.arch}`;\n}\n\nexport function resolveCliSelfVersion(): string {\n return OPENMELD_VERSION;\n}\n\nasync function isUsableManagedBinary(target: string): Promise<boolean> {\n const stats = await stat(target).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\")) {\n return null;\n }\n throw error;\n });\n if (!stats?.isFile()) {\n return false;\n }\n return await access(target, fsConstants.X_OK).then(\n () => true,\n (error) => {\n if (\n isErrorWithCode(error, \"EACCES\") ||\n isErrorWithCode(error, \"ENOENT\")\n ) {\n return false;\n }\n throw error;\n }\n );\n}\n\n// The version the current pointer resolves to, read from its symlink target's\n// versions/<version>/ segment. Returns null when there is no pointer yet or it\n// does not resolve into the managed layout.\nasync function readCurrentPointerVersion(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n const pointerPath = openMeldManagedBinaryPath(pathInput);\n const target = await readlink(pointerPath).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\") || isErrorWithCode(error, \"EINVAL\")) {\n return null;\n }\n throw error;\n });\n if (!target) {\n return null;\n }\n const resolved = path.isAbsolute(target)\n ? target\n : path.resolve(path.dirname(pointerPath), target);\n const version = path.basename(path.dirname(resolved));\n return version.length > 0 &&\n path.resolve(resolved) ===\n openMeldManagedVersionBinaryPath(version, pathInput)\n ? version\n : null;\n}\n\nexport async function readManagedCliInstallation(): Promise<{\n version: string;\n binaryPath: string;\n} | null> {\n const version = await readCurrentPointerVersion();\n if (!version) {\n return null;\n }\n const binaryPath = openMeldManagedVersionBinaryPath(version);\n if (!(await isUsableManagedBinary(binaryPath))) {\n return null;\n }\n return { version, binaryPath };\n}\n\n/**\n * Install the currently-running binary (process.execPath) into the managed\n * layout and point bin/openmeld at it. Idempotent with semver arbitration:\n * a same-or-newer pointer is left in place (install only goes up), unless\n * `force` is set. Both the versioned binary and the pointer are swapped in\n * atomically via a temp name + rename.\n */\nexport async function performManagedInstall(input?: {\n force?: boolean;\n // Defaults to process.execPath (this running binary); injectable for tests.\n sourceBinaryPath?: string;\n}): Promise<CliInstallSelfOutcome> {\n return await withManagedInstallTransaction(async () =>\n performManagedInstallLocked(input)\n );\n}\n\nexport async function withManagedInstallTransaction<T>(\n run: () => Promise<T>,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<T> {\n const startedAtMs = Date.now();\n\n for (;;) {\n try {\n const lock = await acquireLock({\n openMeldProfileId: MANAGED_INSTALL_LOCK_PROFILE,\n key: MANAGED_INSTALL_LOCK_KEY,\n meta: { component: \"managed_cli.install\" },\n pathResolution: pathInput,\n });\n return await runWithHeldLock({\n lock,\n run,\n releaseContext: {\n component: \"managed_cli.install\",\n lockKey: MANAGED_INSTALL_LOCK_KEY,\n openMeldProfileId: MANAGED_INSTALL_LOCK_PROFILE,\n },\n });\n } catch (error) {\n if (\n !isOpenMeldLockError(error) ||\n isOpenMeldOrphanedLockError(error) ||\n Date.now() - startedAtMs >= MANAGED_INSTALL_LOCK_TIMEOUT_MS\n ) {\n throw error;\n }\n await delay(MANAGED_INSTALL_LOCK_RETRY_DELAY_MS);\n }\n }\n}\n\n/**\n * Prune managed CLI versions only while holding the install transaction lock.\n * The current pointer and every durable Service update target are re-read in\n * the lock, so cleanup cannot race an install or use a stale pending snapshot.\n */\nexport async function pruneManagedInstallVersions(input: {\n pathInput: OpenMeldPathResolutionInput;\n preferredRollbackVersion?: string | null;\n}): Promise<void> {\n const pathInput = input.pathInput;\n assertNoPublishedProductionMutationDuringTests(\n pathInput,\n \"managed CLI versions\"\n );\n await withManagedInstallTransaction(async () => {\n const currentVersion = await readCurrentPointerVersion(pathInput);\n if (currentVersion === null) {\n return;\n }\n const protectedVersions =\n await readManagedInstallProtectedVersions(pathInput);\n await pruneManagedVersions({\n currentVersion,\n pathInput,\n preferredRollbackVersion: input.preferredRollbackVersion,\n protectedVersions,\n });\n }, pathInput);\n}\n\nasync function performManagedInstallLocked(input?: {\n force?: boolean;\n sourceBinaryPath?: string;\n}): Promise<CliInstallSelfOutcome> {\n const force = input?.force ?? false;\n const version = resolveCliSelfVersion();\n const platform = resolveCliPlatformToken();\n const currentPointerPath = openMeldManagedBinaryPath();\n const managedBinaryPath = openMeldManagedVersionBinaryPath(version);\n const previousVersion = await readCurrentPointerVersion();\n const protectedVersions = await readManagedInstallProtectedVersions();\n\n const baseOutcome = {\n version,\n platform,\n managedBinaryPath,\n currentPointerPath,\n previousVersion,\n forced: force,\n };\n\n if (previousVersion !== null) {\n const comparison = compareSemver(version, previousVersion);\n if (\n !force &&\n comparison === 0 &&\n (await isUsableManagedBinary(managedBinaryPath))\n ) {\n await pruneManagedVersions({\n currentVersion: previousVersion,\n protectedVersions,\n });\n return { ...baseOutcome, result: \"noop_same_version\" };\n }\n if (comparison < 0 && !force) {\n if (!(await isUsableManagedBinary(managedBinaryPath))) {\n await placeVersionedBinary(\n input?.sourceBinaryPath ?? process.execPath,\n version,\n managedBinaryPath\n );\n }\n await pruneManagedVersions({\n currentVersion: previousVersion,\n preferredRollbackVersion: version,\n protectedVersions,\n });\n return { ...baseOutcome, result: \"noop_newer_present\" };\n }\n }\n\n await placeVersionedBinary(\n input?.sourceBinaryPath ?? process.execPath,\n version,\n managedBinaryPath\n );\n await pruneManagedVersions({\n currentVersion: version,\n preferredRollbackVersion: previousVersion,\n protectedVersions,\n });\n await swapCurrentPointer(currentPointerPath, managedBinaryPath);\n\n return { ...baseOutcome, result: \"installed\" };\n}\n\nasync function readManagedInstallProtectedVersions(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<Set<string>> {\n const [protectedVersions, pendingServiceUpdate, activeBundle] =\n await Promise.all([\n readDaemonServiceUpdateWorkerProtectedManagedVersions(pathInput),\n readPendingDaemonServiceUpdate(pathInput),\n readDaemonActiveBundleState(pathInput),\n ]);\n // CLI releases may advance while this Service remains active. Its immutable\n // executable is still a recovery and task-tool dependency, not CLI rollback.\n if (activeBundle?.bundleFormat === \"binary_v1\") {\n protectedVersions.add(activeBundle.daemonVersion);\n }\n if (pendingServiceUpdate?.preparedBundle.bundleFormat === \"binary_v1\") {\n protectedVersions.add(pendingServiceUpdate.preparedBundle.daemonVersion);\n }\n return protectedVersions;\n}\n\nasync function placeVersionedBinary(\n sourceBinary: string,\n version: string,\n managedBinaryPath: string\n): Promise<void> {\n await mkdir(openMeldManagedVersionDir(version), { recursive: true });\n const tmpPath = `${managedBinaryPath}.tmp-${process.pid}-${Date.now()}`;\n await rm(tmpPath, { force: true }).catch(() => undefined);\n await copyFile(sourceBinary, tmpPath);\n await chmod(tmpPath, 0o755);\n const existingTarget = await lstat(managedBinaryPath).catch((error) => {\n if (isErrorWithCode(error, \"ENOENT\")) {\n return null;\n }\n throw error;\n });\n if (existingTarget?.isDirectory()) {\n await rm(managedBinaryPath, { recursive: true });\n }\n await rename(tmpPath, managedBinaryPath);\n}\n\nasync function swapCurrentPointer(\n currentPointerPath: string,\n managedBinaryPath: string\n): Promise<void> {\n await mkdir(openMeldBinDir(), { recursive: true });\n const relativeTarget = path.relative(\n path.dirname(currentPointerPath),\n managedBinaryPath\n );\n const tmpPath = `${currentPointerPath}.tmp-${process.pid}-${Date.now()}`;\n await rm(tmpPath, { force: true }).catch(() => undefined);\n await symlink(relativeTarget, tmpPath);\n await rename(tmpPath, currentPointerPath);\n}\n\nexport function buildInstallSelfJsonPayload(outcome: CliInstallSelfOutcome) {\n return {\n schemaVersion: 1 as const,\n type: \"cli.install_self\" as const,\n result: outcome.result,\n version: outcome.version,\n platform: outcome.platform,\n managedBinaryPath: outcome.managedBinaryPath,\n currentPointerPath: outcome.currentPointerPath,\n previousVersion: outcome.previousVersion,\n forced: outcome.forced,\n };\n}\n\nfunction isErrorWithCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { isAbsolute } from \"node:path\";\nimport type { PrepareStepDiagnosticsBundle } from \"@openmeld/schemas/types\";\n\nconst ERROR_CODES = new Set([\n \"EPERM\",\n \"EACCES\",\n \"ENOENT\",\n \"ENOTDIR\",\n \"EISDIR\",\n \"EROFS\",\n \"ENOSPC\",\n \"EBUSY\",\n \"ETXTBSY\",\n \"EEXIST\",\n \"EIO\",\n \"EMFILE\",\n \"ENFILE\",\n \"EINVAL\",\n \"ENAMETOOLONG\",\n]);\nconst SYSCALLS = new Set([\n \"access\",\n \"open\",\n \"read\",\n \"write\",\n \"chmod\",\n \"chown\",\n \"copyfile\",\n \"rename\",\n \"unlink\",\n \"rmdir\",\n \"mkdir\",\n \"stat\",\n \"lstat\",\n \"realpath\",\n \"spawn\",\n]);\nconst APP_BUNDLE_PATH_PATTERN = /(?:^|[/\\\\])[^/\\\\]+\\.app(?:[/\\\\]|$)/iu;\n\n// Categories are safe to upload. Exact paths remain in local errors/journals.\nexport function classifyDiagnosticPath(\n value: unknown\n): \"app_bundle\" | \"absolute_other\" | \"relative\" | \"unknown\" {\n if (typeof value !== \"string\" || !value) {\n return \"unknown\";\n }\n if (APP_BUNDLE_PATH_PATTERN.test(value)) {\n return \"app_bundle\";\n }\n return isAbsolute(value) ? \"absolute_other\" : \"relative\";\n}\n\n// Do not copy message, path, spawnargs, environment, or arbitrary error fields.\n// EPERM/EACCES identify an operation failure, never an inferred TCC verdict.\nexport function collectLocalOperationFailure(\n error: unknown\n): PrepareStepDiagnosticsBundle[\"operationFailure\"] {\n let current = error;\n for (let depth = 0; depth < 4 && current instanceof Error; depth += 1) {\n const native = current as NodeJS.ErrnoException & { dest?: unknown };\n if (native.code && ERROR_CODES.has(native.code)) {\n return {\n code: native.code,\n ...(Number.isSafeInteger(native.errno) ? { errno: native.errno } : {}),\n ...(native.syscall && SYSCALLS.has(native.syscall)\n ? { syscall: native.syscall }\n : {}),\n pathCategory: classifyDiagnosticPath(native.path),\n ...(native.dest === undefined\n ? {}\n : {\n destinationCategory: classifyDiagnosticPath(native.dest),\n }),\n };\n }\n current = current.cause;\n }\n return undefined;\n}\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type DaemonLifecycleIntent,\n daemonLifecycleJournalPath,\n readDaemonServiceLifecycleLockMeta,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { assertNoPublishedProductionMutationDuringTests } from \"../../config/published-production-safety\";\nimport { resolveCliContextId } from \"../../config/session-profile\";\n\nconst DAEMON_LIFECYCLE_EVENT_TYPES = [\n \"connection.state\",\n \"daemon.crash\",\n \"lifecycle.command.begin\",\n \"lifecycle.command.end\",\n \"owner.snapshot\",\n \"route_catalog.initial_load\",\n \"runtime_state.takeover\",\n \"stop.controlled_drain\",\n \"stop.strategy.selected\",\n \"service_manager.action\",\n \"service_manager.registration_reconcile\",\n \"process_stop.action\",\n \"service_contract.write\",\n \"stop.signal.observed\",\n] as const;\n\nconst DAEMON_STOP_CAUSES = [\n \"user_stop\",\n \"controlled_service_update\",\n \"service_crash\",\n \"network_disconnect\",\n \"unknown\",\n] as const;\n\nexport type DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\";\n v: 1;\n type: DaemonLifecycleEventType;\n timestamp: string;\n lane: string;\n intent: string;\n command: string;\n pid: number;\n sessionId: string | null;\n stopCause?: DaemonStopCause;\n result: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type DaemonStopCause =\n | \"user_stop\"\n | \"controlled_service_update\"\n | \"service_crash\"\n | \"network_disconnect\"\n | \"unknown\";\n\nexport type DaemonLifecycleAttribution = {\n command: string;\n intent: DaemonLifecycleIntent | \"unknown\";\n lane: string;\n pid: number;\n sessionId: string | null;\n};\n\ntype DaemonLifecycleEventType = (typeof DAEMON_LIFECYCLE_EVENT_TYPES)[number];\n\nfunction toJournalErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction normalizeSessionId(value: string | undefined | null): string | null {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveDaemonStopCause(input: {\n explicitCause?: DaemonStopCause;\n intent: DaemonLifecycleIntent | \"unknown\";\n result: string;\n type: DaemonLifecycleEventType;\n}): DaemonStopCause {\n if (input.explicitCause) {\n return input.explicitCause;\n }\n if (input.type === \"daemon.crash\") {\n return \"service_crash\";\n }\n // A transport observation does not establish why the connection was lost,\n // and must not inherit a concurrent CLI command's stop/update attribution.\n if (input.type === \"connection.state\") {\n return \"unknown\";\n }\n if (input.intent === \"stop\") {\n return \"user_stop\";\n }\n if (\n input.intent === \"upgrade_reconcile\" ||\n input.intent === \"reinstall\" ||\n input.intent === \"startup_check\" ||\n input.intent === \"status_cleanup\"\n ) {\n return \"controlled_service_update\";\n }\n return \"unknown\";\n}\n\nfunction isDaemonLifecycleEvent(event: unknown): event is DaemonLifecycleEvent {\n if (typeof event !== \"object\" || event === null) {\n return false;\n }\n const candidate = event as Partial<DaemonLifecycleEvent>;\n return (\n candidate.schema === \"openmeld-daemon-lifecycle-event-v1\" &&\n candidate.v === 1 &&\n DAEMON_LIFECYCLE_EVENT_TYPES.includes(\n candidate.type as DaemonLifecycleEventType\n ) &&\n typeof candidate.timestamp === \"string\" &&\n candidate.timestamp.length > 0 &&\n typeof candidate.lane === \"string\" &&\n candidate.lane.length > 0 &&\n typeof candidate.intent === \"string\" &&\n candidate.intent.length > 0 &&\n typeof candidate.command === \"string\" &&\n candidate.command.length > 0 &&\n typeof candidate.pid === \"number\" &&\n Number.isInteger(candidate.pid) &&\n candidate.pid > 0 &&\n (candidate.sessionId === null ||\n (typeof candidate.sessionId === \"string\" &&\n candidate.sessionId.length > 0)) &&\n (candidate.stopCause === undefined ||\n DAEMON_STOP_CAUSES.includes(candidate.stopCause)) &&\n typeof candidate.result === \"string\" &&\n candidate.result.length > 0\n );\n}\n\nasync function resolveDaemonLifecycleAttribution(input: {\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleAttribution> {\n const lockMeta = await readDaemonServiceLifecycleLockMeta().catch(() => null);\n const command =\n input.command?.trim() ||\n (typeof lockMeta?.command === \"string\" ? lockMeta.command.trim() : \"\") ||\n \"unknown\";\n const intent =\n input.intent ??\n (typeof lockMeta?.intent === \"string\" ? lockMeta.intent : \"unknown\");\n return {\n command,\n intent,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid:\n typeof lockMeta?.pid === \"number\" && lockMeta.pid > 0\n ? lockMeta.pid\n : process.pid,\n sessionId: normalizeSessionId(lockMeta?.sessionId) ?? resolveCliContextId(),\n };\n}\n\nexport async function emitDaemonLifecycleEvent(input: {\n type: DaemonLifecycleEventType;\n result: string;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n stopCause?: DaemonStopCause;\n}): Promise<void> {\n assertNoPublishedProductionMutationDuringTests(\n input.pathInput ?? {},\n \"OpenMeld Service lifecycle journal\"\n );\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n const timestamp = new Date().toISOString();\n const attribution =\n input.type === \"connection.state\"\n ? {\n command: \"openmeld service run\",\n intent: \"unknown\" as const,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid: process.pid,\n sessionId: resolveCliContextId(),\n }\n : await resolveDaemonLifecycleAttribution(input);\n const event: DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\",\n v: 1,\n type: input.type,\n timestamp,\n lane: attribution.lane,\n intent: attribution.intent,\n command: attribution.command,\n pid: attribution.pid,\n sessionId: attribution.sessionId,\n stopCause: resolveDaemonStopCause({\n explicitCause: input.stopCause,\n intent: attribution.intent,\n result: input.result,\n type: input.type,\n }),\n result: input.result,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n\n if (!isDaemonLifecycleEvent(event)) {\n console.warn(\n `[openmeld:lifecycle-journal] rejected invalid event ${input.type}`\n );\n return;\n }\n\n try {\n await mkdir(dirname(journalPath), { recursive: true });\n await appendFile(journalPath, `${JSON.stringify(event)}\\n`, \"utf8\");\n } catch (error) {\n console.warn(\n `[openmeld:lifecycle-journal] failed to append event ${input.type}: ${toJournalErrorMessage(error)}`\n );\n }\n}\n\nexport async function runWithDaemonLifecycleCommandJournal<T>(input: {\n command: string;\n intent: DaemonLifecycleIntent;\n /**\n * Stamps the begin event with `processUptimeMs`, the milliseconds this\n * process has been running when the command begins. It is opt-in because it\n * is only meaningful for the long-lived daemon run: `begin timestamp -\n * processUptimeMs` recovers the process spawn moment, which splits the gap\n * between the previous `service_manager.action start` and this begin into\n * launchd/BTM spawn-decision latency versus daemon early initialization.\n * Local diagnostic evidence only; it must never feed readiness decisions.\n */\n includeProcessUptime?: boolean;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n resolveResult?: (result: T) => {\n metadata?: Record<string, unknown>;\n result: string;\n };\n run: () => Promise<T>;\n}): Promise<T> {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.begin\",\n result: \"started\",\n metadata: input.includeProcessUptime\n ? {\n ...input.metadata,\n processUptimeMs: Math.round(process.uptime() * 1000),\n }\n : input.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n\n try {\n const result = await input.run();\n const resolvedResult = input.resolveResult?.(result) ?? {\n result: \"completed\",\n };\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: resolvedResult.result,\n metadata: resolvedResult.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: \"failed\",\n metadata: {\n errorMessage: toJournalErrorMessage(error),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nexport async function runDaemonServiceManagerAction<T>(input: {\n action:\n | \"deactivate\"\n | \"install\"\n | \"start\"\n | \"stop\"\n | \"uninstall\"\n | \"wait_running\";\n command?: string;\n controller: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n /**\n * Extracts structured failure evidence from the thrown error so the\n * journal entry alone carries the diagnosis (e.g. launchd job state on a\n * wait_running timeout). Extraction failures are swallowed: journaling\n * must never change the thrown error.\n */\n resolveErrorMetadata?: (error: unknown) => Record<string, unknown> | null;\n run: () => Promise<T>;\n}): Promise<T> {\n const startedAtMs = Date.now();\n try {\n const result = await input.run();\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"completed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n let errorMetadata: Record<string, unknown> | null = null;\n try {\n errorMetadata = input.resolveErrorMetadata?.(error) ?? null;\n } catch {\n errorMetadata = null;\n }\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"failed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n errorMessage: toJournalErrorMessage(error),\n ...(errorMetadata ?? {}),\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nconst DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES = new Set<DaemonLifecycleEventType>([\n \"daemon.crash\",\n \"lifecycle.command.end\",\n \"process_stop.action\",\n \"runtime_state.takeover\",\n \"service_contract.write\",\n \"service_manager.action\",\n]);\n\nexport async function readLatestDaemonLifecycleOriginEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES,\n });\n}\n\nexport async function readLatestDaemonLifecycleConnectionStateEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: new Set<DaemonLifecycleEventType>([\"connection.state\"]),\n });\n}\n\nasync function readLatestDaemonLifecycleEvent(input: {\n pathInput?: OpenMeldPathResolutionInput;\n typeFilter: ReadonlySet<DaemonLifecycleEventType>;\n}): Promise<DaemonLifecycleEvent | null> {\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed) && input.typeFilter.has(parsed.type)) {\n return parsed;\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return null;\n}\n\nexport async function readRecentDaemonLifecycleEvents(input: {\n maxEntries: number;\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleEvent[]> {\n if (input.maxEntries <= 0) {\n return [];\n }\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const recent: DaemonLifecycleEvent[] = [];\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed)) {\n recent.push(parsed);\n if (recent.length >= input.maxEntries) {\n break;\n }\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return recent.reverse();\n}\n\nexport async function resolveRecentDaemonSignalStopCause(\n input: { maxAgeMs?: number; pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<\n | Extract<DaemonStopCause, \"user_stop\" | \"controlled_service_update\">\n | \"unknown\"\n> {\n const nowMs = Date.now();\n const maxAgeMs = input.maxAgeMs ?? 30_000;\n const events = await readRecentDaemonLifecycleEvents({\n maxEntries: 32,\n pathInput: input.pathInput,\n });\n for (const event of events.toReversed()) {\n const eventAtMs = Date.parse(event.timestamp);\n if (\n !Number.isFinite(eventAtMs) ||\n nowMs - eventAtMs < 0 ||\n nowMs - eventAtMs > maxAgeMs\n ) {\n continue;\n }\n if (\n event.stopCause === \"user_stop\" ||\n event.stopCause === \"controlled_service_update\"\n ) {\n return event.stopCause;\n }\n }\n return \"unknown\";\n}\n\nexport function formatDaemonLifecycleOriginSummary(\n event: DaemonLifecycleEvent\n): string {\n const intent = formatDaemonLifecycleIntent(event.intent);\n return `${event.result} ${intent} from ${event.command} at ${event.timestamp} (pid ${event.pid})`;\n}\n\nfunction formatDaemonLifecycleIntent(intent: string): string {\n if (intent === \"unknown\") {\n return \"OpenMeld Service task\";\n }\n return intent.replaceAll(\"_\", \" \");\n}\n","import type { DaemonServiceContract } from \"@openmeld/schemas/types\";\nimport type { DaemonStatus } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport {\n type DaemonActiveBundleState,\n isDaemonBundleSourceAllowedForLane,\n} from \"./daemon-service-bundle\";\n\nexport type DaemonServiceArtifactDriftReasonCode =\n | \"bundle_missing\"\n | \"bundle_content_drift\"\n | \"bundle_id_drift\"\n | \"bundle_version_drift\"\n | \"bundle_lane_drift\"\n | \"bundle_strategy_legacy\"\n | \"bundle_provenance_drift\"\n | \"bundle_path_invalid\";\n\nexport type ResolvedDaemonServiceArtifact = {\n expectedVersion: string;\n installVersion: string | null;\n activeBundleVersion: string | null;\n resolvedEntryPath: string | null;\n driftReasonCodes: DaemonServiceArtifactDriftReasonCode[];\n isAligned: boolean;\n};\n\nexport function resolveDaemonServiceArtifact(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n serviceContract?: DaemonServiceContract | null;\n activeBundle: DaemonActiveBundleState | null;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n installedBundleFingerprint: string | null;\n pathInput?: OpenMeldPathResolutionInput;\n}): ResolvedDaemonServiceArtifact {\n const installVersion = input.installStatus.installed\n ? input.installStatus.state.daemonVersion\n : null;\n const expectedBundleId = input.serviceContract?.bundleId ?? null;\n const expectedDaemonVersion = input.expectedVersion;\n const activeBundleVersion = input.activeBundle?.daemonVersion ?? null;\n const driftReasonCodes = input.activeBundle\n ? collectActiveBundleDriftReasonCodes({\n activeBundle: input.activeBundle,\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceAvailable: input.activeBundleSourceAvailable,\n installedBundleFingerprint: input.installedBundleFingerprint,\n expectedBundleId,\n expectedDaemonVersion,\n pathInput: input.pathInput,\n })\n : ([\"bundle_missing\"] satisfies DaemonServiceArtifactDriftReasonCode[]);\n\n const isAligned = driftReasonCodes.length === 0;\n\n return {\n expectedVersion: input.expectedVersion,\n installVersion,\n activeBundleVersion,\n resolvedEntryPath: isAligned ? input.activeBundleEntryPath : null,\n driftReasonCodes,\n isAligned,\n };\n}\n\nfunction collectActiveBundleDriftReasonCodes(input: {\n activeBundle: DaemonActiveBundleState;\n activeBundleEntryPath: string | null;\n activeBundleSourceAvailable: boolean | null;\n installedBundleFingerprint: string | null;\n expectedBundleId: string | null;\n expectedDaemonVersion: string;\n pathInput?: OpenMeldPathResolutionInput;\n}): DaemonServiceArtifactDriftReasonCode[] {\n const driftReasonCodes: DaemonServiceArtifactDriftReasonCode[] = [];\n\n if (hasBundleVersionDrift(input)) {\n driftReasonCodes.push(\"bundle_version_drift\");\n }\n if (hasBundleIdDrift(input)) {\n driftReasonCodes.push(\"bundle_id_drift\");\n }\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: input.activeBundle.sourceKind,\n pathInput: input.pathInput,\n })\n ) {\n driftReasonCodes.push(\"bundle_lane_drift\");\n }\n if (input.activeBundle.bundleFormat === \"legacy_linked_v1\") {\n driftReasonCodes.push(\"bundle_strategy_legacy\");\n if (input.activeBundleSourceAvailable === false) {\n driftReasonCodes.push(\"bundle_provenance_drift\");\n }\n } else if (hasBundleContentDrift(input)) {\n driftReasonCodes.push(\"bundle_content_drift\");\n }\n if (!input.activeBundleEntryPath) {\n driftReasonCodes.push(\"bundle_path_invalid\");\n }\n\n return driftReasonCodes;\n}\n\nfunction hasBundleVersionDrift(input: {\n activeBundle: DaemonActiveBundleState;\n expectedDaemonVersion: string;\n}): boolean {\n return input.activeBundle.daemonVersion !== input.expectedDaemonVersion;\n}\n\nfunction hasBundleIdDrift(input: {\n activeBundle: DaemonActiveBundleState;\n expectedBundleId: string | null;\n}): boolean {\n return (\n input.expectedBundleId !== null &&\n input.activeBundle.bundleId !== input.expectedBundleId\n );\n}\n\nfunction hasBundleContentDrift(input: {\n activeBundle: DaemonActiveBundleState;\n installedBundleFingerprint: string | null;\n}): boolean {\n return (\n input.installedBundleFingerprint === null ||\n input.activeBundle.sourceDistFingerprint !==\n input.installedBundleFingerprint\n );\n}\n","import { execFile } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n chmod,\n copyFile,\n cp,\n lstat,\n mkdir,\n readdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { basename, dirname, isAbsolute, join, relative, sep } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport {\n downloadCliBinaryUpdateArtifact,\n resolveCliBinaryUpdatePlan,\n verifyCliBinaryCodeSignature,\n} from \"@openmeld/local-service/cli-binary-update-artifact\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { readDaemonServiceUpdateWorkerProtectedBundleIds } from \"../../config/daemon-service-update-worker-registration\";\nimport {\n daemonRuntimeBundlesPath,\n daemonRuntimeRootPath,\n daemonRuntimeServiceManagerPath,\n daemonRuntimeStateRootPath,\n daemonServiceActiveBundleStatePath,\n daemonServiceLegacyExecutableWrapperPath,\n daemonServiceStableBinaryExecutablePath,\n daemonServiceStableExecutableWrapperPath,\n daemonServiceStableLauncherPath,\n daemonServiceUpdateWorkerBinaryExecutablePath,\n daemonStatePath,\n getDaemonStatus,\n daemonServiceExecutableWrapperPaths as resolveDaemonServiceExecutableWrapperPaths,\n daemonServiceRecognizedExecutablePaths as resolveDaemonServiceRecognizedExecutablePaths,\n} from \"../../config/daemon-state\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport { resolveBundledServiceRelease } from \"../../config/service-release\";\nimport type { CliBinaryReleaseInfo } from \"../../config/version-state\";\nimport {\n performManagedInstall,\n resolveCliSelfVersion,\n} from \"../../local-components/managed-install\";\nimport {\n isBinaryDistribution,\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n classifyDiagnosticPath,\n collectLocalOperationFailure,\n} from \"../../system/local-operation-diagnostics\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\nimport { resolveDaemonServiceArtifact } from \"./daemon-service-artifact\";\nimport { readPendingDaemonServiceUpdate } from \"./daemon-service-update-state\";\n\nconst DAEMON_ACTIVE_BUNDLE_SCHEMA = \"openmeld-daemon-active-bundle-v2\";\nconst DAEMON_ACTIVE_BUNDLE_LEGACY_SCHEMA = \"openmeld-daemon-active-bundle-v1\";\nconst DAEMON_CLI_ENTRY_NAMES = [\"openmeld-dev.js\", \"openmeld.js\"] as const;\nconst DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE = \"workspace\";\nconst DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL = \"package_install\";\nconst DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE = \"npx_cache\";\nconst DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN = \"unknown\";\n// The npm Service bundle copies the platform-neutral JavaScript runtime only.\n// CLI binary and native secure-storage artifacts are verified and released by\n// the CLI artifact lane; the Service does not load them.\nconst DAEMON_SOURCE_DIST_IGNORED_TOP_LEVEL_DIRS = new Set([\"binary\", \"native\"]);\n\nexport type DaemonBundleFormat =\n | \"legacy_linked_v1\"\n | \"self_contained_v1\"\n | \"binary_v1\";\nexport type DaemonBundleSourceKind =\n | typeof DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE\n | typeof DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL\n | typeof DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE\n | typeof DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN;\n\nexport type DaemonActiveBundleState = {\n v: 2;\n schema: typeof DAEMON_ACTIVE_BUNDLE_SCHEMA;\n bundleId: string;\n daemonVersion: string;\n entryScriptRelativePath: string;\n bundleFormat: DaemonBundleFormat;\n sourceEntryScriptPath: string;\n sourcePackageRootPath: string;\n sourceDistRootPath: string;\n sourceDistFingerprint?: string | null;\n sourceKind: DaemonBundleSourceKind;\n createdAt: string;\n updatedAt: string;\n};\n\nexport function daemonServiceActiveBundlePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceActiveBundleStatePath(pathInput);\n}\n\nexport function daemonServiceLauncherPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableLauncherPath(pathInput);\n}\n\nexport function daemonServiceExecutableWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableExecutableWrapperPath(pathInput);\n}\n\nexport function daemonServiceBinaryExecutablePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceStableBinaryExecutablePath(pathInput);\n}\n\nexport function daemonServiceUpdateWorkerBinaryPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceUpdateWorkerBinaryExecutablePath(pathInput);\n}\n\nexport function daemonServiceExecutableWrapperPaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return resolveDaemonServiceExecutableWrapperPaths(pathInput);\n}\n\nexport function daemonServiceRecognizedExecutablePaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return resolveDaemonServiceRecognizedExecutablePaths(pathInput);\n}\n\nexport function daemonServiceLegacyWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return daemonServiceLegacyExecutableWrapperPath(pathInput);\n}\n\nexport function resolveDaemonBundleRootPath(\n bundleId: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeBundlesPath(pathInput), bundleId);\n}\n\nexport function isDaemonBundleSourceAllowedForLane(input: {\n sourceKind: DaemonBundleSourceKind;\n pathInput?: OpenMeldPathResolutionInput;\n}): boolean {\n if (input.sourceKind !== DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE) {\n return true;\n }\n return resolveOpenMeldEnvPreset(input.pathInput) === \"dev-local\";\n}\n\nexport async function readDaemonActiveBundleState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonActiveBundleState | null> {\n const raw = await readFile(\n daemonServiceActiveBundlePath(pathInput),\n \"utf8\"\n ).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonActiveBundleState>;\n if (parsed.v === 2 && parsed.schema === DAEMON_ACTIVE_BUNDLE_SCHEMA) {\n if (\n typeof parsed.bundleId !== \"string\" ||\n parsed.bundleId.length === 0 ||\n typeof parsed.daemonVersion !== \"string\" ||\n parsed.daemonVersion.length === 0 ||\n typeof parsed.entryScriptRelativePath !== \"string\" ||\n parsed.entryScriptRelativePath.length === 0 ||\n !isDaemonBundleFormat(parsed.bundleFormat) ||\n typeof parsed.sourceEntryScriptPath !== \"string\" ||\n parsed.sourceEntryScriptPath.length === 0 ||\n typeof parsed.sourcePackageRootPath !== \"string\" ||\n parsed.sourcePackageRootPath.length === 0 ||\n typeof parsed.sourceDistRootPath !== \"string\" ||\n parsed.sourceDistRootPath.length === 0 ||\n !isDaemonBundleSourceKind(parsed.sourceKind) ||\n typeof parsed.createdAt !== \"string\" ||\n parsed.createdAt.length === 0 ||\n typeof parsed.updatedAt !== \"string\" ||\n parsed.updatedAt.length === 0\n ) {\n return null;\n }\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: parsed.bundleId,\n daemonVersion: parsed.daemonVersion,\n entryScriptRelativePath: parsed.entryScriptRelativePath,\n bundleFormat: parsed.bundleFormat,\n sourceEntryScriptPath: parsed.sourceEntryScriptPath,\n sourcePackageRootPath: parsed.sourcePackageRootPath,\n sourceDistRootPath: parsed.sourceDistRootPath,\n sourceDistFingerprint: normalizeOptionalText(\n parsed.sourceDistFingerprint\n ),\n sourceKind: parsed.sourceKind,\n createdAt: parsed.createdAt,\n updatedAt: parsed.updatedAt,\n };\n }\n\n const legacyParsed = parsed as Partial<{\n v: 1;\n schema: string;\n bundleId: string;\n daemonVersion: string;\n entryScriptRelativePath: string;\n sourceDistRootPath: string;\n createdAt: string;\n updatedAt: string;\n }>;\n if (\n legacyParsed.v !== 1 ||\n legacyParsed.schema !== DAEMON_ACTIVE_BUNDLE_LEGACY_SCHEMA ||\n typeof legacyParsed.bundleId !== \"string\" ||\n legacyParsed.bundleId.length === 0 ||\n typeof legacyParsed.daemonVersion !== \"string\" ||\n legacyParsed.daemonVersion.length === 0 ||\n typeof legacyParsed.entryScriptRelativePath !== \"string\" ||\n legacyParsed.entryScriptRelativePath.length === 0 ||\n typeof legacyParsed.sourceDistRootPath !== \"string\" ||\n legacyParsed.sourceDistRootPath.length === 0 ||\n typeof legacyParsed.createdAt !== \"string\" ||\n legacyParsed.createdAt.length === 0 ||\n typeof legacyParsed.updatedAt !== \"string\" ||\n legacyParsed.updatedAt.length === 0\n ) {\n return null;\n }\n const sourceEntryScriptPath = join(\n legacyParsed.sourceDistRootPath,\n basename(legacyParsed.entryScriptRelativePath)\n );\n const sourcePackageRootPath = dirname(legacyParsed.sourceDistRootPath);\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: legacyParsed.bundleId,\n daemonVersion: legacyParsed.daemonVersion,\n entryScriptRelativePath: legacyParsed.entryScriptRelativePath,\n bundleFormat: \"legacy_linked_v1\",\n sourceEntryScriptPath,\n sourcePackageRootPath,\n sourceDistRootPath: legacyParsed.sourceDistRootPath,\n sourceDistFingerprint: null,\n sourceKind: inferDaemonBundleSourceKind(sourcePackageRootPath),\n createdAt: legacyParsed.createdAt,\n updatedAt: legacyParsed.updatedAt,\n };\n } catch {\n return null;\n }\n}\n\nexport async function resolveAlignedDaemonActiveBundleEntryPath(\n input: { expectedVersion?: string } = {}\n): Promise<string | null> {\n const [installStatus, serviceContract, state] = await Promise.all([\n getDaemonStatus(),\n readDaemonServiceContract().catch(() => null),\n readDaemonActiveBundleState(),\n ]);\n const expectedVersion =\n input.expectedVersion ??\n serviceContract?.daemonVersion ??\n (installStatus.installed\n ? installStatus.state.daemonVersion\n : (state?.daemonVersion ?? \"unknown\"));\n const matchingServiceContract =\n input.expectedVersion &&\n serviceContract?.daemonVersion !== input.expectedVersion\n ? null\n : serviceContract;\n const activeBundleEntryPath =\n await resolveDaemonBundleEntryPathFromState(state);\n const installedBundleFingerprint = activeBundleEntryPath\n ? await resolveInstalledDaemonBundleFingerprint(state)\n : null;\n const activeBundleSourceAvailable =\n state && state.bundleFormat === \"legacy_linked_v1\"\n ? await pathExists(state.sourcePackageRootPath).catch(() => null)\n : null;\n const artifact = resolveDaemonServiceArtifact({\n expectedVersion,\n installStatus,\n serviceContract: matchingServiceContract,\n activeBundle: state,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n installedBundleFingerprint,\n });\n return artifact.resolvedEntryPath;\n}\n\nexport async function resolveInstalledDaemonBundleFingerprint(\n state: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n if (state?.bundleFormat === \"binary_v1\") {\n const entryPath = await resolveDaemonBundleEntryPathFromState(\n state,\n pathInput\n );\n return entryPath ? await hashDaemonBinaryFile(entryPath) : null;\n }\n if (state?.bundleFormat === \"self_contained_v1\") {\n const bundleRootPath = resolveDaemonBundleRootPath(\n state.bundleId,\n pathInput\n );\n const distRootPath = join(\n bundleRootPath,\n dirname(state.entryScriptRelativePath)\n );\n const relativeDistRootPath = relative(bundleRootPath, distRootPath);\n if (\n relativeDistRootPath === \"..\" ||\n relativeDistRootPath.startsWith(`..${sep}`) ||\n isAbsolute(relativeDistRootPath)\n ) {\n return null;\n }\n return await computeDaemonSourceDistFingerprint(distRootPath);\n }\n return null;\n}\n\nexport async function resolveDaemonBundleEntryPathFromState(\n state: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n if (!state) {\n return null;\n }\n if (state.bundleFormat === \"binary_v1\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(pathInput);\n if (await pathExists(stableExecutablePath)) {\n return stableExecutablePath;\n }\n return (await pathExists(state.sourceEntryScriptPath))\n ? state.sourceEntryScriptPath\n : null;\n }\n const entryPath = join(\n resolveDaemonBundleRootPath(state.bundleId, pathInput),\n state.entryScriptRelativePath\n );\n return (await pathExists(entryPath)) ? entryPath : null;\n}\n\nexport async function prepareDaemonServiceBundle(input: {\n activate?: boolean;\n daemonVersion: string;\n cliScriptPath?: string;\n binaryRelease?: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n const preparedBundle = isBinaryDistribution()\n ? await prepareBinaryDaemonServiceBundle(input)\n : await prepareNodeDaemonServiceBundle(input);\n if (input.activate !== false) {\n await activateDaemonServiceBundle(preparedBundle);\n }\n return preparedBundle;\n}\n\nasync function prepareNodeDaemonServiceBundle(input: {\n daemonVersion: string;\n cliScriptPath?: string;\n}): Promise<DaemonActiveBundleState> {\n const sourceProvenance = await resolveDaemonBundleSourceProvenance(\n input.cliScriptPath\n );\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: sourceProvenance.sourceKind,\n })\n ) {\n throw new Error(\n \"OpenMeld Service cannot use repo-local workspace service files in this lane. Repo-local service files are only allowed through `openmeld-dev`.\"\n );\n }\n const { sourceEntryScriptPath, sourceDistRootPath, sourcePackageRootPath } =\n sourceProvenance;\n const sourceDistFingerprint =\n await computeDaemonSourceDistFingerprint(sourceDistRootPath);\n const entryScriptRelativePath = basename(sourceEntryScriptPath);\n const now = new Date().toISOString();\n const bundleId = createBundleId(input.daemonVersion);\n const bundleRootPath = resolveDaemonBundleRootPath(bundleId);\n const targetDistRootPath = join(bundleRootPath, \"dist\");\n\n await Promise.all([\n mkdir(daemonRuntimeRootPath(), { recursive: true }),\n mkdir(daemonRuntimeBundlesPath(), { recursive: true }),\n mkdir(daemonRuntimeStateRootPath(), { recursive: true }),\n mkdir(daemonRuntimeServiceManagerPath(), { recursive: true }),\n ]);\n\n try {\n await rm(bundleRootPath, { recursive: true, force: true });\n await mkdir(bundleRootPath, { recursive: true });\n await cp(sourceDistRootPath, targetDistRootPath, {\n recursive: true,\n force: true,\n filter: (sourcePath) =>\n isDaemonSourceDistPathIncluded(sourceDistRootPath, sourcePath),\n });\n await writeDaemonBundlePackageManifest({\n bundleRootPath,\n daemonVersion: input.daemonVersion,\n });\n await copyDaemonBundleRuntimeDependencies({\n bundleRootPath,\n sourcePackageRootPath,\n });\n } catch (error) {\n await rm(bundleRootPath, { recursive: true, force: true }).catch(\n () => undefined\n );\n throw error;\n }\n\n const nextState: DaemonActiveBundleState = {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId,\n daemonVersion: input.daemonVersion,\n entryScriptRelativePath: join(\"dist\", entryScriptRelativePath),\n bundleFormat: \"self_contained_v1\",\n sourceEntryScriptPath,\n sourcePackageRootPath,\n sourceDistRootPath,\n sourceDistFingerprint,\n sourceKind: sourceProvenance.sourceKind,\n createdAt: now,\n updatedAt: now,\n };\n\n return nextState;\n}\n\n// Binary distribution: the daemon runs this same binary via `service run`, so\n// there is no dist copy or node_modules dependency closure. Anchor the daemon\n// to the managed install (versions/<version>/openmeld) and record a binary_v1\n// active-bundle state (path fields kept non-empty for the read whitelist). No\n// launcher/wrapper is generated; command-spec points straight at the binary.\nasync function prepareBinaryDaemonServiceBundle(input: {\n daemonVersion: string;\n binaryRelease?: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n const { daemonVersion } = input;\n const bundledRelease = resolveBundledServiceRelease();\n const binaryRelease =\n input.binaryRelease ??\n (bundledRelease?.version === daemonVersion ? bundledRelease : undefined);\n if (daemonVersion !== resolveCliSelfVersion()) {\n const active = await readDaemonActiveBundleState();\n if (\n active?.bundleFormat === \"binary_v1\" &&\n active.daemonVersion === daemonVersion &&\n active.sourceDistFingerprint &&\n (!binaryRelease ||\n binaryRelease.sha256 === active.sourceDistFingerprint) &&\n (await pathExists(active.sourceEntryScriptPath)) &&\n (await hashDaemonBinaryFile(active.sourceEntryScriptPath)) ===\n active.sourceDistFingerprint\n ) {\n return active;\n }\n }\n if (binaryRelease) {\n return await prepareSelectedBinaryDaemonServiceBundle({\n daemonVersion,\n release: binaryRelease,\n });\n }\n if (daemonVersion !== resolveCliSelfVersion()) {\n throw new Error(\n `Cannot prepare OpenMeld Service ${daemonVersion} from CLI ${resolveCliSelfVersion()}. Acquire the selected Service release before preparing the update.`\n );\n }\n const outcome = await performManagedInstall();\n const managedBinaryPath = outcome.managedBinaryPath;\n if (!(await pathExists(managedBinaryPath))) {\n throw new Error(\n `OpenMeld managed binary is missing at ${managedBinaryPath}; cannot prepare binary OpenMeld Service.`\n );\n }\n const managedVersionDir = dirname(managedBinaryPath);\n const now = new Date().toISOString();\n\n await Promise.all([\n mkdir(daemonRuntimeRootPath(), { recursive: true }),\n mkdir(daemonRuntimeStateRootPath(), { recursive: true }),\n mkdir(daemonRuntimeServiceManagerPath(), { recursive: true }),\n ]);\n\n const nextState: DaemonActiveBundleState = {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId: createBundleId(outcome.version),\n daemonVersion: outcome.version,\n entryScriptRelativePath: \"openmeld\",\n bundleFormat: \"binary_v1\",\n sourceEntryScriptPath: managedBinaryPath,\n sourcePackageRootPath: managedVersionDir,\n sourceDistRootPath: managedVersionDir,\n sourceDistFingerprint: await hashDaemonBinaryFile(managedBinaryPath),\n sourceKind: DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL,\n createdAt: now,\n updatedAt: now,\n };\n\n return nextState;\n}\n\nasync function prepareSelectedBinaryDaemonServiceBundle(input: {\n daemonVersion: string;\n release: CliBinaryReleaseInfo;\n}): Promise<DaemonActiveBundleState> {\n if (input.release.version !== input.daemonVersion) {\n throw new Error(\n \"The selected Service artifact does not match the update target.\"\n );\n }\n const bundleId = createBundleId(input.daemonVersion);\n const bundleRootPath = resolveDaemonBundleRootPath(bundleId);\n const executablePath = join(bundleRootPath, \"openmeld\");\n const onDeltaFallback = (error: Error): void => {\n console.warn(\"[openmeld.service.artifact_delta_fallback]\", error.message);\n };\n const plan = await resolveCliBinaryUpdatePlan({\n baseBinaryPath: process.execPath,\n currentVersion: resolveCliSelfVersion(),\n onDeltaFallback,\n release: input.release,\n });\n const bytes = await downloadCliBinaryUpdateArtifact({\n downloadTimeoutMs: 60_000,\n fetchImpl: fetch,\n onDeltaFallback,\n plan,\n release: input.release,\n });\n await mkdir(bundleRootPath, { recursive: true });\n try {\n await writeFile(executablePath, bytes, { mode: 0o755 });\n await verifyCliBinaryCodeSignature({\n artifactPath: executablePath,\n release: input.release,\n runCommand: async (command, args) => {\n const result = await promisify(execFile)(command, args, {\n encoding: \"utf8\",\n });\n return { code: 0, stdout: result.stdout, stderr: result.stderr };\n },\n });\n } catch (error) {\n await rm(bundleRootPath, { recursive: true, force: true });\n throw error;\n }\n const now = new Date().toISOString();\n return {\n v: 2,\n schema: DAEMON_ACTIVE_BUNDLE_SCHEMA,\n bundleId,\n daemonVersion: input.daemonVersion,\n entryScriptRelativePath: \"openmeld\",\n bundleFormat: \"binary_v1\",\n sourceEntryScriptPath: executablePath,\n sourcePackageRootPath: bundleRootPath,\n sourceDistRootPath: bundleRootPath,\n sourceDistFingerprint: input.release.sha256.toLowerCase(),\n sourceKind: DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL,\n createdAt: now,\n updatedAt: now,\n };\n}\n\nexport async function activateDaemonServiceBundle(\n preparedBundle: DaemonActiveBundleState\n): Promise<void> {\n await mkdir(daemonRuntimeStateRootPath(), { recursive: true });\n await writeFile(\n daemonServiceActiveBundlePath(),\n `${JSON.stringify(preparedBundle, null, 2)}\\n`,\n { encoding: \"utf8\", mode: 0o600 }\n );\n if (preparedBundle.bundleFormat !== \"binary_v1\") {\n await ensureDaemonServiceManagerExecutables();\n }\n}\n\nexport async function discardPreparedDaemonServiceBundle(\n preparedBundle: DaemonActiveBundleState\n): Promise<void> {\n if (preparedBundle.bundleFormat === \"legacy_linked_v1\") {\n return;\n }\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleId === preparedBundle.bundleId) {\n return;\n }\n await rm(resolveDaemonBundleRootPath(preparedBundle.bundleId), {\n recursive: true,\n force: true,\n });\n}\n\nasync function hashDaemonBinaryFile(filePath: string): Promise<string> {\n const hash = createHash(\"sha256\");\n hash.update(await readFile(filePath));\n return hash.digest(\"hex\");\n}\n\nexport async function runAuditedServiceManagerCarrierMutation<T>(input: {\n distribution?: OpenMeldDistribution;\n operation: string;\n pathInput?: OpenMeldPathResolutionInput;\n run: () => Promise<T>;\n targetPath: string;\n}): Promise<T> {\n const pathInput = input.pathInput ?? {};\n const metadata = {\n distribution: input.distribution ?? resolveOpenMeldDistribution(),\n executable: process.execPath,\n operation: input.operation,\n preset: resolveOpenMeldEnvPreset(pathInput),\n targetPath: input.targetPath,\n targetCategory: classifyDiagnosticPath(input.targetPath),\n actorPid: process.pid,\n parentPid: process.ppid,\n };\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata,\n pathInput,\n result: \"attempted\",\n type: \"service_manager.registration_reconcile\",\n });\n try {\n const result = await input.run();\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata,\n pathInput,\n result: \"completed\",\n type: \"service_manager.registration_reconcile\",\n });\n return result;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n command: \"openmeld service carrier mutation\",\n intent: \"status_cleanup\",\n metadata: {\n ...metadata,\n errorMessage: error instanceof Error ? error.message : String(error),\n operationFailure: collectLocalOperationFailure(error),\n },\n pathInput,\n result: \"failed\",\n type: \"service_manager.registration_reconcile\",\n });\n throw error;\n }\n}\n\nexport async function ensureDaemonServiceStableBinaryExecutable(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string> {\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleFormat !== \"binary_v1\") {\n throw new Error(\n \"OpenMeld cannot prepare the stable macOS Service executable without an active binary bundle.\"\n );\n }\n return await ensureVerifiedBinaryCarrier({\n bundle: activeBundle,\n operationName: \"stable_binary\",\n pathInput,\n targetPath: daemonServiceBinaryExecutablePath(pathInput),\n });\n}\n\nexport async function ensureDaemonServiceUpdateWorkerBinaryExecutable(\n preparedBundle: DaemonActiveBundleState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string> {\n if (preparedBundle.bundleFormat !== \"binary_v1\") {\n throw new Error(\n \"OpenMeld cannot prepare the update worker binary without a binary Service bundle.\"\n );\n }\n return await ensureVerifiedBinaryCarrier({\n bundle: preparedBundle,\n operationName: \"update_worker_binary\",\n pathInput,\n targetPath: daemonServiceUpdateWorkerBinaryPath(pathInput),\n });\n}\n\nexport async function clearDaemonServiceUpdateWorkerBinaryExecutable(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const targetPath = daemonServiceUpdateWorkerBinaryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: \"remove_update_worker_binary\",\n pathInput,\n targetPath,\n run: async () => await rm(targetPath, { force: true }),\n });\n}\n\nasync function ensureVerifiedBinaryCarrier(input: {\n bundle: DaemonActiveBundleState;\n operationName: \"stable_binary\" | \"update_worker_binary\";\n pathInput: OpenMeldPathResolutionInput;\n targetPath: string;\n}): Promise<string> {\n const sourcePath = input.bundle.sourceEntryScriptPath;\n const expectedFingerprint =\n input.bundle.sourceDistFingerprint ??\n (await hashDaemonBinaryFile(sourcePath));\n const stableExecutablePath = input.targetPath;\n const stableExecutableStat = await lstat(stableExecutablePath).catch(\n () => null\n );\n if (\n stableExecutableStat?.isFile() === true &&\n !stableExecutableStat.isSymbolicLink() &&\n (await hashDaemonBinaryFile(stableExecutablePath).catch(() => null)) ===\n expectedFingerprint\n ) {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `refresh_${input.operationName}_permissions`,\n pathInput: input.pathInput,\n targetPath: stableExecutablePath,\n run: async () => await chmod(stableExecutablePath, 0o700),\n });\n return stableExecutablePath;\n }\n\n await mkdir(dirname(stableExecutablePath), { recursive: true });\n const preparedPath = `${stableExecutablePath}.next-${String(process.pid)}`;\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `clear_prepared_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => await rm(preparedPath, { force: true }),\n });\n try {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `prepare_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => {\n await copyFile(sourcePath, preparedPath);\n await chmod(preparedPath, 0o700);\n },\n });\n const preparedFingerprint = await hashDaemonBinaryFile(preparedPath);\n if (preparedFingerprint !== expectedFingerprint) {\n throw new Error(\n \"OpenMeld could not verify the prepared Service carrier executable.\"\n );\n }\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `replace_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: stableExecutablePath,\n run: async () => await rename(preparedPath, stableExecutablePath),\n });\n return stableExecutablePath;\n } finally {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: `clear_prepared_${input.operationName}`,\n pathInput: input.pathInput,\n targetPath: preparedPath,\n run: async () => await rm(preparedPath, { force: true }),\n }).catch(() => undefined);\n }\n}\n\nexport async function verifyDaemonActiveBundleIntegrity(\n activeBundle: DaemonActiveBundleState\n): Promise<boolean> {\n const expectedFingerprint = activeBundle.sourceDistFingerprint?.trim();\n if (\n !expectedFingerprint ||\n activeBundle.bundleFormat === \"legacy_linked_v1\"\n ) {\n return false;\n }\n const entryPath = await resolveDaemonBundleEntryPathFromState(activeBundle);\n if (!entryPath) {\n return false;\n }\n return (\n (await resolveInstalledDaemonBundleFingerprint(activeBundle)) ===\n expectedFingerprint\n );\n}\n\nasync function writeDaemonBundlePackageManifest(input: {\n bundleRootPath: string;\n daemonVersion: string;\n}): Promise<void> {\n const packageManifestPath = join(input.bundleRootPath, \"package.json\");\n await writeFile(\n packageManifestPath,\n `${JSON.stringify(\n {\n name: \"openmeld-daemon-service-bundle\",\n private: true,\n type: \"module\",\n version: input.daemonVersion,\n },\n null,\n 2\n )}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o600,\n }\n );\n}\n\nasync function copyDaemonBundleRuntimeDependencies(input: {\n bundleRootPath: string;\n sourcePackageRootPath: string;\n}): Promise<void> {\n const runtimeDependencies = await collectDaemonBundleRuntimeDependencyClosure(\n {\n sourcePackageRootPath: input.sourcePackageRootPath,\n }\n );\n\n const targetNodeModulesPath = join(input.bundleRootPath, \"node_modules\");\n await rm(targetNodeModulesPath, {\n recursive: true,\n force: true,\n });\n await mkdir(targetNodeModulesPath, { recursive: true });\n for (const runtimeDependency of runtimeDependencies) {\n await copyDaemonBundleDependencyDirectory({\n dependencyName: runtimeDependency.dependencyName,\n sourceDependencyPath: runtimeDependency.packageRootPath,\n targetNodeModulesPath,\n });\n }\n}\n\nasync function copyDaemonBundleDependencyDirectory(input: {\n dependencyName: string;\n sourceDependencyPath: string;\n targetNodeModulesPath: string;\n}): Promise<void> {\n if (!(await pathExists(input.sourceDependencyPath))) {\n throw new Error(\n `OpenMeld could not copy runtime dependency ${input.dependencyName} for background service bundling from ${input.sourceDependencyPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n const targetDependencyPath = join(\n input.targetNodeModulesPath,\n ...input.dependencyName.split(\"/\")\n );\n await mkdir(dirname(targetDependencyPath), { recursive: true });\n await cp(input.sourceDependencyPath, targetDependencyPath, {\n recursive: true,\n force: true,\n dereference: true,\n preserveTimestamps: true,\n });\n}\n\nexport async function writeDaemonServiceLauncher(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(daemonRuntimeServiceManagerPath(pathInput), { recursive: true });\n const targetPath = daemonServiceLauncherPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"write_launcher\",\n pathInput,\n targetPath,\n run: async () =>\n await writeFile(\n targetPath,\n `${buildDaemonServiceLauncherSource(pathInput)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o700,\n }\n ),\n });\n}\n\nexport async function writeDaemonServiceExecutableWrapper(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(daemonRuntimeServiceManagerPath(pathInput), { recursive: true });\n await Promise.all(\n daemonServiceExecutableWrapperPaths(pathInput).map(async (wrapperPath) => {\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"write_executable_wrapper\",\n pathInput,\n targetPath: wrapperPath,\n run: async () => {\n await writeFile(\n wrapperPath,\n `${buildDaemonServiceExecutableWrapperSource(pathInput)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o700,\n }\n );\n await chmod(wrapperPath, 0o700);\n },\n });\n })\n );\n}\n\nexport async function ensureDaemonServiceManagerExecutables(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeDaemonServiceLauncher(pathInput);\n await writeDaemonServiceExecutableWrapper(pathInput);\n}\n\nexport async function restoreDaemonActiveBundleStateSnapshot(\n snapshot: DaemonActiveBundleState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (!snapshot) {\n await rm(daemonServiceActiveBundlePath(pathInput), { force: true });\n return;\n }\n await mkdir(daemonRuntimeStateRootPath(pathInput), { recursive: true });\n await writeFile(\n daemonServiceActiveBundlePath(pathInput),\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o600,\n }\n );\n}\n\nexport async function clearDaemonServiceBundles(): Promise<void> {\n await Promise.all([\n rm(daemonServiceActiveBundlePath(), { force: true }),\n runAuditedServiceManagerCarrierMutation({\n operation: \"remove_launcher\",\n targetPath: daemonServiceLauncherPath(),\n run: async () => await rm(daemonServiceLauncherPath(), { force: true }),\n }),\n runAuditedServiceManagerCarrierMutation({\n distribution: \"binary\",\n operation: \"remove_stable_binary\",\n targetPath: daemonServiceBinaryExecutablePath(),\n run: async () =>\n await rm(daemonServiceBinaryExecutablePath(), { force: true }),\n }),\n clearDaemonServiceUpdateWorkerBinaryExecutable(),\n ...daemonServiceExecutableWrapperPaths().map((wrapperPath) =>\n runAuditedServiceManagerCarrierMutation({\n operation: \"remove_executable_wrapper\",\n targetPath: wrapperPath,\n run: async () => await rm(wrapperPath, { force: true }),\n })\n ),\n rm(daemonRuntimeBundlesPath(), { recursive: true, force: true }),\n ]);\n}\n\nexport async function cleanupInactiveDaemonServiceBundles(\n input: { retainBundleIds?: string[] } = {}\n): Promise<void> {\n const [\n active,\n serviceContract,\n runtimeLease,\n registeredWorkerBundleIds,\n pendingUpdate,\n ] = await Promise.all([\n readDaemonActiveBundleState(),\n readDaemonServiceContract().catch(() => null),\n readDaemonRuntimeLease().catch(() => null),\n readDaemonServiceUpdateWorkerProtectedBundleIds(),\n readPendingDaemonServiceUpdate(),\n ]);\n const retain = new Set([\n ...(active ? [active.bundleId] : []),\n ...(serviceContract?.bundleId ? [serviceContract.bundleId] : []),\n ...(runtimeLease?.bundleId ? [runtimeLease.bundleId] : []),\n ...registeredWorkerBundleIds,\n ...(pendingUpdate?.preparedBundle.bundleFormat === \"self_contained_v1\"\n ? [pendingUpdate.preparedBundle.bundleId]\n : []),\n ...(input.retainBundleIds ?? []),\n ]);\n const bundleEntries = await readDirectoryNames(daemonRuntimeBundlesPath());\n await Promise.all(\n bundleEntries\n .filter((bundleId) => !retain.has(bundleId))\n .map(async (bundleId) => {\n await rm(resolveDaemonBundleRootPath(bundleId), {\n recursive: true,\n force: true,\n });\n })\n );\n}\n\nasync function resolveDaemonBundleSourceProvenance(\n explicitPath?: string\n): Promise<{\n sourceEntryScriptPath: string;\n sourceDistRootPath: string;\n sourcePackageRootPath: string;\n sourceKind: DaemonBundleSourceKind;\n}> {\n const sourceEntryScriptPath = await resolveCliScriptPath(explicitPath);\n const sourceDistRootPath = dirname(sourceEntryScriptPath);\n const sourcePackageRootPath = dirname(sourceDistRootPath);\n return {\n sourceEntryScriptPath,\n sourceDistRootPath,\n sourcePackageRootPath,\n sourceKind: inferDaemonBundleSourceKind(sourcePackageRootPath),\n };\n}\n\nasync function resolveCliScriptPath(explicitPath?: string): Promise<string> {\n const rawPath = explicitPath ?? process.argv[1];\n if (!rawPath) {\n throw new Error(\n \"Cannot determine CLI script path for OpenMeld background service bundle.\"\n );\n }\n const resolvedPath = await realpath(rawPath).catch(async () => {\n const fallbackPath = await resolvePreferredCliScriptPath(rawPath);\n if (fallbackPath) {\n return fallbackPath;\n }\n throw new Error(\n `OpenMeld could not resolve a CLI dist entry for service bundling from ${rawPath}.`\n );\n });\n const preferredPath = await resolvePreferredCliScriptPath(resolvedPath);\n if (preferredPath) {\n return preferredPath;\n }\n throw new Error(\n `OpenMeld could not find a supported CLI dist entry for service bundling from ${resolvedPath}.`\n );\n}\n\nfunction createBundleId(version: string): string {\n const normalizedVersion = version.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n return `${normalizedVersion}-${Date.now()}`;\n}\n\nasync function computeDaemonSourceDistFingerprint(\n sourceDistRootPath: string\n): Promise<string> {\n const filePaths = await listDaemonSourceDistFiles(sourceDistRootPath);\n const hash = createHash(\"sha256\");\n for (const filePath of filePaths) {\n const relativePath = relative(sourceDistRootPath, filePath).replaceAll(\n \"\\\\\",\n \"/\"\n );\n hash.update(relativePath, \"utf8\");\n hash.update(\"\\0\", \"utf8\");\n hash.update(await readFile(filePath));\n hash.update(\"\\0\", \"utf8\");\n }\n return hash.digest(\"hex\");\n}\n\nasync function listDaemonSourceDistFiles(path: string): Promise<string[]> {\n return await listIncludedDaemonSourceDistFiles(path, path);\n}\n\nasync function listIncludedDaemonSourceDistFiles(\n sourceDistRootPath: string,\n currentPath: string\n): Promise<string[]> {\n const entries = await readdir(currentPath, { withFileTypes: true });\n const filePaths: string[] = [];\n\n for (const entry of entries) {\n const entryPath = join(currentPath, entry.name);\n if (!isDaemonSourceDistPathIncluded(sourceDistRootPath, entryPath)) {\n continue;\n }\n if (entry.isDirectory()) {\n filePaths.push(\n ...(await listIncludedDaemonSourceDistFiles(\n sourceDistRootPath,\n entryPath\n ))\n );\n continue;\n }\n if (entry.isFile()) {\n filePaths.push(entryPath);\n }\n }\n\n return filePaths.sort((left, right) => {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n });\n}\n\nfunction isDaemonSourceDistPathIncluded(\n sourceDistRootPath: string,\n candidatePath: string\n): boolean {\n const relativePath = relative(sourceDistRootPath, candidatePath).replaceAll(\n \"\\\\\",\n \"/\"\n );\n if (!relativePath || relativePath.startsWith(\"..\")) {\n return true;\n }\n const topLevelPathSegment = relativePath.split(\"/\")[0] ?? \"\";\n return !DAEMON_SOURCE_DIST_IGNORED_TOP_LEVEL_DIRS.has(topLevelPathSegment);\n}\n\nasync function collectDaemonBundleRuntimeDependencyClosure(input: {\n sourcePackageRootPath: string;\n}): Promise<Array<{ dependencyName: string; packageRootPath: string }>> {\n const packageManifestPath = join(input.sourcePackageRootPath, \"package.json\");\n const packageManifestRaw = await readFile(packageManifestPath, \"utf8\").catch(\n (error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n throw new Error(\n `OpenMeld could not find the CLI package manifest for background service bundling at ${packageManifestPath}.`\n );\n }\n throw error;\n }\n );\n const packageManifest = JSON.parse(packageManifestRaw) as {\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n };\n const resolvedDependencies = new Map<string, string>();\n const queue = [\n ...Object.keys(packageManifest.dependencies ?? {}).map(\n (dependencyName) => ({\n dependencyName,\n required: true,\n resolverPackageRootPath: input.sourcePackageRootPath,\n })\n ),\n ...Object.keys(packageManifest.optionalDependencies ?? {}).map(\n (dependencyName) => ({\n dependencyName,\n required: false,\n resolverPackageRootPath: input.sourcePackageRootPath,\n })\n ),\n ];\n\n while (queue.length > 0) {\n const nextDependency = queue.shift();\n if (!nextDependency) {\n continue;\n }\n if (isTypeOnlyDependencyName(nextDependency.dependencyName)) {\n continue;\n }\n if (resolvedDependencies.has(nextDependency.dependencyName)) {\n continue;\n }\n const dependencyManifest = await readDaemonBundleDependencyManifest({\n dependencyName: nextDependency.dependencyName,\n required: nextDependency.required,\n resolverPackageRootPath: nextDependency.resolverPackageRootPath,\n });\n if (!dependencyManifest) {\n continue;\n }\n\n resolvedDependencies.set(\n nextDependency.dependencyName,\n dependencyManifest.packageRootPath\n );\n const nestedRequiredDependencies = Object.keys(\n dependencyManifest.dependencies ?? {}\n );\n const nestedOptionalDependencies = Object.keys(\n dependencyManifest.optionalDependencies ?? {}\n );\n const nestedPeerDependencies = Object.keys(\n dependencyManifest.peerDependencies ?? {}\n );\n for (const dependencyName of nestedRequiredDependencies) {\n queue.push({\n dependencyName,\n required: true,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n for (const dependencyName of nestedOptionalDependencies) {\n queue.push({\n dependencyName,\n required: false,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n for (const dependencyName of nestedPeerDependencies) {\n queue.push({\n dependencyName,\n required: false,\n resolverPackageRootPath: dependencyManifest.packageRootPath,\n });\n }\n }\n\n return [...resolvedDependencies.entries()]\n .map(([dependencyName, packageRootPath]) => ({\n dependencyName,\n packageRootPath,\n }))\n .sort((left, right) =>\n left.dependencyName.localeCompare(right.dependencyName)\n );\n}\n\nfunction isTypeOnlyDependencyName(dependencyName: string): boolean {\n return dependencyName.startsWith(\"@types/\");\n}\n\nasync function readDaemonBundleDependencyManifest(input: {\n dependencyName: string;\n required: boolean;\n resolverPackageRootPath: string;\n}): Promise<{\n packageRootPath: string;\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n} | null> {\n const dependencyPackageRootPath = await resolveDaemonDependencyPackageRoot({\n dependencyName: input.dependencyName,\n resolverPackageRootPath: input.resolverPackageRootPath,\n required: input.required,\n });\n if (!dependencyPackageRootPath) {\n return null;\n }\n const dependencyManifestPath = join(\n dependencyPackageRootPath,\n \"package.json\"\n );\n const dependencyManifestRaw = await readFile(\n dependencyManifestPath,\n \"utf8\"\n ).catch((error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n if (!input.required) {\n return null;\n }\n throw new Error(\n `OpenMeld could not find runtime dependency ${input.dependencyName} for background service bundling at ${dependencyManifestPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n throw error;\n });\n if (dependencyManifestRaw === null) {\n return null;\n }\n const dependencyManifest = JSON.parse(dependencyManifestRaw) as {\n dependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n return {\n packageRootPath: dependencyPackageRootPath,\n ...dependencyManifest,\n };\n}\n\nasync function resolveDaemonDependencyPackageRoot(input: {\n dependencyName: string;\n resolverPackageRootPath: string;\n required: boolean;\n}): Promise<string | null> {\n const resolver = createRequire(\n join(input.resolverPackageRootPath, \"package.json\")\n );\n const dependencyPackageRootPath =\n await resolveDaemonDependencyPackageRootFromManifest({\n dependencyName: input.dependencyName,\n resolver,\n });\n if (dependencyPackageRootPath) {\n return dependencyPackageRootPath;\n }\n try {\n const dependencyEntryPath = await realpath(\n resolver.resolve(input.dependencyName)\n );\n return await findDaemonDependencyPackageRoot(dependencyEntryPath);\n } catch (error) {\n if (isPackageEntryResolutionError(error)) {\n const dependencyPackageRootPath =\n await findDaemonDependencyPackageRootFromResolutionPaths({\n dependencyName: input.dependencyName,\n resolver,\n });\n if (dependencyPackageRootPath) {\n return dependencyPackageRootPath;\n }\n if (!input.required) {\n return null;\n }\n throw new Error(\n `OpenMeld could not find runtime dependency ${input.dependencyName} for background service bundling from ${input.resolverPackageRootPath}. Run \\`pnpm install\\` and retry.`\n );\n }\n throw error;\n }\n}\n\nasync function resolveDaemonDependencyPackageRootFromManifest(input: {\n dependencyName: string;\n resolver: NodeJS.Require;\n}): Promise<string | null> {\n try {\n const dependencyManifestPath = await realpath(\n input.resolver.resolve(`${input.dependencyName}/package.json`)\n );\n return await findDaemonDependencyPackageRootFromManifestPath({\n dependencyManifestPath,\n dependencyName: input.dependencyName,\n });\n } catch (error) {\n if (isPackageEntryResolutionError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function findDaemonDependencyPackageRootFromManifestPath(input: {\n dependencyManifestPath: string;\n dependencyName: string;\n}): Promise<string | null> {\n let currentPath = dirname(input.dependencyManifestPath);\n while (true) {\n const packageManifestPath = join(currentPath, \"package.json\");\n const packageManifestRaw = await readFile(\n packageManifestPath,\n \"utf8\"\n ).catch((error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (packageManifestRaw !== null) {\n const packageManifest = JSON.parse(packageManifestRaw) as {\n name?: unknown;\n };\n if (packageManifest.name === input.dependencyName) {\n return currentPath;\n }\n }\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n return null;\n }\n currentPath = parentPath;\n }\n}\n\nasync function findDaemonDependencyPackageRootFromResolutionPaths(input: {\n dependencyName: string;\n resolver: NodeJS.Require;\n}): Promise<string | null> {\n const resolutionPaths = input.resolver.resolve.paths(input.dependencyName);\n if (!resolutionPaths) {\n return null;\n }\n for (const nodeModulesPath of resolutionPaths) {\n const candidatePackageRootPath = join(\n nodeModulesPath,\n ...input.dependencyName.split(\"/\")\n );\n if (await pathExists(join(candidatePackageRootPath, \"package.json\"))) {\n return await realpath(candidatePackageRootPath);\n }\n }\n return null;\n}\n\nasync function findDaemonDependencyPackageRoot(\n resolvedEntryPath: string\n): Promise<string> {\n let currentPath = dirname(resolvedEntryPath);\n while (true) {\n const packageManifestPath = join(currentPath, \"package.json\");\n if (await pathExists(packageManifestPath)) {\n return currentPath;\n }\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n break;\n }\n currentPath = parentPath;\n }\n throw new Error(\n `OpenMeld could not determine the package root for background service dependency entry ${resolvedEntryPath}.`\n );\n}\n\nfunction buildDaemonServiceLauncherSource(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const activeBundleStatePath = JSON.stringify(\n daemonServiceActiveBundlePath(pathInput)\n );\n const installStatePath = JSON.stringify(daemonStatePath(pathInput));\n const bundleRootPath = JSON.stringify(daemonRuntimeBundlesPath(pathInput));\n const allowWorkspaceBundleSource = JSON.stringify(\n resolveOpenMeldEnvPreset(pathInput) === \"dev-local\"\n );\n return `import { access, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { spawn } from \"node:child_process\";\n\nconst ACTIVE_BUNDLE_PATH = ${activeBundleStatePath};\nconst INSTALL_STATE_PATH = ${installStatePath};\nconst BUNDLE_ROOT_PATH = ${bundleRootPath};\nconst ALLOW_WORKSPACE_BUNDLE_SOURCE = ${allowWorkspaceBundleSource};\n\nconst ACTIVE_BUNDLE_SCHEMA = \"openmeld-daemon-active-bundle-v2\";\nconst ACTIVE_BUNDLE_LEGACY_SCHEMA = \"openmeld-daemon-active-bundle-v1\";\nconst INSTALL_STATE_SCHEMA = \"openmeld-daemon-install-v1\";\n\nasync function readJsonFile(path) {\n try {\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function pathExists(path) {\n try {\n await access(path);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction normalizeInstallState(parsed) {\n if (!parsed || parsed.schema !== INSTALL_STATE_SCHEMA || typeof parsed.daemonVersion !== \"string\" || parsed.daemonVersion.length === 0) {\n return null;\n }\n return {\n daemonVersion: parsed.daemonVersion,\n };\n}\n\nfunction normalizeBundleState(parsed) {\n if (\n parsed &&\n parsed.v === 2 &&\n parsed.schema === ACTIVE_BUNDLE_SCHEMA &&\n typeof parsed.bundleId === \"string\" &&\n parsed.bundleId.length > 0 &&\n typeof parsed.daemonVersion === \"string\" &&\n parsed.daemonVersion.length > 0 &&\n typeof parsed.entryScriptRelativePath === \"string\" &&\n parsed.entryScriptRelativePath.length > 0 &&\n (parsed.bundleFormat === \"self_contained_v1\" || parsed.bundleFormat === \"legacy_linked_v1\")\n ) {\n return parsed;\n }\n if (\n parsed &&\n parsed.v === 1 &&\n parsed.schema === ACTIVE_BUNDLE_LEGACY_SCHEMA &&\n typeof parsed.bundleId === \"string\" &&\n parsed.bundleId.length > 0 &&\n typeof parsed.daemonVersion === \"string\" &&\n parsed.daemonVersion.length > 0 &&\n typeof parsed.entryScriptRelativePath === \"string\" &&\n parsed.entryScriptRelativePath.length > 0\n ) {\n return {\n ...parsed,\n bundleFormat: \"legacy_linked_v1\",\n };\n }\n return null;\n}\n\nfunction normalizeBundlePackageManifest(parsed) {\n if (!parsed || typeof parsed.version !== \"string\" || parsed.version.length === 0) {\n return null;\n }\n return {\n version: parsed.version,\n };\n}\n\nfunction uniqueNonEmptyStrings(values) {\n return [...new Set(values.filter((value) => typeof value === \"string\" && value.length > 0))];\n}\n\nasync function findFallbackSelfContainedBundle(input) {\n const directories = await readdir(BUNDLE_ROOT_PATH, { withFileTypes: true }).catch((error) => {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n });\n const entryScriptRelativePaths = uniqueNonEmptyStrings([\n input.preferredEntryScriptRelativePath,\n \"dist/openmeld.js\",\n \"dist/openmeld-dev.js\",\n ]);\n const candidates = [];\n for (const directory of directories) {\n if (!directory.isDirectory()) {\n continue;\n }\n const bundleId = directory.name;\n const bundlePath = join(BUNDLE_ROOT_PATH, bundleId);\n const manifest = normalizeBundlePackageManifest(\n await readJsonFile(join(bundlePath, \"package.json\"))\n );\n if (manifest?.version !== input.installState.daemonVersion) {\n continue;\n }\n for (const entryScriptRelativePath of entryScriptRelativePaths) {\n const entryPath = join(bundlePath, entryScriptRelativePath);\n if (!(await pathExists(entryPath))) {\n continue;\n }\n const entryStat = await stat(entryPath).catch(() => null);\n candidates.push({\n bundleId,\n entryPath,\n entryScriptRelativePath,\n mtimeMs: entryStat?.mtimeMs ?? 0,\n });\n break;\n }\n }\n candidates.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) {\n return b.mtimeMs - a.mtimeMs;\n }\n return b.bundleId.localeCompare(a.bundleId);\n });\n return candidates[0] ?? null;\n}\n\nasync function persistFallbackActiveBundleState(input) {\n const now = new Date().toISOString();\n const bundleRootPath = join(BUNDLE_ROOT_PATH, input.bundleId);\n const nextState = {\n v: 2,\n schema: ACTIVE_BUNDLE_SCHEMA,\n bundleId: input.bundleId,\n daemonVersion: input.installState.daemonVersion,\n entryScriptRelativePath: input.entryScriptRelativePath,\n bundleFormat: \"self_contained_v1\",\n sourceEntryScriptPath: input.entryPath,\n sourcePackageRootPath: bundleRootPath,\n sourceDistRootPath: join(bundleRootPath, \"dist\"),\n sourceDistFingerprint: null,\n sourceKind: \"package_install\",\n createdAt: input.previousBundleState?.createdAt ?? now,\n updatedAt: now,\n };\n await writeFile(ACTIVE_BUNDLE_PATH, \\`\\${JSON.stringify(nextState, null, 2)}\\\\n\\`, {\n encoding: \"utf8\",\n mode: 0o600,\n }).catch((error) => {\n console.error(\\`OpenMeld Service launcher recovered a matching bundle but could not update active bundle state: \\${String(error)}\\`);\n });\n}\n\nasync function resolveEntryPath() {\n const installState = normalizeInstallState(await readJsonFile(INSTALL_STATE_PATH));\n const bundleState = normalizeBundleState(await readJsonFile(ACTIVE_BUNDLE_PATH));\n if (!installState) {\n throw new Error(\"OpenMeld Service launcher could not read a valid install state.\");\n }\n if (!bundleState) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: null,\n });\n if (!fallback) {\n throw new Error(\"OpenMeld Service launcher could not read a valid active bundle state.\");\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: null,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state was missing or invalid.\\`);\n return fallback.entryPath;\n }\n if (bundleState.bundleFormat !== \"self_contained_v1\") {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher refused to start legacy bundle format \\${String(bundleState.bundleFormat)}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state used legacy bundle format \\${String(bundleState.bundleFormat)}.\\`);\n return fallback.entryPath;\n }\n if (bundleState.sourceKind === \"workspace\" && !ALLOW_WORKSPACE_BUNDLE_SOURCE) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\"OpenMeld Service launcher refused to start repo-local workspace service files in this lane. Repo-local service files are only allowed through \\`openmeld-dev\\`.\");\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state pointed at a repo-local workspace bundle in this lane.\\`);\n return fallback.entryPath;\n }\n if (bundleState.daemonVersion !== installState.daemonVersion) {\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher detected bundle version drift: bundle v\\${String(bundleState.daemonVersion)} != install v\\${String(installState.daemonVersion)}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle state had version drift.\\`);\n return fallback.entryPath;\n }\n const entryPath = join(BUNDLE_ROOT_PATH, bundleState.bundleId, bundleState.entryScriptRelativePath);\n if (await pathExists(entryPath)) {\n return entryPath;\n }\n const fallback = await findFallbackSelfContainedBundle({\n installState,\n preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,\n });\n if (!fallback) {\n throw new Error(\\`OpenMeld Service launcher could not find active bundle entry \\${entryPath}.\\`);\n }\n await persistFallbackActiveBundleState({\n ...fallback,\n installState,\n previousBundleState: bundleState,\n });\n console.error(\\`OpenMeld Service launcher recovered bundle \\${fallback.bundleId} because active bundle entry was missing.\\`);\n return fallback.entryPath;\n}\n\nasync function main() {\n const entryPath = await resolveEntryPath();\n const child = spawn(process.execPath, [entryPath, ...process.argv.slice(2)], {\n stdio: \"inherit\",\n env: process.env,\n windowsHide: true,\n });\n\n const forwardSignal = (signal) => {\n if (!child.killed) {\n child.kill(signal);\n }\n };\n\n for (const signal of [\"SIGINT\", \"SIGTERM\"]) {\n process.on(signal, () => {\n forwardSignal(signal);\n });\n }\n\n child.once(\"error\", (error) => {\n console.error(String(error));\n process.exitCode = 1;\n });\n\n child.once(\"close\", (code, signal) => {\n if (typeof code === \"number\") {\n process.exitCode = code;\n return;\n }\n if (signal) {\n process.kill(process.pid, signal);\n return;\n }\n process.exitCode = 1;\n });\n}\n\nawait main();`;\n}\n\nfunction buildDaemonServiceExecutableWrapperSource(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return [\n \"#!/bin/sh\",\n `exec ${quoteShellSingle(process.execPath)} ${quoteShellSingle(\n daemonServiceLauncherPath(pathInput)\n )} \"$@\"`,\n ].join(\"\\n\");\n}\n\nfunction quoteShellSingle(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\"'\\\"'\")}'`;\n}\n\nasync function readDirectoryNames(path: string): Promise<string[]> {\n const entries = await readdir(path, { withFileTypes: true }).catch(\n (error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n );\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n}\n\nfunction inferDaemonBundleSourceKind(\n sourcePackageRootPath: string\n): DaemonBundleSourceKind {\n const normalized = sourcePackageRootPath.replaceAll(\"\\\\\", \"/\").toLowerCase();\n if (normalized.includes(\"/.npm/\") && normalized.includes(\"_npx\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE;\n }\n if (normalized.includes(\"/node_modules/\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL;\n }\n if (normalized.includes(\"/openmeld/\")) {\n return DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE;\n }\n return DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN;\n}\n\nfunction isDaemonBundleFormat(value: unknown): value is DaemonBundleFormat {\n return (\n value === \"legacy_linked_v1\" ||\n value === \"self_contained_v1\" ||\n value === \"binary_v1\"\n );\n}\n\nfunction isDaemonBundleSourceKind(\n value: unknown\n): value is DaemonBundleSourceKind {\n return (\n value === DAEMON_BUNDLE_SOURCE_KIND_WORKSPACE ||\n value === DAEMON_BUNDLE_SOURCE_KIND_PACKAGE_INSTALL ||\n value === DAEMON_BUNDLE_SOURCE_KIND_NPX_CACHE ||\n value === DAEMON_BUNDLE_SOURCE_KIND_UNKNOWN\n );\n}\n\nfunction isPackageEntryResolutionError(error: unknown): boolean {\n const code = getErrorCode(error);\n return (\n code === \"MODULE_NOT_FOUND\" || code === \"ERR_PACKAGE_PATH_NOT_EXPORTED\"\n );\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function resolvePreferredCliScriptPath(\n rawPath: string\n): Promise<string | null> {\n const preferredScriptNames = buildPreferredCliScriptNames(rawPath);\n const candidateRoots = [\n dirname(rawPath),\n join(process.cwd(), \"dist\"),\n join(process.cwd(), \"clients\", \"openmeld-cli\", \"dist\"),\n dirname(fileURLToPath(import.meta.url)),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"dist\"),\n ];\n for (const scriptName of preferredScriptNames) {\n for (const candidateRoot of candidateRoots) {\n const candidatePath = join(candidateRoot, scriptName);\n if (await pathExists(candidatePath)) {\n return candidatePath;\n }\n }\n }\n return null;\n}\n\nfunction buildPreferredCliScriptNames(rawPath: string): string[] {\n const requestedScriptName = basename(rawPath).endsWith(\".js\")\n ? basename(rawPath)\n : `${basename(rawPath)}.js`;\n if (isSupportedDaemonCliEntryName(requestedScriptName)) {\n return [requestedScriptName];\n }\n if (String(process.env.OPENMELD_DEV_MODE ?? \"\").trim() === \"1\") {\n return [...DAEMON_CLI_ENTRY_NAMES];\n }\n return [...DAEMON_CLI_ENTRY_NAMES].reverse();\n}\n\nfunction isSupportedDaemonCliEntryName(\n value: string\n): value is (typeof DAEMON_CLI_ENTRY_NAMES)[number] {\n return DAEMON_CLI_ENTRY_NAMES.includes(\n value as (typeof DAEMON_CLI_ENTRY_NAMES)[number]\n );\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n","import {\n type OpenMeldPathResolutionInput,\n openMeldManagedBinaryPath,\n openMeldVersionsDir,\n} from \"../../config/paths\";\n\nconst MANAGED_BINARY_NAME = \"openmeld\";\nconst PATH_BOUNDARY_PATTERN = /[\\s\"'<>]/u;\nconst TRAILING_SLASHES_PATTERN = /\\/+$/u;\nconst VERSION_SEGMENT_BOUNDARY_PATTERN = /[\\s\"'<>/]/u;\n\nexport function isOpenMeldManagedBinaryPath(\n value: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n const normalizedPath = normalizeManagedBinaryPathText(value);\n if (\n normalizedPath ===\n normalizeManagedBinaryPathText(openMeldManagedBinaryPath(pathInput))\n ) {\n return true;\n }\n return isManagedVersionBinaryPath(normalizedPath, pathInput);\n}\n\nexport function containsOpenMeldManagedBinaryPath(\n value: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n const normalizedValue = normalizeManagedBinaryPathText(value);\n return (\n containsExactManagedPath(\n normalizedValue,\n normalizeManagedBinaryPathText(openMeldManagedBinaryPath(pathInput))\n ) || containsManagedVersionBinaryPath(normalizedValue, pathInput)\n );\n}\n\nexport function resolveOpenMeldManagedVersionBinaryRootPath(\n value: string\n): string | null {\n const normalizedPath = normalizeManagedBinaryPathText(value);\n const segments = normalizedPath.split(\"/\");\n const binaryName = segments.pop();\n const versionSegment = segments.pop();\n const versionsDirectory = segments.pop();\n if (\n binaryName !== MANAGED_BINARY_NAME ||\n versionsDirectory !== \"versions\" ||\n !versionSegment ||\n !isValidManagedVersionSegment(versionSegment)\n ) {\n return null;\n }\n const rootPath = segments.join(\"/\");\n if (rootPath.length > 0) {\n return rootPath;\n }\n return normalizedPath.startsWith(\"/\") ? \"/\" : null;\n}\n\nfunction isManagedVersionBinaryPath(\n normalizedPath: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const versionsRoot = normalizeVersionsRoot(pathInput);\n if (!normalizedPath.startsWith(versionsRoot)) {\n return false;\n }\n const relative = normalizedPath.slice(versionsRoot.length);\n const segments = relative.split(\"/\");\n const versionSegment = segments[0] ?? \"\";\n const binaryName = segments[1] ?? \"\";\n return (\n segments.length === 2 &&\n versionSegment.length > 0 &&\n binaryName === MANAGED_BINARY_NAME\n );\n}\n\nfunction containsManagedVersionBinaryPath(\n normalizedValue: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const versionsRoot = normalizeVersionsRoot(pathInput);\n let index = normalizedValue.indexOf(versionsRoot);\n while (index >= 0) {\n const before = index > 0 ? (normalizedValue[index - 1] ?? \"\") : \"\";\n const afterRoot = normalizedValue.slice(index + versionsRoot.length);\n const versionSeparatorIndex = afterRoot.indexOf(\"/\");\n if (\n isPathBoundary(before) &&\n versionSeparatorIndex > 0 &&\n isValidManagedVersionSegment(afterRoot.slice(0, versionSeparatorIndex))\n ) {\n const afterVersion = afterRoot.slice(versionSeparatorIndex + 1);\n if (afterVersion.startsWith(MANAGED_BINARY_NAME)) {\n const afterBinary = afterVersion[MANAGED_BINARY_NAME.length] ?? \"\";\n if (isPathBoundary(afterBinary)) {\n return true;\n }\n }\n }\n index = normalizedValue.indexOf(versionsRoot, index + 1);\n }\n return false;\n}\n\nfunction containsExactManagedPath(\n normalizedValue: string,\n normalizedPath: string\n): boolean {\n let index = normalizedValue.indexOf(normalizedPath);\n while (index >= 0) {\n const before = index > 0 ? (normalizedValue[index - 1] ?? \"\") : \"\";\n const after = normalizedValue[index + normalizedPath.length] ?? \"\";\n if (isPathBoundary(before) && isPathBoundary(after)) {\n return true;\n }\n index = normalizedValue.indexOf(normalizedPath, index + 1);\n }\n return false;\n}\n\nfunction normalizeVersionsRoot(pathInput: OpenMeldPathResolutionInput): string {\n return `${normalizeManagedBinaryPathText(\n openMeldVersionsDir(pathInput)\n ).replace(TRAILING_SLASHES_PATTERN, \"\")}/`;\n}\n\nfunction normalizeManagedBinaryPathText(value: string): string {\n return value.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nfunction isPathBoundary(value: string): boolean {\n return value === \"\" || PATH_BOUNDARY_PATTERN.test(value);\n}\n\nfunction isValidManagedVersionSegment(value: string): boolean {\n return value.length > 0 && !VERSION_SEGMENT_BOUNDARY_PATTERN.test(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport { containsOpenMeldManagedBinaryPath } from \"./daemon-managed-binary-path\";\nimport {\n daemonServiceBinaryExecutablePath,\n daemonServiceExecutableWrapperPath,\n daemonServiceLauncherPath,\n daemonServiceLegacyWrapperPath,\n} from \"./daemon-service-bundle\";\nimport {\n type DaemonServiceCommandSpec,\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nexport async function assertDaemonMaintenanceInstallationOwnership(): Promise<void> {\n const manager = await resolveDaemonServiceManager();\n if (!manager) {\n throw new Error(\n \"OpenMeld cannot verify the background service installation.\"\n );\n }\n const status = await manager.status();\n // A missing registration can be restored from this installation's saved job.\n if (!status.installed) {\n return;\n }\n if (\n !(await matchesExpectedDaemonServiceManagerDefinition({\n controller: manager.controller,\n definitionPath: status.definitionPath ?? null,\n commandSpec: status.commandSpec,\n }))\n ) {\n throw new Error(\n \"OpenMeld background service belongs to a different installation. Automatic maintenance was stopped without changing it.\"\n );\n }\n}\n\nexport function matchesExpectedDaemonServiceManagerCommand(input: {\n controller: DaemonServiceManager[\"controller\"] | null;\n commandSummary: string;\n commandSpec?: DaemonServiceCommandSpec;\n definitionPath: string | null;\n distribution?: OpenMeldDistribution;\n includeLegacyExecutableWrappers?: boolean;\n pathInput?: OpenMeldPathResolutionInput;\n}): boolean {\n if (input.controller === \"windows-service\") {\n if (input.commandSpec) {\n return matchesWindowsTaskInstallation(input.commandSpec, input.pathInput);\n }\n return (\n typeof input.definitionPath === \"string\" &&\n input.definitionPath.length > 0 &&\n input.commandSummary.includes(input.definitionPath)\n );\n }\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(\n input.pathInput\n );\n return [\n `${stableExecutablePath} service run`,\n `\"${stableExecutablePath}\" service run`,\n `'${stableExecutablePath}' service run`,\n ].some((expectedPrefix) => input.commandSummary.includes(expectedPrefix));\n }\n return containsOpenMeldManagedBinaryPath(\n input.commandSummary,\n input.pathInput\n );\n }\n return resolveExpectedDaemonServiceManagerCommandPaths({\n controller: input.controller,\n includeLegacyExecutableWrappers:\n input.includeLegacyExecutableWrappers === true,\n pathInput: input.pathInput,\n }).some((path) => input.commandSummary.includes(path));\n}\n\nexport async function matchesExpectedDaemonServiceManagerDefinition(input: {\n controller?: DaemonServiceManager[\"controller\"] | null;\n definitionPath: string | null;\n commandSpec?: DaemonServiceCommandSpec;\n distribution?: OpenMeldDistribution;\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<boolean> {\n if (input.controller === \"windows-service\" && input.commandSpec) {\n return matchesWindowsTaskInstallation(input.commandSpec, input.pathInput);\n }\n if (\n typeof input.definitionPath !== \"string\" ||\n input.definitionPath.trim().length === 0\n ) {\n return false;\n }\n\n const definition = await readFile(input.definitionPath, \"utf8\").catch(\n () => null\n );\n if (definition === null) {\n return false;\n }\n\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n const stableExecutablePath = daemonServiceBinaryExecutablePath(\n input.pathInput\n );\n return definition.includes(`<string>${stableExecutablePath}</string>`);\n }\n return containsOpenMeldManagedBinaryPath(definition, input.pathInput);\n }\n\n return resolveExpectedDaemonServiceManagerCommandPaths({\n controller: input.controller ?? null,\n pathInput: input.pathInput,\n }).some((path) => definition.includes(path));\n}\n\nfunction matchesWindowsTaskInstallation(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n return (\n spec.args[0] === daemonServiceLauncherPath(pathInput) &&\n spec.args[1] === \"service\" &&\n spec.args[2] === \"run\" &&\n resolveOpenMeldRootDir({ env: spec.env }) ===\n resolveOpenMeldRootDir(pathInput)\n );\n}\n\nfunction resolveExpectedDaemonServiceManagerCommandPaths(input: {\n controller: DaemonServiceManager[\"controller\"] | null;\n includeLegacyExecutableWrappers?: boolean;\n pathInput?: OpenMeldPathResolutionInput;\n}): string[] {\n if (input.controller === \"launchd\") {\n return [\n daemonServiceExecutableWrapperPath(input.pathInput),\n ...(input.includeLegacyExecutableWrappers === true\n ? [daemonServiceLegacyWrapperPath(input.pathInput)]\n : []),\n ];\n }\n return [daemonServiceLauncherPath(input.pathInput)];\n}\n","import { basename } from \"node:path\";\nimport {\n daemonRuntimeBundlesPath,\n daemonServiceRecognizedExecutablePaths,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { isOpenMeldManagedBinaryPath } from \"./daemon-managed-binary-path\";\n\nconst COMMAND_TOKEN_PATTERN = /\"([^\"]*)\"|'([^']*)'|(\\S+)/g;\nconst COMMAND_ARGUMENT_BOUNDARY_PATTERN = /\\s/u;\n\nexport type DaemonServiceProcessMode = \"foreground\" | \"background\" | null;\n\nexport type DaemonServiceProcessCommand = {\n action: \"run\" | \"start\";\n mode: DaemonServiceProcessMode;\n};\n\nexport function tokenizeDaemonCommand(command: string): string[] {\n const tokens: string[] = [];\n for (const match of command.matchAll(COMMAND_TOKEN_PATTERN)) {\n const token = match[1] ?? match[2] ?? match[3];\n if (token) {\n tokens.push(token);\n }\n }\n return tokens;\n}\n\nexport function normalizeDaemonCommandPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nexport function daemonCommandContainsExactPath(\n command: string,\n path: string\n): boolean {\n const normalizedCommand = normalizeDaemonCommandPath(command);\n const normalizedPath = normalizeDaemonCommandPath(path);\n let pathIndex = normalizedCommand.indexOf(normalizedPath);\n\n while (pathIndex >= 0) {\n const beforePath = normalizedCommand[pathIndex - 1];\n const afterPath = normalizedCommand[pathIndex + normalizedPath.length];\n if (\n isCommandArgumentBoundary(beforePath) &&\n isCommandArgumentBoundary(afterPath)\n ) {\n return true;\n }\n pathIndex = normalizedCommand.indexOf(\n normalizedPath,\n pathIndex + normalizedPath.length\n );\n }\n\n return false;\n}\n\nexport function extractDaemonCommandEntryPath(\n command: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string | null {\n const unquotedWrapperPath = extractUnquotedDaemonWrapperPath(\n command,\n pathInput\n );\n if (unquotedWrapperPath) {\n return unquotedWrapperPath;\n }\n\n const tokens = tokenizeDaemonCommand(command);\n if (tokens.length === 0) {\n return null;\n }\n const serviceRunIndex = findDaemonServiceCommandIndex(tokens);\n const candidateTokens =\n serviceRunIndex > 0 ? tokens.slice(0, serviceRunIndex) : tokens;\n\n for (let index = candidateTokens.length - 1; index >= 0; index -= 1) {\n const token = candidateTokens[index];\n if (!(token && looksLikeDaemonEntryPath(token, pathInput))) {\n continue;\n }\n return token;\n }\n\n return null;\n}\n\nexport function isDaemonRuntimeProcessCommand(command: string): boolean {\n const serviceCommand = parseDaemonServiceProcessCommand(command);\n return (\n serviceCommand?.action === \"run\" ||\n (serviceCommand?.action === \"start\" && serviceCommand.mode === \"foreground\")\n );\n}\n\nexport function parseDaemonServiceProcessCommand(\n command: string\n): DaemonServiceProcessCommand | null {\n const tokens = tokenizeDaemonCommand(command).map((token) =>\n token.toLowerCase()\n );\n const serviceCommandIndex = findDaemonServiceCommandIndex(tokens);\n if (serviceCommandIndex < 0) {\n return null;\n }\n\n const action = tokens[serviceCommandIndex + 1];\n if (action !== \"run\" && action !== \"start\") {\n return null;\n }\n\n return {\n action,\n mode: resolveDaemonServiceProcessMode(\n tokens.slice(serviceCommandIndex + 2)\n ),\n };\n}\n\nexport function resolveDaemonBundleIdFromEntryPath(\n entryPath: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): string | null {\n const normalizedEntryPath = normalizeDaemonCommandPath(entryPath);\n const normalizedBundleRoot = `${normalizeDaemonCommandPath(\n daemonRuntimeBundlesPath(pathInput)\n )}/`;\n if (!normalizedEntryPath.startsWith(normalizedBundleRoot)) {\n return null;\n }\n const relative = normalizedEntryPath.slice(normalizedBundleRoot.length);\n const bundleId = relative.split(\"/\")[0];\n return bundleId && bundleId.length > 0 ? bundleId : null;\n}\n\nfunction looksLikeDaemonEntryPath(\n token: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n return (\n token.includes(\"/bundles/\") ||\n token.includes(\"openmeld/dist/openmeld.js\") ||\n token.endsWith(\"/openmeld.js\") ||\n token.endsWith(\"/openmeld-dev.js\") ||\n token.endsWith(\"/daemon-service-launcher.mjs\") ||\n isRecognizedDaemonServiceExecutableWrapperPath(token, pathInput) ||\n isOpenMeldManagedBinaryPath(token, pathInput)\n );\n}\n\nfunction findDaemonServiceCommandIndex(tokens: readonly string[]): number {\n return tokens.findIndex(\n (token, index) =>\n token === \"service\" &&\n (tokens[index + 1] === \"run\" || tokens[index + 1] === \"start\")\n );\n}\n\nfunction resolveDaemonServiceProcessMode(\n serviceArguments: readonly string[]\n): DaemonServiceProcessMode {\n let mode: DaemonServiceProcessMode = null;\n for (let index = 0; index < serviceArguments.length; index += 1) {\n const argument = serviceArguments[index];\n let modeValue: string | undefined;\n if (argument === \"--mode\") {\n modeValue = serviceArguments[index + 1];\n } else if (argument?.startsWith(\"--mode=\")) {\n modeValue = argument.slice(\"--mode=\".length);\n }\n if (modeValue === \"foreground\" || modeValue === \"background\") {\n mode = modeValue;\n }\n }\n return mode;\n}\n\nfunction isRecognizedDaemonServiceExecutableWrapperPath(\n token: string,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const normalizedToken = normalizeDaemonCommandPath(token);\n return daemonServiceRecognizedExecutablePaths(pathInput).some(\n (wrapperPath) => {\n const normalizedWrapperPath = normalizeDaemonCommandPath(wrapperPath);\n return (\n normalizedToken === normalizedWrapperPath ||\n normalizedToken.endsWith(\n `/${normalizeDaemonCommandPath(basename(wrapperPath))}`\n )\n );\n }\n );\n}\n\nfunction extractUnquotedDaemonWrapperPath(\n command: string,\n pathInput: OpenMeldPathResolutionInput\n): string | null {\n const normalizedCommand = normalizeDaemonCommandPath(command);\n const serviceRunIndex = normalizedCommand.indexOf(\" service run\");\n if (serviceRunIndex <= 0) {\n return null;\n }\n\n const commandPrefix = command.slice(0, serviceRunIndex);\n const normalizedPrefix = normalizedCommand.slice(0, serviceRunIndex);\n for (const wrapperPath of daemonServiceRecognizedExecutablePaths(pathInput)) {\n const normalizedWrapperPath = normalizeDaemonCommandPath(wrapperPath);\n const wrapperPathIndex = normalizedPrefix.lastIndexOf(\n normalizedWrapperPath\n );\n if (\n wrapperPathIndex >= 0 &&\n daemonCommandContainsExactPath(commandPrefix, wrapperPath)\n ) {\n return commandPrefix.slice(\n wrapperPathIndex,\n wrapperPathIndex + normalizedWrapperPath.length\n );\n }\n\n const wrapperName = basename(wrapperPath);\n if (!wrapperName.includes(\" \")) {\n continue;\n }\n const normalizedSuffix = `/${normalizeDaemonCommandPath(wrapperName)}`;\n const wrapperNameIndex = normalizedPrefix.lastIndexOf(normalizedSuffix);\n if (\n wrapperNameIndex < 0 ||\n wrapperNameIndex + normalizedSuffix.length !== normalizedPrefix.length\n ) {\n continue;\n }\n return commandPrefix.slice(0, wrapperNameIndex + normalizedSuffix.length);\n }\n return null;\n}\n\nfunction isCommandArgumentBoundary(char: string | undefined): boolean {\n return (\n char === undefined ||\n char === \"'\" ||\n char === '\"' ||\n COMMAND_ARGUMENT_BOUNDARY_PATTERN.test(char)\n );\n}\n","import { spawn } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport process from \"node:process\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport {\n containsOpenMeldManagedBinaryPath,\n resolveOpenMeldManagedVersionBinaryRootPath,\n} from \"./daemon-managed-binary-path\";\nimport {\n daemonServiceLauncherPath,\n daemonServiceRecognizedExecutablePaths,\n} from \"./daemon-service-bundle\";\nimport {\n type DaemonServiceProcessMode,\n daemonCommandContainsExactPath,\n extractDaemonCommandEntryPath,\n isDaemonRuntimeProcessCommand,\n parseDaemonServiceProcessCommand,\n tokenizeDaemonCommand,\n} from \"./daemon-service-command-path\";\nimport { resolveDaemonServiceIdentity } from \"./daemon-service-identity\";\n\nexport type DaemonOwnedProcess = {\n pid: number;\n parentPid: number | null;\n command: string;\n mode: DaemonServiceProcessMode;\n ownership: \"stable_launcher\" | \"legacy_detached\" | \"cli_direct\" | \"unknown\";\n};\n\ntype ListedProcess = {\n pid: number;\n parentPid: number | null;\n command: string;\n};\n\nconst POSIX_PROCESS_LINE_PATTERN = /^(\\d+)\\s+(\\d+)\\s+(.+)$/;\nconst TRAILING_PATH_SEPARATOR_PATTERN = /\\/+$/u;\nconst OPENMELD_PACKAGE_INSTALL_ENTRY_SEGMENT =\n \"/node_modules/openmeld/dist/openmeld.js\";\nconst OPENMELD_DEV_LOCAL_ENTRY_SEGMENT = \"/openmeld-dev.js\";\nconst ALL_OPENMELD_ENV_PRESETS = [\n \"prod\",\n \"dev-local\",\n \"canary\",\n] as const satisfies readonly OpenMeldEnvPreset[];\nconst DAEMON_BIN_COMMAND_PATTERN_BY_PRESET = {\n prod: buildOpenMeldBinCommandPatternForPreset(\"prod\"),\n \"dev-local\": buildOpenMeldBinCommandPatternForPreset(\"dev-local\"),\n canary: buildOpenMeldBinCommandPatternForPreset(\"canary\"),\n} as const satisfies Record<OpenMeldEnvPreset, RegExp>;\n\nexport async function listDaemonOwnedProcesses(\n overrides: {\n listProcesses?: () => Promise<ListedProcess[]>;\n ignoreProcessIds?: Iterable<number>;\n pathInput?: OpenMeldPathResolutionInput;\n } = {}\n): Promise<DaemonOwnedProcess[]> {\n const listProcesses =\n overrides.listProcesses ?? listProcessesForCurrentPlatform;\n const ignoredProcessIds = new Set(\n Array.from(overrides.ignoreProcessIds ?? []).filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n )\n );\n const processes = await listProcesses();\n const ownedProcesses = processes\n .map((processInfo) =>\n classifyDaemonOwnedProcess(\n processInfo,\n ignoredProcessIds,\n overrides.pathInput\n )\n )\n .filter(\n (processInfo): processInfo is DaemonOwnedProcess => processInfo !== null\n );\n return collapseLauncherWrapperProcesses(ownedProcesses);\n}\n\nfunction classifyDaemonOwnedProcess(\n processInfo: ListedProcess,\n ignoredProcessIds: ReadonlySet<number>,\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonOwnedProcess | null {\n if (ignoredProcessIds.has(processInfo.pid)) {\n return null;\n }\n const normalizedCommand = normalizeProcessCommand(processInfo.command);\n const isRuntimeProcess = isDaemonRuntimeProcessCommand(normalizedCommand);\n const isLegacyDetachedProcess = normalizedCommand.includes(\"legacy-detached\");\n if (!(isRuntimeProcess || isLegacyDetachedProcess)) {\n return null;\n }\n const launcherPath = normalizeProcessCommand(\n daemonServiceLauncherPath(pathInput)\n );\n const wrapperPaths = daemonServiceRecognizedExecutablePaths(pathInput).map(\n normalizeProcessCommand\n );\n if (\n wrapperPaths.some(\n (wrapperPath) =>\n normalizedCommand.includes(wrapperPath) &&\n !daemonCommandContainsExactPath(normalizedCommand, wrapperPath)\n )\n ) {\n return null;\n }\n if (\n !looksLikeCurrentLaneDaemonCandidate({\n launcherPath,\n normalizedCommand,\n wrapperPaths,\n })\n ) {\n return null;\n }\n if (\n resolveDaemonCommandLaneScope({\n launcherPath,\n normalizedCommand,\n pathInput,\n }) !== \"current_lane\"\n ) {\n return null;\n }\n const ownership = resolveDaemonProcessOwnership(\n normalizedCommand,\n launcherPath,\n wrapperPaths,\n pathInput\n );\n const mode =\n parseDaemonServiceProcessCommand(normalizedCommand)?.mode ?? null;\n return {\n pid: processInfo.pid,\n parentPid: processInfo.parentPid,\n command: processInfo.command,\n mode,\n ownership,\n };\n}\n\nasync function listProcessesForCurrentPlatform(): Promise<ListedProcess[]> {\n if (process.platform === \"win32\") {\n return await listWindowsProcesses();\n }\n return await listPosixProcesses();\n}\n\nasync function listPosixProcesses(): Promise<ListedProcess[]> {\n const output = await runCommand(\"ps\", [\"-axo\", \"pid=,ppid=,command=\"]);\n const processes: ListedProcess[] = [];\n for (const line of output.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n const match = trimmed.match(POSIX_PROCESS_LINE_PATTERN);\n if (!(match?.[1] && match[2] && match[3])) {\n continue;\n }\n processes.push({\n pid: Number(match[1]),\n parentPid: Number(match[2]),\n command: match[3],\n });\n }\n return processes;\n}\n\nfunction resolveDaemonProcessOwnership(\n normalizedCommand: string,\n launcherPath: string,\n wrapperPaths: readonly string[],\n pathInput: OpenMeldPathResolutionInput\n): DaemonOwnedProcess[\"ownership\"] {\n const isRuntimeProcess = isDaemonRuntimeProcessCommand(normalizedCommand);\n if (\n normalizedCommand.includes(launcherPath) ||\n wrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(normalizedCommand, wrapperPath)\n ) ||\n (isRuntimeProcess &&\n containsOpenMeldManagedBinaryPath(normalizedCommand, pathInput))\n ) {\n return \"stable_launcher\";\n }\n if (normalizedCommand.includes(\"legacy-detached\")) {\n return \"legacy_detached\";\n }\n if (isRuntimeProcess) {\n return \"cli_direct\";\n }\n return \"unknown\";\n}\n\nfunction looksLikeCurrentLaneDaemonCandidate(input: {\n normalizedCommand: string;\n launcherPath: string;\n wrapperPaths: readonly string[];\n}): boolean {\n return (\n isDaemonRuntimeProcessCommand(input.normalizedCommand) ||\n input.normalizedCommand.includes(input.launcherPath) ||\n input.wrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(input.normalizedCommand, wrapperPath)\n ) ||\n input.normalizedCommand.includes(\"legacy-detached\")\n );\n}\n\nfunction resolveDaemonCommandLaneScope(input: {\n normalizedCommand: string;\n launcherPath: string;\n pathInput: OpenMeldPathResolutionInput;\n}): \"current_lane\" | \"other_lane\" | \"not_openmeld\" {\n const managedVersionRoot = resolveDaemonCommandManagedVersionRoot(\n input.normalizedCommand\n );\n if (managedVersionRoot) {\n const currentRoot = normalizeRootPath(\n resolveOpenMeldRootDir(input.pathInput)\n );\n return managedVersionRoot === currentRoot ? \"current_lane\" : \"other_lane\";\n }\n\n const currentLane = resolveOpenMeldEnvPreset(input.pathInput);\n const managedLane = resolveManagedDaemonPathLane({\n normalizedCommand: input.normalizedCommand,\n pathInput: input.pathInput,\n });\n if (managedLane) {\n return managedLane === currentLane ? \"current_lane\" : \"other_lane\";\n }\n\n if (hasExplicitOpenMeldHome(input.pathInput)) {\n return \"not_openmeld\";\n }\n\n const detectedLane = resolveDaemonCliCommandLane(\n input.normalizedCommand,\n input.pathInput\n );\n if (!detectedLane) {\n return \"not_openmeld\";\n }\n return detectedLane === currentLane ? \"current_lane\" : \"other_lane\";\n}\n\nfunction hasExplicitOpenMeldHome(\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n const value = (pathInput.env ?? process.env)[OPENMELD_HOME_ENV_KEY];\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction resolveDaemonCommandManagedVersionRoot(\n normalizedCommand: string\n): string | null {\n for (const token of tokenizeDaemonCommand(normalizedCommand)) {\n const rootPath = resolveOpenMeldManagedVersionBinaryRootPath(token);\n if (rootPath) {\n return normalizeRootPath(rootPath);\n }\n }\n return null;\n}\n\nfunction resolveManagedDaemonPathLane(input: {\n normalizedCommand: string;\n pathInput: OpenMeldPathResolutionInput;\n}): OpenMeldEnvPreset | null {\n const currentPreset = resolveOpenMeldEnvPreset(input.pathInput);\n for (const preset of ALL_OPENMELD_ENV_PRESETS) {\n const lanePathInput = resolveLanePathInput(input.pathInput, preset);\n const laneLauncherPath = normalizeProcessCommand(\n daemonServiceLauncherPath(lanePathInput)\n );\n const laneWrapperPaths = daemonServiceRecognizedExecutablePaths(\n lanePathInput\n ).map(normalizeProcessCommand);\n const laneRuntimeRoot = normalizeProcessCommand(\n daemonRuntimeRootPath(lanePathInput)\n );\n const laneEntryPath = extractDaemonCommandEntryPath(\n input.normalizedCommand,\n lanePathInput\n );\n const laneExecutableNames = laneWrapperPaths.map((candidatePath) =>\n basename(candidatePath)\n );\n if (\n input.normalizedCommand.includes(laneLauncherPath) ||\n laneWrapperPaths.some((wrapperPath) =>\n daemonCommandContainsExactPath(input.normalizedCommand, wrapperPath)\n ) ||\n (preset !== currentPreset &&\n laneEntryPath !== null &&\n laneExecutableNames.includes(\n normalizeProcessCommand(basename(laneEntryPath))\n )) ||\n input.normalizedCommand.includes(laneRuntimeRoot) ||\n containsOpenMeldManagedBinaryPath(input.normalizedCommand, lanePathInput)\n ) {\n return preset;\n }\n }\n return null;\n}\n\nfunction resolveDaemonCliCommandLane(\n normalizedCommand: string,\n pathInput: OpenMeldPathResolutionInput\n): OpenMeldEnvPreset | null {\n if (!isDaemonRuntimeProcessCommand(normalizedCommand)) {\n return null;\n }\n if (matchesDaemonCliLane(normalizedCommand, \"dev-local\", pathInput)) {\n return \"dev-local\";\n }\n if (matchesDaemonCliLane(normalizedCommand, \"canary\", pathInput)) {\n return \"canary\";\n }\n if (matchesDaemonCliLane(normalizedCommand, \"prod\", pathInput)) {\n return \"prod\";\n }\n return null;\n}\n\nfunction matchesDaemonCliLane(\n normalizedCommand: string,\n preset: OpenMeldEnvPreset,\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n if (DAEMON_BIN_COMMAND_PATTERN_BY_PRESET[preset].test(normalizedCommand)) {\n return true;\n }\n\n if (preset === \"dev-local\") {\n return normalizedCommand.includes(OPENMELD_DEV_LOCAL_ENTRY_SEGMENT);\n }\n\n const canaryPackageInstallRoot = resolveCanaryPackageInstallRoot(pathInput);\n if (preset === \"canary\") {\n return (\n normalizedCommand.includes(canaryPackageInstallRoot) ||\n normalizedCommand.includes(\n \"/.local/share/openmeld-canary/package-install/\"\n )\n );\n }\n\n return (\n normalizedCommand.includes(OPENMELD_PACKAGE_INSTALL_ENTRY_SEGMENT) &&\n !normalizedCommand.includes(canaryPackageInstallRoot) &&\n !normalizedCommand.includes(\n \"/.local/share/openmeld-canary/package-install/\"\n ) &&\n !normalizedCommand.includes(OPENMELD_DEV_LOCAL_ENTRY_SEGMENT)\n );\n}\n\nfunction collapseLauncherWrapperProcesses(\n processes: DaemonOwnedProcess[]\n): DaemonOwnedProcess[] {\n const launcherPidSet = new Set<number>();\n\n for (const processInfo of processes) {\n if (processInfo.ownership === \"stable_launcher\") {\n launcherPidSet.add(processInfo.pid);\n }\n }\n if (launcherPidSet.size === 0) {\n return processes;\n }\n\n const collapsedProcesses: DaemonOwnedProcess[] = [];\n for (const processInfo of processes) {\n if (processInfo.ownership === \"stable_launcher\") {\n const hasManagedChild = processes.some(\n (candidate) =>\n candidate.pid !== processInfo.pid &&\n candidate.parentPid === processInfo.pid &&\n candidate.ownership !== \"stable_launcher\"\n );\n if (hasManagedChild) {\n continue;\n }\n collapsedProcesses.push(processInfo);\n continue;\n }\n\n if (\n processInfo.parentPid !== null &&\n launcherPidSet.has(processInfo.parentPid)\n ) {\n collapsedProcesses.push({\n ...processInfo,\n ownership:\n processInfo.ownership === \"unknown\"\n ? processInfo.ownership\n : \"stable_launcher\",\n });\n continue;\n }\n\n collapsedProcesses.push(processInfo);\n }\n\n return collapsedProcesses;\n}\n\nasync function listWindowsProcesses(): Promise<ListedProcess[]> {\n const script =\n \"Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,CommandLine | ConvertTo-Json -Compress\";\n const output = await runCommand(\"powershell\", [\n \"-NoProfile\",\n \"-Command\",\n script,\n ]);\n const parsed = JSON.parse(output) as\n | Array<{\n ProcessId?: number;\n ParentProcessId?: number;\n CommandLine?: string | null;\n }>\n | {\n ProcessId?: number;\n ParentProcessId?: number;\n CommandLine?: string | null;\n };\n const rows = Array.isArray(parsed) ? parsed : [parsed];\n const processes: ListedProcess[] = [];\n for (const row of rows) {\n if (\n typeof row.ProcessId !== \"number\" ||\n typeof row.ParentProcessId !== \"number\" ||\n typeof row.CommandLine !== \"string\" ||\n row.CommandLine.trim().length === 0\n ) {\n continue;\n }\n processes.push({\n pid: row.ProcessId,\n parentPid: row.ParentProcessId,\n command: row.CommandLine,\n });\n }\n return processes;\n}\n\nasync function runCommand(command: string, args: string[]): Promise<string> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n windowsHide: true,\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n if (code !== 0) {\n reject(\n new Error(\n `process inventory command failed: ${command} ${args.join(\" \")} ${stderr.trim()}`\n )\n );\n return;\n }\n resolve(stdout);\n });\n });\n}\n\nfunction buildOpenMeldBinCommandPatternForPreset(\n preset: OpenMeldEnvPreset\n): RegExp {\n const aliases = resolveDaemonServiceIdentity({\n env: {\n OPENMELD_ENV_PRESET: preset,\n },\n }).cliEntryAliases.map(escapeRegex);\n return new RegExp(\n `(^|[\\\\s\\\\/])(${aliases.join(\"|\")})(?:\\\\.cmd|\\\\.exe|\\\\.js)?(?=\\\\s|$)`,\n \"u\"\n );\n}\n\nfunction escapeRegex(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction resolveCanaryPackageInstallRoot(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return normalizeProcessCommand(\n join(\n pathInput.homeDir ?? homedir(),\n \".local\",\n \"share\",\n \"openmeld-canary\",\n \"package-install\"\n )\n );\n}\n\nfunction resolveLanePathInput(\n pathInput: OpenMeldPathResolutionInput,\n preset: OpenMeldEnvPreset\n): OpenMeldPathResolutionInput {\n const currentPreset = resolveOpenMeldEnvPreset(pathInput);\n const env: NodeJS.ProcessEnv = {\n ...(pathInput.env ?? process.env),\n OPENMELD_ENV_PRESET: preset,\n };\n if (preset !== currentPreset && env[OPENMELD_HOME_ENV_KEY]) {\n delete env[OPENMELD_HOME_ENV_KEY];\n }\n return {\n ...pathInput,\n env,\n };\n}\n\nfunction normalizeProcessCommand(command: string): string {\n return command.trim().toLowerCase().replaceAll(\"\\\\\", \"/\");\n}\n\nfunction normalizeRootPath(path: string): string {\n const normalized = normalizeProcessCommand(path);\n return normalized === \"/\"\n ? normalized\n : normalized.replace(TRAILING_PATH_SEPARATOR_PATTERN, \"\");\n}\n","import {\n type DaemonServiceRuntimeStatus,\n type DaemonStatus,\n getDaemonRuntimeStatus,\n getDaemonStatus,\n uninstallDaemon,\n} from \"../../config/daemon-state\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport type {\n DaemonServiceManager,\n DaemonServiceManagerRuntimeStatus,\n} from \"./daemon-service-manager\";\nimport { resolveDaemonServiceManager } from \"./daemon-service-manager\";\nimport { matchesExpectedDaemonServiceManagerCommand } from \"./daemon-service-manager-command-match\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\nexport type LegacySharedDaemonServiceInspection = {\n present: boolean;\n pathInput: OpenMeldPathResolutionInput;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n};\n\nconst PROD_ENV_PRESET = \"prod\";\n\nexport function shouldInspectLegacySharedDaemonService(\n input: OpenMeldPathResolutionInput = {}\n): boolean {\n const env = input.env ?? process.env;\n if (String(env[OPENMELD_HOME_ENV_KEY] ?? \"\").trim()) {\n return false;\n }\n return resolveOpenMeldEnvPreset(input) === PROD_ENV_PRESET;\n}\n\nexport function resolveLegacySharedDaemonPathInput(\n input: OpenMeldPathResolutionInput = {}\n): OpenMeldPathResolutionInput | null {\n if (!shouldInspectLegacySharedDaemonService(input)) {\n return null;\n }\n return {\n ...input,\n env: {\n ...(input.env ?? process.env),\n OPENMELD_ENV_PRESET: PROD_ENV_PRESET,\n },\n };\n}\n\nexport function requiresLegacySharedDaemonServiceMigration(input: {\n pathInput: OpenMeldPathResolutionInput;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n}): boolean {\n if (hasLegacySharedServiceManagerResidual(input)) {\n return true;\n }\n return hasLegacyDetachedResidual(input);\n}\n\nexport async function inspectLegacySharedDaemonService(\n input: OpenMeldPathResolutionInput = {}\n): Promise<LegacySharedDaemonServiceInspection | null> {\n const pathInput = resolveLegacySharedDaemonPathInput(input);\n if (!pathInput) {\n return null;\n }\n\n const [installStatus, runtimeStatus, serviceManager, ownedProcesses] =\n await Promise.all([\n getDaemonStatus(pathInput),\n getDaemonRuntimeStatus(pathInput),\n resolveDaemonServiceManager(undefined, pathInput).catch(() => null),\n listDaemonOwnedProcesses({ pathInput }).catch(() => []),\n ]);\n\n const serviceManagerStatus = serviceManager\n ? await serviceManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null)\n : null;\n\n const present = requiresLegacySharedDaemonServiceMigration({\n pathInput,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n ownedProcesses,\n });\n\n return {\n present,\n pathInput,\n installStatus,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n ownedProcesses,\n };\n}\n\nfunction hasLegacySharedServiceManagerResidual(input: {\n pathInput: OpenMeldPathResolutionInput;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): boolean {\n if (!input.serviceManagerStatus?.installed) {\n return false;\n }\n if (!input.serviceManagerStatus.commandSummary) {\n return true;\n }\n return !matchesExpectedDaemonServiceManagerCommand({\n controller: input.serviceManager?.controller ?? null,\n commandSummary: input.serviceManagerStatus.commandSummary,\n commandSpec: input.serviceManagerStatus.commandSpec,\n definitionPath: input.serviceManagerStatus.definitionPath ?? null,\n includeLegacyExecutableWrappers: true,\n pathInput: input.pathInput,\n });\n}\n\nfunction hasLegacyDetachedResidual(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n ownedProcesses: DaemonOwnedProcess[];\n}): boolean {\n if (input.runtimeStatus.serviceController === \"legacy-detached\") {\n return true;\n }\n return input.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"legacy_detached\"\n );\n}\n\nexport async function cleanupLegacySharedDaemonServiceState(\n input: OpenMeldPathResolutionInput = {}\n): Promise<{ removed: boolean }> {\n const pathInput = resolveLegacySharedDaemonPathInput(input);\n if (!pathInput) {\n return { removed: false };\n }\n const legacySharedService = await inspectLegacySharedDaemonService(input);\n let removedServiceManager = false;\n if (\n legacySharedService?.present &&\n legacySharedService.serviceManager &&\n legacySharedService.serviceManagerStatus?.installed\n ) {\n await legacySharedService.serviceManager.uninstall();\n await legacySharedService.serviceManager.waitUntilAbsent();\n removedServiceManager = true;\n }\n const uninstallResult = await uninstallDaemon(pathInput);\n return {\n removed: removedServiceManager || uninstallResult.removed,\n };\n}\n","import process from \"node:process\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport {\n DAEMON_HEARTBEAT_STALE_MS,\n type DaemonServiceRuntimeStatus,\n} from \"../../config/daemon-state\";\nimport { extractDaemonCommandEntryPath } from \"./daemon-service-command-path\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\n\nexport function resolveObservedDaemonRuntimeStatus(input: {\n runtimeLease: DaemonRuntimeLease | null;\n ownedProcesses: readonly DaemonOwnedProcess[];\n}): DaemonServiceRuntimeStatus {\n const runtimeLeaseIssue = resolveRuntimeLeaseIssue(input.runtimeLease);\n const observedProcess = selectObservedRuntimeProcess(input.ownedProcesses);\n\n if (!runtimeLeaseIssue && input.runtimeLease) {\n return {\n status: \"running\",\n mode: input.runtimeLease.mode,\n pid: input.runtimeLease.pid,\n startedAt: input.runtimeLease.startedAt,\n updatedAt: input.runtimeLease.updatedAt,\n managedBySystemService: input.runtimeLease.managedBySystemService,\n serviceController: input.runtimeLease.serviceController,\n autoStart: input.runtimeLease.managedBySystemService,\n };\n }\n\n if (observedProcess) {\n return {\n status: \"stale\",\n mode: observedProcess.mode,\n pid: observedProcess.pid,\n startedAt: input.runtimeLease?.startedAt ?? null,\n updatedAt: input.runtimeLease?.updatedAt ?? null,\n managedBySystemService: observedProcess.ownership === \"stable_launcher\",\n serviceController:\n observedProcess.ownership === \"legacy_detached\"\n ? \"legacy-detached\"\n : \"unknown\",\n autoStart: observedProcess.ownership === \"stable_launcher\",\n reason: runtimeLeaseIssue ?? \"runtime_lease_missing\",\n };\n }\n\n if (!input.runtimeLease) {\n return {\n status: \"not_running\",\n mode: null,\n pid: null,\n startedAt: null,\n updatedAt: null,\n managedBySystemService: false,\n serviceController: \"unknown\",\n autoStart: false,\n };\n }\n\n return {\n status: \"stale\",\n mode: input.runtimeLease.mode,\n pid: input.runtimeLease.pid,\n startedAt: input.runtimeLease.startedAt,\n updatedAt: input.runtimeLease.updatedAt,\n managedBySystemService: input.runtimeLease.managedBySystemService,\n serviceController: input.runtimeLease.serviceController,\n autoStart: input.runtimeLease.managedBySystemService,\n reason: runtimeLeaseIssue ?? \"runtime_lease_missing\",\n };\n}\n\nexport function resolveObservedRuntimeCommandEntryPath(input: {\n ownedProcesses: readonly DaemonOwnedProcess[];\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): string | null {\n const runtimePid =\n typeof input.runtimeStatus.pid === \"number\"\n ? input.runtimeStatus.pid\n : null;\n if (!runtimePid) {\n return null;\n }\n const runtimeProcess = input.ownedProcesses.find(\n (processInfo) => processInfo.pid === runtimePid\n );\n if (!runtimeProcess) {\n return null;\n }\n return extractDaemonCommandEntryPath(runtimeProcess.command);\n}\n\nfunction resolveRuntimeLeaseIssue(\n runtimeLease: DaemonRuntimeLease | null\n): string | null {\n if (!runtimeLease) {\n return \"runtime_lease_missing\";\n }\n\n if (!Number.isInteger(runtimeLease.pid) || runtimeLease.pid <= 0) {\n return \"invalid_pid\";\n }\n\n if (!isPidAlive(runtimeLease.pid)) {\n return \"process_not_alive\";\n }\n\n if (isRuntimeLeaseHeartbeatStale(runtimeLease)) {\n return \"heartbeat_stale\";\n }\n\n return null;\n}\n\nfunction selectObservedRuntimeProcess(\n ownedProcesses: readonly DaemonOwnedProcess[]\n): DaemonOwnedProcess | null {\n const sortedProcesses = [...ownedProcesses].sort((left, right) => {\n const priorityDifference =\n resolveOwnershipPriority(left.ownership) -\n resolveOwnershipPriority(right.ownership);\n if (priorityDifference !== 0) {\n return priorityDifference;\n }\n const modeDifference =\n resolveModePriority(left.mode) - resolveModePriority(right.mode);\n if (modeDifference !== 0) {\n return modeDifference;\n }\n return left.pid - right.pid;\n });\n return sortedProcesses[0] ?? null;\n}\n\nfunction resolveOwnershipPriority(\n ownership: DaemonOwnedProcess[\"ownership\"]\n): number {\n switch (ownership) {\n case \"stable_launcher\":\n return 0;\n case \"legacy_detached\":\n return 1;\n case \"cli_direct\":\n return 2;\n default:\n return 3;\n }\n}\n\nfunction resolveModePriority(mode: DaemonOwnedProcess[\"mode\"]): number {\n switch (mode) {\n case \"background\":\n return 0;\n case \"foreground\":\n return 1;\n default:\n return 2;\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isRuntimeLeaseHeartbeatStale(\n runtimeLease: DaemonRuntimeLease\n): boolean {\n const freshnessTimestamp = runtimeLease.heartbeatAt ?? runtimeLease.updatedAt;\n const heartbeatMs = Date.parse(freshnessTimestamp);\n if (Number.isNaN(heartbeatMs)) {\n return true;\n }\n return Date.now() - heartbeatMs > DAEMON_HEARTBEAT_STALE_MS;\n}\n","import process from \"node:process\";\nimport { sleep } from \"@openmeld/utils\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n clearDaemonServiceRuntimeState,\n getDaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n inspectLegacySharedDaemonService,\n type LegacySharedDaemonServiceInspection,\n} from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\nimport { resolveObservedDaemonRuntimeStatus } from \"./daemon-service-runtime-observer\";\n\nconst DEFAULT_SYSTEM_SERVICE_STOP_WAIT_MS = 3000;\nconst DEFAULT_SYSTEM_SERVICE_STOP_POLL_MS = 200;\n\nexport type CurrentDaemonRuntimeContext = {\n status: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n};\n\nexport type DaemonRuntimeCleanupDecision = {\n context: CurrentDaemonRuntimeContext;\n cleared: boolean;\n};\n\nexport async function readCurrentObservedDaemonRuntimeStatus(): Promise<DaemonServiceRuntimeStatus> {\n return await readObservedRuntimeState();\n}\n\nexport async function clearDaemonRuntimeStateIfDefinitelyStopped(): Promise<DaemonRuntimeCleanupDecision> {\n const context = await readCurrentDaemonRuntimeContext();\n const isDefinitelyStopped =\n context.effectiveRuntimeStatus === \"not_running\" ||\n (await isStoppedSystemServiceSnapshot(context));\n if (!isDefinitelyStopped) {\n return {\n context,\n cleared: false,\n };\n }\n await clearDaemonServiceRuntimeState();\n return {\n context,\n cleared: true,\n };\n}\n\nasync function isStoppedSystemServiceSnapshot(\n context: CurrentDaemonRuntimeContext\n): Promise<boolean> {\n if (\n context.runtimeStatus.status !== \"stale\" ||\n !context.runtimeStatus.managedBySystemService ||\n context.serviceManagerStatus?.running !== false\n ) {\n return false;\n }\n\n const ownedProcesses = await listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid],\n });\n return ownedProcesses.length === 0;\n}\n\nexport async function readCurrentDaemonRuntimeContext(\n input: { status?: DaemonStatus | null } = {}\n): Promise<CurrentDaemonRuntimeContext> {\n const status = input.status ?? (await getDaemonStatus());\n const runtimeStatus = await readCurrentObservedDaemonRuntimeStatus();\n const { serviceManager, serviceManagerStatus, legacySharedService } =\n await resolveDaemonServiceManagerForRuntimeState({\n status,\n runtimeState: runtimeStatus,\n });\n const effectiveRuntimeStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState: runtimeStatus,\n serviceManagerStatus,\n });\n\n return {\n status,\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n legacySharedService,\n effectiveRuntimeStatus,\n };\n}\n\nexport async function resolveDaemonRuntimeState(\n status: DaemonStatus\n): Promise<DaemonServiceRuntimeStatus | null> {\n if (!status.installed) {\n return null;\n }\n return await readCurrentObservedDaemonRuntimeStatus();\n}\n\nexport async function resolveDaemonServiceManagerFromRuntimeState(\n runtimeState: DaemonServiceRuntimeStatus | null\n): Promise<DaemonServiceManager | null> {\n if (!runtimeState?.managedBySystemService) {\n return null;\n }\n\n if (runtimeState.serviceController === \"legacy-detached\") {\n return null;\n }\n\n return await resolveDaemonServiceManager(runtimeState.serviceController);\n}\n\nexport async function resolveDaemonServiceManagerForRuntimeState(input: {\n status: DaemonStatus;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): Promise<{\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n}> {\n const initialManager = await resolveDaemonServiceManagerFromRuntimeState(\n input.runtimeState\n );\n const initialManagerStatus = initialManager\n ? await initialManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null)\n : null;\n\n if (\n input.status.installed &&\n input.runtimeState?.managedBySystemService !== true &&\n !initialManagerStatus?.installed\n ) {\n const detectedManager = await resolveDaemonServiceManager().catch<null>(\n () => null\n );\n if (detectedManager) {\n const detectedManagerStatus = await detectedManager\n .status()\n .catch<DaemonServiceManagerRuntimeStatus | null>(() => null);\n if (detectedManagerStatus?.installed) {\n return {\n serviceManager: detectedManager,\n serviceManagerStatus: detectedManagerStatus,\n legacySharedService: null,\n };\n }\n }\n }\n\n const legacySharedService = await inspectLegacySharedDaemonService().catch(\n () => null\n );\n if (\n legacySharedService?.present &&\n legacySharedService.serviceManagerStatus?.installed\n ) {\n const legacyManager =\n legacySharedService.serviceManager ??\n (await resolveDaemonServiceManager(\n legacySharedService.runtimeStatus.serviceController === \"unknown\"\n ? undefined\n : legacySharedService.runtimeStatus.serviceController,\n legacySharedService.pathInput\n ).catch(() => null));\n if (legacyManager) {\n return {\n serviceManager: legacyManager,\n serviceManagerStatus: legacySharedService.serviceManagerStatus,\n legacySharedService,\n };\n }\n }\n\n return {\n serviceManager: initialManager,\n serviceManagerStatus: initialManagerStatus,\n legacySharedService,\n };\n}\n\nexport function getEffectiveDaemonRuntimeStatus(input: {\n runtimeState: DaemonServiceRuntimeStatus;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): DaemonServiceRuntimeStatus[\"status\"] {\n if (input.runtimeState.status === \"running\") {\n return \"running\";\n }\n\n if (\n !(input.runtimeState.managedBySystemService && input.serviceManagerStatus)\n ) {\n return input.runtimeState.status;\n }\n\n if (input.runtimeState.status === \"stale\") {\n if (input.runtimeState.reason === \"heartbeat_stale\") {\n return \"stale\";\n }\n if (input.serviceManagerStatus.running) {\n return \"running\";\n }\n if (!input.serviceManagerStatus.enabled) {\n return \"not_running\";\n }\n }\n\n if (!input.serviceManagerStatus.running) {\n return \"not_running\";\n }\n\n return input.runtimeState.status;\n}\n\nexport async function waitForDaemonSystemServiceToStop(input: {\n manager: DaemonServiceManager;\n waitMs?: number;\n pollMs?: number;\n}): Promise<boolean> {\n const waitMs = input.waitMs ?? DEFAULT_SYSTEM_SERVICE_STOP_WAIT_MS;\n const pollMs = input.pollMs ?? DEFAULT_SYSTEM_SERVICE_STOP_POLL_MS;\n const deadlineMs = Date.now() + waitMs;\n\n while (Date.now() < deadlineMs) {\n const currentRuntime = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n const managerStatus = await input.manager.status().catch(() => null);\n\n if (\n managerStatus?.running === false &&\n currentRuntime !== null &&\n currentRuntime.status !== \"running\"\n ) {\n return true;\n }\n\n if (\n currentRuntime?.status === \"stale\" &&\n !currentRuntime.managedBySystemService\n ) {\n return true;\n }\n\n if (currentRuntime?.status === \"not_running\") {\n return true;\n }\n\n await sleep(pollMs);\n }\n\n const finalRuntime = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (finalRuntime?.status === \"not_running\") {\n return true;\n }\n\n if (\n finalRuntime?.status === \"stale\" &&\n !finalRuntime.managedBySystemService\n ) {\n return true;\n }\n\n if (finalRuntime?.status === \"running\") {\n return false;\n }\n\n if (finalRuntime === null) {\n return false;\n }\n\n const finalManagerStatus = await input.manager.status().catch(() => null);\n return finalManagerStatus?.running === false;\n}\n\nasync function readObservedRuntimeState(): Promise<DaemonServiceRuntimeStatus> {\n const ignoredProcessIds = [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n );\n const [runtimeLease, ownedProcesses] = await Promise.all([\n readDaemonRuntimeLease().catch(() => null),\n listDaemonOwnedProcesses({\n ignoreProcessIds: ignoredProcessIds,\n }),\n ]);\n return resolveObservedDaemonRuntimeStatus({\n runtimeLease,\n ownedProcesses,\n });\n}\n"],"mappings":"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"}