openmeld 0.3.233 → 0.3.234
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-me-membership-_O3IzRLn.js → add-me-membership-CmHUjDvu.js} +2 -2
- package/dist/{add-me-membership-_O3IzRLn.js.map → add-me-membership-CmHUjDvu.js.map} +1 -1
- package/dist/{agents-B5E7c7sQ.js → agents-CNW1dony.js} +9 -9
- package/dist/{agents-B5E7c7sQ.js.map → agents-CNW1dony.js.map} +1 -1
- package/dist/{api-client-foundation-1p1VVFJ_.js → api-client-foundation-BHjffwwr.js} +1 -1
- package/dist/{api-client-foundation-C-RPnq_p.js → api-client-foundation-D6zHrrGV.js} +3 -3
- package/dist/{api-client-foundation-C-RPnq_p.js.map → api-client-foundation-D6zHrrGV.js.map} +1 -1
- package/dist/auth-session-CCLabxRT.js +4 -0
- package/dist/{auth-session-iXCJO5oB.js → auth-session-CjxqNKvh.js} +2 -2
- package/dist/{auth-session-iXCJO5oB.js.map → auth-session-CjxqNKvh.js.map} +1 -1
- package/dist/{channel-BciBrA3Y.js → channel-BW2_rI6u.js} +3 -3
- package/dist/{channel-BciBrA3Y.js.map → channel-BW2_rI6u.js.map} +1 -1
- package/dist/{command-D0pcAIoE.js → command-9Iorb5GA.js} +16 -16
- package/dist/{command-D0pcAIoE.js.map → command-9Iorb5GA.js.map} +1 -1
- package/dist/{computer-connection-CHP1-0rK.js → computer-connection-LX1R7jD0.js} +2 -2
- package/dist/{computer-connection-CHP1-0rK.js.map → computer-connection-LX1R7jD0.js.map} +1 -1
- package/dist/{computer-connection-review-dHotFqmD.js → computer-connection-review-CeOHkloT.js} +5 -5
- package/dist/{computer-connection-review-dHotFqmD.js.map → computer-connection-review-CeOHkloT.js.map} +1 -1
- package/dist/{computer-disconnect-B2DLDxWx.js → computer-disconnect-CXDO8zgT.js} +7 -7
- package/dist/{computer-disconnect-B2DLDxWx.js.map → computer-disconnect-CXDO8zgT.js.map} +1 -1
- package/dist/{computer-setup-continuation-Cv_c1B-7.js → computer-setup-continuation-XgvjM0jF.js} +3 -3
- package/dist/{computer-setup-continuation-Cv_c1B-7.js.map → computer-setup-continuation-XgvjM0jF.js.map} +1 -1
- package/dist/{context-BnhlFS8m.js → context-D3GnSqg8.js} +3 -3
- package/dist/{context-BnhlFS8m.js.map → context-D3GnSqg8.js.map} +1 -1
- package/dist/control-plane-QqGL-jtT.js.map +1 -1
- package/dist/{daemon-device-id-DbSIqHoZ.js → daemon-device-id-OMqh2F9_.js} +5 -5
- package/dist/{daemon-device-id-DbSIqHoZ.js.map → daemon-device-id-OMqh2F9_.js.map} +1 -1
- package/dist/{daemon-lifecycle-journal-DsVVvKJe.js → daemon-lifecycle-journal-Dq8W9V9C.js} +4 -4
- package/dist/{daemon-lifecycle-journal-DsVVvKJe.js.map → daemon-lifecycle-journal-Dq8W9V9C.js.map} +1 -1
- package/dist/{daemon-service-runtime-DZI6Ke3_.js → daemon-service-runtime-B-x4bBKx.js} +2 -2
- package/dist/{daemon-service-runtime-DZI6Ke3_.js.map → daemon-service-runtime-B-x4bBKx.js.map} +1 -1
- package/dist/{daemon-service-update-coordinator-BgVBlJ4d.js → daemon-service-update-coordinator-Brv_30Kn.js} +18 -16
- package/dist/{daemon-service-update-coordinator-BgVBlJ4d.js.map → daemon-service-update-coordinator-Brv_30Kn.js.map} +1 -1
- package/dist/{dispatch-owned-runtime-BeIQetEt.js → dispatch-owned-runtime-Czq270vy.js} +50 -617
- package/dist/dispatch-owned-runtime-Czq270vy.js.map +1 -0
- package/dist/{dist-BgYBvEBB.js → dist-CJL7LE-y.js} +193 -358
- package/dist/dist-CJL7LE-y.js.map +1 -0
- package/dist/{dist-DQS0XYkb.js → dist-Ccpvj1tf.js} +2 -2
- package/dist/{dist-DQS0XYkb.js.map → dist-Ccpvj1tf.js.map} +1 -1
- package/dist/{dist-z72xYz5Z.js → dist-MpN-h8da.js} +1 -1
- package/dist/{elapsed-time-C7S-6bWV.js → elapsed-time-BSphCejK.js} +5 -5
- package/dist/{elapsed-time-C7S-6bWV.js.map → elapsed-time-BSphCejK.js.map} +1 -1
- package/dist/{entry-CX24qHnm.js → entry-CDablKgv.js} +7 -7
- package/dist/{entry-CX24qHnm.js.map → entry-CDablKgv.js.map} +1 -1
- package/dist/{installation-inventory-B3mwQFEA.js → installation-inventory-CRnah3Xf.js} +3 -3
- package/dist/{installation-inventory-B3mwQFEA.js.map → installation-inventory-CRnah3Xf.js.map} +1 -1
- package/dist/{installer-DnIJ4y3l.js → installer-BYBrLBth.js} +2 -2
- package/dist/{installer-DnIJ4y3l.js.map → installer-BYBrLBth.js.map} +1 -1
- package/dist/{meta-api-DgHkiIdr.js → meta-api-ClHCkzZB.js} +4 -4
- package/dist/{meta-api-DgHkiIdr.js.map → meta-api-ClHCkzZB.js.map} +1 -1
- package/dist/{openmeld-kYp99hOl.js → openmeld-Yz7J0OaB.js} +32 -32
- package/dist/{openmeld-kYp99hOl.js.map → openmeld-Yz7J0OaB.js.map} +1 -1
- package/dist/openmeld-dev-environment-DwdvL7jg.js +24 -0
- package/dist/openmeld-dev-environment-DwdvL7jg.js.map +1 -0
- package/dist/openmeld-dev.js +1 -19
- package/dist/openmeld-dev.js.map +1 -1
- package/dist/{openmeld-maintenance-worker-BqU1Asrm.js → openmeld-maintenance-worker-CVjbc-dv.js} +9 -9
- package/dist/{openmeld-maintenance-worker-BqU1Asrm.js.map → openmeld-maintenance-worker-CVjbc-dv.js.map} +1 -1
- package/dist/{openmeld-tools-update-join-BKJnGR5h.js → openmeld-tools-update-join-Em7DfQt6.js} +4 -4
- package/dist/{openmeld-tools-update-join-BKJnGR5h.js.map → openmeld-tools-update-join-Em7DfQt6.js.map} +1 -1
- package/dist/openmeld.js +4 -4
- package/dist/{prepare-provider-runtime-CD6XRt7X.js → prepare-provider-runtime-Bf2GBijn.js} +174 -49
- package/dist/prepare-provider-runtime-Bf2GBijn.js.map +1 -0
- package/dist/{prepare-session-executor-DY2s4FuY.js → prepare-session-executor-D8Vbyoq4.js} +18 -18
- package/dist/{prepare-session-executor-DY2s4FuY.js.map → prepare-session-executor-D8Vbyoq4.js.map} +1 -1
- package/dist/{process-channel-CzgOWiuh.js → process-channel-CTPL81j6.js} +2 -2
- package/dist/{process-channel-CzgOWiuh.js.map → process-channel-CTPL81j6.js.map} +1 -1
- package/dist/{runtime-Br4Ga0rJ.js → runtime-aUrBNKSl.js} +7860 -7249
- package/dist/runtime-aUrBNKSl.js.map +1 -0
- package/dist/{runtime-agent-controller-reporting-submission-CQjbBiHh.js → runtime-agent-controller-reporting-submission-BJY9cLyh.js} +16 -46
- package/dist/{runtime-agent-controller-reporting-submission-CQjbBiHh.js.map → runtime-agent-controller-reporting-submission-BJY9cLyh.js.map} +1 -1
- package/dist/{runtime-transport-D4CVffnp.js → runtime-transport-DyBmX7ds.js} +569 -30
- package/dist/runtime-transport-DyBmX7ds.js.map +1 -0
- package/dist/{service-D9QVc4_y.js → service-CMNaJrvV.js} +68 -38
- package/dist/service-CMNaJrvV.js.map +1 -0
- package/dist/{service-account-authorization-DLhUgGDb.js → service-account-authorization-CdyvPbvg.js} +2 -2
- package/dist/{service-account-authorization-DLhUgGDb.js.map → service-account-authorization-CdyvPbvg.js.map} +1 -1
- package/dist/{service-account-control-DIdQILmo.js → service-account-control-jnKTjLAR.js} +9 -9
- package/dist/{service-account-control-DIdQILmo.js.map → service-account-control-jnKTjLAR.js.map} +1 -1
- package/dist/{service-control-capabilities-CGv5Cuxo.js → service-control-capabilities-CRsFO-Jf.js} +3 -3
- package/dist/{service-control-capabilities-CGv5Cuxo.js.map → service-control-capabilities-CRsFO-Jf.js.map} +1 -1
- package/dist/{service-control-capabilities-BvHU_NcX.js → service-control-capabilities-DpJNUd1S.js} +1 -1
- package/dist/{state-AWe5DSV8.js → state-CON1kJsS.js} +2 -2
- package/dist/{state-AWe5DSV8.js.map → state-CON1kJsS.js.map} +1 -1
- package/dist/{runtime-reporting-health-state-a1FUE1S-.js → updates-api-BpWiCpAo.js} +374 -206
- package/dist/updates-api-BpWiCpAo.js.map +1 -0
- package/dist/{upgrade-CcnlL7FH.js → upgrade-Bdh732dG.js} +7 -7
- package/dist/{upgrade-CcnlL7FH.js.map → upgrade-Bdh732dG.js.map} +1 -1
- package/dist/upgrade-frLu7pCB.js +4 -0
- package/package.json +11 -11
- package/dist/auth-session-CmjjkLiB.js +0 -4
- package/dist/dispatch-owned-runtime-BeIQetEt.js.map +0 -1
- package/dist/dist-BgYBvEBB.js.map +0 -1
- package/dist/prepare-provider-runtime-CD6XRt7X.js.map +0 -1
- package/dist/runtime-Br4Ga0rJ.js.map +0 -1
- package/dist/runtime-reporting-health-state-a1FUE1S-.js.map +0 -1
- package/dist/runtime-transport-D4CVffnp.js.map +0 -1
- package/dist/service-D9QVc4_y.js.map +0 -1
- package/dist/upgrade-CLnZ4WBF.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-service-update-coordinator-BgVBlJ4d.js","names":["process","normalizeOptionalText","unexpectedSelectableReason","isRecord","normalizeOptionalText","writeJsonAtomic","toErrorMessage","toErrorMessage","readCurrentDaemonRuntimeContextImpl","process","process","process","runCommand","normalize","toErrorMessage","normalizeOptionalText","parseJson","toErrorMessage","toErrorMessage","STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS","toErrorMessage","toErrorMessage","normalizeOptionalText","dedupeAnomalyCodes","isRuntimeContractUpdateRequired","toErrorMessage","process","process","isPidAlive","toErrorMessage","process","normalizeOptionalText","toErrorMessage"],"sources":["../../../packages/schemas/dist/schemas/http/daemon-route-observation.js","../src/local-service/lifecycle/daemon-service-command-spec.ts","../src/command-entry-checks/cli-update-assessment.ts","../src/local-service/state/current-device-identity.ts","../src/system/current-local-runtime-reply-readiness.ts","../src/command-entry-checks/server-required-version-assessment.ts","../src/command-entry-checks/service-update-urgency.ts","../src/local-service/lifecycle/current-daemon-version.ts","../src/local-service/lifecycle/daemon-service-anomaly-groups.ts","../src/local-service/lifecycle/version-change-direction.ts","../src/local-service/lifecycle/daemon-service-alignment-target.ts","../src/local-service/state/local-state-version.ts","../src/local-service/state/runtime-contract-guard.ts","../src/local-service/lifecycle/daemon-runtime-contract-compatibility.ts","../src/local-service/lifecycle/daemon-service-owner-snapshot.ts","../src/local-service/lifecycle/daemon-service-inventory.ts","../src/local-service/lifecycle/daemon-service-update-worker-manager.ts","../src/local-service/maintenance/openmeld-tools-maintenance-policy.ts","../src/local-service/maintenance/openmeld-tools-update-attempt-state.ts","../src/local-service/maintenance/openmeld-tools-update-context.ts","../src/local-service/maintenance/openmeld-tools-upgrade-process.ts","../src/local-service/maintenance/openmeld-tools-update-coordinator.ts","../src/local-service/lifecycle/daemon-service-contract-writer.ts","../src/local-service/lifecycle/daemon-service-dependency-diagnostics.ts","../../../packages/start/dist/index.js","../src/config/daemon-route-observation-api.ts","../src/local-service/lifecycle/local-service-demand.ts","../src/provider-hosts/openclaw/diagnostics.ts","../src/system/gateway-chain-readiness.ts","../src/system/provider-diagnostics/openclaw/guidance.ts","../src/system/reply-readiness-copy.ts","../src/system/reply-readiness.ts","../src/system/current-reply-readiness-snapshot.ts","../src/local-service/state/daemon-start-failure-state.ts","../src/local-service/lifecycle/daemon-service-freshness.ts","../src/local-service/lifecycle/daemon-service-repair-guidance.ts","../src/system/service-readiness-resolver.ts","../src/local-service/status/daemon-status-attention.ts","../src/local-service/status/daemon-status-snapshot.ts","../src/local-service/lifecycle/daemon-service-evidence.ts","../src/local-service/state/runtime-data-preservation.ts","../src/local-service/lifecycle/daemon-service-stalled-force-kill.ts","../src/local-service/lifecycle/daemon-service-start-recovery.ts","../src/local-service/lifecycle/daemon-service-startup-wait.ts","../src/local-service/lifecycle/daemon-service-lifecycle.ts","../src/local-service/lifecycle/daemon-service-update-coordinator.ts"],"sourcesContent":["import { daemonServiceLaneSchema } from \"../daemon/service-contract.js\";\nimport { daemonExecutionCompatibilitySchema, localWakeRouteReportSchema, runtimeTransportCapabilitiesSchema, runtimeTransportErrorCodeSchema, runtimeTransportLookupRouteOwnerServiceEvidenceSchema, runtimeTransportRejectedProfileRegistrationSchema } from \"../daemon/runtime-transport.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/http/daemon-route-observation.ts\nconst daemonRouteObservationRouteSchema = z$1.discriminatedUnion(\"online\", [z$1.strictObject({\n\tonline: z$1.literal(true),\n\tdaemonSessionId: z$1.string().min(1),\n\tdeviceId: z$1.string().min(1),\n\tlane: daemonServiceLaneSchema,\n\tserviceVersion: z$1.string().trim().min(1).nullable().optional(),\n\tconnectionGeneration: z$1.number().int().positive(),\n\tleaseEpoch: z$1.number().int().positive(),\n\tlastHeartbeatMs: z$1.number().int().nonnegative(),\n\tcapabilities: runtimeTransportCapabilitiesSchema,\n\texecutionCompatibility: daemonExecutionCompatibilitySchema,\n\tlocalWakeRouteReport: localWakeRouteReportSchema.optional()\n}), z$1.strictObject({\n\tonline: z$1.literal(false),\n\treasonCode: runtimeTransportErrorCodeSchema,\n\tlastHeartbeatMs: z$1.number().int().nonnegative().optional(),\n\townerService: runtimeTransportLookupRouteOwnerServiceEvidenceSchema.optional(),\n\texecutionCompatibility: daemonExecutionCompatibilitySchema.optional(),\n\tlocalWakeRouteReport: localWakeRouteReportSchema.optional(),\n\trejectedProfileRegistration: runtimeTransportRejectedProfileRegistrationSchema.optional()\n})]);\nconst daemonRouteObservationResponseSchema = z$1.strictObject({\n\tobservedAt: z$1.string().trim().min(1),\n\tprofileId: z$1.string().trim().min(1),\n\troute: daemonRouteObservationRouteSchema\n});\n//#endregion\nexport { daemonRouteObservationResponseSchema, daemonRouteObservationRouteSchema };\n\n//# sourceMappingURL=daemon-route-observation.js.map","import { userInfo } from \"node:os\";\nimport { delimiter } from \"node:path\";\nimport process from \"node:process\";\nimport {\n normalizeCommandEnvironment,\n WINDOWS_RUNTIME_ENV_KEYS,\n} from \"@openmeld/adapter-core/process-environment\";\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 \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n openMeldManagedVersionBinaryPath,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport { resolveCliSelfVersion } from \"../../local-components/managed-install\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n daemonServiceBinaryExecutablePath,\n daemonServiceExecutableWrapperPath,\n daemonServiceLauncherPath,\n ensureDaemonServiceStableBinaryExecutable,\n readDaemonActiveBundleState,\n resolveAlignedDaemonActiveBundleEntryPath,\n writeDaemonServiceExecutableWrapper,\n writeDaemonServiceLauncher,\n} from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceCommandSpec,\n DaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nconst DEFAULT_LAUNCHD_PATH = \"/usr/bin:/bin:/usr/sbin:/sbin\";\nconst MACOS_SYSTEM_SHELL = \"/bin/sh\";\nconst DISPATCH_SPACE_ACTION_PATH_PATTERN =\n /[\\\\/]runtime[\\\\/]daemon[\\\\/]dispatch-space-actions[\\\\/][^\\\\/]+[\\\\/]bin$/u;\nconst DAEMON_SERVICE_ENV_KEY_WHITELIST = new Set([\n \"HOME\",\n \"PATH\",\n \"SHELL\",\n \"TERM\",\n \"TMPDIR\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_COLLATE\",\n \"LC_CTYPE\",\n \"LC_MESSAGES\",\n \"LC_MONETARY\",\n \"LC_NUMERIC\",\n \"LC_TIME\",\n \"USER\",\n \"LOGNAME\",\n OPENMELD_HOME_ENV_KEY,\n \"OPENMELD_DEV_MODE\",\n \"OPENMELD_ENV_PRESET\",\n \"OPENMELD_USER_FACING_CLI_COMMAND\",\n \"OPENMELD_CLI_BINARY_MANIFEST_URL\",\n \"OPENMELD_WINDOWS_INTERNAL_PREVIEW\",\n]);\n\n// Start/account admission/repair reuse the selected GUI Service, never a path\n// reconstructed from the installed CLI's version.\nexport async function resolveInstalledDaemonSystemServiceCommandSpec(\n input: Omit<\n Parameters<typeof buildDaemonSystemServiceCommandSpec>[0],\n \"binaryExecutablePath\"\n >\n): Promise<DaemonServiceCommandSpec> {\n if (\n input.controller !== \"windows-service\" ||\n (input.distribution ?? resolveOpenMeldDistribution()) !== \"binary\"\n ) {\n return buildDaemonSystemServiceCommandSpec(input);\n }\n const executable = await resolveAlignedDaemonActiveBundleEntryPath();\n if (!executable) {\n throw new Error(\n \"The installed Windows Service bundle needs repair before it can start.\"\n );\n }\n return buildDaemonSystemServiceCommandSpec({\n ...input,\n binaryExecutablePath: executable,\n });\n}\n\nexport function buildDaemonSystemServiceCommandSpec(input: {\n accountAdmissionId?: string;\n controller: DaemonServiceManager[\"controller\"];\n binaryExecutablePath?: string;\n distribution?: OpenMeldDistribution;\n environmentTarget?: OpenMeldEnvironmentTarget;\n}): DaemonServiceCommandSpec {\n const args: string[] = [\"service\", \"run\", \"--mode\", \"foreground\"];\n if (input.accountAdmissionId) {\n args.push(\"--account-admission-id\", input.accountAdmissionId);\n }\n const environmentTarget =\n input.environmentTarget ?? resolveOpenMeldEnvironmentTargetFromEnv();\n const { executable, specArgs } = resolveDaemonServiceExecutable({\n args,\n binaryExecutablePath: input.binaryExecutablePath,\n controller: input.controller,\n distribution: input.distribution,\n });\n\n return {\n executable,\n args: specArgs,\n env: {\n ...buildSystemServiceEnvironment(),\n OPENMELD_ENV_PRESET: environmentTarget.preset,\n OPENMELD_GATEWAY_URL: environmentTarget.gatewayUrl,\n OPENMELD_AUTH_URL: environmentTarget.authBaseUrl,\n OPENMELD_USER_FACING_CLI_COMMAND: environmentTarget.userFacingCommand,\n [DAEMON_SERVICE_RUNTIME_MODE_ENV]: \"foreground\",\n [DAEMON_SERVICE_RUNTIME_DETACHED_ENV]: \"1\",\n [DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV]: \"1\",\n [DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV]: input.controller,\n [DAEMON_SERVICE_RUNTIME_AUTO_START_ENV]: \"1\",\n },\n workingDirectory: daemonRuntimeRootPath(),\n };\n}\n\nfunction resolveDaemonServiceExecutable(input: {\n args: string[];\n binaryExecutablePath?: string;\n controller: DaemonServiceManager[\"controller\"];\n distribution?: OpenMeldDistribution;\n}): { executable: string; specArgs: string[] } {\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"windows-service\" && !input.binaryExecutablePath) {\n throw new Error(\n \"Windows Service registration requires its selected background executable.\"\n );\n }\n // macOS privacy grants identify a bare CLI by its executable path. Keep the\n // launchd carrier at one physical path across upgrades; the prepared,\n // signed version binary is copied there before registration. Other service\n // managers retain the existing versioned executable contract.\n return {\n executable:\n input.controller === \"launchd\"\n ? daemonServiceBinaryExecutablePath()\n : (input.binaryExecutablePath ??\n openMeldManagedVersionBinaryPath(resolveCliSelfVersion())),\n specArgs: input.args,\n };\n }\n const launcherPath = daemonServiceLauncherPath();\n if (input.controller === \"launchd\") {\n return {\n executable: MACOS_SYSTEM_SHELL,\n specArgs: [daemonServiceExecutableWrapperPath(), ...input.args],\n };\n }\n return {\n executable: process.execPath,\n specArgs: [launcherPath, ...input.args],\n };\n}\n\nexport async function ensureDaemonSystemServiceCommandFiles(input: {\n controller: DaemonServiceManager[\"controller\"];\n distribution?: OpenMeldDistribution;\n}): Promise<void> {\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n await ensureDaemonServiceStableBinaryExecutable();\n }\n return;\n }\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleFormat === \"binary_v1\") {\n throw new Error(\n \"Refusing to replace a binary-managed OpenMeld Service with the npm carrier. Run the managed OpenMeld binary for Service repair or update.\"\n );\n }\n await writeDaemonServiceLauncher();\n if (input.controller === \"launchd\") {\n await writeDaemonServiceExecutableWrapper();\n }\n}\n\nfunction buildSystemServiceEnvironment(): Record<string, string> {\n const env: Record<string, string> = {};\n const runtimeUser = userInfo().username;\n for (const [key, value] of Object.entries(\n normalizeCommandEnvironment(process.env)\n )) {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n !isDaemonServiceEnvironmentKey(key)\n ) {\n continue;\n }\n env[key] =\n key === \"PATH\"\n ? stripDispatchSpaceActionCliShims(value)\n : sanitizeDaemonServiceEnvironmentValue(value);\n }\n if (process.platform === \"darwin\") {\n env.PATH ??= DEFAULT_LAUNCHD_PATH;\n }\n if (process.platform === \"win32\") {\n // Task ownership checks need the same lane root used to register the task.\n // The published setup command intentionally leaves OPENMELD_HOME unset.\n env[OPENMELD_HOME_ENV_KEY] ??= resolveOpenMeldRootDir();\n }\n env.HOME ??= userInfo().homedir;\n env.USER ??= env.LOGNAME ?? runtimeUser;\n env.LOGNAME ??= env.USER;\n return env;\n}\n\nfunction stripDispatchSpaceActionCliShims(value: string): string {\n return value\n .split(delimiter)\n .filter((entry) => !DISPATCH_SPACE_ACTION_PATH_PATTERN.test(entry))\n .join(delimiter);\n}\n\nfunction isDaemonServiceEnvironmentKey(key: string): boolean {\n return (\n DAEMON_SERVICE_ENV_KEY_WHITELIST.has(key) ||\n (process.platform === \"win32\" &&\n WINDOWS_RUNTIME_ENV_KEYS.some((candidate) => candidate === key))\n );\n}\n\nfunction sanitizeDaemonServiceEnvironmentValue(value: string): string {\n let sanitized = \"\";\n for (const char of value) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n continue;\n }\n if ((code >= 0x00 && code <= 0x1f) || code === 0x7f) {\n continue;\n }\n sanitized += char;\n }\n return sanitized;\n}\n","import { isLoopbackHostname } from \"../config/loopback-hostname\";\nimport type { OpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport {\n buildNextVersionState,\n compareSemver,\n fetchLatestPackageInfo,\n isPlainReleaseVersion,\n type PackageLatestInfo,\n readVersionState,\n writeVersionState,\n} from \"../config/version-state\";\nimport type { OpenMeldDistribution } from \"../runtime/distribution\";\nimport { resolveOpenMeldDistribution } from \"../runtime/distribution\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\n\nconst OPENMELD_PACKAGE_NAME = \"openmeld\";\nconst CLI_UPDATE_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Result of resolving how the running CLI compares to its published release\n * channel. npm installs read npm's `latest` manifest; managed binaries read the\n * configured R2 manifest. This is the single place that derives the\n * forced-update signal from the channel's minimum required version, so the\n * entry-check gate and `openmeld doctor` cannot drift apart.\n */\nexport type CliUpdateAssessment = {\n /**\n * True when the version check actually applies to the current production\n * distribution or an explicitly configured canary/local binary.\n */\n checked: boolean;\n currentVersion: string;\n latestVersion: string | null;\n serviceVersion?: string;\n requiredFloor: string | null;\n updateAvailable: boolean;\n /**\n * True only when the running version is strictly below the published floor.\n * This is the positive confirmation that gates forced updates; any failure to\n * resolve the floor leaves it false (fail-open).\n */\n floorBreached: boolean;\n};\n\nexport function isCliUpdateCheckApplicable(\n environmentTarget: OpenMeldEnvironmentTarget,\n input: {\n distribution?: OpenMeldDistribution;\n manifestUrl?: string | null;\n } = {}\n): boolean {\n const distribution = input.distribution ?? resolveOpenMeldDistribution();\n const productionCheck =\n environmentTarget.preset === \"prod\" &&\n (distribution === \"binary\" ||\n environmentTarget.userFacingCommand === \"openmeld\");\n if (productionCheck) {\n return true;\n }\n const manifestUrl = normalizeOptionalText(\n input.manifestUrl ?? process.env.OPENMELD_CLI_BINARY_MANIFEST_URL\n );\n if (environmentTarget.preset === \"dev-local\" && distribution === \"binary\") {\n // The localhost setup lane can exercise the real updater without ever\n // falling back to a published production channel or updating source installs.\n const url = manifestUrl ? URL.parse(manifestUrl) : null;\n return Boolean(\n url &&\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n isLoopbackHostname(url.hostname)\n );\n }\n return (\n environmentTarget.preset === \"canary\" &&\n distribution === \"binary\" &&\n Boolean(manifestUrl)\n );\n}\n\n/**\n * Resolves the published latest version and required-update floor for the\n * current distribution's release channel (npm for npm installs, R2 for managed\n * binaries).\n *\n * Reads a fresh local cache first (24h TTL) so machine-mode (`--json`) commands\n * do not pay a network probe on every invocation; only a cold/stale cache hits\n * the channel. Background maintenance and explicit update actions can bypass\n * that cache with `forceRefresh` so a known release is never hidden by an older\n * command check. Any network or parse failure resolves to \"no signal\" so the\n * caller fails open and never locks a user out over a flaky release channel.\n */\nexport async function assessCliUpdate(input: {\n environmentTarget: OpenMeldEnvironmentTarget;\n forceRefresh?: boolean;\n currentVersion?: string;\n}): Promise<CliUpdateAssessment> {\n const currentVersion = input.currentVersion ?? OPENMELD_VERSION;\n const unchecked: CliUpdateAssessment = {\n checked: false,\n currentVersion,\n latestVersion: null,\n requiredFloor: null,\n updateAvailable: false,\n floorBreached: false,\n };\n if (!isCliUpdateCheckApplicable(input.environmentTarget)) {\n return unchecked;\n }\n\n const info = await resolveLatestPackageInfo({\n currentVersion,\n forceRefresh: input.forceRefresh === true,\n }).catch(() => null);\n if (!info?.version) {\n // Fail-open: we tried, but have no authoritative signal.\n return { ...unchecked, checked: true };\n }\n\n // Only trust a well-formed floor. A malformed value (corrupted cache or a\n // bad publish) is treated as \"no signal\" so it fails open instead of wrongly\n // gating via `compareSemver`'s lexical fallback.\n const requiredFloor =\n info.minRequiredCliVersion &&\n isPlainReleaseVersion(info.minRequiredCliVersion)\n ? info.minRequiredCliVersion\n : null;\n const floorBreached =\n requiredFloor !== null && compareSemver(currentVersion, requiredFloor) < 0;\n return {\n checked: true,\n currentVersion,\n latestVersion: info.version,\n ...(info.serviceVersion ? { serviceVersion: info.serviceVersion } : {}),\n requiredFloor,\n updateAvailable: compareSemver(currentVersion, info.version) < 0,\n floorBreached,\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 resolveLatestPackageInfo(input: {\n currentVersion: string;\n forceRefresh: boolean;\n}): Promise<PackageLatestInfo> {\n const cached = input.forceRefresh\n ? null\n : await readFreshCachedInfo(input.currentVersion);\n if (cached) {\n return cached;\n }\n const info = await fetchLatestPackageInfo(OPENMELD_PACKAGE_NAME, {\n forceRefresh: input.forceRefresh,\n });\n await persistInfo({ currentVersion: input.currentVersion, info });\n return info;\n}\n\nasync function readFreshCachedInfo(\n currentVersion: string\n): Promise<PackageLatestInfo | null> {\n const state = await readVersionState().catch(() => null);\n if (\n state?.last_version !== currentVersion ||\n !state.latest_version ||\n !state.last_checked_at\n ) {\n return null;\n }\n const checkedAt = Date.parse(state.last_checked_at);\n if (\n Number.isNaN(checkedAt) ||\n Date.now() - checkedAt >= CLI_UPDATE_CACHE_TTL_MS\n ) {\n return null;\n }\n const cachedRequiredFloor = state.required_floor ?? null;\n if (\n cachedRequiredFloor !== null &&\n !isPlainReleaseVersion(cachedRequiredFloor)\n ) {\n return null;\n }\n return {\n version: state.latest_version,\n minRequiredCliVersion: cachedRequiredFloor,\n };\n}\n\nasync function persistInfo(input: {\n currentVersion: string;\n info: PackageLatestInfo;\n}): Promise<void> {\n const previous = await readVersionState().catch(() => null);\n await writeVersionState(\n buildNextVersionState({\n previous,\n currentVersion: input.currentVersion,\n latestVersion: input.info.version,\n requiredFloor: input.info.minRequiredCliVersion,\n })\n ).catch(() => undefined);\n}\n","import { localAgentCatalogSchema } from \"@openmeld/schemas\";\nimport type {\n LocalAgentCatalog,\n LocalAgentCatalogSelectableReason,\n} from \"@openmeld/schemas/types\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport type { StartReadinessSnapshot } from \"../../start-local/readiness-types\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n} from \"./daemon-device-id\";\n\ntype LocalAgentCatalogEntry = LocalAgentCatalog[\"entries\"][number];\n\nexport function buildLocalAgentCatalogFromReadiness(\n readiness: StartReadinessSnapshot\n): LocalAgentCatalog {\n const entries = readiness.agents.candidates.map(\n buildLocalAgentCatalogEntryFromCandidate\n );\n const catalog: LocalAgentCatalog = {\n ...summarizeLocalAgentCatalogEntries(entries),\n entries,\n };\n const parsed = localAgentCatalogSchema.safeParse(catalog);\n if (!parsed.success) {\n throw new Error(\n `OpenMeld setup built an invalid local-agent catalog before reporting it: ${formatLocalAgentCatalogValidationError(\n parsed.error.issues\n )}`\n );\n }\n return parsed.data;\n}\n\nfunction buildLocalAgentCatalogEntryFromCandidate(\n candidate: StartReadinessSnapshot[\"agents\"][\"candidates\"][number]\n): LocalAgentCatalogEntry {\n if (candidate.lifecycleStatus === \"suspended\") {\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: \"not_available\",\n selectable: false,\n selectableReason: candidate.detected\n ? \"not_supported_yet\"\n : \"not_detected\",\n };\n }\n if (candidate.launchStatus === \"needs_repair\" && !candidate.enabled) {\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: \"not_available\",\n selectable: false,\n selectableReason: \"needs_repair\",\n };\n }\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: candidate.launchStatus,\n selectable: candidate.selectable,\n selectableReason: normalizeSelectableReason(candidate.selectableReason),\n };\n}\n\nfunction summarizeLocalAgentCatalogEntries(\n entries: LocalAgentCatalogEntry[]\n): Omit<LocalAgentCatalog, \"entries\"> {\n return {\n totalBuiltins: entries.length,\n detectedSupported: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"ready\"\n ).length,\n needsChoice: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"needs_choice\"\n ).length,\n needsRepair: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"needs_repair\"\n ).length,\n detectedNotSupportedYet: entries.filter(\n (entry) =>\n entry.detected &&\n entry.launchStatus === \"not_available\" &&\n entry.selectableReason === \"not_supported_yet\"\n ).length,\n notDetected: entries.filter((entry) => !entry.detected).length,\n };\n}\n\nexport async function readCurrentLocalDeviceId(\n input: {\n serviceContract?: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n } = {}\n): Promise<string | null> {\n const serviceContract =\n input.serviceContract === undefined\n ? await readDaemonServiceContract().catch(() => null)\n : input.serviceContract;\n const contractDeviceId = serviceContract?.deviceId;\n if (typeof contractDeviceId === \"string\" && contractDeviceId.trim().length) {\n return contractDeviceId.trim();\n }\n\n const runtimePaths = await ensureDaemonRuntimePaths();\n return await resolveDaemonDeviceId({\n deviceIdPath: runtimePaths.deviceIdPath,\n });\n}\n\nfunction normalizeSelectableReason(\n selectableReason: StartReadinessSnapshot[\"agents\"][\"candidates\"][number][\"selectableReason\"]\n): LocalAgentCatalogSelectableReason | null {\n switch (selectableReason) {\n case null:\n case \"not_detected\":\n case \"not_supported_yet\":\n case \"needs_repair\":\n case \"custom_coming_soon\":\n return selectableReason;\n default: {\n const unexpectedSelectableReason: never = selectableReason;\n throw new Error(\n `Unsupported local-agent selectableReason: ${unexpectedSelectableReason}`\n );\n }\n }\n}\n\nfunction formatLocalAgentCatalogValidationError(\n issues: readonly { message: string; path: PropertyKey[] }[]\n): string {\n return issues\n .slice(0, 3)\n .map((issue) => {\n const path = issue.path.length ? issue.path.join(\".\") : \"catalog\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n}\n","import { createCurrentDeviceApi } from \"@openmeld/api-client\";\nimport type { CurrentLocalRuntimeReplyReadinessResponse } from \"@openmeld/schemas/types\";\nimport { resolveOpenMeldEnvPreset } from \"../config/paths\";\nimport { readCurrentLocalDeviceId } from \"../local-service/state/current-device-identity\";\nimport { createCliApiClientFoundation } from \"../space/api-client-foundation\";\n\nexport type CurrentLocalRuntimeIdentity = {\n deviceId: string;\n runtimeLane: string;\n};\n\nexport async function readCurrentLocalRuntimeReplyReadiness(input: {\n gatewayUrl: string;\n}): Promise<CurrentLocalRuntimeReplyReadinessResponse> {\n const deviceId = await readCurrentLocalDeviceId();\n if (!deviceId) {\n throw new Error(\n \"This installation has no computer identity. Run openmeld setup to connect it.\"\n );\n }\n return await createCurrentDeviceApi(\n createCliApiClientFoundation(input.gatewayUrl)\n ).getPeopleComputerReplyReadiness({\n deviceId,\n runtimeLane: resolveOpenMeldEnvPreset(),\n });\n}\n\nexport async function assertCurrentLocalRuntimeCanReceiveWake(input: {\n commandLabel?: string;\n gatewayUrl: string;\n openMeldServiceRuntimeIdentity: CurrentLocalRuntimeIdentity;\n}): Promise<CurrentLocalRuntimeReplyReadinessResponse> {\n let response: CurrentLocalRuntimeReplyReadinessResponse;\n try {\n response = await readCurrentLocalRuntimeReplyReadiness({\n gatewayUrl: input.gatewayUrl,\n });\n } catch (error) {\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n detail: toErrorMessage(error),\n supportCode: \"current_reply_readiness.read_failed\",\n })\n );\n }\n\n const mismatchSupportCode = resolveCurrentTargetMismatchSupportCode({\n response,\n openMeldServiceRuntimeIdentity: input.openMeldServiceRuntimeIdentity,\n });\n if (mismatchSupportCode) {\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n supportCode: mismatchSupportCode,\n })\n );\n }\n\n if (\n response.canReplyFromThisComputer &&\n response.service.connected &&\n response.service.matchingCurrentRuntime\n ) {\n return response;\n }\n\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n detail: response.message,\n supportCode: resolveCurrentReplyReadinessSupportCode(response),\n })\n );\n}\n\nfunction resolveCurrentTargetMismatchSupportCode(input: {\n response: CurrentLocalRuntimeReplyReadinessResponse;\n openMeldServiceRuntimeIdentity: CurrentLocalRuntimeIdentity;\n}): string | null {\n if (input.response.currentTarget.availability !== \"resolved\") {\n return \"current_reply_readiness.current_target_missing\";\n }\n if (\n input.response.currentTarget.deviceId !==\n input.openMeldServiceRuntimeIdentity.deviceId\n ) {\n return \"current_reply_readiness.device_mismatch\";\n }\n if (\n input.response.currentTarget.runtimeLane !==\n input.openMeldServiceRuntimeIdentity.runtimeLane\n ) {\n return \"current_reply_readiness.lane_mismatch\";\n }\n return null;\n}\n\nfunction resolveCurrentReplyReadinessSupportCode(\n response: CurrentLocalRuntimeReplyReadinessResponse\n): string {\n return (\n response.service.reasonCodes[0] ??\n response.runtime.reasonCodes[0] ??\n `current_reply_readiness.${response.primaryBlocker}`\n );\n}\n\nfunction formatCurrentLocalRuntimeReplyReadinessFailure(input: {\n commandLabel?: string;\n detail?: string;\n supportCode: string;\n}): string {\n const commandLabel = input.commandLabel ?? \"setup\";\n return `OpenMeld Service started, but OpenMeld could not confirm this computer can receive local Wake work yet. Run ${commandLabel} again from this Terminal and keep OpenMeld Service running. Support code: ${input.supportCode}.${input.detail ? ` Detail: ${input.detail}` : \"\"}`;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const message = error.message.trim();\n return message.length > 0 ? message : \"unknown error\";\n }\n const message = String(error ?? \"\").trim();\n return message.length > 0 ? message : \"unknown error\";\n}\n","import { toStructuredApiClientFailure } from \"@openmeld/api-client\";\nimport type { DaemonStatusServerRequirementUnavailableReason } from \"@openmeld/schemas\";\nimport type {\n LocalCliComponentUpdateProjection,\n LocalServiceComponentUpdateProjection,\n} from \"@openmeld/schemas/types\";\nimport { getAuthSessionState } from \"../config/auth-session\";\nimport { readCurrentLocalRuntimeReplyReadiness } from \"../system/current-local-runtime-reply-readiness\";\n\n/**\n * Why the server-required version visor could not be resolved. Kept as a\n * small closed set (never the raw error) so callers can render a stable,\n * short \"unavailable (<reason>)\" message without leaking transport details.\n */\nexport type ServerRequiredVersionUnavailableReason =\n DaemonStatusServerRequirementUnavailableReason;\n\n/**\n * The server's view of what CLI/Service version this account currently\n * needs, read live from Core's compiled release manifest via\n * `getCurrentLocalRuntimeReplyReadiness` (`localComponents.cli` /\n * `.localComponents.service`). This is the second book the release-channel\n * check (`cli-update-assessment.ts`) has no visibility into: Core's release\n * manifest and the published release channel (npm registry / R2\n * `cli/manifest.json`) are stamped independently and can disagree — that gap\n * is exactly what caused the W-REL-DOCTOR half-rollout incident (Core\n * required 0.2.21 while the release channel was still serving 0.2.20).\n */\nexport type ServerRequiredVersionAssessment =\n | {\n available: true;\n generatedAt: string;\n cli: LocalCliComponentUpdateProjection;\n service: LocalServiceComponentUpdateProjection;\n }\n | {\n available: false;\n reason: ServerRequiredVersionUnavailableReason;\n detail: string | null;\n };\n\n/**\n * Resolves the server-required version visor for the current account.\n *\n * Skips the network round-trip entirely when there is no valid local auth\n * session (a request would 401 anyway), so `openmeld service status` /\n * `openmeld doctor` degrade instantly instead of waiting on a call already\n * known to fail. Any transport failure (offline, timeout, gateway error,\n * invalid response) is caught here and turned into an `available: false`\n * result: this function must never throw, and must never block or slow down\n * the release-channel view it is displayed alongside.\n *\n * Reuses the existing authenticated CLI-to-gateway channel\n * (`readCurrentLocalRuntimeReplyReadiness`, already used elsewhere — e.g. to\n * confirm reply readiness during `openmeld setup`) instead of opening a new\n * one, so it inherits that channel's short, bounded request timeout\n * (`DEFAULT_SPACE_REQUEST_TIMEOUT_MS`) and cannot hang `status`/`doctor`.\n */\nexport async function assessServerRequiredVersion(input: {\n gatewayUrl: string;\n}): Promise<ServerRequiredVersionAssessment> {\n const authState = await getAuthSessionState({ validateRemote: false }).catch(\n () => null\n );\n if (authState?.state !== \"valid\" || !authState.session) {\n return { available: false, reason: \"signed_out\", detail: null };\n }\n\n try {\n const response = await readCurrentLocalRuntimeReplyReadiness({\n gatewayUrl: input.gatewayUrl,\n });\n return {\n available: true,\n generatedAt: response.generatedAt,\n cli: response.localComponents.cli,\n service: response.localComponents.service,\n };\n } catch (error) {\n return {\n available: false,\n ...classifyServerRequiredVersionFailure(error),\n };\n }\n}\n\n/**\n * Renders a short, stable phrase for an unavailable server-required version\n * result, safe to inline in \"unavailable (<reason>)\" copy.\n */\nexport function describeServerRequiredVersionUnavailableReason(\n assessment: Extract<ServerRequiredVersionAssessment, { available: false }>\n): string {\n if (assessment.reason === \"signed_out\") {\n return \"not signed in\";\n }\n return assessment.detail ?? \"request failed\";\n}\n\nfunction classifyServerRequiredVersionFailure(error: unknown): {\n reason: ServerRequiredVersionUnavailableReason;\n detail: string | null;\n} {\n const failure = toStructuredApiClientFailure(error);\n if (failure.status === 401 || failure.status === 403) {\n return { reason: \"signed_out\", detail: failure.message };\n }\n if (\n failure.code === \"network.timeout\" ||\n failure.code === \"network.request_failed\"\n ) {\n return { reason: \"offline\", detail: failure.message };\n }\n return { reason: \"request_failed\", detail: failure.message };\n}\n","import { resolveOpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport {\n assessServerRequiredVersion,\n type ServerRequiredVersionAssessment,\n} from \"./server-required-version-assessment\";\n\nexport type ServiceUpdateUrgency = \"available\" | \"required\";\n\nexport async function resolveServiceUpdateUrgency(\n input: { gatewayUrl?: string } = {}\n): Promise<ServiceUpdateUrgency> {\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const assessment = await assessServerRequiredVersion({\n gatewayUrl: environmentTarget.gatewayUrl,\n });\n return resolveServiceUpdateUrgencyFromAssessment(assessment);\n}\n\nexport function resolveServiceUpdateUrgencyFromAssessment(\n assessment: ServerRequiredVersionAssessment\n): ServiceUpdateUrgency {\n return assessment.available && assessment.service.status === \"update_required\"\n ? \"required\"\n : \"available\";\n}\n","import { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { resolveBundledServiceRelease } from \"../../config/service-release\";\nimport { compareSemver } from \"../../config/version-state\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\n\nexport async function resolveCurrentDaemonExpectedVersion(\n selectedVersion = resolveBundledServiceRelease()?.version ?? OPENMELD_VERSION\n): Promise<string> {\n const contract = await readDaemonServiceContract();\n // Release selection must not silently downgrade an installed Service.\n // Inventory still verifies its bytes, runtime contract and lane.\n return contract && compareSemver(contract.daemonVersion, selectedVersion) > 0\n ? contract.daemonVersion\n : selectedVersion;\n}\n","import type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\n\nexport const DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"legacy_shared_service_present\",\n \"version_outdated\",\n \"legacy_detached_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\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 \"duplicate_owned_processes\",\n \"service_manager_environment_drift\",\n \"service_manager_startup_policy_drift\",\n ]);\n\nexport const DAEMON_SERVICE_AUTO_HEAL_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"manager_running_without_runtime\",\n \"service_manager_path_drift\",\n ]);\n\nexport const DAEMON_SERVICE_REPAIR_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"manager_running_without_runtime\",\n \"legacy_detached_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\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 \"service_manager_path_drift\",\n \"service_manager_environment_drift\",\n \"service_manager_startup_policy_drift\",\n \"duplicate_owned_processes\",\n ]);\n\nexport const DAEMON_SERVICE_ARTIFACT_DRIFT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"background_foreground_conflict\",\n \"bundle_lane_drift\",\n \"bundle_missing\",\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_path_invalid\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_version_drift\",\n \"manager_running_without_runtime\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\n \"runtime_stale\",\n \"service_manager_path_drift\",\n \"service_manager_environment_drift\",\n \"version_outdated\",\n ]);\n\nexport const DAEMON_SERVICE_RUN_BLOCKING_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n ...[...DAEMON_SERVICE_ARTIFACT_DRIFT_ANOMALIES].filter(\n (code) =>\n code !== \"runtime_stale\" &&\n code !== \"version_outdated\" &&\n code !== \"bundle_version_drift\"\n ),\n \"duplicate_owned_processes\",\n \"foreground_background_conflict\",\n ]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"duplicate_owned_processes\",\n \"manager_running_without_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_mismatch\",\n ]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\"bundle_missing\", \"bundle_path_invalid\"]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_lane_drift\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_version_drift\",\n \"runtime_contract_missing\",\n \"runtime_contract_unavailable\",\n \"service_manager_path_drift\",\n \"version_outdated\",\n \"service_manager_startup_policy_drift\",\n ]);\n\nexport type DaemonServiceWakeabilityClassification = {\n advisoryCodes: DaemonServiceAnomalyCode[];\n blockingCodes: DaemonServiceAnomalyCode[];\n blocksWake: boolean;\n conditionalCodes: DaemonServiceAnomalyCode[];\n executionEvidenceSafe: boolean;\n};\n\nexport type DaemonServiceRunStartabilityClassification = {\n blockingCodes: DaemonServiceAnomalyCode[];\n blocksStart: boolean;\n};\n\nexport function classifyDaemonServiceWakeability(input: {\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceWakeabilityClassification {\n const anomalyCodes = collectUniqueAnomalyCodes(input.inventory);\n const executionEvidenceSafe = hasVerifiedRunningDaemonExecutionEvidence({\n anomalyCodes,\n inventory: input.inventory,\n });\n const blockingCodes: DaemonServiceAnomalyCode[] = [];\n const advisoryCodes: DaemonServiceAnomalyCode[] = [];\n const conditionalCodes: DaemonServiceAnomalyCode[] = [];\n\n for (const code of anomalyCodes) {\n if (DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(code)) {\n blockingCodes.push(code);\n continue;\n }\n\n if (DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(code)) {\n conditionalCodes.push(code);\n if (\n shouldBlockConditionalWakeabilityAnomaly({\n code,\n executionEvidenceSafe,\n })\n ) {\n blockingCodes.push(code);\n } else {\n advisoryCodes.push(code);\n }\n continue;\n }\n\n if (DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(code)) {\n advisoryCodes.push(code);\n }\n }\n\n return {\n advisoryCodes,\n blockingCodes,\n blocksWake: blockingCodes.length > 0,\n conditionalCodes,\n executionEvidenceSafe,\n };\n}\n\nexport function classifyDaemonServiceRunStartability(input: {\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceRunStartabilityClassification {\n const anomalyCodes = collectUniqueAnomalyCodes(input.inventory);\n const executionEvidenceSafe = hasVerifiedRunningDaemonExecutionEvidence({\n anomalyCodes,\n inventory: input.inventory,\n });\n const blockingCodes = anomalyCodes.filter((code) => {\n if (!DAEMON_SERVICE_RUN_BLOCKING_ANOMALIES.has(code)) {\n return false;\n }\n return !(\n executionEvidenceSafe &&\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(code)\n );\n });\n return {\n blockingCodes,\n blocksStart: blockingCodes.length > 0,\n };\n}\n\nfunction shouldBlockConditionalWakeabilityAnomaly(input: {\n code: DaemonServiceAnomalyCode;\n executionEvidenceSafe: boolean;\n}): boolean {\n return !input.executionEvidenceSafe;\n}\n\nfunction hasVerifiedRunningDaemonExecutionEvidence(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n inventory?: DaemonServiceInventory | null;\n}): boolean {\n const inventory = input.inventory;\n if (inventory?.runtimeStatus.status !== \"running\") {\n return false;\n }\n if (inventory.runtimeContractCompatibility?.status !== \"compatible\") {\n return false;\n }\n if (!hasUsableServiceContract(inventory.serviceContract)) {\n return false;\n }\n if (\n !(\n inventory.activeBundleEntryPath &&\n inventory.runtimeCommandEntryPath &&\n inventory.runtimeCommandPathExists === true\n )\n ) {\n return false;\n }\n return !input.anomalyCodes.some((code) =>\n DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(code)\n );\n}\n\nfunction hasUsableServiceContract(\n contract: DaemonServiceInventory[\"serviceContract\"]\n): boolean {\n return Boolean(\n contract?.deviceId &&\n contract.gatewayUrl &&\n contract.lane &&\n Number.isFinite(contract.heartbeatMs) &&\n contract.heartbeatMs > 0\n );\n}\n\nfunction collectUniqueAnomalyCodes(\n inventory?: DaemonServiceInventory | null\n): DaemonServiceAnomalyCode[] {\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory?.anomalies ?? []) {\n if (!codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n","import { compareSemver } from \"../../config/version-state\";\n\nexport type VersionChangeDirection = \"same\" | \"upgrade\" | \"downgrade\";\n\nexport function resolveVersionChangeDirection(input: {\n fromVersion: string;\n toVersion: string;\n}): VersionChangeDirection {\n const comparison = compareSemver(input.fromVersion, input.toVersion);\n if (comparison === 0) {\n return \"same\";\n }\n return comparison < 0 ? \"upgrade\" : \"downgrade\";\n}\n\nexport function isVersionDowngrade(input: {\n fromVersion: string;\n toVersion: string;\n}): boolean {\n return resolveVersionChangeDirection(input) === \"downgrade\";\n}\n","import {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n DAEMON_SERVICE_AUTO_HEAL_ANOMALIES,\n DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES,\n} from \"./daemon-service-anomaly-groups\";\nimport type { DaemonBundleFormat } from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nconst BLOCKED_ALIGNMENT_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"downgrade_blocked\",\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nexport type DaemonServiceTargetSpec = {\n daemonVersion: string;\n bundleFormat: DaemonBundleFormat;\n environmentTarget: OpenMeldEnvironmentTarget;\n};\n\nexport type DaemonServiceAlignmentDecision = {\n status:\n | \"already_aligned\"\n | \"not_installed\"\n | \"needs_auto_heal\"\n | \"needs_full_alignment\"\n | \"blocked\";\n target: DaemonServiceTargetSpec;\n reasonCodes: DaemonServiceAnomalyCode[];\n};\n\nexport function buildDaemonServiceTargetSpec(input: {\n daemonVersion: string;\n distribution?: OpenMeldDistribution;\n environmentTarget?: OpenMeldEnvironmentTarget;\n gatewayUrl?: string;\n}): DaemonServiceTargetSpec {\n const distribution = input.distribution ?? resolveOpenMeldDistribution();\n return {\n daemonVersion: input.daemonVersion,\n bundleFormat: distribution === \"binary\" ? \"binary_v1\" : \"self_contained_v1\",\n environmentTarget:\n input.environmentTarget ??\n resolveOpenMeldEnvironmentTargetFromEnv({ gatewayUrl: input.gatewayUrl }),\n };\n}\n\nexport function resolveDaemonServiceAlignmentDecision(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): DaemonServiceAlignmentDecision {\n if (\n !input.inventory.installStatus.installed &&\n input.inventory.legacySharedService?.present\n ) {\n return {\n status: \"needs_full_alignment\",\n target: input.target,\n reasonCodes: [\"legacy_shared_service_present\"],\n };\n }\n if (!input.inventory.installStatus.installed) {\n return {\n status: \"not_installed\",\n target: input.target,\n reasonCodes: [\"not_installed\"],\n };\n }\n\n const blockedReasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => BLOCKED_ALIGNMENT_ANOMALIES.has(code),\n });\n const versionDecision = resolveVersionDecision(input);\n if (\n versionDecision === \"blocked\" &&\n !blockedReasonCodes.includes(\"downgrade_blocked\")\n ) {\n blockedReasonCodes.push(\"downgrade_blocked\");\n }\n if (blockedReasonCodes.length > 0) {\n return {\n status: \"blocked\",\n target: input.target,\n reasonCodes: blockedReasonCodes,\n };\n }\n\n const fullAlignmentReasonCodes = collectFullAlignmentReasonCodes({\n ...input,\n versionDecision,\n });\n if (\n versionDecision === \"needs_full_alignment\" &&\n !fullAlignmentReasonCodes.includes(\"version_outdated\")\n ) {\n fullAlignmentReasonCodes.push(\"version_outdated\");\n }\n if (fullAlignmentReasonCodes.length > 0) {\n return {\n status: \"needs_full_alignment\",\n target: input.target,\n reasonCodes: fullAlignmentReasonCodes,\n };\n }\n\n const autoHealReasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => DAEMON_SERVICE_AUTO_HEAL_ANOMALIES.has(code),\n });\n if (autoHealReasonCodes.length > 0) {\n return {\n status: \"needs_auto_heal\",\n target: input.target,\n reasonCodes: autoHealReasonCodes,\n };\n }\n\n return {\n status: \"already_aligned\",\n target: input.target,\n reasonCodes: [],\n };\n}\n\nfunction collectFullAlignmentReasonCodes(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n versionDecision: \"already_aligned\" | \"needs_full_alignment\" | \"blocked\";\n}): DaemonServiceAnomalyCode[] {\n const reasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES.has(code),\n });\n\n if (\n input.versionDecision === \"already_aligned\" &&\n input.inventory.activeBundle &&\n input.inventory.activeBundle.daemonVersion !==\n resolveExpectedArtifactVersion(input.inventory) &&\n !reasonCodes.includes(\"bundle_version_drift\")\n ) {\n reasonCodes.push(\"bundle_version_drift\");\n }\n\n if (\n input.inventory.activeBundle &&\n input.inventory.activeBundle.bundleFormat !== input.target.bundleFormat &&\n !reasonCodes.includes(\"bundle_strategy_legacy\")\n ) {\n reasonCodes.push(\"bundle_strategy_legacy\");\n }\n\n if (\n hasServiceManagerEnvironmentDrift(input) &&\n !reasonCodes.includes(\"service_manager_environment_drift\")\n ) {\n reasonCodes.push(\"service_manager_environment_drift\");\n }\n\n return reasonCodes;\n}\n\nfunction hasServiceManagerEnvironmentDrift(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): boolean {\n const status = input.inventory.serviceManagerStatus;\n if (!(status?.installed && status.environmentTarget !== undefined)) {\n return false;\n }\n const observed = status.environmentTarget;\n const expected = input.target.environmentTarget;\n return (\n observed === null ||\n observed.preset !== expected.preset ||\n observed.gatewayUrl !== expected.gatewayUrl ||\n observed.authBaseUrl !== expected.authBaseUrl ||\n observed.userFacingCommand !== expected.userFacingCommand\n );\n}\n\nfunction resolveVersionDecision(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): \"already_aligned\" | \"needs_full_alignment\" | \"blocked\" {\n const configuredVersion = resolveExpectedArtifactVersion(input.inventory);\n if (!configuredVersion) {\n return \"already_aligned\";\n }\n const versionDirection = resolveVersionChangeDirection({\n fromVersion: configuredVersion,\n toVersion: input.target.daemonVersion,\n });\n if (versionDirection === \"upgrade\") {\n return \"needs_full_alignment\";\n }\n if (versionDirection === \"downgrade\") {\n return \"blocked\";\n }\n return \"already_aligned\";\n}\n\nfunction resolveExpectedArtifactVersion(\n inventory: DaemonServiceInventory\n): string | null {\n return (\n inventory.serviceContract?.daemonVersion ??\n inventory.installStatus.state?.daemonVersion ??\n null\n );\n}\n\nfunction collectReasonCodes(input: {\n inventory: DaemonServiceInventory;\n predicate: (code: DaemonServiceAnomalyCode) => boolean;\n}): DaemonServiceAnomalyCode[] {\n const reasonCodes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of input.inventory.anomalies) {\n if (input.predicate(anomaly.code) && !reasonCodes.includes(anomaly.code)) {\n reasonCodes.push(anomaly.code);\n }\n }\n return reasonCodes;\n}\n","// Preserve the value written by supported installations. This is a disk-format\n// contract, not the Runtime Transport epoch. A wire change cannot invalidate it.\n// A future incompatible disk format needs versioned readers before new writers.\nexport const DAEMON_LOCAL_STATE_EPOCH =\n \"runtime-transport-epoch-2026-07-default-project\";\n","import {\n copyFile,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport { formatOpenMeldCliTextBlock } from \"../../runtime/cli-entry-command\";\nimport {\n DAEMON_RUNTIME_CONTRACT_META_FILE,\n DAEMON_RUNTIME_CONTRACT_REPAIR_REPORT_FILE,\n} from \"../core/constants\";\nimport {\n dirnamePath,\n normalizeOptionalText,\n toErrorMessage,\n} from \"../core/logger\";\nimport type {\n DaemonRuntimeContractGuardResult,\n DaemonRuntimeContractMeta,\n DaemonRuntimeContractRepairReason,\n DaemonRuntimeContractRepairReport,\n DaemonRuntimePaths,\n} from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\nimport { DAEMON_LOCAL_STATE_EPOCH } from \"./local-state-version\";\n\nconst RUNTIME_CONTRACT_META_SCHEMA = \"daemon.runtime.contract.meta\" as const;\nconst RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA =\n \"daemon.runtime.contract.repair.report\" as const;\n\ntype GuardInput = {\n runtimePaths: DaemonRuntimePaths;\n contractEpoch?: string;\n nowIso?: string;\n};\n\ntype RepairRuntimeStateInput = {\n contractEpoch: string;\n fromEpoch: string | null;\n nowIso: string;\n reason: DaemonRuntimeContractRepairReason;\n runtimePaths: DaemonRuntimePaths;\n stateFilePaths: string[];\n};\n\ntype ParsedMeta = {\n contractEpoch: string;\n updatedAt: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst createRuntimeContractMeta = (input: {\n contractEpoch: string;\n nowIso: string;\n}): DaemonRuntimeContractMeta => ({\n schema: RUNTIME_CONTRACT_META_SCHEMA,\n v: 1,\n contractEpoch: input.contractEpoch,\n updatedAt: input.nowIso,\n});\n\nconst createRuntimeContractRepairReport = (input: {\n appliedAt: string;\n backupPaths: string[];\n cleanedPaths: string[];\n errorMessage: string | null;\n fromEpoch: string | null;\n reason: DaemonRuntimeContractRepairReason;\n status: \"applied\" | \"failed\";\n toEpoch: string;\n}): DaemonRuntimeContractRepairReport => ({\n schema: RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA,\n v: 1,\n status: input.status,\n reason: input.reason,\n fromEpoch: input.fromEpoch,\n toEpoch: input.toEpoch,\n appliedAt: input.appliedAt,\n cleanedPaths: [...input.cleanedPaths],\n backupPaths: [...input.backupPaths],\n errorMessage: input.errorMessage,\n});\n\nconst parseRuntimeContractMeta = (\n value: unknown\n): DaemonRuntimeContractMeta | null => {\n if (!isRecord(value)) {\n return null;\n }\n if (typeof value.v === \"number\" && value.v > 1) {\n throw new Error(\n \"This OpenMeld version cannot read the newer local runtime state. Update OpenMeld to continue. Your local data has been preserved.\"\n );\n }\n if (value.schema !== RUNTIME_CONTRACT_META_SCHEMA || value.v !== 1) {\n return null;\n }\n const contractEpoch = normalizeOptionalText(value.contractEpoch);\n const updatedAt = normalizeOptionalText(value.updatedAt);\n if (!(contractEpoch && updatedAt)) {\n return null;\n }\n return {\n schema: RUNTIME_CONTRACT_META_SCHEMA,\n v: 1,\n contractEpoch,\n updatedAt,\n };\n};\n\nconst parseRuntimeContractRepairReport = (\n value: unknown\n): DaemonRuntimeContractRepairReport | null => {\n if (!isRecord(value)) {\n return null;\n }\n if (value.schema !== RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA || value.v !== 1) {\n return null;\n }\n const status = value.status;\n const reason = value.reason;\n const fromEpochRaw = value.fromEpoch;\n const toEpoch = normalizeOptionalText(value.toEpoch);\n const appliedAt = normalizeOptionalText(value.appliedAt);\n const cleanedPathsRaw = value.cleanedPaths;\n const backupPathsRaw = value.backupPaths;\n const errorMessageRaw = value.errorMessage;\n\n if (status !== \"applied\" && status !== \"failed\") {\n return null;\n }\n if (\n reason !== \"legacy_state_without_meta\" &&\n reason !== \"contract_epoch_mismatch\"\n ) {\n return null;\n }\n if (!(toEpoch && appliedAt)) {\n return null;\n }\n if (!(Array.isArray(cleanedPathsRaw) && Array.isArray(backupPathsRaw))) {\n return null;\n }\n\n const cleanedPaths = cleanedPathsRaw\n .map((item) => normalizeOptionalText(item))\n .filter((item): item is string => item !== null);\n const backupPaths = backupPathsRaw\n .map((item) => normalizeOptionalText(item))\n .filter((item): item is string => item !== null);\n\n const fromEpoch =\n fromEpochRaw === null ? null : normalizeOptionalText(fromEpochRaw);\n if (fromEpochRaw !== null && fromEpoch === null) {\n return null;\n }\n\n const errorMessage =\n errorMessageRaw === null ? null : normalizeOptionalText(errorMessageRaw);\n if (errorMessageRaw !== null && errorMessage === null) {\n return null;\n }\n\n return {\n schema: RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA,\n v: 1,\n status,\n reason,\n fromEpoch,\n toEpoch,\n appliedAt,\n cleanedPaths,\n backupPaths,\n errorMessage,\n };\n};\n\nconst readParsedJsonFile = async <T>(input: {\n parse: (value: unknown) => T | null;\n path: string;\n}): Promise<T | null> => {\n const raw = await readFile(input.path, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return input.parse(parsed);\n};\n\nconst writeJsonAtomic = async (input: {\n path: string;\n value: unknown;\n}): Promise<void> => {\n await mkdir(dirnamePath(input.path), { recursive: true });\n const tempPath = `${input.path}.tmp-${Date.now()}-${process.pid}`;\n await writeFile(\n tempPath,\n `${JSON.stringify(input.value, null, 2)}\\n`,\n \"utf8\"\n );\n await rename(tempPath, input.path).catch(async (error) => {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n });\n};\n\nconst fileExists = async (path: string): Promise<boolean> => {\n try {\n await readFile(path, \"utf8\");\n return true;\n } catch {\n return false;\n }\n};\n\nconst getRuntimeStateFilePaths = (\n runtimePaths: DaemonRuntimePaths\n): string[] => [\n runtimePaths.contextStorePath,\n join(runtimePaths.ledgerRootPath, \"state.json\"),\n join(runtimePaths.ledgerRootPath, \"state.backup.json\"),\n join(runtimePaths.ledgerRootPath, \"state.tmp\"),\n join(runtimePaths.ledgerRootPath, \"history.tmp\"),\n];\n\nconst readMetaEpoch = async (\n contractMetaPath: string\n): Promise<ParsedMeta | null> => {\n const parsed = await readParsedJsonFile({\n path: contractMetaPath,\n parse: parseRuntimeContractMeta,\n });\n if (!parsed) {\n return null;\n }\n return {\n contractEpoch: parsed.contractEpoch,\n updatedAt: parsed.updatedAt,\n };\n};\n\nexport const readDaemonRuntimeContractMeta =\n async (): Promise<DaemonRuntimeContractMeta | null> => {\n const path = daemonRuntimeContractMetaPath();\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return parseRuntimeContractMeta(parsed);\n };\n\nconst isFileNotFoundError = (error: unknown): boolean =>\n Boolean(error && typeof error === \"object\" && \"code\" in error) &&\n (error as { code?: unknown }).code === \"ENOENT\";\n\nconst backupAndCleanRuntimeState = async (\n input: RepairRuntimeStateInput\n): Promise<DaemonRuntimeContractGuardResult> => {\n const cleanedPaths: string[] = [];\n const backupPaths: string[] = [];\n const backupSuffix = `bak.${Date.now()}`;\n\n const writeRepairReport = async (\n report: DaemonRuntimeContractRepairReport\n ) => {\n await writeJsonAtomic({\n path: input.runtimePaths.contractRepairReportPath,\n value: report,\n });\n };\n\n try {\n for (const statePath of input.stateFilePaths) {\n const backupPath = `${statePath}.${backupSuffix}`;\n await copyFile(statePath, backupPath);\n backupPaths.push(backupPath);\n await rm(statePath, { force: true });\n cleanedPaths.push(statePath);\n }\n\n const nextMeta = createRuntimeContractMeta({\n contractEpoch: input.contractEpoch,\n nowIso: input.nowIso,\n });\n await writeJsonAtomic({\n path: input.runtimePaths.contractMetaPath,\n value: nextMeta,\n });\n\n const report = createRuntimeContractRepairReport({\n appliedAt: input.nowIso,\n backupPaths,\n cleanedPaths,\n errorMessage: null,\n fromEpoch: input.fromEpoch,\n reason: input.reason,\n status: \"applied\",\n toEpoch: input.contractEpoch,\n });\n await writeRepairReport(report);\n\n return {\n action: \"repair_applied\",\n reason: input.reason,\n meta: nextMeta,\n report,\n };\n } catch (error) {\n const failedReport = createRuntimeContractRepairReport({\n appliedAt: input.nowIso,\n backupPaths,\n cleanedPaths,\n errorMessage: toErrorMessage(error),\n fromEpoch: input.fromEpoch,\n reason: input.reason,\n status: \"failed\",\n toEpoch: input.contractEpoch,\n });\n await writeRepairReport(failedReport).catch(() => undefined);\n throw new DaemonServiceRunError({\n code: \"daemon.runtime_state_repair_failed\",\n message: formatOpenMeldCliTextBlock(\n \"OpenMeld could not fix local runtime data automatically.\\n\" +\n \"Please restart the service:\\n\" +\n \"1) `openmeld service stop --force`\\n\" +\n \"2) `openmeld service start`\\n\\n\" +\n \"If this still fails, repair the service:\\n\" +\n \"1) `openmeld service repair`\\n\" +\n \"2) `openmeld service start`\"\n ),\n });\n }\n};\n\nexport const ensureDaemonRuntimeContractState = async (\n input: GuardInput\n): Promise<DaemonRuntimeContractGuardResult> => {\n const contractEpoch =\n normalizeOptionalText(input.contractEpoch) ?? DAEMON_LOCAL_STATE_EPOCH;\n const nowIso =\n normalizeOptionalText(input.nowIso) ?? new Date().toISOString();\n\n const stateFilePaths = getRuntimeStateFilePaths(input.runtimePaths);\n const existingStatePaths: string[] = [];\n for (const statePath of stateFilePaths) {\n if (await fileExists(statePath)) {\n existingStatePaths.push(statePath);\n }\n }\n\n const meta = await readMetaEpoch(input.runtimePaths.contractMetaPath);\n if (!meta) {\n if (existingStatePaths.length === 0) {\n const nextMeta = createRuntimeContractMeta({\n contractEpoch,\n nowIso,\n });\n await writeJsonAtomic({\n path: input.runtimePaths.contractMetaPath,\n value: nextMeta,\n });\n return {\n action: \"fresh_init\",\n meta: nextMeta,\n };\n }\n return await backupAndCleanRuntimeState({\n contractEpoch,\n fromEpoch: null,\n nowIso,\n reason: \"legacy_state_without_meta\",\n runtimePaths: input.runtimePaths,\n stateFilePaths: existingStatePaths,\n });\n }\n\n if (meta.contractEpoch !== contractEpoch) {\n return await backupAndCleanRuntimeState({\n contractEpoch,\n fromEpoch: meta.contractEpoch,\n nowIso,\n reason: \"contract_epoch_mismatch\",\n runtimePaths: input.runtimePaths,\n stateFilePaths: existingStatePaths,\n });\n }\n\n return {\n action: \"none\",\n meta: createRuntimeContractMeta({\n contractEpoch: meta.contractEpoch,\n nowIso: meta.updatedAt,\n }),\n };\n};\n\nexport const daemonRuntimeContractRepairReportPath = (): string =>\n join(\n daemonRuntimeRootPath(),\n \"data\",\n DAEMON_RUNTIME_CONTRACT_REPAIR_REPORT_FILE\n );\n\nexport const daemonRuntimeContractMetaPath = (): string =>\n join(daemonRuntimeRootPath(), \"data\", DAEMON_RUNTIME_CONTRACT_META_FILE);\n\nexport const readDaemonRuntimeContractRepairReport =\n async (): Promise<DaemonRuntimeContractRepairReport | null> => {\n return await readParsedJsonFile({\n path: daemonRuntimeContractRepairReportPath(),\n parse: parseRuntimeContractRepairReport,\n });\n };\n","import type { StartDeviceProjection } from \"@openmeld/schemas/types\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport { toErrorMessage } from \"../core/logger\";\nimport type { DaemonRuntimeContractMeta } from \"../core/types\";\nimport { DAEMON_LOCAL_STATE_EPOCH } from \"../state/local-state-version\";\nimport { readDaemonRuntimeContractMeta } from \"../state/runtime-contract-guard\";\n\nexport type DaemonRuntimeContractCompatibilityStatus =\n | \"compatible\"\n | \"missing\"\n | \"mismatch\"\n | \"unavailable\"\n | \"not_observed\";\n\nexport type DaemonRuntimeContractCompatibilityReasonCode =\n | \"daemon.runtime_contract.compatible\"\n | \"daemon.runtime_contract.missing\"\n | \"daemon.runtime_contract.mismatch\"\n | \"daemon.runtime_contract.unavailable\"\n | \"daemon.runtime_contract.not_observed\";\n\nexport type DaemonRuntimeContractCompatibility = {\n errorMessage?: string;\n expectedEpoch: string;\n observedEpoch: string | null;\n reasonCode: DaemonRuntimeContractCompatibilityReasonCode;\n status: DaemonRuntimeContractCompatibilityStatus;\n updatedAt: string | null;\n};\n\nexport type StartBackgroundHelperExecutionCompatibility = NonNullable<\n StartDeviceProjection[\"backgroundHelper\"][\"executionCompatibility\"]\n>;\n\ntype RuntimeStatusInput =\n | DaemonServiceRuntimeStatus[\"status\"]\n | Pick<DaemonServiceRuntimeStatus, \"status\">;\n\nexport async function resolveDaemonRuntimeContractCompatibility(input: {\n expectedEpoch?: string;\n readMeta?: () => Promise<DaemonRuntimeContractMeta | null>;\n runtimeStatus: RuntimeStatusInput;\n}): Promise<DaemonRuntimeContractCompatibility> {\n const expectedEpoch = input.expectedEpoch ?? DAEMON_LOCAL_STATE_EPOCH;\n const runtimeStatus =\n typeof input.runtimeStatus === \"string\"\n ? input.runtimeStatus\n : input.runtimeStatus.status;\n\n if (runtimeStatus !== \"running\" && runtimeStatus !== \"stale\") {\n return {\n status: \"not_observed\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.not_observed\",\n };\n }\n\n const readMeta = input.readMeta ?? readDaemonRuntimeContractMeta;\n let meta: DaemonRuntimeContractMeta | null;\n try {\n meta = await readMeta();\n } catch (error) {\n return {\n status: \"unavailable\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.unavailable\",\n errorMessage: toErrorMessage(error),\n };\n }\n\n if (!meta) {\n return {\n status: \"missing\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.missing\",\n };\n }\n\n if (meta.contractEpoch !== expectedEpoch) {\n return {\n status: \"mismatch\",\n expectedEpoch,\n observedEpoch: meta.contractEpoch,\n updatedAt: meta.updatedAt,\n reasonCode: \"daemon.runtime_contract.mismatch\",\n };\n }\n\n return {\n status: \"compatible\",\n expectedEpoch,\n observedEpoch: meta.contractEpoch,\n updatedAt: meta.updatedAt,\n reasonCode: \"daemon.runtime_contract.compatible\",\n };\n}\n\nexport function toStartBackgroundHelperExecutionCompatibility(\n input: DaemonRuntimeContractCompatibility\n): StartBackgroundHelperExecutionCompatibility {\n return {\n status: input.status === \"mismatch\" ? \"update_required\" : \"compatible\",\n reasonCode: input.reasonCode,\n expectedEpoch: input.expectedEpoch,\n observedEpoch: input.observedEpoch,\n updatedAt: input.updatedAt,\n };\n}\n","import process from \"node:process\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport {\n type DaemonOwnedProcess,\n listDaemonOwnedProcesses,\n} from \"./daemon-service-process-inventory\";\nimport type {\n CurrentDaemonRuntimeContext,\n readCurrentDaemonRuntimeContext,\n} from \"./daemon-service-runtime\";\nimport { readCurrentDaemonRuntimeContext as readCurrentDaemonRuntimeContextImpl } from \"./daemon-service-runtime\";\n\nexport type DaemonLifecycleOwnerKind =\n | \"cli_direct\"\n | \"legacy_detached\"\n | \"system_service\";\n\nexport type DaemonOwnerSetSummary =\n | \"multiple_owners\"\n | \"no_owner\"\n | \"single_owner\";\n\nexport type DaemonStoppedContractWriteBlockedReason =\n | \"owned_processes_still_active\"\n | \"service_manager_still_enabled\"\n | \"service_manager_still_running\"\n | \"daemon_owners_still_active\";\n\nexport type DaemonOwnerSnapshot = {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: CurrentDaemonRuntimeContext[\"serviceManager\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n systemServiceRegistrationPresent: boolean;\n activeOwnerKinds: DaemonLifecycleOwnerKind[];\n ownerSetSummary: DaemonOwnerSetSummary;\n mustStopManagerFirst: boolean;\n};\n\nexport type DaemonStopStrategy =\n | {\n kind: \"manager_first\";\n requiresResidualProcessCleanup: true;\n reason: string;\n }\n | {\n kind: \"not_running\";\n requiresResidualProcessCleanup: false;\n reason: string;\n }\n | {\n kind: \"process_then_manager_cleanup\";\n requiresResidualProcessCleanup: true;\n reason: string;\n }\n | {\n kind: \"process_only\";\n requiresResidualProcessCleanup: true;\n reason: string;\n };\n\nexport async function readCurrentDaemonOwnerSnapshot(\n input: {\n ignoreProcessIds?: Iterable<number>;\n listOwnedProcesses?: typeof listDaemonOwnedProcesses;\n readRuntimeContext?: typeof readCurrentDaemonRuntimeContext;\n } = {}\n): Promise<DaemonOwnerSnapshot> {\n const listOwnedProcesses =\n input.listOwnedProcesses ?? listDaemonOwnedProcesses;\n const readRuntimeContext =\n input.readRuntimeContext ?? readCurrentDaemonRuntimeContextImpl;\n const ignoredProcessIds = [\n process.pid,\n process.ppid,\n ...Array.from(input.ignoreProcessIds ?? []),\n ].filter((pid): pid is number => Number.isInteger(pid) && pid > 0);\n\n const [context, ownedProcesses] = await Promise.all([\n readRuntimeContext(),\n listOwnedProcesses({\n ignoreProcessIds: ignoredProcessIds,\n }),\n ]);\n\n return buildDaemonOwnerSnapshot({\n context,\n ownedProcesses,\n });\n}\n\nexport function buildDaemonOwnerSnapshot(input: {\n context: CurrentDaemonRuntimeContext;\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonOwnerSnapshot {\n return buildDaemonOwnerSnapshotFromObservedState({\n runtimeStatus: input.context.runtimeStatus,\n serviceManager: input.context.serviceManager,\n serviceManagerStatus: input.context.serviceManagerStatus,\n effectiveRuntimeStatus: input.context.effectiveRuntimeStatus,\n ownedProcesses: input.ownedProcesses,\n });\n}\n\nexport function buildDaemonOwnerSnapshotFromObservedState(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: CurrentDaemonRuntimeContext[\"serviceManager\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonOwnerSnapshot {\n const activeOwnerKinds = resolveActiveOwnerKinds({\n runtimeStatus: input.runtimeStatus,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n serviceManagerStatus: input.serviceManagerStatus,\n ownedProcesses: input.ownedProcesses,\n });\n\n return {\n runtimeStatus: input.runtimeStatus,\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n ownedProcesses: input.ownedProcesses,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n systemServiceRegistrationPresent:\n input.runtimeStatus.managedBySystemService ||\n input.serviceManagerStatus?.installed === true ||\n input.serviceManagerStatus?.running === true,\n activeOwnerKinds,\n ownerSetSummary: resolveOwnerSetSummary(activeOwnerKinds),\n mustStopManagerFirst:\n input.runtimeStatus.managedBySystemService ||\n input.serviceManagerStatus?.installed === true ||\n input.serviceManagerStatus?.running === true,\n };\n}\n\nexport function resolveDaemonStopStrategy(\n snapshot: DaemonOwnerSnapshot\n): DaemonStopStrategy {\n const hasOwnedProcesses = snapshot.ownedProcesses.length > 0;\n if (\n snapshot.effectiveRuntimeStatus !== \"running\" &&\n !hasOwnedProcesses &&\n snapshot.serviceManagerStatus?.running !== true\n ) {\n return {\n kind: \"not_running\",\n requiresResidualProcessCleanup: false,\n reason: \"no active local service owner is currently running\",\n };\n }\n\n if (snapshot.activeOwnerKinds.includes(\"system_service\")) {\n return {\n kind: \"manager_first\",\n requiresResidualProcessCleanup: true,\n reason:\n \"a system-managed local service owner is active on this device, so stop must go through the OS service manager first\",\n };\n }\n\n if (snapshot.systemServiceRegistrationPresent) {\n return {\n kind: \"process_then_manager_cleanup\",\n requiresResidualProcessCleanup: true,\n reason:\n \"a direct local service owner is active and system service registration is still present, so stop must drain the process and then clear the service manager registration\",\n };\n }\n\n return {\n kind: \"process_only\",\n requiresResidualProcessCleanup: true,\n reason: \"only direct local service processes are active on this device\",\n };\n}\n\nexport function hasActiveDaemonOwners(snapshot: DaemonOwnerSnapshot): boolean {\n return (\n snapshot.activeOwnerKinds.length > 0 ||\n snapshot.ownedProcesses.length > 0 ||\n snapshot.serviceManagerStatus?.running === true\n );\n}\n\nexport function resolveStoppedContractWriteBlockedReason(\n snapshot: DaemonOwnerSnapshot\n): DaemonStoppedContractWriteBlockedReason | null {\n if (snapshot.ownedProcesses.length > 0) {\n return \"owned_processes_still_active\";\n }\n if (snapshot.serviceManagerStatus?.running === true) {\n return \"service_manager_still_running\";\n }\n if (snapshot.serviceManagerStatus?.enabled === true) {\n return \"service_manager_still_enabled\";\n }\n if (hasActiveDaemonOwners(snapshot)) {\n return \"daemon_owners_still_active\";\n }\n return null;\n}\n\nexport function summarizeDaemonOwnerSnapshot(\n snapshot: DaemonOwnerSnapshot\n): Record<string, unknown> {\n return {\n activeOwnerKinds: snapshot.activeOwnerKinds,\n effectiveRuntimeStatus: snapshot.effectiveRuntimeStatus,\n mustStopManagerFirst: snapshot.mustStopManagerFirst,\n ownedProcessCount: snapshot.ownedProcesses.length,\n ownedProcesses: snapshot.ownedProcesses.map((processInfo) => ({\n mode: processInfo.mode,\n ownership: processInfo.ownership,\n pid: processInfo.pid,\n })),\n ownerSetSummary: snapshot.ownerSetSummary,\n runtimeStatus: snapshot.runtimeStatus.status,\n serviceManagerController: snapshot.serviceManager?.controller ?? null,\n serviceManagerStatus: snapshot.serviceManagerStatus\n ? {\n enabled: snapshot.serviceManagerStatus.enabled,\n installed: snapshot.serviceManagerStatus.installed,\n running: snapshot.serviceManagerStatus.running,\n }\n : null,\n systemServiceRegistrationPresent: snapshot.systemServiceRegistrationPresent,\n };\n}\n\nexport function formatDaemonOwnerSummaryLabel(\n snapshot: DaemonOwnerSnapshot\n): string {\n if (snapshot.ownerSetSummary === \"no_owner\") {\n return \"No active owner\";\n }\n\n const ownerLabel = formatDaemonOwnerKinds(snapshot.activeOwnerKinds);\n if (snapshot.ownerSetSummary === \"single_owner\") {\n return ownerLabel;\n }\n\n return `⚠️ Multiple owners — ${ownerLabel}`;\n}\n\nexport function formatDaemonOwnerKinds(\n ownerKinds: readonly DaemonLifecycleOwnerKind[]\n): string {\n return ownerKinds.map(formatDaemonOwnerKindLabel).join(\" + \");\n}\n\nfunction resolveActiveOwnerKinds(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonLifecycleOwnerKind[] {\n const owners = new Set<DaemonLifecycleOwnerKind>();\n const verifiedDirectRuntimePid =\n input.runtimeStatus.status === \"running\" &&\n !input.runtimeStatus.managedBySystemService &&\n input.runtimeStatus.serviceController === \"unknown\"\n ? input.runtimeStatus.pid\n : null;\n const verifiedSystemRuntimePid =\n input.runtimeStatus.status === \"running\" &&\n input.runtimeStatus.managedBySystemService\n ? input.runtimeStatus.pid\n : null;\n\n if (\n input.serviceManagerStatus?.running === true ||\n input.ownedProcesses.some(\n (processInfo) =>\n processInfo.ownership === \"stable_launcher\" &&\n processInfo.pid !== verifiedDirectRuntimePid\n ) ||\n (input.runtimeStatus.managedBySystemService &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"system_service\");\n }\n\n if (\n input.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"legacy_detached\"\n ) ||\n (input.runtimeStatus.serviceController === \"legacy-detached\" &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"legacy_detached\");\n }\n\n if (\n input.ownedProcesses.some(\n (processInfo) =>\n processInfo.pid !== verifiedSystemRuntimePid &&\n (processInfo.ownership === \"cli_direct\" ||\n processInfo.ownership === \"unknown\")\n ) ||\n (!input.runtimeStatus.managedBySystemService &&\n input.runtimeStatus.serviceController !== \"legacy-detached\" &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"cli_direct\");\n }\n\n return Array.from(owners).sort();\n}\n\nfunction resolveOwnerSetSummary(\n activeOwnerKinds: DaemonLifecycleOwnerKind[]\n): DaemonOwnerSetSummary {\n if (activeOwnerKinds.length === 0) {\n return \"no_owner\";\n }\n if (activeOwnerKinds.length === 1) {\n return \"single_owner\";\n }\n return \"multiple_owners\";\n}\n\nfunction formatDaemonOwnerKindLabel(\n ownerKind: DaemonLifecycleOwnerKind\n): string {\n switch (ownerKind) {\n case \"cli_direct\":\n return \"Direct CLI\";\n case \"legacy_detached\":\n return \"Legacy detached runtime\";\n case \"system_service\":\n return \"System service\";\n default:\n return ownerKind;\n }\n}\n","import { stat } from \"node:fs/promises\";\nimport process from \"node:process\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport type {\n DaemonLifecycleIntent,\n DaemonRunMode,\n DaemonServiceController,\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n getDaemonStatus,\n readDaemonServiceLifecycleLockMetaWithCleanup,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldLockMeta } from \"../../config/lock\";\nimport { OPENMELD_HOME_ENV_KEY } from \"../../config/paths\";\nimport {\n type DaemonRuntimeContractCompatibility,\n resolveDaemonRuntimeContractCompatibility,\n} from \"./daemon-runtime-contract-compatibility\";\nimport { resolveDaemonServiceArtifact } from \"./daemon-service-artifact\";\nimport {\n readDaemonActiveBundleState,\n resolveDaemonBundleEntryPathFromState,\n resolveInstalledDaemonBundleFingerprint,\n} from \"./daemon-service-bundle\";\nimport { normalizeDaemonCommandPath } from \"./daemon-service-command-path\";\nimport {\n inspectLegacySharedDaemonService,\n type LegacySharedDaemonServiceInspection,\n} from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n readDaemonServiceStartupPolicyCurrent,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { matchesExpectedDaemonServiceManagerDefinition } from \"./daemon-service-manager-command-match\";\nimport {\n buildDaemonOwnerSnapshotFromObservedState,\n formatDaemonOwnerKinds,\n} from \"./daemon-service-owner-snapshot\";\nimport {\n type DaemonOwnedProcess,\n listDaemonOwnedProcesses,\n} from \"./daemon-service-process-inventory\";\nimport { getEffectiveDaemonRuntimeStatus } from \"./daemon-service-runtime\";\nimport {\n resolveObservedDaemonRuntimeStatus,\n resolveObservedRuntimeCommandEntryPath,\n} from \"./daemon-service-runtime-observer\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nexport type DaemonServiceAnomalyCode =\n | \"not_installed\"\n | \"legacy_shared_service_present\"\n | \"version_outdated\"\n | \"downgrade_blocked\"\n | \"runtime_stale\"\n | \"runtime_contract_missing\"\n | \"runtime_contract_mismatch\"\n | \"runtime_contract_unavailable\"\n | \"manager_running_without_runtime\"\n | \"multiple_active_owners\"\n | \"legacy_detached_runtime\"\n | \"runtime_bundle_mismatch\"\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 | \"service_manager_path_drift\"\n | \"service_manager_environment_drift\"\n | \"service_manager_startup_policy_drift\"\n | \"duplicate_owned_processes\"\n | \"foreground_background_conflict\"\n | \"background_foreground_conflict\"\n | \"lifecycle_locked\";\n\nexport type DaemonServiceAnomaly = {\n code: DaemonServiceAnomalyCode;\n message: string;\n};\n\nexport type DaemonServiceInventory = {\n expectedVersion: string;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract?: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n runtimeLease?: Awaited<ReturnType<typeof readDaemonRuntimeLease>>;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility?: DaemonRuntimeContractCompatibility;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n lifecycleLock: OpenMeldLockMeta | null;\n anomalies: DaemonServiceAnomaly[];\n};\n\nexport async function inspectDaemonServiceInventory(input: {\n expectedVersion: string;\n intendedMode?: DaemonRunMode;\n intent?: DaemonLifecycleIntent;\n readDaemonStatus?: typeof getDaemonStatus;\n resolveServiceManager?: typeof resolveDaemonServiceManager;\n listOwnedProcesses?: typeof listDaemonOwnedProcesses;\n}): Promise<DaemonServiceInventory> {\n // OPENMELD_SERVICE_THIN_CORE: lifecycle/diagnostic inventory.\n // This describes the local service installation and process state. It may\n // guide repair, but must not decide final Agent readiness or Wake outcome.\n const readDaemonStatus = input.readDaemonStatus ?? getDaemonStatus;\n const resolveServiceManager =\n input.resolveServiceManager ?? resolveDaemonServiceManager;\n const listOwnedProcesses =\n input.listOwnedProcesses ?? listDaemonOwnedProcesses;\n const ignoredInventoryProcessIds = [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n );\n\n const [\n installStatus,\n initialRuntimeLease,\n serviceContract,\n legacySharedService,\n activeBundle,\n lifecycleLock,\n ownedProcesses,\n ] = await Promise.all([\n readDaemonStatus(),\n readDaemonRuntimeLease().catch(() => null),\n readDaemonServiceContract().catch(() => null),\n inspectLegacySharedDaemonService(),\n readDaemonActiveBundleState(),\n readDaemonServiceLifecycleLockMetaWithCleanup(),\n listOwnedProcesses({\n ignoreProcessIds: ignoredInventoryProcessIds,\n }),\n ]);\n const activeBundleSourceAvailable =\n await resolveActiveBundleSourceAvailability(activeBundle);\n const initialRuntimeStatus = resolveObservedDaemonRuntimeStatus({\n runtimeLease: initialRuntimeLease,\n ownedProcesses,\n });\n const activeBundleEntryPath = await resolveDaemonBundleEntryPathFromState(\n activeBundle\n ).catch(() => null);\n const installedBundleFingerprint = activeBundleEntryPath\n ? await resolveInstalledDaemonBundleFingerprint(activeBundle)\n : null;\n const resolvedArtifact = resolveDaemonServiceArtifact({\n expectedVersion: input.expectedVersion,\n installStatus,\n serviceContract,\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n installedBundleFingerprint,\n });\n const mergedOwnedProcesses = mergeOwnedProcesses(\n ownedProcesses,\n legacySharedService?.present ? legacySharedService.ownedProcesses : []\n );\n\n const shouldReadServiceManager =\n installStatus.installed ||\n initialRuntimeStatus.managedBySystemService ||\n initialRuntimeStatus.serviceController !== \"unknown\" ||\n isKnownServiceController(serviceContract?.serviceController);\n const observedServiceManager = shouldReadServiceManager\n ? await resolveServiceManager(\n resolvePreferredServiceManagerController({\n runtimeStatus: initialRuntimeStatus,\n serviceContract,\n }) ?? undefined\n )\n : null;\n const observedServiceManagerStatus = observedServiceManager\n ? await observedServiceManager.status().catch(() => null)\n : null;\n const serviceManagerDefinitionMatchesCurrentRoot =\n observedServiceManager &&\n observedServiceManagerStatus?.installed &&\n observedServiceManagerStatus.definitionPath\n ? await matchesExpectedDaemonServiceManagerDefinition({\n controller: observedServiceManager.controller,\n definitionPath: observedServiceManagerStatus.definitionPath,\n commandSpec: observedServiceManagerStatus.commandSpec,\n }).catch(() => false)\n : null;\n // Process enumeration, bundle hashing and OS task queries can outlast a\n // Service startup on Windows. The initial lease selects the controller;\n // only a lease read after those queries may classify the observed runtime.\n const runtimeLease = await readDaemonRuntimeLease().catch(() => null);\n const runtimeStatus = resolveObservedDaemonRuntimeStatus({\n runtimeLease,\n ownedProcesses,\n });\n const runtimeContractCompatibility =\n await resolveDaemonRuntimeContractCompatibility({ runtimeStatus });\n const runtimeCommandEntryPath = resolveObservedRuntimeCommandEntryPath({\n ownedProcesses,\n runtimeStatus,\n });\n const runtimeCommandPathExists = runtimeCommandEntryPath\n ? await pathExists(runtimeCommandEntryPath).catch(() => null)\n : null;\n const scopedServiceManager = scopeServiceManagerToCurrentRoot({\n runtimeStatus,\n serviceManager: observedServiceManager,\n serviceManagerStatus: observedServiceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot,\n });\n\n const anomalies = buildDaemonServiceAnomalies({\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n activeBundleSourceEntryPath: activeBundle?.sourceEntryScriptPath ?? null,\n runtimeCommandEntryPath,\n runtimeCommandPathExists,\n runtimeContractCompatibility,\n resolvedArtifact,\n expectedVersion: input.expectedVersion,\n installStatus,\n intendedMode: input.intendedMode,\n legacySharedService,\n lifecycleLock,\n ownedProcesses: mergedOwnedProcesses,\n runtimeStatus,\n effectiveRuntimeStatus: getEffectiveDaemonRuntimeStatus({\n runtimeState: runtimeStatus,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n }),\n serviceContract,\n serviceManager: scopedServiceManager.serviceManager,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n scopedServiceManager.serviceManagerDefinitionMatchesCurrentRoot,\n });\n\n if (\n installStatus.installed &&\n (await readDaemonServiceStartupPolicyCurrent({\n controller: scopedServiceManager.serviceManager?.controller ?? null,\n status: scopedServiceManager.serviceManagerStatus,\n })) === false\n ) {\n anomalies.push({\n code: \"service_manager_startup_policy_drift\",\n message:\n \"The installed macOS Service still uses an outdated scheduling policy.\",\n });\n }\n\n return {\n expectedVersion: input.expectedVersion,\n installStatus,\n runtimeStatus,\n ...(serviceContract ? { serviceContract } : {}),\n ...(runtimeLease ? { runtimeLease } : {}),\n legacySharedService,\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n runtimeCommandEntryPath,\n runtimeCommandPathExists,\n runtimeContractCompatibility,\n serviceManager: scopedServiceManager.serviceManager,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n ownedProcesses: mergedOwnedProcesses,\n lifecycleLock,\n anomalies,\n };\n}\n\nasync function resolveActiveBundleSourceAvailability(\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>\n): Promise<boolean | null> {\n if (activeBundle?.bundleFormat !== \"legacy_linked_v1\") {\n return null;\n }\n return await pathExists(activeBundle.sourcePackageRootPath).catch(() => null);\n}\n\nfunction scopeServiceManagerToCurrentRoot(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n}): {\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n} {\n if (!hasExplicitOpenMeldHomeOverride()) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (\n input.runtimeStatus.managedBySystemService ||\n input.runtimeStatus.serviceController !== \"unknown\"\n ) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (!input.serviceManagerStatus?.installed) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (input.serviceManagerDefinitionMatchesCurrentRoot === true) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n return {\n serviceManager: null,\n serviceManagerStatus: null,\n serviceManagerDefinitionMatchesCurrentRoot: null,\n };\n}\n\nfunction hasExplicitOpenMeldHomeOverride(\n env: NodeJS.ProcessEnv = process.env\n): boolean {\n return String(env[OPENMELD_HOME_ENV_KEY] ?? \"\").trim().length > 0;\n}\n\nfunction buildDaemonServiceAnomalies(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility: DaemonRuntimeContractCompatibility;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n lifecycleLock: OpenMeldLockMeta | null;\n intendedMode?: DaemonRunMode;\n}): DaemonServiceAnomaly[] {\n if (!input.installStatus.installed) {\n if (input.legacySharedService?.present) {\n return [\n {\n code: \"legacy_shared_service_present\",\n message:\n \"A legacy shared OpenMeld Service from the pre-lane release is still installed and must be migrated to this lane.\",\n },\n ];\n }\n return [\n {\n code: \"not_installed\",\n message: \"OpenMeld Service is not installed on this device.\",\n },\n ];\n }\n\n const anomalies: DaemonServiceAnomaly[] = [];\n if (input.legacySharedService?.present) {\n anomalies.push({\n code: \"legacy_shared_service_present\",\n message:\n \"A legacy shared OpenMeld Service from the pre-lane release is still installed and should be cleaned up during this lane migration.\",\n });\n }\n const versionAnomaly = resolveVersionAnomaly({\n expectedVersion: input.expectedVersion,\n installStatus: input.installStatus,\n serviceContract: input.serviceContract,\n });\n if (versionAnomaly) {\n anomalies.push(versionAnomaly);\n }\n const runtimeAnomalies = buildRuntimeHealthAnomalies(input);\n const bundleAnomalies = buildBundleAnomalies({\n expectedVersion: input.expectedVersion,\n serviceContract: input.serviceContract,\n activeBundle: input.activeBundle,\n resolvedArtifact: input.resolvedArtifact,\n });\n const processAnomalies = buildProcessAnomalies(input);\n anomalies.push(...runtimeAnomalies, ...bundleAnomalies, ...processAnomalies);\n\n if (input.lifecycleLock && input.lifecycleLock.pid !== process.pid) {\n anomalies.push({\n code: \"lifecycle_locked\",\n message: buildLifecycleLockedMessage(input.lifecycleLock),\n });\n }\n\n return anomalies;\n}\n\nfunction resolveVersionAnomaly(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n}): DaemonServiceAnomaly | null {\n const observedVersion =\n input.serviceContract?.daemonVersion ??\n input.installStatus.state?.daemonVersion ??\n null;\n if (!observedVersion) {\n return null;\n }\n const versionDirection = resolveVersionChangeDirection({\n fromVersion: observedVersion,\n toVersion: input.expectedVersion,\n });\n if (versionDirection === \"upgrade\") {\n return {\n code: \"version_outdated\",\n message: `Configured OpenMeld Service version is v${observedVersion}, expected v${input.expectedVersion}.`,\n };\n }\n if (versionDirection === \"downgrade\") {\n return {\n code: \"downgrade_blocked\",\n message: `Configured OpenMeld Service version v${observedVersion} is newer than current CLI v${input.expectedVersion}.`,\n };\n }\n return null;\n}\n\nfunction buildRuntimeHealthAnomalies(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility: DaemonRuntimeContractCompatibility;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n}): DaemonServiceAnomaly[] {\n const anomalies: DaemonServiceAnomaly[] = [];\n const ownerSnapshot = buildDaemonOwnerSnapshotFromObservedState({\n runtimeStatus: input.runtimeStatus,\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n ownedProcesses: input.ownedProcesses,\n });\n\n if (input.runtimeStatus.status === \"stale\") {\n anomalies.push({\n code: \"runtime_stale\",\n message: `Runtime state is stale (${input.runtimeStatus.reason ?? \"unknown\"}).`,\n });\n }\n if (\n input.serviceManagerStatus?.running &&\n input.runtimeStatus.status !== \"running\"\n ) {\n anomalies.push({\n code: \"manager_running_without_runtime\",\n message:\n \"The OS service manager reports OpenMeld Service as running, but runtime state is not healthy.\",\n });\n }\n if (ownerSnapshot.ownerSetSummary === \"multiple_owners\") {\n anomalies.push({\n code: \"multiple_active_owners\",\n message: `Multiple OpenMeld Service owners are active on this device: ${formatDaemonOwnerKinds(ownerSnapshot.activeOwnerKinds)}.`,\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.runtimeStatus.serviceController === \"legacy-detached\"\n ) {\n anomalies.push({\n code: \"legacy_detached_runtime\",\n message:\n \"OpenMeld Service is still using the legacy detached runtime instead of the managed system service path.\",\n });\n }\n if (\n input.serviceManagerStatus?.installed &&\n input.serviceManagerDefinitionMatchesCurrentRoot === false\n ) {\n anomalies.push({\n code: \"service_manager_path_drift\",\n message:\n \"The OS service manager is still pointing at an old CLI path instead of the OpenMeld-managed stable launcher.\",\n });\n }\n if (\n (input.runtimeStatus.status === \"running\" ||\n input.runtimeStatus.status === \"stale\") &&\n // An exited process has no live command to compare. Its stale lease is\n // restart evidence, not evidence that service files or registration broke.\n (input.runtimeStatus.reason !== \"process_not_alive\" ||\n input.ownedProcesses.some(\n (processInfo) => processInfo.pid === input.runtimeStatus.pid\n )) &&\n hasRuntimeBundleMismatch({\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceEntryPath: input.activeBundleSourceEntryPath,\n runtimeCommandEntryPath: input.runtimeCommandEntryPath,\n runtimeCommandPathExists: input.runtimeCommandPathExists,\n })\n ) {\n anomalies.push({\n code: \"runtime_bundle_mismatch\",\n message: buildRuntimeBundleMismatchMessage({\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceEntryPath: input.activeBundleSourceEntryPath,\n runtimeCommandEntryPath: input.runtimeCommandEntryPath,\n runtimeCommandPathExists: input.runtimeCommandPathExists,\n }),\n });\n }\n const runtimeContractAnomaly = buildRuntimeContractCompatibilityAnomaly(\n input.runtimeContractCompatibility\n );\n if (runtimeContractAnomaly) {\n anomalies.push(runtimeContractAnomaly);\n }\n return anomalies;\n}\n\nfunction buildRuntimeContractCompatibilityAnomaly(\n compatibility: DaemonRuntimeContractCompatibility\n): DaemonServiceAnomaly | null {\n switch (compatibility.status) {\n case \"missing\":\n return {\n code: \"runtime_contract_missing\",\n message:\n \"OpenMeld Service runtime contract metadata is missing for the active daemon.\",\n };\n case \"mismatch\":\n return {\n code: \"runtime_contract_mismatch\",\n message: `OpenMeld Service runtime contract epoch is ${compatibility.observedEpoch ?? \"unknown\"}, but the current CLI expects ${compatibility.expectedEpoch}.`,\n };\n case \"unavailable\":\n return {\n code: \"runtime_contract_unavailable\",\n message: `OpenMeld Service runtime contract metadata could not be read: ${compatibility.errorMessage ?? \"unknown error\"}.`,\n };\n case \"compatible\":\n case \"not_observed\":\n return null;\n default:\n return null;\n }\n}\n\nfunction buildBundleAnomalies(input: {\n expectedVersion: string;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n}): DaemonServiceAnomaly[] {\n return input.resolvedArtifact.driftReasonCodes\n .map((reasonCode) => buildBundleAnomaly({ ...input, reasonCode }))\n .filter((anomaly): anomaly is DaemonServiceAnomaly => anomaly !== null);\n}\n\nfunction buildBundleAnomaly(input: {\n expectedVersion: string;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n reasonCode: ReturnType<\n typeof resolveDaemonServiceArtifact\n >[\"driftReasonCodes\"][number];\n}): DaemonServiceAnomaly | null {\n switch (input.reasonCode) {\n case \"bundle_missing\":\n return {\n code: \"bundle_missing\",\n message: \"OpenMeld Service files are missing.\",\n };\n case \"bundle_version_drift\": {\n const installVersion =\n input.serviceContract?.daemonVersion ??\n input.resolvedArtifact.installVersion ??\n input.expectedVersion;\n const activeVersion =\n input.resolvedArtifact.activeBundleVersion ?? \"unknown\";\n return {\n code: \"bundle_version_drift\",\n message: `OpenMeld Service is running local service files for v${activeVersion}, but this lane expects v${installVersion}.`,\n };\n }\n case \"bundle_id_drift\": {\n const expectedBundleId = input.serviceContract?.bundleId ?? \"unknown\";\n const activeBundleId = input.activeBundle?.bundleId ?? \"unknown\";\n return {\n code: \"bundle_id_drift\",\n message: `OpenMeld Service is using local service files that do not match this lane (${activeBundleId} != ${expectedBundleId}).`,\n };\n }\n case \"bundle_content_drift\":\n return {\n code: \"bundle_content_drift\",\n message:\n \"OpenMeld could not verify the installed Service files. The Service needs repair.\",\n };\n case \"bundle_lane_drift\":\n return {\n code: \"bundle_lane_drift\",\n message:\n \"OpenMeld Service is using repo-local service files in a lane that only allows published or packaged service files. Use `openmeld-dev` for repo-local service validation.\",\n };\n case \"bundle_strategy_legacy\":\n return {\n code: \"bundle_strategy_legacy\",\n message:\n \"OpenMeld Service is using an older local service file layout.\",\n };\n case \"bundle_provenance_drift\":\n return {\n code: \"bundle_provenance_drift\",\n message:\n \"OpenMeld Service still depends on a local CLI source path that is no longer available.\",\n };\n case \"bundle_path_invalid\":\n return {\n code: \"bundle_path_invalid\",\n message: \"OpenMeld Service entry file is missing.\",\n };\n default:\n return null;\n }\n}\n\nfunction buildProcessAnomalies(input: {\n ownedProcesses: DaemonOwnedProcess[];\n runtimeStatus: DaemonServiceRuntimeStatus;\n intendedMode?: DaemonRunMode;\n}): DaemonServiceAnomaly[] {\n const anomalies: DaemonServiceAnomaly[] = [];\n if (input.ownedProcesses.length > 1) {\n anomalies.push({\n code: \"duplicate_owned_processes\",\n message: `Found ${String(input.ownedProcesses.length)} OpenMeld-owned service processes on this device.`,\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.intendedMode === \"foreground\" &&\n input.runtimeStatus.mode === \"background\"\n ) {\n anomalies.push({\n code: \"foreground_background_conflict\",\n message:\n \"OpenMeld background service is already running, so foreground mode cannot start in parallel.\",\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.intendedMode === \"background\" &&\n input.runtimeStatus.mode === \"foreground\"\n ) {\n anomalies.push({\n code: \"background_foreground_conflict\",\n message:\n \"OpenMeld foreground service is already running, so background mode cannot start in parallel.\",\n });\n }\n return anomalies;\n}\n\nfunction resolvePreferredServiceManagerController(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n}): DaemonServiceController | null {\n if (input.runtimeStatus.serviceController !== \"unknown\") {\n return input.runtimeStatus.serviceController;\n }\n if (isKnownServiceController(input.serviceContract?.serviceController)) {\n return input.serviceContract.serviceController;\n }\n return null;\n}\n\nfunction isKnownServiceController(\n controller: DaemonServiceController | null | undefined\n): controller is Exclude<DaemonServiceController, \"unknown\"> {\n return Boolean(controller && controller !== \"unknown\");\n}\n\nfunction hasRuntimeBundleMismatch(input: {\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n}): boolean {\n if (\n !input.runtimeCommandEntryPath ||\n input.runtimeCommandPathExists !== true\n ) {\n return true;\n }\n if (!input.activeBundleEntryPath) {\n return true;\n }\n const normalizedRuntimePath = normalizeDaemonCommandPath(\n input.runtimeCommandEntryPath\n );\n const acceptedEntryPaths = new Set([\n normalizeDaemonCommandPath(input.activeBundleEntryPath),\n ...(input.activeBundleSourceEntryPath\n ? [normalizeDaemonCommandPath(input.activeBundleSourceEntryPath)]\n : []),\n ]);\n return !acceptedEntryPaths.has(normalizedRuntimePath);\n}\n\nfunction buildRuntimeBundleMismatchMessage(input: {\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n}): string {\n if (!input.runtimeCommandEntryPath) {\n return \"OpenMeld Service runtime state does not point at a concrete service entry path.\";\n }\n if (input.runtimeCommandPathExists !== true) {\n return \"OpenMeld Service runtime state still points at a service entry file that no longer exists.\";\n }\n if (!input.activeBundleEntryPath) {\n return \"OpenMeld Service is running from a service entry path that does not match the active service files.\";\n }\n if (input.activeBundleSourceEntryPath) {\n return `OpenMeld Service is running from ${input.runtimeCommandEntryPath}, but neither the active service entry (${input.activeBundleEntryPath}) nor the service source entry (${input.activeBundleSourceEntryPath}) matches this runtime.`;\n }\n return `OpenMeld Service is running from ${input.runtimeCommandEntryPath}, but the active service files point at ${input.activeBundleEntryPath}.`;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return error.code !== \"ENOENT\";\n }\n throw error;\n }\n}\n\nfunction buildLifecycleLockedMessage(meta: OpenMeldLockMeta): string {\n const intent = typeof meta.intent === \"string\" ? meta.intent : \"unknown\";\n const command = typeof meta.command === \"string\" ? meta.command : \"unknown\";\n const pid = typeof meta.pid === \"number\" ? ` pid ${String(meta.pid)}` : \"\";\n return `Another OpenMeld Service task is already running (${command}, intent ${intent}${pid}).`;\n}\n\nfunction mergeOwnedProcesses(\n currentLaneProcesses: DaemonOwnedProcess[],\n legacySharedProcesses: DaemonOwnedProcess[]\n): DaemonOwnedProcess[] {\n if (legacySharedProcesses.length === 0) {\n return currentLaneProcesses;\n }\n const merged = [...currentLaneProcesses];\n const seenPids = new Set(\n currentLaneProcesses.map((processInfo) => processInfo.pid)\n );\n for (const processInfo of legacySharedProcesses) {\n if (seenPids.has(processInfo.pid)) {\n continue;\n }\n merged.push(processInfo);\n seenPids.add(processInfo.pid);\n }\n return merged;\n}\n","import { spawn } from \"node:child_process\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n configureDaemonMaintenanceEnvironment,\n daemonServiceUpdateWorkerNpmEntryPath,\n hasIndependentMaintenanceRegistration,\n INDEPENDENT_MAINTENANCE_REGISTRATION,\n resolveDaemonServiceUpdateWorkerIdentity,\n resolveDaemonServiceUpdateWorkerLaunchdPlistPath,\n resolveDaemonServiceUpdateWorkerSystemdPathUnitPath,\n resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath,\n resolveDaemonServiceUpdateWorkerSystemdUnitPath,\n resolveDaemonServiceUpdateWorkerWindowsScriptPath,\n} from \"../../config/daemon-service-update-worker-registration\";\nimport {\n daemonRuntimeRootPath,\n daemonRuntimeStateRootPath,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { assertSafePublishedProductionServiceRegistrationMutation } from \"../../config/published-production-safety\";\nimport { pruneManagedInstallVersions } from \"../../local-components/managed-install\";\nimport {\n clearDaemonServiceUpdateWorkerBinaryExecutable,\n daemonServiceUpdateWorkerBinaryPath,\n ensureDaemonServiceUpdateWorkerBinaryExecutable,\n readDaemonActiveBundleState,\n resolveDaemonBundleEntryPathFromState,\n runAuditedServiceManagerCarrierMutation,\n verifyDaemonActiveBundleIntegrity,\n} from \"./daemon-service-bundle\";\nimport { buildDaemonSystemServiceCommandSpec } from \"./daemon-service-command-spec\";\nimport {\n resolveDaemonServiceManager,\n startLaunchdService,\n waitForLaunchdJobUnloaded,\n} from \"./daemon-service-manager\";\nimport {\n type DaemonServiceUpdateJob,\n readPendingDaemonServiceUpdate,\n} from \"./daemon-service-update-state\";\nimport { windowsMaintenanceBinaryPath } from \"./windows-service-binary\";\nimport { windowsDirectTaskArguments } from \"./windows-task-command\";\nimport {\n runWindowsUserTask,\n windowsPowerShellPath,\n windowsTaskActionArguments,\n} from \"./windows-user-task\";\n\nconst UPDATE_WORKER_RESTART_BACKOFF_SECONDS = 30;\nconst SYSTEMD_QUOTING_PATTERN = /[\\s\"\\\\]/u;\n\nexport type DaemonServiceUpdateWorkerSpec = {\n args: string[];\n env: Record<string, string>;\n executable: string;\n pendingJobPath: string;\n workingDirectory: string;\n};\n\ntype RunCommandResult = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\nexport async function ensureDaemonServiceMaintenanceInstalled(): Promise<void> {\n // The pending update owns its executor until verification and rollback finish.\n if (await readPendingDaemonServiceUpdate()) {\n return;\n }\n const preparedBundle = await readDaemonActiveBundleState();\n if (\n !(\n preparedBundle?.sourceDistFingerprint &&\n (preparedBundle.bundleFormat === \"binary_v1\" ||\n (await verifyDaemonActiveBundleIntegrity(preparedBundle)))\n )\n ) {\n throw new Error(\n \"OpenMeld cannot install automatic maintenance without a verified Service program.\"\n );\n }\n // Binary preparation below verifies the maintenance executable against the\n // prepared source fingerprint. The main Service carrier may still be the\n // previous version until startup replaces it; it is not this worker's source.\n const spec = await buildDaemonServiceUpdateWorkerSpec({ preparedBundle });\n const identity = resolveDaemonServiceUpdateWorkerIdentity();\n let expectedDefinition: string;\n if (process.platform === \"darwin\") {\n expectedDefinition = buildLaunchdServiceUpdateWorkerPlist({\n label: identity.launchdLabel,\n logPath: resolveUpdateWorkerLogPath({}),\n spec,\n });\n } else if (process.platform === \"linux\") {\n expectedDefinition = buildSystemdServiceUpdateWorkerUnit({ spec });\n } else {\n expectedDefinition = (\n preparedBundle.bundleFormat === \"binary_v1\"\n ? windowsDirectTaskArguments\n : windowsTaskActionArguments\n )({\n ...spec,\n logPath: resolveUpdateWorkerLogPath({}),\n });\n }\n if (\n await hasIndependentMaintenanceRegistration(\n {},\n process.platform,\n expectedDefinition\n )\n ) {\n // A saved registration can outlive its executable (for example after a\n // local reinstall). Restore the verified carrier before trusting the job.\n await prepareDaemonServiceUpdateWorkerCarrier({ preparedBundle });\n if (process.platform === \"darwin\") {\n await startDaemonServiceUpdateWorker();\n }\n return;\n }\n await installDaemonServiceUpdateWorker({ preparedBundle });\n}\n\nexport async function installDaemonServiceUpdateWorker(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await prepareDaemonServiceUpdateWorkerCarrier(job, pathInput);\n await registerDaemonServiceUpdateWorker(job, pathInput);\n await startDaemonServiceUpdateWorker(undefined, pathInput);\n}\n\nexport async function registerDaemonServiceUpdateWorker(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"install the OpenMeld Service update worker for\",\n pathInput\n );\n const spec = await buildDaemonServiceUpdateWorkerSpec(job, pathInput);\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const serviceKey = `${guiDomain}/${identity.launchdLabel}`;\n const plistPath =\n resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput);\n await Promise.all([\n mkdir(dirname(plistPath), { recursive: true }),\n mkdir(dirname(resolveUpdateWorkerLogPath(pathInput)), {\n recursive: true,\n }),\n ]);\n await writeFile(\n plistPath,\n buildLaunchdServiceUpdateWorkerPlist({\n label: identity.launchdLabel,\n logPath: resolveUpdateWorkerLogPath(pathInput),\n spec,\n }),\n { encoding: \"utf8\", mode: 0o644 }\n );\n await chmod(plistPath, 0o644);\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", serviceKey],\n });\n await waitForLaunchdJobUnloaded(serviceKey);\n // Stop/uninstall leaves a persistent disabled override. Clear it before\n // bootstrap, otherwise launchd rejects reinstall with an opaque EIO.\n await requireSuccessfulCommand({\n command: \"launchctl\",\n args: [\"enable\", serviceKey],\n });\n await requireSuccessfulCommand({\n command: \"launchctl\",\n args: [\"bootstrap\", guiDomain, plistPath],\n });\n return;\n }\n\n if (process.platform === \"linux\") {\n const unitPath = resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput);\n const pathUnitPath =\n resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(pathInput);\n await mkdir(dirname(unitPath), { recursive: true });\n await Promise.all([\n writeFile(unitPath, buildSystemdServiceUpdateWorkerUnit({ spec }), {\n encoding: \"utf8\",\n mode: 0o600,\n }),\n writeFile(\n pathUnitPath,\n buildSystemdServiceUpdateWorkerPathUnit({\n serviceName: identity.serviceName,\n pendingJobPath: spec.pendingJobPath,\n }),\n { encoding: \"utf8\", mode: 0o600 }\n ),\n writeFile(\n resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(pathInput),\n buildSystemdServiceUpdateWorkerTimerUnit(identity.serviceName),\n { encoding: \"utf8\", mode: 0o600 }\n ),\n ]);\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n });\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\n \"--user\",\n \"enable\",\n \"--now\",\n `${identity.serviceName}.path`,\n `${identity.serviceName}.timer`,\n ],\n });\n return;\n }\n\n if (process.platform === \"win32\") {\n const scriptPath =\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n await mkdir(dirname(resolveUpdateWorkerLogPath(pathInput)), {\n recursive: true,\n });\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation: \"install\",\n executable:\n job.preparedBundle.bundleFormat === \"binary_v1\"\n ? spec.executable\n : windowsPowerShellPath(),\n arguments: (job.preparedBundle.bundleFormat === \"binary_v1\"\n ? windowsDirectTaskArguments\n : windowsTaskActionArguments)({\n ...spec,\n logPath: resolveUpdateWorkerLogPath(pathInput),\n }),\n workingDirectory: spec.workingDirectory,\n periodic: true,\n });\n await rm(scriptPath, { force: true });\n return;\n }\n\n throw new Error(\n `OpenMeld cannot install its background update worker on ${process.platform}.`\n );\n}\n\nexport async function prepareDaemonServiceUpdateWorkerCarrier(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (job.preparedBundle.bundleFormat === \"binary_v1\") {\n await ensureDaemonServiceUpdateWorkerBinaryExecutable(\n job.preparedBundle,\n pathInput\n );\n return;\n }\n const entry = await resolveDaemonBundleEntryPathFromState(\n job.preparedBundle,\n pathInput\n );\n if (!entry) {\n throw new Error(\n \"OpenMeld could not resolve the verified maintenance bundle.\"\n );\n }\n const target = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"refresh_update_worker_launcher\",\n pathInput,\n targetPath: target,\n run: async () => {\n await mkdir(dirname(target), { recursive: true });\n const temporary = `${target}.${process.pid}.tmp`;\n try {\n await writeFile(\n temporary,\n `process.env.OPENMELD_INTERNAL_NPM_INSTALL_ENTRY = ${JSON.stringify(job.preparedBundle.sourceEntryScriptPath)};\\nawait import(${JSON.stringify(pathToFileURL(entry).href)});\\n`,\n { mode: 0o600 }\n );\n await rename(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n },\n });\n}\n\nexport async function pruneDaemonServiceUpdateWorkerManagedVersions(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (job.preparedBundle.bundleFormat !== \"binary_v1\") {\n return;\n }\n const previousActiveBundle = await readDaemonActiveBundleState(pathInput);\n await pruneManagedInstallVersions({\n pathInput,\n preferredRollbackVersion: previousActiveBundle?.daemonVersion ?? null,\n });\n}\n\nexport async function startDaemonServiceUpdateWorker(\n _job?: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"start the OpenMeld Service update worker for\",\n pathInput\n );\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const serviceKey = `${guiDomain}/${identity.launchdLabel}`;\n await startLaunchdService({\n guiDomain,\n serviceKey,\n plistPath: resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput),\n });\n return;\n }\n if (process.platform === \"linux\") {\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\"--user\", \"start\", `${identity.serviceName}.service`],\n });\n return;\n }\n if (process.platform === \"win32\") {\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript:\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput),\n operation: \"start\",\n });\n return;\n }\n throw new Error(\n `OpenMeld cannot start its background update worker on ${process.platform}.`\n );\n}\n\nasync function clearDaemonServiceUpdateWorkerNpmEntry(\n pathInput: OpenMeldPathResolutionInput\n): Promise<void> {\n const targetPath = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"remove_update_worker_launcher\",\n pathInput,\n targetPath,\n run: () => rm(targetPath, { force: true }),\n });\n}\n\nexport async function uninstallDaemonServiceUpdateWorker(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"uninstall the OpenMeld Service update worker for\",\n pathInput\n );\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", `${guiDomain}/${identity.launchdLabel}`],\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", `${guiDomain}/${identity.launchdLabel}`],\n });\n await waitForLaunchdJobUnloaded(`${guiDomain}/${identity.launchdLabel}`);\n await rm(resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput), {\n force: true,\n });\n await clearDaemonServiceUpdateWorkerBinaryExecutable(pathInput);\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n return;\n }\n if (process.platform === \"linux\") {\n await runCommand({\n command: \"systemctl\",\n args: [\n \"--user\",\n \"disable\",\n \"--now\",\n `${identity.serviceName}.path`,\n `${identity.serviceName}.timer`,\n ],\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"stop\", `${identity.serviceName}.service`],\n });\n await Promise.all([\n rm(resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput), {\n force: true,\n }),\n rm(resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(pathInput), {\n force: true,\n }),\n rm(resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(pathInput), {\n force: true,\n }),\n ]);\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n });\n await clearDaemonServiceUpdateWorkerBinaryExecutable(pathInput);\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n return;\n }\n if (process.platform === \"win32\") {\n const legacyScript =\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript,\n operation: \"stop\",\n });\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript,\n operation: \"uninstall\",\n });\n await rm(legacyScript, { force: true });\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n }\n}\n\nexport async function buildDaemonServiceUpdateWorkerSpec(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateWorkerSpec> {\n const mainManager = await resolveDaemonServiceManager(undefined, pathInput);\n if (!mainManager) {\n throw new Error(\n \"OpenMeld could not find this computer's background service manager.\"\n );\n }\n const baseSpec = buildDaemonSystemServiceCommandSpec({\n controller: mainManager.controller,\n ...(job.preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: job.preparedBundle.sourceEntryScriptPath }\n : {}),\n distribution:\n job.preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\",\n });\n const binaryDistribution = job.preparedBundle.bundleFormat === \"binary_v1\";\n const binaryWorkerPath =\n process.platform === \"win32\" && binaryDistribution\n ? windowsMaintenanceBinaryPath(job.preparedBundle, pathInput)\n : daemonServiceUpdateWorkerBinaryPath(pathInput);\n const targetEntryPath = binaryDistribution\n ? binaryWorkerPath\n : daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n if (!targetEntryPath) {\n throw new Error(\n \"OpenMeld could not resolve the prepared Service update executable.\"\n );\n }\n const env = { ...baseSpec.env };\n configureDaemonMaintenanceEnvironment(env);\n return {\n args: binaryDistribution\n ? [\"service\", \"update-worker\"]\n : [targetEntryPath, \"service\", \"update-worker\"],\n env,\n executable: binaryDistribution ? targetEntryPath : process.execPath,\n pendingJobPath: join(\n daemonRuntimeStateRootPath(pathInput),\n \"service-update.json\"\n ),\n workingDirectory: daemonRuntimeRootPath(pathInput),\n };\n}\n\nexport function buildLaunchdServiceUpdateWorkerPlist(input: {\n label: string;\n logPath: string;\n spec: DaemonServiceUpdateWorkerSpec;\n}): string {\n const args = [input.spec.executable, ...input.spec.args]\n .map((value) => ` <string>${escapeXml(value)}</string>`)\n .join(\"\\n\");\n const env = Object.entries(input.spec.env)\n .map(\n ([key, value]) =>\n ` <key>${escapeXml(key)}</key>\\n <string>${escapeXml(value)}</string>`\n )\n .join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- ${INDEPENDENT_MAINTENANCE_REGISTRATION} -->\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(input.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${args}\n </array>\n <key>WorkingDirectory</key>\n <string>${escapeXml(input.spec.workingDirectory)}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>StartInterval</key>\n <integer>3600</integer>\n <key>KeepAlive</key>\n <dict>\n <key>PathState</key>\n <dict>\n <key>${escapeXml(input.spec.pendingJobPath)}</key>\n <true/>\n <key>${escapeXml(join(dirname(input.spec.pendingJobPath), \"tools-update.json\"))}</key>\n <true/>\n </dict>\n </dict>\n <key>ThrottleInterval</key>\n <integer>${String(UPDATE_WORKER_RESTART_BACKOFF_SECONDS)}</integer>\n <key>EnvironmentVariables</key>\n <dict>\n${env}\n </dict>\n <key>StandardOutPath</key>\n <string>${escapeXml(input.logPath)}</string>\n <key>StandardErrorPath</key>\n <string>${escapeXml(input.logPath)}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerUnit(input: {\n spec: DaemonServiceUpdateWorkerSpec;\n}): string {\n const command = [input.spec.executable, ...input.spec.args]\n .map(quoteSystemdArg)\n .join(\" \");\n const environment = Object.entries(input.spec.env)\n .map(\n ([key, value]) =>\n `Environment=${key}=${quoteSystemdEnvironmentValue(value)}`\n )\n .join(\"\\n\");\n return `# ${INDEPENDENT_MAINTENANCE_REGISTRATION}\n[Unit]\nDescription=OpenMeld Service Update Worker\nAfter=default.target\n\n[Service]\nType=simple\nExecStart=${command}\nWorkingDirectory=${quoteSystemdArg(input.spec.workingDirectory)}\n${environment}\nRestart=on-failure\nRestartSec=${String(UPDATE_WORKER_RESTART_BACKOFF_SECONDS)}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerPathUnit(input: {\n pendingJobPath: string;\n serviceName: string;\n}): string {\n return `[Unit]\nDescription=Watch for a pending OpenMeld Service update\n\n[Path]\nPathExists=${input.pendingJobPath}\nPathExists=${join(dirname(input.pendingJobPath), \"tools-update.json\")}\nUnit=${input.serviceName}.service\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerTimerUnit(\n serviceName: string\n): string {\n return `[Unit]\nDescription=Check for OpenMeld updates\n\n[Timer]\nOnStartupSec=2min\nOnUnitInactiveSec=1h\nUnit=${serviceName}.service\n\n[Install]\nWantedBy=timers.target\n`;\n}\n\nfunction resolveUpdateWorkerLogPath(\n pathInput: OpenMeldPathResolutionInput\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n \"service-update-worker.log\"\n );\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction quoteSystemdArg(value: string): string {\n if (!SYSTEMD_QUOTING_PATTERN.test(value)) {\n return value;\n }\n return `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\nfunction quoteSystemdEnvironmentValue(value: string): string {\n return quoteSystemdArg(value);\n}\n\nasync function requireSuccessfulCommand(input: {\n args: string[];\n command: string;\n}): Promise<void> {\n const result = await runCommand(input);\n if (result.exitCode !== 0) {\n throw commandFailure(`${input.command} ${input.args.join(\" \")}`, result);\n }\n}\n\nfunction commandFailure(operation: string, result: RunCommandResult): Error {\n const detail = result.stderr.trim() || result.stdout.trim();\n return new Error(\n `${operation} failed with exit ${String(result.exitCode)}${\n detail ? `: ${detail}` : \"\"\n }`\n );\n}\n\nasync function runCommand(input: {\n args: string[];\n command: string;\n}): Promise<RunCommandResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(input.command, input.args, {\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\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 resolve({ exitCode: Number(code ?? 1), stderr, stdout });\n });\n });\n}\n\nexport async function readInstalledUpdateWorkerDefinition(\n path: string\n): Promise<string | null> {\n return await readFile(path, \"utf8\").catch(() => null);\n}\n","import type { OpenMeldToolsMaintenanceProjection } from \"@openmeld/schemas/types\";\nimport {\n getConfiguredOpenMeldToolsMaintenance,\n setConfiguredOpenMeldToolsMaintenance,\n} from \"../../config/runtime-config\";\n\nexport type OpenMeldToolsMaintenancePolicy = {\n automaticUpdatesEnabled: boolean;\n};\n\nexport async function readOpenMeldToolsMaintenancePolicy(): Promise<OpenMeldToolsMaintenancePolicy> {\n return await getConfiguredOpenMeldToolsMaintenance();\n}\n\nexport async function writeOpenMeldToolsMaintenancePolicy(\n policy: OpenMeldToolsMaintenancePolicy\n): Promise<void> {\n await setConfiguredOpenMeldToolsMaintenance(policy);\n}\n\nexport async function resolveOpenMeldToolsMaintenanceProjection(): Promise<OpenMeldToolsMaintenanceProjection> {\n try {\n const policy = await readOpenMeldToolsMaintenancePolicy();\n return {\n automaticUpdatesEnabled: policy.automaticUpdatesEnabled,\n status: \"ready\",\n };\n } catch {\n return {\n automaticUpdatesEnabled: false,\n status: \"needs_help\",\n };\n }\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { openMeldToolsUpdateAttemptSchema } from \"@openmeld/schemas\";\nimport type { OpenMeldToolsUpdateAttempt } from \"@openmeld/schemas/types\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\n\nfunction pendingAttemptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"tools-update.json\");\n}\n\nfunction lastAttemptPath(pathInput: OpenMeldPathResolutionInput = {}): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"tools-update-last.json\");\n}\n\nexport async function readPendingOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<OpenMeldToolsUpdateAttempt | null> {\n return await readAttempt(pendingAttemptPath(pathInput));\n}\n\nexport async function readLastOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<OpenMeldToolsUpdateAttempt | null> {\n return await readAttempt(lastAttemptPath(pathInput));\n}\n\nexport async function persistOpenMeldToolsUpdateAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeAttempt(pendingAttemptPath(pathInput), attempt);\n}\n\nexport async function completeOpenMeldToolsUpdateAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeAttempt(lastAttemptPath(pathInput), attempt);\n await discardPendingOpenMeldToolsUpdateAttempt(pathInput);\n}\n\nexport async function discardPendingOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(pendingAttemptPath(pathInput), { force: true });\n}\n\nasync function readAttempt(\n path: string\n): Promise<OpenMeldToolsUpdateAttempt | 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 = openMeldToolsUpdateAttemptSchema.safeParse(\n JSON.parse(raw) as unknown\n );\n if (!parsed.success) {\n throw new Error(\"OpenMeld update state is invalid.\");\n }\n return parsed.data;\n}\n\nasync function writeAttempt(\n path: string,\n attempt: OpenMeldToolsUpdateAttempt\n): Promise<void> {\n const validated = openMeldToolsUpdateAttemptSchema.parse(attempt);\n const temporaryPath = `${path}.${String(process.pid)}.tmp`;\n await mkdir(dirname(path), { recursive: true });\n await writeFile(temporaryPath, `${JSON.stringify(validated, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, path);\n}\n","import { openMeldToolsUpdateRequestSourceSchema } from \"@openmeld/schemas\";\nimport type { OpenMeldToolsUpdateRequestSource } from \"@openmeld/schemas/types\";\n\nconst OPERATION_ID_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_OPERATION_ID\";\nconst REQUESTED_AT_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_REQUESTED_AT\";\nconst REQUEST_SOURCE_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_REQUEST_SOURCE\";\nconst TARGET_CLI_VERSION_ENV =\n \"OPENMELD_INTERNAL_TOOLS_UPDATE_TARGET_CLI_VERSION\";\nconst TARGET_SERVICE_VERSION_ENV =\n \"OPENMELD_INTERNAL_TOOLS_UPDATE_TARGET_SERVICE_VERSION\";\n\nexport type OpenMeldToolsUpdateContext = {\n operationId: string;\n requestedAt: string;\n requestSource: OpenMeldToolsUpdateRequestSource;\n targetCliVersion?: string;\n targetServiceVersion?: string;\n};\n\nexport function buildOpenMeldToolsUpdateContextEnv(\n context: OpenMeldToolsUpdateContext\n): NodeJS.ProcessEnv {\n return {\n [OPERATION_ID_ENV]: context.operationId,\n [REQUESTED_AT_ENV]: context.requestedAt,\n [REQUEST_SOURCE_ENV]: context.requestSource,\n ...(context.targetCliVersion\n ? { [TARGET_CLI_VERSION_ENV]: context.targetCliVersion }\n : {}),\n ...(context.targetServiceVersion\n ? { [TARGET_SERVICE_VERSION_ENV]: context.targetServiceVersion }\n : {}),\n };\n}\n\nexport function readOpenMeldToolsUpdateContextFromEnv(\n env: NodeJS.ProcessEnv = process.env\n): OpenMeldToolsUpdateContext | null {\n const operationId = normalize(env[OPERATION_ID_ENV]);\n const requestedAt = normalize(env[REQUESTED_AT_ENV]);\n const requestSource = openMeldToolsUpdateRequestSourceSchema.safeParse(\n env[REQUEST_SOURCE_ENV]\n );\n const targetCliVersion = normalize(env[TARGET_CLI_VERSION_ENV]);\n const targetServiceVersion = normalize(env[TARGET_SERVICE_VERSION_ENV]);\n if (!(operationId && requestedAt && requestSource.success)) {\n return null;\n }\n const requestedAtMs = Date.parse(requestedAt);\n if (!Number.isFinite(requestedAtMs)) {\n return null;\n }\n return {\n operationId,\n requestedAt: new Date(requestedAtMs).toISOString(),\n requestSource: requestSource.data,\n ...(targetCliVersion ? { targetCliVersion } : {}),\n ...(targetServiceVersion ? { targetServiceVersion } : {}),\n };\n}\n\nfunction normalize(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import { spawn } from \"node:child_process\";\nimport { write } from \"node:fs\";\nimport { compareSemver } from \"../../config/version-state\";\nimport { readManagedCliInstallation } from \"../../local-components/managed-install\";\nimport { isBinaryDistribution } from \"../../runtime/distribution\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\nimport {\n buildOpenMeldToolsUpdateContextEnv,\n type OpenMeldToolsUpdateContext,\n} from \"./openmeld-tools-update-context\";\nimport {\n appendBoundedOpenMeldToolsUpdateProcessOutput,\n type OpenMeldToolsUpdateProcessFailure,\n parseOpenMeldToolsUpdateFailureFrame,\n} from \"./openmeld-tools-update-process-frame\";\n\nexport type OpenMeldToolsUpgradeProcessResult = {\n exitCode: number;\n processFailure?: OpenMeldToolsUpdateProcessFailure;\n};\n\ntype BestEffortOutputWrite = (\n fileDescriptor: number,\n chunk: Buffer,\n callback: (error: NodeJS.ErrnoException | null) => void\n) => void;\n\ntype OpenMeldToolsUpgradeProcessDependencies = {\n stderrFileDescriptor?: number;\n stdoutFileDescriptor?: number;\n writeOutput?: BestEffortOutputWrite;\n};\n\nexport async function resolveMaintenanceCliInstallation(): Promise<{\n version: string;\n binaryPath: string;\n}> {\n const installed = isBinaryDistribution()\n ? await readManagedCliInstallation()\n : null;\n return installed && compareSemver(installed.version, OPENMELD_VERSION) >= 0\n ? installed\n : { version: OPENMELD_VERSION, binaryPath: process.execPath };\n}\n\nexport async function runOpenMeldToolsUpgradeProcess(\n context: OpenMeldToolsUpdateContext,\n dependencies: OpenMeldToolsUpgradeProcessDependencies = {}\n): Promise<OpenMeldToolsUpgradeProcessResult> {\n const binaryDistribution = isBinaryDistribution();\n const cli = await resolveMaintenanceCliInstallation();\n // A retained Service/maintenance carrier may be older than the installed CLI.\n // Run the installed CLI for updates; the protected carrier can still repair a\n // missing managed install. npm retains its original installation recipe.\n const { command, argsPrefix } = resolveOpenMeldToolsUpgradeProgram({\n binaryDistribution,\n processEntryScriptPath: process.argv[1],\n processExecutablePath: binaryDistribution\n ? cli.binaryPath\n : process.execPath,\n });\n const writeOutput: BestEffortOutputWrite =\n dependencies.writeOutput ??\n ((fileDescriptor, chunk, callback) => {\n write(fileDescriptor, chunk, (error) => callback(error));\n });\n const forwardStdout = createBestEffortOutputForwarder({\n fileDescriptor: dependencies.stdoutFileDescriptor ?? process.stdout.fd,\n writeOutput,\n });\n const forwardStderr = createBestEffortOutputForwarder({\n fileDescriptor: dependencies.stderrFileDescriptor ?? process.stderr.fd,\n writeOutput,\n });\n return await new Promise((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, [...argsPrefix, \"maintenance-upgrade\"], {\n windowsHide: true,\n env: {\n ...process.env,\n ...buildOpenMeldToolsUpdateContextEnv(context),\n OPENMELD_INTERNAL_SKIP_STARTUP_UPGRADE: \"1\",\n OPENMELD_INTERNAL_MAINTENANCE_WORKER: \"1\",\n },\n // Tee output into the OS-owned worker log while retaining only a bounded\n // stdout tail so the typed terminal failure frame can reach the owner.\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n const text = chunk.toString();\n stdout = appendBoundedOpenMeldToolsUpdateProcessOutput(stdout, text);\n forwardStdout(Buffer.from(text));\n });\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n forwardStderr(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n const processFailure = parseOpenMeldToolsUpdateFailureFrame(stdout);\n resolve({\n exitCode: Number(code ?? 1),\n ...(processFailure ? { processFailure } : {}),\n });\n });\n });\n}\n\nfunction createBestEffortOutputForwarder(input: {\n fileDescriptor: number | undefined;\n writeOutput: BestEffortOutputWrite;\n}): (chunk: Buffer) => void {\n let failed = !Number.isInteger(input.fileDescriptor);\n let writeInFlight = false;\n return (chunk) => {\n if (failed || writeInFlight || input.fileDescriptor === undefined) {\n return;\n }\n writeInFlight = true;\n try {\n input.writeOutput(input.fileDescriptor, chunk, (error) => {\n writeInFlight = false;\n if (error) {\n failed = true;\n }\n });\n } catch {\n writeInFlight = false;\n failed = true;\n }\n };\n}\n\nexport function resolveOpenMeldToolsUpgradeProgram(input: {\n binaryDistribution: boolean;\n processEntryScriptPath?: string;\n processExecutablePath: string;\n}): { argsPrefix: string[]; command: string } {\n if (input.binaryDistribution) {\n return {\n argsPrefix: [],\n command: input.processExecutablePath,\n };\n }\n const sourceEntryScriptPath = input.processEntryScriptPath;\n if (!sourceEntryScriptPath) {\n throw new Error(\"OpenMeld could not find its update program.\");\n }\n return {\n argsPrefix: [sourceEntryScriptPath],\n command: input.processExecutablePath,\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n DaemonServiceUpdateJob,\n OpenMeldToolsUpdateAttempt,\n OpenMeldToolsUpdateOperation,\n OpenMeldToolsUpdateRequestSource,\n} from \"@openmeld/schemas/types\";\nimport { toErrorMessage } from \"@openmeld/utils\";\nimport {\n assessCliUpdate,\n type CliUpdateAssessment,\n} from \"../../command-entry-checks/cli-update-assessment\";\nimport { resolveServiceUpdateUrgency } from \"../../command-entry-checks/service-update-urgency\";\nimport { withDaemonServiceReconcileLock } from \"../../config/daemon-state\";\nimport { resolveOpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../lifecycle/current-daemon-version\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"../lifecycle/daemon-service-alignment-target\";\nimport { inspectDaemonServiceInventory } from \"../lifecycle/daemon-service-inventory\";\nimport { readPendingDaemonServiceUpdate } from \"../lifecycle/daemon-service-update-state\";\nimport { startDaemonServiceUpdateWorker } from \"../lifecycle/daemon-service-update-worker-manager\";\nimport {\n type OpenMeldToolsMaintenancePolicy,\n readOpenMeldToolsMaintenancePolicy,\n} from \"./openmeld-tools-maintenance-policy\";\nimport {\n completeOpenMeldToolsUpdateAttempt,\n discardPendingOpenMeldToolsUpdateAttempt,\n persistOpenMeldToolsUpdateAttempt,\n readPendingOpenMeldToolsUpdateAttempt,\n} from \"./openmeld-tools-update-attempt-state\";\nimport type { OpenMeldToolsUpdateContext } from \"./openmeld-tools-update-context\";\nimport {\n encodePersistedOpenMeldToolsUpdateFailure,\n OpenMeldToolsUpdateFailureError,\n resolveOpenMeldToolsUpdateFailure,\n} from \"./openmeld-tools-update-failure\";\nimport {\n type OpenMeldToolsUpgradeProcessResult,\n resolveMaintenanceCliInstallation,\n runOpenMeldToolsUpgradeProcess,\n} from \"./openmeld-tools-upgrade-process\";\n\ntype OpenMeldToolsUpdateCoordinatorDependencies = {\n withCoordinationLock: <T>(run: () => Promise<T>) => Promise<T>;\n wakeWorker: () => Promise<void>;\n assessUpdate: (input: {\n forceRefresh: boolean;\n }) => Promise<CliUpdateAssessment>;\n serviceNeedsAlignment: (version: string) => Promise<boolean>;\n completeAttempt: (attempt: OpenMeldToolsUpdateAttempt) => Promise<void>;\n createOperationId: () => string;\n discardPendingAttempt: () => Promise<void>;\n now: () => string;\n persistAttempt: (attempt: OpenMeldToolsUpdateAttempt) => Promise<void>;\n readPendingAttempt: () => Promise<OpenMeldToolsUpdateAttempt | null>;\n readPendingServiceJob: () => Promise<DaemonServiceUpdateJob | null>;\n readPolicy: () => Promise<OpenMeldToolsMaintenancePolicy>;\n reportBackgroundError: (error: unknown) => void;\n resolveUrgency: () => Promise<\"available\" | \"required\">;\n runUpgrade: (\n context: OpenMeldToolsUpdateContext\n ) => Promise<OpenMeldToolsUpgradeProcessResult>;\n};\n\nexport type OpenMeldToolsUpdateRequestResult =\n | { status: \"disabled\" }\n | { status: \"unavailable\" }\n | { status: \"current\"; currentVersion: string }\n | {\n status: \"started\" | \"already_running\";\n operation: OpenMeldToolsUpdateOperation;\n };\n\nexport type OpenMeldToolsUpdateCoordinator = {\n requestUpdate: (input: {\n requestSource: OpenMeldToolsUpdateRequestSource;\n }) => Promise<OpenMeldToolsUpdateRequestResult>;\n resumePendingUpdate: () => Promise<boolean>;\n waitForIdle: () => Promise<void>;\n};\n\nexport function createOpenMeldToolsUpdateCoordinator(\n overrides: Partial<OpenMeldToolsUpdateCoordinatorDependencies> = {},\n options: { executeUpdates?: boolean } = {}\n): OpenMeldToolsUpdateCoordinator {\n const deps = resolveDependencies(overrides);\n let inFlight: Promise<void> | null = null;\n let coordination: Promise<void> = Promise.resolve();\n\n const runSerialized = <T>(run: () => Promise<T>): Promise<T> => {\n const result = coordination.then(run, run);\n coordination = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n };\n\n const startAttempt = (attempt: OpenMeldToolsUpdateAttempt): void => {\n if (options.executeUpdates === false) {\n return;\n }\n if (inFlight) {\n return;\n }\n const running = runAttempt(attempt, deps);\n const tracked = running.finally(() => {\n if (inFlight === tracked) {\n inFlight = null;\n }\n });\n inFlight = tracked;\n inFlight.catch(deps.reportBackgroundError);\n };\n\n const resumePendingUpdate = async (): Promise<boolean> => {\n const serviceJob = await deps.readPendingServiceJob();\n const pendingAttempt = await deps.readPendingAttempt();\n if (serviceJob) {\n if (pendingAttempt) {\n await deps.discardPendingAttempt();\n }\n return true;\n }\n if (!pendingAttempt) {\n return false;\n }\n startAttempt(pendingAttempt);\n return true;\n };\n\n const requestUpdate = async ({\n requestSource,\n }: {\n requestSource: OpenMeldToolsUpdateRequestSource;\n }): Promise<OpenMeldToolsUpdateRequestResult> => {\n if (requestSource === \"automatic\") {\n const policy = await deps.readPolicy();\n if (!policy.automaticUpdatesEnabled) {\n return { status: \"disabled\" };\n }\n }\n\n const serviceJob = await deps.readPendingServiceJob();\n if (serviceJob) {\n return {\n status: \"already_running\",\n operation: projectServiceJob(serviceJob),\n };\n }\n const existingAttempt = await deps.readPendingAttempt();\n if (existingAttempt) {\n startAttempt(existingAttempt);\n return {\n status: \"already_running\",\n operation: existingAttempt.operation,\n };\n }\n\n const assessment = await deps.assessUpdate({ forceRefresh: true });\n if (!(assessment.checked && assessment.latestVersion)) {\n return { status: \"unavailable\" };\n }\n const serviceVersion =\n assessment.serviceVersion ?? assessment.latestVersion;\n if (\n !(\n assessment.updateAvailable ||\n (await deps.serviceNeedsAlignment(serviceVersion))\n )\n ) {\n return {\n currentVersion: assessment.currentVersion,\n status: \"current\",\n };\n }\n\n const now = deps.now();\n const attempt: OpenMeldToolsUpdateAttempt = {\n v: 1,\n attempts: 0,\n errorMessage: null,\n operation: {\n operationId: deps.createOperationId(),\n phase: \"updating\",\n requestSource,\n requestedAt: now,\n targetCliVersion: assessment.latestVersion,\n targetServiceVersion: serviceVersion,\n targetVersion: assessment.updateAvailable\n ? assessment.latestVersion\n : serviceVersion,\n updatedAt: now,\n urgency: assessment.floorBreached\n ? \"required\"\n : await deps.resolveUrgency(),\n },\n };\n await deps.persistAttempt(attempt);\n startAttempt(attempt);\n return { status: \"started\", operation: attempt.operation };\n };\n\n return {\n requestUpdate: async (input) => {\n const result = await runSerialized(\n async () => await deps.withCoordinationLock(() => requestUpdate(input))\n );\n if (\n options.executeUpdates === false &&\n (result.status === \"started\" || result.status === \"already_running\") &&\n (await deps.readPendingAttempt())?.operation.operationId ===\n result.operation.operationId\n ) {\n // Release the lifecycle lock before waking the worker. It must be able\n // to acquire that same lock when Task Scheduler starts it.\n await deps.wakeWorker();\n }\n return result;\n },\n resumePendingUpdate: async () => {\n const resumed = await runSerialized(() =>\n deps.withCoordinationLock(resumePendingUpdate)\n );\n if (\n resumed &&\n options.executeUpdates === false &&\n (await deps.readPendingAttempt()) !== null\n ) {\n await deps.wakeWorker();\n }\n return resumed;\n },\n waitForIdle: async () => {\n await coordination;\n while (inFlight) {\n await inFlight;\n }\n },\n };\n}\n\nasync function runAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n deps: OpenMeldToolsUpdateCoordinatorDependencies\n): Promise<void> {\n const running: OpenMeldToolsUpdateAttempt = {\n ...attempt,\n attempts: attempt.attempts + 1,\n errorMessage: null,\n operation: {\n ...attempt.operation,\n phase: \"updating\",\n updatedAt: deps.now(),\n },\n };\n await deps.persistAttempt(running);\n try {\n const result = await deps.runUpgrade({\n operationId: running.operation.operationId,\n requestedAt: running.operation.requestedAt,\n requestSource: running.operation.requestSource,\n targetCliVersion: running.operation.targetCliVersion,\n targetServiceVersion: running.operation.targetServiceVersion,\n });\n if (result.exitCode !== 0) {\n const fallbackMessage = `OpenMeld update process exited with status ${String(result.exitCode)}.`;\n throw new OpenMeldToolsUpdateFailureError({\n failureCode: result.processFailure?.failureCode ?? \"cli.update.failed\",\n message: result.processFailure?.detail ?? fallbackMessage,\n });\n }\n const serviceJob = await deps.readPendingServiceJob();\n if (serviceJob) {\n await deps.discardPendingAttempt();\n return;\n }\n await deps.completeAttempt({\n ...running,\n errorMessage: null,\n operation: {\n ...running.operation,\n phase: \"updated\",\n updatedAt: deps.now(),\n },\n });\n } catch (error) {\n const failureCode =\n resolveOpenMeldToolsUpdateFailure(error) ?? \"cli.update.failed\";\n await deps.completeAttempt({\n ...running,\n errorMessage: encodePersistedOpenMeldToolsUpdateFailure({\n detail: toErrorMessage(error),\n failureCode,\n }),\n operation: {\n ...running.operation,\n phase: \"needs_help\",\n updatedAt: deps.now(),\n },\n });\n }\n}\n\nfunction resolveDependencies(\n overrides: Partial<OpenMeldToolsUpdateCoordinatorDependencies>\n): OpenMeldToolsUpdateCoordinatorDependencies {\n return {\n withCoordinationLock:\n overrides.withCoordinationLock ?? withDaemonServiceReconcileLock,\n wakeWorker:\n overrides.wakeWorker ?? (() => startDaemonServiceUpdateWorker()),\n assessUpdate:\n overrides.assessUpdate ??\n (async () =>\n await assessCliUpdate({\n environmentTarget: await resolveOpenMeldEnvironmentTarget(),\n forceRefresh: true,\n currentVersion: (await resolveMaintenanceCliInstallation()).version,\n })),\n completeAttempt:\n overrides.completeAttempt ?? completeOpenMeldToolsUpdateAttempt,\n serviceNeedsAlignment:\n overrides.serviceNeedsAlignment ??\n (async (selectedVersion) => {\n const daemonVersion =\n await resolveCurrentDaemonExpectedVersion(selectedVersion);\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: daemonVersion,\n intendedMode: \"background\",\n intent: \"upgrade_reconcile\",\n });\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: buildDaemonServiceTargetSpec({ daemonVersion }),\n });\n return (\n decision.status !== \"already_aligned\" &&\n decision.status !== \"not_installed\"\n );\n }),\n createOperationId: overrides.createOperationId ?? randomUUID,\n discardPendingAttempt:\n overrides.discardPendingAttempt ??\n discardPendingOpenMeldToolsUpdateAttempt,\n now: overrides.now ?? (() => new Date().toISOString()),\n persistAttempt:\n overrides.persistAttempt ?? persistOpenMeldToolsUpdateAttempt,\n readPendingAttempt:\n overrides.readPendingAttempt ?? readPendingOpenMeldToolsUpdateAttempt,\n readPendingServiceJob:\n overrides.readPendingServiceJob ?? readPendingDaemonServiceUpdate,\n readPolicy: overrides.readPolicy ?? readOpenMeldToolsMaintenancePolicy,\n reportBackgroundError:\n overrides.reportBackgroundError ??\n ((error) => {\n console.error(\"[openmeld.tools.update_failed]\", error);\n }),\n resolveUrgency: overrides.resolveUrgency ?? resolveServiceUpdateUrgency,\n runUpgrade: overrides.runUpgrade ?? runOpenMeldToolsUpgradeProcess,\n };\n}\n\nfunction projectServiceJob(\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 ...(job.targetCliVersion ? { targetCliVersion: job.targetCliVersion } : {}),\n ...(job.targetServiceVersion\n ? { targetServiceVersion: job.targetServiceVersion }\n : {}),\n updatedAt: job.updatedAt,\n urgency: job.urgency,\n };\n}\n","import type { DaemonServiceContract } from \"@openmeld/schemas/types\";\nimport {\n type DaemonServiceContractStateInput,\n upsertDaemonServiceContract,\n} from \"../../config/daemon-service-contract\";\nimport { normalizeHeartbeatIntervalMs } from \"../core/logger\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\n\nexport type DaemonServiceContractMissingField =\n | \"daemonVersion\"\n | \"bundleId\"\n | \"deviceId\"\n | \"gatewayUrl\"\n | \"serviceController\";\n\nexport type DaemonServiceContractWriteResult =\n | {\n contract: DaemonServiceContract;\n status: \"written\";\n }\n | {\n missingFields: DaemonServiceContractMissingField[];\n status: \"skipped_missing_fields\";\n };\n\nexport async function writeDaemonServiceContract(input: {\n autoStart: boolean;\n bundleId?: string | null;\n daemonVersion?: string | null;\n desiredState: DaemonServiceContractStateInput[\"desiredState\"];\n deviceId?: string | null;\n connectedComputerId?: string | null;\n gatewayUrl?: string | null;\n heartbeatMs?: number | null;\n lane?: DaemonServiceContractStateInput[\"lane\"];\n ownerUserId?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): Promise<DaemonServiceContractWriteResult> {\n const missingFields = resolveMissingContractFields(input);\n if (missingFields.length > 0) {\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"skipped\",\n metadata: {\n autoStart: input.autoStart,\n desiredState: input.desiredState,\n missingFields,\n reason: \"missing_required_contract_fields\",\n },\n });\n return {\n status: \"skipped_missing_fields\",\n missingFields,\n };\n }\n const completeInput = requireCompleteContractInput(input);\n\n const contract = await upsertDaemonServiceContract(completeInput);\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"completed\",\n metadata: {\n autoStart: input.autoStart,\n desiredState: input.desiredState,\n deviceId: contract.deviceId,\n ...(contract.ownerUserId ? { ownerUserId: contract.ownerUserId } : {}),\n ...(contract.profileId ? { profileId: contract.profileId } : {}),\n serviceController: contract.serviceController,\n },\n });\n return {\n status: \"written\",\n contract,\n };\n}\n\nfunction requireCompleteContractInput(input: {\n autoStart: boolean;\n bundleId?: string | null;\n daemonVersion?: string | null;\n desiredState: DaemonServiceContractStateInput[\"desiredState\"];\n deviceId?: string | null;\n connectedComputerId?: string | null;\n gatewayUrl?: string | null;\n heartbeatMs?: number | null;\n lane?: DaemonServiceContractStateInput[\"lane\"];\n ownerUserId?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): DaemonServiceContractStateInput {\n if (\n !(\n input.daemonVersion &&\n input.bundleId &&\n input.serviceController &&\n input.gatewayUrl &&\n input.deviceId\n )\n ) {\n throw new Error(\n \"OpenMeld Service contract writer received incomplete input.\"\n );\n }\n return {\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 ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n heartbeatMs: normalizeHeartbeatIntervalMs(input.heartbeatMs ?? undefined),\n ...(input.lane ? { lane: input.lane } : {}),\n };\n}\n\nfunction resolveMissingContractFields(input: {\n bundleId?: string | null;\n daemonVersion?: string | null;\n deviceId?: string | null;\n gatewayUrl?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): DaemonServiceContractMissingField[] {\n const missingFields: DaemonServiceContractMissingField[] = [];\n if (!input.daemonVersion) {\n missingFields.push(\"daemonVersion\");\n }\n if (!input.bundleId) {\n missingFields.push(\"bundleId\");\n }\n if (!input.serviceController) {\n missingFields.push(\"serviceController\");\n }\n if (!input.gatewayUrl) {\n missingFields.push(\"gatewayUrl\");\n }\n if (!input.deviceId) {\n missingFields.push(\"deviceId\");\n }\n return missingFields;\n}\n","import {\n getAuthSessionState,\n type StoredAuthSession,\n} from \"../../config/auth-session\";\nimport { resolveAuthBaseUrl } from \"../../config/auth-url\";\nimport { resolveBaseUrlOrNull } from \"../../config/base-url\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport { formatInlineOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\n\nconst DEPENDENCY_PROBE_TIMEOUT_MS = 1200;\n\nexport type DaemonServiceDependencyKind = \"auth\" | \"gateway\";\nexport type DaemonServiceDependencyScope = \"loopback\" | \"remote\";\nexport type DaemonServiceDependencyScopePolicy = \"loopback_only\" | \"all\";\nexport type DaemonServiceDependencyIssueStatus =\n | \"unhealthy_http\"\n | \"unreachable\";\n\nexport type DaemonServiceDependencyIssue = {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: DaemonServiceDependencyIssueStatus;\n httpStatus: number | null;\n};\n\nexport type DaemonServiceDependencyDiagnostics =\n | {\n applicable: false;\n ready: true;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: [];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n }\n | {\n applicable: true;\n ready: true;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: [];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n }\n | {\n applicable: true;\n ready: false;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: DaemonServiceDependencyIssue[];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n };\n\ntype DependencyProbeTarget = {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n};\n\ntype DependencyProbeResult =\n | {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: \"reachable\";\n httpStatus: number;\n }\n | {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: DaemonServiceDependencyIssueStatus;\n httpStatus: number | null;\n };\n\nexport async function resolveDaemonServiceDependencyDiagnostics(\n input: {\n authSession?: StoredAuthSession | null;\n authUrl?: string;\n fetchImpl?: typeof fetch;\n gatewayUrl?: string;\n pathInput?: OpenMeldPathResolutionInput;\n scopePolicy?: DaemonServiceDependencyScopePolicy;\n } = {}\n): Promise<DaemonServiceDependencyDiagnostics> {\n const lane = resolveOpenMeldEnvPreset(input.pathInput);\n const scopePolicy = input.scopePolicy ?? \"all\";\n const authSession =\n input.authSession === undefined\n ? ((\n await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null)\n )?.session ?? null)\n : input.authSession;\n const authUrl =\n normalizeOptionalText(input.authUrl) ??\n normalizeOptionalText(authSession?.authBaseUrl) ??\n normalizeOptionalText(resolveAuthBaseUrl()) ??\n null;\n const gatewayUrl =\n normalizeOptionalText(await resolveBaseUrlOrNull(input.gatewayUrl)) ?? null;\n const checkedUrls = {\n auth: authUrl,\n gateway: gatewayUrl,\n };\n const targets = [\n buildDependencyProbeTarget({\n baseUrl: authUrl,\n kind: \"auth\",\n scopePolicy,\n }),\n buildDependencyProbeTarget({\n baseUrl: gatewayUrl,\n kind: \"gateway\",\n scopePolicy,\n }),\n ].filter(\n (candidate): candidate is DependencyProbeTarget => candidate !== null\n );\n\n if (targets.length === 0) {\n return {\n applicable: false,\n ready: true,\n lane,\n scopePolicy,\n issues: [],\n checkedUrls,\n };\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const results = await Promise.all(\n targets.map((target) =>\n probeDependencyAvailability({\n fetchImpl,\n target,\n })\n )\n );\n const issues = results\n .filter(\n (\n result\n ): result is Extract<\n DependencyProbeResult,\n { status: DaemonServiceDependencyIssueStatus }\n > => result.status !== \"reachable\"\n )\n .map((result) => ({\n kind: result.kind,\n baseUrl: result.baseUrl,\n probeUrl: result.probeUrl,\n scope: result.scope,\n status: result.status,\n httpStatus: result.httpStatus,\n }));\n\n if (issues.length === 0) {\n return {\n applicable: true,\n ready: true,\n lane,\n scopePolicy,\n issues: [],\n checkedUrls,\n };\n }\n\n return {\n applicable: true,\n ready: false,\n lane,\n scopePolicy,\n issues,\n checkedUrls,\n };\n}\n\nexport function buildDaemonServiceDependencyTitle(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return shouldUseDevLocalLaneLabel(input)\n ? \"OpenMeld Dev-Local Dependencies Unavailable\"\n : \"OpenMeld Service Dependencies Unavailable\";\n}\n\nexport function buildDaemonServiceDependencySummary(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n const [onlyIssue] = input.issues;\n const subject = buildDependencySubject(input);\n if (onlyIssue && input.issues.length === 1) {\n return `${subject} ${formatDependencyLabel(onlyIssue.kind)} is ${formatIssueStatusLabel(onlyIssue)} at \\`${onlyIssue.baseUrl}\\`.`;\n }\n\n const authIssue = input.issues.find((issue) => issue.kind === \"auth\");\n const gatewayIssue = input.issues.find((issue) => issue.kind === \"gateway\");\n if (authIssue && gatewayIssue) {\n const statusLabel =\n authIssue.status === \"unreachable\" &&\n gatewayIssue.status === \"unreachable\"\n ? \"unavailable\"\n : \"not healthy\";\n return `${subject} auth and gateway are ${statusLabel} at \\`${authIssue.baseUrl}\\` and \\`${gatewayIssue.baseUrl}\\`.`;\n }\n\n const labels = input.issues.map((issue) => formatDependencyLabel(issue.kind));\n return `${subject} dependencies need attention: ${labels.join(\", \")}.`;\n}\n\nexport function buildDaemonServiceDependencyDetails(input: {\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return input.issues\n .map((issue) => {\n const suffix =\n issue.status === \"unhealthy_http\" && issue.httpStatus !== null\n ? `health probe returned HTTP ${String(issue.httpStatus)}`\n : \"health probe was unreachable\";\n return `${formatDependencyTitle(issue.kind)}: \\`${issue.baseUrl}\\` (${suffix})`;\n })\n .join(\"\\n\");\n}\n\nexport function buildDaemonServiceDependencyMeaning(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n if (shouldUseDevLocalLaneLabel(input)) {\n return \"OpenMeld Service cannot finish starting in the dev-local lane until the local auth and gateway stack responds.\";\n }\n return \"OpenMeld Service cannot finish starting until the configured OpenMeld auth and gateway dependencies respond.\";\n}\n\nexport function buildDaemonServiceDependencyNextStep(input: {\n command: \"start\" | \"status\";\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n if (shouldUseDevLocalLaneLabel(input)) {\n return formatInlineOpenMeldCliCommands(\n `Start the local OpenMeld dev stack with \\`pnpm dev\\`, then retry \\`openmeld service ${input.command}\\`.`\n );\n }\n if (input.command === \"start\") {\n return formatInlineOpenMeldCliCommands(\n \"Check the configured OpenMeld auth and gateway endpoints for this lane, then retry `openmeld service start`.\"\n );\n }\n return formatInlineOpenMeldCliCommands(\n \"Check the configured OpenMeld auth and gateway endpoints for this lane, then retry `openmeld service status`.\"\n );\n}\n\nfunction buildDependencyProbeTarget(input: {\n baseUrl: string | null;\n kind: DaemonServiceDependencyKind;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n}): DependencyProbeTarget | null {\n if (!input.baseUrl) {\n return null;\n }\n try {\n const scope = resolveDependencyScope(input.baseUrl);\n if (input.scopePolicy === \"loopback_only\" && scope !== \"loopback\") {\n return null;\n }\n const probeUrl = new URL(input.baseUrl);\n probeUrl.pathname = \"/health\";\n probeUrl.search = \"\";\n probeUrl.hash = \"\";\n return {\n kind: input.kind,\n baseUrl: input.baseUrl,\n probeUrl: probeUrl.toString(),\n scope,\n };\n } catch {\n return null;\n }\n}\n\nasync function probeDependencyAvailability(input: {\n fetchImpl: typeof fetch;\n target: DependencyProbeTarget;\n}): Promise<DependencyProbeResult> {\n try {\n const response = await input.fetchImpl(input.target.probeUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(DEPENDENCY_PROBE_TIMEOUT_MS),\n });\n if (response.ok) {\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"reachable\",\n httpStatus: response.status,\n };\n }\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"unhealthy_http\",\n httpStatus: response.status,\n };\n } catch {\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"unreachable\",\n httpStatus: null,\n };\n }\n}\n\nfunction buildDependencySubject(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return shouldUseDevLocalLaneLabel(input) ? \"OpenMeld dev-local\" : \"OpenMeld\";\n}\n\nfunction shouldUseDevLocalLaneLabel(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): boolean {\n return (\n input.lane === \"dev-local\" &&\n input.issues.length > 0 &&\n input.issues.every((issue) => issue.scope === \"loopback\")\n );\n}\n\nfunction resolveDependencyScope(baseUrl: string): DaemonServiceDependencyScope {\n try {\n const url = new URL(baseUrl);\n return isLoopbackHost(url.hostname) ? \"loopback\" : \"remote\";\n } catch {\n return \"remote\";\n }\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction formatDependencyLabel(kind: DaemonServiceDependencyKind): string {\n return kind === \"auth\" ? \"auth\" : \"gateway\";\n}\n\nfunction formatDependencyTitle(kind: DaemonServiceDependencyKind): string {\n return kind === \"auth\" ? \"Auth URL\" : \"Gateway URL\";\n}\n\nfunction formatIssueStatusLabel(issue: DaemonServiceDependencyIssue): string {\n if (issue.status === \"unhealthy_http\") {\n return \"unhealthy\";\n }\n return \"unavailable\";\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","//#region src/planner/onboarding-plan.ts\nconst RERUN_SETUP_HINT = \"rerun_setup\";\nfunction buildOnboardingPlan(facts) {\n\tconst decisions = [];\n\tif (!facts.auth.signedIn) {\n\t\tdecisions.push(decide(\"sign_in\", \"available\", true, \"auth.signed_out\"));\n\t\treturn finalize(decisions);\n\t}\n\tconst setupCommand = resolveSetupCommand(facts.context);\n\tdecisions.push(decide(\"sign_in\", \"done\", false, \"auth.signed_in\"));\n\tif (facts.auth.actingDisplayName === null) {\n\t\tdecisions.push(decide(\"set_display_name\", \"available\", true, \"identity.name_missing\"));\n\t\treturn finalize(decisions);\n\t}\n\tdecisions.push(decide(\"set_display_name\", \"done\", false, \"identity.name_present\"));\n\tif (facts.space === null) {\n\t\tdecisions.push(decide(\"enter_space\", \"available\", true, \"space.none_in_context\"));\n\t\treturn finalize(decisions);\n\t}\n\tif (!facts.space.actingProfileIsMember) {\n\t\tdecisions.push(decide(\"enter_space\", \"available\", true, \"space.not_joined\"));\n\t\treturn finalize(decisions);\n\t}\n\tdecisions.push(decide(\"enter_space\", \"done\", false, \"space.joined\"));\n\tdecisions.push(resolveBringAgentsDecision({\n\t\tfacts,\n\t\tspace: facts.space,\n\t\tactingProfileId: facts.auth.actingProfileId\n\t}));\n\tdecisions.push(resolveConnectComputerDecision({\n\t\tdeviceStatus: facts.device.status,\n\t\tsetupCommand\n\t}));\n\treturn finalize(decisions);\n}\nfunction resolveSetupCommand(context) {\n\tif (context.kind === \"web_setup_handoff\") return `openmeld setup --start-session ${context.startSessionToken} --view agent`;\n\treturn \"openmeld setup --view agent\";\n}\nfunction decide(id, status, blocking, reason, run = null, afterRun = null) {\n\treturn {\n\t\tid,\n\t\tstatus,\n\t\tblocking,\n\t\treason,\n\t\trun,\n\t\tafterRun\n\t};\n}\nfunction activeAgentProfiles(profiles) {\n\treturn profiles.filter((profile) => profile.kind === \"agent\" && profile.active);\n}\nfunction resolveBringAgentsDecision(input) {\n\tif (new Set(input.space.memberAgentProfileIds).size > 0) return decide(\"bring_agents\", \"done\", false, \"agents.member_present\");\n\tif (activeAgentProfiles(input.facts.accountProfiles).length === 0) return decide(\"bring_agents\", \"blocked\", false, \"agents.none_yet\");\n\treturn decide(\"bring_agents\", \"available\", false, \"agents.addable_present\", `openmeld space add-agents ${input.space.spaceId} --profile ${input.actingProfileId} --all --view agent`);\n}\nfunction resolveConnectComputerDecision(input) {\n\tconst { setupCommand } = input;\n\tswitch (input.deviceStatus) {\n\t\tcase \"connected\": return decide(\"connect_this_computer\", \"done\", false, \"computer.connected\");\n\t\tcase \"connecting\": return decide(\"connect_this_computer\", \"available\", false, \"computer.connecting\", setupCommand, RERUN_SETUP_HINT);\n\t\tcase \"not_connected\": return decide(\"connect_this_computer\", \"available\", false, \"computer.not_connected\", setupCommand, RERUN_SETUP_HINT);\n\t\tcase \"unknown\": return decide(\"connect_this_computer\", \"blocked\", false, \"computer.evidence_unavailable\");\n\t\tdefault: return assertNeverDeviceStatus(input.deviceStatus);\n\t}\n}\nfunction finalize(decisions) {\n\treturn {\n\t\tdecisions,\n\t\tsummary: decisions.some((decision) => decision.status === \"available\" || decision.status === \"blocked\") ? \"actions_pending\" : \"nothing_to_do\"\n\t};\n}\nfunction assertNeverDeviceStatus(value) {\n\tthrow new Error(`unexpected device status: ${String(value)}`);\n}\n//#endregion\n//#region src/presentation/computer-connection-progress.ts\nconst PHASE_COPY = {\n\tchecking: {\n\t\tstage: \"Checking this Mac\",\n\t\tdescription: \"Reviewing the current connection and OpenMeld Tools.\"\n\t},\n\tdownloading: {\n\t\tstage: \"Downloading OpenMeld Tools\",\n\t\tdescription: \"Downloading the verified tools for this Mac.\"\n\t},\n\tverifying: {\n\t\tstage: \"Verifying OpenMeld Tools\",\n\t\tdescription: \"Checking the downloaded tools before installation.\"\n\t},\n\tinstalling: {\n\t\tstage: \"Installing OpenMeld Tools\",\n\t\tdescription: \"Installing the verified tools for this Mac.\"\n\t},\n\twaiting_for_confirmation: {\n\t\tstage: \"Waiting for confirmation\",\n\t\tdescription: \"Confirm the account switch to continue.\"\n\t},\n\tswitching_account: {\n\t\tstage: \"Safely switching accounts\",\n\t\tdescription: \"Moving this Mac to the signed-in account.\"\n\t},\n\tfinishing_previous_connection: {\n\t\tstage: \"Finishing the previous connection\",\n\t\tdescription: \"OpenMeld is safely ending the previous connection before continuing.\"\n\t},\n\twaiting_for_current_work: {\n\t\tstage: \"Waiting for current work\",\n\t\tdescription: \"OpenMeld is waiting for accepted local work to finish safely.\"\n\t},\n\tconnecting_service: {\n\t\tstage: \"Connecting OpenMeld Service\",\n\t\tdescription: \"Starting the local service for the signed-in account.\"\n\t},\n\tconfirming: {\n\t\tstage: \"Confirming the connection\",\n\t\tdescription: \"Checking that this Mac is ready for the signed-in account.\"\n\t},\n\tconnected: {\n\t\tstage: \"Connected\",\n\t\tdescription: \"This Mac is connected to the signed-in account.\"\n\t},\n\trestoring: {\n\t\tstage: \"Restoring the previous connection\",\n\t\tdescription: \"The account switch did not finish. Restoring the earlier connection.\"\n\t},\n\tneeds_attention: {\n\t\tstage: \"Connection needs attention\",\n\t\tdescription: \"Review the connection details and try again.\"\n\t}\n};\nfunction presentComputerConnectionProgress(progress) {\n\tconst copy = PHASE_COPY[progress.phase];\n\tconst measurement = progress.measurement;\n\tif (!measurement) return {\n\t\t...copy,\n\t\tdeterminate: false,\n\t\tpercentage: null\n\t};\n\treturn {\n\t\t...measurement.transferAttempt > 1 ? {\n\t\t\tstage: \"Retrying the OpenMeld Tools download\",\n\t\t\tdescription: \"Downloading the verified tools again for this Mac.\"\n\t\t} : copy,\n\t\tdeterminate: true,\n\t\tpercentage: Math.min(100, Math.max(0, Math.round(measurement.value / measurement.total * 100)))\n\t};\n}\nfunction isNewerComputerConnectionProgress(current, candidate) {\n\treturn current === null || current.operationId === candidate.operationId && current.attemptId === candidate.attemptId && candidate.sequence > current.sequence;\n}\nfunction formatComputerConnectionElapsed(startedAt, nowMs) {\n\tconst elapsedSeconds = Math.max(0, Math.floor((nowMs - Date.parse(startedAt)) / 1e3));\n\tif (elapsedSeconds < 10) return null;\n\tconst minutes = Math.floor(elapsedSeconds / 60);\n\tconst seconds = elapsedSeconds % 60;\n\treturn minutes > 0 ? `${minutes}m ${seconds.toString().padStart(2, \"0\")}s` : `${seconds}s`;\n}\n//#endregion\n//#region src/presentation/profile-readiness.ts\nfunction buildDaemonRouteObservationPresentation(observation) {\n\tif (observation.status === \"online\") return {\n\t\tdetail: \"OpenMeld server can see an active reply route for this profile.\",\n\t\tstatusLabel: \"Online\"\n\t};\n\tif (observation.status === \"offline\") return {\n\t\tdetail: \"OpenMeld server can't currently see an active reply route for this profile.\",\n\t\tstatusLabel: \"Offline\"\n\t};\n\tswitch (observation.reasonCode) {\n\t\tcase \"server_unsupported\": return {\n\t\t\tdetail: \"This OpenMeld server can't report route status yet.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"profile_not_agent\": return {\n\t\t\tdetail: \"Only agent profiles have a reply route.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"profile_not_selected\": return {\n\t\t\tdetail: \"Choose an Agent Profile to check reply route status.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"not_requested\": return {\n\t\t\tdetail: \"OpenMeld did not ask for reply route status.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tdefault: return {\n\t\t\tdetail: \"OpenMeld couldn't confirm reply route status yet.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t}\n}\n//#endregion\n//#region src/presentation/setup-flow-copy.ts\nconst PREPARE_SESSION_RECONNECT_GRACE_MS = 3e4;\nconst SETUP_FLOW_COPY = {\n\tcommandPlaceholder: \"Building setup command...\",\n\tconnectTerminalCompleteSummary: \"Terminal connected.\",\n\tconnectTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh setup command.\",\n\tconnectTerminalPendingSummary: \"Run the setup command in Terminal.\",\n\tconnectTerminalReconnectingSummary: \"Terminal connection was interrupted. Reconnecting...\",\n\tcopyCommandLabel: \"Copy setup command\",\n\texpiredCommandLabel: \"Setup command expired.\",\n\texpiredCommandPlaceholder: \"Refresh the setup command to continue.\",\n\tmode: \"setup\",\n\tpageDescription: \"Run one command. Setup updates automatically when Terminal connects.\",\n\tpageTitle: \"Connect this computer\",\n\tprepareComputerActiveSummaryByInternalStep: {\n\t\tprepare_selected_agents: \"Enabling local agents.\",\n\t\trefresh_service: \"Preparing OpenMeld Service.\",\n\t\treport_runtime: \"Connecting this computer.\",\n\t\tverify_setup: \"Checking setup.\"\n\t},\n\tprepareComputerBlockedSummary: \"Setup needs attention.\",\n\tprepareComputerCompleteSummary: \"Computer connected.\",\n\tprepareComputerDefaultActiveSummary: \"Connecting this computer.\",\n\tprepareComputerNoLocalAgentsSummary: \"Computer connected. Local agents are syncing in the background.\",\n\tprepareComputerPendingSummary: \"Waiting for Terminal.\",\n\tprepareComputerTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh setup command.\",\n\tprepareComputerTitle: \"Connect this computer\",\n\treadyAccountComputerActionSummary: \"Computer connected. Back to Computers, or reconnect this computer.\",\n\treadyCompleteSummary: \"Computer connected.\",\n\treadyDefaultActionSummary: \"Continue, or reconnect this computer.\",\n\treadyIncompleteSummary: \"Setup not finished yet.\",\n\treadyNoSelectedLocalAgentsActionSummary: \"Computer connected. Local agents will sync in the background. Continue, or reconnect this computer.\",\n\treadyNoSelectedLocalAgentsSummary: \"Computer connected. Local agents will sync in the background.\",\n\treadyRefreshPendingActionSummary: \"Continue after the check, or reconnect this computer.\",\n\treadyRefreshErrorSummary: \"Computer connected. Agent availability could not refresh.\",\n\treadyRefreshPendingSummary: \"Checking agent availability.\",\n\treadySpaceRecoveryActionSummary: \"Computer connected. Back to Space, or reconnect this computer.\",\n\treadyTitle: \"Computer connected\",\n\tcliAiAgentHintTemplate: \"AI setup agents: run {command} for setup.complete.\",\n\tcliBootstrapRepairStatus: \"Preparing OpenMeld...\",\n\tcliBootstrapRunStatus: \"Starting OpenMeld...\",\n\tcliCompletionTitle: \"✓ OpenMeld Setup Complete 🎉\",\n\tcliProgressCheckingLocalAgents: \"Checking local agents...\",\n\tcliProgressConnectingLocalAgents: \"Enabling local agents...\",\n\tcliProgressFinishingSetup: \"Finishing setup...\",\n\tcliProgressStartingService: \"Preparing OpenMeld Service...\",\n\tcliProgressUpdatingSkills: \"Updating OpenMeld skills...\"\n};\nconst UPDATE_SERVICE_FLOW_COPY = {\n\tcommandPlaceholder: \"Building update command...\",\n\tconnectTerminalCompleteSummary: \"Terminal connected.\",\n\tconnectTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh update command.\",\n\tconnectTerminalPendingSummary: \"Run the update command in Terminal.\",\n\tconnectTerminalReconnectingSummary: \"Terminal connection was interrupted. Reconnecting...\",\n\tcopyCommandLabel: \"Copy update command\",\n\texpiredCommandLabel: \"Update command expired.\",\n\texpiredCommandPlaceholder: \"Refresh the update command to continue.\",\n\tmode: \"update_service\",\n\tpageDescription: \"Run one command. The update continues automatically when Terminal reconnects.\",\n\tpageTitle: \"Update OpenMeld Service\",\n\tprepareComputerActiveSummaryByInternalStep: {\n\t\tprepare_selected_agents: \"Checking local agents.\",\n\t\trefresh_service: \"Updating OpenMeld Service.\",\n\t\treport_runtime: \"Connecting this computer.\",\n\t\tverify_setup: \"Checking update.\"\n\t},\n\tprepareComputerBlockedSummary: \"Update needs attention.\",\n\tprepareComputerCompleteSummary: \"OpenMeld Service updated.\",\n\tprepareComputerDefaultActiveSummary: \"Updating OpenMeld Service.\",\n\tprepareComputerNoLocalAgentsSummary: \"OpenMeld Service updated.\",\n\tprepareComputerPendingSummary: \"Waiting for Terminal.\",\n\tprepareComputerTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh update command.\",\n\tprepareComputerTitle: \"Update OpenMeld Service\",\n\treadyAccountComputerActionSummary: \"Update complete. Back to Computers, or run it again.\",\n\treadyCompleteSummary: \"Update complete.\",\n\treadyDefaultActionSummary: \"Continue, or run it again.\",\n\treadyIncompleteSummary: \"Update not finished yet.\",\n\treadyNoSelectedLocalAgentsActionSummary: \"Update complete. Continue, or run it again.\",\n\treadyNoSelectedLocalAgentsSummary: \"Update complete.\",\n\treadyRefreshPendingActionSummary: \"Continue after the check, or run it again.\",\n\treadyRefreshErrorSummary: \"Update complete. Wake availability could not refresh.\",\n\treadyRefreshPendingSummary: \"Checking Wake availability.\",\n\treadySpaceRecoveryActionSummary: \"Update complete. Back to Space, or run it again.\",\n\treadyTitle: \"Update complete\",\n\tcliAiAgentHintTemplate: \"AI setup agents: run {command} for setup.complete.\",\n\tcliBootstrapRepairStatus: \"Preparing OpenMeld...\",\n\tcliBootstrapRunStatus: \"Starting OpenMeld...\",\n\tcliCompletionTitle: \"✓ OpenMeld Service Update Complete\",\n\tcliProgressCheckingLocalAgents: \"Checking local agents...\",\n\tcliProgressConnectingLocalAgents: \"Checking local agents...\",\n\tcliProgressFinishingSetup: \"Finishing update...\",\n\tcliProgressStartingService: \"Updating OpenMeld Service...\",\n\tcliProgressUpdatingSkills: \"Updating OpenMeld skills...\"\n};\nfunction getSetupFlowCopy(mode) {\n\treturn mode === \"update_service\" ? UPDATE_SERVICE_FLOW_COPY : SETUP_FLOW_COPY;\n}\nfunction resolveSetupComputerActiveSummary(input) {\n\tif (isSetupComputerInternalStepId(input.stepId)) return input.copy.prepareComputerActiveSummaryByInternalStep[input.stepId];\n\treturn input.copy.prepareComputerDefaultActiveSummary;\n}\nfunction isSetupComputerInternalStepId(value) {\n\treturn value === \"prepare_selected_agents\" || value === \"refresh_service\" || value === \"report_runtime\" || value === \"verify_setup\";\n}\n//#endregion\n//#region src/recovery/computer-reply-readiness.ts\nconst LEADING_VERSION_PREFIX_RE = /^v/u;\nconst SEMVER_CORE_RE = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/u;\nfunction resolveComputerReplyReadiness(input) {\n\tif (input.currentDeviceTarget?.availability !== \"resolved\") return buildReadiness(\"needs_setup\", \"current_device.missing\");\n\tconst completedPrepareReadiness = resolveCompletedPrepareSessionReadiness({\n\t\tcurrentDeviceTarget: input.currentDeviceTarget,\n\t\tcurrentExpectedServiceVersion: input.currentExpectedServiceVersion ?? null,\n\t\tsnapshot: input.completedPrepareSessionSnapshot ?? null\n\t});\n\tif (completedPrepareReadiness !== null) return completedPrepareReadiness;\n\tif (input.selectedExecutionTarget === void 0) return buildReadiness(\"checking\", \"start_state.checking\");\n\tconst executionTargetReadiness = resolveExecutionTargetReadiness(input.selectedExecutionTarget);\n\tif (executionTargetReadiness !== null) return buildReadiness(executionTargetReadiness.status, executionTargetReadiness.reasonCode, null, input.selectedExecutionTarget);\n\tif (input.selectedExecutionTarget === null) return buildReadiness(\"unknown\", \"execution_target.unknown\", null, input.selectedExecutionTarget);\n\tconst localAgentReadiness = resolveLocalAgentReadiness(input.selectedExecutionTarget.localAgentCatalog.entries);\n\tif (localAgentReadiness !== null) return buildReadiness(localAgentReadiness.status, localAgentReadiness.reasonCode, null, input.selectedExecutionTarget);\n\treturn buildReadiness(\"ready\", \"ready\", null, input.selectedExecutionTarget);\n}\nfunction shouldUseCompletedPrepareSessionForComputerReadiness(input) {\n\tconst { snapshot } = input;\n\tif (input.currentDeviceTarget?.availability !== \"resolved\" || snapshot === null || snapshot === void 0 || snapshot.lifecycleStatus !== \"completed\" || snapshot.deviceId !== input.currentDeviceTarget.deviceId || snapshot.runtimeLane !== input.currentDeviceTarget.runtimeLane || snapshot.localAgentCatalog === null || !isPrepareStepComplete(snapshot, \"refresh_service\")) return false;\n\treturn true;\n}\nfunction resolveCompletedPrepareSessionReadiness(input) {\n\tconst snapshot = input.snapshot;\n\tif (snapshot === null || !shouldUseCompletedPrepareSessionForComputerReadiness({\n\t\tcurrentDeviceTarget: input.currentDeviceTarget,\n\t\tsnapshot\n\t}) || snapshot.localAgentCatalog === null) return null;\n\tconst service = snapshot.localReadinessSnapshot === null ? null : resolveCompletedPrepareSessionServiceVersion({\n\t\tcurrentExpectedServiceVersion: input.currentExpectedServiceVersion,\n\t\tsnapshot\n\t});\n\tif (snapshot.localReadinessSnapshot !== null) {\n\t\tconst backgroundHelperReadiness = resolveBackgroundHelperReadiness(snapshot.localReadinessSnapshot.service);\n\t\tif (backgroundHelperReadiness !== null) return buildReadiness(backgroundHelperReadiness.status, backgroundHelperReadiness.reasonCode, service);\n\t}\n\tconst localAgentReadiness = resolveLocalAgentReadiness(snapshot.localAgentCatalog.entries);\n\tif (localAgentReadiness !== null) return buildReadiness(localAgentReadiness.status, localAgentReadiness.reasonCode, service);\n\treturn buildReadiness(\"ready\", \"ready\", service);\n}\nfunction resolveExecutionTargetReadiness(executionTarget) {\n\tif (executionTarget === null || executionTarget === void 0) return null;\n\tif (executionTarget.status === \"ready\") return null;\n\tif (executionTarget.status === \"partial\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.partial\"\n\t};\n\tif (executionTarget.status === \"not_ready\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.not_ready\"\n\t};\n\tif (executionTarget.status === \"stale\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.stale\"\n\t};\n\treturn {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"execution_target.unknown\"\n\t};\n}\nfunction resolveBackgroundHelperReadiness(backgroundHelper) {\n\tif (backgroundHelper.installStatus === \"not_installed\") return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"background_helper.not_installed\"\n\t};\n\tif (backgroundHelper.installStatus === \"unknown\") return {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"background_helper.unknown\"\n\t};\n\tif (backgroundHelper.executionCompatibility?.status === \"update_required\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.update_required\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"not_running\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.not_running\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"stale\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.stale\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"unknown\") return {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"background_helper.unknown\"\n\t};\n\treturn null;\n}\nfunction resolveLocalAgentReadiness(entries) {\n\tif (entries.length === 0) return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"local_agent_preparation.not_found\"\n\t};\n\tif (entries.filter((entry) => entry.enabled && entry.launchStatus === \"ready\").length === 0) return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"local_agent_preparation.not_enabled\"\n\t};\n\treturn null;\n}\nfunction resolveCompletedPrepareSessionServiceVersion(input) {\n\tconst service = input.snapshot.localReadinessSnapshot?.service ?? null;\n\tconst expectedVersion = input.currentExpectedServiceVersion ?? service?.expectedVersion ?? null;\n\treturn {\n\t\tinstallStatus: service?.installStatus === \"installed_current\" && isOlderVersion(service.installedVersion, expectedVersion) ? \"installed_outdated\" : service?.installStatus ?? null,\n\t\truntimeStatus: service?.runtimeStatus ?? null,\n\t\tinstalledVersion: service?.installedVersion ?? null,\n\t\texpectedVersion,\n\t\texecutionCompatibility: service?.executionCompatibility ?? null,\n\t\tobservedAt: input.snapshot.localReadinessSnapshot?.observedAt ?? null\n\t};\n}\nfunction isOlderVersion(installedVersion, expectedVersion) {\n\tif (!(installedVersion && expectedVersion)) return false;\n\treturn compareSemver(installedVersion, expectedVersion) < 0;\n}\nfunction compareSemver(left, right) {\n\tconst leftParts = parseSemverCore(left);\n\tconst rightParts = parseSemverCore(right);\n\tif (!(leftParts && rightParts)) return left.localeCompare(right);\n\tfor (let index = 0; index < leftParts.length; index += 1) {\n\t\tconst leftPart = leftParts[index] ?? 0;\n\t\tconst rightPart = rightParts[index] ?? 0;\n\t\tif (leftPart !== rightPart) return leftPart > rightPart ? 1 : -1;\n\t}\n\treturn 0;\n}\nfunction parseSemverCore(value) {\n\tconst match = value.trim().replace(LEADING_VERSION_PREFIX_RE, \"\").match(SEMVER_CORE_RE);\n\tif (!match) return null;\n\treturn [\n\t\tNumber(match[1]),\n\t\tNumber(match[2]),\n\t\tNumber(match[3])\n\t];\n}\nfunction isPrepareStepComplete(snapshot, stepId) {\n\treturn snapshot.steps.some((step) => step.id === stepId && step.state === \"complete\");\n}\nfunction buildReadiness(status, reasonCode, service = null, executionTarget = null, detailReasonCode = null) {\n\treturn {\n\t\tstatus,\n\t\treasonCode,\n\t\tdetailReasonCode,\n\t\texecutionTargetStatus: executionTarget?.status ?? null,\n\t\tservice\n\t};\n}\n//#endregion\n//#region src/setup-download-command.ts\nconst SAFE_SHELL_WORD_RE = /^[A-Za-z0-9_./:@%+=,-]+$/u;\nconst OPENMELD_SETUP_SCRIPT_END_MARKER = \"# openmeld-setup-script-complete-v1\";\nfunction shellWord(value) {\n\treturn SAFE_SHELL_WORD_RE.test(value) ? value : `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n/** Keep the zero-dependency setup handoff readable in Terminal. */\nfunction buildPosixSetupDownloadCommand(setupUrl, setupArgs = []) {\n\tconst protocol = new URL(setupUrl).protocol;\n\tif (!(protocol === \"https:\" || protocol === \"http:\")) throw new Error(\"OpenMeld setup requires an HTTP or HTTPS download URL.\");\n\treturn `curl -fsSL${protocol === \"https:\" ? \" --proto '=https' --proto-redir '=https'\" : \"\"} ${shellWord(setupUrl)} | sh -s -- ${setupArgs.map(shellWord).join(\" \")}`.trimEnd();\n}\n//#endregion\n//#region src/setup-node-runtime.ts\nconst LEGACY_MAJOR = 20;\nconst CURRENT_MIN_MAJOR = 22;\nconst CURRENT_MAX_MAJOR_EXCLUSIVE = 26;\nconst OPENMELD_NODE_ENGINE_RANGE = `${LEGACY_MAJOR}.x || >=${CURRENT_MIN_MAJOR} <${CURRENT_MAX_MAJOR_EXCLUSIVE}`;\nconst OPENMELD_SUPPORTED_NODE_MAJORS = Object.freeze([LEGACY_MAJOR, ...Array.from({ length: CURRENT_MAX_MAJOR_EXCLUSIVE - CURRENT_MIN_MAJOR }, (_, index) => CURRENT_MIN_MAJOR + index)]);\n//#endregion\nexport { OPENMELD_NODE_ENGINE_RANGE, OPENMELD_SETUP_SCRIPT_END_MARKER, OPENMELD_SUPPORTED_NODE_MAJORS, PREPARE_SESSION_RECONNECT_GRACE_MS, buildDaemonRouteObservationPresentation, buildOnboardingPlan, buildPosixSetupDownloadCommand, formatComputerConnectionElapsed, getSetupFlowCopy, isNewerComputerConnectionProgress, presentComputerConnectionProgress, resolveComputerReplyReadiness, resolveSetupComputerActiveSummary, shouldUseCompletedPrepareSessionForComputerReadiness };\n\n//# sourceMappingURL=index.js.map","import {\n type DaemonRouteObservationResponse,\n daemonRouteObservationResponseSchema,\n type OpenMeldRequestContext,\n} from \"@openmeld/schemas\";\nimport { toDaemonRouteObservationUrl } from \"../protocol/urls\";\nimport { fetchSpaceRequestWithTimeout } from \"../space/fetch-with-timeout\";\nimport { resolveBaseUrl } from \"./base-url\";\nimport { buildOpenMeldRequestContextHeadersWithAuth } from \"./request-headers\";\n\nexport class DaemonRouteObservationFetchError extends Error {\n readonly code: \"lookup_failed\" | \"server_unsupported\";\n readonly status: number | null;\n\n constructor(input: {\n code: \"lookup_failed\" | \"server_unsupported\";\n message: string;\n status?: number | null;\n }) {\n super(input.message);\n this.code = input.code;\n this.name = \"DaemonRouteObservationFetchError\";\n this.status = input.status ?? null;\n }\n}\n\nexport async function fetchDaemonRouteObservation(input: {\n requestContext: OpenMeldRequestContext;\n baseUrl?: string;\n profileId: string;\n}): Promise<DaemonRouteObservationResponse> {\n const baseUrl = await resolveBaseUrl(input.baseUrl);\n const endpoint = toDaemonRouteObservationUrl(baseUrl, input.profileId);\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"daemon.route_observation\",\n init: {\n headers: await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n }),\n },\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new DaemonRouteObservationFetchError({\n code:\n response.status === 404 || response.status === 405\n ? \"server_unsupported\"\n : \"lookup_failed\",\n message: `HTTP ${response.status}: ${raw}`,\n status: response.status,\n });\n }\n\n const parsed = daemonRouteObservationResponseSchema.safeParse(parseJson(raw));\n if (!parsed.success) {\n throw new DaemonRouteObservationFetchError({\n code: \"lookup_failed\",\n message: \"invalid daemon route observation response\",\n });\n }\n return parsed.data;\n}\n\nfunction parseJson(raw: string): unknown {\n if (!raw.trim()) {\n return null;\n }\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import {\n createLocalAdapterContainer,\n createLocalAdapterEntries,\n} from \"@openmeld/local-service\";\nimport type { DaemonProfileSkipReason } from \"@openmeld/schemas/types\";\nimport type { Presenter } from \"../../runtime/presenter/types\";\nimport type { ExpectedRoutesReadSession } from \"../../system/expected-routes-read-session\";\nimport type { PrimaryBindingReadSession } from \"../../system/primary-binding-read-session\";\nimport { toErrorMessage } from \"../core/logger\";\nimport type { RouteCatalog } from \"../core/types\";\nimport {\n type DeviceRuntimeStateSyncResult,\n NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON,\n syncDeviceRuntimeStateProjection,\n} from \"../reporting/device-runtime-state-sync\";\nimport { loadDaemonRouteCatalog } from \"../routing/route-catalog\";\n\ntype LocalServiceDemandDecision = \"keep_running\" | \"indeterminate\";\n\nexport type LocalServiceDemand = {\n decision: LocalServiceDemandDecision;\n hasLocalExecutionRoute: boolean;\n repairableReplyCandidateCount: number;\n reason: string;\n localExecutionRouteCount: number;\n projection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null;\n};\n\nconst QUIET_PRESENTER: Presenter = {\n view: \"agent\",\n event: () => undefined,\n line: () => undefined,\n data: () => undefined,\n};\n\nexport async function resolveLocalServiceDemand(input: {\n bindingReads?: PrimaryBindingReadSession;\n expectedRoutesRead?: ExpectedRoutesReadSession;\n ownerUserId?: string | null;\n projection?: DeviceRuntimeStateSyncResult | null;\n routeCatalog?: RouteCatalog;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand> {\n const projection =\n input.projection === undefined\n ? await syncDeviceRuntimeStateProjection({\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n mode: \"check\",\n }).catch(() => null)\n : input.projection;\n const ownerUserId = normalizeOptionalString(input.ownerUserId);\n\n if (!ownerUserId) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: \"owner user is unavailable\",\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n const localAdapterContainer = createLocalAdapterContainer(\n createLocalAdapterEntries({\n runtimeWorkdir: input.runtimeWorkdir ?? process.cwd(),\n })\n );\n if (localAdapterContainer.listAdapters().length === 0) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: \"no local adapters are configured on this device\",\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n let localExecutionRouteCount = 0;\n let repairableReplyCandidateCount = 0;\n try {\n const routeCatalog =\n input.routeCatalog ??\n (await loadDaemonRouteCatalog({\n allowEmpty: true,\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n localAdapterContainer,\n localReplyStateMode: \"check\",\n ownerUserId,\n presenter: QUIET_PRESENTER,\n quiet: true,\n }));\n localExecutionRouteCount = routeCatalog.profileIds.length;\n repairableReplyCandidateCount = routeCatalog.skippedProfiles.filter(\n (profile) => isRepairableSkippedDaemonProfile(profile.skipReason)\n ).length;\n } catch (error) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: `failed to load local daemon routes: ${toErrorMessage(error)}`,\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n if (localExecutionRouteCount > 0) {\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: true,\n repairableReplyCandidateCount,\n reason: \"local execution routes are available\",\n localExecutionRouteCount,\n projection,\n };\n }\n\n if (repairableReplyCandidateCount > 0) {\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount,\n reason:\n \"reply-capable local agent profiles are still reconciling on this device\",\n localExecutionRouteCount,\n projection,\n };\n }\n\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount,\n reason: resolveZeroLocalValueReason(projection),\n localExecutionRouteCount,\n projection,\n };\n}\n\nfunction isRepairableSkippedDaemonProfile(\n skipReason: DaemonProfileSkipReason\n): boolean {\n return (\n skipReason === \"projection.missing\" || skipReason === \"workspace.missing\"\n );\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveZeroLocalValueReason(\n projection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null\n): string {\n if (!projection) {\n return \"no local execution routes are available\";\n }\n if (\n projection.status === \"ok\" &&\n projection.projectedControllerIds.length === 0\n ) {\n return NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON;\n }\n if (projection.status === \"degraded\") {\n return \"projected local controllers are not currently available for local execution\";\n }\n return \"no local execution routes are available\";\n}\n","import { providerDispatchRuntimeContextSchema } from \"@openmeld/schemas\";\nimport type {\n OpenMeldDaemonTaskResultPayload,\n ProviderDispatchRuntimeContext,\n} from \"@openmeld/schemas/types\";\nimport type { OpenMeldProfile } from \"../../config/openmeld-profiles-api\";\nimport { prepareProviderRuntime } from \"../prepare-provider-runtime\";\nimport type { OpenClawLocalBootstrapResult } from \"./local-bootstrap\";\nimport type { OpenClawLocalBootstrapStoreError } from \"./local-bootstrap-store\";\nimport {\n readOpenClawLocalBootstrapState,\n resolveOpenClawLocalBootstrapPaths,\n} from \"./local-bootstrap-store\";\nimport {\n findOpenClawAgentById,\n findOpenClawAgentsByWorkspace,\n matchesExpectedWorkspace,\n type OpenClawAuthStatus,\n resolveOpenClawAuthStatus,\n resolveOpenClawProviderRuntimeWorkingDirectory,\n} from \"./local-state\";\nimport {\n fetchOpenClawGatewayHealth,\n listOpenClawAgents,\n listOpenClawGatewayAgents,\n type OpenClawAgentSummary,\n} from \"./official-cli\";\n\nexport type OpenClawDiagnosticsMode = \"inspect\" | \"repair\";\n\nexport type OpenClawBootstrapStatus =\n | \"healthy\"\n | \"missing\"\n | \"binding_conflict\"\n | \"workspace_mismatch\"\n | \"workspace_ambiguous\"\n | \"invalid\";\n\nexport type OpenClawBootstrapResolution =\n | OpenClawLocalBootstrapResult[\"resolution\"]\n | null;\n\nexport type OpenClawGatewayHealthStatus = \"healthy\" | \"unhealthy\";\n\nexport type OpenClawGatewayVisibilityDiagnosticStatus =\n | \"visible\"\n | \"not_visible\"\n | \"restarted_then_visible\"\n | \"restart_failed\"\n | \"not_checked\";\n\nexport type OpenClawLocalDiagnostics = {\n agentId: string | null;\n authStatus: OpenClawAuthStatus;\n bootstrapResolution: OpenClawBootstrapResolution;\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n gatewayHealth: OpenClawGatewayHealthStatus;\n gatewayVisibility: OpenClawGatewayVisibilityDiagnosticStatus;\n message: string | null;\n workspaceDir: string;\n};\n\nexport type OpenClawLocalDiagnosticsFailure = {\n errorCode: string | null;\n kind: \"failed\";\n message: string;\n};\n\nexport type OpenClawLocalDiagnosticsState =\n | OpenClawLocalDiagnostics\n | OpenClawLocalDiagnosticsFailure;\n\ntype OpenClawLocalDiagnosticsDeps = {\n fetchGatewayHealth: typeof fetchOpenClawGatewayHealth;\n listAgents: typeof listOpenClawAgents;\n listGatewayAgents: typeof listOpenClawGatewayAgents;\n prepareRuntime: typeof prepareProviderRuntime;\n readBootstrapState: typeof readOpenClawLocalBootstrapState;\n};\n\ntype DiagnosticsBootstrapRead =\n | {\n agentId: string | null;\n error: null;\n kind: \"existing\";\n }\n | {\n agentId: null;\n error: null;\n kind: \"missing\";\n }\n | {\n agentId: null;\n error: OpenClawLocalBootstrapStoreError | null;\n kind: \"invalid\";\n };\n\nconst DEFAULT_OPENCLAW_LOCAL_DIAGNOSTICS_DEPS: OpenClawLocalDiagnosticsDeps = {\n fetchGatewayHealth: fetchOpenClawGatewayHealth,\n listAgents: listOpenClawAgents,\n listGatewayAgents: listOpenClawGatewayAgents,\n prepareRuntime: prepareProviderRuntime,\n readBootstrapState: readOpenClawLocalBootstrapState,\n};\n\nexport async function resolveOpenClawLocalDiagnostics(\n input: {\n mode: OpenClawDiagnosticsMode;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n providerRuntimeWorkingDirectory?: string;\n },\n deps: OpenClawLocalDiagnosticsDeps = DEFAULT_OPENCLAW_LOCAL_DIAGNOSTICS_DEPS\n): Promise<OpenClawLocalDiagnostics> {\n const providerRuntimeWorkingDirectory =\n resolveOpenClawProviderRuntimeWorkingDirectory(\n input.providerRuntimeWorkingDirectory\n );\n const bootstrapPaths = resolveOpenClawLocalBootstrapPaths({\n openMeldProfileId: input.profile.openMeldProfileId,\n });\n\n if (input.mode === \"repair\") {\n return await resolveRepairModeDiagnostics({\n bootstrapPaths,\n providerRuntimeWorkingDirectory,\n deps,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n }\n\n return await resolveInspectModeDiagnostics({\n bootstrapPaths,\n providerRuntimeWorkingDirectory,\n deps,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n}\n\nexport function createOpenClawLocalDiagnosticsFailure(\n error: unknown\n): OpenClawLocalDiagnosticsFailure {\n return {\n errorCode: extractErrorCode(error),\n kind: \"failed\",\n message: toErrorMessage(error),\n };\n}\n\nexport function isOpenClawLocalDiagnosticsFailure(\n diagnostics: OpenClawLocalDiagnosticsState | null | undefined\n): diagnostics is OpenClawLocalDiagnosticsFailure {\n return (\n diagnostics !== null &&\n diagnostics !== undefined &&\n typeof diagnostics === \"object\" &&\n \"kind\" in diagnostics &&\n diagnostics.kind === \"failed\"\n );\n}\n\nexport function resolveOpenClawLocalDiagnosticsValue(\n diagnostics: OpenClawLocalDiagnosticsState | null | undefined\n): OpenClawLocalDiagnostics | null {\n if (!diagnostics || isOpenClawLocalDiagnosticsFailure(diagnostics)) {\n return null;\n }\n return diagnostics;\n}\n\nasync function resolveRepairModeDiagnostics(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n try {\n const preparation = await input.deps.prepareRuntime({\n agentControllerRef: \"builtin:openclaw\",\n daemonWorkingDirectory: input.providerRuntimeWorkingDirectory,\n mode: \"reply_readiness\",\n openClawBin: input.openClawBin,\n profileName: input.profile.profileName,\n runtimeContext: resolveDiagnosticsRuntimeContext(\n input.providerRuntimeWorkingDirectory\n ),\n targetProfileId: input.profile.openMeldProfileId,\n });\n if (preparation.preparationDetails.kind !== \"openclaw\") {\n throw new Error(\n \"OpenClaw runtime preparation returned a non-OpenClaw preparation result\"\n );\n }\n return {\n agentId: preparation.preparationDetails.bootstrap.agentId,\n authStatus: preparation.preparationDetails.bootstrap.authStatus,\n bootstrapResolution: preparation.preparationDetails.bootstrap.resolution,\n bootstrapStatus: \"healthy\",\n errorCode: null,\n gatewayHealth: \"healthy\",\n gatewayVisibility: mapGatewayVisibilityPayload(\n preparation.preparationDetails.openClawGatewayVisibility\n ),\n message: null,\n workspaceDir: preparation.runtimeContext.providerRuntimeWorkingDirectory,\n };\n } catch (error) {\n const inspected = await inspectBootstrapState({\n bootstrapPaths: input.bootstrapPaths,\n providerRuntimeWorkingDirectory: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n error,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n const failureDetail = resolveDiagnosticsFailureDetail({\n error,\n inspected,\n });\n if (failureDetail.errorCode === \"controller.gateway.unhealthy\") {\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: failureDetail.errorCode,\n gatewayHealth: hasGatewayVisibilityPayload(error)\n ? \"healthy\"\n : \"unhealthy\",\n gatewayVisibility: resolveGatewayVisibilityFailureStatus(error),\n message: failureDetail.message,\n };\n }\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: failureDetail.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: failureDetail.message,\n };\n }\n}\n\nasync function resolveInspectModeDiagnostics(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n const inspected = await inspectBootstrapState({\n bootstrapPaths: input.bootstrapPaths,\n providerRuntimeWorkingDirectory: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n error: null,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n\n if (inspected.bootstrapStatus !== \"healthy\" || !inspected.agentId) {\n return {\n ...inspected,\n bootstrapResolution: null,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n };\n }\n\n const gatewayHealth = await input.deps\n .fetchGatewayHealth({\n cwd: input.providerRuntimeWorkingDirectory,\n openClawBin: input.openClawBin,\n })\n .then(() => \"healthy\" as const)\n .catch((error) => ({\n errorCode: extractErrorCode(error),\n message: toErrorMessage(error),\n }));\n\n if (gatewayHealth !== \"healthy\") {\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: gatewayHealth.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: gatewayHealth.message,\n };\n }\n\n const visibility = await resolveInspectGatewayVisibility({\n agentId: inspected.agentId,\n cwd: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n openClawBin: input.openClawBin,\n });\n\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: visibility.errorCode,\n gatewayHealth: \"healthy\",\n gatewayVisibility: visibility.gatewayVisibility,\n message: visibility.message,\n };\n}\n\nasync function inspectBootstrapState(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n error: unknown;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n const listedAgents = await input.deps.listAgents({\n cwd: input.providerRuntimeWorkingDirectory,\n openClawBin: input.openClawBin,\n });\n const workspaceAgents = findOpenClawAgentsByWorkspace({\n agents: listedAgents,\n workspace: input.providerRuntimeWorkingDirectory,\n });\n const bootstrapRead = await readBootstrapStateForDiagnostics({\n openMeldProfileId: input.profile.openMeldProfileId,\n readBootstrapState: input.deps.readBootstrapState,\n });\n const targetAgent = resolveDiagnosticsTargetAgent({\n bootstrapRead,\n listedAgents,\n workspaceAgents,\n });\n const authStatus = await resolveOpenClawAuthStatus({\n agents: listedAgents,\n targetAgent,\n });\n const status = resolveBootstrapStatusForDiagnostics({\n bootstrapRead,\n error: input.error,\n expectedWorkspace: input.providerRuntimeWorkingDirectory,\n targetAgent,\n workspaceAgents,\n });\n\n return {\n agentId: targetAgent?.agentId ?? bootstrapRead.agentId ?? null,\n authStatus,\n bootstrapResolution: null,\n bootstrapStatus: status.bootstrapStatus,\n errorCode: status.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: status.message,\n workspaceDir: input.providerRuntimeWorkingDirectory,\n };\n}\n\nasync function resolveInspectGatewayVisibility(input: {\n agentId: string;\n cwd: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n}): Promise<{\n errorCode: string | null;\n gatewayVisibility: OpenClawGatewayVisibilityDiagnosticStatus;\n message: string | null;\n}> {\n try {\n const agents = await input.deps.listGatewayAgents({\n cwd: input.cwd,\n openClawBin: input.openClawBin,\n });\n return {\n errorCode: null,\n gatewayVisibility: agents.some((agent) => agent.agentId === input.agentId)\n ? \"visible\"\n : \"not_visible\",\n message: null,\n };\n } catch (error) {\n return {\n errorCode: extractErrorCode(error),\n gatewayVisibility: \"not_checked\",\n message: toErrorMessage(error),\n };\n }\n}\n\nfunction resolveDiagnosticsFailureDetail(input: {\n error: unknown;\n inspected: OpenClawLocalDiagnostics;\n}): {\n errorCode: string | null;\n message: string | null;\n} {\n const inspectedErrorCode =\n typeof input.inspected.errorCode === \"string\" &&\n input.inspected.errorCode.trim().length > 0\n ? input.inspected.errorCode.trim()\n : null;\n const inspectedMessage =\n typeof input.inspected.message === \"string\" &&\n input.inspected.message.trim().length > 0\n ? input.inspected.message.trim()\n : null;\n return {\n errorCode: inspectedErrorCode ?? extractErrorCode(input.error),\n message: inspectedMessage ?? toErrorMessage(input.error),\n };\n}\n\nfunction resolveDiagnosticsTargetAgent(input: {\n bootstrapRead: DiagnosticsBootstrapRead;\n listedAgents: OpenClawAgentSummary[];\n workspaceAgents: OpenClawAgentSummary[];\n}): OpenClawAgentSummary | null {\n if (input.bootstrapRead.kind === \"existing\" && input.bootstrapRead.agentId) {\n return (\n findOpenClawAgentById({\n agentId: input.bootstrapRead.agentId,\n agents: input.listedAgents,\n }) ??\n (input.workspaceAgents.length === 1\n ? (input.workspaceAgents[0] ?? null)\n : null)\n );\n }\n return input.workspaceAgents.length === 1\n ? (input.workspaceAgents[0] ?? null)\n : null;\n}\n\nasync function readBootstrapStateForDiagnostics(input: {\n openMeldProfileId: string;\n readBootstrapState: typeof readOpenClawLocalBootstrapState;\n}): Promise<DiagnosticsBootstrapRead> {\n try {\n const state = await input.readBootstrapState({\n openMeldProfileId: input.openMeldProfileId,\n });\n if (!state) {\n return {\n agentId: null,\n error: null,\n kind: \"missing\",\n };\n }\n return {\n agentId: state.agentId,\n error: null,\n kind: \"existing\",\n };\n } catch (error) {\n return {\n agentId: null,\n error:\n error && typeof error === \"object\" && \"code\" in error && \"path\" in error\n ? (error as OpenClawLocalBootstrapStoreError)\n : null,\n kind: \"invalid\",\n };\n }\n}\n\nfunction resolveBootstrapStatusForDiagnostics(input: {\n bootstrapRead: DiagnosticsBootstrapRead;\n error: unknown;\n expectedWorkspace: string;\n targetAgent: OpenClawAgentSummary | null;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n const explicitDiagnostic = resolveExplicitBootstrapDiagnostic(input.error);\n if (explicitDiagnostic) {\n return explicitDiagnostic;\n }\n\n switch (input.bootstrapRead.kind) {\n case \"existing\":\n return resolveExistingBootstrapStatus({\n expectedWorkspace: input.expectedWorkspace,\n targetAgent: input.targetAgent,\n workspaceAgents: input.workspaceAgents,\n });\n case \"invalid\":\n return resolveInvalidBootstrapStatus({\n bootstrapRead: input.bootstrapRead,\n error: input.error,\n workspaceAgents: input.workspaceAgents,\n });\n case \"missing\":\n return resolveMissingBootstrapStatus(input.workspaceAgents);\n default: {\n const unexpectedBootstrapRead: never = input.bootstrapRead;\n throw new Error(\n `Unexpected OpenClaw bootstrap read kind: ${String(unexpectedBootstrapRead)}`\n );\n }\n }\n}\n\nfunction buildBootstrapDiagnosticStatus(\n bootstrapStatus: OpenClawBootstrapStatus,\n errorCode: string | null,\n message: string | null\n): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n return {\n bootstrapStatus,\n errorCode,\n message,\n };\n}\n\nfunction resolveExplicitBootstrapDiagnostic(error: unknown): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} | null {\n const explicitErrorCode = extractErrorCode(error);\n const explicitMessage = error ? toErrorMessage(error) : null;\n switch (explicitErrorCode) {\n case \"openclaw.bootstrap.binding_conflict\":\n return buildBootstrapDiagnosticStatus(\n \"binding_conflict\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.workspace_mismatch\":\n return buildBootstrapDiagnosticStatus(\n \"workspace_mismatch\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.workspace_ambiguous\":\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.state_invalid\":\n case \"openclaw.bootstrap.version_mismatch\":\n return buildBootstrapDiagnosticStatus(\n \"invalid\",\n explicitErrorCode,\n explicitMessage\n );\n default:\n return null;\n }\n}\n\nfunction resolveExistingBootstrapStatus(input: {\n expectedWorkspace: string;\n targetAgent: OpenClawAgentSummary | null;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (!input.targetAgent) {\n return resolveMissingBootstrapStatus(input.workspaceAgents, {\n missingAgentMeansConflict: true,\n });\n }\n if (\n !matchesExpectedWorkspace({\n actualWorkspace: input.targetAgent.workspace,\n expectedWorkspace: input.expectedWorkspace,\n })\n ) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_mismatch\",\n \"openclaw.bootstrap.workspace_mismatch\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\"healthy\", null, null);\n}\n\nfunction resolveInvalidBootstrapStatus(input: {\n bootstrapRead: Extract<DiagnosticsBootstrapRead, { kind: \"invalid\" }>;\n error: unknown;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (input.workspaceAgents.length > 1) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n \"openclaw.bootstrap.workspace_ambiguous\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\n \"invalid\",\n input.bootstrapRead.error?.code ?? extractErrorCode(input.error),\n input.bootstrapRead.error?.message ??\n (input.error ? toErrorMessage(input.error) : null)\n );\n}\n\nfunction resolveMissingBootstrapStatus(\n workspaceAgents: OpenClawAgentSummary[],\n input: { missingAgentMeansConflict?: boolean } = {}\n): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (workspaceAgents.length > 1) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n \"openclaw.bootstrap.workspace_ambiguous\",\n null\n );\n }\n if (input.missingAgentMeansConflict && workspaceAgents.length === 1) {\n return buildBootstrapDiagnosticStatus(\n \"binding_conflict\",\n \"openclaw.bootstrap.binding_conflict\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\"missing\", null, null);\n}\n\nfunction mapGatewayVisibilityPayload(\n visibility: NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n >\n): OpenClawGatewayVisibilityDiagnosticStatus {\n return visibility.gatewayVisibility === \"visible_after_restart\"\n ? \"restarted_then_visible\"\n : \"visible\";\n}\n\nfunction resolveGatewayVisibilityFailureStatus(\n error: unknown\n): OpenClawGatewayVisibilityDiagnosticStatus {\n const providerErrorCode = extractProviderErrorCode(error);\n if (providerErrorCode === \"openclaw.gateway.restart_failed\") {\n return \"restart_failed\";\n }\n if (\n providerErrorCode === \"openclaw.gateway.agent_not_visible\" ||\n providerErrorCode === \"openclaw.gateway.invalid_agent_id\"\n ) {\n return \"not_visible\";\n }\n const openClawGatewayVisibility = extractGatewayVisibilityPayload(error);\n if (\n openClawGatewayVisibility?.gatewayVisibility === \"missing_after_restart\"\n ) {\n return \"not_visible\";\n }\n if (\n openClawGatewayVisibility?.gatewayVisibility === \"missing_before_restart\"\n ) {\n return \"restart_failed\";\n }\n return \"not_checked\";\n}\n\nfunction resolveDiagnosticsRuntimeContext(\n providerRuntimeWorkingDirectory: string\n): ProviderDispatchRuntimeContext {\n const parsed = providerDispatchRuntimeContextSchema.safeParse({\n providerRuntimeWorkingDirectory,\n });\n if (parsed.success) {\n return parsed.data;\n }\n const validationDetails = parsed.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0\n ? issue.path.join(\".\")\n : \"providerRuntimeWorkingDirectory\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n throw new Error(\n `invalid OpenClaw providerRuntimeWorkingDirectory: ${validationDetails}`\n );\n}\n\nfunction hasGatewayVisibilityPayload(error: unknown): boolean {\n return extractGatewayVisibilityPayload(error) !== null;\n}\n\nfunction extractGatewayVisibilityPayload(\n error: unknown\n): NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n> | null {\n if (!(error && typeof error === \"object\")) {\n return null;\n }\n const openClawGatewayVisibility = (\n error as {\n openClawGatewayVisibility?: NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n > | null;\n }\n ).openClawGatewayVisibility;\n return openClawGatewayVisibility ?? null;\n}\n\nfunction extractErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n const normalized = String((error as { code?: unknown }).code ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction extractProviderErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"providerErrorCode\" in error)) {\n return null;\n }\n const normalized = String(\n (error as { providerErrorCode?: unknown }).providerErrorCode ?? \"\"\n ).trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import {\n OPENMELD_HEADER_PROFILE_ID,\n toErrorMessage,\n} from \"@openmeld/gateway-contract\";\nimport {\n getAuthSessionState,\n type StoredAuthSession,\n} from \"../config/auth-session\";\nimport { resolveBaseUrl } from \"../config/base-url\";\nimport {\n type OpenMeldEnvPreset,\n resolveOpenMeldEnvPreset,\n} from \"../config/paths\";\nimport { buildRequestAuthHeaders } from \"../config/request-headers\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport { DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS as STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS } from \"../strategy-constants\";\n\nexport const DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS =\n STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS;\n\nexport type GatewayChainFailureKind =\n | \"gateway_unreachable\"\n | \"auth_required\"\n | \"local_dev_session_missing\"\n | \"dispatch_storage_not_ready\"\n | \"chain_unhealthy_unknown\";\n\nexport type GatewayChainReadiness =\n | {\n applicable: false;\n baseUrl: string | null;\n checkedAt: string;\n details: null;\n errorCode: null;\n errorMessage: null;\n failureKind: null;\n ready: true;\n status: null;\n summary: string;\n }\n | {\n applicable: true;\n baseUrl: string;\n checkedAt: string;\n details: null;\n errorCode: null;\n errorMessage: null;\n failureKind: null;\n ready: true;\n status: number;\n summary: string;\n }\n | {\n applicable: true;\n baseUrl: string;\n checkedAt: string;\n details: string;\n errorCode: string | null;\n errorMessage: string | null;\n failureKind: GatewayChainFailureKind;\n ready: false;\n status: number | null;\n summary: string;\n };\n\nexport type GatewayChainGuidance = {\n nextSteps: string[];\n summary: string;\n};\n\nexport type GatewayChainProfile = {\n openMeldProfileId: string;\n profileName?: string | null;\n};\n\nexport async function resolveGatewayChainReadiness(\n input: {\n authSession?: StoredAuthSession | null;\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n profile?: GatewayChainProfile | null;\n timeoutMs?: number;\n } = {}\n): Promise<GatewayChainReadiness> {\n const checkedAt = new Date().toISOString();\n const authSession =\n input.authSession === undefined\n ? await resolveGatewayChainAuthSession()\n : input.authSession;\n const profile = input.profile ?? null;\n\n if (!(authSession && profile?.openMeldProfileId)) {\n return {\n applicable: false,\n baseUrl: null,\n checkedAt,\n details: null,\n errorCode: null,\n errorMessage: null,\n failureKind: null,\n ready: true,\n status: null,\n summary:\n \"Gateway chain check is not applicable for this local connection check.\",\n };\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const fallbackBaseUrl = resolveGatewayChainFailureBaseUrl(input.baseUrl);\n\n try {\n const baseUrl = await resolveBaseUrl(input.baseUrl);\n const endpoint = new URL(\"/v1/diagnostics/chain\", baseUrl).toString();\n const headers = await buildRequestAuthHeaders({\n authSession,\n requestUrl: endpoint,\n });\n headers[OPENMELD_HEADER_PROFILE_ID] = profile.openMeldProfileId;\n const response = await fetchImpl(endpoint, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(\n input.timeoutMs ?? DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS\n ),\n });\n const raw = await response.text();\n if (response.ok) {\n return {\n applicable: true,\n baseUrl,\n checkedAt,\n details: null,\n errorCode: null,\n errorMessage: null,\n failureKind: null,\n ready: true,\n status: response.status,\n summary: \"Gateway auth chain is healthy.\",\n };\n }\n\n const errorDetails = resolveGatewayErrorDetails(raw);\n const failureKind = classifyGatewayChainFailure({\n code: errorDetails.code,\n message: errorDetails.message || errorDetails.details,\n status: response.status,\n });\n return {\n applicable: true,\n baseUrl,\n checkedAt,\n details: formatGatewayHttpFailure(response.status, raw),\n errorCode: errorDetails.code,\n errorMessage: errorDetails.message,\n failureKind,\n ready: false,\n status: response.status,\n summary: describeGatewayChainFailure(failureKind),\n };\n } catch (error) {\n return {\n applicable: true,\n baseUrl: fallbackBaseUrl,\n checkedAt,\n details: toErrorMessage(error),\n errorCode: null,\n errorMessage: toErrorMessage(error),\n failureKind: \"gateway_unreachable\",\n ready: false,\n status: null,\n summary: describeGatewayChainFailure(\"gateway_unreachable\"),\n };\n }\n}\n\nfunction resolveGatewayChainFailureBaseUrl(value: string | undefined): string {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : \"unknown\";\n}\n\nexport function classifyGatewayChainFailure(input: {\n code?: string | null;\n message?: string | null;\n status?: number | null;\n}): GatewayChainFailureKind {\n const status = input.status ?? null;\n const code = String(input.code ?? \"\")\n .trim()\n .toLowerCase();\n const message = String(input.message ?? \"\")\n .trim()\n .toLowerCase();\n const combined = [code, message]\n .filter((value) => value.length > 0)\n .join(\" \");\n\n if (\n combined.includes(\"core dispatch storage is not ready\") ||\n combined.includes(\"shared openmeld_db migration is missing\") ||\n combined.includes(\"apply the shared db gate\")\n ) {\n return \"dispatch_storage_not_ready\";\n }\n\n if (\n combined.includes(\"gatewayauthrpcentrypoint\") ||\n combined.includes(\"resolverequestauth\") ||\n combined.includes(\"couldn't find a local dev session\") ||\n combined.includes('worker \"openmeld-auth\" not found')\n ) {\n return \"local_dev_session_missing\";\n }\n\n if (\n status === 401 ||\n status === 403 ||\n combined.includes(\"auth.unauthenticated\") ||\n combined.includes(\"authentication required\")\n ) {\n return \"auth_required\";\n }\n\n if (\n combined.includes(\"upstream_unreachable\") ||\n combined.includes(\"network.timeout\") ||\n combined.includes(\"timed out\") ||\n combined.includes(\"gateway is unreachable\") ||\n combined.includes(\"can't reach the gateway\")\n ) {\n return \"gateway_unreachable\";\n }\n\n return \"chain_unhealthy_unknown\";\n}\n\nexport function formatGatewayHttpFailure(status: number, raw: string): string {\n const details = extractGatewayErrorDetails(raw);\n if (details) {\n return `HTTP ${status}: ${details}`;\n }\n return `HTTP ${status}`;\n}\n\nexport function extractGatewayErrorDetails(raw: string): string {\n return resolveGatewayErrorDetails(raw).details;\n}\n\nexport function resolveGatewayChainRepairGuidance(input: {\n failureKind?: GatewayChainFailureKind | null;\n lane?: OpenMeldEnvPreset;\n}): GatewayChainGuidance {\n const lane = input.lane ?? resolveOpenMeldEnvPreset();\n if (input.failureKind === \"dispatch_storage_not_ready\") {\n if (lane !== \"dev-local\") {\n return {\n nextSteps: [\n \"Retry the OpenMeld command shortly.\",\n \"If this continues, contact OpenMeld support with the latest command output.\",\n ],\n summary:\n \"OpenMeld cloud execution storage is temporarily unavailable. Retry shortly; if it continues, contact OpenMeld support.\",\n };\n }\n return {\n nextSteps: [\n \"pnpm db:migrate:dev\",\n \"pnpm db:verify:dev\",\n \"pnpm dev:stop\",\n \"pnpm dev\",\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ],\n summary:\n \"Run `pnpm db:migrate:dev`, then `pnpm db:verify:dev`, then restart the local OpenMeld dev stack with `pnpm dev:stop` and `pnpm dev`, then verify with `openmeld service status`.\",\n };\n }\n\n if (lane === \"dev-local\") {\n const repairCommand = formatOpenMeldCliCommand(\"openmeld doctor --repair\");\n return {\n nextSteps: [\"pnpm dev:stop\", \"pnpm dev\", repairCommand],\n summary:\n input.failureKind === \"local_dev_session_missing\"\n ? `Run \\`pnpm dev:stop\\`, then \\`pnpm dev\\`, then \\`${repairCommand}\\`.`\n : `Restart the local OpenMeld dev stack with \\`pnpm dev:stop\\` and \\`pnpm dev\\`, then run \\`${repairCommand}\\`.`,\n };\n }\n\n const statusCommand = formatOpenMeldCliCommand(\"openmeld service status\");\n const repairCommand = formatOpenMeldCliCommand(\"openmeld doctor --repair\");\n return {\n nextSteps: [statusCommand, repairCommand],\n summary: `Run \\`${statusCommand}\\`; if unhealthy run \\`${repairCommand}\\`.`,\n };\n}\n\nexport function resolveGatewayChainRetryGuidance(input: {\n failureKind: GatewayChainFailureKind;\n lane?: OpenMeldEnvPreset;\n}): GatewayChainGuidance {\n const repairGuidance = resolveGatewayChainRepairGuidance(input);\n const retrySummary = repairGuidance.summary.endsWith(\".\")\n ? `${repairGuidance.summary.slice(0, -1)}, then retry.`\n : `${repairGuidance.summary}, then retry.`;\n return {\n nextSteps: repairGuidance.nextSteps,\n summary: retrySummary,\n };\n}\n\nfunction describeGatewayChainFailure(\n failureKind: GatewayChainFailureKind\n): string {\n switch (failureKind) {\n case \"local_dev_session_missing\":\n return \"OpenMeld gateway can't reach the local OpenMeld auth worker session.\";\n case \"auth_required\":\n return \"Gateway auth chain requires sign-in for this OpenMeld environment.\";\n case \"dispatch_storage_not_ready\":\n return \"OpenMeld cloud execution storage is temporarily unavailable.\";\n case \"gateway_unreachable\":\n return \"Gateway auth chain is unavailable.\";\n default:\n return \"Gateway auth chain is unhealthy.\";\n }\n}\n\nasync function resolveGatewayChainAuthSession(): Promise<StoredAuthSession | null> {\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n if (authState?.state !== \"valid\" || !authState.session) {\n return null;\n }\n return authState.session;\n}\n\nfunction resolveGatewayErrorDetails(raw: string): {\n code: string | null;\n details: string;\n message: string | null;\n} {\n const text = raw.trim();\n if (!text) {\n return {\n code: null,\n details: \"\",\n message: null,\n };\n }\n\n const parsed = parseJson(text);\n if (!parsed || typeof parsed !== \"object\") {\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n }\n\n const payload = parsed as {\n error?: unknown;\n };\n if (!payload.error || typeof payload.error !== \"object\") {\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n }\n\n const error = payload.error as {\n code?: unknown;\n message?: unknown;\n };\n const code = typeof error.code === \"string\" ? error.code : null;\n const message = typeof error.message === \"string\" ? error.message : null;\n\n if (code && message) {\n return {\n code,\n details: `${code}: ${message}`,\n message,\n };\n }\n if (message) {\n return {\n code,\n details: message,\n message,\n };\n }\n if (code) {\n return {\n code,\n details: code,\n message,\n };\n }\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n}\n\nfunction parseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction truncateText(text: string, maxLength = 220): string {\n if (text.length <= maxLength) {\n return text;\n }\n return `${text.slice(0, maxLength)}...`;\n}\n","import type { OpenClawLocalDiagnostics } from \"../../../provider-hosts/openclaw/diagnostics\";\n\nexport type OpenClawDiagnosticsGuidance = {\n nextCommands: string[];\n summary: string;\n};\n\nexport function resolveOpenClawDiagnosticsGuidance(input: {\n diagnostics: OpenClawLocalDiagnostics;\n profileId: string;\n}): OpenClawDiagnosticsGuidance {\n const diagnostics = input.diagnostics;\n const setupCommand = `openmeld setup --profile ${input.profileId}`;\n if (diagnostics.bootstrapStatus !== \"healthy\") {\n const bootstrapCommandUnavailableSummary =\n resolveBootstrapCommandUnavailableSummary(diagnostics.message);\n if (bootstrapCommandUnavailableSummary) {\n return {\n summary: bootstrapCommandUnavailableSummary,\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n switch (diagnostics.bootstrapStatus) {\n case \"binding_conflict\":\n return {\n summary:\n \"OpenMeld found a local OpenClaw binding conflict for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"workspace_mismatch\":\n return {\n summary:\n \"OpenMeld found a local OpenClaw workspace mismatch for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"workspace_ambiguous\":\n return {\n summary:\n \"OpenMeld found multiple OpenClaw agents claiming the same OpenMeld-managed workspace for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"invalid\":\n return {\n summary:\n \"OpenMeld found an invalid local OpenClaw bootstrap state for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n default:\n return {\n summary:\n \"OpenMeld could not find a healthy local OpenClaw bootstrap for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n }\n\n if (diagnostics.gatewayHealth !== \"healthy\") {\n return {\n summary: \"The local OpenClaw Gateway is not healthy on this device.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n }\n\n switch (diagnostics.gatewayVisibility) {\n case \"restart_failed\":\n return {\n summary:\n \"OpenMeld could not restart the local OpenClaw Gateway while checking this profile.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n case \"not_visible\":\n return {\n summary:\n \"OpenMeld can reach the local OpenClaw Gateway, but this OpenClaw agent is still not visible there.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"not_checked\":\n return {\n summary:\n \"OpenMeld could not verify local OpenClaw Gateway visibility for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n case \"restarted_then_visible\":\n case \"visible\":\n break;\n default:\n return {\n summary:\n \"OpenMeld could not verify local OpenClaw Gateway visibility for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n }\n\n if (diagnostics.authStatus === \"source_missing\") {\n return {\n summary:\n \"OpenMeld could not find a default OpenClaw auth source on this device.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n\n return {\n summary: \"This OpenClaw profile can handle OpenMeld local replies.\",\n nextCommands: [\n `openmeld space send YOUR_SPACE_ID \"@YOUR_WAKE_HANDLE hello\"`,\n ],\n };\n}\n\nfunction resolveBootstrapCommandUnavailableSummary(\n message: string | null | undefined\n): string | null {\n const normalized = String(message ?? \"\")\n .trim()\n .toLowerCase();\n if (!normalized.includes(\"openclaw is not installed or not on path\")) {\n return null;\n }\n return \"OpenMeld could not start OpenClaw on this device. Install OpenClaw or fix its PATH for background services, then try again.\";\n}\n","import {\n resolvePublicAgentAvailabilityCopy,\n resolvePublicAgentFailureRecovery,\n} from \"@openmeld/schemas\";\nimport type {\n ReplyReadinessLevel,\n ReplyReadinessReasonCode,\n} from \"@openmeld/schemas/types\";\n\ntype CliOnlyReplyReadinessReasonCode =\n | \"controller.binding.disabled\"\n | \"local_agents.none_needed\"\n | \"profile.inactive\"\n | \"profile.not_selected\"\n | \"projection.missing\"\n | \"runtime.adapter.unsupported\"\n | \"service.account_mismatch\"\n | \"service.auth_missing\"\n | \"service.auth_stale\"\n | \"service.gateway_chain_unhealthy\";\n\ntype SharedRecoveryOnlyReplyReadinessReasonCode =\n | \"controller.launch.choice_required\"\n | \"controller.launch.needs_repair\"\n | \"dispatch.storage_not_ready\"\n | \"workspace.invalid\"\n | \"workspace.missing\";\n\nconst DEFAULT_CLI_GUIDANCE_SUMMARY =\n \"This profile can't reply until local setup is fixed.\";\n\n// These codes describe CLI-only local inspection facts. Every other\n// ReplyReadinessReasonCode is shared with the public schemas dictionary.\nconst CLI_ONLY_AVAILABILITY_COPY = {\n \"controller.binding.disabled\":\n \"The local agent connection is turned off for this profile.\",\n \"local_agents.none_needed\":\n \"No local agents on this device need OpenMeld Service right now.\",\n \"profile.inactive\": \"This profile is not active.\",\n \"profile.not_selected\":\n \"Choose an Agent Profile to check local reply routes.\",\n \"projection.missing\":\n \"OpenMeld is still setting up this device. Run `openmeld doctor --repair`.\",\n \"runtime.adapter.unsupported\":\n \"The local agent controller setup is not supported.\",\n \"service.account_mismatch\":\n \"OpenMeld Service is signed in to a different OpenMeld account.\",\n \"service.auth_missing\": \"OpenMeld Service is not signed in.\",\n \"service.auth_stale\": \"OpenMeld Service needs a fresh sign-in.\",\n \"service.gateway_chain_unhealthy\":\n \"The OpenMeld gateway authentication chain is unavailable.\",\n} as const satisfies Record<CliOnlyReplyReadinessReasonCode, string>;\n\nconst CLI_ONLY_GUIDANCE_COPY = {\n \"controller.binding.disabled\": \"This profile's agent is turned off.\",\n \"local_agents.none_needed\":\n \"This device does not need OpenMeld Service until you choose local agents to bring into a space.\",\n \"profile.inactive\": \"Choose an active agent profile first.\",\n \"profile.not_selected\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"projection.missing\": \"OpenMeld is still setting up this device.\",\n \"runtime.adapter.unsupported\":\n \"This agent setup can't reply from this device.\",\n \"service.account_mismatch\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.auth_missing\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.auth_stale\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.gateway_chain_unhealthy\":\n \"OpenMeld can't reach the gateway for this device yet.\",\n} as const satisfies Record<CliOnlyReplyReadinessReasonCode, string>;\n\nexport const REPLY_READINESS_COPY = {\n agentReadyReason: \"This profile can reply from Space when mentioned\",\n canReplyLabel: \"Can reply\",\n deviceReadyReason:\n \"This device is ready for Space replies from local agent profiles\",\n localAgentRecoveryTargetLabel: \"A local agent\",\n manualSpaceParticipation:\n \"You can still join the space and send messages yourself.\",\n spaceMember: {\n agentsListRepairInstruction:\n \"Use `openmeld agents list` to find the local agent that needs repair.\",\n checkProfileInstruction:\n \"Open Local Agents in OpenMeld Web and check this profile.\",\n connectedBadge: \"Local setup connected\",\n fallbackLocalTargetLabel: \"this local agent\",\n fallbackProfileLabel: \"This agent\",\n incompleteReason: \"Local setup on this device is still incomplete.\",\n joinsOnlyBadge: \"Joins only for now\",\n needsRepairBadge: \"Needs repair\",\n reconnectProfileInstruction:\n \"Open this Agent in OpenMeld Web and reconnect it to the right local agent on this device.\",\n selectProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and choose the local agent that should handle work from the Space.\",\n turnOnProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and turn on its local agent connection.\",\n },\n guidance: {\n readyMentionInstruction:\n \"Choose Wake in the Space, or send with --wake <agent-profile-id>.\",\n readySummary:\n \"This agent can reply when you select it as a Wake recipient.\",\n selectProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and choose a local agent.\",\n turnOnProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and turn on its local agent connection.\",\n },\n} as const;\n\nconst REPLY_READINESS_LABEL_PREFIX = {\n blocked: \"Blocked\",\n degraded: \"Limited\",\n unknown: \"Unknown\",\n} as const satisfies Record<Exclude<ReplyReadinessLevel, \"ready\">, string>;\n\nexport function resolveReplyReadinessAvailabilityReasonCopy(\n reasonCode: ReplyReadinessReasonCode\n): string {\n // Availability surfaces describe the current local device, so they must use\n // the shared availabilitySummary tense rather than recovery instructions.\n const sharedAvailability =\n resolvePublicAgentAvailabilityCopy(reasonCode)?.availabilitySummary;\n if (sharedAvailability) {\n return adaptSharedCopyToLocalDevice(sharedAvailability);\n }\n if (isCliOnlyReplyReadinessReasonCode(reasonCode)) {\n return CLI_ONLY_AVAILABILITY_COPY[reasonCode];\n }\n throw new Error(\n `Shared availability copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n}\n\nexport function resolveReplyReadinessStatusReasonCopy(\n reasonCode: ReplyReadinessReasonCode\n): string {\n // These codes are local check failures, not simple availability facts, and\n // the shared dictionary intentionally exposes only their recovery body. The\n // readiness reason slot therefore uses that shared failure/recovery domain.\n if (isSharedRecoveryOnlyReplyReadinessReasonCode(reasonCode)) {\n return resolveSharedRecoveryBody(reasonCode);\n }\n return resolveReplyReadinessAvailabilityReasonCopy(reasonCode);\n}\n\nexport function resolveReplyReadinessGuidanceSummaryCopy(\n reasonCode: ReplyReadinessReasonCode,\n context: { targetLabel?: string } = {}\n): string {\n // Guidance explains a failure and its repair path, so the shared recovery\n // body is the canonical source rather than the present-tense availability.\n if (isCliOnlyReplyReadinessReasonCode(reasonCode)) {\n return CLI_ONLY_GUIDANCE_COPY[reasonCode];\n }\n return resolveSharedRecoveryBody(reasonCode, context.targetLabel);\n}\n\nexport function resolveReplyReadinessReconnectingReasonCopy(): string {\n return requireSharedAvailabilitySummary(\"local_service.reconnecting\");\n}\n\nexport function formatReplyReadinessUnavailableLabelCopy(\n level: Exclude<ReplyReadinessLevel, \"ready\">,\n reasonText: string\n): string {\n return `${REPLY_READINESS_LABEL_PREFIX[level]} (${reasonText})`;\n}\n\nexport function formatManualSpaceParticipationReasonCopy(\n availabilityReason: string\n): string {\n return `${availabilityReason} ${REPLY_READINESS_COPY.manualSpaceParticipation}`;\n}\n\nexport function formatSpaceMemberCommandRecoveryCopy(\n formattedCommand: string\n): string {\n return `Use \\`${formattedCommand}\\` to check the local reply path.`;\n}\n\nfunction resolveSharedRecoveryBody(\n reasonCode: ReplyReadinessReasonCode,\n targetLabel = \"This profile\"\n): string {\n const recovery = resolvePublicAgentFailureRecovery({\n errorCode: reasonCode,\n includeUnknown: false,\n targetLabel,\n });\n if (!recovery) {\n throw new Error(\n `Shared recovery copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n }\n return adaptSharedCopyToLocalDevice(recovery.body);\n}\n\nfunction requireSharedAvailabilitySummary(reasonCode: string): string {\n const availabilitySummary =\n resolvePublicAgentAvailabilityCopy(reasonCode)?.availabilitySummary;\n if (!availabilitySummary) {\n throw new Error(\n `Shared availability copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n }\n return adaptSharedCopyToLocalDevice(availabilitySummary);\n}\n\nfunction isCliOnlyReplyReadinessReasonCode(\n reasonCode: ReplyReadinessReasonCode\n): reasonCode is CliOnlyReplyReadinessReasonCode {\n return Object.hasOwn(CLI_ONLY_AVAILABILITY_COPY, reasonCode);\n}\n\nfunction isSharedRecoveryOnlyReplyReadinessReasonCode(\n reasonCode: ReplyReadinessReasonCode\n): reasonCode is SharedRecoveryOnlyReplyReadinessReasonCode {\n return SHARED_RECOVERY_ONLY_REASON_CODES.has(reasonCode);\n}\n\nconst SHARED_RECOVERY_ONLY_REASON_CODES: ReadonlySet<ReplyReadinessReasonCode> =\n new Set([\n \"controller.launch.choice_required\",\n \"controller.launch.needs_repair\",\n \"dispatch.storage_not_ready\",\n \"workspace.invalid\",\n \"workspace.missing\",\n ] satisfies readonly SharedRecoveryOnlyReplyReadinessReasonCode[]);\n\nfunction adaptSharedCopyToLocalDevice(copy: string): string {\n // Shared copy speaks about another agent's computer. The CLI runs on the\n // inspected machine, so only the subject is adapted; the sentence and\n // recovery meaning remain owned by @openmeld/schemas.\n return copy\n .replaceAll(\"its computer\", \"this device\")\n .replaceAll(\"this computer\", \"this device\");\n}\n","import { providerDispatchRuntimeContextSchema } from \"@openmeld/schemas\";\nimport type {\n ProviderDispatchRuntimeContext,\n ReplyReadinessLevel as SharedReplyReadinessLevel,\n ReplyReadinessReasonCode as SharedReplyReadinessReasonCode,\n} from \"@openmeld/schemas/types\";\nimport { resolveAgentTargetState } from \"../agents/registry\";\nimport { resolveRegistryRuntimeAdapterContractByAgentControllerRef } from \"../agents/registry-source\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../config/daemon-state\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport type { OpenMeldProfile } from \"../config/openmeld-profiles-api\";\nimport { createDefaultRuntimeAgentControllerSettings } from \"../config/runtime-config\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport {\n classifyDaemonServiceWakeability,\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES,\n type DaemonServiceWakeabilityClassification,\n} from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport type { DaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n getEffectiveDaemonRuntimeStatus,\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport type { LocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport { resolveLocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport type { DeviceRuntimeStateSyncResult } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { syncDeviceRuntimeStateProjection } from \"../local-service/reporting/device-runtime-state-sync\";\nimport {\n type EffectiveProfileWorkingFolderRuntimeResolution,\n resolveEffectiveProfileWorkingFolderRuntime,\n} from \"../profile-workspace/effective-runtime-resolution\";\nimport {\n isOpenClawLocalDiagnosticsFailure,\n type OpenClawLocalDiagnostics,\n type OpenClawLocalDiagnosticsState,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport { prepareProviderRuntime } from \"../provider-hosts/prepare-provider-runtime\";\nimport {\n type AgentProfilePrimaryAgentControllerReport,\n resolveAgentProfilePrimaryAgentControllerReport,\n} from \"./agent-profile-primary-binding\";\nimport type {\n GatewayChainProfile,\n GatewayChainReadiness,\n} from \"./gateway-chain-readiness\";\nimport { resolveGatewayChainReadiness } from \"./gateway-chain-readiness\";\nimport type { PrimaryBindingReadSession } from \"./primary-binding-read-session\";\nimport { resolveOpenClawDiagnosticsGuidance } from \"./provider-diagnostics/openclaw/guidance\";\nimport {\n formatManualSpaceParticipationReasonCopy,\n formatReplyReadinessUnavailableLabelCopy,\n REPLY_READINESS_COPY,\n resolveReplyReadinessAvailabilityReasonCopy,\n resolveReplyReadinessGuidanceSummaryCopy,\n resolveReplyReadinessReconnectingReasonCopy,\n resolveReplyReadinessStatusReasonCopy,\n} from \"./reply-readiness-copy\";\n\nconst REPLY_READINESS_REASON_PRIORITY = [\n \"profile.not_selected\",\n \"profile.inactive\",\n \"profile.unbound\",\n \"controller.binding.disabled\",\n \"projection.missing\",\n \"controller.registry.disabled\",\n \"controller.launch.choice_required\",\n \"controller.launch.needs_repair\",\n \"workspace.missing\",\n \"workspace.invalid\",\n \"runtime.adapter.unsupported\",\n \"controller.bootstrap.failed\",\n \"controller.gateway.unhealthy\",\n \"service.not_installed\",\n \"service.drifted\",\n \"service.account_mismatch\",\n \"service.auth_missing\",\n \"service.auth_stale\",\n \"service.not_running\",\n \"dispatch.storage_not_ready\",\n \"service.gateway_chain_unhealthy\",\n \"local_agents.none_needed\",\n \"route.offline\",\n \"route.not_registered\",\n] satisfies readonly ReplyReadinessReasonCode[];\n\nexport type ReplyReadinessLevel = SharedReplyReadinessLevel;\n\nexport type ReplyReadinessReasonCode = SharedReplyReadinessReasonCode;\n\nexport type DeviceReplyReadinessStatus = {\n reasonCodes: ReplyReadinessReasonCode[];\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n serviceWakeability?: Pick<\n DaemonServiceWakeabilityClassification,\n | \"advisoryCodes\"\n | \"blockingCodes\"\n | \"conditionalCodes\"\n | \"executionEvidenceSafe\"\n >;\n updatedAt: string;\n wakeableRouteCount: number;\n};\n\nexport type AgentReplyReadinessStatus = {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n localAgentId?: string | null;\n profileId: string;\n reasonCodes: ReplyReadinessReasonCode[];\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n transportMode: string | null;\n updatedAt: string;\n};\n\ntype ResolveDeviceReplyReadinessInput = {\n baseUrl?: string;\n checkGatewayChain?: boolean;\n gatewayChainProfile?: GatewayChainProfile | null;\n gatewayChainReadiness?: GatewayChainReadiness | null;\n gatewayChainTimeoutMs?: number;\n inventory?: DaemonServiceInventory | null;\n localDemand?: LocalServiceDemand | null;\n ownerUserId?: string | null;\n profile?: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution?: EffectiveProfileWorkingFolderRuntimeResolution | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n runtimeWorkdir?: string;\n status?: DaemonStatus;\n};\n\ntype ResolveAgentReplyReadinessInput = {\n bindingReads?: PrimaryBindingReadSession;\n coreWakeRouteOnline?: boolean;\n deviceReplyReadiness?: DeviceReplyReadinessStatus;\n openClawLocalDiagnostics?: OpenClawLocalDiagnosticsState | null;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n profile: OpenMeldProfile;\n profileWorkspaceRuntimeResolution?: EffectiveProfileWorkingFolderRuntimeResolution | null;\n};\n\ntype AgentPrimaryRuntimeContext = {\n executionTarget: AgentProfilePrimaryAgentControllerReport | null;\n targetState: Awaited<ReturnType<typeof resolveAgentTargetState>> | null;\n transportMode: string | null;\n};\n\nexport async function resolveDeviceReplyReadinessStatus(\n input: ResolveDeviceReplyReadinessInput = {}\n): Promise<DeviceReplyReadinessStatus> {\n const status = input.status ?? (await getDaemonStatus());\n if (!status.installed) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_installed\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"service.not_installed\"\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n\n const inventory =\n input.inventory ?? (await resolveReplyReadinessInventory(status));\n const runtimeStatus =\n input.runtimeStatus ??\n inventory?.runtimeStatus ??\n (await resolveDaemonRuntimeState(status));\n const runtimeProjection = await resolveDeviceReadinessRuntimeProjection(\n input.runtimeProjection\n );\n const localDemand = await resolveDeviceReadinessLocalDemand({\n localDemand: input.localDemand,\n ownerUserId: input.ownerUserId,\n projection: runtimeProjection,\n runtimeWorkdir: input.runtimeWorkdir,\n });\n const profileWorkspaceRuntimeResolution =\n input.profileWorkspaceRuntimeResolution ??\n (input.profile?.profileKind === \"agent\"\n ? await resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: input.profile.defaultProjectId,\n openMeldProfileId: input.profile.openMeldProfileId,\n mode: \"inspect\",\n })\n : null);\n\n const serviceReadiness = await resolveDeviceReplyReadinessFromServiceState({\n inventory,\n localDemand,\n runtimeStatus,\n status,\n });\n if (serviceReadiness) {\n return serviceReadiness;\n }\n\n const gatewayChainReadiness =\n input.checkGatewayChain === true\n ? (input.gatewayChainReadiness ??\n (await resolveGatewayChainReadinessFromInput({\n baseUrl: input.baseUrl,\n profile: input.gatewayChainProfile ?? input.profile ?? null,\n timeoutMs: input.gatewayChainTimeoutMs,\n }).catch(() => null)))\n : null;\n if (gatewayChainReadiness?.applicable && !gatewayChainReadiness.ready) {\n const gatewayChainReasonCode =\n gatewayChainReadiness.failureKind === \"dispatch_storage_not_ready\"\n ? \"dispatch.storage_not_ready\"\n : \"service.gateway_chain_unhealthy\";\n return createDeviceReplyReadinessStatus({\n reasonCode: gatewayChainReasonCode,\n reasonText: gatewayChainReadiness.summary,\n replyReadiness: \"blocked\",\n wakeableRouteCount: localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n\n const profileWorkspaceReadiness =\n resolveDeviceReplyReadinessFromProfileWorkspace({\n localDemand,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n });\n if (profileWorkspaceReadiness) {\n return profileWorkspaceReadiness;\n }\n\n if (localDemand?.hasLocalExecutionRoute) {\n return createDeviceReplyReadinessStatus({\n reasonText: REPLY_READINESS_COPY.deviceReadyReason,\n replyReadiness: \"ready\",\n wakeableRouteCount: localDemand.localExecutionRouteCount,\n });\n }\n\n const projectionBlockedStatus =\n resolveDeviceReplyReadinessFromRuntimeProjection(runtimeProjection);\n if (projectionBlockedStatus) {\n return projectionBlockedStatus;\n }\n\n return createRouteNotRegisteredReplyReadinessStatus({\n localDemand,\n runtimeProjection,\n });\n}\n\nasync function resolveGatewayChainReadinessFromInput(input: {\n baseUrl?: string;\n profile: GatewayChainProfile | OpenMeldProfile | null;\n timeoutMs?: number;\n}): Promise<GatewayChainReadiness | null> {\n if (!input.profile) {\n return null;\n }\n\n return await resolveGatewayChainReadiness({\n baseUrl: input.baseUrl,\n profile: {\n openMeldProfileId: input.profile.openMeldProfileId,\n profileName: input.profile.profileName,\n },\n timeoutMs: input.timeoutMs,\n });\n}\n\nexport async function resolveAgentReplyReadinessStatus(\n input: ResolveAgentReplyReadinessInput\n): Promise<AgentReplyReadinessStatus | null> {\n if (input.profile.profileKind !== \"agent\") {\n return null;\n }\n\n const deviceReplyReadiness =\n input.deviceReplyReadiness ??\n (await resolveDeviceReplyReadinessStatus({\n ownerUserId: input.profile.ownerUserId,\n profile: input.profile,\n profileWorkspaceRuntimeResolution:\n input.profileWorkspaceRuntimeResolution,\n }));\n const profileWorkspaceRuntimeResolution =\n input.profileWorkspaceRuntimeResolution ??\n (await resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: input.profile.defaultProjectId,\n openMeldProfileId: input.profile.openMeldProfileId,\n mode: \"inspect\",\n }));\n const { executionTarget, targetState, transportMode } =\n await resolveAgentPrimaryRuntimeContext({\n bindingReads: input.bindingReads,\n primaryAgentControllerReport: input.primaryAgentControllerReport,\n profile: input.profile,\n });\n const localAgentId = executionTarget?.localAgentId ?? null;\n const deviceReasonCodes = resolveAgentDeviceReasonCodes({\n coreWakeRouteOnline: input.coreWakeRouteOnline === true,\n deviceReasonCodes: deviceReplyReadiness.reasonCodes,\n serviceWakeability: deviceReplyReadiness.serviceWakeability,\n });\n const reasonCodes = collectAgentReplyReadinessReasonCodes({\n bindingReady:\n executionTarget?.bindingState === \"enabled_primary\" &&\n executionTarget.routable,\n deviceReasonCodes,\n profile: input.profile,\n targetState,\n });\n const workspaceReasonCode = resolveBlockingWorkspaceReasonCode({\n profileWorkspaceRuntimeResolution,\n reasonCodes,\n });\n if (workspaceReasonCode) {\n pushReasonCode(reasonCodes, workspaceReasonCode);\n const primaryReasonCode = sortReplyReadinessReasonCodes(reasonCodes)[0];\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonCodes,\n reasonText: describeReplyReadinessReason(\n primaryReasonCode ?? workspaceReasonCode\n ),\n transportMode,\n replyReadiness: resolveReplyReadinessLevel(\n sortReplyReadinessReasonCodes(reasonCodes),\n deviceReplyReadiness\n ),\n });\n }\n const openClawLocalReadinessFailure =\n await resolveOpenClawLocalReadinessFailure({\n agentControllerRef: executionTarget?.agentControllerRef ?? null,\n diagnostics: input.openClawLocalDiagnostics ?? null,\n effectiveRuntimeWorkingDirectory:\n profileWorkspaceRuntimeResolution.status === \"ready\"\n ? profileWorkspaceRuntimeResolution.effectiveRuntimeWorkingDirectory\n : undefined,\n isOpenClawRuntime:\n executionTarget?.localAgentId === \"openclaw\" ||\n executionTarget?.capabilityId === \"openclaw\",\n profile: input.profile,\n reasonCodes,\n });\n if (openClawLocalReadinessFailure) {\n pushReasonCode(reasonCodes, openClawLocalReadinessFailure.reasonCode);\n }\n\n if (reasonCodes.length === 0) {\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonText: REPLY_READINESS_COPY.agentReadyReason,\n transportMode,\n replyReadiness: \"ready\",\n });\n }\n\n const primaryReasonCode = reasonCodes[0] ?? \"route.not_registered\";\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonCodes,\n reasonText:\n (primaryReasonCode === \"controller.bootstrap.failed\" ||\n primaryReasonCode === \"controller.gateway.unhealthy\") &&\n openClawLocalReadinessFailure\n ? openClawLocalReadinessFailure.message\n : describeReplyReadinessReason(primaryReasonCode),\n transportMode,\n replyReadiness: resolveReplyReadinessLevel(\n reasonCodes,\n deviceReplyReadiness\n ),\n });\n}\n\nfunction resolveAgentDeviceReasonCodes(input: {\n coreWakeRouteOnline: boolean;\n deviceReasonCodes: readonly ReplyReadinessReasonCode[];\n serviceWakeability?: DeviceReplyReadinessStatus[\"serviceWakeability\"];\n}): ReplyReadinessReasonCode[] {\n if (!input.coreWakeRouteOnline) {\n return [...input.deviceReasonCodes];\n }\n\n return input.deviceReasonCodes.filter(\n (reasonCode) =>\n reasonCode !== \"service.not_running\" &&\n reasonCode !== \"route.offline\" &&\n reasonCode !== \"route.not_registered\" &&\n !(\n reasonCode === \"service.drifted\" &&\n isConditionalServiceDrift(input.serviceWakeability)\n )\n );\n}\n\nfunction isConditionalServiceDrift(\n serviceWakeability: DeviceReplyReadinessStatus[\"serviceWakeability\"]\n): boolean {\n if (!serviceWakeability || serviceWakeability.blockingCodes.length === 0) {\n return false;\n }\n return serviceWakeability.blockingCodes.every((code) =>\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(code)\n );\n}\n\nasync function resolveAgentPrimaryRuntimeContext(input: {\n bindingReads?: PrimaryBindingReadSession;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n profile: OpenMeldProfile;\n}): Promise<AgentPrimaryRuntimeContext> {\n const executionTarget =\n input.primaryAgentControllerReport !== undefined\n ? input.primaryAgentControllerReport\n : await resolveAgentProfilePrimaryAgentControllerReport({\n ...(input.bindingReads ? { bindingReads: input.bindingReads } : {}),\n profile: input.profile,\n }).catch(() => null);\n const localAgentId = executionTarget?.localAgentId;\n if (!localAgentId) {\n return {\n executionTarget,\n targetState: null,\n transportMode: null,\n };\n }\n\n const fallbackTransportMode =\n createDefaultRuntimeAgentControllerSettings(localAgentId).transportMode;\n const targetState = await resolveAgentTargetState(localAgentId).catch(\n () => null\n );\n return {\n executionTarget,\n targetState,\n transportMode:\n targetState?.registration?.transportMode ?? fallbackTransportMode,\n };\n}\n\nfunction collectAgentReplyReadinessReasonCodes(input: {\n bindingReady: boolean;\n deviceReasonCodes: readonly ReplyReadinessReasonCode[];\n profile: OpenMeldProfile;\n targetState: Awaited<ReturnType<typeof resolveAgentTargetState>> | null;\n}): ReplyReadinessReasonCode[] {\n const reasonCodes = [...input.deviceReasonCodes];\n const launchStatus = input.targetState?.launchStatus ?? null;\n if (input.profile.status !== \"active\") {\n pushReasonCode(reasonCodes, \"profile.inactive\");\n }\n if (!input.bindingReady) {\n pushReasonCode(reasonCodes, \"profile.unbound\");\n }\n if (\n input.targetState?.registered === false &&\n !(launchStatus === \"needs_choice\" || launchStatus === \"needs_repair\")\n ) {\n pushReasonCode(reasonCodes, \"projection.missing\");\n }\n if (\n input.targetState?.registered === true &&\n input.targetState.enabled !== true\n ) {\n pushReasonCode(reasonCodes, \"controller.registry.disabled\");\n }\n if (launchStatus === \"needs_choice\") {\n pushReasonCode(reasonCodes, \"controller.launch.choice_required\");\n }\n if (launchStatus === \"needs_repair\") {\n pushReasonCode(reasonCodes, \"controller.launch.needs_repair\");\n }\n return reasonCodes;\n}\n\nasync function resolveOpenClawLocalReadinessFailure(input: {\n agentControllerRef: string | null;\n diagnostics?: OpenClawLocalDiagnosticsState | null;\n effectiveRuntimeWorkingDirectory?: string;\n isOpenClawRuntime: boolean;\n profile: OpenMeldProfile;\n reasonCodes: readonly ReplyReadinessReasonCode[];\n}): Promise<{\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null> {\n if (input.reasonCodes.length > 0 || !input.isOpenClawRuntime) {\n return null;\n }\n if (input.diagnostics) {\n return resolveOpenClawLocalReadinessFailureFromAvailableDiagnostics({\n diagnostics: input.diagnostics,\n profileId: input.profile.openMeldProfileId,\n });\n }\n const agentControllerRef = normalizeOptionalText(input.agentControllerRef);\n const runtimeAdapterContract = agentControllerRef\n ? resolveRegistryRuntimeAdapterContractByAgentControllerRef(\n agentControllerRef\n )\n : null;\n if (\n !agentControllerRef ||\n runtimeAdapterContract?.capabilityDeclaration.preparationRequirement !==\n \"required\"\n ) {\n return null;\n }\n try {\n if (!input.effectiveRuntimeWorkingDirectory) {\n throw Object.assign(\n new Error(\n `controller.bootstrap.failed: missing effective runtime working directory for ${input.profile.openMeldProfileId}`\n ),\n {\n code: \"controller.bootstrap.failed\",\n }\n );\n }\n await prepareProviderRuntime({\n agentControllerRef,\n daemonWorkingDirectory: input.effectiveRuntimeWorkingDirectory,\n mode: \"reply_readiness\",\n profileName: input.profile.profileName,\n runtimeContext: resolveReplyReadinessRuntimeContext(\n input.effectiveRuntimeWorkingDirectory,\n input.profile.openMeldProfileId\n ),\n targetProfileId: input.profile.openMeldProfileId,\n });\n return null;\n } catch (error) {\n const errorCode = extractPreparationFailureCode(error);\n return {\n message: error instanceof Error ? error.message : String(error),\n reasonCode:\n errorCode === \"controller.bootstrap.failed\"\n ? \"controller.bootstrap.failed\"\n : \"controller.gateway.unhealthy\",\n };\n }\n}\n\nfunction resolveReplyReadinessRuntimeContext(\n effectiveRuntimeWorkingDirectory: string,\n profileId: string\n): ProviderDispatchRuntimeContext {\n const parsed = providerDispatchRuntimeContextSchema.safeParse({\n providerRuntimeWorkingDirectory: effectiveRuntimeWorkingDirectory,\n });\n if (parsed.success) {\n return parsed.data;\n }\n throw Object.assign(\n new Error(\n `controller.bootstrap.failed: invalid providerRuntimeWorkingDirectory for ${profileId}`\n ),\n {\n code: \"controller.bootstrap.failed\",\n }\n );\n}\n\nfunction resolveDeviceReplyReadinessFromProfileWorkspace(input: {\n localDemand: LocalServiceDemand | null;\n profile: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution: EffectiveProfileWorkingFolderRuntimeResolution | null;\n}): DeviceReplyReadinessStatus | null {\n if (\n input.profile?.profileKind !== \"agent\" ||\n !input.profileWorkspaceRuntimeResolution ||\n input.profileWorkspaceRuntimeResolution.status === \"ready\"\n ) {\n return null;\n }\n\n return createDeviceReplyReadinessStatus({\n reasonCode: input.profileWorkspaceRuntimeResolution.reasonCode,\n reasonText: describeReplyReadinessReason(\n input.profileWorkspaceRuntimeResolution.reasonCode\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n}\n\nfunction resolveBlockingWorkspaceReasonCode(input: {\n profileWorkspaceRuntimeResolution: EffectiveProfileWorkingFolderRuntimeResolution | null;\n reasonCodes: readonly ReplyReadinessReasonCode[];\n}): \"workspace.invalid\" | \"workspace.missing\" | null {\n if (input.reasonCodes.includes(\"workspace.missing\")) {\n return \"workspace.missing\";\n }\n if (input.reasonCodes.includes(\"workspace.invalid\")) {\n return \"workspace.invalid\";\n }\n if (!input.profileWorkspaceRuntimeResolution) {\n return null;\n }\n if (input.profileWorkspaceRuntimeResolution.status === \"missing\") {\n return \"workspace.missing\";\n }\n if (input.profileWorkspaceRuntimeResolution.status === \"invalid\") {\n return \"workspace.invalid\";\n }\n return null;\n}\n\nfunction extractPreparationFailureCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n const normalized = String((error as { code?: unknown }).code ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveOpenClawLocalReadinessFailureFromAvailableDiagnostics(input: {\n diagnostics: OpenClawLocalDiagnosticsState;\n profileId: string;\n}): {\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null {\n if (isOpenClawLocalDiagnosticsFailure(input.diagnostics)) {\n return {\n message: input.diagnostics.message,\n reasonCode:\n input.diagnostics.errorCode?.startsWith(\"openclaw.gateway\") === true\n ? \"controller.gateway.unhealthy\"\n : \"controller.bootstrap.failed\",\n };\n }\n return resolveOpenClawLocalReadinessFailureFromDiagnostics({\n diagnostics: input.diagnostics,\n profileId: input.profileId,\n });\n}\n\nfunction resolveOpenClawLocalReadinessFailureFromDiagnostics(input: {\n diagnostics: OpenClawLocalDiagnostics;\n profileId: string;\n}): {\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null {\n const guidance = resolveOpenClawDiagnosticsGuidance({\n diagnostics: input.diagnostics,\n profileId: input.profileId,\n });\n if (input.diagnostics.bootstrapStatus !== \"healthy\") {\n return {\n message: guidance.summary,\n reasonCode: \"controller.bootstrap.failed\",\n };\n }\n if (\n input.diagnostics.gatewayHealth !== \"healthy\" ||\n input.diagnostics.gatewayVisibility === \"not_checked\" ||\n input.diagnostics.gatewayVisibility === \"not_visible\" ||\n input.diagnostics.gatewayVisibility === \"restart_failed\"\n ) {\n return {\n message: guidance.summary,\n reasonCode: \"controller.gateway.unhealthy\",\n };\n }\n return null;\n}\n\nexport function formatDeviceReplyReadinessLabel(\n input: DeviceReplyReadinessStatus\n): string {\n return formatReplyReadinessSummary({\n replyReadiness: input.replyReadiness,\n reasonText: input.reasonText,\n reasonCodes: input.reasonCodes,\n });\n}\n\nexport function formatReplyReadinessSummary(input: {\n replyReadiness: ReplyReadinessLevel;\n reasonText: string;\n reasonCodes?: readonly ReplyReadinessReasonCode[];\n}): string {\n if (input.replyReadiness === \"ready\") {\n return REPLY_READINESS_COPY.canReplyLabel;\n }\n if (input.reasonCodes?.[0] === \"profile.unbound\") {\n return formatReplyReadinessUnavailableLabelCopy(\n \"blocked\",\n resolveReplyReadinessAvailabilityReasonCopy(\"profile.unbound\")\n );\n }\n return formatReplyReadinessUnavailableLabelCopy(\n input.replyReadiness,\n input.reasonText\n );\n}\n\nexport function formatAgentReplyReadinessLabel(\n input: AgentReplyReadinessStatus\n): string {\n return formatReplyReadinessSummary({\n replyReadiness: input.replyReadiness,\n reasonText: input.reasonText,\n reasonCodes: input.reasonCodes,\n });\n}\n\nexport function formatHumanReplyReadinessReason(input: {\n replyReadiness: ReplyReadinessLevel;\n reasonText: string;\n reasonCodes?: readonly ReplyReadinessReasonCode[];\n}): string {\n if (\n input.replyReadiness === \"blocked\" &&\n input.reasonCodes?.[0] === \"profile.unbound\"\n ) {\n return formatManualSpaceParticipationReasonCopy(\n resolveReplyReadinessAvailabilityReasonCopy(\"profile.unbound\")\n );\n }\n return input.reasonText;\n}\n\nexport function mapAgentReplyReadinessToLegacyAutoReply(\n input: AgentReplyReadinessStatus\n): {\n ready: boolean;\n reason: string | null;\n} {\n return {\n ready: input.replyReadiness === \"ready\",\n reason: input.replyReadiness === \"ready\" ? null : input.reasonText,\n };\n}\n\nasync function resolveDeviceLocalDemand(input: {\n ownerUserId?: string | null;\n projection?: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand | null> {\n return await resolveLocalServiceDemand({\n ownerUserId: input.ownerUserId,\n projection: input.projection,\n runtimeWorkdir: input.runtimeWorkdir,\n }).catch(() => null);\n}\n\nasync function resolveEffectiveRuntimeStatus(input: {\n inventory?: DaemonServiceInventory | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n status: DaemonStatus;\n}): Promise<DaemonServiceRuntimeStatus[\"status\"] | \"not_installed\"> {\n if (!input.status.installed) {\n return \"not_installed\";\n }\n if (input.inventory) {\n return getEffectiveDaemonRuntimeStatus({\n runtimeState: input.inventory.runtimeStatus,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n });\n }\n if (!input.runtimeStatus) {\n return \"unknown\";\n }\n\n const { serviceManagerStatus } =\n await resolveDaemonServiceManagerForRuntimeState({\n runtimeState: input.runtimeStatus,\n status: input.status,\n });\n return getEffectiveDaemonRuntimeStatus({\n runtimeState: input.runtimeStatus,\n serviceManagerStatus,\n });\n}\n\nasync function resolveDeviceReadinessRuntimeProjection(\n runtimeProjection: DeviceRuntimeStateSyncResult | null | undefined\n): Promise<DeviceRuntimeStateSyncResult | null> {\n if (runtimeProjection !== undefined) {\n return runtimeProjection;\n }\n return await resolveReplyReadinessRuntimeProjection();\n}\n\nasync function resolveDeviceReadinessLocalDemand(input: {\n localDemand?: LocalServiceDemand | null;\n ownerUserId?: string | null;\n projection: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand | null> {\n if (input.localDemand !== undefined) {\n return input.localDemand;\n }\n return await resolveDeviceLocalDemand({\n ownerUserId: input.ownerUserId,\n projection: input.projection,\n runtimeWorkdir: input.runtimeWorkdir,\n });\n}\n\nasync function resolveReplyReadinessInventory(\n _status: DaemonStatus\n): Promise<DaemonServiceInventory | null> {\n return await inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intent: \"status_cleanup\",\n }).catch(() => null);\n}\n\nasync function resolveReplyReadinessRuntimeProjection(): Promise<DeviceRuntimeStateSyncResult | null> {\n return await syncDeviceRuntimeStateProjection({\n mode: \"check\",\n }).catch(() => null);\n}\n\nasync function resolveDeviceReplyReadinessFromServiceState(input: {\n inventory?: DaemonServiceInventory | null;\n localDemand: LocalServiceDemand | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n status: DaemonStatus;\n}): Promise<DeviceReplyReadinessStatus | null> {\n const wakeability = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const effectiveRuntimeStatus = await resolveEffectiveRuntimeStatus({\n inventory: input.inventory,\n runtimeStatus: input.runtimeStatus,\n status: input.status,\n });\n if (effectiveRuntimeStatus === \"stale\") {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_running\",\n reasonText: resolveReplyReadinessReconnectingReasonCopy(),\n replyReadiness: \"degraded\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n if (effectiveRuntimeStatus !== \"running\") {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_running\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"service.not_running\"\n ),\n replyReadiness:\n effectiveRuntimeStatus === \"unknown\" ? \"unknown\" : \"blocked\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n if (wakeability.blocksWake) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.drifted\",\n reasonText:\n resolveReplyReadinessAvailabilityReasonCopy(\"service.drifted\"),\n replyReadiness: \"blocked\",\n serviceWakeability: wakeability,\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n return null;\n}\n\nfunction resolveDeviceReplyReadinessFromRuntimeProjection(\n runtimeProjection?: DeviceRuntimeStateSyncResult | null\n): DeviceReplyReadinessStatus | null {\n if (runtimeProjection?.status !== \"degraded\") {\n return null;\n }\n if (runtimeProjection.missingControllerIds.length > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"projection.missing\",\n reasonText:\n resolveReplyReadinessAvailabilityReasonCopy(\"projection.missing\"),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n if (runtimeProjection.disabledControllerIds.length > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"controller.registry.disabled\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"controller.registry.disabled\"\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n if ((runtimeProjection.repairRequiredControllerIds?.length ?? 0) > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"controller.launch.needs_repair\",\n reasonText: resolveReplyReadinessGuidanceSummaryCopy(\n \"controller.launch.needs_repair\",\n {\n targetLabel: REPLY_READINESS_COPY.localAgentRecoveryTargetLabel,\n }\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n return null;\n}\n\nfunction createRouteNotRegisteredReplyReadinessStatus(input: {\n localDemand: LocalServiceDemand | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n}): DeviceReplyReadinessStatus {\n const projectionWithoutLocalDemand =\n input.localDemand?.projection ?? input.runtimeProjection;\n const noProjectedLocalControllers = hasNoProjectedLocalControllers(\n projectionWithoutLocalDemand\n );\n if (\n input.localDemand?.reason === \"owner user is unavailable\" &&\n !noProjectedLocalControllers\n ) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"profile.not_selected\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"profile.not_selected\"\n ),\n replyReadiness: \"unknown\",\n wakeableRouteCount: 0,\n });\n }\n const reasonCode =\n input.runtimeProjection?.status === \"skipped\" || noProjectedLocalControllers\n ? \"local_agents.none_needed\"\n : \"route.not_registered\";\n return createDeviceReplyReadinessStatus({\n reasonCode,\n reasonText:\n normalizeOptionalText(\n input.localDemand?.reason ?? input.runtimeProjection?.reason\n ) ?? resolveReplyReadinessAvailabilityReasonCopy(reasonCode),\n replyReadiness:\n input.runtimeProjection?.status === \"skipped\" ||\n noProjectedLocalControllers\n ? \"unknown\"\n : \"blocked\",\n wakeableRouteCount: 0,\n });\n}\n\nfunction hasNoProjectedLocalControllers(\n projection: DeviceRuntimeStateSyncResult | null | undefined\n): boolean {\n return (\n projection?.status === \"ok\" &&\n projection.projectedControllerIds.length === 0\n );\n}\n\nfunction createDeviceReplyReadinessStatus(input: {\n reasonCode?: ReplyReadinessReasonCode;\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n serviceWakeability?: DeviceReplyReadinessStatus[\"serviceWakeability\"];\n wakeableRouteCount: number;\n}): DeviceReplyReadinessStatus {\n return {\n reasonCodes: sortReplyReadinessReasonCodes(\n input.reasonCode ? [input.reasonCode] : []\n ),\n reasonText: input.reasonText,\n replyReadiness: input.replyReadiness,\n ...(input.serviceWakeability\n ? { serviceWakeability: input.serviceWakeability }\n : {}),\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: input.wakeableRouteCount,\n };\n}\n\nfunction createAgentReplyReadinessStatus(input: {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n localAgentId: string | null;\n profileId: string;\n reasonCodes?: ReplyReadinessReasonCode[];\n reasonText: string;\n transportMode: string | null;\n replyReadiness: ReplyReadinessLevel;\n}): AgentReplyReadinessStatus {\n return {\n deviceReplyReadiness: input.deviceReplyReadiness,\n localAgentId: input.localAgentId,\n profileId: input.profileId,\n reasonCodes: sortReplyReadinessReasonCodes(input.reasonCodes ?? []),\n reasonText: input.reasonText,\n replyReadiness: input.replyReadiness,\n transportMode: input.transportMode,\n updatedAt: new Date().toISOString(),\n };\n}\n\nfunction resolveReplyReadinessLevel(\n reasonCodes: ReplyReadinessReasonCode[],\n deviceReplyReadiness: DeviceReplyReadinessStatus\n): ReplyReadinessLevel {\n if (reasonCodes.length === 0) {\n return \"ready\";\n }\n if (\n deviceReplyReadiness.replyReadiness === \"degraded\" &&\n reasonCodes[0] === \"service.not_running\"\n ) {\n return \"degraded\";\n }\n if (deviceReplyReadiness.replyReadiness === \"unknown\") {\n return \"unknown\";\n }\n return \"blocked\";\n}\n\nfunction pushReasonCode(\n target: ReplyReadinessReasonCode[],\n reasonCode: ReplyReadinessReasonCode\n): void {\n if (target.includes(reasonCode)) {\n return;\n }\n target.push(reasonCode);\n}\n\nfunction sortReplyReadinessReasonCodes(\n reasonCodes: ReplyReadinessReasonCode[]\n): ReplyReadinessReasonCode[] {\n return [...reasonCodes].sort(\n (left, right) =>\n REPLY_READINESS_REASON_PRIORITY.indexOf(left) -\n REPLY_READINESS_REASON_PRIORITY.indexOf(right)\n );\n}\n\nfunction describeReplyReadinessReason(\n reasonCode: ReplyReadinessReasonCode\n): string {\n return resolveReplyReadinessStatusReasonCopy(reasonCode);\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function isOpenClawAgentControllerReport(input: {\n capabilityId?: string | null;\n localAgentId?: string | null;\n}): boolean {\n return input.localAgentId === \"openclaw\" || input.capabilityId === \"openclaw\";\n}\n","import type { RuntimeTransportLookupRouteResponse } from \"@openmeld/schemas/types\";\nimport { buildDaemonRouteObservationPresentation } from \"@openmeld/start\";\nimport {\n DaemonRouteObservationFetchError,\n fetchDaemonRouteObservation,\n} from \"../config/daemon-route-observation-api\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../config/daemon-state\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport type { OpenMeldProfile } from \"../config/openmeld-profiles-api\";\nimport { buildOpenMeldRequestContextFromProfile } from \"../config/openmeld-request-context\";\nimport { resolveOpenMeldEnvPreset } from \"../config/paths\";\nimport type { RouteCatalog } from \"../local-service/core/types\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport type { DaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type {\n DaemonServiceManager,\n DaemonServiceManagerRuntimeStatus,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveLocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport type { DeviceRuntimeStateSyncResult } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { syncDeviceRuntimeStateProjection } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { readDaemonRouteCatalogCache } from \"../local-service/state/route-catalog-cache\";\nimport { resolveEffectiveProfileWorkingFolderRuntime } from \"../profile-workspace/effective-runtime-resolution\";\nimport type {\n OpenClawDiagnosticsMode,\n OpenClawLocalDiagnosticsState,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport {\n createOpenClawLocalDiagnosticsFailure,\n resolveOpenClawLocalDiagnostics,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport {\n type AgentProfilePrimaryAgentControllerReport,\n resolveAgentProfilePrimaryAgentControllerReport,\n} from \"./agent-profile-primary-binding\";\nimport {\n createExpectedRoutesReadSession,\n type ExpectedRoutesReadSession,\n} from \"./expected-routes-read-session\";\nimport type {\n GatewayChainProfile,\n GatewayChainReadiness,\n} from \"./gateway-chain-readiness\";\nimport { resolveGatewayChainReadiness } from \"./gateway-chain-readiness\";\nimport {\n createPrimaryBindingReadSession,\n type PrimaryBindingReadSession,\n} from \"./primary-binding-read-session\";\nimport {\n type AgentReplyReadinessStatus,\n type DeviceReplyReadinessStatus,\n isOpenClawAgentControllerReport,\n resolveAgentReplyReadinessStatus,\n resolveDeviceReplyReadinessStatus,\n} from \"./reply-readiness\";\n\nexport type CurrentReplyReadinessSnapshot = {\n daemonRouteObservation: DaemonRouteObservation;\n observedAt: string;\n daemonStatus: DaemonStatus;\n inventory: DaemonServiceInventory | null;\n runtimeProjection: DeviceRuntimeStateSyncResult | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n displayRuntimeStatus: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n gatewayChainReadiness: GatewayChainReadiness | null;\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n agentReplyReadiness: AgentReplyReadinessStatus | null;\n openClawLocalDiagnostics: OpenClawLocalDiagnosticsState | null;\n profileWorkspaceRuntimeResolution: ReturnType<\n typeof resolveEffectiveProfileWorkingFolderRuntime\n > extends Promise<infer TValue>\n ? TValue | null\n : never;\n};\n\nexport type CurrentReplyReadinessLocalServiceObservation = {\n daemonStatus: DaemonStatus;\n inventory: DaemonServiceInventory | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n};\n\nexport type DaemonRouteObservation =\n | {\n detail: null;\n observedAt: string;\n profileId: string;\n reasonCode: \"online\";\n route: RuntimeTransportLookupRouteResponse;\n status: \"online\";\n }\n | {\n detail: string;\n observedAt: string;\n profileId: string;\n reasonCode: \"route.not_registered\";\n route: RuntimeTransportLookupRouteResponse;\n status: \"offline\";\n }\n | {\n detail: string;\n observedAt: string;\n profileId: string | null;\n reasonCode:\n | \"lookup_failed\"\n | \"not_requested\"\n | \"profile_not_agent\"\n | \"profile_not_selected\"\n | \"server_unsupported\";\n route: null;\n status: \"unavailable\";\n };\n\nexport async function resolveCurrentReplyReadinessSnapshot(\n input: {\n baseUrl?: string;\n checkGatewayChain?: boolean;\n gatewayChainProfile?: GatewayChainProfile | null;\n gatewayChainTimeoutMs?: number;\n includeDaemonRouteObservation?: boolean;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n openClawDiagnosticsMode?: OpenClawDiagnosticsMode | null;\n ownerUserId?: string | null;\n preferActiveServiceRouteCatalog?: boolean;\n profile?: OpenMeldProfile | null;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n } = {}\n): Promise<CurrentReplyReadinessSnapshot> {\n const daemonStatus = await resolveDaemonStatusForSnapshot(\n input.localServiceObservation\n );\n // One snapshot = one binding read per profile: the runtime projection\n // check, the local-service demand catalog, and the agent readiness lookup\n // all share this operation-scoped session instead of re-fanning out.\n const bindingReads = createPrimaryBindingReadSession({\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n });\n const expectedRoutesRead = createExpectedRoutesReadSession({\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n });\n const primaryAgentControllerReportPromise =\n input.primaryAgentControllerReport !== undefined\n ? Promise.resolve(input.primaryAgentControllerReport)\n : resolvePrimaryAgentControllerReportForSnapshot({\n baseUrl: input.baseUrl,\n bindingReads,\n profile: input.profile ?? null,\n });\n const daemonRouteObservationPromise = resolveDaemonRouteObservation({\n baseUrl: input.baseUrl,\n includeDaemonRouteObservation: input.includeDaemonRouteObservation === true,\n profile: input.profile ?? null,\n });\n const inventoryPromise = resolveInventoryForSnapshot(\n input.localServiceObservation\n );\n const ownerUserId = input.ownerUserId ?? input.profile?.ownerUserId ?? null;\n const activeServiceRouteCatalogPromise = inventoryPromise.then(\n async (inventory) =>\n await resolveActiveServiceRouteCatalogForSnapshot({\n enabled: input.preferActiveServiceRouteCatalog === true,\n inventory,\n ownerUserId,\n })\n );\n const runtimeProjectionPromise = resolveRuntimeProjectionForSnapshot({\n activeServiceRouteCatalog: activeServiceRouteCatalogPromise,\n bindingReads,\n daemonStatus,\n expectedRoutesRead,\n runtimeProjection: input.runtimeProjection,\n });\n const runtimeStatusPromise = resolveRuntimeStatusForSnapshot({\n daemonStatus,\n localServiceObservation: input.localServiceObservation,\n });\n const profileWorkspaceRuntimeResolutionPromise =\n resolveProfileWorkspaceRuntimeForSnapshot(input.profile ?? null);\n const runtimeStatus = await runtimeStatusPromise;\n const { serviceManager, serviceManagerStatus } =\n await resolveServiceManagerForSnapshot({\n daemonStatus,\n localServiceObservation: input.localServiceObservation,\n runtimeStatus,\n });\n const [\n runtimeProjection,\n inventory,\n profileWorkspaceRuntimeResolution,\n activeServiceRouteCatalog,\n ] = await Promise.all([\n runtimeProjectionPromise,\n inventoryPromise,\n profileWorkspaceRuntimeResolutionPromise,\n activeServiceRouteCatalogPromise,\n ]);\n const displayRuntimeStatus = enrichRuntimeStateWithManager({\n runtimeState: runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n });\n const localDemand = await resolveLocalServiceDemand({\n bindingReads,\n expectedRoutesRead,\n ownerUserId,\n projection: runtimeProjection,\n ...(activeServiceRouteCatalog\n ? { routeCatalog: activeServiceRouteCatalog }\n : {}),\n runtimeWorkdir: input.runtimeWorkdir,\n }).catch(() => null);\n const localDeviceReplyReadiness = await resolveDeviceReplyReadinessStatus({\n baseUrl: input.baseUrl,\n checkGatewayChain: false,\n gatewayChainProfile: input.gatewayChainProfile,\n gatewayChainReadiness: null,\n gatewayChainTimeoutMs: input.gatewayChainTimeoutMs,\n inventory,\n localDemand,\n ownerUserId,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n runtimeProjection,\n runtimeStatus: displayRuntimeStatus ?? runtimeStatus,\n runtimeWorkdir: input.runtimeWorkdir,\n status: daemonStatus,\n }).catch(() =>\n createFallbackDeviceReplyReadiness({\n daemonStatus,\n runtimeStatus: displayRuntimeStatus ?? runtimeStatus,\n })\n );\n const shouldProbeGatewayChain =\n input.checkGatewayChain === true &&\n !isWakeableLocalReplyReady(localDeviceReplyReadiness) &&\n !localDeviceReplyReadiness.reasonCodes.some(\n (reasonCode) =>\n reasonCode === \"service.drifted\" ||\n reasonCode === \"service.not_installed\" ||\n reasonCode === \"service.not_running\" ||\n reasonCode === \"workspace.invalid\" ||\n reasonCode === \"workspace.missing\"\n );\n const gatewayChainReadiness = shouldProbeGatewayChain\n ? await resolveGatewayChainReadiness({\n baseUrl: input.baseUrl,\n profile:\n input.gatewayChainProfile ??\n (input.profile\n ? {\n openMeldProfileId: input.profile.openMeldProfileId,\n profileName: input.profile.profileName,\n }\n : null),\n timeoutMs: input.gatewayChainTimeoutMs,\n }).catch(() => null)\n : null;\n const deviceReplyReadiness = localDeviceReplyReadiness;\n const openClawLocalDiagnostics =\n await resolveOpenClawLocalDiagnosticsForSnapshot({\n mode: input.openClawDiagnosticsMode ?? null,\n primaryAgentControllerReport: primaryAgentControllerReportPromise,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n });\n const [daemonRouteObservation, primaryAgentControllerReport] =\n await Promise.all([\n daemonRouteObservationPromise,\n primaryAgentControllerReportPromise,\n ]);\n const agentReplyReadiness =\n input.profile?.profileKind === \"agent\"\n ? await resolveAgentReplyReadinessStatus({\n bindingReads,\n coreWakeRouteOnline: daemonRouteObservation.status === \"online\",\n deviceReplyReadiness,\n openClawLocalDiagnostics,\n primaryAgentControllerReport,\n profile: input.profile,\n profileWorkspaceRuntimeResolution,\n }).catch(() => null)\n : null;\n\n return {\n daemonRouteObservation,\n observedAt: new Date().toISOString(),\n daemonStatus,\n inventory,\n runtimeProjection,\n runtimeStatus,\n displayRuntimeStatus,\n serviceManagerStatus,\n gatewayChainReadiness,\n deviceReplyReadiness,\n agentReplyReadiness,\n openClawLocalDiagnostics,\n profileWorkspaceRuntimeResolution,\n };\n}\n\nfunction resolveDaemonStatusForSnapshot(\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation\n): Promise<DaemonStatus> {\n if (localServiceObservation) {\n return Promise.resolve(localServiceObservation.daemonStatus);\n }\n return getDaemonStatus();\n}\n\nfunction resolveRuntimeStatusForSnapshot(input: {\n daemonStatus: DaemonStatus;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n}): Promise<DaemonServiceRuntimeStatus | null> {\n if (input.localServiceObservation) {\n return Promise.resolve(input.localServiceObservation.runtimeStatus);\n }\n return resolveDaemonRuntimeState(input.daemonStatus).catch(() => null);\n}\n\nasync function resolveInventoryForSnapshot(\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation\n): Promise<DaemonServiceInventory | null> {\n if (localServiceObservation) {\n return Promise.resolve(localServiceObservation.inventory);\n }\n return inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intent: \"status_cleanup\",\n }).catch(() => null);\n}\n\nasync function resolveServiceManagerForSnapshot(input: {\n daemonStatus: DaemonStatus;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n}): Promise<{\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}> {\n if (input.localServiceObservation) {\n return {\n serviceManager:\n input.localServiceObservation.inventory?.serviceManager ?? null,\n serviceManagerStatus: input.localServiceObservation.serviceManagerStatus,\n };\n }\n return await resolveDaemonServiceManagerForRuntimeState({\n runtimeState: input.runtimeStatus,\n status: input.daemonStatus,\n }).catch(() => ({\n serviceManager: null,\n serviceManagerStatus: null,\n legacySharedService: null,\n }));\n}\n\nfunction isWakeableLocalReplyReady(\n localDeviceReplyReadiness: DeviceReplyReadinessStatus\n): boolean {\n return (\n localDeviceReplyReadiness.replyReadiness === \"ready\" &&\n localDeviceReplyReadiness.wakeableRouteCount > 0\n );\n}\n\nasync function resolveRuntimeProjectionForSnapshot(input: {\n activeServiceRouteCatalog: Promise<RouteCatalog | null>;\n bindingReads: PrimaryBindingReadSession;\n daemonStatus: DaemonStatus;\n expectedRoutesRead: ExpectedRoutesReadSession;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n}): Promise<DeviceRuntimeStateSyncResult | null> {\n if (!input.daemonStatus.installed) {\n return null;\n }\n if (input.runtimeProjection !== undefined) {\n return input.runtimeProjection;\n }\n if (await input.activeServiceRouteCatalog) {\n return {\n status: \"skipped\",\n mode: \"check\",\n projectedControllerIds: [],\n missingControllerIds: [],\n disabledControllerIds: [],\n repairedControllerIds: [],\n reason: \"active service route catalog already exists\",\n };\n }\n return await syncDeviceRuntimeStateProjection({\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n mode: \"check\",\n }).catch(() => null);\n}\n\nasync function resolveActiveServiceRouteCatalogForSnapshot(input: {\n enabled: boolean;\n inventory: DaemonServiceInventory | null;\n ownerUserId: string | null;\n}): Promise<RouteCatalog | null> {\n const serviceBundleId = input.inventory?.activeBundle?.bundleId ?? null;\n if (!(input.enabled && input.ownerUserId && serviceBundleId)) {\n return null;\n }\n return await readDaemonRouteCatalogCache({\n lane: resolveOpenMeldEnvPreset(),\n ownerUserId: input.ownerUserId,\n serviceBundleId,\n }).catch(() => null);\n}\n\nfunction resolveProfileWorkspaceRuntimeForSnapshot(\n profile: OpenMeldProfile | null\n): Promise<CurrentReplyReadinessSnapshot[\"profileWorkspaceRuntimeResolution\"]> {\n if (profile?.profileKind !== \"agent\") {\n return Promise.resolve(null);\n }\n return resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: profile.defaultProjectId,\n openMeldProfileId: profile.openMeldProfileId,\n mode: \"inspect\",\n });\n}\n\nasync function resolveOpenClawLocalDiagnosticsForSnapshot(input: {\n mode: OpenClawDiagnosticsMode | null;\n primaryAgentControllerReport: Promise<AgentProfilePrimaryAgentControllerReport | null>;\n profile: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution: CurrentReplyReadinessSnapshot[\"profileWorkspaceRuntimeResolution\"];\n}): Promise<OpenClawLocalDiagnosticsState | null> {\n if (\n input.profile?.profileKind !== \"agent\" ||\n !input.mode ||\n input.profileWorkspaceRuntimeResolution?.status !== \"ready\"\n ) {\n return null;\n }\n\n const primaryAgentControllerReport = await input.primaryAgentControllerReport;\n if (!isOpenClawAgentControllerReport(primaryAgentControllerReport ?? {})) {\n return null;\n }\n\n return resolveOpenClawLocalDiagnostics({\n mode: input.mode,\n profile: input.profile,\n providerRuntimeWorkingDirectory:\n input.profileWorkspaceRuntimeResolution.effectiveRuntimeWorkingDirectory,\n }).catch((error) => createOpenClawLocalDiagnosticsFailure(error));\n}\n\nfunction resolvePrimaryAgentControllerReportForSnapshot(input: {\n baseUrl?: string;\n bindingReads: PrimaryBindingReadSession;\n profile: OpenMeldProfile | null;\n}): Promise<AgentProfilePrimaryAgentControllerReport | null> {\n if (input.profile?.profileKind !== \"agent\") {\n return Promise.resolve(null);\n }\n return resolveAgentProfilePrimaryAgentControllerReport({\n baseUrl: input.baseUrl,\n bindingReads: input.bindingReads,\n profile: input.profile,\n }).catch(() => null);\n}\n\nasync function resolveDaemonRouteObservation(input: {\n baseUrl?: string;\n includeDaemonRouteObservation: boolean;\n profile: OpenMeldProfile | null;\n}): Promise<DaemonRouteObservation> {\n const observedAt = new Date().toISOString();\n if (!input.includeDaemonRouteObservation) {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"not_requested\",\n }),\n observedAt,\n profileId: input.profile?.openMeldProfileId ?? null,\n reasonCode: \"not_requested\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n if (!input.profile) {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"profile_not_selected\",\n }),\n observedAt,\n profileId: null,\n reasonCode: \"profile_not_selected\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n if (input.profile.profileKind !== \"agent\") {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"profile_not_agent\",\n }),\n observedAt,\n profileId: input.profile.openMeldProfileId,\n reasonCode: \"profile_not_agent\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n try {\n const response = await fetchDaemonRouteObservation({\n requestContext: buildOpenMeldRequestContextFromProfile({\n openMeldProfile: input.profile,\n }),\n baseUrl: input.baseUrl,\n profileId: input.profile.openMeldProfileId,\n });\n if (response.route.online) {\n return {\n detail: null,\n observedAt: response.observedAt,\n profileId: response.profileId,\n reasonCode: \"online\",\n route: response.route,\n status: \"online\",\n };\n }\n return {\n detail: `Server can't currently see an active reply route for this agent profile (server reported ${response.route.reasonCode}).`,\n observedAt: response.observedAt,\n profileId: response.profileId,\n reasonCode: \"route.not_registered\",\n route: response.route,\n status: \"offline\",\n };\n } catch (error) {\n const reasonCode =\n error instanceof DaemonRouteObservationFetchError\n ? error.code\n : \"lookup_failed\";\n const detail =\n reasonCode === \"server_unsupported\"\n ? buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"server_unsupported\",\n })\n : buildLookupFailedRouteObservationDetail({\n error,\n observedAt,\n });\n return {\n detail,\n observedAt,\n profileId: input.profile.openMeldProfileId,\n reasonCode,\n route: null,\n status: \"unavailable\",\n };\n }\n}\n\nfunction buildCanonicalUnavailableRouteObservationDetail(input: {\n observedAt: string;\n reasonCode:\n | \"lookup_failed\"\n | \"not_requested\"\n | \"profile_not_agent\"\n | \"profile_not_selected\"\n | \"server_unsupported\";\n}): string {\n const detail = buildDaemonRouteObservationPresentation({\n observedAt: input.observedAt,\n reasonCode: input.reasonCode,\n status: \"unavailable\",\n }).detail;\n if (!detail) {\n throw new Error(\n `missing unavailable reply route detail for ${input.reasonCode}`\n );\n }\n return detail;\n}\n\nfunction buildLookupFailedRouteObservationDetail(input: {\n error: unknown;\n observedAt: string;\n}): string {\n const detail = buildCanonicalUnavailableRouteObservationDetail({\n observedAt: input.observedAt,\n reasonCode: \"lookup_failed\",\n });\n const rawError = toErrorMessage(input.error).trim();\n if (rawError.length === 0 || rawError === detail) {\n return detail;\n }\n return `${detail} Raw lookup error: ${rawError}`;\n}\n\nfunction createFallbackDeviceReplyReadiness(input: {\n daemonStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n}): DeviceReplyReadinessStatus {\n if (!input.daemonStatus.installed) {\n return {\n reasonCodes: [\"service.not_installed\"],\n reasonText: \"OpenMeld Service is not installed on this device\",\n replyReadiness: \"blocked\",\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: 0,\n };\n }\n\n return {\n reasonCodes:\n input.runtimeStatus?.status === \"stale\" ? [\"service.not_running\"] : [],\n reasonText:\n input.runtimeStatus?.status === \"stale\"\n ? \"OpenMeld Service is reconnecting on this device\"\n : \"OpenMeld couldn't confirm current reply readiness on this device\",\n replyReadiness:\n input.runtimeStatus?.status === \"stale\" ? \"degraded\" : \"unknown\",\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: 0,\n };\n}\n\nfunction enrichRuntimeStateWithManager(input: {\n runtimeState: DaemonServiceRuntimeStatus | null;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): DaemonServiceRuntimeStatus | null {\n if (!input.runtimeState) {\n return null;\n }\n return {\n ...input.runtimeState,\n managedBySystemService:\n input.runtimeState.managedBySystemService ||\n input.serviceManagerStatus?.installed === true,\n serviceController:\n input.runtimeState.serviceController === \"unknown\" &&\n input.serviceManager?.controller !== undefined\n ? input.serviceManager.controller\n : input.runtimeState.serviceController,\n };\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 { join } from \"node:path\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport type { DaemonServiceDependencyIssue } from \"../../local-service/lifecycle/daemon-service-dependency-diagnostics\";\nimport { dirnamePath, normalizeOptionalText } from \"../core/logger\";\n\nconst DAEMON_START_FAILURE_STATE_FILE = \"daemon-start-failure-state.json\";\nconst DAEMON_START_FAILURE_STATE_SCHEMA = \"daemon.start.failure.state\" as const;\n\nexport type DaemonStartFailureStateReason =\n | \"service_dependencies_unavailable\"\n | \"startup_failed\";\n\nexport type DaemonStartFailureState = {\n schema: typeof DAEMON_START_FAILURE_STATE_SCHEMA;\n v: 1;\n recordedAt: string;\n reason: DaemonStartFailureStateReason;\n detail: string;\n rawLogLine: string | null;\n dependencyIssues: DaemonServiceDependencyIssue[];\n lane: OpenMeldEnvPreset;\n};\n\nexport function daemonStartFailureStatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"data\",\n DAEMON_START_FAILURE_STATE_FILE\n );\n}\n\nexport async function readDaemonStartFailureState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonStartFailureState | null> {\n const raw = await readFile(\n daemonStartFailureStatePath(pathInput),\n \"utf8\"\n ).catch(() => null);\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return parseDaemonStartFailureState(parsed);\n}\n\nexport async function writeDaemonStartFailureState(input: {\n recordedAt?: string;\n pathInput?: OpenMeldPathResolutionInput;\n reason: DaemonStartFailureStateReason;\n detail: string;\n rawLogLine?: string | null;\n dependencyIssues?: DaemonServiceDependencyIssue[];\n}): Promise<DaemonStartFailureState> {\n const lane = resolveOpenMeldEnvPreset(input.pathInput);\n const state: DaemonStartFailureState = {\n schema: DAEMON_START_FAILURE_STATE_SCHEMA,\n v: 1,\n recordedAt: input.recordedAt ?? new Date().toISOString(),\n reason: input.reason,\n detail: input.detail,\n rawLogLine: normalizeOptionalText(input.rawLogLine) ?? null,\n dependencyIssues: normalizeDependencyIssues(input.dependencyIssues ?? []),\n lane,\n };\n await writeJsonAtomic({\n path: daemonStartFailureStatePath(input.pathInput),\n value: state,\n });\n return state;\n}\n\nexport async function clearDaemonStartFailureState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(daemonStartFailureStatePath(pathInput), {\n force: true,\n }).catch(() => undefined);\n}\n\nfunction parseDaemonStartFailureState(\n value: unknown\n): DaemonStartFailureState | null {\n if (!isRecord(value)) {\n return null;\n }\n if (value.schema !== DAEMON_START_FAILURE_STATE_SCHEMA || value.v !== 1) {\n return null;\n }\n const recordedAt = normalizeOptionalText(value.recordedAt);\n const detail = normalizeOptionalText(value.detail);\n const lane = value.lane;\n const reason = value.reason;\n const rawLogLine =\n value.rawLogLine === null ? null : normalizeOptionalText(value.rawLogLine);\n if (\n !(recordedAt && detail) ||\n (lane !== \"prod\" && lane !== \"dev-local\" && lane !== \"canary\") ||\n (reason !== \"service_dependencies_unavailable\" &&\n reason !== \"startup_failed\")\n ) {\n return null;\n }\n const dependencyIssues = normalizeDependencyIssues(\n Array.isArray(value.dependencyIssues) ? value.dependencyIssues : []\n );\n return {\n schema: DAEMON_START_FAILURE_STATE_SCHEMA,\n v: 1,\n recordedAt,\n reason,\n detail,\n rawLogLine,\n dependencyIssues,\n lane,\n };\n}\n\nfunction normalizeDependencyIssues(\n issues: unknown[]\n): DaemonServiceDependencyIssue[] {\n const normalized: DaemonServiceDependencyIssue[] = [];\n for (const issue of issues) {\n if (!isRecord(issue)) {\n continue;\n }\n const kind = issue.kind;\n const status = issue.status;\n const scope = issue.scope;\n const baseUrl = normalizeOptionalText(issue.baseUrl);\n const probeUrl = normalizeOptionalText(issue.probeUrl);\n const httpStatus =\n typeof issue.httpStatus === \"number\" ? issue.httpStatus : null;\n if (\n (kind !== \"auth\" && kind !== \"gateway\") ||\n (status !== \"unhealthy_http\" && status !== \"unreachable\") ||\n (scope !== \"loopback\" && scope !== \"remote\") ||\n !baseUrl ||\n !probeUrl\n ) {\n continue;\n }\n normalized.push({\n kind,\n status,\n scope,\n baseUrl,\n probeUrl,\n httpStatus,\n });\n }\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function writeJsonAtomic(input: {\n path: string;\n value: unknown;\n}): Promise<void> {\n await mkdir(dirnamePath(input.path), {\n recursive: true,\n });\n const tempPath = `${input.path}.tmp-${Date.now()}-${process.pid}`;\n await writeFile(\n tempPath,\n `${JSON.stringify(input.value, null, 2)}\\n`,\n \"utf8\"\n );\n await rename(tempPath, input.path).catch(async (error) => {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n });\n}\n","import { formatOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\nimport { classifyDaemonServiceWakeability } from \"./daemon-service-anomaly-groups\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\n\nexport type DaemonServiceFreshnessStatus = \"current\" | \"update_available\";\n\nexport type DaemonServiceFreshnessWarning = {\n anomalyCodes: DaemonServiceAnomalyCode[];\n blocksWake: false;\n code: \"service_update_available\" | \"service_repair_recommended\";\n detailText: string;\n executionEvidenceSafe: boolean;\n level: \"info\" | \"warning\";\n nextStep: string;\n nextSteps: [string];\n status: \"update_available\";\n summaryText: \"Update OpenMeld Service\" | \"Reconnect OpenMeld Service\";\n title: \"Update OpenMeld Service\" | \"Reconnect OpenMeld Service\";\n};\n\nconst UPDATE_AVAILABLE_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"version_outdated\",\n \"bundle_content_drift\",\n \"bundle_version_drift\",\n \"bundle_strategy_legacy\",\n]);\nconst OPENMELD_COMMAND_PREFIX_RE = /^openmeld/u;\n\nexport function resolveDaemonServiceFreshnessWarning(input: {\n cliEntry?: string | null;\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceFreshnessWarning | null {\n const inventory = input.inventory;\n if (!inventory) {\n return null;\n }\n\n const wakeability = classifyDaemonServiceWakeability({ inventory });\n if (wakeability.blocksWake || wakeability.advisoryCodes.length === 0) {\n return null;\n }\n\n return resolveDaemonServiceFreshnessWarningForAnomalyCodes({\n anomalyCodes: wakeability.advisoryCodes,\n cliEntry: input.cliEntry,\n executionEvidenceSafe: wakeability.executionEvidenceSafe,\n });\n}\n\nexport function resolveDaemonServiceFreshnessWarningForAnomalyCodes(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n cliEntry?: string | null;\n executionEvidenceSafe?: boolean;\n}): DaemonServiceFreshnessWarning | null {\n const anomalyCodes = dedupeAnomalyCodes(input.anomalyCodes);\n if (anomalyCodes.length === 0) {\n return null;\n }\n const usesUpdateCommand = anomalyCodes.some((code) =>\n UPDATE_AVAILABLE_ANOMALIES.has(code)\n );\n const command = formatServiceCommand({\n cliEntry: input.cliEntry,\n command: \"openmeld setup\",\n });\n\n if (usesUpdateCommand) {\n return {\n anomalyCodes,\n blocksWake: false,\n code: \"service_update_available\",\n detailText:\n \"OpenMeld Service is running, but its local service bundle is not current. Update OpenMeld Service before this computer receives new local Wake work.\",\n executionEvidenceSafe: input.executionEvidenceSafe ?? true,\n level: \"info\",\n nextStep: `Run \\`${command}\\` to update OpenMeld Service.`,\n nextSteps: [command],\n status: \"update_available\",\n summaryText: \"Update OpenMeld Service\",\n title: \"Update OpenMeld Service\",\n };\n }\n\n return {\n anomalyCodes,\n blocksWake: false,\n code: \"service_repair_recommended\",\n detailText:\n \"OpenMeld Service is running, but its local service setup does not fully match this OpenMeld lane. Reconnect OpenMeld Service before this computer receives new local Wake work.\",\n executionEvidenceSafe: input.executionEvidenceSafe ?? true,\n level: \"warning\",\n nextStep: `Run \\`${command}\\` to reconnect OpenMeld Service.`,\n nextSteps: [command],\n status: \"update_available\",\n summaryText: \"Reconnect OpenMeld Service\",\n title: \"Reconnect OpenMeld Service\",\n };\n}\n\nfunction dedupeAnomalyCodes(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): DaemonServiceAnomalyCode[] {\n return [...new Set(anomalyCodes)];\n}\n\nfunction formatServiceCommand(input: {\n cliEntry?: string | null;\n command: \"openmeld setup\";\n}): string {\n const cliEntry = String(input.cliEntry ?? \"\").trim();\n if (cliEntry) {\n return input.command.replace(OPENMELD_COMMAND_PREFIX_RE, cliEntry);\n }\n const [command] = formatOpenMeldCliCommands([input.command]) as [string];\n return command;\n}\n","import { formatOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\n\nexport type DaemonServiceRepairGuidance = {\n nextSteps: [string];\n summary: string;\n};\n\nexport type DaemonServiceRefreshBlockedReason =\n | \"foreground_service_active\"\n | \"lifecycle_action_in_progress\";\n\nconst DAEMON_SERVICE_SETUP_COMMAND = \"openmeld setup\";\nconst DAEMON_SERVICE_REFRESH_SUMMARY = \"OpenMeld Service needs repair.\";\nconst DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE =\n \"Reconnect OpenMeld Service before this computer can receive local Wake work.\";\nconst DAEMON_SERVICE_UPDATE_REQUIRED_RUNNING_MESSAGE =\n \"OpenMeld Service is running, but this version is not safe for new Wake work. Update OpenMeld Service.\";\nconst DAEMON_SERVICE_UPDATE_REQUIRED_STOPPED_MESSAGE =\n \"OpenMeld Service must be updated before it can start safely.\";\n\nexport function formatDaemonServiceRefreshSummary(): string {\n return DAEMON_SERVICE_REFRESH_SUMMARY;\n}\n\nexport function formatDaemonServiceRefreshReliabilityMessage(): string {\n return DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE;\n}\n\nexport function formatDaemonServiceUpdateRequiredMessage(input: {\n serviceIsRunning: boolean;\n}): string {\n return input.serviceIsRunning\n ? DAEMON_SERVICE_UPDATE_REQUIRED_RUNNING_MESSAGE\n : DAEMON_SERVICE_UPDATE_REQUIRED_STOPPED_MESSAGE;\n}\n\nexport function buildDaemonServiceUpdateRequiredNextStep(input: {\n serviceIsRunning: boolean;\n}): string {\n const command = formatDaemonServiceUpdateCommand();\n return input.serviceIsRunning\n ? `Update OpenMeld Service with \\`${command}\\`.`\n : `Update OpenMeld Service with \\`${command}\\`.`;\n}\n\nexport function buildDaemonServiceRefreshReadinessDetail(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} This computer may still be running an older local OpenMeld Service build, so local Wake work may not be received reliably until it is repaired.`;\n}\n\nexport function buildDaemonServiceRefreshPromptMessage(): string {\n return \"Reconnect OpenMeld Service before this computer can receive local Wake work. OpenMeld can reconnect it for you now.\";\n}\n\nexport function buildDaemonServiceRefreshHandoffMessage(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} Run \\`${formatDaemonServiceRefreshCommand()}\\` in human view, then return to OpenMeld Web.`;\n}\n\nexport function buildDaemonServiceRefreshNextStep(): string {\n return `Run \\`${formatDaemonServiceRefreshCommand()}\\` to repair OpenMeld Service.`;\n}\n\nexport function buildDaemonServiceRefreshRetryNextStep(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} Run \\`${formatDaemonServiceRefreshCommand()}\\`, then retry.`;\n}\n\nexport function buildDaemonServiceStatusReadOnlyDetail(): string {\n return \"Status is read-only. It does not change OpenMeld Service.\";\n}\n\nexport function buildDaemonServiceTaskRetryNextStep(): string {\n return \"Try again after the current OpenMeld Service task finishes.\";\n}\n\nexport function buildDaemonServiceRefreshBlockedMessage(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n return `${DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE} ${buildDaemonServiceRefreshBlockedNextStep(input)}`;\n}\n\nexport function buildDaemonServiceRefreshBlockedNextStep(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n if (input.reason === \"lifecycle_action_in_progress\") {\n return buildDaemonServiceTaskRetryNextStep();\n }\n return `${formatDaemonServiceRefreshBlockedAction(input)}.`;\n}\n\nfunction formatDaemonServiceRefreshBlockedAction(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n const unblock =\n input.reason === \"foreground_service_active\"\n ? \"Stop the foreground service first\"\n : \"Wait for the current OpenMeld Service task to finish\";\n return `${unblock}, then run \\`${formatDaemonServiceRefreshCommand()}\\``;\n}\n\nexport function buildDaemonServiceRepairGuidance(): DaemonServiceRepairGuidance {\n return {\n nextSteps: [formatDaemonServiceRefreshCommand()],\n summary: buildDaemonServiceRefreshNextStep(),\n };\n}\n\nfunction formatDaemonServiceRefreshCommand(): string {\n const [reinstallCommand] = formatOpenMeldCliCommands([\n DAEMON_SERVICE_SETUP_COMMAND,\n ]) as [string];\n return reinstallCommand;\n}\n\nfunction formatDaemonServiceUpdateCommand(): string {\n const [updateCommand] = formatOpenMeldCliCommands([\n DAEMON_SERVICE_SETUP_COMMAND,\n ]) as [string];\n return updateCommand;\n}\n","import type { DaemonServiceRuntimeStatus } from \"../config/daemon-state\";\nimport {\n classifyDaemonServiceWakeability,\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES,\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES,\n DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES,\n} from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport {\n resolveDaemonServiceFreshnessWarning,\n resolveDaemonServiceFreshnessWarningForAnomalyCodes,\n} from \"../local-service/lifecycle/daemon-service-freshness\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n buildDaemonServiceRefreshBlockedMessage,\n buildDaemonServiceRefreshBlockedNextStep,\n buildDaemonServiceRefreshReadinessDetail,\n buildDaemonServiceRepairGuidance,\n buildDaemonServiceUpdateRequiredNextStep,\n formatDaemonServiceRefreshReliabilityMessage,\n formatDaemonServiceUpdateRequiredMessage,\n} from \"../local-service/lifecycle/daemon-service-repair-guidance\";\nimport {\n formatOpenMeldCliCommand,\n formatOpenMeldCliCommands,\n} from \"../runtime/cli-entry-command\";\nimport { resolveGatewayChainRepairGuidance } from \"./gateway-chain-readiness\";\nimport type {\n DeviceReplyReadinessStatus,\n ReplyReadinessReasonCode,\n} from \"./reply-readiness\";\n\nexport type ServiceReadinessState =\n | \"ready\"\n | \"update_available\"\n | \"refresh_needed\"\n | \"refresh_blocked\"\n | \"not_installed\"\n | \"not_running\"\n | \"local_repair_needed\"\n | \"profile_required\"\n | \"unknown\";\n\nexport type ServiceRuntimeHeadline =\n | \"running\"\n | \"stale\"\n | \"not running\"\n | \"unknown\";\n\nexport type ServiceReadinessProjection = {\n anomalyCodes: DaemonServiceAnomalyCode[];\n detailText: string;\n nextStepSummary: string | null;\n nextSteps: string[];\n reasonCodes: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n state: ServiceReadinessState;\n summaryText: string;\n};\n\nexport type ServiceReadinessServiceStatus =\n | {\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"ready\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n advisoryAnomalyCodes?: DaemonServiceAnomalyCode[];\n }\n | {\n expectedVersion: string;\n kind: \"missing\";\n }\n | {\n expectedVersion: string;\n installedVersion: string;\n kind: \"outdated\";\n }\n | {\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"not_running\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n }\n | {\n anomalyCodes: string[];\n detail: string;\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"needs_repair\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n }\n | {\n detail: string;\n kind: \"inspection_failed\" | \"repair_blocked\" | \"repair_failed\";\n };\n\nconst SERVICE_LOCK_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>([\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nconst LOCAL_REPAIR_REASON_CODES = new Set<ReplyReadinessReasonCode>([\n \"projection.missing\",\n \"controller.launch.needs_repair\",\n \"workspace.missing\",\n \"workspace.invalid\",\n]);\n\nconst SERVICE_DIAGNOSTIC_ONLY_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>(\n [\"bundle_content_drift\", \"bundle_version_drift\", \"version_outdated\"]\n);\n\nexport function resolveServiceReadiness(input: {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n inventory?: DaemonServiceInventory | null;\n profileRequired?: boolean;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n}): ServiceReadinessProjection {\n const reasonCodes = input.deviceReplyReadiness.reasonCodes;\n const anomalyCodes = collectServiceAnomalyCodes(input.inventory);\n const freshnessWarning = resolveDaemonServiceFreshnessWarning({\n inventory: input.inventory,\n });\n const wakeabilityClassification = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const repairAnomalyCodes = wakeabilityClassification.blockingCodes;\n const lockAnomalyCodes = anomalyCodes.filter((code) =>\n SERVICE_LOCK_ANOMALY_CODES.has(code)\n );\n const runtimeHeadline = resolveServiceRuntimeHeadline(input.runtimeStatus);\n\n if (input.profileRequired) {\n return {\n anomalyCodes,\n detailText: \"Choose an Agent Profile to check local service readiness.\",\n nextStepSummary: \"Choose an Agent Profile, then run this command again.\",\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"profile_required\",\n summaryText: \"Choose an Agent Profile\",\n };\n }\n\n if (repairAnomalyCodes.length > 0 && lockAnomalyCodes.length > 0) {\n const reason =\n input.runtimeStatus?.status === \"running\" &&\n input.runtimeStatus.mode === \"foreground\"\n ? \"foreground_service_active\"\n : \"lifecycle_action_in_progress\";\n return {\n anomalyCodes,\n detailText: buildDaemonServiceRefreshBlockedMessage({ reason }),\n nextStepSummary: buildDaemonServiceRefreshBlockedNextStep({ reason }),\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"refresh_blocked\",\n summaryText: \"Repair paused\",\n };\n }\n\n if (\n reasonCodes.includes(\"service.drifted\") ||\n repairAnomalyCodes.length > 0\n ) {\n if (isRuntimeContractUpdateRequired(repairAnomalyCodes)) {\n return createRuntimeContractUpdateRequiredProjection({\n anomalyCodes,\n reasonCodes,\n runtimeHeadline,\n });\n }\n const guidance = buildDaemonServiceRepairGuidance();\n return {\n anomalyCodes,\n detailText: buildDaemonServiceRefreshReadinessDetail(),\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"service.not_installed\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to connect OpenMeld Service.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"not_installed\",\n summaryText: \"Not installed\",\n };\n }\n\n if (reasonCodes.includes(\"service.not_running\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to reconnect OpenMeld Service.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"not_running\",\n summaryText: \"Not running\",\n };\n }\n\n if (reasonCodes.includes(\"service.gateway_chain_unhealthy\")) {\n const guidance = resolveGatewayChainRepairGuidance({});\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"local_repair_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"dispatch.storage_not_ready\")) {\n const guidance = resolveGatewayChainRepairGuidance({\n failureKind: \"dispatch_storage_not_ready\",\n });\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"OpenMeld cloud temporarily unavailable\",\n };\n }\n\n if (reasonCodes.some((code) => LOCAL_REPAIR_REASON_CODES.has(code))) {\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld doctor --repair\"),\n ];\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\`, then retry.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"local_repair_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"local_agents.none_needed\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `If you later bring local agents from this device into a space, run \\`${nextSteps[0]}\\`.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Not needed for this action\",\n };\n }\n\n if (input.deviceReplyReadiness.replyReadiness === \"ready\") {\n if (freshnessWarning) {\n return createServiceStatusProjection({\n anomalyCodes,\n detailText: freshnessWarning.detailText,\n nextStepSummary: freshnessWarning.nextStep,\n nextSteps: freshnessWarning.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"update_available\",\n summaryText: freshnessWarning.summaryText,\n });\n }\n return {\n anomalyCodes,\n detailText:\n \"OpenMeld Service is running and the local service link is available on this device\",\n nextStepSummary: null,\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"ready\",\n summaryText: \"Running\",\n };\n }\n\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ];\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to inspect OpenMeld Service on this device.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Unknown\",\n };\n}\n\nexport function resolveServiceReadinessFromServiceStatus(\n serviceStatus: ServiceReadinessServiceStatus\n): ServiceReadinessProjection {\n const runtimeHeadline =\n resolveRuntimeHeadlineFromServiceStatus(serviceStatus);\n\n if (serviceStatus.kind === \"ready\") {\n const freshnessProjection = createServiceFreshnessProjection({\n anomalyCodes: serviceStatus.advisoryAnomalyCodes ?? [],\n runtimeHeadline,\n });\n if (freshnessProjection) {\n return freshnessProjection;\n }\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is running on this device.\",\n nextStepSummary: null,\n nextSteps: [],\n runtimeHeadline,\n state: \"ready\",\n summaryText: \"Running\",\n });\n }\n\n if (serviceStatus.kind === \"missing\") {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is not installed on this device.\",\n nextStepSummary:\n \"Run `openmeld setup` to connect OpenMeld Service for local Wake work.\",\n nextSteps,\n runtimeHeadline,\n state: \"not_installed\",\n summaryText: \"Not installed\",\n });\n }\n\n if (serviceStatus.kind === \"outdated\") {\n return createServiceStatusProjection({\n anomalyCodes: [\"version_outdated\"],\n detailText: \"OpenMeld Service version is older than this CLI.\",\n nextStepSummary: \"Run `openmeld setup` to update OpenMeld Service.\",\n nextSteps: [formatOpenMeldCliCommand(\"openmeld setup\")],\n runtimeHeadline,\n state: \"update_available\",\n summaryText: \"Update OpenMeld Service\",\n });\n }\n\n if (serviceStatus.kind === \"not_running\") {\n const nextSteps: [string] = [formatOpenMeldCliCommand(\"openmeld setup\")];\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is installed but not running.\",\n nextStepSummary:\n \"Run `openmeld setup` to reconnect OpenMeld Service for local Wake work.\",\n nextSteps,\n runtimeHeadline,\n state: \"not_running\",\n summaryText: \"Not running\",\n });\n }\n\n if (serviceStatus.kind === \"needs_repair\") {\n const anomalyCodes = normalizeServiceAnomalyCodes(\n serviceStatus.anomalyCodes\n );\n if (isRuntimeContractUpdateRequired(anomalyCodes)) {\n return createRuntimeContractUpdateRequiredProjection({\n anomalyCodes,\n reasonCodes: [],\n runtimeHeadline,\n });\n }\n if (\n anomalyCodes.length > 0 &&\n shouldTreatServiceStatusAnomaliesAsDiagnosticOnly({\n anomalyCodes,\n runtimeHeadline,\n })\n ) {\n return createServiceDiagnosticEvidenceProjection({\n anomalyCodes,\n runtimeHeadline,\n });\n }\n const guidance = buildDaemonServiceRepairGuidance();\n return createServiceStatusProjection({\n anomalyCodes,\n detailText: formatDaemonServiceRefreshReliabilityMessage(),\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n });\n }\n\n if (serviceStatus.kind === \"repair_blocked\") {\n return createServiceStatusProjection({\n detailText:\n \"OpenMeld Service needs manual repair before OpenMeld can align it automatically.\",\n nextStepSummary: buildDaemonServiceRefreshBlockedNextStep({\n reason: \"lifecycle_action_in_progress\",\n }),\n nextSteps: formatOpenMeldCliCommands([\"openmeld service repair\"]),\n runtimeHeadline,\n state: \"refresh_blocked\",\n summaryText: \"Repair paused\",\n });\n }\n\n if (serviceStatus.kind === \"repair_failed\") {\n const guidance = buildDaemonServiceRepairGuidance();\n return createServiceStatusProjection({\n detailText:\n \"OpenMeld tried to repair OpenMeld Service automatically, but the service still needs attention.\",\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n });\n }\n\n return createServiceStatusProjection({\n detailText: \"OpenMeld could not inspect OpenMeld Service on this device.\",\n nextStepSummary:\n \"Run `openmeld service status` first. If OpenMeld still cannot inspect the service, run `openmeld service repair`.\",\n nextSteps: formatOpenMeldCliCommands([\n \"openmeld service status\",\n \"openmeld service repair\",\n ]),\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Unknown\",\n });\n}\n\nexport function resolveServiceRuntimeHeadline(\n runtimeStatus: DaemonServiceRuntimeStatus | null | undefined\n): ServiceRuntimeHeadline {\n if (!runtimeStatus) {\n return \"unknown\";\n }\n if (runtimeStatus.status === \"running\") {\n return \"running\";\n }\n if (runtimeStatus.status === \"stale\") {\n return \"stale\";\n }\n if (runtimeStatus.status === \"not_running\") {\n return \"not running\";\n }\n return \"unknown\";\n}\n\nfunction collectServiceAnomalyCodes(\n inventory: DaemonServiceInventory | null | undefined\n): DaemonServiceAnomalyCode[] {\n if (!inventory) {\n return [];\n }\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory.anomalies) {\n if (!codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n\nfunction resolveRuntimeHeadlineFromServiceStatus(\n serviceStatus: ServiceReadinessServiceStatus\n): ServiceRuntimeHeadline {\n if (!(\"runtimeStatus\" in serviceStatus)) {\n return \"unknown\";\n }\n return resolveRuntimeHeadlineFromStatus(serviceStatus.runtimeStatus);\n}\n\nfunction resolveRuntimeHeadlineFromStatus(\n status: DaemonServiceRuntimeStatus[\"status\"] | null | undefined\n): ServiceRuntimeHeadline {\n if (status === \"running\") {\n return \"running\";\n }\n if (status === \"stale\") {\n return \"stale\";\n }\n if (status === \"not_running\") {\n return \"not running\";\n }\n return \"unknown\";\n}\n\nfunction createServiceDiagnosticEvidenceProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection {\n const freshnessProjection = createServiceFreshnessProjection(input);\n if (freshnessProjection) {\n return freshnessProjection;\n }\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ];\n return createServiceStatusProjection({\n anomalyCodes: input.anomalyCodes,\n detailText:\n \"OpenMeld Service is installed. CLI version and service file differences are diagnostic unless service compatibility fails.\",\n nextStepSummary:\n \"Run `openmeld service status` to inspect OpenMeld Service on this device.\",\n nextSteps,\n runtimeHeadline: input.runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Installed\",\n });\n}\n\nfunction createServiceFreshnessProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection | null {\n if (input.runtimeHeadline !== \"running\") {\n return null;\n }\n const warning = resolveDaemonServiceFreshnessWarningForAnomalyCodes({\n anomalyCodes: input.anomalyCodes ?? [],\n });\n if (!warning) {\n return null;\n }\n return createServiceStatusProjection({\n anomalyCodes: warning.anomalyCodes,\n detailText: warning.detailText,\n nextStepSummary: warning.nextStep,\n nextSteps: warning.nextSteps,\n runtimeHeadline: input.runtimeHeadline,\n state: \"update_available\",\n summaryText: warning.summaryText,\n });\n}\n\nfunction createRuntimeContractUpdateRequiredProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n reasonCodes: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection {\n const nextSteps: [string] = [formatOpenMeldCliCommand(\"openmeld setup\")];\n const serviceIsRunning = input.runtimeHeadline === \"running\";\n return createServiceStatusProjection({\n anomalyCodes: input.anomalyCodes,\n detailText: formatDaemonServiceUpdateRequiredMessage({\n serviceIsRunning,\n }),\n nextStepSummary: buildDaemonServiceUpdateRequiredNextStep({\n serviceIsRunning,\n }),\n nextSteps,\n reasonCodes: input.reasonCodes,\n runtimeHeadline: input.runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Update OpenMeld Service\",\n });\n}\n\nfunction createServiceStatusProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n detailText: string;\n nextStepSummary: string | null;\n nextSteps: string[];\n reasonCodes?: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n state: ServiceReadinessState;\n summaryText: string;\n}): ServiceReadinessProjection {\n return {\n anomalyCodes: input.anomalyCodes ?? [],\n detailText: input.detailText,\n nextStepSummary: input.nextStepSummary,\n nextSteps: input.nextSteps,\n reasonCodes: input.reasonCodes ?? [],\n runtimeHeadline: input.runtimeHeadline,\n state: input.state,\n summaryText: input.summaryText,\n };\n}\n\nfunction isRuntimeContractUpdateRequired(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): boolean {\n return (\n anomalyCodes.length === 1 && anomalyCodes[0] === \"runtime_contract_mismatch\"\n );\n}\n\nfunction shouldTreatServiceStatusAnomaliesAsDiagnosticOnly(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): boolean {\n return input.anomalyCodes.every((code) => {\n if (code === \"bundle_content_drift\") {\n return input.runtimeHeadline === \"running\";\n }\n return SERVICE_DIAGNOSTIC_ONLY_ANOMALY_CODES.has(code);\n });\n}\n\nfunction normalizeServiceAnomalyCodes(\n anomalyCodes: readonly string[]\n): DaemonServiceAnomalyCode[] {\n const normalized: DaemonServiceAnomalyCode[] = [];\n for (const code of anomalyCodes) {\n const serviceCode = code as DaemonServiceAnomalyCode;\n if (\n (DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(serviceCode) ||\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(serviceCode) ||\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(serviceCode) ||\n SERVICE_LOCK_ANOMALY_CODES.has(serviceCode)) &&\n !normalized.includes(serviceCode)\n ) {\n normalized.push(serviceCode);\n }\n }\n return normalized;\n}\n","import type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport { resolveServiceReadiness } from \"../../system/service-readiness-resolver\";\nimport type { DaemonLifecycleEvent } from \"../lifecycle/daemon-lifecycle-journal\";\nimport {\n classifyDaemonServiceRunStartability,\n classifyDaemonServiceWakeability,\n} from \"../lifecycle/daemon-service-anomaly-groups\";\nimport { resolveDaemonServiceFreshnessWarning } from \"../lifecycle/daemon-service-freshness\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"../lifecycle/daemon-service-inventory\";\nimport {\n buildDaemonServiceRefreshNextStep,\n buildDaemonServiceUpdateRequiredNextStep,\n formatDaemonServiceRefreshReliabilityMessage,\n formatDaemonServiceUpdateRequiredMessage,\n} from \"../lifecycle/daemon-service-repair-guidance\";\n\nconst STATUS_LOCK_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>([\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nexport type DaemonStatusAttention = {\n level: \"info\" | \"warning\";\n code:\n | \"authentication_required\"\n | \"service_dependencies_unavailable\"\n | \"foreground_service_active\"\n | \"lifecycle_action_in_progress\"\n | \"service_repair_recommended\"\n | \"service_update_available\"\n | \"service_update_required\";\n title: string;\n message: string;\n nextStep: string | null;\n anomalyCodes: DaemonServiceAnomalyCode[];\n};\n\nexport function resolveDaemonStatusAuthenticationAttention(input: {\n latestConnectionStateEvent: DaemonLifecycleEvent | null;\n}): DaemonStatusAttention | null {\n const event = input.latestConnectionStateEvent;\n if (\n event?.type !== \"connection.state\" ||\n event.result !== \"authentication_required\"\n ) {\n return null;\n }\n\n const authState = normalizeAuthState(event.metadata?.authState);\n return {\n level: \"warning\",\n code: \"authentication_required\",\n title: \"Sign In to OpenMeld\",\n message: `OpenMeld Service is running, but it cannot connect to OpenMeld because this computer is ${formatAuthenticationRequiredReason(authState)}. Wake will recover automatically after sign-in.`,\n nextStep:\n \"Run `openmeld auth login`. If OpenMeld Service still cannot reconnect after sign-in, run `openmeld service repair`.\",\n anomalyCodes: [],\n };\n}\n\nexport function resolveDaemonStatusAttention(input: {\n inventory: DaemonServiceInventory | null;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): DaemonStatusAttention | null {\n if (!input.inventory) {\n return null;\n }\n\n const wakeability = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const startability = classifyDaemonServiceRunStartability({\n inventory: input.inventory,\n });\n const lockCodes = collectAnomalyCodes(\n input.inventory,\n STATUS_LOCK_ANOMALY_CODES\n );\n const repairCodes = dedupeAnomalyCodes([\n ...wakeability.blockingCodes,\n ...startability.blockingCodes,\n ]).filter((code) => !lockCodes.includes(code));\n if (lockCodes.length > 0 && repairCodes.length > 0) {\n const readiness = resolveServiceReadiness({\n deviceReplyReadiness: createStatusAttentionReplyReadiness(),\n inventory: input.inventory,\n runtimeStatus: input.runtimeState,\n });\n return {\n level: \"warning\",\n code: \"service_repair_recommended\",\n title: \"OpenMeld Service Repair Paused\",\n message: readiness.detailText,\n nextStep: readiness.nextStepSummary,\n anomalyCodes: dedupeAnomalyCodes([...repairCodes, ...lockCodes]),\n };\n }\n if (lockCodes.length > 0 && isForegroundRuntimeActive(input.runtimeState)) {\n return {\n level: \"info\",\n code: \"foreground_service_active\",\n title: \"Foreground Service Active\",\n message:\n \"A foreground OpenMeld service is active on this device, so background cleanup and auto-heal stay paused to avoid fighting the live route owner.\",\n nextStep:\n \"No action is required. Stop the foreground service first if you want OpenMeld to resume background repair or management.\",\n anomalyCodes: lockCodes,\n };\n }\n\n if (lockCodes.length > 0) {\n return {\n level: \"info\",\n code: \"lifecycle_action_in_progress\",\n title: \"OpenMeld Service Task In Progress\",\n message:\n \"Another OpenMeld Service task is already running, so this status check stays read-only until it finishes.\",\n nextStep:\n \"Try `openmeld service status` again after the current OpenMeld Service task finishes.\",\n anomalyCodes: lockCodes,\n };\n }\n if (repairCodes.length === 0) {\n const freshnessWarning = resolveDaemonServiceFreshnessWarning({\n inventory: input.inventory,\n });\n if (freshnessWarning) {\n return {\n level: freshnessWarning.level,\n code: freshnessWarning.code,\n title: freshnessWarning.title,\n message: freshnessWarning.detailText,\n nextStep: freshnessWarning.nextStep,\n anomalyCodes: freshnessWarning.anomalyCodes,\n };\n }\n return null;\n }\n\n const readiness = resolveServiceReadiness({\n deviceReplyReadiness: createStatusAttentionReplyReadiness(),\n inventory: input.inventory,\n runtimeStatus: input.runtimeState,\n });\n const serviceIsRunning = isRuntimeActive(input.runtimeState);\n if (isRuntimeContractUpdateRequired(repairCodes)) {\n return {\n level: \"warning\",\n code: \"service_update_required\",\n title: \"Update OpenMeld Service\",\n message: formatDaemonServiceUpdateRequiredMessage({\n serviceIsRunning,\n }),\n nextStep: buildDaemonServiceUpdateRequiredNextStep({\n serviceIsRunning,\n }),\n anomalyCodes: readiness.anomalyCodes.filter((code) =>\n repairCodes.includes(code)\n ),\n };\n }\n return {\n level: \"warning\",\n code: \"service_repair_recommended\",\n title: \"OpenMeld Service Needs Repair\",\n message: formatDaemonServiceRefreshReliabilityMessage(),\n nextStep: readiness.nextStepSummary ?? buildDaemonServiceRefreshNextStep(),\n anomalyCodes: readiness.anomalyCodes.filter((code) =>\n repairCodes.includes(code)\n ),\n };\n}\n\nfunction collectAnomalyCodes(\n inventory: DaemonServiceInventory,\n allowedCodes: ReadonlySet<DaemonServiceAnomalyCode>\n): DaemonServiceAnomalyCode[] {\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory.anomalies) {\n if (allowedCodes.has(anomaly.code) && !codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n\nfunction isForegroundRuntimeActive(\n runtimeState: DaemonServiceRuntimeStatus | null\n): boolean {\n return (\n runtimeState?.status === \"running\" && runtimeState.mode === \"foreground\"\n );\n}\n\nfunction isRuntimeActive(\n runtimeState: DaemonServiceRuntimeStatus | null\n): boolean {\n return runtimeState?.status === \"running\";\n}\n\nfunction isRuntimeContractUpdateRequired(\n repairCodes: readonly DaemonServiceAnomalyCode[]\n): boolean {\n return (\n repairCodes.length === 1 && repairCodes[0] === \"runtime_contract_mismatch\"\n );\n}\n\nfunction normalizeAuthState(value: unknown): string {\n return typeof value === \"string\" ? value : \"unknown\";\n}\n\nfunction formatAuthenticationRequiredReason(authState: string): string {\n switch (authState) {\n case \"expired\":\n return \"signed in with an expired session\";\n case \"missing\":\n return \"not signed in\";\n case \"invalid\":\n return \"signed in with an invalid local session\";\n case \"revoked\":\n return \"signed in with a revoked session\";\n default:\n return \"not currently authenticated\";\n }\n}\n\nfunction createStatusAttentionReplyReadiness() {\n return {\n reasonCodes: [],\n reasonText:\n \"OpenMeld Service status attention is based on local service state.\",\n replyReadiness: \"ready\" as const,\n updatedAt: new Date(0).toISOString(),\n wakeableRouteCount: 0,\n };\n}\n\nfunction dedupeAnomalyCodes(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): DaemonServiceAnomalyCode[] {\n return [...new Set(anomalyCodes)];\n}\n","import { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { resolveOpenMeldProfileOrNull } from \"../../config/resolve-openmeld-profile\";\nimport {\n type RuntimeContext,\n resolveRuntimeContext,\n} from \"../../runtime/context\";\nimport {\n type CurrentReplyReadinessSnapshot,\n resolveCurrentReplyReadinessSnapshot,\n} from \"../../system/current-reply-readiness-snapshot\";\nimport { DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS } from \"../../system/gateway-chain-readiness\";\nimport {\n type DaemonLifecycleEvent,\n readLatestDaemonLifecycleConnectionStateEvent,\n readLatestDaemonLifecycleOriginEvent,\n} from \"../lifecycle/daemon-lifecycle-journal\";\nimport {\n buildDaemonServiceDependencyMeaning,\n buildDaemonServiceDependencyNextStep,\n buildDaemonServiceDependencySummary,\n buildDaemonServiceDependencyTitle,\n type DaemonServiceDependencyIssue,\n resolveDaemonServiceDependencyDiagnostics,\n} from \"../lifecycle/daemon-service-dependency-diagnostics\";\nimport {\n type DaemonStartFailureState,\n readDaemonStartFailureState,\n} from \"../state/daemon-start-failure-state\";\nimport { readDaemonRuntimeContractRepairReport } from \"../state/runtime-contract-guard\";\nimport type { DaemonLocalStatusSnapshot } from \"./daemon-local-status-snapshot\";\nimport {\n type DaemonStatusAttention,\n resolveDaemonStatusAttention,\n resolveDaemonStatusAuthenticationAttention,\n} from \"./daemon-status-attention\";\n\nexport type DaemonStatusSnapshot = {\n attention: DaemonStatusAttention | null;\n currentReplyReadiness: CurrentReplyReadinessSnapshot;\n latestConnectionStateEvent: DaemonLifecycleEvent | null;\n latestLifecycleEvent: DaemonLifecycleEvent | null;\n runtimeContractRepairReport: Awaited<\n ReturnType<typeof readDaemonRuntimeContractRepairReport>\n > | null;\n};\n\nconst DAEMON_STATUS_GATEWAY_CHAIN_TIMEOUT_MS = DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS;\n\nexport async function resolveDaemonStatusSnapshot(\n input: {\n localSnapshot?: DaemonLocalStatusSnapshot;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<DaemonStatusSnapshot> {\n const runtime =\n input.runtime ??\n (await resolveRuntimeContext({\n profile: input.profile,\n view: input.view,\n }));\n const activeProfile = await resolveOpenMeldProfileOrNull({\n openMeldProfileId: runtime.openMeldProfileId,\n allowDefaultFallback: runtime.resolvedView === \"human\",\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null);\n let gatewayChainProfile: {\n openMeldProfileId: string;\n profileName?: string;\n } | null = null;\n if (activeProfile) {\n gatewayChainProfile = {\n openMeldProfileId: activeProfile.openMeldProfileId,\n profileName: activeProfile.profileName,\n };\n } else if (runtime.openMeldProfileId) {\n gatewayChainProfile = {\n openMeldProfileId: runtime.openMeldProfileId,\n };\n }\n const currentReplyReadiness = await resolveCurrentReplyReadinessSnapshot({\n checkGatewayChain: true,\n gatewayChainProfile,\n gatewayChainTimeoutMs: DAEMON_STATUS_GATEWAY_CHAIN_TIMEOUT_MS,\n includeDaemonRouteObservation: true,\n localServiceObservation: input.localSnapshot,\n ownerUserId: activeProfile?.ownerUserId ?? null,\n preferActiveServiceRouteCatalog: true,\n profile: activeProfile,\n });\n const runtimeContractRepairReport =\n await resolveRuntimeContractRepairReportForStatus({\n daemonInstalled: currentReplyReadiness.daemonStatus.installed,\n localSnapshot: input.localSnapshot,\n });\n const latestLifecycleEvent = input.localSnapshot\n ? input.localSnapshot.latestLifecycleEvent\n : await readLatestDaemonLifecycleOriginEvent().catch(() => null);\n const latestConnectionStateEvent = input.localSnapshot\n ? input.localSnapshot.latestConnectionStateEvent\n : await readLatestDaemonLifecycleConnectionStateEvent().catch(() => null);\n const baseAttention = demoteRepairAttentionForLiveRoute({\n attention: resolveDaemonStatusAttention({\n inventory: currentReplyReadiness.inventory,\n runtimeState:\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus,\n }),\n daemonRouteObservation: currentReplyReadiness.daemonRouteObservation,\n });\n const liveDependencyDiagnostics =\n shouldCheckDaemonServiceDependenciesForStatus(\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus\n )\n ? await resolveDaemonServiceDependencyDiagnostics({\n scopePolicy: \"loopback_only\",\n }).catch(() => null)\n : null;\n const recordedStartFailure = shouldCheckDaemonServiceDependenciesForStatus(\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus\n )\n ? await readDaemonStartFailureState().catch(() => null)\n : null;\n const attention =\n resolveDaemonStatusAuthenticationAttention({\n latestConnectionStateEvent,\n }) ??\n baseAttention ??\n resolveDaemonStatusServiceDependencyAttention({\n liveDiagnostics: liveDependencyDiagnostics,\n recordedStartFailure,\n });\n return {\n attention,\n currentReplyReadiness,\n latestConnectionStateEvent,\n latestLifecycleEvent,\n runtimeContractRepairReport,\n };\n}\n\nasync function resolveRuntimeContractRepairReportForStatus(input: {\n daemonInstalled: boolean;\n localSnapshot?: DaemonLocalStatusSnapshot;\n}) {\n if (input.localSnapshot) {\n return input.localSnapshot.runtimeContractRepairReport;\n }\n if (!input.daemonInstalled) {\n return null;\n }\n return await readDaemonRuntimeContractRepairReport().catch(() => null);\n}\n\n// facts.md read rule: a live Core Wake route is the authoritative liveness\n// fact for this device. Stale local anomalies stay visible as inventory\n// diagnostics, but they must not headline \"needs repair\" while the cloud\n// confirms this device is carrying Wake traffic right now.\nfunction demoteRepairAttentionForLiveRoute(input: {\n attention: DaemonStatusAttention | null;\n daemonRouteObservation: CurrentReplyReadinessSnapshot[\"daemonRouteObservation\"];\n}): DaemonStatusAttention | null {\n if (!input.attention) {\n return null;\n }\n if (input.attention.code !== \"service_repair_recommended\") {\n return input.attention;\n }\n if (input.daemonRouteObservation.status !== \"online\") {\n return input.attention;\n }\n return null;\n}\n\nfunction shouldCheckDaemonServiceDependenciesForStatus(\n runtimeState: CurrentReplyReadinessSnapshot[\"runtimeStatus\"]\n): boolean {\n return runtimeState?.status !== \"running\";\n}\n\nfunction resolveDaemonStatusServiceDependencyAttention(input: {\n liveDiagnostics: Awaited<\n ReturnType<typeof resolveDaemonServiceDependencyDiagnostics>\n > | null;\n recordedStartFailure: DaemonStartFailureState | null;\n}): DaemonStatusAttention | null {\n if (input.liveDiagnostics?.applicable && !input.liveDiagnostics.ready) {\n return buildDaemonStatusServiceDependencyAttention({\n issues: input.liveDiagnostics.issues,\n lane: input.liveDiagnostics.lane,\n });\n }\n\n if (\n input.recordedStartFailure?.reason === \"service_dependencies_unavailable\" &&\n input.recordedStartFailure.dependencyIssues.length > 0 &&\n input.recordedStartFailure.lane === resolveOpenMeldEnvPreset()\n ) {\n return buildDaemonStatusServiceDependencyAttention({\n issues: input.recordedStartFailure.dependencyIssues,\n lane: input.recordedStartFailure.lane,\n });\n }\n\n return null;\n}\n\nfunction buildDaemonStatusServiceDependencyAttention(input: {\n issues: DaemonServiceDependencyIssue[];\n lane: DaemonStartFailureState[\"lane\"];\n}): DaemonStatusAttention {\n return {\n level: \"warning\",\n code: \"service_dependencies_unavailable\",\n title: buildDaemonServiceDependencyTitle({\n issues: input.issues,\n lane: input.lane,\n }),\n message: `${buildDaemonServiceDependencySummary({\n issues: input.issues,\n lane: input.lane,\n })} ${buildDaemonServiceDependencyMeaning({\n issues: input.issues,\n lane: input.lane,\n })}`,\n nextStep: buildDaemonServiceDependencyNextStep({\n command: \"status\",\n issues: input.issues,\n lane: input.lane,\n }),\n anomalyCodes: [],\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { cp, mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n daemonLifecycleJournalPath,\n daemonRuntimeDataPath,\n daemonRuntimeRootPath,\n daemonRuntimeStateRootPath,\n} from \"../../config/daemon-state\";\nimport { openMeldBackupsDir, openMeldRootDir } from \"../../config/paths\";\nimport type { RuntimeContext } from \"../../runtime/context\";\nimport {\n type DaemonStatusSnapshot,\n resolveDaemonStatusSnapshot,\n} from \"../status/daemon-status-snapshot\";\nimport {\n getDaemonServiceLaunchdLabel,\n getDaemonSystemServiceLogPath,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\nconst DAEMON_SERVICE_EVIDENCE_SCHEMA = \"openmeld-daemon-service-evidence-v3\";\nconst SYSTEM_SERVICE_DIAGNOSTICS_TIMEOUT_MS = 5000;\n\nexport type DaemonServiceEvidencePhase =\n | \"after_failure\"\n | \"before_cleanup\"\n | \"snapshot\";\n\nexport type DaemonServiceFailureStage =\n | \"inspect\"\n | \"backup\"\n | \"stop_or_drain\"\n | \"wait_stopped\"\n | \"unregister\"\n | \"wait_absent\"\n | \"prepare_bundle\"\n | \"install_bundle\"\n | \"write_contract\"\n | \"register_service\"\n | \"restore_runtime_data\"\n | \"start_if_desired\"\n | \"wait_running\"\n | \"verify_final_inventory\"\n | \"restored_verified_previous_state\"\n | \"stopped_safe_current_version\"\n | \"failed_before_safe_state\"\n | \"pre-stop\"\n | \"stop-wait\"\n | \"uninstall-verify\"\n | \"reinstall-install\"\n | \"restore-last-known-good\";\n\ntype EvidenceArtifactStatus = {\n errorMessage: string | null;\n relativePath: string | null;\n sourcePath: string | null;\n status: \"captured\" | \"error\" | \"missing\" | \"skipped\";\n};\n\ntype DaemonServiceEvidenceCapturePhase = {\n artifacts: {\n lifecycleJournal: EvidenceArtifactStatus;\n ownedProcesses: EvidenceArtifactStatus;\n runtimeData: EvidenceArtifactStatus;\n runtimeLogs: EvidenceArtifactStatus;\n runtimeState: EvidenceArtifactStatus;\n systemServiceDiagnostics: EvidenceArtifactStatus;\n };\n capturedAt: string;\n observedStatusSnapshot: DaemonStatusSnapshot | null;\n observedStatusSnapshotError: string | null;\n phase: DaemonServiceEvidencePhase;\n};\n\ntype DaemonServiceEvidenceManifest = {\n captures: Partial<\n Record<DaemonServiceEvidencePhase, DaemonServiceEvidenceCapturePhase>\n >;\n createdAt: string;\n evidencePath: string;\n laneRootPath: string;\n paths: {\n backupsRootPath: string;\n lifecycleJournalPath: string;\n runtimeDataPath: string;\n runtimeLogsPath: string;\n runtimeRootPath: string;\n runtimeStatePath: string;\n systemServiceLogPath: string;\n };\n serviceIdentity: {\n launchdLabel: string;\n };\n schema: typeof DAEMON_SERVICE_EVIDENCE_SCHEMA;\n v: 3;\n};\n\nexport type DaemonServiceEvidenceCapture = {\n evidencePath: string;\n manifestPath: string;\n phase: DaemonServiceEvidencePhase;\n};\n\nexport async function captureDaemonServiceEvidence(\n input: {\n evidencePath?: string;\n phase?: DaemonServiceEvidencePhase;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<DaemonServiceEvidenceCapture> {\n const phase = input.phase ?? \"snapshot\";\n const capturedAt = new Date().toISOString();\n const evidencePath =\n input.evidencePath ?? (await createEvidenceRoot(capturedAt));\n const manifestPath = join(evidencePath, \"manifest.json\");\n const phaseRootPath = join(evidencePath, phase);\n const runtimeRootPath = daemonRuntimeRootPath();\n const runtimeLogsPath = join(runtimeRootPath, \"logs\");\n const runtimeStatePath = daemonRuntimeStateRootPath();\n const runtimeDataPath = daemonRuntimeDataPath();\n const lifecycleJournalPath = daemonLifecycleJournalPath();\n const systemServiceLogPath = getDaemonSystemServiceLogPath();\n\n const [statusSnapshotResult, ownedProcessesResult, systemDiagnosticsResult] =\n await Promise.all([\n resolveDaemonStatusSnapshot({\n profile: input.profile,\n runtime: input.runtime,\n view: input.view,\n })\n .then((snapshot) => ({\n snapshot,\n errorMessage: null,\n }))\n .catch((error) => ({\n snapshot: null,\n errorMessage: toErrorMessage(error),\n })),\n captureOwnedProcessesArtifact(phaseRootPath),\n captureSystemServiceDiagnosticsArtifact(phaseRootPath),\n ]);\n const runtimeLogsArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"logs\"),\n sourcePath: runtimeLogsPath,\n });\n const lifecycleJournalArtifact = await captureFileArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"daemon-lifecycle-journal.jsonl\"),\n sourcePath: lifecycleJournalPath,\n });\n const runtimeStateArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"state\"),\n sourcePath: runtimeStatePath,\n });\n const runtimeDataArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"data\"),\n sourcePath: runtimeDataPath,\n });\n\n const phaseCapture: DaemonServiceEvidenceCapturePhase = {\n artifacts: {\n lifecycleJournal: lifecycleJournalArtifact,\n ownedProcesses: ownedProcessesResult.artifact,\n runtimeData: runtimeDataArtifact,\n runtimeLogs: runtimeLogsArtifact,\n runtimeState: runtimeStateArtifact,\n systemServiceDiagnostics: systemDiagnosticsResult.artifact,\n },\n observedStatusSnapshot: statusSnapshotResult.snapshot,\n observedStatusSnapshotError: statusSnapshotResult.errorMessage,\n capturedAt,\n phase,\n };\n const existingManifest =\n await readDaemonServiceEvidenceManifest(manifestPath);\n const manifest: DaemonServiceEvidenceManifest = {\n captures: {\n ...(existingManifest?.captures ?? {}),\n [phase]: phaseCapture,\n },\n createdAt: existingManifest?.createdAt ?? capturedAt,\n evidencePath,\n laneRootPath: openMeldRootDir(),\n paths: {\n backupsRootPath: openMeldBackupsDir(),\n lifecycleJournalPath,\n runtimeDataPath,\n runtimeLogsPath,\n runtimeRootPath,\n runtimeStatePath,\n systemServiceLogPath,\n },\n serviceIdentity: {\n launchdLabel: getDaemonServiceLaunchdLabel(),\n },\n schema: DAEMON_SERVICE_EVIDENCE_SCHEMA,\n v: 3,\n };\n\n await writeFile(`${manifestPath}`, `${JSON.stringify(manifest, null, 2)}\\n`, {\n encoding: \"utf8\",\n });\n\n return {\n evidencePath,\n manifestPath,\n phase,\n };\n}\n\nexport async function captureDaemonServiceEvidenceBestEffort(\n input: {\n evidencePath?: string;\n phase?: DaemonServiceEvidencePhase;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<string | null> {\n return await captureDaemonServiceEvidence(input)\n .then((result) => result.evidencePath)\n .catch(() => null);\n}\n\nexport async function removeDaemonServiceEvidenceBestEffort(\n evidencePath: string | null | undefined\n): Promise<void> {\n if (!evidencePath) {\n return;\n }\n await rm(evidencePath, {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n}\n\nexport function formatDaemonFailureRetentionText(input: {\n backupDataPath?: string | null;\n evidencePath?: string | null;\n wrapPaths?: boolean;\n}): string {\n const formatPath = (value: string): string =>\n input.wrapPaths === true ? `\\`${value}\\`` : value;\n const notes = [\n input.backupDataPath\n ? `Runtime data backup retained at ${formatPath(input.backupDataPath)}.`\n : null,\n input.evidencePath\n ? `Service evidence snapshot saved at ${formatPath(input.evidencePath)}.`\n : null,\n ].filter((value): value is string => value !== null);\n return notes.join(\" \");\n}\n\nexport function formatDaemonFailureContextText(input: {\n backupDataPath?: string | null;\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n wrapPaths?: boolean;\n}): string {\n const notes = [\n input.failureStage ? `Failure stage: ${input.failureStage}.` : null,\n formatDaemonFailureRetentionText(input),\n ].filter(\n (value): value is string => typeof value === \"string\" && value.length > 0\n );\n return notes.join(\" \");\n}\n\nasync function createEvidenceRoot(createdAt: string): Promise<string> {\n const timestampSegment = createdAt.replaceAll(\":\", \"-\");\n const evidencePath = join(\n openMeldBackupsDir(),\n \"service-evidence\",\n `${timestampSegment}-${String(process.pid)}`\n );\n await mkdir(evidencePath, {\n recursive: true,\n });\n return evidencePath;\n}\n\nasync function readDaemonServiceEvidenceManifest(\n manifestPath: string\n): Promise<DaemonServiceEvidenceManifest | null> {\n const raw = await readFile(manifestPath, \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonServiceEvidenceManifest>;\n if (\n parsed?.schema !== DAEMON_SERVICE_EVIDENCE_SCHEMA ||\n parsed.v !== 3 ||\n typeof parsed.evidencePath !== \"string\" ||\n typeof parsed.createdAt !== \"string\" ||\n typeof parsed.laneRootPath !== \"string\" ||\n !parsed.paths ||\n !parsed.serviceIdentity\n ) {\n return null;\n }\n return parsed as DaemonServiceEvidenceManifest;\n } catch {\n return null;\n }\n}\n\nasync function captureDirectoryArtifact(input: {\n evidencePath: string;\n relativePath: string;\n sourcePath: string;\n}): Promise<EvidenceArtifactStatus> {\n const sourceStats = await stat(input.sourcePath).catch(() => null);\n if (!sourceStats?.isDirectory()) {\n return {\n errorMessage: null,\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"missing\",\n };\n }\n\n const targetPath = join(input.evidencePath, input.relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n await cp(input.sourcePath, targetPath, {\n recursive: true,\n });\n return {\n errorMessage: null,\n relativePath: input.relativePath,\n sourcePath: input.sourcePath,\n status: \"captured\",\n };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"error\",\n };\n }\n}\n\nasync function captureFileArtifact(input: {\n evidencePath: string;\n relativePath: string;\n sourcePath: string;\n}): Promise<EvidenceArtifactStatus> {\n const sourceStats = await stat(input.sourcePath).catch(() => null);\n if (!sourceStats?.isFile()) {\n return {\n errorMessage: null,\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"missing\",\n };\n }\n\n const targetPath = join(input.evidencePath, input.relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n await cp(input.sourcePath, targetPath);\n return {\n errorMessage: null,\n relativePath: input.relativePath,\n sourcePath: input.sourcePath,\n status: \"captured\",\n };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"error\",\n };\n }\n}\n\nasync function captureOwnedProcessesArtifact(evidencePath: string): Promise<{\n artifact: EvidenceArtifactStatus;\n}> {\n const relativePath = join(\"diagnostics\", \"owned-processes.json\");\n const targetPath = join(evidencePath, relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n const ownedProcesses = await listDaemonOwnedProcesses();\n await writeFile(\n `${targetPath}`,\n `${JSON.stringify(ownedProcesses, null, 2)}\\n`,\n \"utf8\"\n );\n return {\n artifact: {\n errorMessage: null,\n relativePath,\n sourcePath: null,\n status: \"captured\",\n },\n };\n } catch (error) {\n return {\n artifact: {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: null,\n status: \"error\",\n },\n };\n }\n}\n\nasync function captureSystemServiceDiagnosticsArtifact(\n evidencePath: string\n): Promise<{\n artifact: EvidenceArtifactStatus;\n}> {\n if (process.platform !== \"darwin\") {\n return {\n artifact: {\n errorMessage:\n \"system service diagnostics are only implemented for macOS in this release\",\n relativePath: null,\n sourcePath: null,\n status: \"skipped\",\n },\n };\n }\n\n const uid =\n typeof process.getuid === \"function\" ? String(process.getuid()) : null;\n if (!uid) {\n return {\n artifact: {\n errorMessage:\n \"could not resolve local user id for launchctl diagnostics\",\n relativePath: null,\n sourcePath: null,\n status: \"error\",\n },\n };\n }\n\n const launchdLabel = getDaemonServiceLaunchdLabel();\n const command = \"launchctl\";\n const args = [\"print\", `gui/${uid}/${launchdLabel}`];\n const result = await runCommand(command, args, {\n timeoutMs: SYSTEM_SERVICE_DIAGNOSTICS_TIMEOUT_MS,\n });\n const relativePath = join(\"diagnostics\", \"system-service.txt\");\n const targetPath = join(evidencePath, relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n const body = [\n `command: ${command} ${args.join(\" \")}`,\n `exitCode: ${String(result.exitCode)}`,\n \"\",\n \"stdout:\",\n result.stdout.trimEnd(),\n \"\",\n \"stderr:\",\n result.stderr.trimEnd(),\n \"\",\n ].join(\"\\n\");\n await writeFile(`${targetPath}`, body, \"utf8\");\n return {\n artifact: {\n errorMessage:\n result.exitCode === 0\n ? null\n : result.stderr.trim() ||\n `launchctl exited with ${String(result.exitCode)}`,\n relativePath,\n sourcePath: null,\n status: result.exitCode === 0 ? \"captured\" : \"error\",\n },\n };\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n input: {\n timeoutMs?: number;\n } = {}\n): Promise<{\n exitCode: number;\n stderr: string;\n stdout: string;\n}> {\n return await new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const clearListenersAndTimer = (): void => {\n child.removeListener(\"error\", handleError);\n child.removeListener(\"close\", handleClose);\n child.stdout?.removeListener(\"data\", handleStdout);\n child.stderr?.removeListener(\"data\", handleStderr);\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n };\n\n const resolveOnce = (result: {\n exitCode: number;\n stderr: string;\n stdout: string;\n }): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearListenersAndTimer();\n resolve(result);\n };\n\n const handleStdout = (chunk: Buffer | string): void => {\n stdout += chunk.toString();\n };\n const handleStderr = (chunk: Buffer | string): void => {\n stderr += chunk.toString();\n };\n const handleError = (error: Error): void => {\n resolveOnce({\n exitCode: 1,\n stderr: String(error),\n stdout,\n });\n };\n const handleClose = (code: number | null): void => {\n resolveOnce({\n exitCode: typeof code === \"number\" ? code : 1,\n stderr,\n stdout,\n });\n };\n const timeoutHandle =\n typeof input.timeoutMs === \"number\" && input.timeoutMs > 0\n ? setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n clearListenersAndTimer();\n child.kill(\"SIGKILL\");\n resolve({\n exitCode: 1,\n stderr: `timed out after ${input.timeoutMs}ms`,\n stdout,\n });\n }, input.timeoutMs)\n : null;\n\n child.stdout?.on(\"data\", handleStdout);\n child.stderr?.on(\"data\", handleStderr);\n child.once(\"error\", handleError);\n child.once(\"close\", handleClose);\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { cp, mkdtemp, readdir, rm, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeDataPath } from \"../../config/daemon-state\";\n\nconst DAEMON_RUNTIME_DATA_BACKUP_PREFIX = \"openmeld-daemon-runtime-data-\";\nconst DAEMON_RUNTIME_DATA_DIR_NAME = \"data\";\n\nexport type DaemonRuntimeDataBackup = {\n backupRootPath: string;\n backupDataPath: string;\n sourceDataPath: string;\n};\n\nexport async function backupDaemonRuntimeDataForReinstall(): Promise<DaemonRuntimeDataBackup | null> {\n const sourceDataPath = daemonRuntimeDataPath();\n const sourceStats = await stat(sourceDataPath).catch(() => null);\n if (!sourceStats?.isDirectory()) {\n return null;\n }\n\n const backupRootPath = await mkdtemp(\n join(tmpdir(), DAEMON_RUNTIME_DATA_BACKUP_PREFIX)\n );\n const backupDataPath = join(backupRootPath, DAEMON_RUNTIME_DATA_DIR_NAME);\n await cp(sourceDataPath, backupDataPath, {\n recursive: true,\n });\n return {\n backupRootPath,\n backupDataPath,\n sourceDataPath,\n };\n}\n\nexport async function restoreDaemonRuntimeDataForReinstall(\n backup: DaemonRuntimeDataBackup\n): Promise<void> {\n const backupStats = await stat(backup.backupDataPath).catch(() => null);\n if (!backupStats?.isDirectory()) {\n throw new Error(\n `daemon runtime data backup is missing: ${backup.backupDataPath}`\n );\n }\n await cp(backup.backupDataPath, backup.sourceDataPath, {\n recursive: true,\n });\n}\n\nexport async function cleanupDaemonRuntimeDataBackup(\n backup: DaemonRuntimeDataBackup | null\n): Promise<void> {\n if (!backup) {\n return;\n }\n await rm(backup.backupRootPath, {\n recursive: true,\n force: true,\n });\n}\n\nexport async function cleanupStaleDaemonRuntimeDataBackups(\n input: { retainBackupRootPaths?: readonly string[] } = {}\n): Promise<void> {\n const retainBackupRootPaths = new Set(input.retainBackupRootPaths ?? []);\n const tempEntries = await readdir(tmpdir(), {\n withFileTypes: true,\n }).catch(() => []);\n for (const entry of tempEntries) {\n if (\n !(\n entry.isDirectory() &&\n entry.name.startsWith(DAEMON_RUNTIME_DATA_BACKUP_PREFIX)\n )\n ) {\n continue;\n }\n const candidateRootPath = join(tmpdir(), entry.name);\n if (retainBackupRootPaths.has(candidateRootPath)) {\n continue;\n }\n await rm(candidateRootPath, {\n recursive: true,\n force: true,\n });\n }\n}\n","import process from \"node:process\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport { sleep } from \"@openmeld/utils\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\n// Minimum runtime-lease heartbeat stall before the lifecycle stop path may\n// escalate a SIGTERM timeout to SIGKILL. The carrier refreshes the lease\n// heartbeat every few seconds while its run loop is alive, and the runtime\n// observer already treats the lease as stale after DAEMON_HEARTBEAT_STALE_MS\n// (3 minutes); ten minutes is more than three full stale windows on top of\n// that, so a stall this long means the run loop is wedged, not busy.\nexport const FORCE_KILL_MIN_HEARTBEAT_STALL_MS = 10 * 60 * 1000;\n\nconst FORCE_KILL_EXIT_WAIT_MS = 2000;\nconst FORCE_KILL_EXIT_POLL_MS = 100;\n\nexport type StalledDaemonForceKillSkipReason =\n | \"runtime_lease_missing\"\n | \"lease_pid_invalid\"\n | \"lease_pid_not_owned\"\n | \"foreground_process\"\n | \"heartbeat_unparseable\"\n | \"heartbeat_fresh\";\n\nexport type StalledDaemonForceKillVerdict =\n | {\n decision: \"force_kill\";\n pid: number;\n heartbeatStalledMs: number;\n }\n | {\n decision: \"skip\";\n reason: StalledDaemonForceKillSkipReason;\n pid: number | null;\n heartbeatStalledMs: number | null;\n };\n\n// Safety boundary for escalating a stop to SIGKILL. Force-kill fires only when\n// BOTH hold:\n//\n// 1. The user (or setup/repair acting on the user's explicit request) asked\n// the lifecycle to stop this daemon and the graceful SIGTERM window\n// already elapsed. This is never a background reaper.\n// 2. The daemon's runtime lease heartbeat has been stalled for at least\n// FORCE_KILL_MIN_HEARTBEAT_STALL_MS. The carrier cannot accept, run, or\n// report Wake work without its run loop, and the same run loop owns the\n// heartbeat, so a stalled heartbeat is direct evidence that no in-flight\n// Wake execution can be making progress on this process (pre-0.7.99\n// daemons sleeping through SIGTERM inside an uninterruptible reconnect\n// backoff are the motivating production case).\n//\n// This does not conflict with the \"a running execution must not be failed by\n// a fixed wall-clock timeout while fresh lifecycle/progress evidence arrives\"\n// guardrail: the trigger here is the absence of the daemon's own liveness\n// evidence combined with an explicit user stop request, not elapsed time on a\n// live execution. A daemon with a fresh heartbeat is never force-killed; the\n// caller falls back to the existing bounded-failure path instead. Heartbeat\n// staleness is used purely as local stop-safety evidence and must not feed\n// any liveness/readiness/availability projection.\nexport function resolveStalledDaemonForceKillVerdict(input: {\n nowMs: number;\n ownedProcesses: readonly DaemonOwnedProcess[];\n runtimeLease: DaemonRuntimeLease | null;\n}): StalledDaemonForceKillVerdict {\n const lease = input.runtimeLease;\n if (!lease) {\n return {\n decision: \"skip\",\n reason: \"runtime_lease_missing\",\n pid: null,\n heartbeatStalledMs: null,\n };\n }\n if (!Number.isInteger(lease.pid) || lease.pid <= 0) {\n return {\n decision: \"skip\",\n reason: \"lease_pid_invalid\",\n pid: null,\n heartbeatStalledMs: null,\n };\n }\n // Never signal a pid the process inventory does not attribute to an\n // OpenMeld-owned daemon: the lease can outlive its process and the pid can be\n // recycled by the OS.\n const ownedProcess = input.ownedProcesses.find(\n (candidate) =>\n candidate.pid === lease.pid && candidate.ownership !== \"unknown\"\n );\n if (!ownedProcess) {\n return {\n decision: \"skip\",\n reason: \"lease_pid_not_owned\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n // Foreground runs belong to an interactive terminal session; they are not\n // stop candidates for the lifecycle either (see\n // resolveSafeOwnedProcessStopCandidates) and stay out of force-kill scope.\n if (ownedProcess.mode === \"foreground\") {\n return {\n decision: \"skip\",\n reason: \"foreground_process\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n const freshnessTimestamp = lease.heartbeatAt ?? lease.updatedAt;\n const heartbeatMs = Date.parse(freshnessTimestamp);\n if (Number.isNaN(heartbeatMs)) {\n // Fail closed: without parseable heartbeat evidence the stall cannot be\n // proven, so the caller keeps the existing failure path.\n return {\n decision: \"skip\",\n reason: \"heartbeat_unparseable\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n const heartbeatStalledMs = input.nowMs - heartbeatMs;\n if (heartbeatStalledMs < FORCE_KILL_MIN_HEARTBEAT_STALL_MS) {\n return {\n decision: \"skip\",\n reason: \"heartbeat_fresh\",\n pid: lease.pid,\n heartbeatStalledMs,\n };\n }\n return {\n decision: \"force_kill\",\n pid: lease.pid,\n heartbeatStalledMs,\n };\n}\n\nexport type StalledDaemonForceKillOutcome = {\n killed: boolean;\n verdict: StalledDaemonForceKillVerdict;\n};\n\ntype StalledDaemonForceKillDeps = {\n emitLifecycleEvent: typeof emitDaemonLifecycleEvent;\n killProcess: (pid: number, signal: NodeJS.Signals) => void;\n listOwnedProcesses: () => Promise<readonly DaemonOwnedProcess[]>;\n nowMs: () => number;\n readRuntimeLease: () => Promise<DaemonRuntimeLease | null>;\n waitForProcessExit: (pid: number) => Promise<boolean>;\n};\n\nconst defaultStalledDaemonForceKillDeps: StalledDaemonForceKillDeps = {\n emitLifecycleEvent: emitDaemonLifecycleEvent,\n killProcess: (pid, signal) => process.kill(pid, signal),\n listOwnedProcesses: async () =>\n await listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n nowMs: () => Date.now(),\n readRuntimeLease: async () => await readDaemonRuntimeLease(),\n waitForProcessExit: async (pid) => {\n const deadline = Date.now() + FORCE_KILL_EXIT_WAIT_MS;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) {\n return true;\n }\n await sleep(FORCE_KILL_EXIT_POLL_MS);\n }\n return !isPidAlive(pid);\n },\n};\n\n// Last-resort stop escalation for a daemon that ignored SIGTERM through the\n// bounded stop window. Old daemons (before the interruptible reconnect\n// backoff) park in `sleep(backoffMs)` for up to 15 minutes and only then\n// observe the stop flag, which is far longer than any lifecycle stop window;\n// without this fallback, setup/repair on such a machine can never succeed.\n// Every decision (kill or skip) lands in the lifecycle journal.\nexport async function forceKillStalledDaemonAfterStopTimeout(\n input: {\n stage: \"stop_or_drain\" | \"wait_stopped\";\n },\n deps: StalledDaemonForceKillDeps = defaultStalledDaemonForceKillDeps\n): Promise<StalledDaemonForceKillOutcome> {\n const [runtimeLease, ownedProcesses] = await Promise.all([\n deps.readRuntimeLease().catch(() => null),\n deps.listOwnedProcesses().catch((): readonly DaemonOwnedProcess[] => []),\n ]);\n const verdict = resolveStalledDaemonForceKillVerdict({\n nowMs: deps.nowMs(),\n ownedProcesses,\n runtimeLease,\n });\n if (verdict.decision === \"skip\") {\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_kill_skipped\",\n metadata: {\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: verdict.reason,\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: false, verdict };\n }\n try {\n deps.killProcess(verdict.pid, \"SIGKILL\");\n } catch (error) {\n if (!isProcessGoneError(error)) {\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_kill_failed\",\n metadata: {\n errorMessage: error instanceof Error ? error.message : String(error),\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: \"stalled_heartbeat_after_stop_timeout\",\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: false, verdict };\n }\n }\n const exited = await deps.waitForProcessExit(verdict.pid);\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_killed\",\n metadata: {\n exitObserved: exited,\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: \"stalled_heartbeat_after_stop_timeout\",\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: true, verdict };\n}\n\nfunction isProcessGoneError(error: unknown): boolean {\n return (\n error instanceof Error && (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n","import type { OpenMeldDistribution } from \"../../runtime/distribution\";\nimport { ensureDaemonSystemServiceCommandFiles } from \"./daemon-service-command-spec\";\nimport type {\n DaemonServiceCommandSpec,\n DaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nconst ROOT_ERROR_PATTERN =\n /\\s*Try re-running the command as root for richer errors\\.?/i;\n\nexport async function startDaemonSystemServiceWithAutoRepair(input: {\n serviceCommandSpec: DaemonServiceCommandSpec;\n systemManager: DaemonServiceManager;\n distribution?: OpenMeldDistribution;\n onAutoRepairAttempt?: () => Promise<void> | void;\n onAutoRepairRecovered?: () => Promise<void> | void;\n}): Promise<{\n autoRepairAttempted: boolean;\n}> {\n let autoRepairAttempted = false;\n try {\n await input.systemManager.start();\n return {\n autoRepairAttempted,\n };\n } catch (error) {\n if (\n !shouldAttemptLaunchdAutoRepair({\n controller: input.systemManager.controller,\n error,\n })\n ) {\n throw error;\n }\n\n autoRepairAttempted = true;\n await input.onAutoRepairAttempt?.();\n try {\n await input.systemManager.uninstall();\n await input.systemManager.waitUntilAbsent();\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.systemManager.controller,\n distribution: input.distribution,\n });\n await input.systemManager.install(input.serviceCommandSpec);\n await input.systemManager.start();\n await input.onAutoRepairRecovered?.();\n return {\n autoRepairAttempted,\n };\n } catch (retryError) {\n throw buildLaunchdAutoRepairFailureError({\n initialError: error,\n retryError,\n });\n }\n }\n}\n\nfunction sanitizeSystemServiceErrorMessage(message: string): string {\n return message.replace(ROOT_ERROR_PATTERN, \"\");\n}\n\nfunction isLaunchdBootstrapIosError(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"bootstrap failed\") &&\n normalized.includes(\"input/output error\")\n );\n}\n\nfunction shouldAttemptLaunchdAutoRepair(input: {\n controller: DaemonServiceManager[\"controller\"];\n error: unknown;\n}): boolean {\n if (input.controller !== \"launchd\") {\n return false;\n }\n const message = sanitizeSystemServiceErrorMessage(\n toErrorMessage(input.error)\n );\n return isLaunchdBootstrapIosError(message);\n}\n\nfunction buildLaunchdAutoRepairFailureError(input: {\n initialError: unknown;\n retryError: unknown;\n}): Error {\n return new Error(\n [\n \"launchd auto-repair retry failed.\",\n `initial error: ${toErrorMessage(input.initialError)}`,\n `retry error: ${toErrorMessage(input.retryError)}`,\n ].join(\" \")\n );\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { sleep } from \"@openmeld/utils\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport {\n type DaemonServiceInventory,\n inspectDaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport {\n type DaemonServiceJobDiagnostics,\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n formatDaemonServiceJobDiagnosticsEvidence,\n} from \"./daemon-service-manager\";\n\nconst DEFAULT_SERVICE_STARTUP_WAIT_MS = 5000;\nconst LAUNCHD_SERVICE_STARTUP_WAIT_MS = 90_000;\nconst WINDOWS_SERVICE_STARTUP_WAIT_MS = 45_000;\n\nexport class SystemServiceStartupTimeoutError extends Error {\n readonly code = \"openmeld.service.startup_timeout\";\n readonly inventory: DaemonServiceInventory | null;\n readonly managerStatus: DaemonServiceManagerRuntimeStatus | null;\n readonly runtimeStatus: DaemonServiceRuntimeStatus | null;\n readonly jobDiagnostics: DaemonServiceJobDiagnostics | null;\n\n constructor(input: {\n inventory: DaemonServiceInventory | null;\n managerStatus: DaemonServiceManagerRuntimeStatus | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n }) {\n super(buildSystemServiceStartupTimeoutMessage(input));\n this.name = \"SystemServiceStartupTimeoutError\";\n this.inventory = input.inventory;\n this.managerStatus = input.managerStatus;\n this.runtimeStatus = input.runtimeStatus;\n this.jobDiagnostics = input.jobDiagnostics ?? null;\n }\n}\n\nexport function resolveSystemServiceStartupWaitMs(\n controller: DaemonServiceManager[\"controller\"]\n): number {\n // launchd may defer a newly loaded background item before it spawns the\n // managed process. Keep one controller-owned budget for both an explicit\n // start and replacement verification.\n if (controller === \"launchd\") {\n return LAUNCHD_SERVICE_STARTUP_WAIT_MS;\n }\n // On a native Windows cold start, the task can be running before the Service\n // finishes initializing its local control plane and publishes its first\n // runtime lease. Keep this separate from the startup budget on other hosts.\n if (controller === \"windows-service\") {\n return WINDOWS_SERVICE_STARTUP_WAIT_MS;\n }\n return DEFAULT_SERVICE_STARTUP_WAIT_MS;\n}\n\nexport function isDaemonInventoryRunningAndStartReady(\n inventory: DaemonServiceInventory,\n blockingAnomalies: ReadonlySet<\n DaemonServiceInventory[\"anomalies\"][number][\"code\"]\n >\n): boolean {\n return (\n inventory.runtimeStatus.status === \"running\" &&\n inventory.runtimeStatus.mode === \"background\" &&\n inventory.runtimeStatus.managedBySystemService === true &&\n inventory.serviceManagerStatus?.running === true &&\n !inventory.anomalies.some((anomaly) => blockingAnomalies.has(anomaly.code))\n );\n}\n\nexport async function waitForSystemServiceStartup(input: {\n expectedVersion: string;\n manager: DaemonServiceManager;\n waitMs?: number;\n pollMs: number;\n isReady: (inventory: DaemonServiceInventory) => boolean;\n intent?: Parameters<typeof inspectDaemonServiceInventory>[0][\"intent\"];\n}): Promise<{\n inventory: DaemonServiceInventory;\n state: \"running\";\n runtimeStatus: DaemonServiceRuntimeStatus;\n}> {\n const waitMs =\n input.waitMs ?? resolveSystemServiceStartupWaitMs(input.manager.controller);\n const deadlineMs = Date.now() + waitMs;\n let lastInventory: DaemonServiceInventory | null = null;\n while (Date.now() < deadlineMs) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: input.intent ?? \"run_background\",\n }).catch(() => null);\n if (inventory) {\n lastInventory = inventory;\n if (input.isReady(inventory)) {\n return {\n inventory,\n state: \"running\",\n runtimeStatus: inventory.runtimeStatus,\n };\n }\n }\n await sleep(input.pollMs);\n }\n\n const finalInventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: input.intent ?? \"run_background\",\n }).catch(() => null);\n if (finalInventory) {\n lastInventory = finalInventory;\n if (input.isReady(finalInventory)) {\n return {\n inventory: finalInventory,\n state: \"running\",\n runtimeStatus: finalInventory.runtimeStatus,\n };\n }\n }\n\n // Raw controller job details explain a failed wait only. Readiness above is\n // decided by the complete local inventory and never by these diagnostics.\n const finalJobDiagnostics =\n (await input.manager.readJobDiagnostics?.().catch(() => null)) ?? null;\n throw new SystemServiceStartupTimeoutError({\n inventory: lastInventory,\n // Report the observation that failed the predicate. A later independent\n // runtime read can be healthy while these inventory anomalies are stale.\n managerStatus: lastInventory?.serviceManagerStatus ?? null,\n runtimeStatus: lastInventory?.runtimeStatus ?? null,\n jobDiagnostics: finalJobDiagnostics,\n });\n}\n\nexport function buildSystemServiceStartupTimeoutMessage(input: {\n inventory: DaemonServiceInventory | null;\n managerStatus: DaemonServiceManagerRuntimeStatus | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n}): string {\n const base = `OpenMeld Service failed to reach a running local service state in time. runtime=${input.runtimeStatus?.status ?? \"unknown\"}, reason=${input.runtimeStatus?.reason || \"unknown\"}, managerRunning=${String(input.managerStatus?.running ?? \"unknown\")}, anomalies=${input.inventory?.anomalies.map((anomaly) => anomaly.code).join(\",\") || \"unknown\"}`;\n const lease = input.inventory?.runtimeLease;\n const observation = input.inventory\n ? `; runtimePid=${input.runtimeStatus?.pid ?? \"unknown\"}, managed=${String(input.runtimeStatus?.managedBySystemService ?? \"unknown\")}, leaseUpdatedAt=${lease?.updatedAt ?? \"missing\"}, leaseHeartbeatAt=${lease?.heartbeatAt ?? \"missing\"}, serviceCandidates=${input.inventory.ownedProcesses.map((candidate) => `${candidate.pid}:${candidate.ownership}`).join(\",\") || \"none\"}`\n : \"\";\n if (!input.jobDiagnostics) {\n return `${base}${observation}`;\n }\n return `${base}${observation}; ${formatDaemonServiceJobDiagnosticsEvidence(input.jobDiagnostics)}`;\n}\n\nexport function isSystemServiceStartupTimeoutError(\n error: unknown\n): error is SystemServiceStartupTimeoutError {\n return (\n error instanceof SystemServiceStartupTimeoutError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"openmeld.service.startup_timeout\")\n );\n}\n","import process from \"node:process\";\nimport type { DaemonServiceContract } from \"@openmeld/schemas/types\";\nimport { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport {\n normalizeGatewayBaseUrlOrNull,\n resolveExplicitGatewayUrlOrThrow,\n} from \"../../config/base-url\";\nimport {\n clearDaemonServiceContract,\n isDaemonServiceContractIdentityReusable,\n isUnsafeProductionDeviceId,\n readDaemonServiceContract,\n upsertDaemonServiceContract,\n} from \"../../config/daemon-service-contract\";\nimport {\n type DaemonInstallSource,\n type DaemonInstallState,\n installDaemon,\n readDaemonServiceRuntimeSnapshot,\n restoreDaemonInstallStateSnapshot,\n rotateDaemonControlPlaneTokenIfExpired,\n} from \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport type { OpenMeldProfile } from \"../../config/openmeld-profiles-api\";\nimport { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { resolveOpenMeldProfileOrNull } from \"../../config/resolve-openmeld-profile\";\nimport { compareSemver, readVersionState } from \"../../config/version-state\";\nimport type { OpenMeldDistribution } from \"../../runtime/distribution\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../core/constants\";\nimport {\n normalizeHeartbeatIntervalMs,\n normalizeOptionalText,\n} from \"../core/logger\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n resolvePreferredDaemonDeviceId,\n} from \"../state/daemon-device-id\";\nimport {\n backupDaemonRuntimeDataForReinstall,\n cleanupDaemonRuntimeDataBackup,\n cleanupStaleDaemonRuntimeDataBackups,\n type DaemonRuntimeDataBackup,\n restoreDaemonRuntimeDataForReinstall,\n} from \"../state/runtime-data-preservation\";\nimport {\n emitDaemonLifecycleEvent,\n runDaemonServiceManagerAction,\n} from \"./daemon-lifecycle-journal\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"./daemon-service-alignment-target\";\nimport {\n activateDaemonServiceBundle,\n type DaemonActiveBundleState,\n discardPreparedDaemonServiceBundle,\n isDaemonBundleSourceAllowedForLane,\n prepareDaemonServiceBundle,\n restoreDaemonActiveBundleStateSnapshot,\n verifyDaemonActiveBundleIntegrity,\n} from \"./daemon-service-bundle\";\nimport { normalizeDaemonCommandPath } from \"./daemon-service-command-path\";\nimport {\n buildDaemonSystemServiceCommandSpec,\n ensureDaemonSystemServiceCommandFiles,\n} from \"./daemon-service-command-spec\";\nimport {\n type DaemonServiceContractMissingField,\n writeDaemonServiceContract,\n} from \"./daemon-service-contract-writer\";\nimport {\n captureDaemonServiceEvidenceBestEffort,\n type DaemonServiceFailureStage,\n} from \"./daemon-service-evidence\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"./daemon-service-inventory\";\nimport { cleanupLegacySharedDaemonServiceState } from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n disableDaemonServiceAutostartIfConfigured,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\nimport {\n clearDaemonRuntimeStateIfDefinitelyStopped,\n getEffectiveDaemonRuntimeStatus,\n readCurrentObservedDaemonRuntimeStatus,\n waitForDaemonSystemServiceToStop,\n} from \"./daemon-service-runtime\";\nimport { forceKillStalledDaemonAfterStopTimeout } from \"./daemon-service-stalled-force-kill\";\nimport { startDaemonSystemServiceWithAutoRepair } from \"./daemon-service-start-recovery\";\nimport {\n isSystemServiceStartupTimeoutError,\n waitForSystemServiceStartup,\n} from \"./daemon-service-startup-wait\";\nimport { ensureDaemonServiceMaintenanceInstalled } from \"./daemon-service-update-worker-manager\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nconst STRICT_TEARDOWN_VERIFY_WAIT_MS = 15_000;\nconst STRICT_TEARDOWN_VERIFY_POLL_MS = 200;\nconst PROCESS_STOP_WAIT_MS = 2000;\nconst MISSING_CONTROLLED_SHUTDOWN_CLOSE_REASON_FIXED_VERSION = \"0.2.88\";\nconst MISSING_REQUIRED_CONTRACT_FIELDS_REASON =\n \"missing_required_contract_fields\";\nconst VERIFIED_ROLLBACK_UNTRUSTED_ANOMALIES = new Set<DaemonServiceAnomalyCode>(\n [\n \"background_foreground_conflict\",\n \"bundle_id_drift\",\n \"bundle_lane_drift\",\n \"bundle_missing\",\n \"bundle_path_invalid\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"duplicate_owned_processes\",\n \"foreground_background_conflict\",\n \"legacy_detached_runtime\",\n \"legacy_shared_service_present\",\n \"lifecycle_locked\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n ]\n);\nconst STOPPED_LIFECYCLE_RUNTIME_SNAPSHOT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\n ]);\n\nexport type DaemonServiceLifecycleOperation =\n | \"upgrade_reconcile\"\n | \"reinstall\"\n | \"startup_repair\";\n\nexport type DaemonServiceLifecyclePhase =\n | \"inspect\"\n | \"backup\"\n | \"stop_or_drain\"\n | \"wait_stopped\"\n | \"unregister\"\n | \"wait_absent\"\n | \"prepare_bundle\"\n | \"install_bundle\"\n | \"write_contract\"\n | \"register_service\"\n | \"restore_runtime_data\"\n | \"start_if_desired\"\n | \"wait_running\"\n | \"verify_final_inventory\";\n\nexport type DaemonServiceLifecycleRecoveryStatus =\n | \"restored_verified_previous_state\"\n | \"stopped_safe_current_version\"\n | \"failed_before_safe_state\";\n\ntype DaemonServiceLifecycleReasonCode =\n | DaemonServiceAnomalyCode\n | \"unknown_owned_processes\"\n | typeof MISSING_REQUIRED_CONTRACT_FIELDS_REASON;\n\nexport type DaemonServiceLifecycleOutcome =\n | {\n status: \"already_aligned\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: [];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"aligned\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: [];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"stopped_safe\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n failureStage: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n recoveryStatus: \"stopped_safe_current_version\";\n errorMessage: string;\n }\n | {\n status: \"blocked\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"failed\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory | null;\n inventoryAfter: DaemonServiceInventory | null;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\" | null;\n shouldStartAfterLifecycle: boolean | null;\n backupDataPath: string | null;\n failureStage: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n recoveryStatus: DaemonServiceLifecycleRecoveryStatus;\n errorCode: string | null;\n errorMessage: string;\n };\n\nexport class DaemonServiceLifecycleDrainTimeoutError extends Error {\n readonly waitMs: number;\n\n constructor(waitMs: number) {\n super(`graceful shutdown timed out after ${String(waitMs)}ms`);\n this.name = \"DaemonServiceLifecycleDrainTimeoutError\";\n this.waitMs = waitMs;\n }\n}\n\nclass DaemonServiceLifecycleControlledDrainError extends Error {\n override readonly cause: unknown;\n\n constructor(cause: unknown) {\n super(`controlled service drain failed: ${toErrorMessage(cause)}`);\n this.name = \"DaemonServiceLifecycleControlledDrainError\";\n this.cause = cause;\n }\n}\n\nclass DaemonServiceLifecycleStageError extends Error {\n override readonly cause: unknown;\n readonly reasonCodes: DaemonServiceLifecycleReasonCode[];\n readonly stage: DaemonServiceFailureStage;\n\n constructor(input: {\n cause?: unknown;\n message: string;\n reasonCodes?: DaemonServiceLifecycleReasonCode[];\n stage: DaemonServiceFailureStage;\n }) {\n super(input.message);\n this.name = \"DaemonServiceLifecycleStageError\";\n this.stage = input.stage;\n this.reasonCodes = input.reasonCodes ?? [];\n this.cause = input.cause;\n }\n}\n\ntype DaemonServiceLifecycleRestorePoint = {\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n previousActiveBundle: DaemonActiveBundleState | null;\n previousContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n previousInstallState: DaemonInstallState | null;\n trusted: boolean;\n};\n\ntype DaemonServiceLifecycleMutableState = {\n completedPhases: DaemonServiceLifecyclePhase[];\n inventoryBefore: DaemonServiceInventory | null;\n desiredState: \"background\" | \"stopped\" | null;\n shouldStartAfterLifecycle: boolean | null;\n runtimeDataBackup: DaemonRuntimeDataBackup | null;\n backupDataPath: string | null;\n backupRootPath: string | null;\n evidencePath: string | null;\n failureStage: DaemonServiceFailureStage | null;\n};\n\ntype DaemonServiceLifecycleCommandOptions = {\n environmentTarget: OpenMeldEnvironmentTarget;\n gatewayUrl?: string;\n ownerUserId?: string;\n openMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n};\n\ntype DaemonServiceLifecycleContext = {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n serviceManager: DaemonServiceManager;\n};\n\nfunction toLifecycleIntent(\n operation: DaemonServiceLifecycleOperation\n): \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\" {\n switch (operation) {\n case \"reinstall\":\n return \"reinstall\";\n case \"upgrade_reconcile\":\n return \"upgrade_reconcile\";\n case \"startup_repair\":\n return \"startup_check\";\n default:\n throw new Error(`Unsupported lifecycle operation: ${String(operation)}`);\n }\n}\n\nexport async function runDaemonServiceLifecycle(input: {\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n installSource: DaemonInstallSource;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n desiredState?: \"background\" | \"stopped\";\n shouldStartAfterLifecycle?: boolean;\n forceReinstall?: boolean;\n drainWaitMs?: number;\n forceKillAfterDrainTimeout?: boolean;\n preparedBundle?: DaemonActiveBundleState;\n onPhase?: (phase: DaemonServiceLifecyclePhase) => Promise<void> | void;\n}): Promise<DaemonServiceLifecycleOutcome> {\n let preparedBundle: DaemonActiveBundleState | null =\n input.preparedBundle ?? null;\n const ownsPreparedBundle = input.preparedBundle === undefined;\n const state: DaemonServiceLifecycleMutableState = {\n completedPhases: [],\n inventoryBefore: null,\n desiredState: null,\n shouldStartAfterLifecycle: null,\n runtimeDataBackup: null,\n backupDataPath: null,\n backupRootPath: null,\n evidencePath: null,\n failureStage: null,\n };\n const target = buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n gatewayUrl: input.gatewayUrl,\n });\n const emitPhase = async (\n phase: DaemonServiceLifecyclePhase\n ): Promise<void> => {\n state.completedPhases.push(phase);\n await input.onPhase?.(phase);\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n };\n\n try {\n await emitPhase(\"inspect\");\n state.inventoryBefore = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: resolveLifecycleIntendedMode(input),\n intent: toLifecycleIntent(input.operation),\n });\n const inventoryBefore = state.inventoryBefore;\n const desiredState =\n input.desiredState ?? resolveLifecycleDesiredState(inventoryBefore);\n const shouldStartAfterLifecycle =\n input.shouldStartAfterLifecycle ??\n resolveLifecycleShouldStartAfterLifecycle({\n desiredState,\n inventory: inventoryBefore,\n });\n state.desiredState = desiredState;\n state.shouldStartAfterLifecycle = shouldStartAfterLifecycle;\n const immediateOutcome = resolveImmediateLifecycleOutcome({\n completedPhases: state.completedPhases,\n desiredState,\n expectedVersion: input.expectedVersion,\n forceReinstall: input.forceReinstall === true,\n inventoryBefore,\n shouldStartAfterLifecycle,\n target,\n });\n if (immediateOutcome) {\n if (immediateOutcome.status === \"already_aligned\") {\n await cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n input.operation\n );\n }\n return immediateOutcome;\n }\n const serviceManager =\n await resolveLifecycleServiceManager(inventoryBefore);\n if (!serviceManager) {\n throw new DaemonServiceLifecycleStageError({\n message:\n \"OpenMeld could not resolve a system service manager for local service lifecycle repair.\",\n stage: \"inspect\",\n });\n }\n const commandOptions = await resolveLifecycleCommandOptions({\n inventory: inventoryBefore,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n });\n const restorePoint = await createLifecycleRestorePoint({\n desiredState,\n inventoryBefore,\n shouldStartAfterLifecycle,\n });\n const context: DaemonServiceLifecycleContext = {\n commandOptions,\n currentContract: inventoryBefore.serviceContract ?? null,\n desiredState,\n shouldStartAfterLifecycle,\n serviceManager,\n };\n\n state.evidencePath = await captureDaemonServiceEvidenceBestEffort({\n evidencePath: state.evidencePath ?? undefined,\n phase: \"before_cleanup\",\n profile: input.profile,\n });\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n\n state.failureStage = \"prepare_bundle\";\n await emitPhase(\"prepare_bundle\");\n preparedBundle = await resolveLifecycleReplacementBundle({\n cliScriptPath: input.cliScriptPath,\n daemonVersion: input.expectedVersion,\n preparedBundle,\n });\n\n return await executeDaemonServiceLifecycle({\n context,\n emitPhase,\n expectedVersion: input.expectedVersion,\n installSource: input.installSource,\n inventoryBefore,\n operation: input.operation,\n cliScriptPath: input.cliScriptPath,\n state,\n target,\n restorePoint,\n preparedBundle,\n drainWaitMs: input.drainWaitMs ?? PROCESS_STOP_WAIT_MS,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout === true,\n });\n } catch (error) {\n if (error instanceof DaemonServiceLifecycleDrainTimeoutError) {\n throw error;\n }\n state.evidencePath =\n (await captureDaemonServiceEvidenceBestEffort({\n evidencePath: state.evidencePath ?? undefined,\n phase: \"after_failure\",\n profile: input.profile,\n })) ?? state.evidencePath;\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n await cleanupStaleDaemonRuntimeDataBackups(\n buildFailedLifecycleBackupCleanupInput(state.backupRootPath)\n ).catch(() => undefined);\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: state.inventoryBefore,\n inventoryAfter: null,\n reasonCodes: [],\n completedPhases: state.completedPhases,\n desiredState: state.desiredState,\n shouldStartAfterLifecycle: state.shouldStartAfterLifecycle,\n backupDataPath: state.backupDataPath,\n failureStage: state.failureStage,\n evidencePath: state.evidencePath,\n recoveryStatus: \"failed_before_safe_state\",\n errorCode: resolveLifecycleFailureErrorCode(error),\n errorMessage: toErrorMessage(error),\n };\n } finally {\n await cleanupPreparedBundleAfterLifecycle({\n operation: input.operation,\n preparedBundle: ownsPreparedBundle ? preparedBundle : null,\n });\n }\n}\n\nfunction resolveLifecycleIntendedMode(input: {\n desiredState?: \"background\" | \"stopped\";\n shouldStartAfterLifecycle?: boolean;\n}): \"background\" | undefined {\n return input.shouldStartAfterLifecycle === true ||\n input.desiredState === \"background\"\n ? \"background\"\n : undefined;\n}\n\nfunction buildFailedLifecycleBackupCleanupInput(\n backupRootPath: string | null\n): { retainBackupRootPaths: string[] } | Record<string, never> {\n return backupRootPath ? { retainBackupRootPaths: [backupRootPath] } : {};\n}\n\nasync function resolveLifecycleReplacementBundle(input: {\n cliScriptPath?: string;\n daemonVersion: string;\n preparedBundle: DaemonActiveBundleState | null;\n}): Promise<DaemonActiveBundleState> {\n if (input.preparedBundle) {\n return input.preparedBundle;\n }\n return await prepareLifecycleReplacementBundle({\n cliScriptPath: input.cliScriptPath,\n daemonVersion: input.daemonVersion,\n });\n}\n\nasync function prepareLifecycleReplacementBundle(input: {\n cliScriptPath?: string;\n daemonVersion: string;\n}): Promise<DaemonActiveBundleState> {\n return await prepareDaemonServiceBundle({\n activate: false,\n daemonVersion: input.daemonVersion,\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n}\n\nasync function cleanupPreparedBundleAfterLifecycle(input: {\n operation: DaemonServiceLifecycleOperation;\n preparedBundle: DaemonActiveBundleState | null;\n}): Promise<void> {\n if (!input.preparedBundle) {\n return;\n }\n try {\n await discardPreparedDaemonServiceBundle(input.preparedBundle);\n } catch (error) {\n console.warn(\"[openmeld.daemon_bundle.cleanup_warning]\", {\n bundleId: input.preparedBundle.bundleId,\n errorMessage: toErrorMessage(error),\n operation: input.operation,\n });\n }\n}\n\nasync function executeDaemonServiceLifecycle(input: {\n context: DaemonServiceLifecycleContext;\n emitPhase: (phase: DaemonServiceLifecyclePhase) => Promise<void>;\n expectedVersion: string;\n installSource: DaemonInstallSource;\n inventoryBefore: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n preparedBundle: DaemonActiveBundleState;\n cliScriptPath?: string;\n state: DaemonServiceLifecycleMutableState;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n restorePoint: DaemonServiceLifecycleRestorePoint;\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n}): Promise<DaemonServiceLifecycleOutcome> {\n try {\n input.state.failureStage = \"stop_or_drain\";\n await input.emitPhase(\"stop_or_drain\");\n await stopLifecycleRuntime({\n drainWaitMs: input.drainWaitMs,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout,\n inventory: input.inventoryBefore,\n operation: input.operation,\n serviceManager: input.context.serviceManager,\n });\n\n input.state.failureStage = \"wait_stopped\";\n await input.emitPhase(\"wait_stopped\");\n await waitForLifecycleRuntimeStopped({\n inventory: input.inventoryBefore,\n serviceManager: input.context.serviceManager,\n });\n\n input.state.failureStage = \"backup\";\n await input.emitPhase(\"backup\");\n input.state.runtimeDataBackup = await backupDaemonRuntimeDataForReinstall();\n input.state.backupRootPath =\n input.state.runtimeDataBackup?.backupRootPath ?? null;\n input.state.backupDataPath =\n input.state.runtimeDataBackup?.backupDataPath ?? null;\n\n input.state.failureStage = \"unregister\";\n await input.emitPhase(\"unregister\");\n await input.context.serviceManager.uninstall();\n if (input.inventoryBefore.legacySharedService?.present) {\n await cleanupLegacySharedDaemonServiceState();\n await waitForLegacySharedServiceCleanup({\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n });\n }\n\n input.state.failureStage = \"wait_absent\";\n await input.emitPhase(\"wait_absent\");\n await waitForLifecycleRuntimeAbsentWithRetry(input.context.serviceManager);\n\n input.state.failureStage = \"install_bundle\";\n await input.emitPhase(\"install_bundle\");\n const preparedBundle = input.preparedBundle;\n // An older running Service may cache this token when it starts. Rotate only\n // after the previous Service is verified absent so the CLI and Service can\n // never end up using different control-plane credentials.\n await rotateDaemonControlPlaneTokenIfExpired();\n await activateDaemonServiceBundle(preparedBundle);\n await installDaemon({\n daemonVersion: input.expectedVersion,\n source: input.installSource,\n });\n\n input.state.failureStage = \"write_contract\";\n await input.emitPhase(\"write_contract\");\n await ensureLifecycleServiceContract({\n commandOptions: input.context.commandOptions,\n currentContract: input.context.currentContract,\n daemonVersion: input.expectedVersion,\n desiredState: input.context.desiredState,\n preparedBundle,\n serviceController: input.context.serviceManager.controller,\n });\n\n input.state.failureStage = \"register_service\";\n await input.emitPhase(\"register_service\");\n const serviceDistribution: OpenMeldDistribution =\n preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\";\n const serviceCommandSpec = buildDaemonSystemServiceCommandSpec({\n ...(preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: preparedBundle.sourceEntryScriptPath }\n : {}),\n controller: input.context.serviceManager.controller,\n distribution: serviceDistribution,\n environmentTarget: input.context.commandOptions.environmentTarget,\n });\n await installDaemonSystemServiceRegistration({\n distribution: serviceDistribution,\n serviceCommandSpec,\n serviceManager: input.context.serviceManager,\n });\n await ensureDaemonServiceMaintenanceInstalled();\n if (!input.context.shouldStartAfterLifecycle) {\n await input.context.serviceManager.deactivate().catch(() => undefined);\n await input.context.serviceManager.waitUntilStopped();\n }\n\n if (input.state.runtimeDataBackup) {\n input.state.failureStage = \"restore_runtime_data\";\n await input.emitPhase(\"restore_runtime_data\");\n await restoreDaemonRuntimeDataForReinstall(input.state.runtimeDataBackup);\n await cleanupDaemonRuntimeDataBackup(input.state.runtimeDataBackup);\n input.state.runtimeDataBackup = null;\n input.state.backupDataPath = null;\n input.state.backupRootPath = null;\n }\n\n if (input.context.shouldStartAfterLifecycle) {\n input.state.failureStage = \"start_if_desired\";\n await input.emitPhase(\"start_if_desired\");\n await startDaemonSystemServiceWithAutoRepair({\n distribution: serviceDistribution,\n serviceCommandSpec,\n systemManager: input.context.serviceManager,\n });\n\n input.state.failureStage = \"wait_running\";\n await input.emitPhase(\"wait_running\");\n }\n\n input.state.failureStage = \"verify_final_inventory\";\n await input.emitPhase(\"verify_final_inventory\");\n const verifyFinalInventory = async (): Promise<DaemonServiceInventory> =>\n await waitForVerifiedLifecycleInventory({\n desiredState: input.context.desiredState,\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n serviceManager: input.context.serviceManager,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n target: input.target,\n });\n const inventoryAfter = input.context.shouldStartAfterLifecycle\n ? await runDaemonServiceManagerAction({\n action: \"wait_running\",\n controller: input.context.serviceManager.controller,\n intent: toLifecycleIntent(input.operation),\n resolveErrorMetadata: (error) => {\n const startupError = readLifecycleStartupTimeoutError(error);\n return startupError?.jobDiagnostics\n ? { jobDiagnostics: startupError.jobDiagnostics }\n : null;\n },\n run: verifyFinalInventory,\n })\n : await verifyFinalInventory();\n await cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n input.operation\n );\n return {\n status: \"aligned\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter,\n reasonCodes: [],\n completedPhases: input.state.completedPhases,\n desiredState: input.context.desiredState,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n } catch (error) {\n if (\n error instanceof DaemonServiceLifecycleDrainTimeoutError ||\n error instanceof DaemonServiceLifecycleControlledDrainError\n ) {\n throw error;\n }\n input.state.evidencePath =\n (await captureDaemonServiceEvidenceBestEffort({\n evidencePath: input.state.evidencePath ?? undefined,\n phase: \"after_failure\",\n })) ?? input.state.evidencePath;\n await writeLifecycleEvidenceEvent({\n evidencePath: input.state.evidencePath,\n completedPhases: input.state.completedPhases,\n failureStage: input.state.failureStage,\n });\n const recovered = await recoverLifecycleFailure({\n commandOptions: input.context.commandOptions,\n currentContract: input.context.currentContract,\n error,\n expectedVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n operation: input.operation,\n restorePoint: input.restorePoint,\n serviceManager: input.context.serviceManager,\n state: input.state,\n target: input.target,\n cliScriptPath: input.cliScriptPath,\n });\n return recovered;\n }\n}\n\nasync function recoverLifecycleFailure(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n error: unknown;\n expectedVersion: string;\n inventoryBefore: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n restorePoint: DaemonServiceLifecycleRestorePoint;\n serviceManager: DaemonServiceManager;\n state: DaemonServiceLifecycleMutableState;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n cliScriptPath?: string;\n}): Promise<DaemonServiceLifecycleOutcome> {\n const originalErrorMessage = toErrorMessage(input.error);\n const originalErrorCode = resolveLifecycleFailureErrorCode(input.error);\n const originalFailureStage = resolveLifecycleFailureStage(\n input.error,\n input.state.failureStage\n );\n const originalReasonCodes = resolveLifecycleFailureReasonCodes(input.error);\n\n let verifiedRollbackError: unknown = null;\n if (\n input.restorePoint.trusted &&\n isVerifiedRollbackEligibleFailureStage(originalFailureStage)\n ) {\n const restoredPrevious = await restoreVerifiedPreviousState({\n restorePoint: input.restorePoint,\n serviceManager: input.serviceManager,\n }).catch((error) => {\n verifiedRollbackError = error;\n console.warn(\"[openmeld.daemon_service.verified_rollback_failed]\", {\n errorMessage: toErrorMessage(error),\n failureStage: originalFailureStage,\n operation: input.operation,\n previousVersion:\n input.restorePoint.previousInstallState?.daemonVersion ?? null,\n targetVersion: input.expectedVersion,\n });\n return null;\n });\n if (restoredPrevious) {\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: restoredPrevious,\n reasonCodes: originalReasonCodes,\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: input.state.backupDataPath,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"restored_verified_previous_state\",\n errorCode: originalErrorCode,\n errorMessage: originalErrorMessage,\n };\n }\n }\n const recoveryErrorMessage = verifiedRollbackError\n ? `${originalErrorMessage}; verified previous Service recovery failed: ${toErrorMessage(verifiedRollbackError)}`\n : originalErrorMessage;\n\n const stoppedSafe = await transitionLifecycleToStoppedSafeCurrentVersion({\n commandOptions: input.commandOptions,\n currentContract: input.currentContract,\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n runtimeDataBackup: input.state.runtimeDataBackup,\n serviceManager: input.serviceManager,\n cliScriptPath: input.cliScriptPath,\n }).catch((safeStopError) => {\n return { safeStopError };\n });\n\n if (\"safeStopError\" in stoppedSafe) {\n await cleanupStaleDaemonRuntimeDataBackups(\n input.state.backupRootPath\n ? {\n retainBackupRootPaths: [input.state.backupRootPath],\n }\n : {}\n );\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: null,\n reasonCodes: dedupeReasonCodes([\n ...originalReasonCodes,\n ...resolveLifecycleFailureReasonCodes(stoppedSafe.safeStopError),\n ]),\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: input.state.backupDataPath,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"failed_before_safe_state\",\n errorCode: originalErrorCode,\n errorMessage: `${recoveryErrorMessage}; stopped-safe recovery failed: ${toErrorMessage(stoppedSafe.safeStopError)}`,\n };\n }\n\n input.state.runtimeDataBackup = null;\n input.state.backupDataPath = null;\n input.state.backupRootPath = null;\n await cleanupStaleDaemonRuntimeDataBackups();\n return {\n status: \"stopped_safe\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: stoppedSafe,\n reasonCodes: originalReasonCodes,\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: null,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"stopped_safe_current_version\",\n errorMessage: recoveryErrorMessage,\n };\n}\n\nfunction isVerifiedRollbackEligibleFailureStage(\n failureStage: DaemonServiceFailureStage | null\n): boolean {\n return (\n failureStage === \"install_bundle\" ||\n failureStage === \"write_contract\" ||\n failureStage === \"register_service\" ||\n failureStage === \"restore_runtime_data\" ||\n failureStage === \"start_if_desired\" ||\n failureStage === \"wait_running\" ||\n failureStage === \"verify_final_inventory\"\n );\n}\n\nasync function restoreVerifiedPreviousState(input: {\n restorePoint: DaemonServiceLifecycleRestorePoint;\n serviceManager: DaemonServiceManager;\n}): Promise<DaemonServiceInventory> {\n const previousVersion =\n input.restorePoint.previousInstallState?.daemonVersion ??\n input.restorePoint.previousContract?.daemonVersion;\n if (!previousVersion) {\n throw new Error(\n \"verified rollback is missing the previous daemon version.\"\n );\n }\n const requiredFloor = (await readVersionState())?.required_floor?.trim();\n if (requiredFloor && compareSemver(previousVersion, requiredFloor) < 0) {\n throw new Error(\n `verified rollback version ${previousVersion} is below the required version floor ${requiredFloor}.`\n );\n }\n await input.serviceManager.uninstall();\n await input.serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n await restoreDaemonInstallStateSnapshot(\n input.restorePoint.previousInstallState\n );\n await restoreDaemonActiveBundleStateSnapshot(\n input.restorePoint.previousActiveBundle\n );\n await restoreLifecycleServiceContractSnapshot(\n input.restorePoint.previousContract\n );\n const previousDistribution: OpenMeldDistribution =\n input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? \"binary\"\n : \"npm\";\n await installDaemonSystemServiceRegistration({\n distribution: previousDistribution,\n serviceCommandSpec: buildDaemonSystemServiceCommandSpec({\n ...(input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? {\n binaryExecutablePath:\n input.restorePoint.previousActiveBundle.sourceEntryScriptPath,\n }\n : {}),\n controller: input.serviceManager.controller,\n distribution: previousDistribution,\n environmentTarget: resolveOpenMeldEnvironmentTargetFromEnv(),\n }),\n serviceManager: input.serviceManager,\n });\n if (input.restorePoint.shouldStartAfterLifecycle) {\n await input.serviceManager.start();\n } else {\n await input.serviceManager.waitUntilStopped();\n }\n const inventoryAfter = await waitForVerifiedLifecycleInventory({\n desiredState: input.restorePoint.desiredState,\n expectedVersion: previousVersion,\n operation: \"upgrade_reconcile\",\n serviceManager: input.serviceManager,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: previousVersion,\n distribution:\n input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? \"binary\"\n : \"npm\",\n }),\n });\n return inventoryAfter;\n}\n\nasync function transitionLifecycleToStoppedSafeCurrentVersion(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n runtimeDataBackup: DaemonRuntimeDataBackup | null;\n serviceManager: DaemonServiceManager;\n cliScriptPath?: string;\n}): Promise<DaemonServiceInventory> {\n await input.serviceManager.uninstall().catch(() => undefined);\n await input.serviceManager.waitUntilAbsent().catch(() => undefined);\n await ensureNoOwnedProcessesRemain();\n const preparedBundle = await prepareDaemonServiceBundle({\n daemonVersion: input.expectedVersion,\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n await installDaemon({\n daemonVersion: input.expectedVersion,\n source: \"cli.auto_check\",\n });\n await ensureLifecycleServiceContract({\n commandOptions: input.commandOptions,\n currentContract: input.currentContract,\n daemonVersion: input.expectedVersion,\n desiredState: \"stopped\",\n preparedBundle,\n serviceController: input.serviceManager.controller,\n });\n const serviceDistribution: OpenMeldDistribution =\n preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\";\n await installDaemonSystemServiceRegistration({\n distribution: serviceDistribution,\n serviceCommandSpec: buildDaemonSystemServiceCommandSpec({\n ...(preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: preparedBundle.sourceEntryScriptPath }\n : {}),\n controller: input.serviceManager.controller,\n distribution: serviceDistribution,\n environmentTarget: input.commandOptions.environmentTarget,\n }),\n serviceManager: input.serviceManager,\n });\n await input.serviceManager.waitUntilStopped();\n if (input.runtimeDataBackup) {\n await restoreDaemonRuntimeDataForReinstall(input.runtimeDataBackup);\n await cleanupDaemonRuntimeDataBackup(input.runtimeDataBackup);\n }\n return await waitForVerifiedLifecycleInventory({\n desiredState: \"stopped\",\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n serviceManager: input.serviceManager,\n shouldStartAfterLifecycle: false,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n }),\n });\n}\n\nfunction readLifecycleStartupTimeoutError(error: unknown) {\n if (isSystemServiceStartupTimeoutError(error)) {\n return error;\n }\n if (\n error instanceof DaemonServiceLifecycleStageError &&\n isSystemServiceStartupTimeoutError(error.cause)\n ) {\n return error.cause;\n }\n return null;\n}\n\nasync function createLifecycleRestorePoint(input: {\n desiredState: \"background\" | \"stopped\";\n inventoryBefore: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): Promise<DaemonServiceLifecycleRestorePoint> {\n const previousActiveBundle = input.inventoryBefore.activeBundle ?? null;\n const activeBundleIntegrityVerified = previousActiveBundle\n ? await verifyDaemonActiveBundleIntegrity(previousActiveBundle).catch(\n () => false\n )\n : false;\n return {\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n previousActiveBundle,\n previousContract: input.inventoryBefore.serviceContract ?? null,\n previousInstallState: input.inventoryBefore.installStatus.installed\n ? input.inventoryBefore.installStatus.state\n : null,\n trusted: isVerifiedRollbackRestorePointTrusted({\n activeBundleIntegrityVerified,\n inventory: input.inventoryBefore,\n }),\n };\n}\n\nfunction isVerifiedRollbackRestorePointTrusted(input: {\n activeBundleIntegrityVerified: boolean;\n inventory: DaemonServiceInventory;\n}): boolean {\n const inventory = input.inventory;\n const previousInstallState = inventory.installStatus.installed\n ? inventory.installStatus.state\n : null;\n const previousContract = inventory.serviceContract ?? null;\n const previousActiveBundle = inventory.activeBundle ?? null;\n if (!(previousInstallState && previousContract && previousActiveBundle)) {\n return false;\n }\n if (!isDaemonServiceContractIdentityReusable(previousContract)) {\n return false;\n }\n if (previousContract.serviceController === \"legacy-detached\") {\n return false;\n }\n if (\n previousInstallState.daemonVersion !== previousContract.daemonVersion ||\n previousInstallState.daemonVersion !== previousActiveBundle.daemonVersion\n ) {\n return false;\n }\n if (previousContract.bundleId !== previousActiveBundle.bundleId) {\n return false;\n }\n if (\n previousActiveBundle.bundleFormat !== \"self_contained_v1\" &&\n previousActiveBundle.bundleFormat !== \"binary_v1\"\n ) {\n return false;\n }\n if (!input.activeBundleIntegrityVerified) {\n return false;\n }\n if (\n inventory.anomalies.some((anomaly) =>\n VERIFIED_ROLLBACK_UNTRUSTED_ANOMALIES.has(anomaly.code)\n )\n ) {\n return false;\n }\n return (\n typeof inventory.activeBundleEntryPath === \"string\" &&\n inventory.activeBundleEntryPath.length > 0\n );\n}\n\nasync function stopLifecycleRuntime(input: {\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n inventory: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const lifecycleIntent = toLifecycleIntent(input.operation);\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: lifecycleIntent,\n metadata: {\n drainWaitMs: input.drainWaitMs,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout,\n strategy: \"controlled_drain\",\n },\n result: \"selected\",\n stopCause: \"controlled_service_update\",\n type: \"stop.strategy.selected\",\n });\n const usesSystemService =\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.serviceManagerStatus?.installed === true ||\n input.inventory.serviceManagerStatus?.running === true;\n if (usesSystemService) {\n await stopLifecycleSystemServiceRuntime({\n ...input,\n lifecycleIntent,\n });\n return;\n }\n const runtimeStatus = input.inventory.runtimeStatus;\n if (runtimeStatus.status !== \"running\") {\n return;\n }\n if (!Number.isInteger(runtimeStatus.pid) || runtimeStatus.pid === null) {\n throw new DaemonServiceLifecycleStageError({\n message: \"OpenMeld runtime is marked running but no pid is available.\",\n stage: \"stop_or_drain\",\n });\n }\n const terminated = await stopDaemonProcessWithTimeout(\n runtimeStatus.pid,\n \"SIGTERM\",\n input.drainWaitMs\n );\n if (terminated) {\n return;\n }\n // `forceKillAfterDrainTimeout` stays the explicit user-confirmed force\n // path; the stalled-heartbeat fallback below is the automatic escape for\n // daemons that are provably wedged and would otherwise keep every stop\n // and repair failing.\n if (input.forceKillAfterDrainTimeout) {\n await stopDaemonProcess(runtimeStatus.pid, \"SIGKILL\");\n return;\n }\n const forceKill = await forceKillStalledDaemonAfterStopTimeout({\n stage: \"stop_or_drain\",\n });\n if (!forceKill.killed) {\n throw new DaemonServiceLifecycleDrainTimeoutError(input.drainWaitMs);\n }\n}\n\nasync function stopLifecycleSystemServiceRuntime(input: {\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n inventory: DaemonServiceInventory;\n lifecycleIntent: \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\";\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const restoreAutostartOnDrainFailure =\n await disableDaemonServiceAutostartIfConfigured({\n manager: input.serviceManager,\n status: input.inventory.serviceManagerStatus,\n });\n let drained = false;\n try {\n drained =\n hasActiveLifecycleRuntimeEvidence(input.inventory) &&\n !input.forceKillAfterDrainTimeout &&\n (await requestControlledSystemServiceDrain({\n drainWaitMs: input.drainWaitMs,\n inventory: input.inventory,\n lifecycleIntent: input.lifecycleIntent,\n operation: input.operation,\n }));\n } catch (drainError) {\n if (restoreAutostartOnDrainFailure) {\n try {\n await input.serviceManager.enableAutostart();\n } catch (restoreError) {\n throw new DaemonServiceLifecycleStageError({\n cause: restoreError,\n message: `${toErrorMessage(drainError)}; failed to restore service autostart: ${toErrorMessage(restoreError)}`,\n stage: \"stop_or_drain\",\n });\n }\n }\n throw drainError;\n }\n await input.serviceManager.stop();\n if (drained) {\n return;\n }\n const stopCandidates = resolveSafeOwnedProcessStopCandidates(input.inventory);\n for (const processInfo of stopCandidates) {\n await stopDaemonProcess(processInfo.pid, \"SIGTERM\");\n }\n}\n\nfunction hasActiveLifecycleRuntimeEvidence(\n inventory: DaemonServiceInventory\n): boolean {\n return (\n inventory.runtimeStatus.status === \"running\" ||\n inventory.serviceManagerStatus?.running === true ||\n inventory.ownedProcesses.length > 0\n );\n}\n\nasync function requestControlledSystemServiceDrain(input: {\n drainWaitMs: number;\n inventory: DaemonServiceInventory;\n lifecycleIntent: \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\";\n operation: DaemonServiceLifecycleOperation;\n}): Promise<boolean> {\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n gracePeriodMs: input.drainWaitMs,\n mode: \"graceful\",\n },\n // New Services bound their post-work result-receipt and socket-close\n // waits. Bound this request too so an older Service cannot hold setup\n // forever; the compatibility path below still preserves the guarded\n // stale-heartbeat force-kill boundary.\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: input.lifecycleIntent,\n metadata: {\n accepted: shutdown.accepted,\n gracePeriodMs: shutdown.gracePeriodMs,\n mode: shutdown.mode,\n },\n result: shutdown.accepted ? \"completed\" : \"unsupported\",\n stopCause: \"controlled_service_update\",\n type: \"stop.controlled_drain\",\n });\n return shutdown.accepted;\n } catch (error) {\n const isLegacyShutdownContract =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.contract_mismatch\";\n const isManagerRunningWithoutRuntime =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.endpoint_missing\" &&\n input.inventory.runtimeStatus.status !== \"running\" &&\n input.inventory.ownedProcesses.length === 0;\n const isLegacyMissingCloseReason =\n isLegacyMissingControlledShutdownCloseReason({\n error,\n inventory: input.inventory,\n });\n const isLegacyControlledShutdownTimeout =\n isOlderServiceControlledShutdownTimeout({\n error,\n inventory: input.inventory,\n });\n const isCompatibilityFallback =\n isLegacyShutdownContract ||\n isLegacyMissingCloseReason ||\n isLegacyControlledShutdownTimeout ||\n isManagerRunningWithoutRuntime;\n const observedDaemonVersion =\n isLegacyMissingCloseReason || isLegacyControlledShutdownTimeout\n ? resolveObservedDaemonVersion(input.inventory)\n : null;\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: input.lifecycleIntent,\n metadata: {\n compatibilityFallback: isCompatibilityFallback,\n ...(isLegacyMissingCloseReason\n ? {\n compatibilityReason: \"legacy_missing_close_reason\",\n observedDaemonVersion,\n }\n : {}),\n ...(isLegacyControlledShutdownTimeout\n ? {\n compatibilityReason: \"legacy_controlled_shutdown_timeout\",\n observedDaemonVersion,\n reasonCode: \"socket_close_timeout\",\n }\n : {}),\n ...(isManagerRunningWithoutRuntime\n ? {\n compatibilityReason: \"manager_running_without_runtime\",\n }\n : {}),\n errorMessage: toErrorMessage(error),\n },\n result: isCompatibilityFallback ? \"fallback\" : \"failed\",\n stopCause: \"controlled_service_update\",\n type: \"stop.controlled_drain\",\n });\n if (isCompatibilityFallback) {\n return false;\n }\n throw new DaemonServiceLifecycleControlledDrainError(error);\n }\n}\n\nfunction isOlderServiceControlledShutdownTimeout(input: {\n error: unknown;\n inventory: DaemonServiceInventory;\n}): boolean {\n if (\n !(input.error instanceof LocalDaemonControlPlaneClientError) ||\n input.error.code !== \"daemon.control.timeout\"\n ) {\n return false;\n }\n const observedDaemonVersion = resolveObservedDaemonVersion(input.inventory);\n if (!observedDaemonVersion) {\n return false;\n }\n try {\n return (\n resolveVersionChangeDirection({\n fromVersion: observedDaemonVersion,\n toVersion: input.inventory.expectedVersion,\n }) === \"upgrade\"\n );\n } catch {\n return false;\n }\n}\n\nfunction isLegacyMissingControlledShutdownCloseReason(input: {\n error: unknown;\n inventory: DaemonServiceInventory;\n}): boolean {\n if (\n !(input.error instanceof LocalDaemonControlPlaneClientError) ||\n input.error.code !== \"daemon.run.socket_closed\" ||\n input.error.message !== \"daemon stream closed (code=1000, reason=closed)\"\n ) {\n return false;\n }\n const observedDaemonVersion = resolveObservedDaemonVersion(input.inventory);\n if (!observedDaemonVersion) {\n return false;\n }\n try {\n return (\n resolveVersionChangeDirection({\n fromVersion: observedDaemonVersion,\n toVersion: MISSING_CONTROLLED_SHUTDOWN_CLOSE_REASON_FIXED_VERSION,\n }) === \"upgrade\"\n );\n } catch {\n return false;\n }\n}\n\nfunction resolveObservedDaemonVersion(\n inventory: DaemonServiceInventory\n): string | null {\n return (\n inventory.activeBundle?.daemonVersion ??\n inventory.serviceContract?.daemonVersion ??\n (inventory.installStatus.installed\n ? inventory.installStatus.state?.daemonVersion\n : null) ??\n null\n );\n}\n\nasync function ensureLifecycleRuntimeStopped(): Promise<void> {\n const runtimeAfterStop = await readCurrentObservedDaemonRuntimeStatus();\n if (runtimeAfterStop.status === \"stale\") {\n await clearDaemonRuntimeStateIfDefinitelyStopped();\n return;\n }\n if (runtimeAfterStop.status === \"running\") {\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld service is still running after stop phase (pid=${String(\n runtimeAfterStop.pid\n )}).`,\n stage: \"wait_stopped\",\n });\n }\n}\n\nasync function waitForLifecycleRuntimeStopped(input: {\n inventory: DaemonServiceInventory;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const usesSystemService =\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.serviceManagerStatus?.installed === true ||\n input.inventory.serviceManagerStatus?.running === true;\n\n if (usesSystemService) {\n const stopped = await waitForDaemonSystemServiceToStop({\n manager: input.serviceManager,\n waitMs: STRICT_TEARDOWN_VERIFY_WAIT_MS,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n });\n // A daemon that survived the graceful window may be wedged (old daemons\n // sleep through SIGTERM inside reconnect backoff for up to 15 minutes,\n // which no lifecycle stop window can cover). Escalate to SIGKILL only\n // under the stalled-heartbeat safety boundary; a fresh heartbeat keeps\n // the existing failure below.\n const stoppedAfterForceKill =\n stopped ||\n ((await forceKillStalledDaemonAfterStopTimeout({ stage: \"wait_stopped\" }))\n .killed &&\n (await waitForDaemonSystemServiceToStop({\n manager: input.serviceManager,\n waitMs: STRICT_TEARDOWN_VERIFY_WAIT_MS,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n })));\n if (!stoppedAfterForceKill) {\n const runtimeAfterWait = await readCurrentObservedDaemonRuntimeStatus();\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld service is still running after stop phase (pid=${String(\n runtimeAfterWait.pid\n )}).`,\n stage: \"wait_stopped\",\n });\n }\n }\n\n await ensureLifecycleRuntimeStopped();\n}\n\nasync function waitForLifecycleRuntimeAbsentWithRetry(\n serviceManager: DaemonServiceManager\n): Promise<void> {\n let initialError: unknown;\n try {\n await serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n return;\n } catch (error) {\n initialError = error;\n }\n\n try {\n // A controlled drain may finish just after launchd's first absence window.\n // Give that same process one final bounded verification window before any\n // reinstall or stopped-safe recovery mutates the persistent Service state.\n await serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n } catch (retryError) {\n throw new DaemonServiceLifecycleStageError({\n cause: retryError,\n message: `${toErrorMessage(retryError)}; initial absence verification failed: ${toErrorMessage(initialError)}`,\n stage: \"wait_absent\",\n });\n }\n}\n\nasync function cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n operation: DaemonServiceLifecycleOperation\n): Promise<void> {\n try {\n await cleanupStaleDaemonRuntimeDataBackups();\n } catch (error) {\n // The Service is already verified healthy, so stale temporary data must\n // never trigger destructive lifecycle recovery. Keep the failure visible\n // and retry cleanup on the next already-aligned lifecycle check.\n console.warn(\"[openmeld.daemon_runtime_data.cleanup_warning]\", {\n errorMessage: toErrorMessage(error),\n operation,\n });\n }\n}\n\nasync function ensureNoOwnedProcessesRemain(): Promise<void> {\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n while (Date.now() < deadline) {\n const [ownedProcesses, runtimeStatus] = await Promise.all([\n listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (ownedProcesses.length === 0) {\n if (runtimeStatus.status === \"not_running\") {\n return;\n }\n if (runtimeStatus.status === \"stale\") {\n await clearDaemonRuntimeStateIfDefinitelyStopped();\n return;\n }\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n const [ownedProcesses, runtimeStatus] = await Promise.all([\n listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (ownedProcesses.length > 0) {\n const summary = ownedProcesses\n .map(\n (processInfo) => `${processInfo.ownership}:${String(processInfo.pid)}`\n )\n .join(\", \");\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld-owned service processes are still present after teardown (${summary}).`,\n stage: \"wait_absent\",\n });\n }\n if (runtimeStatus.status !== \"not_running\") {\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld runtime is still ${runtimeStatus.status} after teardown.`,\n stage: \"wait_absent\",\n });\n }\n}\n\nasync function waitForLegacySharedServiceCleanup(input: {\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n shouldStartAfterLifecycle: boolean;\n}): Promise<void> {\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n let lastInventory: DaemonServiceInventory | null = null;\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intent: toLifecycleIntent(input.operation),\n });\n lastInventory = inventory;\n const hasLegacySharedService =\n inventory.legacySharedService?.present === true ||\n inventory.anomalies.some(\n (anomaly) => anomaly.code === \"legacy_shared_service_present\"\n );\n if (!hasLegacySharedService) {\n return;\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n\n throw new DaemonServiceLifecycleStageError({\n message:\n \"OpenMeld Service legacy shared registration is still present after cleanup. reason=legacy_shared_service_present\",\n reasonCodes: [\"legacy_shared_service_present\"],\n stage: \"unregister\",\n cause: lastInventory,\n });\n}\n\nfunction resolveSafeOwnedProcessStopCandidates(\n inventory: DaemonServiceInventory\n) {\n const seenPids = new Set<number>();\n return inventory.ownedProcesses.filter((processInfo) => {\n if (processInfo.ownership === \"unknown\") {\n return false;\n }\n if (processInfo.mode === \"foreground\") {\n return false;\n }\n if (seenPids.has(processInfo.pid)) {\n return false;\n }\n seenPids.add(processInfo.pid);\n return true;\n });\n}\n\nasync function resolveLifecycleCommandOptions(input: {\n inventory: DaemonServiceInventory;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<DaemonServiceLifecycleCommandOptions> {\n const [currentContract, runtimeSnapshot, runtimePaths, fallbackProfile] =\n await Promise.all([\n Promise.resolve(\n input.inventory.serviceContract ?? readDaemonServiceContract()\n ).catch(() => null),\n readDaemonServiceRuntimeSnapshot().catch(() => null),\n ensureDaemonRuntimePaths().catch(() => null),\n resolveOpenMeldProfileOrNull({\n allowDefaultFallback: true,\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null),\n ]);\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n currentContract\n )\n ? currentContract\n : null;\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const explicitGatewayUrl = await resolveExplicitGatewayUrlOrThrow(\n input.gatewayUrl\n );\n const commandGatewayUrl = environmentTarget.gatewayUrl;\n const preferCommandGateway = shouldPreferCommandResolvedGatewayForLifecycle();\n const gatewayUrl = resolveLifecycleGatewayUrl({\n explicitGatewayUrl,\n preferCommandGateway,\n commandGatewayUrl,\n currentGatewayUrl: normalizeGatewayBaseUrlOrNull(\n currentContract?.gatewayUrl\n ),\n runtimeGatewayUrl: normalizeGatewayBaseUrlOrNull(\n runtimeSnapshot?.gatewayUrl\n ),\n });\n const openMeldProfileId =\n normalizeOptionalText(input.profile) ??\n normalizeOptionalText(runtimeSnapshot?.openMeldProfileId) ??\n fallbackProfile?.openMeldProfileId ??\n reusableCurrentContract?.profileId;\n const ownerUserId = await resolveLifecycleCommandOwnerUserId({\n openMeldProfileId,\n fallbackProfile,\n reusableCurrentContract,\n });\n const shouldDiscardPersistedDeviceId =\n resolveOpenMeldEnvPreset() === \"prod\"\n ? isUnsafeProductionDeviceId\n : undefined;\n const deviceId = runtimePaths\n ? await resolveDaemonDeviceId({\n deviceId: resolvePreferredDaemonDeviceId({\n explicitDeviceId: input.deviceId,\n contractDeviceId: reusableCurrentContract?.deviceId,\n }),\n deviceIdPath: runtimePaths.deviceIdPath,\n ...(shouldDiscardPersistedDeviceId\n ? { shouldDiscardPersistedDeviceId }\n : {}),\n }).catch(() => reusableCurrentContract?.deviceId ?? null)\n : (normalizeOptionalText(input.deviceId) ??\n reusableCurrentContract?.deviceId ??\n null);\n const heartbeatMs = normalizeHeartbeatIntervalMs(\n input.heartbeatMs ?? currentContract?.heartbeatMs\n );\n return {\n environmentTarget,\n ...(gatewayUrl ? { gatewayUrl } : {}),\n ...(ownerUserId ? { ownerUserId } : {}),\n ...(openMeldProfileId ? { openMeldProfileId } : {}),\n ...(deviceId ? { deviceId } : {}),\n ...(typeof heartbeatMs === \"number\" ? { heartbeatMs } : {}),\n };\n}\n\nfunction resolveLifecycleGatewayUrl(input: {\n explicitGatewayUrl?: string | null;\n preferCommandGateway: boolean;\n commandGatewayUrl: string;\n currentGatewayUrl: string | null;\n runtimeGatewayUrl: string | null;\n}): string | null {\n if (input.explicitGatewayUrl) {\n return input.explicitGatewayUrl;\n }\n if (input.preferCommandGateway) {\n return input.commandGatewayUrl;\n }\n if (input.currentGatewayUrl) {\n return input.currentGatewayUrl;\n }\n if (input.runtimeGatewayUrl) {\n return input.runtimeGatewayUrl;\n }\n return input.commandGatewayUrl;\n}\n\nasync function resolveLifecycleCommandOwnerUserId(input: {\n openMeldProfileId?: string | null;\n fallbackProfile: OpenMeldProfile | null;\n reusableCurrentContract: DaemonServiceContract | null;\n}): Promise<string | undefined> {\n const profileId = normalizeOptionalText(input.openMeldProfileId);\n if (profileId && input.fallbackProfile?.openMeldProfileId === profileId) {\n return (\n normalizeOptionalText(input.fallbackProfile.ownerUserId) ?? undefined\n );\n }\n\n if (profileId) {\n const selectedProfile = await resolveOpenMeldProfileOrNull({\n openMeldProfileId: profileId,\n allowDefaultFallback: false,\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null);\n const fallbackFromResolved = normalizeOptionalText(\n selectedProfile?.ownerUserId\n );\n if (fallbackFromResolved) {\n return fallbackFromResolved;\n }\n }\n\n if (profileId && input.reusableCurrentContract?.profileId === profileId) {\n return (\n normalizeOptionalText(input.reusableCurrentContract.ownerUserId) ??\n undefined\n );\n }\n\n if (!profileId) {\n return (\n normalizeOptionalText(input.reusableCurrentContract?.ownerUserId) ??\n undefined\n );\n }\n\n return undefined;\n}\n\nfunction shouldPreferCommandResolvedGatewayForLifecycle(): boolean {\n if (normalizeOptionalText(process.env.OPENMELD_GATEWAY_URL)) {\n return true;\n }\n const preset = resolveOpenMeldEnvPreset();\n return preset === \"dev-local\" || preset === \"canary\";\n}\n\nfunction resolveLifecycleDesiredState(\n inventory: DaemonServiceInventory\n): \"background\" | \"stopped\" {\n if (inventory.serviceContract?.desiredState === \"background\") {\n return \"background\";\n }\n if (inventory.serviceContract?.desiredState === \"stopped\") {\n return \"stopped\";\n }\n if (inventory.serviceManagerStatus?.running) {\n return \"background\";\n }\n if (inventory.runtimeStatus.mode !== \"background\") {\n return \"stopped\";\n }\n return inventory.runtimeStatus.status === \"running\" ||\n inventory.runtimeStatus.status === \"stale\" ||\n inventory.runtimeStatus.managedBySystemService ||\n inventory.runtimeStatus.autoStart\n ? \"background\"\n : \"stopped\";\n}\n\nfunction resolveLifecycleShouldStartAfterLifecycle(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n}): boolean {\n if (input.desiredState !== \"background\") {\n return false;\n }\n if (input.inventory.serviceManagerStatus?.running) {\n return true;\n }\n if (input.inventory.runtimeStatus.mode !== \"background\") {\n return false;\n }\n return (\n input.inventory.runtimeStatus.status === \"running\" ||\n input.inventory.runtimeStatus.status === \"stale\" ||\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.runtimeStatus.autoStart\n );\n}\n\nasync function resolveLifecycleServiceManager(\n inventory: DaemonServiceInventory\n): Promise<DaemonServiceManager | null> {\n if (inventory.serviceManager) {\n return inventory.serviceManager;\n }\n if (inventory.legacySharedService?.serviceManager) {\n return inventory.legacySharedService.serviceManager;\n }\n if (\n inventory.runtimeStatus.serviceController !== \"unknown\" &&\n inventory.runtimeStatus.serviceController !== \"legacy-detached\"\n ) {\n return await resolveDaemonServiceManager(\n inventory.runtimeStatus.serviceController\n ).catch(() => null);\n }\n return await resolveDaemonServiceManager().catch(() => null);\n}\n\nfunction resolveUnsafeOwnedProcessReasonCodes(\n inventory: DaemonServiceInventory\n): DaemonServiceLifecycleReasonCode[] {\n if (\n inventory.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"unknown\"\n )\n ) {\n return [\"unknown_owned_processes\"];\n }\n return [];\n}\n\nfunction resolveImmediateLifecycleOutcome(input: {\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n expectedVersion: string;\n forceReinstall: boolean;\n inventoryBefore: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}):\n | Extract<DaemonServiceLifecycleOutcome, { status: \"already_aligned\" }>\n | Extract<DaemonServiceLifecycleOutcome, { status: \"blocked\" }>\n | null {\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory: input.inventoryBefore,\n target: input.target,\n });\n if (!input.forceReinstall && decision.status === \"already_aligned\") {\n return {\n status: \"already_aligned\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: input.inventoryBefore,\n reasonCodes: [],\n completedPhases: input.completedPhases,\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n }\n const unsafeReasonCodes = resolveUnsafeOwnedProcessReasonCodes(\n input.inventoryBefore\n );\n if (\n input.forceReinstall ||\n (decision.status !== \"not_installed\" &&\n decision.status !== \"blocked\" &&\n unsafeReasonCodes.length === 0)\n ) {\n return null;\n }\n return {\n status: \"blocked\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: input.inventoryBefore,\n reasonCodes: dedupeReasonCodes([\n ...decision.reasonCodes,\n ...unsafeReasonCodes,\n ]),\n completedPhases: input.completedPhases,\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n}\n\nfunction dedupeReasonCodes(\n reasonCodes: DaemonServiceLifecycleReasonCode[]\n): DaemonServiceLifecycleReasonCode[] {\n return [...new Set(reasonCodes)];\n}\n\nasync function ensureLifecycleServiceContract(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n daemonVersion: string;\n desiredState: \"background\" | \"stopped\";\n preparedBundle: Awaited<ReturnType<typeof prepareDaemonServiceBundle>>;\n serviceController: DaemonServiceManager[\"controller\"];\n}): Promise<void> {\n const bundleId =\n input.preparedBundle.bundleId ?? input.currentContract?.bundleId ?? null;\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n input.currentContract\n )\n ? input.currentContract\n : null;\n const writeResult = await writeDaemonServiceContract({\n daemonVersion: input.daemonVersion,\n bundleId,\n desiredState: input.desiredState,\n serviceController: input.serviceController,\n autoStart: input.desiredState === \"background\",\n gatewayUrl: input.commandOptions.gatewayUrl ?? null,\n ...(input.commandOptions.ownerUserId\n ? { ownerUserId: input.commandOptions.ownerUserId }\n : {}),\n ...(input.commandOptions.openMeldProfileId\n ? { profileId: input.commandOptions.openMeldProfileId }\n : {}),\n deviceId: input.commandOptions.deviceId ?? null,\n heartbeatMs:\n input.commandOptions.heartbeatMs ??\n input.currentContract?.heartbeatMs ??\n null,\n ...(reusableCurrentContract ? { lane: reusableCurrentContract.lane } : {}),\n });\n if (writeResult.status === \"skipped_missing_fields\") {\n throw new DaemonServiceLifecycleStageError({\n message: formatMissingContractFieldsLifecycleError(\n writeResult.missingFields\n ),\n reasonCodes: [MISSING_REQUIRED_CONTRACT_FIELDS_REASON],\n stage: \"write_contract\",\n });\n }\n}\n\nfunction formatMissingContractFieldsLifecycleError(\n missingFields: DaemonServiceContractMissingField[]\n): string {\n const fields = missingFields.length > 0 ? missingFields.join(\",\") : \"unknown\";\n return `OpenMeld Service contract cannot be written. reason=${MISSING_REQUIRED_CONTRACT_FIELDS_REASON} missingFields=${fields}`;\n}\n\nasync function restoreLifecycleServiceContractSnapshot(\n snapshot: Awaited<ReturnType<typeof readDaemonServiceContract>>\n): Promise<void> {\n if (!snapshot) {\n await clearDaemonServiceContract();\n return;\n }\n await upsertDaemonServiceContract({\n daemonVersion: snapshot.daemonVersion,\n bundleId: snapshot.bundleId,\n desiredState: snapshot.desiredState,\n serviceController: snapshot.serviceController,\n autoStart: snapshot.autoStart,\n gatewayUrl: snapshot.gatewayUrl,\n ...(snapshot.ownerUserId ? { ownerUserId: snapshot.ownerUserId } : {}),\n ...(snapshot.profileId ? { profileId: snapshot.profileId } : {}),\n deviceId: snapshot.deviceId,\n ...(snapshot.connectedComputerId\n ? { connectedComputerId: snapshot.connectedComputerId }\n : {}),\n heartbeatMs: snapshot.heartbeatMs,\n lane: snapshot.lane,\n });\n}\n\ntype VerifiedLifecycleInventoryInput = {\n desiredState: \"background\" | \"stopped\";\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n};\n\nasync function waitForStartedLifecycleInventory(\n input: VerifiedLifecycleInventoryInput\n): Promise<DaemonServiceInventory> {\n try {\n const result = await waitForSystemServiceStartup({\n expectedVersion: input.expectedVersion,\n manager: input.serviceManager,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n intent: toLifecycleIntent(input.operation),\n isReady: (inventory) =>\n verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: true,\n target: input.target,\n }) === null,\n });\n return result.inventory;\n } catch (error) {\n if (!isSystemServiceStartupTimeoutError(error)) {\n throw error;\n }\n const inventory = error.inventory;\n const verificationError = inventory\n ? verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: true,\n target: input.target,\n })\n : null;\n throw new DaemonServiceLifecycleStageError({\n cause: error,\n message: verificationError ?? error.message,\n reasonCodes: inventory\n ? readDaemonServiceInventoryAnomalyCodes(inventory)\n : [],\n stage: \"verify_final_inventory\",\n });\n }\n}\n\nasync function waitForVerifiedLifecycleInventory(\n input: VerifiedLifecycleInventoryInput\n): Promise<DaemonServiceInventory> {\n if (input.shouldStartAfterLifecycle) {\n return await waitForStartedLifecycleInventory(input);\n }\n\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n let lastInventory: DaemonServiceInventory | null = null;\n let lastError: string | null = null;\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intent: toLifecycleIntent(input.operation),\n });\n const verificationError = verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n target: input.target,\n });\n if (!verificationError) {\n return inventory;\n }\n if (\n !shouldRetryLifecycleInventoryVerification({\n inventory,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n })\n ) {\n throw new DaemonServiceLifecycleStageError({\n message: verificationError,\n reasonCodes: readDaemonServiceInventoryAnomalyCodes(inventory),\n stage: \"verify_final_inventory\",\n cause: inventory,\n });\n }\n lastInventory = inventory;\n lastError = verificationError;\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n throw new DaemonServiceLifecycleStageError({\n message:\n lastError ??\n \"OpenMeld could not verify the final local service inventory state.\",\n reasonCodes: lastInventory\n ? readDaemonServiceInventoryAnomalyCodes(lastInventory)\n : [],\n stage: \"verify_final_inventory\",\n cause: lastInventory,\n });\n}\n\nfunction readDaemonServiceInventoryAnomalyCodes(\n inventory: DaemonServiceInventory\n): DaemonServiceLifecycleReasonCode[] {\n return inventory.anomalies.map((anomaly) => anomaly.code);\n}\n\nasync function installDaemonSystemServiceRegistration(input: {\n distribution: OpenMeldDistribution;\n serviceCommandSpec: ReturnType<typeof buildDaemonSystemServiceCommandSpec>;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.serviceManager.controller,\n distribution: input.distribution,\n });\n await input.serviceManager.install(input.serviceCommandSpec);\n}\n\nfunction verifyLifecycleInventory(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const staticVerificationFailure =\n verifyLifecycleInventoryStaticRequirements(input);\n if (staticVerificationFailure) {\n return staticVerificationFailure;\n }\n const effectiveRuntimeStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState: input.inventory.runtimeStatus,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n });\n const serviceManagerStatus = input.inventory.serviceManagerStatus;\n if (!serviceManagerStatus) {\n return \"Lifecycle verification failed because system service registration is missing.\";\n }\n if (input.shouldStartAfterLifecycle) {\n if (\n effectiveRuntimeStatus !== \"running\" ||\n input.inventory.runtimeStatus.mode !== \"background\" ||\n serviceManagerStatus.running !== true\n ) {\n return `Lifecycle verification failed because background service did not recover. runtime=${effectiveRuntimeStatus}, mode=${input.inventory.runtimeStatus.mode ?? \"unknown\"}, managerRunning=${String(\n serviceManagerStatus.running\n )}`;\n }\n return null;\n }\n if (effectiveRuntimeStatus === \"running\") {\n return \"Lifecycle verification failed because the service is still running even though it should remain stopped.\";\n }\n if (serviceManagerStatus.running) {\n return \"Lifecycle verification failed because the system service manager still reports the service as running.\";\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryStaticRequirements(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n return (\n verifyLifecycleInventoryDecision(input) ??\n verifyLifecycleInventoryContractState(input) ??\n verifyLifecycleInventoryBundleState(input) ??\n verifyLifecycleInventoryManagerState(input) ??\n (input.shouldStartAfterLifecycle\n ? verifyLifecycleInventoryRuntimeBundleState(input)\n : null)\n );\n}\n\nfunction verifyLifecycleInventoryDecision(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const inventory = buildLifecycleAlignmentInventory(input);\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: input.target,\n });\n if (decision.status === \"already_aligned\") {\n return null;\n }\n return `Lifecycle verification failed because the service is still ${decision.status}. reasons=${decision.reasonCodes.join(\",\") || \"none\"}`;\n}\n\nfunction buildLifecycleAlignmentInventory(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): DaemonServiceInventory {\n if (\n input.shouldStartAfterLifecycle ||\n input.inventory.serviceManagerStatus?.running !== false ||\n input.inventory.ownedProcesses.length > 0\n ) {\n return input.inventory;\n }\n\n return {\n ...input.inventory,\n anomalies: input.inventory.anomalies.filter(\n (anomaly) =>\n !STOPPED_LIFECYCLE_RUNTIME_SNAPSHOT_ANOMALIES.has(anomaly.code)\n ),\n };\n}\n\nfunction verifyLifecycleInventoryContractState(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const contract = input.inventory.serviceContract ?? null;\n if (!contract) {\n return \"Lifecycle verification failed because the service contract is missing.\";\n }\n if (contract.daemonVersion !== input.target.daemonVersion) {\n return `Lifecycle verification failed because service contract version is ${contract.daemonVersion} instead of ${input.target.daemonVersion}.`;\n }\n if (\n input.inventory.activeBundle &&\n contract.bundleId !== input.inventory.activeBundle.bundleId\n ) {\n return `Lifecycle verification failed because service contract bundle is ${contract.bundleId} instead of ${input.inventory.activeBundle.bundleId}.`;\n }\n if (contract.desiredState !== input.desiredState) {\n return `Lifecycle verification failed because service contract desiredState is ${contract.desiredState} instead of ${input.desiredState}.`;\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryBundleState(input: {\n inventory: DaemonServiceInventory;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n if (!input.inventory.activeBundle) {\n return \"Lifecycle verification failed because the active service bundle is missing.\";\n }\n if (input.inventory.activeBundle.bundleFormat !== input.target.bundleFormat) {\n return `Lifecycle verification failed because bundle format is ${input.inventory.activeBundle.bundleFormat}.`;\n }\n if (\n input.inventory.activeBundle.daemonVersion !== input.target.daemonVersion\n ) {\n return `Lifecycle verification failed because active bundle version is ${input.inventory.activeBundle.daemonVersion} instead of ${input.target.daemonVersion}.`;\n }\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: input.inventory.activeBundle.sourceKind,\n })\n ) {\n return \"Lifecycle verification failed because the active service bundle came from repo-local workspace source in a lane that only allows published or packaged bundles.\";\n }\n if (input.inventory.activeBundleEntryPath) {\n return null;\n }\n return \"Lifecycle verification failed because the active bundle entry path is missing.\";\n}\n\nfunction verifyLifecycleInventoryManagerState(input: {\n inventory: DaemonServiceInventory;\n}): string | null {\n if (!input.inventory.serviceManagerStatus?.installed) {\n return \"Lifecycle verification failed because system service registration is missing.\";\n }\n if (!input.inventory.serviceManagerStatus.enabled) {\n return \"Lifecycle verification failed because system service registration is disabled.\";\n }\n if (resolveUnsafeOwnedProcessReasonCodes(input.inventory).length > 0) {\n return \"Lifecycle verification failed because OpenMeld still detected an unknown owned process.\";\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryRuntimeBundleState(input: {\n inventory: DaemonServiceInventory;\n}): string | null {\n if (!input.inventory.runtimeCommandEntryPath) {\n return \"Lifecycle verification failed because runtime state does not point at a concrete service bundle entry path.\";\n }\n if (input.inventory.runtimeCommandPathExists !== true) {\n return \"Lifecycle verification failed because the running service still points at a bundle entry path that no longer exists.\";\n }\n const activeBundleEntryPath = input.inventory.activeBundleEntryPath;\n if (!activeBundleEntryPath) {\n return \"Lifecycle verification failed because the active bundle entry path is missing.\";\n }\n if (\n normalizeDaemonCommandPath(input.inventory.runtimeCommandEntryPath) ===\n normalizeDaemonCommandPath(activeBundleEntryPath)\n ) {\n return null;\n }\n return `Lifecycle verification failed because runtime is still using ${input.inventory.runtimeCommandEntryPath} instead of ${activeBundleEntryPath}.`;\n}\n\nfunction shouldRetryLifecycleInventoryVerification(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): boolean {\n if (!input.shouldStartAfterLifecycle) {\n return true;\n }\n return !hasTerminalRuntimeBundleMismatch(input.inventory);\n}\n\nfunction hasTerminalRuntimeBundleMismatch(\n inventory: DaemonServiceInventory\n): boolean {\n if (inventory.runtimeStatus.status !== \"running\") {\n return false;\n }\n if (inventory.runtimeCommandPathExists !== true) {\n return false;\n }\n if (!(inventory.runtimeCommandEntryPath && inventory.activeBundleEntryPath)) {\n return false;\n }\n return (\n normalizeDaemonCommandPath(inventory.runtimeCommandEntryPath) !==\n normalizeDaemonCommandPath(inventory.activeBundleEntryPath)\n );\n}\n\nfunction resolveLifecycleFailureStage(\n error: unknown,\n fallback: DaemonServiceFailureStage | null\n): DaemonServiceFailureStage | null {\n if (error instanceof DaemonServiceLifecycleStageError) {\n return error.stage;\n }\n if (error instanceof DaemonServiceLifecycleDrainTimeoutError) {\n return \"stop_or_drain\";\n }\n return fallback;\n}\n\nfunction resolveLifecycleFailureReasonCodes(\n error: unknown\n): DaemonServiceLifecycleReasonCode[] {\n if (error instanceof DaemonServiceLifecycleStageError) {\n return error.reasonCodes;\n }\n return [];\n}\n\nfunction resolveLifecycleFailureErrorCode(error: unknown): string | null {\n const visited = new Set<unknown>();\n let current = error;\n while (current && !visited.has(current)) {\n visited.add(current);\n if (current instanceof LocalDaemonControlPlaneClientError) {\n return current.code;\n }\n if (current instanceof Error && current.cause) {\n current = current.cause;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n\nasync function stopDaemonProcess(\n pid: number,\n signal: NodeJS.Signals\n): Promise<boolean> {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if (\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ) {\n return true;\n }\n throw new Error(\n `Failed to send ${signal} to pid ${String(pid)}: ${toErrorMessage(error)}`\n );\n }\n if (signal === \"SIGKILL\") {\n return true;\n }\n return await waitForProcessToExit(pid, PROCESS_STOP_WAIT_MS);\n}\n\nasync function stopDaemonProcessWithTimeout(\n pid: number,\n signal: NodeJS.Signals,\n timeoutMs: number\n): Promise<boolean> {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if (\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ) {\n return true;\n }\n throw new Error(\n `Failed to send ${signal} to pid ${String(pid)}: ${toErrorMessage(error)}`\n );\n }\n return await waitForProcessToExit(pid, timeoutMs);\n}\n\nasync function waitForProcessToExit(\n pid: number,\n timeoutMs: number\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) {\n return true;\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n return !isPidAlive(pid);\n}\n\nasync function writeLifecycleEvidenceEvent(input: {\n evidencePath: string | null;\n completedPhases: readonly DaemonServiceLifecyclePhase[];\n failureStage: DaemonServiceFailureStage | null;\n}): Promise<void> {\n if (!input.evidencePath) {\n return;\n }\n const { writeFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n await writeFile(\n join(input.evidencePath, \"lifecycle.json\"),\n `${JSON.stringify(\n {\n schema: \"openmeld-daemon-service-lifecycle-v1\",\n completedPhases: input.completedPhases,\n failureStage: input.failureStage,\n updatedAt: new Date().toISOString(),\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n ).catch(() => undefined);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { OpenMeldToolsUpdateRequestSource } from \"@openmeld/schemas/types\";\nimport { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport { hasPendingComputerSetupContinuation } from \"../../config/auth-session\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { hasIndependentMaintenanceRegistration } from \"../../config/daemon-service-update-worker-registration\";\nimport { withDaemonServiceReconcileLock } from \"../../config/daemon-state\";\nimport {\n type CliBinaryReleaseInfo,\n compareSemver,\n} from \"../../config/version-state\";\nimport { withManagedInstallTransaction } from \"../../local-components/managed-install\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonServiceUpdateReadiness,\n} from \"../control-plane/client\";\nimport type { DaemonActiveBundleState } from \"./daemon-service-bundle\";\nimport { prepareDaemonServiceBundle } from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceLifecycleOutcome,\n DaemonServiceLifecycleRecoveryStatus,\n} from \"./daemon-service-lifecycle\";\nimport { runDaemonServiceLifecycle } from \"./daemon-service-lifecycle\";\nimport { assertDaemonMaintenanceInstallationOwnership } from \"./daemon-service-manager-command-match\";\nimport { readCurrentObservedDaemonRuntimeStatus } from \"./daemon-service-runtime\";\nimport {\n completePendingDaemonServiceUpdate,\n DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n type DaemonServiceUpdateJob,\n persistPendingDaemonServiceUpdate,\n readPendingDaemonServiceUpdate,\n} from \"./daemon-service-update-state\";\nimport {\n installDaemonServiceUpdateWorker,\n prepareDaemonServiceUpdateWorkerCarrier,\n pruneDaemonServiceUpdateWorkerManagedVersions,\n registerDaemonServiceUpdateWorker,\n startDaemonServiceUpdateWorker,\n} from \"./daemon-service-update-worker-manager\";\n\nconst MAX_BACKGROUND_UPDATE_ATTEMPTS = 5;\n\ntype DaemonServiceUpdateReconcileLock = <T>(\n run: () => Promise<T>\n) => Promise<T>;\n\ntype ManagedInstallTransaction = <T>(run: () => Promise<T>) => Promise<T>;\n\ntype ScheduleDaemonServiceUpdateInput = {\n binaryRelease?: CliBinaryReleaseInfo;\n cliScriptPath?: string;\n operationId?: string;\n requestedAt?: string;\n requestSource?: OpenMeldToolsUpdateRequestSource;\n targetCliVersion?: string;\n targetServiceVersion?: string;\n targetVersion: string;\n urgency: \"available\" | \"required\";\n};\n\ntype ScheduleDaemonServiceUpdateDependencies = {\n createJobId: () => string;\n installWorker: (job: DaemonServiceUpdateJob) => Promise<void>;\n now: () => string;\n persistPendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n prepareBundle: (input: {\n activate: false;\n daemonVersion: string;\n cliScriptPath?: string;\n binaryRelease?: CliBinaryReleaseInfo;\n }) => Promise<DaemonActiveBundleState>;\n prepareWorkerCarrier: (job: DaemonServiceUpdateJob) => Promise<void>;\n pruneWorkerVersions: (job: DaemonServiceUpdateJob) => Promise<void>;\n readPendingJob: () => Promise<DaemonServiceUpdateJob | null>;\n resolveDesiredState: () => Promise<\"background\" | \"stopped\">;\n startWorker: (job: DaemonServiceUpdateJob) => Promise<void>;\n withReconcileLock: DaemonServiceUpdateReconcileLock;\n withManagedInstallTransaction: ManagedInstallTransaction;\n};\n\ntype RunPendingDaemonServiceUpdateDependencies = {\n completePendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n now: () => string;\n persistPendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n readPendingJob: () => Promise<DaemonServiceUpdateJob | null>;\n runLifecycle: (input: {\n expectedVersion: string;\n operation: \"upgrade_reconcile\";\n installSource: \"cli.auto_check\";\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n forceReinstall: true;\n forceKillAfterDrainTimeout: false;\n preparedBundle: DaemonActiveBundleState;\n }) => Promise<\n Pick<DaemonServiceLifecycleOutcome, \"errorMessage\" | \"status\"> & {\n recoveryStatus?: DaemonServiceLifecycleRecoveryStatus;\n }\n >;\n waitUntilSafeToSwitch: (job: DaemonServiceUpdateJob) => Promise<void>;\n withReconcileLock: DaemonServiceUpdateReconcileLock;\n};\n\nexport type ScheduleDaemonServiceUpdateResult = {\n job: DaemonServiceUpdateJob;\n status: \"scheduled\" | \"already_scheduled\";\n};\n\nexport async function scheduleDaemonServiceUpdate(\n input: ScheduleDaemonServiceUpdateInput,\n overrides: Partial<ScheduleDaemonServiceUpdateDependencies> = {}\n): Promise<ScheduleDaemonServiceUpdateResult> {\n const deps = resolveScheduleDependencies(overrides, {\n useDefaultLock: Object.keys(overrides).length === 0,\n });\n return await deps.withReconcileLock(\n async () => await scheduleDaemonServiceUpdateLocked(input, deps)\n );\n}\n\nasync function scheduleDaemonServiceUpdateLocked(\n input: ScheduleDaemonServiceUpdateInput,\n deps: ScheduleDaemonServiceUpdateDependencies\n): Promise<ScheduleDaemonServiceUpdateResult> {\n const pending = await deps.readPendingJob();\n if (pending) {\n return await reschedulePendingDaemonServiceUpdate({\n dependencies: deps,\n pending,\n request: input,\n });\n }\n\n const preparedBundle = await deps.prepareBundle({\n activate: false,\n daemonVersion: input.targetVersion,\n ...(input.binaryRelease ? { binaryRelease: input.binaryRelease } : {}),\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n const now = deps.now();\n const job: DaemonServiceUpdateJob = {\n v: 2,\n schema: DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n attempts: 0,\n desiredState: await deps.resolveDesiredState(),\n errorMessage: null,\n jobId: input.operationId ?? deps.createJobId(),\n preparedBundle,\n requestedAt: input.requestedAt ?? now,\n phase: \"waiting_for_work\",\n requestSource: input.requestSource ?? \"cli\",\n ...(input.targetCliVersion\n ? { targetCliVersion: input.targetCliVersion }\n : {}),\n ...(input.targetServiceVersion\n ? { targetServiceVersion: input.targetServiceVersion }\n : {}),\n targetVersion: input.targetVersion,\n updatedAt: now,\n urgency: input.urgency,\n };\n\n // Register the OS-owned worker before publishing the pending job. After the\n // atomic write, the initiating Terminal or browser is no longer responsible\n // for completing the update.\n await deps.withManagedInstallTransaction(async () => {\n await deps.prepareWorkerCarrier(job);\n await deps.installWorker(job);\n await deps.persistPendingJob(job);\n });\n await deps.startWorker(job);\n await pruneWorkerVersionsBestEffort({ dependencies: deps, job });\n return { job, status: \"scheduled\" };\n}\n\nasync function reschedulePendingDaemonServiceUpdate(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n pending: DaemonServiceUpdateJob;\n request: ScheduleDaemonServiceUpdateInput;\n}): Promise<ScheduleDaemonServiceUpdateResult> {\n const replaceTarget =\n isNewerTargetVersion(\n input.request.targetVersion,\n input.pending.targetVersion\n ) && input.pending.phase !== \"updated\";\n const escalateUrgency =\n input.pending.phase !== \"updated\" &&\n input.request.urgency === \"required\" &&\n input.pending.urgency === \"available\";\n const retained: DaemonServiceUpdateJob =\n replaceTarget || escalateUrgency\n ? {\n ...input.pending,\n ...(replaceTarget ? await prepareReplacementJobFields(input) : {}),\n updatedAt: input.dependencies.now(),\n urgency: escalateUrgency ? \"required\" : input.pending.urgency,\n }\n : input.pending;\n if (retained !== input.pending) {\n await input.dependencies.withManagedInstallTransaction(async () => {\n await input.dependencies.prepareWorkerCarrier(retained);\n await input.dependencies.persistPendingJob(retained);\n });\n }\n // A pending job proves the OS worker is already registered. Keep that\n // recovery carrier untouched until replacement state is durable, then wake\n // the existing worker against the same stable job path.\n await input.dependencies.startWorker(retained);\n if (retained !== input.pending) {\n await pruneWorkerVersionsBestEffort({\n dependencies: input.dependencies,\n job: retained,\n });\n }\n return { job: retained, status: \"already_scheduled\" };\n}\n\nasync function prepareReplacementJobFields(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n request: ScheduleDaemonServiceUpdateInput;\n}): Promise<Partial<DaemonServiceUpdateJob>> {\n return {\n attempts: 0,\n errorMessage: null,\n phase: \"waiting_for_work\",\n preparedBundle: await input.dependencies.prepareBundle({\n activate: false,\n daemonVersion: input.request.targetVersion,\n ...(input.request.binaryRelease\n ? { binaryRelease: input.request.binaryRelease }\n : {}),\n ...(input.request.cliScriptPath\n ? { cliScriptPath: input.request.cliScriptPath }\n : {}),\n }),\n requestSource: input.request.requestSource ?? \"cli\",\n ...(input.request.targetCliVersion\n ? { targetCliVersion: input.request.targetCliVersion }\n : {}),\n ...(input.request.targetServiceVersion\n ? { targetServiceVersion: input.request.targetServiceVersion }\n : {}),\n targetVersion: input.request.targetVersion,\n };\n}\n\nasync function pruneWorkerVersionsBestEffort(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n job: DaemonServiceUpdateJob;\n}): Promise<void> {\n await input.dependencies.pruneWorkerVersions(input.job).catch((error) => {\n console.warn(\"[openmeld.daemon_service.update_worker_prune_failed]\", {\n errorMessage: toErrorMessage(error),\n operationId: input.job.jobId,\n targetVersion: input.job.targetVersion,\n });\n });\n}\n\nexport async function runPendingDaemonServiceUpdate(\n overrides: Partial<RunPendingDaemonServiceUpdateDependencies> = {}\n): Promise<DaemonServiceUpdateJob | null> {\n const deps = resolveRunDependencies(overrides, {\n useDefaultLock: Object.keys(overrides).length === 0,\n });\n const pending = await deps.withReconcileLock(\n async () => await preparePendingUpdateForSwitch(deps)\n );\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n if (pending.urgency === \"available\") {\n try {\n await deps.waitUntilSafeToSwitch(pending);\n } catch (waitError) {\n try {\n await deps.withReconcileLock(\n async () =>\n await recordSafeSwitchWaitFailure(deps, pending, waitError)\n );\n } catch (recordError) {\n throw new AggregateError(\n [waitError, recordError],\n \"OpenMeld could not safely switch the Service or record the failure.\"\n );\n }\n throw waitError;\n }\n }\n return await deps.withReconcileLock(\n async () => await runPreparedPendingUpdate(deps)\n );\n}\n\nasync function preparePendingUpdateForSwitch(\n deps: RunPendingDaemonServiceUpdateDependencies\n): Promise<DaemonServiceUpdateJob | null> {\n const pending = await deps.readPendingJob();\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n if (pending.urgency === \"available\") {\n const waiting: DaemonServiceUpdateJob = {\n ...pending,\n errorMessage: null,\n phase: \"waiting_for_work\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(waiting);\n return waiting;\n }\n return pending;\n}\n\nasync function recordSafeSwitchWaitFailure(\n deps: RunPendingDaemonServiceUpdateDependencies,\n waiting: DaemonServiceUpdateJob,\n error: unknown\n): Promise<void> {\n const current = await deps.readPendingJob();\n if (!(current && isSameWaitingUpdate(current, waiting))) {\n return;\n }\n await deps.persistPendingJob({\n ...current,\n errorMessage: toErrorMessage(error),\n updatedAt: deps.now(),\n });\n}\n\nfunction isSameWaitingUpdate(\n current: DaemonServiceUpdateJob,\n waiting: DaemonServiceUpdateJob\n): boolean {\n return (\n current.jobId === waiting.jobId &&\n current.targetVersion === waiting.targetVersion &&\n current.preparedBundle.bundleId === waiting.preparedBundle.bundleId &&\n current.urgency === waiting.urgency &&\n current.phase === \"waiting_for_work\" &&\n current.attempts === waiting.attempts\n );\n}\n\nasync function runPreparedPendingUpdate(\n deps: RunPendingDaemonServiceUpdateDependencies\n): Promise<DaemonServiceUpdateJob | null> {\n const pending = await deps.readPendingJob();\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n\n const running: DaemonServiceUpdateJob = {\n ...pending,\n attempts: pending.attempts + 1,\n errorMessage: null,\n phase: \"updating\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(running);\n\n try {\n const lifecycle = await deps.runLifecycle({\n desiredState: running.desiredState,\n expectedVersion: running.targetVersion,\n forceKillAfterDrainTimeout: false,\n forceReinstall: true,\n installSource: \"cli.auto_check\",\n operation: \"upgrade_reconcile\",\n preparedBundle: running.preparedBundle,\n shouldStartAfterLifecycle: running.desiredState === \"background\",\n });\n if (\n lifecycle.status !== \"aligned\" &&\n lifecycle.status !== \"already_aligned\"\n ) {\n const failed = finishJob(running, {\n errorMessage:\n lifecycle.errorMessage ||\n \"OpenMeld restored the previous Service after the replacement did not become healthy.\",\n now: deps.now(),\n phase:\n lifecycle.recoveryStatus === \"restored_verified_previous_state\"\n ? \"restored\"\n : \"needs_help\",\n });\n await deps.completePendingJob(failed);\n return failed;\n }\n\n const completed = finishJob(running, {\n errorMessage: null,\n now: deps.now(),\n phase: \"updated\",\n });\n await deps.completePendingJob(completed);\n return completed;\n } catch (error) {\n const errorMessage = toErrorMessage(error);\n if (running.attempts < MAX_BACKGROUND_UPDATE_ATTEMPTS) {\n const retry: DaemonServiceUpdateJob = {\n ...running,\n errorMessage,\n phase: \"waiting_for_work\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(retry);\n throw error;\n }\n const failed = finishJob(running, {\n errorMessage,\n now: deps.now(),\n phase: \"needs_help\",\n });\n await deps.completePendingJob(failed);\n return failed;\n }\n}\n\nfunction resolveWorkerInstallation(useDefaultLock: boolean) {\n const noOperation = async () => undefined;\n if (!useDefaultLock) {\n return { install: installDaemonServiceUpdateWorker, prepare: noOperation };\n }\n if (process.env.OPENMELD_INTERNAL_MAINTENANCE_WORKER === \"1\") {\n // A maintenance child must not boot out its own OS-owned parent before\n // publishing the job. That worker already owns this update operation.\n return {\n install: async (job: DaemonServiceUpdateJob) => {\n if (!(await hasIndependentMaintenanceRegistration())) {\n await registerDaemonServiceUpdateWorker(job);\n }\n },\n prepare: async (job: DaemonServiceUpdateJob) => {\n if (!(await hasIndependentMaintenanceRegistration())) {\n await prepareDaemonServiceUpdateWorkerCarrier(job);\n }\n },\n };\n }\n return {\n // No Service update has been published yet. Refresh the executor from the\n // verified CLI artifact before accepting work that relies on its contract.\n // A pre-existing definition is not proof that its process runs this code.\n install: registerDaemonServiceUpdateWorker,\n prepare: prepareDaemonServiceUpdateWorkerCarrier,\n };\n}\n\nfunction resolveScheduleDependencies(\n overrides: Partial<ScheduleDaemonServiceUpdateDependencies>,\n options: { useDefaultLock: boolean }\n): ScheduleDaemonServiceUpdateDependencies {\n const workerInstall = resolveWorkerInstallation(options.useDefaultLock);\n return {\n createJobId: overrides.createJobId ?? randomUUID,\n installWorker: overrides.installWorker ?? workerInstall.install,\n now: overrides.now ?? (() => new Date().toISOString()),\n persistPendingJob:\n overrides.persistPendingJob ?? persistPendingDaemonServiceUpdate,\n prepareBundle: overrides.prepareBundle ?? prepareDaemonServiceBundle,\n prepareWorkerCarrier:\n overrides.prepareWorkerCarrier ?? workerInstall.prepare,\n pruneWorkerVersions:\n overrides.pruneWorkerVersions ??\n pruneDaemonServiceUpdateWorkerManagedVersions,\n readPendingJob: overrides.readPendingJob ?? readPendingDaemonServiceUpdate,\n resolveDesiredState:\n overrides.resolveDesiredState ?? resolveCurrentDaemonDesiredState,\n startWorker: overrides.startWorker ?? startDaemonServiceUpdateWorker,\n withReconcileLock:\n overrides.withReconcileLock ??\n (options.useDefaultLock\n ? withDaemonServiceUpdateScheduleLock\n : runWithoutReconcileLock),\n withManagedInstallTransaction:\n overrides.withManagedInstallTransaction ??\n (options.useDefaultLock\n ? withManagedInstallTransaction\n : runWithoutReconcileLock),\n };\n}\n\nfunction resolveRunDependencies(\n overrides: Partial<RunPendingDaemonServiceUpdateDependencies>,\n options: { useDefaultLock: boolean }\n): RunPendingDaemonServiceUpdateDependencies {\n return {\n completePendingJob:\n overrides.completePendingJob ??\n (async (job) =>\n await completePendingDaemonServiceUpdate(\n job,\n {},\n job.phase === \"updated\" &&\n (await hasPendingComputerSetupContinuation())\n )),\n now: overrides.now ?? (() => new Date().toISOString()),\n persistPendingJob:\n overrides.persistPendingJob ?? persistPendingDaemonServiceUpdate,\n readPendingJob: overrides.readPendingJob ?? readPendingDaemonServiceUpdate,\n runLifecycle:\n overrides.runLifecycle ??\n (async (input) => {\n // Recheck under the lifecycle lock: another setup may have claimed the\n // lane while this worker was downloading or waiting for active work.\n await assertDaemonMaintenanceInstallationOwnership();\n return await runDaemonServiceLifecycle(input);\n }),\n waitUntilSafeToSwitch:\n overrides.waitUntilSafeToSwitch ?? waitUntilDaemonServiceSafeSwitch,\n withReconcileLock:\n overrides.withReconcileLock ??\n (options.useDefaultLock\n ? withDaemonServiceUpdateWorkerLock\n : runWithoutReconcileLock),\n };\n}\n\nasync function withDaemonServiceUpdateScheduleLock<T>(\n run: () => Promise<T>\n): Promise<T> {\n return await withDaemonServiceReconcileLock(run, {\n command: \"openmeld service update\",\n intent: \"upgrade_reconcile\",\n });\n}\n\nasync function withDaemonServiceUpdateWorkerLock<T>(\n run: () => Promise<T>\n): Promise<T> {\n return await withDaemonServiceReconcileLock(run, {\n command: \"openmeld service update-worker\",\n intent: \"upgrade_reconcile\",\n });\n}\n\nasync function runWithoutReconcileLock<T>(run: () => Promise<T>): Promise<T> {\n return await run();\n}\n\nexport async function waitUntilDaemonServiceSafeSwitch(\n job: DaemonServiceUpdateJob,\n overrides: {\n readPendingJob?: () => Promise<DaemonServiceUpdateJob | null>;\n requestReadiness?: typeof requestLocalDaemonServiceUpdateReadiness;\n sleep?: typeof sleep;\n } = {}\n): Promise<void> {\n const readPendingJob =\n overrides.readPendingJob ?? readPendingDaemonServiceUpdate;\n const requestReadiness =\n overrides.requestReadiness ?? requestLocalDaemonServiceUpdateReadiness;\n const wait = overrides.sleep ?? sleep;\n while (true) {\n const pending = await readPendingJob();\n if (\n pending === null ||\n pending.jobId !== job.jobId ||\n pending.urgency === \"required\"\n ) {\n return;\n }\n try {\n const readiness = await requestReadiness();\n if (readiness.safeToSwitch) {\n return;\n }\n } catch (error) {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n (error.code === \"daemon.control.contract_mismatch\" ||\n error.code === \"daemon.control.endpoint_missing\")\n ) {\n // A stopped Service cannot answer readiness. Delegate to the lifecycle\n // owner, which verifies absence or performs controlled drain under its\n // lock. This is not permission to kill an unresponsive live Service or\n // discard accepted work and durable replies. The same boundary handles\n // older Services that predate the readiness command.\n return;\n }\n // A missing process or unreadable runtime projection does not prove that\n // accepted work and its durable result acknowledgement are complete.\n // Keep this available update pending until the Service supplies the\n // positive readiness fact or the durable job changes.\n }\n await wait(2000);\n }\n}\n\nasync function resolveCurrentDaemonDesiredState(): Promise<\n \"background\" | \"stopped\"\n> {\n const contract = await readDaemonServiceContract().catch(() => null);\n if (contract) {\n return contract.desiredState;\n }\n const runtime = await readCurrentObservedDaemonRuntimeStatus();\n return runtime.status === \"running\" && runtime.mode === \"background\"\n ? \"background\"\n : \"stopped\";\n}\n\nfunction finishJob(\n job: DaemonServiceUpdateJob,\n input: {\n errorMessage: string | null;\n now: string;\n phase: \"updated\" | \"restored\" | \"needs_help\";\n }\n): DaemonServiceUpdateJob {\n return {\n ...job,\n errorMessage: input.errorMessage,\n phase: input.phase,\n updatedAt: input.now,\n };\n}\n\nfunction isNewerTargetVersion(candidate: string, current: string): boolean {\n return compareSemver(candidate, current) > 0;\n}\n"],"mappings":"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CX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAEH,MAAa,qDACX,IAAI,IAA8B;CAChC;CACA;CACA;AACF,CAAC;AAEH,MAAa,kDACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAwBH,MAAa,wDACX,IAAI,IAA8B;CAChC,GAAG,CAAC,mBAAG,IAvBL,IAA8B;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAIS,CAAuC,CAAC,CAAC,QAC7C,SACC,SAAS,mBACT,SAAS,sBACT,SAAS,sBACb;CACA;CACA;AACF,CAAC;AAEH,MAAa,oEACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;AACF,CAAC;AAEH,MAAa,mEACX,IAAI,IAA8B,CAAC,kBAAkB,qBAAqB,CAAC;AAE7E,MAAa,gEACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAeH,SAAgB,iCAAiC,OAEN;CACzC,MAAM,eAAe,0BAA0B,MAAM,SAAS;CAC9D,MAAM,wBAAwB,0CAA0C;EACtE;EACA,WAAW,MAAM;CACnB,CAAC;CACD,MAAM,gBAA4C,CAAC;CACnD,MAAM,gBAA4C,CAAC;CACnD,MAAM,mBAA+C,CAAC;CAEtD,KAAK,MAAM,QAAQ,cAAc;EAC/B,IAAI,kDAAkD,IAAI,IAAI,GAAG;GAC/D,cAAc,KAAK,IAAI;GACvB;EACF;EAEA,IAAI,iDAAiD,IAAI,IAAI,GAAG;GAC9D,iBAAiB,KAAK,IAAI;GAC1B,IACE,yCAAyC;IACvC;IACA;GACF,CAAC,GAED,cAAc,KAAK,IAAI;QAEvB,cAAc,KAAK,IAAI;GAEzB;EACF;EAEA,IAAI,8CAA8C,IAA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"}
|
|
1
|
+
{"version":3,"file":"daemon-service-update-coordinator-Brv_30Kn.js","names":["process","normalizeOptionalText","unexpectedSelectableReason","isRecord","normalizeOptionalText","writeJsonAtomic","toErrorMessage","toErrorMessage","readCurrentDaemonRuntimeContextImpl","process","process","process","runCommand","normalize","toErrorMessage","normalizeOptionalText","parseJson","toErrorMessage","toErrorMessage","STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS","toErrorMessage","toErrorMessage","normalizeOptionalText","dedupeAnomalyCodes","isRuntimeContractUpdateRequired","toErrorMessage","process","process","isPidAlive","toErrorMessage","process","normalizeOptionalText","toErrorMessage"],"sources":["../../../packages/schemas/dist/schemas/http/daemon-route-observation.js","../src/local-service/lifecycle/daemon-service-command-spec.ts","../src/command-entry-checks/cli-update-assessment.ts","../src/local-service/state/current-device-identity.ts","../src/system/current-local-runtime-reply-readiness.ts","../src/command-entry-checks/server-required-version-assessment.ts","../src/command-entry-checks/service-update-urgency.ts","../src/local-service/lifecycle/current-daemon-version.ts","../src/local-service/lifecycle/daemon-service-anomaly-groups.ts","../src/local-service/lifecycle/version-change-direction.ts","../src/local-service/lifecycle/daemon-service-alignment-target.ts","../src/local-service/state/local-state-version.ts","../src/local-service/state/runtime-contract-guard.ts","../src/local-service/lifecycle/daemon-runtime-contract-compatibility.ts","../src/local-service/lifecycle/daemon-service-owner-snapshot.ts","../src/local-service/lifecycle/daemon-service-inventory.ts","../src/local-service/lifecycle/daemon-service-update-worker-manager.ts","../src/local-service/maintenance/openmeld-tools-maintenance-policy.ts","../src/local-service/maintenance/openmeld-tools-update-attempt-state.ts","../src/local-service/maintenance/openmeld-tools-update-context.ts","../src/local-service/maintenance/openmeld-tools-upgrade-process.ts","../src/local-service/maintenance/openmeld-tools-update-coordinator.ts","../src/local-service/lifecycle/daemon-service-contract-writer.ts","../src/local-service/lifecycle/daemon-service-dependency-diagnostics.ts","../../../packages/start/dist/index.js","../src/config/daemon-route-observation-api.ts","../src/local-service/lifecycle/local-service-demand.ts","../src/provider-hosts/openclaw/diagnostics.ts","../src/system/gateway-chain-readiness.ts","../src/system/provider-diagnostics/openclaw/guidance.ts","../src/system/reply-readiness-copy.ts","../src/system/reply-readiness.ts","../src/system/current-reply-readiness-snapshot.ts","../src/local-service/state/daemon-start-failure-state.ts","../src/local-service/lifecycle/daemon-service-freshness.ts","../src/local-service/lifecycle/daemon-service-repair-guidance.ts","../src/system/service-readiness-resolver.ts","../src/local-service/status/daemon-status-attention.ts","../src/local-service/status/daemon-status-snapshot.ts","../src/local-service/lifecycle/daemon-service-evidence.ts","../src/local-service/state/runtime-data-preservation.ts","../src/local-service/lifecycle/daemon-service-stalled-force-kill.ts","../src/local-service/lifecycle/daemon-service-start-recovery.ts","../src/local-service/lifecycle/daemon-service-startup-wait.ts","../src/local-service/lifecycle/daemon-service-lifecycle.ts","../src/local-service/lifecycle/daemon-service-update-coordinator.ts"],"sourcesContent":["import { daemonServiceLaneSchema } from \"../daemon/service-contract.js\";\nimport { daemonExecutionCompatibilitySchema, localWakeRouteReportSchema, runtimeTransportCapabilitiesSchema, runtimeTransportErrorCodeSchema, runtimeTransportLookupRouteOwnerServiceEvidenceSchema, runtimeTransportRejectedProfileRegistrationSchema } from \"../daemon/runtime-transport.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/http/daemon-route-observation.ts\nconst daemonRouteObservationRouteSchema = z$1.discriminatedUnion(\"online\", [z$1.strictObject({\n\tonline: z$1.literal(true),\n\tdaemonSessionId: z$1.string().min(1),\n\tdeviceId: z$1.string().min(1),\n\tlane: daemonServiceLaneSchema,\n\tserviceVersion: z$1.string().trim().min(1).nullable().optional(),\n\tconnectionGeneration: z$1.number().int().positive(),\n\tleaseEpoch: z$1.number().int().positive(),\n\tlastHeartbeatMs: z$1.number().int().nonnegative(),\n\tcapabilities: runtimeTransportCapabilitiesSchema,\n\texecutionCompatibility: daemonExecutionCompatibilitySchema,\n\tlocalWakeRouteReport: localWakeRouteReportSchema.optional()\n}), z$1.strictObject({\n\tonline: z$1.literal(false),\n\treasonCode: runtimeTransportErrorCodeSchema,\n\tlastHeartbeatMs: z$1.number().int().nonnegative().optional(),\n\townerService: runtimeTransportLookupRouteOwnerServiceEvidenceSchema.optional(),\n\texecutionCompatibility: daemonExecutionCompatibilitySchema.optional(),\n\tlocalWakeRouteReport: localWakeRouteReportSchema.optional(),\n\trejectedProfileRegistration: runtimeTransportRejectedProfileRegistrationSchema.optional()\n})]);\nconst daemonRouteObservationResponseSchema = z$1.strictObject({\n\tobservedAt: z$1.string().trim().min(1),\n\tprofileId: z$1.string().trim().min(1),\n\troute: daemonRouteObservationRouteSchema\n});\n//#endregion\nexport { daemonRouteObservationResponseSchema, daemonRouteObservationRouteSchema };\n\n//# sourceMappingURL=daemon-route-observation.js.map","import { userInfo } from \"node:os\";\nimport { delimiter } from \"node:path\";\nimport process from \"node:process\";\nimport {\n normalizeCommandEnvironment,\n WINDOWS_RUNTIME_ENV_KEYS,\n} from \"@openmeld/adapter-core/process-environment\";\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 \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport {\n OPENMELD_HOME_ENV_KEY,\n openMeldManagedVersionBinaryPath,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport { resolveCliSelfVersion } from \"../../local-components/managed-install\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n daemonServiceBinaryExecutablePath,\n daemonServiceExecutableWrapperPath,\n daemonServiceLauncherPath,\n ensureDaemonServiceStableBinaryExecutable,\n readDaemonActiveBundleState,\n resolveAlignedDaemonActiveBundleEntryPath,\n writeDaemonServiceExecutableWrapper,\n writeDaemonServiceLauncher,\n} from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceCommandSpec,\n DaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nconst DEFAULT_LAUNCHD_PATH = \"/usr/bin:/bin:/usr/sbin:/sbin\";\nconst MACOS_SYSTEM_SHELL = \"/bin/sh\";\nconst DISPATCH_SPACE_ACTION_PATH_PATTERN =\n /[\\\\/]runtime[\\\\/]daemon[\\\\/]dispatch-space-actions[\\\\/][^\\\\/]+[\\\\/]bin$/u;\nconst DAEMON_SERVICE_ENV_KEY_WHITELIST = new Set([\n \"HOME\",\n \"PATH\",\n \"SHELL\",\n \"TERM\",\n \"TMPDIR\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_COLLATE\",\n \"LC_CTYPE\",\n \"LC_MESSAGES\",\n \"LC_MONETARY\",\n \"LC_NUMERIC\",\n \"LC_TIME\",\n \"USER\",\n \"LOGNAME\",\n OPENMELD_HOME_ENV_KEY,\n \"OPENMELD_DEV_MODE\",\n \"OPENMELD_ENV_PRESET\",\n \"OPENMELD_USER_FACING_CLI_COMMAND\",\n \"OPENMELD_CLI_BINARY_MANIFEST_URL\",\n \"OPENMELD_WINDOWS_INTERNAL_PREVIEW\",\n]);\n\n// Start/account admission/repair reuse the selected GUI Service, never a path\n// reconstructed from the installed CLI's version.\nexport async function resolveInstalledDaemonSystemServiceCommandSpec(\n input: Omit<\n Parameters<typeof buildDaemonSystemServiceCommandSpec>[0],\n \"binaryExecutablePath\"\n >\n): Promise<DaemonServiceCommandSpec> {\n if (\n input.controller !== \"windows-service\" ||\n (input.distribution ?? resolveOpenMeldDistribution()) !== \"binary\"\n ) {\n return buildDaemonSystemServiceCommandSpec(input);\n }\n const executable = await resolveAlignedDaemonActiveBundleEntryPath();\n if (!executable) {\n throw new Error(\n \"The installed Windows Service bundle needs repair before it can start.\"\n );\n }\n return buildDaemonSystemServiceCommandSpec({\n ...input,\n binaryExecutablePath: executable,\n });\n}\n\nexport function buildDaemonSystemServiceCommandSpec(input: {\n accountAdmissionId?: string;\n controller: DaemonServiceManager[\"controller\"];\n binaryExecutablePath?: string;\n distribution?: OpenMeldDistribution;\n environmentTarget?: OpenMeldEnvironmentTarget;\n}): DaemonServiceCommandSpec {\n const args: string[] = [\"service\", \"run\", \"--mode\", \"foreground\"];\n if (input.accountAdmissionId) {\n args.push(\"--account-admission-id\", input.accountAdmissionId);\n }\n const environmentTarget =\n input.environmentTarget ?? resolveOpenMeldEnvironmentTargetFromEnv();\n const { executable, specArgs } = resolveDaemonServiceExecutable({\n args,\n binaryExecutablePath: input.binaryExecutablePath,\n controller: input.controller,\n distribution: input.distribution,\n });\n\n return {\n executable,\n args: specArgs,\n env: {\n ...buildSystemServiceEnvironment(),\n OPENMELD_ENV_PRESET: environmentTarget.preset,\n OPENMELD_GATEWAY_URL: environmentTarget.gatewayUrl,\n OPENMELD_AUTH_URL: environmentTarget.authBaseUrl,\n OPENMELD_USER_FACING_CLI_COMMAND: environmentTarget.userFacingCommand,\n [DAEMON_SERVICE_RUNTIME_MODE_ENV]: \"foreground\",\n [DAEMON_SERVICE_RUNTIME_DETACHED_ENV]: \"1\",\n [DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV]: \"1\",\n [DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV]: input.controller,\n [DAEMON_SERVICE_RUNTIME_AUTO_START_ENV]: \"1\",\n },\n workingDirectory: daemonRuntimeRootPath(),\n };\n}\n\nfunction resolveDaemonServiceExecutable(input: {\n args: string[];\n binaryExecutablePath?: string;\n controller: DaemonServiceManager[\"controller\"];\n distribution?: OpenMeldDistribution;\n}): { executable: string; specArgs: string[] } {\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"windows-service\" && !input.binaryExecutablePath) {\n throw new Error(\n \"Windows Service registration requires its selected background executable.\"\n );\n }\n // macOS privacy grants identify a bare CLI by its executable path. Keep the\n // launchd carrier at one physical path across upgrades; the prepared,\n // signed version binary is copied there before registration. Other service\n // managers retain the existing versioned executable contract.\n return {\n executable:\n input.controller === \"launchd\"\n ? daemonServiceBinaryExecutablePath()\n : (input.binaryExecutablePath ??\n openMeldManagedVersionBinaryPath(resolveCliSelfVersion())),\n specArgs: input.args,\n };\n }\n const launcherPath = daemonServiceLauncherPath();\n if (input.controller === \"launchd\") {\n return {\n executable: MACOS_SYSTEM_SHELL,\n specArgs: [daemonServiceExecutableWrapperPath(), ...input.args],\n };\n }\n return {\n executable: process.execPath,\n specArgs: [launcherPath, ...input.args],\n };\n}\n\nexport async function ensureDaemonSystemServiceCommandFiles(input: {\n controller: DaemonServiceManager[\"controller\"];\n distribution?: OpenMeldDistribution;\n}): Promise<void> {\n if ((input.distribution ?? resolveOpenMeldDistribution()) === \"binary\") {\n if (input.controller === \"launchd\") {\n await ensureDaemonServiceStableBinaryExecutable();\n }\n return;\n }\n const activeBundle = await readDaemonActiveBundleState();\n if (activeBundle?.bundleFormat === \"binary_v1\") {\n throw new Error(\n \"Refusing to replace a binary-managed OpenMeld Service with the npm carrier. Run the managed OpenMeld binary for Service repair or update.\"\n );\n }\n await writeDaemonServiceLauncher();\n if (input.controller === \"launchd\") {\n await writeDaemonServiceExecutableWrapper();\n }\n}\n\nfunction buildSystemServiceEnvironment(): Record<string, string> {\n const env: Record<string, string> = {};\n const runtimeUser = userInfo().username;\n for (const [key, value] of Object.entries(\n normalizeCommandEnvironment(process.env)\n )) {\n if (\n typeof value !== \"string\" ||\n value.length === 0 ||\n !isDaemonServiceEnvironmentKey(key)\n ) {\n continue;\n }\n env[key] =\n key === \"PATH\"\n ? stripDispatchSpaceActionCliShims(value)\n : sanitizeDaemonServiceEnvironmentValue(value);\n }\n if (process.platform === \"darwin\") {\n env.PATH ??= DEFAULT_LAUNCHD_PATH;\n }\n if (process.platform === \"win32\") {\n // Task ownership checks need the same lane root used to register the task.\n // The published setup command intentionally leaves OPENMELD_HOME unset.\n env[OPENMELD_HOME_ENV_KEY] ??= resolveOpenMeldRootDir();\n }\n env.HOME ??= userInfo().homedir;\n env.USER ??= env.LOGNAME ?? runtimeUser;\n env.LOGNAME ??= env.USER;\n return env;\n}\n\nfunction stripDispatchSpaceActionCliShims(value: string): string {\n return value\n .split(delimiter)\n .filter((entry) => !DISPATCH_SPACE_ACTION_PATH_PATTERN.test(entry))\n .join(delimiter);\n}\n\nfunction isDaemonServiceEnvironmentKey(key: string): boolean {\n return (\n DAEMON_SERVICE_ENV_KEY_WHITELIST.has(key) ||\n (process.platform === \"win32\" &&\n WINDOWS_RUNTIME_ENV_KEYS.some((candidate) => candidate === key))\n );\n}\n\nfunction sanitizeDaemonServiceEnvironmentValue(value: string): string {\n let sanitized = \"\";\n for (const char of value) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n continue;\n }\n if ((code >= 0x00 && code <= 0x1f) || code === 0x7f) {\n continue;\n }\n sanitized += char;\n }\n return sanitized;\n}\n","import { isLoopbackHostname } from \"../config/loopback-hostname\";\nimport type { OpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport {\n buildNextVersionState,\n compareSemver,\n fetchLatestPackageInfo,\n isPlainReleaseVersion,\n type PackageLatestInfo,\n readVersionState,\n writeVersionState,\n} from \"../config/version-state\";\nimport type { OpenMeldDistribution } from \"../runtime/distribution\";\nimport { resolveOpenMeldDistribution } from \"../runtime/distribution\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\n\nconst OPENMELD_PACKAGE_NAME = \"openmeld\";\nconst CLI_UPDATE_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Result of resolving how the running CLI compares to its published release\n * channel. npm installs read npm's `latest` manifest; managed binaries read the\n * configured R2 manifest. This is the single place that derives the\n * forced-update signal from the channel's minimum required version, so the\n * entry-check gate and `openmeld doctor` cannot drift apart.\n */\nexport type CliUpdateAssessment = {\n /**\n * True when the version check actually applies to the current production\n * distribution or an explicitly configured canary/local binary.\n */\n checked: boolean;\n currentVersion: string;\n latestVersion: string | null;\n serviceVersion?: string;\n requiredFloor: string | null;\n updateAvailable: boolean;\n /**\n * True only when the running version is strictly below the published floor.\n * This is the positive confirmation that gates forced updates; any failure to\n * resolve the floor leaves it false (fail-open).\n */\n floorBreached: boolean;\n};\n\nexport function isCliUpdateCheckApplicable(\n environmentTarget: OpenMeldEnvironmentTarget,\n input: {\n distribution?: OpenMeldDistribution;\n manifestUrl?: string | null;\n } = {}\n): boolean {\n const distribution = input.distribution ?? resolveOpenMeldDistribution();\n const productionCheck =\n environmentTarget.preset === \"prod\" &&\n (distribution === \"binary\" ||\n environmentTarget.userFacingCommand === \"openmeld\");\n if (productionCheck) {\n return true;\n }\n const manifestUrl = normalizeOptionalText(\n input.manifestUrl ?? process.env.OPENMELD_CLI_BINARY_MANIFEST_URL\n );\n if (environmentTarget.preset === \"dev-local\" && distribution === \"binary\") {\n // The localhost setup lane can exercise the real updater without ever\n // falling back to a published production channel or updating source installs.\n const url = manifestUrl ? URL.parse(manifestUrl) : null;\n return Boolean(\n url &&\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n isLoopbackHostname(url.hostname)\n );\n }\n return (\n environmentTarget.preset === \"canary\" &&\n distribution === \"binary\" &&\n Boolean(manifestUrl)\n );\n}\n\n/**\n * Resolves the published latest version and required-update floor for the\n * current distribution's release channel (npm for npm installs, R2 for managed\n * binaries).\n *\n * Reads a fresh local cache first (24h TTL) so machine-mode (`--json`) commands\n * do not pay a network probe on every invocation; only a cold/stale cache hits\n * the channel. Background maintenance and explicit update actions can bypass\n * that cache with `forceRefresh` so a known release is never hidden by an older\n * command check. Any network or parse failure resolves to \"no signal\" so the\n * caller fails open and never locks a user out over a flaky release channel.\n */\nexport async function assessCliUpdate(input: {\n environmentTarget: OpenMeldEnvironmentTarget;\n forceRefresh?: boolean;\n currentVersion?: string;\n}): Promise<CliUpdateAssessment> {\n const currentVersion = input.currentVersion ?? OPENMELD_VERSION;\n const unchecked: CliUpdateAssessment = {\n checked: false,\n currentVersion,\n latestVersion: null,\n requiredFloor: null,\n updateAvailable: false,\n floorBreached: false,\n };\n if (!isCliUpdateCheckApplicable(input.environmentTarget)) {\n return unchecked;\n }\n\n const info = await resolveLatestPackageInfo({\n currentVersion,\n forceRefresh: input.forceRefresh === true,\n }).catch(() => null);\n if (!info?.version) {\n // Fail-open: we tried, but have no authoritative signal.\n return { ...unchecked, checked: true };\n }\n\n // Only trust a well-formed floor. A malformed value (corrupted cache or a\n // bad publish) is treated as \"no signal\" so it fails open instead of wrongly\n // gating via `compareSemver`'s lexical fallback.\n const requiredFloor =\n info.minRequiredCliVersion &&\n isPlainReleaseVersion(info.minRequiredCliVersion)\n ? info.minRequiredCliVersion\n : null;\n const floorBreached =\n requiredFloor !== null && compareSemver(currentVersion, requiredFloor) < 0;\n return {\n checked: true,\n currentVersion,\n latestVersion: info.version,\n ...(info.serviceVersion ? { serviceVersion: info.serviceVersion } : {}),\n requiredFloor,\n updateAvailable: compareSemver(currentVersion, info.version) < 0,\n floorBreached,\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 resolveLatestPackageInfo(input: {\n currentVersion: string;\n forceRefresh: boolean;\n}): Promise<PackageLatestInfo> {\n const cached = input.forceRefresh\n ? null\n : await readFreshCachedInfo(input.currentVersion);\n if (cached) {\n return cached;\n }\n const info = await fetchLatestPackageInfo(OPENMELD_PACKAGE_NAME, {\n forceRefresh: input.forceRefresh,\n });\n await persistInfo({ currentVersion: input.currentVersion, info });\n return info;\n}\n\nasync function readFreshCachedInfo(\n currentVersion: string\n): Promise<PackageLatestInfo | null> {\n const state = await readVersionState().catch(() => null);\n if (\n state?.last_version !== currentVersion ||\n !state.latest_version ||\n !state.last_checked_at\n ) {\n return null;\n }\n const checkedAt = Date.parse(state.last_checked_at);\n if (\n Number.isNaN(checkedAt) ||\n Date.now() - checkedAt >= CLI_UPDATE_CACHE_TTL_MS\n ) {\n return null;\n }\n const cachedRequiredFloor = state.required_floor ?? null;\n if (\n cachedRequiredFloor !== null &&\n !isPlainReleaseVersion(cachedRequiredFloor)\n ) {\n return null;\n }\n return {\n version: state.latest_version,\n minRequiredCliVersion: cachedRequiredFloor,\n };\n}\n\nasync function persistInfo(input: {\n currentVersion: string;\n info: PackageLatestInfo;\n}): Promise<void> {\n const previous = await readVersionState().catch(() => null);\n await writeVersionState(\n buildNextVersionState({\n previous,\n currentVersion: input.currentVersion,\n latestVersion: input.info.version,\n requiredFloor: input.info.minRequiredCliVersion,\n })\n ).catch(() => undefined);\n}\n","import { localAgentCatalogSchema } from \"@openmeld/schemas\";\nimport type {\n LocalAgentCatalog,\n LocalAgentCatalogSelectableReason,\n} from \"@openmeld/schemas/types\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport type { StartReadinessSnapshot } from \"../../start-local/readiness-types\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n} from \"./daemon-device-id\";\n\ntype LocalAgentCatalogEntry = LocalAgentCatalog[\"entries\"][number];\n\nexport function buildLocalAgentCatalogFromReadiness(\n readiness: StartReadinessSnapshot\n): LocalAgentCatalog {\n const entries = readiness.agents.candidates.map(\n buildLocalAgentCatalogEntryFromCandidate\n );\n const catalog: LocalAgentCatalog = {\n ...summarizeLocalAgentCatalogEntries(entries),\n entries,\n };\n const parsed = localAgentCatalogSchema.safeParse(catalog);\n if (!parsed.success) {\n throw new Error(\n `OpenMeld setup built an invalid local-agent catalog before reporting it: ${formatLocalAgentCatalogValidationError(\n parsed.error.issues\n )}`\n );\n }\n return parsed.data;\n}\n\nfunction buildLocalAgentCatalogEntryFromCandidate(\n candidate: StartReadinessSnapshot[\"agents\"][\"candidates\"][number]\n): LocalAgentCatalogEntry {\n if (candidate.lifecycleStatus === \"suspended\") {\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: \"not_available\",\n selectable: false,\n selectableReason: candidate.detected\n ? \"not_supported_yet\"\n : \"not_detected\",\n };\n }\n if (candidate.launchStatus === \"needs_repair\" && !candidate.enabled) {\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: \"not_available\",\n selectable: false,\n selectableReason: \"needs_repair\",\n };\n }\n return {\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: \"builtin\",\n detected: candidate.detected,\n enabled: candidate.enabled,\n launchStatus: candidate.launchStatus,\n selectable: candidate.selectable,\n selectableReason: normalizeSelectableReason(candidate.selectableReason),\n };\n}\n\nfunction summarizeLocalAgentCatalogEntries(\n entries: LocalAgentCatalogEntry[]\n): Omit<LocalAgentCatalog, \"entries\"> {\n return {\n totalBuiltins: entries.length,\n detectedSupported: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"ready\"\n ).length,\n needsChoice: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"needs_choice\"\n ).length,\n needsRepair: entries.filter(\n (entry) => entry.detected && entry.launchStatus === \"needs_repair\"\n ).length,\n detectedNotSupportedYet: entries.filter(\n (entry) =>\n entry.detected &&\n entry.launchStatus === \"not_available\" &&\n entry.selectableReason === \"not_supported_yet\"\n ).length,\n notDetected: entries.filter((entry) => !entry.detected).length,\n };\n}\n\nexport async function readCurrentLocalDeviceId(\n input: {\n serviceContract?: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n } = {}\n): Promise<string | null> {\n const serviceContract =\n input.serviceContract === undefined\n ? await readDaemonServiceContract().catch(() => null)\n : input.serviceContract;\n const contractDeviceId = serviceContract?.deviceId;\n if (typeof contractDeviceId === \"string\" && contractDeviceId.trim().length) {\n return contractDeviceId.trim();\n }\n\n const runtimePaths = await ensureDaemonRuntimePaths();\n return await resolveDaemonDeviceId({\n deviceIdPath: runtimePaths.deviceIdPath,\n });\n}\n\nfunction normalizeSelectableReason(\n selectableReason: StartReadinessSnapshot[\"agents\"][\"candidates\"][number][\"selectableReason\"]\n): LocalAgentCatalogSelectableReason | null {\n switch (selectableReason) {\n case null:\n case \"not_detected\":\n case \"not_supported_yet\":\n case \"needs_repair\":\n case \"custom_coming_soon\":\n return selectableReason;\n default: {\n const unexpectedSelectableReason: never = selectableReason;\n throw new Error(\n `Unsupported local-agent selectableReason: ${unexpectedSelectableReason}`\n );\n }\n }\n}\n\nfunction formatLocalAgentCatalogValidationError(\n issues: readonly { message: string; path: PropertyKey[] }[]\n): string {\n return issues\n .slice(0, 3)\n .map((issue) => {\n const path = issue.path.length ? issue.path.join(\".\") : \"catalog\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n}\n","import { createCurrentDeviceApi } from \"@openmeld/api-client\";\nimport type { CurrentLocalRuntimeReplyReadinessResponse } from \"@openmeld/schemas/types\";\nimport { resolveOpenMeldEnvPreset } from \"../config/paths\";\nimport { readCurrentLocalDeviceId } from \"../local-service/state/current-device-identity\";\nimport { createCliApiClientFoundation } from \"../space/api-client-foundation\";\n\nexport type CurrentLocalRuntimeIdentity = {\n deviceId: string;\n runtimeLane: string;\n};\n\nexport async function readCurrentLocalRuntimeReplyReadiness(input: {\n gatewayUrl: string;\n}): Promise<CurrentLocalRuntimeReplyReadinessResponse> {\n const deviceId = await readCurrentLocalDeviceId();\n if (!deviceId) {\n throw new Error(\n \"This installation has no computer identity. Run openmeld setup to connect it.\"\n );\n }\n return await createCurrentDeviceApi(\n createCliApiClientFoundation(input.gatewayUrl)\n ).getPeopleComputerReplyReadiness({\n deviceId,\n runtimeLane: resolveOpenMeldEnvPreset(),\n });\n}\n\nexport async function assertCurrentLocalRuntimeCanReceiveWake(input: {\n commandLabel?: string;\n gatewayUrl: string;\n openMeldServiceRuntimeIdentity: CurrentLocalRuntimeIdentity;\n}): Promise<CurrentLocalRuntimeReplyReadinessResponse> {\n let response: CurrentLocalRuntimeReplyReadinessResponse;\n try {\n response = await readCurrentLocalRuntimeReplyReadiness({\n gatewayUrl: input.gatewayUrl,\n });\n } catch (error) {\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n detail: toErrorMessage(error),\n supportCode: \"current_reply_readiness.read_failed\",\n })\n );\n }\n\n const mismatchSupportCode = resolveCurrentTargetMismatchSupportCode({\n response,\n openMeldServiceRuntimeIdentity: input.openMeldServiceRuntimeIdentity,\n });\n if (mismatchSupportCode) {\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n supportCode: mismatchSupportCode,\n })\n );\n }\n\n if (\n response.canReplyFromThisComputer &&\n response.service.connected &&\n response.service.matchingCurrentRuntime\n ) {\n return response;\n }\n\n throw new Error(\n formatCurrentLocalRuntimeReplyReadinessFailure({\n commandLabel: input.commandLabel,\n detail: response.message,\n supportCode: resolveCurrentReplyReadinessSupportCode(response),\n })\n );\n}\n\nfunction resolveCurrentTargetMismatchSupportCode(input: {\n response: CurrentLocalRuntimeReplyReadinessResponse;\n openMeldServiceRuntimeIdentity: CurrentLocalRuntimeIdentity;\n}): string | null {\n if (input.response.currentTarget.availability !== \"resolved\") {\n return \"current_reply_readiness.current_target_missing\";\n }\n if (\n input.response.currentTarget.deviceId !==\n input.openMeldServiceRuntimeIdentity.deviceId\n ) {\n return \"current_reply_readiness.device_mismatch\";\n }\n if (\n input.response.currentTarget.runtimeLane !==\n input.openMeldServiceRuntimeIdentity.runtimeLane\n ) {\n return \"current_reply_readiness.lane_mismatch\";\n }\n return null;\n}\n\nfunction resolveCurrentReplyReadinessSupportCode(\n response: CurrentLocalRuntimeReplyReadinessResponse\n): string {\n return (\n response.service.reasonCodes[0] ??\n response.runtime.reasonCodes[0] ??\n `current_reply_readiness.${response.primaryBlocker}`\n );\n}\n\nfunction formatCurrentLocalRuntimeReplyReadinessFailure(input: {\n commandLabel?: string;\n detail?: string;\n supportCode: string;\n}): string {\n const commandLabel = input.commandLabel ?? \"setup\";\n return `OpenMeld Service started, but OpenMeld could not confirm this computer can receive local Wake work yet. Run ${commandLabel} again from this Terminal and keep OpenMeld Service running. Support code: ${input.supportCode}.${input.detail ? ` Detail: ${input.detail}` : \"\"}`;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const message = error.message.trim();\n return message.length > 0 ? message : \"unknown error\";\n }\n const message = String(error ?? \"\").trim();\n return message.length > 0 ? message : \"unknown error\";\n}\n","import { toStructuredApiClientFailure } from \"@openmeld/api-client\";\nimport type { DaemonStatusServerRequirementUnavailableReason } from \"@openmeld/schemas\";\nimport type {\n LocalCliComponentUpdateProjection,\n LocalServiceComponentUpdateProjection,\n} from \"@openmeld/schemas/types\";\nimport { getAuthSessionState } from \"../config/auth-session\";\nimport { readCurrentLocalRuntimeReplyReadiness } from \"../system/current-local-runtime-reply-readiness\";\n\n/**\n * Why the server-required version visor could not be resolved. Kept as a\n * small closed set (never the raw error) so callers can render a stable,\n * short \"unavailable (<reason>)\" message without leaking transport details.\n */\nexport type ServerRequiredVersionUnavailableReason =\n DaemonStatusServerRequirementUnavailableReason;\n\n/**\n * The server's view of what CLI/Service version this account currently\n * needs, read live from Core's compiled release manifest via\n * `getCurrentLocalRuntimeReplyReadiness` (`localComponents.cli` /\n * `.localComponents.service`). This is the second book the release-channel\n * check (`cli-update-assessment.ts`) has no visibility into: Core's release\n * manifest and the published release channel (npm registry / R2\n * `cli/manifest.json`) are stamped independently and can disagree — that gap\n * is exactly what caused the W-REL-DOCTOR half-rollout incident (Core\n * required 0.2.21 while the release channel was still serving 0.2.20).\n */\nexport type ServerRequiredVersionAssessment =\n | {\n available: true;\n generatedAt: string;\n cli: LocalCliComponentUpdateProjection;\n service: LocalServiceComponentUpdateProjection;\n }\n | {\n available: false;\n reason: ServerRequiredVersionUnavailableReason;\n detail: string | null;\n };\n\n/**\n * Resolves the server-required version visor for the current account.\n *\n * Skips the network round-trip entirely when there is no valid local auth\n * session (a request would 401 anyway), so `openmeld service status` /\n * `openmeld doctor` degrade instantly instead of waiting on a call already\n * known to fail. Any transport failure (offline, timeout, gateway error,\n * invalid response) is caught here and turned into an `available: false`\n * result: this function must never throw, and must never block or slow down\n * the release-channel view it is displayed alongside.\n *\n * Reuses the existing authenticated CLI-to-gateway channel\n * (`readCurrentLocalRuntimeReplyReadiness`, already used elsewhere — e.g. to\n * confirm reply readiness during `openmeld setup`) instead of opening a new\n * one, so it inherits that channel's short, bounded request timeout\n * (`DEFAULT_SPACE_REQUEST_TIMEOUT_MS`) and cannot hang `status`/`doctor`.\n */\nexport async function assessServerRequiredVersion(input: {\n gatewayUrl: string;\n}): Promise<ServerRequiredVersionAssessment> {\n const authState = await getAuthSessionState({ validateRemote: false }).catch(\n () => null\n );\n if (authState?.state !== \"valid\" || !authState.session) {\n return { available: false, reason: \"signed_out\", detail: null };\n }\n\n try {\n const response = await readCurrentLocalRuntimeReplyReadiness({\n gatewayUrl: input.gatewayUrl,\n });\n return {\n available: true,\n generatedAt: response.generatedAt,\n cli: response.localComponents.cli,\n service: response.localComponents.service,\n };\n } catch (error) {\n return {\n available: false,\n ...classifyServerRequiredVersionFailure(error),\n };\n }\n}\n\n/**\n * Renders a short, stable phrase for an unavailable server-required version\n * result, safe to inline in \"unavailable (<reason>)\" copy.\n */\nexport function describeServerRequiredVersionUnavailableReason(\n assessment: Extract<ServerRequiredVersionAssessment, { available: false }>\n): string {\n if (assessment.reason === \"signed_out\") {\n return \"not signed in\";\n }\n return assessment.detail ?? \"request failed\";\n}\n\nfunction classifyServerRequiredVersionFailure(error: unknown): {\n reason: ServerRequiredVersionUnavailableReason;\n detail: string | null;\n} {\n const failure = toStructuredApiClientFailure(error);\n if (failure.status === 401 || failure.status === 403) {\n return { reason: \"signed_out\", detail: failure.message };\n }\n if (\n failure.code === \"network.timeout\" ||\n failure.code === \"network.request_failed\"\n ) {\n return { reason: \"offline\", detail: failure.message };\n }\n return { reason: \"request_failed\", detail: failure.message };\n}\n","import { resolveOpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport {\n assessServerRequiredVersion,\n type ServerRequiredVersionAssessment,\n} from \"./server-required-version-assessment\";\n\nexport type ServiceUpdateUrgency = \"available\" | \"required\";\n\nexport async function resolveServiceUpdateUrgency(\n input: { gatewayUrl?: string } = {}\n): Promise<ServiceUpdateUrgency> {\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const assessment = await assessServerRequiredVersion({\n gatewayUrl: environmentTarget.gatewayUrl,\n });\n return resolveServiceUpdateUrgencyFromAssessment(assessment);\n}\n\nexport function resolveServiceUpdateUrgencyFromAssessment(\n assessment: ServerRequiredVersionAssessment\n): ServiceUpdateUrgency {\n return assessment.available && assessment.service.status === \"update_required\"\n ? \"required\"\n : \"available\";\n}\n","import { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { resolveBundledServiceRelease } from \"../../config/service-release\";\nimport { compareSemver } from \"../../config/version-state\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\n\nexport async function resolveCurrentDaemonExpectedVersion(\n selectedVersion = resolveBundledServiceRelease()?.version ?? OPENMELD_VERSION\n): Promise<string> {\n const contract = await readDaemonServiceContract();\n // Release selection must not silently downgrade an installed Service.\n // Inventory still verifies its bytes, runtime contract and lane.\n return contract && compareSemver(contract.daemonVersion, selectedVersion) > 0\n ? contract.daemonVersion\n : selectedVersion;\n}\n","import type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\n\nexport const DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"legacy_shared_service_present\",\n \"version_outdated\",\n \"legacy_detached_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\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 \"duplicate_owned_processes\",\n \"service_manager_environment_drift\",\n \"service_manager_startup_policy_drift\",\n ]);\n\nexport const DAEMON_SERVICE_AUTO_HEAL_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"manager_running_without_runtime\",\n \"service_manager_path_drift\",\n ]);\n\nexport const DAEMON_SERVICE_REPAIR_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"manager_running_without_runtime\",\n \"legacy_detached_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\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 \"service_manager_path_drift\",\n \"service_manager_environment_drift\",\n \"service_manager_startup_policy_drift\",\n \"duplicate_owned_processes\",\n ]);\n\nexport const DAEMON_SERVICE_ARTIFACT_DRIFT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"background_foreground_conflict\",\n \"bundle_lane_drift\",\n \"bundle_missing\",\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_path_invalid\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_version_drift\",\n \"manager_running_without_runtime\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\n \"runtime_stale\",\n \"service_manager_path_drift\",\n \"service_manager_environment_drift\",\n \"version_outdated\",\n ]);\n\nexport const DAEMON_SERVICE_RUN_BLOCKING_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n ...[...DAEMON_SERVICE_ARTIFACT_DRIFT_ANOMALIES].filter(\n (code) =>\n code !== \"runtime_stale\" &&\n code !== \"version_outdated\" &&\n code !== \"bundle_version_drift\"\n ),\n \"duplicate_owned_processes\",\n \"foreground_background_conflict\",\n ]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"duplicate_owned_processes\",\n \"manager_running_without_runtime\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_mismatch\",\n ]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\"bundle_missing\", \"bundle_path_invalid\"]);\n\nexport const DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_lane_drift\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_version_drift\",\n \"runtime_contract_missing\",\n \"runtime_contract_unavailable\",\n \"service_manager_path_drift\",\n \"version_outdated\",\n \"service_manager_startup_policy_drift\",\n ]);\n\nexport type DaemonServiceWakeabilityClassification = {\n advisoryCodes: DaemonServiceAnomalyCode[];\n blockingCodes: DaemonServiceAnomalyCode[];\n blocksWake: boolean;\n conditionalCodes: DaemonServiceAnomalyCode[];\n executionEvidenceSafe: boolean;\n};\n\nexport type DaemonServiceRunStartabilityClassification = {\n blockingCodes: DaemonServiceAnomalyCode[];\n blocksStart: boolean;\n};\n\nexport function classifyDaemonServiceWakeability(input: {\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceWakeabilityClassification {\n const anomalyCodes = collectUniqueAnomalyCodes(input.inventory);\n const executionEvidenceSafe = hasVerifiedRunningDaemonExecutionEvidence({\n anomalyCodes,\n inventory: input.inventory,\n });\n const blockingCodes: DaemonServiceAnomalyCode[] = [];\n const advisoryCodes: DaemonServiceAnomalyCode[] = [];\n const conditionalCodes: DaemonServiceAnomalyCode[] = [];\n\n for (const code of anomalyCodes) {\n if (DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(code)) {\n blockingCodes.push(code);\n continue;\n }\n\n if (DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(code)) {\n conditionalCodes.push(code);\n if (\n shouldBlockConditionalWakeabilityAnomaly({\n code,\n executionEvidenceSafe,\n })\n ) {\n blockingCodes.push(code);\n } else {\n advisoryCodes.push(code);\n }\n continue;\n }\n\n if (DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(code)) {\n advisoryCodes.push(code);\n }\n }\n\n return {\n advisoryCodes,\n blockingCodes,\n blocksWake: blockingCodes.length > 0,\n conditionalCodes,\n executionEvidenceSafe,\n };\n}\n\nexport function classifyDaemonServiceRunStartability(input: {\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceRunStartabilityClassification {\n const anomalyCodes = collectUniqueAnomalyCodes(input.inventory);\n const executionEvidenceSafe = hasVerifiedRunningDaemonExecutionEvidence({\n anomalyCodes,\n inventory: input.inventory,\n });\n const blockingCodes = anomalyCodes.filter((code) => {\n if (!DAEMON_SERVICE_RUN_BLOCKING_ANOMALIES.has(code)) {\n return false;\n }\n return !(\n executionEvidenceSafe &&\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(code)\n );\n });\n return {\n blockingCodes,\n blocksStart: blockingCodes.length > 0,\n };\n}\n\nfunction shouldBlockConditionalWakeabilityAnomaly(input: {\n code: DaemonServiceAnomalyCode;\n executionEvidenceSafe: boolean;\n}): boolean {\n return !input.executionEvidenceSafe;\n}\n\nfunction hasVerifiedRunningDaemonExecutionEvidence(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n inventory?: DaemonServiceInventory | null;\n}): boolean {\n const inventory = input.inventory;\n if (inventory?.runtimeStatus.status !== \"running\") {\n return false;\n }\n if (inventory.runtimeContractCompatibility?.status !== \"compatible\") {\n return false;\n }\n if (!hasUsableServiceContract(inventory.serviceContract)) {\n return false;\n }\n if (\n !(\n inventory.activeBundleEntryPath &&\n inventory.runtimeCommandEntryPath &&\n inventory.runtimeCommandPathExists === true\n )\n ) {\n return false;\n }\n return !input.anomalyCodes.some((code) =>\n DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(code)\n );\n}\n\nfunction hasUsableServiceContract(\n contract: DaemonServiceInventory[\"serviceContract\"]\n): boolean {\n return Boolean(\n contract?.deviceId &&\n contract.gatewayUrl &&\n contract.lane &&\n Number.isFinite(contract.heartbeatMs) &&\n contract.heartbeatMs > 0\n );\n}\n\nfunction collectUniqueAnomalyCodes(\n inventory?: DaemonServiceInventory | null\n): DaemonServiceAnomalyCode[] {\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory?.anomalies ?? []) {\n if (!codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n","import { compareSemver } from \"../../config/version-state\";\n\nexport type VersionChangeDirection = \"same\" | \"upgrade\" | \"downgrade\";\n\nexport function resolveVersionChangeDirection(input: {\n fromVersion: string;\n toVersion: string;\n}): VersionChangeDirection {\n const comparison = compareSemver(input.fromVersion, input.toVersion);\n if (comparison === 0) {\n return \"same\";\n }\n return comparison < 0 ? \"upgrade\" : \"downgrade\";\n}\n\nexport function isVersionDowngrade(input: {\n fromVersion: string;\n toVersion: string;\n}): boolean {\n return resolveVersionChangeDirection(input) === \"downgrade\";\n}\n","import {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport {\n type OpenMeldDistribution,\n resolveOpenMeldDistribution,\n} from \"../../runtime/distribution\";\nimport {\n DAEMON_SERVICE_AUTO_HEAL_ANOMALIES,\n DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES,\n} from \"./daemon-service-anomaly-groups\";\nimport type { DaemonBundleFormat } from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nconst BLOCKED_ALIGNMENT_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"downgrade_blocked\",\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nexport type DaemonServiceTargetSpec = {\n daemonVersion: string;\n bundleFormat: DaemonBundleFormat;\n environmentTarget: OpenMeldEnvironmentTarget;\n};\n\nexport type DaemonServiceAlignmentDecision = {\n status:\n | \"already_aligned\"\n | \"not_installed\"\n | \"needs_auto_heal\"\n | \"needs_full_alignment\"\n | \"blocked\";\n target: DaemonServiceTargetSpec;\n reasonCodes: DaemonServiceAnomalyCode[];\n};\n\nexport function buildDaemonServiceTargetSpec(input: {\n daemonVersion: string;\n distribution?: OpenMeldDistribution;\n environmentTarget?: OpenMeldEnvironmentTarget;\n gatewayUrl?: string;\n}): DaemonServiceTargetSpec {\n const distribution = input.distribution ?? resolveOpenMeldDistribution();\n return {\n daemonVersion: input.daemonVersion,\n bundleFormat: distribution === \"binary\" ? \"binary_v1\" : \"self_contained_v1\",\n environmentTarget:\n input.environmentTarget ??\n resolveOpenMeldEnvironmentTargetFromEnv({ gatewayUrl: input.gatewayUrl }),\n };\n}\n\nexport function resolveDaemonServiceAlignmentDecision(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): DaemonServiceAlignmentDecision {\n if (\n !input.inventory.installStatus.installed &&\n input.inventory.legacySharedService?.present\n ) {\n return {\n status: \"needs_full_alignment\",\n target: input.target,\n reasonCodes: [\"legacy_shared_service_present\"],\n };\n }\n if (!input.inventory.installStatus.installed) {\n return {\n status: \"not_installed\",\n target: input.target,\n reasonCodes: [\"not_installed\"],\n };\n }\n\n const blockedReasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => BLOCKED_ALIGNMENT_ANOMALIES.has(code),\n });\n const versionDecision = resolveVersionDecision(input);\n if (\n versionDecision === \"blocked\" &&\n !blockedReasonCodes.includes(\"downgrade_blocked\")\n ) {\n blockedReasonCodes.push(\"downgrade_blocked\");\n }\n if (blockedReasonCodes.length > 0) {\n return {\n status: \"blocked\",\n target: input.target,\n reasonCodes: blockedReasonCodes,\n };\n }\n\n const fullAlignmentReasonCodes = collectFullAlignmentReasonCodes({\n ...input,\n versionDecision,\n });\n if (\n versionDecision === \"needs_full_alignment\" &&\n !fullAlignmentReasonCodes.includes(\"version_outdated\")\n ) {\n fullAlignmentReasonCodes.push(\"version_outdated\");\n }\n if (fullAlignmentReasonCodes.length > 0) {\n return {\n status: \"needs_full_alignment\",\n target: input.target,\n reasonCodes: fullAlignmentReasonCodes,\n };\n }\n\n const autoHealReasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => DAEMON_SERVICE_AUTO_HEAL_ANOMALIES.has(code),\n });\n if (autoHealReasonCodes.length > 0) {\n return {\n status: \"needs_auto_heal\",\n target: input.target,\n reasonCodes: autoHealReasonCodes,\n };\n }\n\n return {\n status: \"already_aligned\",\n target: input.target,\n reasonCodes: [],\n };\n}\n\nfunction collectFullAlignmentReasonCodes(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n versionDecision: \"already_aligned\" | \"needs_full_alignment\" | \"blocked\";\n}): DaemonServiceAnomalyCode[] {\n const reasonCodes = collectReasonCodes({\n inventory: input.inventory,\n predicate: (code) => DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES.has(code),\n });\n\n if (\n input.versionDecision === \"already_aligned\" &&\n input.inventory.activeBundle &&\n input.inventory.activeBundle.daemonVersion !==\n resolveExpectedArtifactVersion(input.inventory) &&\n !reasonCodes.includes(\"bundle_version_drift\")\n ) {\n reasonCodes.push(\"bundle_version_drift\");\n }\n\n if (\n input.inventory.activeBundle &&\n input.inventory.activeBundle.bundleFormat !== input.target.bundleFormat &&\n !reasonCodes.includes(\"bundle_strategy_legacy\")\n ) {\n reasonCodes.push(\"bundle_strategy_legacy\");\n }\n\n if (\n hasServiceManagerEnvironmentDrift(input) &&\n !reasonCodes.includes(\"service_manager_environment_drift\")\n ) {\n reasonCodes.push(\"service_manager_environment_drift\");\n }\n\n return reasonCodes;\n}\n\nfunction hasServiceManagerEnvironmentDrift(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): boolean {\n const status = input.inventory.serviceManagerStatus;\n if (!(status?.installed && status.environmentTarget !== undefined)) {\n return false;\n }\n const observed = status.environmentTarget;\n const expected = input.target.environmentTarget;\n return (\n observed === null ||\n observed.preset !== expected.preset ||\n observed.gatewayUrl !== expected.gatewayUrl ||\n observed.authBaseUrl !== expected.authBaseUrl ||\n observed.userFacingCommand !== expected.userFacingCommand\n );\n}\n\nfunction resolveVersionDecision(input: {\n inventory: DaemonServiceInventory;\n target: DaemonServiceTargetSpec;\n}): \"already_aligned\" | \"needs_full_alignment\" | \"blocked\" {\n const configuredVersion = resolveExpectedArtifactVersion(input.inventory);\n if (!configuredVersion) {\n return \"already_aligned\";\n }\n const versionDirection = resolveVersionChangeDirection({\n fromVersion: configuredVersion,\n toVersion: input.target.daemonVersion,\n });\n if (versionDirection === \"upgrade\") {\n return \"needs_full_alignment\";\n }\n if (versionDirection === \"downgrade\") {\n return \"blocked\";\n }\n return \"already_aligned\";\n}\n\nfunction resolveExpectedArtifactVersion(\n inventory: DaemonServiceInventory\n): string | null {\n return (\n inventory.serviceContract?.daemonVersion ??\n inventory.installStatus.state?.daemonVersion ??\n null\n );\n}\n\nfunction collectReasonCodes(input: {\n inventory: DaemonServiceInventory;\n predicate: (code: DaemonServiceAnomalyCode) => boolean;\n}): DaemonServiceAnomalyCode[] {\n const reasonCodes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of input.inventory.anomalies) {\n if (input.predicate(anomaly.code) && !reasonCodes.includes(anomaly.code)) {\n reasonCodes.push(anomaly.code);\n }\n }\n return reasonCodes;\n}\n","// Preserve the value written by supported installations. This is a disk-format\n// contract, not the Runtime Transport epoch. A wire change cannot invalidate it.\n// A future incompatible disk format needs versioned readers before new writers.\nexport const DAEMON_LOCAL_STATE_EPOCH =\n \"runtime-transport-epoch-2026-07-default-project\";\n","import {\n copyFile,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport { formatOpenMeldCliTextBlock } from \"../../runtime/cli-entry-command\";\nimport {\n DAEMON_RUNTIME_CONTRACT_META_FILE,\n DAEMON_RUNTIME_CONTRACT_REPAIR_REPORT_FILE,\n} from \"../core/constants\";\nimport {\n dirnamePath,\n normalizeOptionalText,\n toErrorMessage,\n} from \"../core/logger\";\nimport type {\n DaemonRuntimeContractGuardResult,\n DaemonRuntimeContractMeta,\n DaemonRuntimeContractRepairReason,\n DaemonRuntimeContractRepairReport,\n DaemonRuntimePaths,\n} from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\nimport { DAEMON_LOCAL_STATE_EPOCH } from \"./local-state-version\";\n\nconst RUNTIME_CONTRACT_META_SCHEMA = \"daemon.runtime.contract.meta\" as const;\nconst RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA =\n \"daemon.runtime.contract.repair.report\" as const;\n\ntype GuardInput = {\n runtimePaths: DaemonRuntimePaths;\n contractEpoch?: string;\n nowIso?: string;\n};\n\ntype RepairRuntimeStateInput = {\n contractEpoch: string;\n fromEpoch: string | null;\n nowIso: string;\n reason: DaemonRuntimeContractRepairReason;\n runtimePaths: DaemonRuntimePaths;\n stateFilePaths: string[];\n};\n\ntype ParsedMeta = {\n contractEpoch: string;\n updatedAt: string;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst createRuntimeContractMeta = (input: {\n contractEpoch: string;\n nowIso: string;\n}): DaemonRuntimeContractMeta => ({\n schema: RUNTIME_CONTRACT_META_SCHEMA,\n v: 1,\n contractEpoch: input.contractEpoch,\n updatedAt: input.nowIso,\n});\n\nconst createRuntimeContractRepairReport = (input: {\n appliedAt: string;\n backupPaths: string[];\n cleanedPaths: string[];\n errorMessage: string | null;\n fromEpoch: string | null;\n reason: DaemonRuntimeContractRepairReason;\n status: \"applied\" | \"failed\";\n toEpoch: string;\n}): DaemonRuntimeContractRepairReport => ({\n schema: RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA,\n v: 1,\n status: input.status,\n reason: input.reason,\n fromEpoch: input.fromEpoch,\n toEpoch: input.toEpoch,\n appliedAt: input.appliedAt,\n cleanedPaths: [...input.cleanedPaths],\n backupPaths: [...input.backupPaths],\n errorMessage: input.errorMessage,\n});\n\nconst parseRuntimeContractMeta = (\n value: unknown\n): DaemonRuntimeContractMeta | null => {\n if (!isRecord(value)) {\n return null;\n }\n if (typeof value.v === \"number\" && value.v > 1) {\n throw new Error(\n \"This OpenMeld version cannot read the newer local runtime state. Update OpenMeld to continue. Your local data has been preserved.\"\n );\n }\n if (value.schema !== RUNTIME_CONTRACT_META_SCHEMA || value.v !== 1) {\n return null;\n }\n const contractEpoch = normalizeOptionalText(value.contractEpoch);\n const updatedAt = normalizeOptionalText(value.updatedAt);\n if (!(contractEpoch && updatedAt)) {\n return null;\n }\n return {\n schema: RUNTIME_CONTRACT_META_SCHEMA,\n v: 1,\n contractEpoch,\n updatedAt,\n };\n};\n\nconst parseRuntimeContractRepairReport = (\n value: unknown\n): DaemonRuntimeContractRepairReport | null => {\n if (!isRecord(value)) {\n return null;\n }\n if (value.schema !== RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA || value.v !== 1) {\n return null;\n }\n const status = value.status;\n const reason = value.reason;\n const fromEpochRaw = value.fromEpoch;\n const toEpoch = normalizeOptionalText(value.toEpoch);\n const appliedAt = normalizeOptionalText(value.appliedAt);\n const cleanedPathsRaw = value.cleanedPaths;\n const backupPathsRaw = value.backupPaths;\n const errorMessageRaw = value.errorMessage;\n\n if (status !== \"applied\" && status !== \"failed\") {\n return null;\n }\n if (\n reason !== \"legacy_state_without_meta\" &&\n reason !== \"contract_epoch_mismatch\"\n ) {\n return null;\n }\n if (!(toEpoch && appliedAt)) {\n return null;\n }\n if (!(Array.isArray(cleanedPathsRaw) && Array.isArray(backupPathsRaw))) {\n return null;\n }\n\n const cleanedPaths = cleanedPathsRaw\n .map((item) => normalizeOptionalText(item))\n .filter((item): item is string => item !== null);\n const backupPaths = backupPathsRaw\n .map((item) => normalizeOptionalText(item))\n .filter((item): item is string => item !== null);\n\n const fromEpoch =\n fromEpochRaw === null ? null : normalizeOptionalText(fromEpochRaw);\n if (fromEpochRaw !== null && fromEpoch === null) {\n return null;\n }\n\n const errorMessage =\n errorMessageRaw === null ? null : normalizeOptionalText(errorMessageRaw);\n if (errorMessageRaw !== null && errorMessage === null) {\n return null;\n }\n\n return {\n schema: RUNTIME_CONTRACT_REPAIR_REPORT_SCHEMA,\n v: 1,\n status,\n reason,\n fromEpoch,\n toEpoch,\n appliedAt,\n cleanedPaths,\n backupPaths,\n errorMessage,\n };\n};\n\nconst readParsedJsonFile = async <T>(input: {\n parse: (value: unknown) => T | null;\n path: string;\n}): Promise<T | null> => {\n const raw = await readFile(input.path, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return input.parse(parsed);\n};\n\nconst writeJsonAtomic = async (input: {\n path: string;\n value: unknown;\n}): Promise<void> => {\n await mkdir(dirnamePath(input.path), { recursive: true });\n const tempPath = `${input.path}.tmp-${Date.now()}-${process.pid}`;\n await writeFile(\n tempPath,\n `${JSON.stringify(input.value, null, 2)}\\n`,\n \"utf8\"\n );\n await rename(tempPath, input.path).catch(async (error) => {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n });\n};\n\nconst fileExists = async (path: string): Promise<boolean> => {\n try {\n await readFile(path, \"utf8\");\n return true;\n } catch {\n return false;\n }\n};\n\nconst getRuntimeStateFilePaths = (\n runtimePaths: DaemonRuntimePaths\n): string[] => [\n runtimePaths.contextStorePath,\n join(runtimePaths.ledgerRootPath, \"state.json\"),\n join(runtimePaths.ledgerRootPath, \"state.backup.json\"),\n join(runtimePaths.ledgerRootPath, \"state.tmp\"),\n join(runtimePaths.ledgerRootPath, \"history.tmp\"),\n];\n\nconst readMetaEpoch = async (\n contractMetaPath: string\n): Promise<ParsedMeta | null> => {\n const parsed = await readParsedJsonFile({\n path: contractMetaPath,\n parse: parseRuntimeContractMeta,\n });\n if (!parsed) {\n return null;\n }\n return {\n contractEpoch: parsed.contractEpoch,\n updatedAt: parsed.updatedAt,\n };\n};\n\nexport const readDaemonRuntimeContractMeta =\n async (): Promise<DaemonRuntimeContractMeta | null> => {\n const path = daemonRuntimeContractMetaPath();\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return parseRuntimeContractMeta(parsed);\n };\n\nconst isFileNotFoundError = (error: unknown): boolean =>\n Boolean(error && typeof error === \"object\" && \"code\" in error) &&\n (error as { code?: unknown }).code === \"ENOENT\";\n\nconst backupAndCleanRuntimeState = async (\n input: RepairRuntimeStateInput\n): Promise<DaemonRuntimeContractGuardResult> => {\n const cleanedPaths: string[] = [];\n const backupPaths: string[] = [];\n const backupSuffix = `bak.${Date.now()}`;\n\n const writeRepairReport = async (\n report: DaemonRuntimeContractRepairReport\n ) => {\n await writeJsonAtomic({\n path: input.runtimePaths.contractRepairReportPath,\n value: report,\n });\n };\n\n try {\n for (const statePath of input.stateFilePaths) {\n const backupPath = `${statePath}.${backupSuffix}`;\n await copyFile(statePath, backupPath);\n backupPaths.push(backupPath);\n await rm(statePath, { force: true });\n cleanedPaths.push(statePath);\n }\n\n const nextMeta = createRuntimeContractMeta({\n contractEpoch: input.contractEpoch,\n nowIso: input.nowIso,\n });\n await writeJsonAtomic({\n path: input.runtimePaths.contractMetaPath,\n value: nextMeta,\n });\n\n const report = createRuntimeContractRepairReport({\n appliedAt: input.nowIso,\n backupPaths,\n cleanedPaths,\n errorMessage: null,\n fromEpoch: input.fromEpoch,\n reason: input.reason,\n status: \"applied\",\n toEpoch: input.contractEpoch,\n });\n await writeRepairReport(report);\n\n return {\n action: \"repair_applied\",\n reason: input.reason,\n meta: nextMeta,\n report,\n };\n } catch (error) {\n const failedReport = createRuntimeContractRepairReport({\n appliedAt: input.nowIso,\n backupPaths,\n cleanedPaths,\n errorMessage: toErrorMessage(error),\n fromEpoch: input.fromEpoch,\n reason: input.reason,\n status: \"failed\",\n toEpoch: input.contractEpoch,\n });\n await writeRepairReport(failedReport).catch(() => undefined);\n throw new DaemonServiceRunError({\n code: \"daemon.runtime_state_repair_failed\",\n message: formatOpenMeldCliTextBlock(\n \"OpenMeld could not fix local runtime data automatically.\\n\" +\n \"Please restart the service:\\n\" +\n \"1) `openmeld service stop --force`\\n\" +\n \"2) `openmeld service start`\\n\\n\" +\n \"If this still fails, repair the service:\\n\" +\n \"1) `openmeld service repair`\\n\" +\n \"2) `openmeld service start`\"\n ),\n });\n }\n};\n\nexport const ensureDaemonRuntimeContractState = async (\n input: GuardInput\n): Promise<DaemonRuntimeContractGuardResult> => {\n const contractEpoch =\n normalizeOptionalText(input.contractEpoch) ?? DAEMON_LOCAL_STATE_EPOCH;\n const nowIso =\n normalizeOptionalText(input.nowIso) ?? new Date().toISOString();\n\n const stateFilePaths = getRuntimeStateFilePaths(input.runtimePaths);\n const existingStatePaths: string[] = [];\n for (const statePath of stateFilePaths) {\n if (await fileExists(statePath)) {\n existingStatePaths.push(statePath);\n }\n }\n\n const meta = await readMetaEpoch(input.runtimePaths.contractMetaPath);\n if (!meta) {\n if (existingStatePaths.length === 0) {\n const nextMeta = createRuntimeContractMeta({\n contractEpoch,\n nowIso,\n });\n await writeJsonAtomic({\n path: input.runtimePaths.contractMetaPath,\n value: nextMeta,\n });\n return {\n action: \"fresh_init\",\n meta: nextMeta,\n };\n }\n return await backupAndCleanRuntimeState({\n contractEpoch,\n fromEpoch: null,\n nowIso,\n reason: \"legacy_state_without_meta\",\n runtimePaths: input.runtimePaths,\n stateFilePaths: existingStatePaths,\n });\n }\n\n if (meta.contractEpoch !== contractEpoch) {\n return await backupAndCleanRuntimeState({\n contractEpoch,\n fromEpoch: meta.contractEpoch,\n nowIso,\n reason: \"contract_epoch_mismatch\",\n runtimePaths: input.runtimePaths,\n stateFilePaths: existingStatePaths,\n });\n }\n\n return {\n action: \"none\",\n meta: createRuntimeContractMeta({\n contractEpoch: meta.contractEpoch,\n nowIso: meta.updatedAt,\n }),\n };\n};\n\nexport const daemonRuntimeContractRepairReportPath = (): string =>\n join(\n daemonRuntimeRootPath(),\n \"data\",\n DAEMON_RUNTIME_CONTRACT_REPAIR_REPORT_FILE\n );\n\nexport const daemonRuntimeContractMetaPath = (): string =>\n join(daemonRuntimeRootPath(), \"data\", DAEMON_RUNTIME_CONTRACT_META_FILE);\n\nexport const readDaemonRuntimeContractRepairReport =\n async (): Promise<DaemonRuntimeContractRepairReport | null> => {\n return await readParsedJsonFile({\n path: daemonRuntimeContractRepairReportPath(),\n parse: parseRuntimeContractRepairReport,\n });\n };\n","import type { StartDeviceProjection } from \"@openmeld/schemas/types\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport { toErrorMessage } from \"../core/logger\";\nimport type { DaemonRuntimeContractMeta } from \"../core/types\";\nimport { DAEMON_LOCAL_STATE_EPOCH } from \"../state/local-state-version\";\nimport { readDaemonRuntimeContractMeta } from \"../state/runtime-contract-guard\";\n\nexport type DaemonRuntimeContractCompatibilityStatus =\n | \"compatible\"\n | \"missing\"\n | \"mismatch\"\n | \"unavailable\"\n | \"not_observed\";\n\nexport type DaemonRuntimeContractCompatibilityReasonCode =\n | \"daemon.runtime_contract.compatible\"\n | \"daemon.runtime_contract.missing\"\n | \"daemon.runtime_contract.mismatch\"\n | \"daemon.runtime_contract.unavailable\"\n | \"daemon.runtime_contract.not_observed\";\n\nexport type DaemonRuntimeContractCompatibility = {\n errorMessage?: string;\n expectedEpoch: string;\n observedEpoch: string | null;\n reasonCode: DaemonRuntimeContractCompatibilityReasonCode;\n status: DaemonRuntimeContractCompatibilityStatus;\n updatedAt: string | null;\n};\n\nexport type StartBackgroundHelperExecutionCompatibility = NonNullable<\n StartDeviceProjection[\"backgroundHelper\"][\"executionCompatibility\"]\n>;\n\ntype RuntimeStatusInput =\n | DaemonServiceRuntimeStatus[\"status\"]\n | Pick<DaemonServiceRuntimeStatus, \"status\">;\n\nexport async function resolveDaemonRuntimeContractCompatibility(input: {\n expectedEpoch?: string;\n readMeta?: () => Promise<DaemonRuntimeContractMeta | null>;\n runtimeStatus: RuntimeStatusInput;\n}): Promise<DaemonRuntimeContractCompatibility> {\n const expectedEpoch = input.expectedEpoch ?? DAEMON_LOCAL_STATE_EPOCH;\n const runtimeStatus =\n typeof input.runtimeStatus === \"string\"\n ? input.runtimeStatus\n : input.runtimeStatus.status;\n\n if (runtimeStatus !== \"running\" && runtimeStatus !== \"stale\") {\n return {\n status: \"not_observed\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.not_observed\",\n };\n }\n\n const readMeta = input.readMeta ?? readDaemonRuntimeContractMeta;\n let meta: DaemonRuntimeContractMeta | null;\n try {\n meta = await readMeta();\n } catch (error) {\n return {\n status: \"unavailable\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.unavailable\",\n errorMessage: toErrorMessage(error),\n };\n }\n\n if (!meta) {\n return {\n status: \"missing\",\n expectedEpoch,\n observedEpoch: null,\n updatedAt: null,\n reasonCode: \"daemon.runtime_contract.missing\",\n };\n }\n\n if (meta.contractEpoch !== expectedEpoch) {\n return {\n status: \"mismatch\",\n expectedEpoch,\n observedEpoch: meta.contractEpoch,\n updatedAt: meta.updatedAt,\n reasonCode: \"daemon.runtime_contract.mismatch\",\n };\n }\n\n return {\n status: \"compatible\",\n expectedEpoch,\n observedEpoch: meta.contractEpoch,\n updatedAt: meta.updatedAt,\n reasonCode: \"daemon.runtime_contract.compatible\",\n };\n}\n\nexport function toStartBackgroundHelperExecutionCompatibility(\n input: DaemonRuntimeContractCompatibility\n): StartBackgroundHelperExecutionCompatibility {\n return {\n status: input.status === \"mismatch\" ? \"update_required\" : \"compatible\",\n reasonCode: input.reasonCode,\n expectedEpoch: input.expectedEpoch,\n observedEpoch: input.observedEpoch,\n updatedAt: input.updatedAt,\n };\n}\n","import process from \"node:process\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport {\n type DaemonOwnedProcess,\n listDaemonOwnedProcesses,\n} from \"./daemon-service-process-inventory\";\nimport type {\n CurrentDaemonRuntimeContext,\n readCurrentDaemonRuntimeContext,\n} from \"./daemon-service-runtime\";\nimport { readCurrentDaemonRuntimeContext as readCurrentDaemonRuntimeContextImpl } from \"./daemon-service-runtime\";\n\nexport type DaemonLifecycleOwnerKind =\n | \"cli_direct\"\n | \"legacy_detached\"\n | \"system_service\";\n\nexport type DaemonOwnerSetSummary =\n | \"multiple_owners\"\n | \"no_owner\"\n | \"single_owner\";\n\nexport type DaemonStoppedContractWriteBlockedReason =\n | \"owned_processes_still_active\"\n | \"service_manager_still_enabled\"\n | \"service_manager_still_running\"\n | \"daemon_owners_still_active\";\n\nexport type DaemonOwnerSnapshot = {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: CurrentDaemonRuntimeContext[\"serviceManager\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n systemServiceRegistrationPresent: boolean;\n activeOwnerKinds: DaemonLifecycleOwnerKind[];\n ownerSetSummary: DaemonOwnerSetSummary;\n mustStopManagerFirst: boolean;\n};\n\nexport type DaemonStopStrategy =\n | {\n kind: \"manager_first\";\n requiresResidualProcessCleanup: true;\n reason: string;\n }\n | {\n kind: \"not_running\";\n requiresResidualProcessCleanup: false;\n reason: string;\n }\n | {\n kind: \"process_then_manager_cleanup\";\n requiresResidualProcessCleanup: true;\n reason: string;\n }\n | {\n kind: \"process_only\";\n requiresResidualProcessCleanup: true;\n reason: string;\n };\n\nexport async function readCurrentDaemonOwnerSnapshot(\n input: {\n ignoreProcessIds?: Iterable<number>;\n listOwnedProcesses?: typeof listDaemonOwnedProcesses;\n readRuntimeContext?: typeof readCurrentDaemonRuntimeContext;\n } = {}\n): Promise<DaemonOwnerSnapshot> {\n const listOwnedProcesses =\n input.listOwnedProcesses ?? listDaemonOwnedProcesses;\n const readRuntimeContext =\n input.readRuntimeContext ?? readCurrentDaemonRuntimeContextImpl;\n const ignoredProcessIds = [\n process.pid,\n process.ppid,\n ...Array.from(input.ignoreProcessIds ?? []),\n ].filter((pid): pid is number => Number.isInteger(pid) && pid > 0);\n\n const [context, ownedProcesses] = await Promise.all([\n readRuntimeContext(),\n listOwnedProcesses({\n ignoreProcessIds: ignoredProcessIds,\n }),\n ]);\n\n return buildDaemonOwnerSnapshot({\n context,\n ownedProcesses,\n });\n}\n\nexport function buildDaemonOwnerSnapshot(input: {\n context: CurrentDaemonRuntimeContext;\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonOwnerSnapshot {\n return buildDaemonOwnerSnapshotFromObservedState({\n runtimeStatus: input.context.runtimeStatus,\n serviceManager: input.context.serviceManager,\n serviceManagerStatus: input.context.serviceManagerStatus,\n effectiveRuntimeStatus: input.context.effectiveRuntimeStatus,\n ownedProcesses: input.ownedProcesses,\n });\n}\n\nexport function buildDaemonOwnerSnapshotFromObservedState(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: CurrentDaemonRuntimeContext[\"serviceManager\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonOwnerSnapshot {\n const activeOwnerKinds = resolveActiveOwnerKinds({\n runtimeStatus: input.runtimeStatus,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n serviceManagerStatus: input.serviceManagerStatus,\n ownedProcesses: input.ownedProcesses,\n });\n\n return {\n runtimeStatus: input.runtimeStatus,\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n ownedProcesses: input.ownedProcesses,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n systemServiceRegistrationPresent:\n input.runtimeStatus.managedBySystemService ||\n input.serviceManagerStatus?.installed === true ||\n input.serviceManagerStatus?.running === true,\n activeOwnerKinds,\n ownerSetSummary: resolveOwnerSetSummary(activeOwnerKinds),\n mustStopManagerFirst:\n input.runtimeStatus.managedBySystemService ||\n input.serviceManagerStatus?.installed === true ||\n input.serviceManagerStatus?.running === true,\n };\n}\n\nexport function resolveDaemonStopStrategy(\n snapshot: DaemonOwnerSnapshot\n): DaemonStopStrategy {\n const hasOwnedProcesses = snapshot.ownedProcesses.length > 0;\n if (\n snapshot.effectiveRuntimeStatus !== \"running\" &&\n !hasOwnedProcesses &&\n snapshot.serviceManagerStatus?.running !== true\n ) {\n return {\n kind: \"not_running\",\n requiresResidualProcessCleanup: false,\n reason: \"no active local service owner is currently running\",\n };\n }\n\n if (snapshot.activeOwnerKinds.includes(\"system_service\")) {\n return {\n kind: \"manager_first\",\n requiresResidualProcessCleanup: true,\n reason:\n \"a system-managed local service owner is active on this device, so stop must go through the OS service manager first\",\n };\n }\n\n if (snapshot.systemServiceRegistrationPresent) {\n return {\n kind: \"process_then_manager_cleanup\",\n requiresResidualProcessCleanup: true,\n reason:\n \"a direct local service owner is active and system service registration is still present, so stop must drain the process and then clear the service manager registration\",\n };\n }\n\n return {\n kind: \"process_only\",\n requiresResidualProcessCleanup: true,\n reason: \"only direct local service processes are active on this device\",\n };\n}\n\nexport function hasActiveDaemonOwners(snapshot: DaemonOwnerSnapshot): boolean {\n return (\n snapshot.activeOwnerKinds.length > 0 ||\n snapshot.ownedProcesses.length > 0 ||\n snapshot.serviceManagerStatus?.running === true\n );\n}\n\nexport function resolveStoppedContractWriteBlockedReason(\n snapshot: DaemonOwnerSnapshot\n): DaemonStoppedContractWriteBlockedReason | null {\n if (snapshot.ownedProcesses.length > 0) {\n return \"owned_processes_still_active\";\n }\n if (snapshot.serviceManagerStatus?.running === true) {\n return \"service_manager_still_running\";\n }\n if (snapshot.serviceManagerStatus?.enabled === true) {\n return \"service_manager_still_enabled\";\n }\n if (hasActiveDaemonOwners(snapshot)) {\n return \"daemon_owners_still_active\";\n }\n return null;\n}\n\nexport function summarizeDaemonOwnerSnapshot(\n snapshot: DaemonOwnerSnapshot\n): Record<string, unknown> {\n return {\n activeOwnerKinds: snapshot.activeOwnerKinds,\n effectiveRuntimeStatus: snapshot.effectiveRuntimeStatus,\n mustStopManagerFirst: snapshot.mustStopManagerFirst,\n ownedProcessCount: snapshot.ownedProcesses.length,\n ownedProcesses: snapshot.ownedProcesses.map((processInfo) => ({\n mode: processInfo.mode,\n ownership: processInfo.ownership,\n pid: processInfo.pid,\n })),\n ownerSetSummary: snapshot.ownerSetSummary,\n runtimeStatus: snapshot.runtimeStatus.status,\n serviceManagerController: snapshot.serviceManager?.controller ?? null,\n serviceManagerStatus: snapshot.serviceManagerStatus\n ? {\n enabled: snapshot.serviceManagerStatus.enabled,\n installed: snapshot.serviceManagerStatus.installed,\n running: snapshot.serviceManagerStatus.running,\n }\n : null,\n systemServiceRegistrationPresent: snapshot.systemServiceRegistrationPresent,\n };\n}\n\nexport function formatDaemonOwnerSummaryLabel(\n snapshot: DaemonOwnerSnapshot\n): string {\n if (snapshot.ownerSetSummary === \"no_owner\") {\n return \"No active owner\";\n }\n\n const ownerLabel = formatDaemonOwnerKinds(snapshot.activeOwnerKinds);\n if (snapshot.ownerSetSummary === \"single_owner\") {\n return ownerLabel;\n }\n\n return `⚠️ Multiple owners — ${ownerLabel}`;\n}\n\nexport function formatDaemonOwnerKinds(\n ownerKinds: readonly DaemonLifecycleOwnerKind[]\n): string {\n return ownerKinds.map(formatDaemonOwnerKindLabel).join(\" + \");\n}\n\nfunction resolveActiveOwnerKinds(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n serviceManagerStatus: CurrentDaemonRuntimeContext[\"serviceManagerStatus\"];\n ownedProcesses: DaemonOwnedProcess[];\n}): DaemonLifecycleOwnerKind[] {\n const owners = new Set<DaemonLifecycleOwnerKind>();\n const verifiedDirectRuntimePid =\n input.runtimeStatus.status === \"running\" &&\n !input.runtimeStatus.managedBySystemService &&\n input.runtimeStatus.serviceController === \"unknown\"\n ? input.runtimeStatus.pid\n : null;\n const verifiedSystemRuntimePid =\n input.runtimeStatus.status === \"running\" &&\n input.runtimeStatus.managedBySystemService\n ? input.runtimeStatus.pid\n : null;\n\n if (\n input.serviceManagerStatus?.running === true ||\n input.ownedProcesses.some(\n (processInfo) =>\n processInfo.ownership === \"stable_launcher\" &&\n processInfo.pid !== verifiedDirectRuntimePid\n ) ||\n (input.runtimeStatus.managedBySystemService &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"system_service\");\n }\n\n if (\n input.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"legacy_detached\"\n ) ||\n (input.runtimeStatus.serviceController === \"legacy-detached\" &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"legacy_detached\");\n }\n\n if (\n input.ownedProcesses.some(\n (processInfo) =>\n processInfo.pid !== verifiedSystemRuntimePid &&\n (processInfo.ownership === \"cli_direct\" ||\n processInfo.ownership === \"unknown\")\n ) ||\n (!input.runtimeStatus.managedBySystemService &&\n input.runtimeStatus.serviceController !== \"legacy-detached\" &&\n input.effectiveRuntimeStatus === \"running\")\n ) {\n owners.add(\"cli_direct\");\n }\n\n return Array.from(owners).sort();\n}\n\nfunction resolveOwnerSetSummary(\n activeOwnerKinds: DaemonLifecycleOwnerKind[]\n): DaemonOwnerSetSummary {\n if (activeOwnerKinds.length === 0) {\n return \"no_owner\";\n }\n if (activeOwnerKinds.length === 1) {\n return \"single_owner\";\n }\n return \"multiple_owners\";\n}\n\nfunction formatDaemonOwnerKindLabel(\n ownerKind: DaemonLifecycleOwnerKind\n): string {\n switch (ownerKind) {\n case \"cli_direct\":\n return \"Direct CLI\";\n case \"legacy_detached\":\n return \"Legacy detached runtime\";\n case \"system_service\":\n return \"System service\";\n default:\n return ownerKind;\n }\n}\n","import { stat } from \"node:fs/promises\";\nimport process from \"node:process\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport type {\n DaemonLifecycleIntent,\n DaemonRunMode,\n DaemonServiceController,\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../../config/daemon-state\";\nimport {\n getDaemonStatus,\n readDaemonServiceLifecycleLockMetaWithCleanup,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldLockMeta } from \"../../config/lock\";\nimport { OPENMELD_HOME_ENV_KEY } from \"../../config/paths\";\nimport {\n type DaemonRuntimeContractCompatibility,\n resolveDaemonRuntimeContractCompatibility,\n} from \"./daemon-runtime-contract-compatibility\";\nimport { resolveDaemonServiceArtifact } from \"./daemon-service-artifact\";\nimport {\n readDaemonActiveBundleState,\n resolveDaemonBundleEntryPathFromState,\n resolveInstalledDaemonBundleFingerprint,\n} from \"./daemon-service-bundle\";\nimport { normalizeDaemonCommandPath } from \"./daemon-service-command-path\";\nimport {\n inspectLegacySharedDaemonService,\n type LegacySharedDaemonServiceInspection,\n} from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n readDaemonServiceStartupPolicyCurrent,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { matchesExpectedDaemonServiceManagerDefinition } from \"./daemon-service-manager-command-match\";\nimport {\n buildDaemonOwnerSnapshotFromObservedState,\n formatDaemonOwnerKinds,\n} from \"./daemon-service-owner-snapshot\";\nimport {\n type DaemonOwnedProcess,\n listDaemonOwnedProcesses,\n} from \"./daemon-service-process-inventory\";\nimport { getEffectiveDaemonRuntimeStatus } from \"./daemon-service-runtime\";\nimport {\n resolveObservedDaemonRuntimeStatus,\n resolveObservedRuntimeCommandEntryPath,\n} from \"./daemon-service-runtime-observer\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nexport type DaemonServiceAnomalyCode =\n | \"not_installed\"\n | \"legacy_shared_service_present\"\n | \"version_outdated\"\n | \"downgrade_blocked\"\n | \"runtime_stale\"\n | \"runtime_contract_missing\"\n | \"runtime_contract_mismatch\"\n | \"runtime_contract_unavailable\"\n | \"manager_running_without_runtime\"\n | \"multiple_active_owners\"\n | \"legacy_detached_runtime\"\n | \"runtime_bundle_mismatch\"\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 | \"service_manager_path_drift\"\n | \"service_manager_environment_drift\"\n | \"service_manager_startup_policy_drift\"\n | \"duplicate_owned_processes\"\n | \"foreground_background_conflict\"\n | \"background_foreground_conflict\"\n | \"lifecycle_locked\";\n\nexport type DaemonServiceAnomaly = {\n code: DaemonServiceAnomalyCode;\n message: string;\n};\n\nexport type DaemonServiceInventory = {\n expectedVersion: string;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract?: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n runtimeLease?: Awaited<ReturnType<typeof readDaemonRuntimeLease>>;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility?: DaemonRuntimeContractCompatibility;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n ownedProcesses: DaemonOwnedProcess[];\n lifecycleLock: OpenMeldLockMeta | null;\n anomalies: DaemonServiceAnomaly[];\n};\n\nexport async function inspectDaemonServiceInventory(input: {\n expectedVersion: string;\n intendedMode?: DaemonRunMode;\n intent?: DaemonLifecycleIntent;\n readDaemonStatus?: typeof getDaemonStatus;\n resolveServiceManager?: typeof resolveDaemonServiceManager;\n listOwnedProcesses?: typeof listDaemonOwnedProcesses;\n}): Promise<DaemonServiceInventory> {\n // OPENMELD_SERVICE_THIN_CORE: lifecycle/diagnostic inventory.\n // This describes the local service installation and process state. It may\n // guide repair, but must not decide final Agent readiness or Wake outcome.\n const readDaemonStatus = input.readDaemonStatus ?? getDaemonStatus;\n const resolveServiceManager =\n input.resolveServiceManager ?? resolveDaemonServiceManager;\n const listOwnedProcesses =\n input.listOwnedProcesses ?? listDaemonOwnedProcesses;\n const ignoredInventoryProcessIds = [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n );\n\n const [\n installStatus,\n initialRuntimeLease,\n serviceContract,\n legacySharedService,\n activeBundle,\n lifecycleLock,\n ownedProcesses,\n ] = await Promise.all([\n readDaemonStatus(),\n readDaemonRuntimeLease().catch(() => null),\n readDaemonServiceContract().catch(() => null),\n inspectLegacySharedDaemonService(),\n readDaemonActiveBundleState(),\n readDaemonServiceLifecycleLockMetaWithCleanup(),\n listOwnedProcesses({\n ignoreProcessIds: ignoredInventoryProcessIds,\n }),\n ]);\n const activeBundleSourceAvailable =\n await resolveActiveBundleSourceAvailability(activeBundle);\n const initialRuntimeStatus = resolveObservedDaemonRuntimeStatus({\n runtimeLease: initialRuntimeLease,\n ownedProcesses,\n });\n const activeBundleEntryPath = await resolveDaemonBundleEntryPathFromState(\n activeBundle\n ).catch(() => null);\n const installedBundleFingerprint = activeBundleEntryPath\n ? await resolveInstalledDaemonBundleFingerprint(activeBundle)\n : null;\n const resolvedArtifact = resolveDaemonServiceArtifact({\n expectedVersion: input.expectedVersion,\n installStatus,\n serviceContract,\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n installedBundleFingerprint,\n });\n const mergedOwnedProcesses = mergeOwnedProcesses(\n ownedProcesses,\n legacySharedService?.present ? legacySharedService.ownedProcesses : []\n );\n\n const shouldReadServiceManager =\n installStatus.installed ||\n initialRuntimeStatus.managedBySystemService ||\n initialRuntimeStatus.serviceController !== \"unknown\" ||\n isKnownServiceController(serviceContract?.serviceController);\n const observedServiceManager = shouldReadServiceManager\n ? await resolveServiceManager(\n resolvePreferredServiceManagerController({\n runtimeStatus: initialRuntimeStatus,\n serviceContract,\n }) ?? undefined\n )\n : null;\n const observedServiceManagerStatus = observedServiceManager\n ? await observedServiceManager.status().catch(() => null)\n : null;\n const serviceManagerDefinitionMatchesCurrentRoot =\n observedServiceManager &&\n observedServiceManagerStatus?.installed &&\n observedServiceManagerStatus.definitionPath\n ? await matchesExpectedDaemonServiceManagerDefinition({\n controller: observedServiceManager.controller,\n definitionPath: observedServiceManagerStatus.definitionPath,\n commandSpec: observedServiceManagerStatus.commandSpec,\n }).catch(() => false)\n : null;\n // Process enumeration, bundle hashing and OS task queries can outlast a\n // Service startup on Windows. The initial lease selects the controller;\n // only a lease read after those queries may classify the observed runtime.\n const runtimeLease = await readDaemonRuntimeLease().catch(() => null);\n const runtimeStatus = resolveObservedDaemonRuntimeStatus({\n runtimeLease,\n ownedProcesses,\n });\n const runtimeContractCompatibility =\n await resolveDaemonRuntimeContractCompatibility({ runtimeStatus });\n const runtimeCommandEntryPath = resolveObservedRuntimeCommandEntryPath({\n ownedProcesses,\n runtimeStatus,\n });\n const runtimeCommandPathExists = runtimeCommandEntryPath\n ? await pathExists(runtimeCommandEntryPath).catch(() => null)\n : null;\n const scopedServiceManager = scopeServiceManagerToCurrentRoot({\n runtimeStatus,\n serviceManager: observedServiceManager,\n serviceManagerStatus: observedServiceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot,\n });\n\n const anomalies = buildDaemonServiceAnomalies({\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n activeBundleSourceEntryPath: activeBundle?.sourceEntryScriptPath ?? null,\n runtimeCommandEntryPath,\n runtimeCommandPathExists,\n runtimeContractCompatibility,\n resolvedArtifact,\n expectedVersion: input.expectedVersion,\n installStatus,\n intendedMode: input.intendedMode,\n legacySharedService,\n lifecycleLock,\n ownedProcesses: mergedOwnedProcesses,\n runtimeStatus,\n effectiveRuntimeStatus: getEffectiveDaemonRuntimeStatus({\n runtimeState: runtimeStatus,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n }),\n serviceContract,\n serviceManager: scopedServiceManager.serviceManager,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n scopedServiceManager.serviceManagerDefinitionMatchesCurrentRoot,\n });\n\n if (\n installStatus.installed &&\n (await readDaemonServiceStartupPolicyCurrent({\n controller: scopedServiceManager.serviceManager?.controller ?? null,\n status: scopedServiceManager.serviceManagerStatus,\n })) === false\n ) {\n anomalies.push({\n code: \"service_manager_startup_policy_drift\",\n message:\n \"The installed macOS Service still uses an outdated scheduling policy.\",\n });\n }\n\n return {\n expectedVersion: input.expectedVersion,\n installStatus,\n runtimeStatus,\n ...(serviceContract ? { serviceContract } : {}),\n ...(runtimeLease ? { runtimeLease } : {}),\n legacySharedService,\n activeBundle,\n activeBundleSourceAvailable,\n activeBundleEntryPath,\n runtimeCommandEntryPath,\n runtimeCommandPathExists,\n runtimeContractCompatibility,\n serviceManager: scopedServiceManager.serviceManager,\n serviceManagerStatus: scopedServiceManager.serviceManagerStatus,\n ownedProcesses: mergedOwnedProcesses,\n lifecycleLock,\n anomalies,\n };\n}\n\nasync function resolveActiveBundleSourceAvailability(\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>\n): Promise<boolean | null> {\n if (activeBundle?.bundleFormat !== \"legacy_linked_v1\") {\n return null;\n }\n return await pathExists(activeBundle.sourcePackageRootPath).catch(() => null);\n}\n\nfunction scopeServiceManagerToCurrentRoot(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n}): {\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n} {\n if (!hasExplicitOpenMeldHomeOverride()) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (\n input.runtimeStatus.managedBySystemService ||\n input.runtimeStatus.serviceController !== \"unknown\"\n ) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (!input.serviceManagerStatus?.installed) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n if (input.serviceManagerDefinitionMatchesCurrentRoot === true) {\n return {\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n serviceManagerDefinitionMatchesCurrentRoot:\n input.serviceManagerDefinitionMatchesCurrentRoot,\n };\n }\n\n return {\n serviceManager: null,\n serviceManagerStatus: null,\n serviceManagerDefinitionMatchesCurrentRoot: null,\n };\n}\n\nfunction hasExplicitOpenMeldHomeOverride(\n env: NodeJS.ProcessEnv = process.env\n): boolean {\n return String(env[OPENMELD_HOME_ENV_KEY] ?? \"\").trim().length > 0;\n}\n\nfunction buildDaemonServiceAnomalies(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n activeBundleSourceAvailable: boolean | null;\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility: DaemonRuntimeContractCompatibility;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n lifecycleLock: OpenMeldLockMeta | null;\n intendedMode?: DaemonRunMode;\n}): DaemonServiceAnomaly[] {\n if (!input.installStatus.installed) {\n if (input.legacySharedService?.present) {\n return [\n {\n code: \"legacy_shared_service_present\",\n message:\n \"A legacy shared OpenMeld Service from the pre-lane release is still installed and must be migrated to this lane.\",\n },\n ];\n }\n return [\n {\n code: \"not_installed\",\n message: \"OpenMeld Service is not installed on this device.\",\n },\n ];\n }\n\n const anomalies: DaemonServiceAnomaly[] = [];\n if (input.legacySharedService?.present) {\n anomalies.push({\n code: \"legacy_shared_service_present\",\n message:\n \"A legacy shared OpenMeld Service from the pre-lane release is still installed and should be cleaned up during this lane migration.\",\n });\n }\n const versionAnomaly = resolveVersionAnomaly({\n expectedVersion: input.expectedVersion,\n installStatus: input.installStatus,\n serviceContract: input.serviceContract,\n });\n if (versionAnomaly) {\n anomalies.push(versionAnomaly);\n }\n const runtimeAnomalies = buildRuntimeHealthAnomalies(input);\n const bundleAnomalies = buildBundleAnomalies({\n expectedVersion: input.expectedVersion,\n serviceContract: input.serviceContract,\n activeBundle: input.activeBundle,\n resolvedArtifact: input.resolvedArtifact,\n });\n const processAnomalies = buildProcessAnomalies(input);\n anomalies.push(...runtimeAnomalies, ...bundleAnomalies, ...processAnomalies);\n\n if (input.lifecycleLock && input.lifecycleLock.pid !== process.pid) {\n anomalies.push({\n code: \"lifecycle_locked\",\n message: buildLifecycleLockedMessage(input.lifecycleLock),\n });\n }\n\n return anomalies;\n}\n\nfunction resolveVersionAnomaly(input: {\n expectedVersion: string;\n installStatus: DaemonStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n}): DaemonServiceAnomaly | null {\n const observedVersion =\n input.serviceContract?.daemonVersion ??\n input.installStatus.state?.daemonVersion ??\n null;\n if (!observedVersion) {\n return null;\n }\n const versionDirection = resolveVersionChangeDirection({\n fromVersion: observedVersion,\n toVersion: input.expectedVersion,\n });\n if (versionDirection === \"upgrade\") {\n return {\n code: \"version_outdated\",\n message: `Configured OpenMeld Service version is v${observedVersion}, expected v${input.expectedVersion}.`,\n };\n }\n if (versionDirection === \"downgrade\") {\n return {\n code: \"downgrade_blocked\",\n message: `Configured OpenMeld Service version v${observedVersion} is newer than current CLI v${input.expectedVersion}.`,\n };\n }\n return null;\n}\n\nfunction buildRuntimeHealthAnomalies(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n runtimeContractCompatibility: DaemonRuntimeContractCompatibility;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n serviceManagerDefinitionMatchesCurrentRoot: boolean | null;\n ownedProcesses: DaemonOwnedProcess[];\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n}): DaemonServiceAnomaly[] {\n const anomalies: DaemonServiceAnomaly[] = [];\n const ownerSnapshot = buildDaemonOwnerSnapshotFromObservedState({\n runtimeStatus: input.runtimeStatus,\n serviceManager: input.serviceManager,\n serviceManagerStatus: input.serviceManagerStatus,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n ownedProcesses: input.ownedProcesses,\n });\n\n if (input.runtimeStatus.status === \"stale\") {\n anomalies.push({\n code: \"runtime_stale\",\n message: `Runtime state is stale (${input.runtimeStatus.reason ?? \"unknown\"}).`,\n });\n }\n if (\n input.serviceManagerStatus?.running &&\n input.runtimeStatus.status !== \"running\"\n ) {\n anomalies.push({\n code: \"manager_running_without_runtime\",\n message:\n \"The OS service manager reports OpenMeld Service as running, but runtime state is not healthy.\",\n });\n }\n if (ownerSnapshot.ownerSetSummary === \"multiple_owners\") {\n anomalies.push({\n code: \"multiple_active_owners\",\n message: `Multiple OpenMeld Service owners are active on this device: ${formatDaemonOwnerKinds(ownerSnapshot.activeOwnerKinds)}.`,\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.runtimeStatus.serviceController === \"legacy-detached\"\n ) {\n anomalies.push({\n code: \"legacy_detached_runtime\",\n message:\n \"OpenMeld Service is still using the legacy detached runtime instead of the managed system service path.\",\n });\n }\n if (\n input.serviceManagerStatus?.installed &&\n input.serviceManagerDefinitionMatchesCurrentRoot === false\n ) {\n anomalies.push({\n code: \"service_manager_path_drift\",\n message:\n \"The OS service manager is still pointing at an old CLI path instead of the OpenMeld-managed stable launcher.\",\n });\n }\n if (\n (input.runtimeStatus.status === \"running\" ||\n input.runtimeStatus.status === \"stale\") &&\n // An exited process has no live command to compare. Its stale lease is\n // restart evidence, not evidence that service files or registration broke.\n (input.runtimeStatus.reason !== \"process_not_alive\" ||\n input.ownedProcesses.some(\n (processInfo) => processInfo.pid === input.runtimeStatus.pid\n )) &&\n hasRuntimeBundleMismatch({\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceEntryPath: input.activeBundleSourceEntryPath,\n runtimeCommandEntryPath: input.runtimeCommandEntryPath,\n runtimeCommandPathExists: input.runtimeCommandPathExists,\n })\n ) {\n anomalies.push({\n code: \"runtime_bundle_mismatch\",\n message: buildRuntimeBundleMismatchMessage({\n activeBundleEntryPath: input.activeBundleEntryPath,\n activeBundleSourceEntryPath: input.activeBundleSourceEntryPath,\n runtimeCommandEntryPath: input.runtimeCommandEntryPath,\n runtimeCommandPathExists: input.runtimeCommandPathExists,\n }),\n });\n }\n const runtimeContractAnomaly = buildRuntimeContractCompatibilityAnomaly(\n input.runtimeContractCompatibility\n );\n if (runtimeContractAnomaly) {\n anomalies.push(runtimeContractAnomaly);\n }\n return anomalies;\n}\n\nfunction buildRuntimeContractCompatibilityAnomaly(\n compatibility: DaemonRuntimeContractCompatibility\n): DaemonServiceAnomaly | null {\n switch (compatibility.status) {\n case \"missing\":\n return {\n code: \"runtime_contract_missing\",\n message:\n \"OpenMeld Service runtime contract metadata is missing for the active daemon.\",\n };\n case \"mismatch\":\n return {\n code: \"runtime_contract_mismatch\",\n message: `OpenMeld Service runtime contract epoch is ${compatibility.observedEpoch ?? \"unknown\"}, but the current CLI expects ${compatibility.expectedEpoch}.`,\n };\n case \"unavailable\":\n return {\n code: \"runtime_contract_unavailable\",\n message: `OpenMeld Service runtime contract metadata could not be read: ${compatibility.errorMessage ?? \"unknown error\"}.`,\n };\n case \"compatible\":\n case \"not_observed\":\n return null;\n default:\n return null;\n }\n}\n\nfunction buildBundleAnomalies(input: {\n expectedVersion: string;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n}): DaemonServiceAnomaly[] {\n return input.resolvedArtifact.driftReasonCodes\n .map((reasonCode) => buildBundleAnomaly({ ...input, reasonCode }))\n .filter((anomaly): anomaly is DaemonServiceAnomaly => anomaly !== null);\n}\n\nfunction buildBundleAnomaly(input: {\n expectedVersion: string;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>;\n resolvedArtifact: ReturnType<typeof resolveDaemonServiceArtifact>;\n reasonCode: ReturnType<\n typeof resolveDaemonServiceArtifact\n >[\"driftReasonCodes\"][number];\n}): DaemonServiceAnomaly | null {\n switch (input.reasonCode) {\n case \"bundle_missing\":\n return {\n code: \"bundle_missing\",\n message: \"OpenMeld Service files are missing.\",\n };\n case \"bundle_version_drift\": {\n const installVersion =\n input.serviceContract?.daemonVersion ??\n input.resolvedArtifact.installVersion ??\n input.expectedVersion;\n const activeVersion =\n input.resolvedArtifact.activeBundleVersion ?? \"unknown\";\n return {\n code: \"bundle_version_drift\",\n message: `OpenMeld Service is running local service files for v${activeVersion}, but this lane expects v${installVersion}.`,\n };\n }\n case \"bundle_id_drift\": {\n const expectedBundleId = input.serviceContract?.bundleId ?? \"unknown\";\n const activeBundleId = input.activeBundle?.bundleId ?? \"unknown\";\n return {\n code: \"bundle_id_drift\",\n message: `OpenMeld Service is using local service files that do not match this lane (${activeBundleId} != ${expectedBundleId}).`,\n };\n }\n case \"bundle_content_drift\":\n return {\n code: \"bundle_content_drift\",\n message:\n \"OpenMeld could not verify the installed Service files. The Service needs repair.\",\n };\n case \"bundle_lane_drift\":\n return {\n code: \"bundle_lane_drift\",\n message:\n \"OpenMeld Service is using repo-local service files in a lane that only allows published or packaged service files. Use `openmeld-dev` for repo-local service validation.\",\n };\n case \"bundle_strategy_legacy\":\n return {\n code: \"bundle_strategy_legacy\",\n message:\n \"OpenMeld Service is using an older local service file layout.\",\n };\n case \"bundle_provenance_drift\":\n return {\n code: \"bundle_provenance_drift\",\n message:\n \"OpenMeld Service still depends on a local CLI source path that is no longer available.\",\n };\n case \"bundle_path_invalid\":\n return {\n code: \"bundle_path_invalid\",\n message: \"OpenMeld Service entry file is missing.\",\n };\n default:\n return null;\n }\n}\n\nfunction buildProcessAnomalies(input: {\n ownedProcesses: DaemonOwnedProcess[];\n runtimeStatus: DaemonServiceRuntimeStatus;\n intendedMode?: DaemonRunMode;\n}): DaemonServiceAnomaly[] {\n const anomalies: DaemonServiceAnomaly[] = [];\n if (input.ownedProcesses.length > 1) {\n anomalies.push({\n code: \"duplicate_owned_processes\",\n message: `Found ${String(input.ownedProcesses.length)} OpenMeld-owned service processes on this device.`,\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.intendedMode === \"foreground\" &&\n input.runtimeStatus.mode === \"background\"\n ) {\n anomalies.push({\n code: \"foreground_background_conflict\",\n message:\n \"OpenMeld background service is already running, so foreground mode cannot start in parallel.\",\n });\n }\n if (\n input.runtimeStatus.status === \"running\" &&\n input.intendedMode === \"background\" &&\n input.runtimeStatus.mode === \"foreground\"\n ) {\n anomalies.push({\n code: \"background_foreground_conflict\",\n message:\n \"OpenMeld foreground service is already running, so background mode cannot start in parallel.\",\n });\n }\n return anomalies;\n}\n\nfunction resolvePreferredServiceManagerController(input: {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n}): DaemonServiceController | null {\n if (input.runtimeStatus.serviceController !== \"unknown\") {\n return input.runtimeStatus.serviceController;\n }\n if (isKnownServiceController(input.serviceContract?.serviceController)) {\n return input.serviceContract.serviceController;\n }\n return null;\n}\n\nfunction isKnownServiceController(\n controller: DaemonServiceController | null | undefined\n): controller is Exclude<DaemonServiceController, \"unknown\"> {\n return Boolean(controller && controller !== \"unknown\");\n}\n\nfunction hasRuntimeBundleMismatch(input: {\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n}): boolean {\n if (\n !input.runtimeCommandEntryPath ||\n input.runtimeCommandPathExists !== true\n ) {\n return true;\n }\n if (!input.activeBundleEntryPath) {\n return true;\n }\n const normalizedRuntimePath = normalizeDaemonCommandPath(\n input.runtimeCommandEntryPath\n );\n const acceptedEntryPaths = new Set([\n normalizeDaemonCommandPath(input.activeBundleEntryPath),\n ...(input.activeBundleSourceEntryPath\n ? [normalizeDaemonCommandPath(input.activeBundleSourceEntryPath)]\n : []),\n ]);\n return !acceptedEntryPaths.has(normalizedRuntimePath);\n}\n\nfunction buildRuntimeBundleMismatchMessage(input: {\n activeBundleEntryPath: string | null;\n activeBundleSourceEntryPath: string | null;\n runtimeCommandEntryPath: string | null;\n runtimeCommandPathExists: boolean | null;\n}): string {\n if (!input.runtimeCommandEntryPath) {\n return \"OpenMeld Service runtime state does not point at a concrete service entry path.\";\n }\n if (input.runtimeCommandPathExists !== true) {\n return \"OpenMeld Service runtime state still points at a service entry file that no longer exists.\";\n }\n if (!input.activeBundleEntryPath) {\n return \"OpenMeld Service is running from a service entry path that does not match the active service files.\";\n }\n if (input.activeBundleSourceEntryPath) {\n return `OpenMeld Service is running from ${input.runtimeCommandEntryPath}, but neither the active service entry (${input.activeBundleEntryPath}) nor the service source entry (${input.activeBundleSourceEntryPath}) matches this runtime.`;\n }\n return `OpenMeld Service is running from ${input.runtimeCommandEntryPath}, but the active service files point at ${input.activeBundleEntryPath}.`;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return error.code !== \"ENOENT\";\n }\n throw error;\n }\n}\n\nfunction buildLifecycleLockedMessage(meta: OpenMeldLockMeta): string {\n const intent = typeof meta.intent === \"string\" ? meta.intent : \"unknown\";\n const command = typeof meta.command === \"string\" ? meta.command : \"unknown\";\n const pid = typeof meta.pid === \"number\" ? ` pid ${String(meta.pid)}` : \"\";\n return `Another OpenMeld Service task is already running (${command}, intent ${intent}${pid}).`;\n}\n\nfunction mergeOwnedProcesses(\n currentLaneProcesses: DaemonOwnedProcess[],\n legacySharedProcesses: DaemonOwnedProcess[]\n): DaemonOwnedProcess[] {\n if (legacySharedProcesses.length === 0) {\n return currentLaneProcesses;\n }\n const merged = [...currentLaneProcesses];\n const seenPids = new Set(\n currentLaneProcesses.map((processInfo) => processInfo.pid)\n );\n for (const processInfo of legacySharedProcesses) {\n if (seenPids.has(processInfo.pid)) {\n continue;\n }\n merged.push(processInfo);\n seenPids.add(processInfo.pid);\n }\n return merged;\n}\n","import { spawn } from \"node:child_process\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n configureDaemonMaintenanceEnvironment,\n daemonServiceUpdateWorkerNpmEntryPath,\n hasIndependentMaintenanceRegistration,\n INDEPENDENT_MAINTENANCE_REGISTRATION,\n resolveDaemonServiceUpdateWorkerIdentity,\n resolveDaemonServiceUpdateWorkerLaunchdPlistPath,\n resolveDaemonServiceUpdateWorkerSystemdPathUnitPath,\n resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath,\n resolveDaemonServiceUpdateWorkerSystemdUnitPath,\n resolveDaemonServiceUpdateWorkerWindowsScriptPath,\n} from \"../../config/daemon-service-update-worker-registration\";\nimport {\n daemonRuntimeRootPath,\n daemonRuntimeStateRootPath,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { assertSafePublishedProductionServiceRegistrationMutation } from \"../../config/published-production-safety\";\nimport { pruneManagedInstallVersions } from \"../../local-components/managed-install\";\nimport {\n clearDaemonServiceUpdateWorkerBinaryExecutable,\n daemonServiceUpdateWorkerBinaryPath,\n ensureDaemonServiceUpdateWorkerBinaryExecutable,\n readDaemonActiveBundleState,\n resolveDaemonBundleEntryPathFromState,\n runAuditedServiceManagerCarrierMutation,\n verifyDaemonActiveBundleIntegrity,\n} from \"./daemon-service-bundle\";\nimport { buildDaemonSystemServiceCommandSpec } from \"./daemon-service-command-spec\";\nimport {\n resolveDaemonServiceManager,\n startLaunchdService,\n waitForLaunchdJobUnloaded,\n} from \"./daemon-service-manager\";\nimport {\n type DaemonServiceUpdateJob,\n readPendingDaemonServiceUpdate,\n} from \"./daemon-service-update-state\";\nimport { windowsMaintenanceBinaryPath } from \"./windows-service-binary\";\nimport { windowsDirectTaskArguments } from \"./windows-task-command\";\nimport {\n runWindowsUserTask,\n windowsPowerShellPath,\n windowsTaskActionArguments,\n} from \"./windows-user-task\";\n\nconst UPDATE_WORKER_RESTART_BACKOFF_SECONDS = 30;\nconst SYSTEMD_QUOTING_PATTERN = /[\\s\"\\\\]/u;\n\nexport type DaemonServiceUpdateWorkerSpec = {\n args: string[];\n env: Record<string, string>;\n executable: string;\n pendingJobPath: string;\n workingDirectory: string;\n};\n\ntype RunCommandResult = {\n exitCode: number;\n stderr: string;\n stdout: string;\n};\n\nexport async function ensureDaemonServiceMaintenanceInstalled(): Promise<void> {\n // The pending update owns its executor until verification and rollback finish.\n if (await readPendingDaemonServiceUpdate()) {\n return;\n }\n const preparedBundle = await readDaemonActiveBundleState();\n if (\n !(\n preparedBundle?.sourceDistFingerprint &&\n (preparedBundle.bundleFormat === \"binary_v1\" ||\n (await verifyDaemonActiveBundleIntegrity(preparedBundle)))\n )\n ) {\n throw new Error(\n \"OpenMeld cannot install automatic maintenance without a verified Service program.\"\n );\n }\n // Binary preparation below verifies the maintenance executable against the\n // prepared source fingerprint. The main Service carrier may still be the\n // previous version until startup replaces it; it is not this worker's source.\n const spec = await buildDaemonServiceUpdateWorkerSpec({ preparedBundle });\n const identity = resolveDaemonServiceUpdateWorkerIdentity();\n let expectedDefinition: string;\n if (process.platform === \"darwin\") {\n expectedDefinition = buildLaunchdServiceUpdateWorkerPlist({\n label: identity.launchdLabel,\n logPath: resolveUpdateWorkerLogPath({}),\n spec,\n });\n } else if (process.platform === \"linux\") {\n expectedDefinition = buildSystemdServiceUpdateWorkerUnit({ spec });\n } else {\n expectedDefinition = (\n preparedBundle.bundleFormat === \"binary_v1\"\n ? windowsDirectTaskArguments\n : windowsTaskActionArguments\n )({\n ...spec,\n logPath: resolveUpdateWorkerLogPath({}),\n });\n }\n if (\n await hasIndependentMaintenanceRegistration(\n {},\n process.platform,\n expectedDefinition\n )\n ) {\n // A saved registration can outlive its executable (for example after a\n // local reinstall). Restore the verified carrier before trusting the job.\n await prepareDaemonServiceUpdateWorkerCarrier({ preparedBundle });\n if (process.platform === \"darwin\") {\n await startDaemonServiceUpdateWorker();\n }\n return;\n }\n await installDaemonServiceUpdateWorker({ preparedBundle });\n}\n\nexport async function installDaemonServiceUpdateWorker(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await prepareDaemonServiceUpdateWorkerCarrier(job, pathInput);\n await registerDaemonServiceUpdateWorker(job, pathInput);\n await startDaemonServiceUpdateWorker(undefined, pathInput);\n}\n\nexport async function registerDaemonServiceUpdateWorker(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"install the OpenMeld Service update worker for\",\n pathInput\n );\n const spec = await buildDaemonServiceUpdateWorkerSpec(job, pathInput);\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const serviceKey = `${guiDomain}/${identity.launchdLabel}`;\n const plistPath =\n resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput);\n await Promise.all([\n mkdir(dirname(plistPath), { recursive: true }),\n mkdir(dirname(resolveUpdateWorkerLogPath(pathInput)), {\n recursive: true,\n }),\n ]);\n await writeFile(\n plistPath,\n buildLaunchdServiceUpdateWorkerPlist({\n label: identity.launchdLabel,\n logPath: resolveUpdateWorkerLogPath(pathInput),\n spec,\n }),\n { encoding: \"utf8\", mode: 0o644 }\n );\n await chmod(plistPath, 0o644);\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", serviceKey],\n });\n await waitForLaunchdJobUnloaded(serviceKey);\n // Stop/uninstall leaves a persistent disabled override. Clear it before\n // bootstrap, otherwise launchd rejects reinstall with an opaque EIO.\n await requireSuccessfulCommand({\n command: \"launchctl\",\n args: [\"enable\", serviceKey],\n });\n await requireSuccessfulCommand({\n command: \"launchctl\",\n args: [\"bootstrap\", guiDomain, plistPath],\n });\n return;\n }\n\n if (process.platform === \"linux\") {\n const unitPath = resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput);\n const pathUnitPath =\n resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(pathInput);\n await mkdir(dirname(unitPath), { recursive: true });\n await Promise.all([\n writeFile(unitPath, buildSystemdServiceUpdateWorkerUnit({ spec }), {\n encoding: \"utf8\",\n mode: 0o600,\n }),\n writeFile(\n pathUnitPath,\n buildSystemdServiceUpdateWorkerPathUnit({\n serviceName: identity.serviceName,\n pendingJobPath: spec.pendingJobPath,\n }),\n { encoding: \"utf8\", mode: 0o600 }\n ),\n writeFile(\n resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(pathInput),\n buildSystemdServiceUpdateWorkerTimerUnit(identity.serviceName),\n { encoding: \"utf8\", mode: 0o600 }\n ),\n ]);\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n });\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\n \"--user\",\n \"enable\",\n \"--now\",\n `${identity.serviceName}.path`,\n `${identity.serviceName}.timer`,\n ],\n });\n return;\n }\n\n if (process.platform === \"win32\") {\n const scriptPath =\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n await mkdir(dirname(resolveUpdateWorkerLogPath(pathInput)), {\n recursive: true,\n });\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation: \"install\",\n executable:\n job.preparedBundle.bundleFormat === \"binary_v1\"\n ? spec.executable\n : windowsPowerShellPath(),\n arguments: (job.preparedBundle.bundleFormat === \"binary_v1\"\n ? windowsDirectTaskArguments\n : windowsTaskActionArguments)({\n ...spec,\n logPath: resolveUpdateWorkerLogPath(pathInput),\n }),\n workingDirectory: spec.workingDirectory,\n periodic: true,\n });\n await rm(scriptPath, { force: true });\n return;\n }\n\n throw new Error(\n `OpenMeld cannot install its background update worker on ${process.platform}.`\n );\n}\n\nexport async function prepareDaemonServiceUpdateWorkerCarrier(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (job.preparedBundle.bundleFormat === \"binary_v1\") {\n await ensureDaemonServiceUpdateWorkerBinaryExecutable(\n job.preparedBundle,\n pathInput\n );\n return;\n }\n const entry = await resolveDaemonBundleEntryPathFromState(\n job.preparedBundle,\n pathInput\n );\n if (!entry) {\n throw new Error(\n \"OpenMeld could not resolve the verified maintenance bundle.\"\n );\n }\n const target = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"refresh_update_worker_launcher\",\n pathInput,\n targetPath: target,\n run: async () => {\n await mkdir(dirname(target), { recursive: true });\n const temporary = `${target}.${process.pid}.tmp`;\n try {\n await writeFile(\n temporary,\n `process.env.OPENMELD_INTERNAL_NPM_INSTALL_ENTRY = ${JSON.stringify(job.preparedBundle.sourceEntryScriptPath)};\\nawait import(${JSON.stringify(pathToFileURL(entry).href)});\\n`,\n { mode: 0o600 }\n );\n await rename(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n },\n });\n}\n\nexport async function pruneDaemonServiceUpdateWorkerManagedVersions(\n job: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (job.preparedBundle.bundleFormat !== \"binary_v1\") {\n return;\n }\n const previousActiveBundle = await readDaemonActiveBundleState(pathInput);\n await pruneManagedInstallVersions({\n pathInput,\n preferredRollbackVersion: previousActiveBundle?.daemonVersion ?? null,\n });\n}\n\nexport async function startDaemonServiceUpdateWorker(\n _job?: DaemonServiceUpdateJob,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"start the OpenMeld Service update worker for\",\n pathInput\n );\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const serviceKey = `${guiDomain}/${identity.launchdLabel}`;\n await startLaunchdService({\n guiDomain,\n serviceKey,\n plistPath: resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput),\n });\n return;\n }\n if (process.platform === \"linux\") {\n await requireSuccessfulCommand({\n command: \"systemctl\",\n args: [\"--user\", \"start\", `${identity.serviceName}.service`],\n });\n return;\n }\n if (process.platform === \"win32\") {\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript:\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput),\n operation: \"start\",\n });\n return;\n }\n throw new Error(\n `OpenMeld cannot start its background update worker on ${process.platform}.`\n );\n}\n\nasync function clearDaemonServiceUpdateWorkerNpmEntry(\n pathInput: OpenMeldPathResolutionInput\n): Promise<void> {\n const targetPath = daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n await runAuditedServiceManagerCarrierMutation({\n distribution: \"npm\",\n operation: \"remove_update_worker_launcher\",\n pathInput,\n targetPath,\n run: () => rm(targetPath, { force: true }),\n });\n}\n\nexport async function uninstallDaemonServiceUpdateWorker(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n assertSafePublishedProductionServiceRegistrationMutation(\n \"uninstall the OpenMeld Service update worker for\",\n pathInput\n );\n const identity = resolveDaemonServiceUpdateWorkerIdentity(pathInput);\n if (process.platform === \"darwin\") {\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", `${guiDomain}/${identity.launchdLabel}`],\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", `${guiDomain}/${identity.launchdLabel}`],\n });\n await waitForLaunchdJobUnloaded(`${guiDomain}/${identity.launchdLabel}`);\n await rm(resolveDaemonServiceUpdateWorkerLaunchdPlistPath(pathInput), {\n force: true,\n });\n await clearDaemonServiceUpdateWorkerBinaryExecutable(pathInput);\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n return;\n }\n if (process.platform === \"linux\") {\n await runCommand({\n command: \"systemctl\",\n args: [\n \"--user\",\n \"disable\",\n \"--now\",\n `${identity.serviceName}.path`,\n `${identity.serviceName}.timer`,\n ],\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"stop\", `${identity.serviceName}.service`],\n });\n await Promise.all([\n rm(resolveDaemonServiceUpdateWorkerSystemdUnitPath(pathInput), {\n force: true,\n }),\n rm(resolveDaemonServiceUpdateWorkerSystemdPathUnitPath(pathInput), {\n force: true,\n }),\n rm(resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath(pathInput), {\n force: true,\n }),\n ]);\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n });\n await clearDaemonServiceUpdateWorkerBinaryExecutable(pathInput);\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n return;\n }\n if (process.platform === \"win32\") {\n const legacyScript =\n resolveDaemonServiceUpdateWorkerWindowsScriptPath(pathInput);\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript,\n operation: \"stop\",\n });\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript,\n operation: \"uninstall\",\n });\n await rm(legacyScript, { force: true });\n await clearDaemonServiceUpdateWorkerNpmEntry(pathInput);\n }\n}\n\nexport async function buildDaemonServiceUpdateWorkerSpec(\n job: Pick<DaemonServiceUpdateJob, \"preparedBundle\">,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceUpdateWorkerSpec> {\n const mainManager = await resolveDaemonServiceManager(undefined, pathInput);\n if (!mainManager) {\n throw new Error(\n \"OpenMeld could not find this computer's background service manager.\"\n );\n }\n const baseSpec = buildDaemonSystemServiceCommandSpec({\n controller: mainManager.controller,\n ...(job.preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: job.preparedBundle.sourceEntryScriptPath }\n : {}),\n distribution:\n job.preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\",\n });\n const binaryDistribution = job.preparedBundle.bundleFormat === \"binary_v1\";\n const binaryWorkerPath =\n process.platform === \"win32\" && binaryDistribution\n ? windowsMaintenanceBinaryPath(job.preparedBundle, pathInput)\n : daemonServiceUpdateWorkerBinaryPath(pathInput);\n const targetEntryPath = binaryDistribution\n ? binaryWorkerPath\n : daemonServiceUpdateWorkerNpmEntryPath(pathInput);\n if (!targetEntryPath) {\n throw new Error(\n \"OpenMeld could not resolve the prepared Service update executable.\"\n );\n }\n const env = { ...baseSpec.env };\n configureDaemonMaintenanceEnvironment(env);\n return {\n args: binaryDistribution\n ? [\"service\", \"update-worker\"]\n : [targetEntryPath, \"service\", \"update-worker\"],\n env,\n executable: binaryDistribution ? targetEntryPath : process.execPath,\n pendingJobPath: join(\n daemonRuntimeStateRootPath(pathInput),\n \"service-update.json\"\n ),\n workingDirectory: daemonRuntimeRootPath(pathInput),\n };\n}\n\nexport function buildLaunchdServiceUpdateWorkerPlist(input: {\n label: string;\n logPath: string;\n spec: DaemonServiceUpdateWorkerSpec;\n}): string {\n const args = [input.spec.executable, ...input.spec.args]\n .map((value) => ` <string>${escapeXml(value)}</string>`)\n .join(\"\\n\");\n const env = Object.entries(input.spec.env)\n .map(\n ([key, value]) =>\n ` <key>${escapeXml(key)}</key>\\n <string>${escapeXml(value)}</string>`\n )\n .join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- ${INDEPENDENT_MAINTENANCE_REGISTRATION} -->\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${escapeXml(input.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${args}\n </array>\n <key>WorkingDirectory</key>\n <string>${escapeXml(input.spec.workingDirectory)}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>StartInterval</key>\n <integer>3600</integer>\n <key>KeepAlive</key>\n <dict>\n <key>PathState</key>\n <dict>\n <key>${escapeXml(input.spec.pendingJobPath)}</key>\n <true/>\n <key>${escapeXml(join(dirname(input.spec.pendingJobPath), \"tools-update.json\"))}</key>\n <true/>\n </dict>\n </dict>\n <key>ThrottleInterval</key>\n <integer>${String(UPDATE_WORKER_RESTART_BACKOFF_SECONDS)}</integer>\n <key>EnvironmentVariables</key>\n <dict>\n${env}\n </dict>\n <key>StandardOutPath</key>\n <string>${escapeXml(input.logPath)}</string>\n <key>StandardErrorPath</key>\n <string>${escapeXml(input.logPath)}</string>\n</dict>\n</plist>\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerUnit(input: {\n spec: DaemonServiceUpdateWorkerSpec;\n}): string {\n const command = [input.spec.executable, ...input.spec.args]\n .map(quoteSystemdArg)\n .join(\" \");\n const environment = Object.entries(input.spec.env)\n .map(\n ([key, value]) =>\n `Environment=${key}=${quoteSystemdEnvironmentValue(value)}`\n )\n .join(\"\\n\");\n return `# ${INDEPENDENT_MAINTENANCE_REGISTRATION}\n[Unit]\nDescription=OpenMeld Service Update Worker\nAfter=default.target\n\n[Service]\nType=simple\nExecStart=${command}\nWorkingDirectory=${quoteSystemdArg(input.spec.workingDirectory)}\n${environment}\nRestart=on-failure\nRestartSec=${String(UPDATE_WORKER_RESTART_BACKOFF_SECONDS)}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerPathUnit(input: {\n pendingJobPath: string;\n serviceName: string;\n}): string {\n return `[Unit]\nDescription=Watch for a pending OpenMeld Service update\n\n[Path]\nPathExists=${input.pendingJobPath}\nPathExists=${join(dirname(input.pendingJobPath), \"tools-update.json\")}\nUnit=${input.serviceName}.service\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport function buildSystemdServiceUpdateWorkerTimerUnit(\n serviceName: string\n): string {\n return `[Unit]\nDescription=Check for OpenMeld updates\n\n[Timer]\nOnStartupSec=2min\nOnUnitInactiveSec=1h\nUnit=${serviceName}.service\n\n[Install]\nWantedBy=timers.target\n`;\n}\n\nfunction resolveUpdateWorkerLogPath(\n pathInput: OpenMeldPathResolutionInput\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n \"service-update-worker.log\"\n );\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction quoteSystemdArg(value: string): string {\n if (!SYSTEMD_QUOTING_PATTERN.test(value)) {\n return value;\n }\n return `\"${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\nfunction quoteSystemdEnvironmentValue(value: string): string {\n return quoteSystemdArg(value);\n}\n\nasync function requireSuccessfulCommand(input: {\n args: string[];\n command: string;\n}): Promise<void> {\n const result = await runCommand(input);\n if (result.exitCode !== 0) {\n throw commandFailure(`${input.command} ${input.args.join(\" \")}`, result);\n }\n}\n\nfunction commandFailure(operation: string, result: RunCommandResult): Error {\n const detail = result.stderr.trim() || result.stdout.trim();\n return new Error(\n `${operation} failed with exit ${String(result.exitCode)}${\n detail ? `: ${detail}` : \"\"\n }`\n );\n}\n\nasync function runCommand(input: {\n args: string[];\n command: string;\n}): Promise<RunCommandResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(input.command, input.args, {\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\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 resolve({ exitCode: Number(code ?? 1), stderr, stdout });\n });\n });\n}\n\nexport async function readInstalledUpdateWorkerDefinition(\n path: string\n): Promise<string | null> {\n return await readFile(path, \"utf8\").catch(() => null);\n}\n","import type { OpenMeldToolsMaintenanceProjection } from \"@openmeld/schemas/types\";\nimport {\n getConfiguredOpenMeldToolsMaintenance,\n setConfiguredOpenMeldToolsMaintenance,\n} from \"../../config/runtime-config\";\n\nexport type OpenMeldToolsMaintenancePolicy = {\n automaticUpdatesEnabled: boolean;\n};\n\nexport async function readOpenMeldToolsMaintenancePolicy(): Promise<OpenMeldToolsMaintenancePolicy> {\n return await getConfiguredOpenMeldToolsMaintenance();\n}\n\nexport async function writeOpenMeldToolsMaintenancePolicy(\n policy: OpenMeldToolsMaintenancePolicy\n): Promise<void> {\n await setConfiguredOpenMeldToolsMaintenance(policy);\n}\n\nexport async function resolveOpenMeldToolsMaintenanceProjection(): Promise<OpenMeldToolsMaintenanceProjection> {\n try {\n const policy = await readOpenMeldToolsMaintenancePolicy();\n return {\n automaticUpdatesEnabled: policy.automaticUpdatesEnabled,\n status: \"ready\",\n };\n } catch {\n return {\n automaticUpdatesEnabled: false,\n status: \"needs_help\",\n };\n }\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { openMeldToolsUpdateAttemptSchema } from \"@openmeld/schemas\";\nimport type { OpenMeldToolsUpdateAttempt } from \"@openmeld/schemas/types\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\n\nfunction pendingAttemptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"tools-update.json\");\n}\n\nfunction lastAttemptPath(pathInput: OpenMeldPathResolutionInput = {}): string {\n return join(daemonRuntimeStateRootPath(pathInput), \"tools-update-last.json\");\n}\n\nexport async function readPendingOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<OpenMeldToolsUpdateAttempt | null> {\n return await readAttempt(pendingAttemptPath(pathInput));\n}\n\nexport async function readLastOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<OpenMeldToolsUpdateAttempt | null> {\n return await readAttempt(lastAttemptPath(pathInput));\n}\n\nexport async function persistOpenMeldToolsUpdateAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeAttempt(pendingAttemptPath(pathInput), attempt);\n}\n\nexport async function completeOpenMeldToolsUpdateAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeAttempt(lastAttemptPath(pathInput), attempt);\n await discardPendingOpenMeldToolsUpdateAttempt(pathInput);\n}\n\nexport async function discardPendingOpenMeldToolsUpdateAttempt(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(pendingAttemptPath(pathInput), { force: true });\n}\n\nasync function readAttempt(\n path: string\n): Promise<OpenMeldToolsUpdateAttempt | 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 = openMeldToolsUpdateAttemptSchema.safeParse(\n JSON.parse(raw) as unknown\n );\n if (!parsed.success) {\n throw new Error(\"OpenMeld update state is invalid.\");\n }\n return parsed.data;\n}\n\nasync function writeAttempt(\n path: string,\n attempt: OpenMeldToolsUpdateAttempt\n): Promise<void> {\n const validated = openMeldToolsUpdateAttemptSchema.parse(attempt);\n const temporaryPath = `${path}.${String(process.pid)}.tmp`;\n await mkdir(dirname(path), { recursive: true });\n await writeFile(temporaryPath, `${JSON.stringify(validated, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, path);\n}\n","import { openMeldToolsUpdateRequestSourceSchema } from \"@openmeld/schemas\";\nimport type { OpenMeldToolsUpdateRequestSource } from \"@openmeld/schemas/types\";\n\nconst OPERATION_ID_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_OPERATION_ID\";\nconst REQUESTED_AT_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_REQUESTED_AT\";\nconst REQUEST_SOURCE_ENV = \"OPENMELD_INTERNAL_TOOLS_UPDATE_REQUEST_SOURCE\";\nconst TARGET_CLI_VERSION_ENV =\n \"OPENMELD_INTERNAL_TOOLS_UPDATE_TARGET_CLI_VERSION\";\nconst TARGET_SERVICE_VERSION_ENV =\n \"OPENMELD_INTERNAL_TOOLS_UPDATE_TARGET_SERVICE_VERSION\";\n\nexport type OpenMeldToolsUpdateContext = {\n operationId: string;\n requestedAt: string;\n requestSource: OpenMeldToolsUpdateRequestSource;\n targetCliVersion?: string;\n targetServiceVersion?: string;\n};\n\nexport function buildOpenMeldToolsUpdateContextEnv(\n context: OpenMeldToolsUpdateContext\n): NodeJS.ProcessEnv {\n return {\n [OPERATION_ID_ENV]: context.operationId,\n [REQUESTED_AT_ENV]: context.requestedAt,\n [REQUEST_SOURCE_ENV]: context.requestSource,\n ...(context.targetCliVersion\n ? { [TARGET_CLI_VERSION_ENV]: context.targetCliVersion }\n : {}),\n ...(context.targetServiceVersion\n ? { [TARGET_SERVICE_VERSION_ENV]: context.targetServiceVersion }\n : {}),\n };\n}\n\nexport function readOpenMeldToolsUpdateContextFromEnv(\n env: NodeJS.ProcessEnv = process.env\n): OpenMeldToolsUpdateContext | null {\n const operationId = normalize(env[OPERATION_ID_ENV]);\n const requestedAt = normalize(env[REQUESTED_AT_ENV]);\n const requestSource = openMeldToolsUpdateRequestSourceSchema.safeParse(\n env[REQUEST_SOURCE_ENV]\n );\n const targetCliVersion = normalize(env[TARGET_CLI_VERSION_ENV]);\n const targetServiceVersion = normalize(env[TARGET_SERVICE_VERSION_ENV]);\n if (!(operationId && requestedAt && requestSource.success)) {\n return null;\n }\n const requestedAtMs = Date.parse(requestedAt);\n if (!Number.isFinite(requestedAtMs)) {\n return null;\n }\n return {\n operationId,\n requestedAt: new Date(requestedAtMs).toISOString(),\n requestSource: requestSource.data,\n ...(targetCliVersion ? { targetCliVersion } : {}),\n ...(targetServiceVersion ? { targetServiceVersion } : {}),\n };\n}\n\nfunction normalize(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import { spawn } from \"node:child_process\";\nimport { write } from \"node:fs\";\nimport { compareSemver } from \"../../config/version-state\";\nimport { readManagedCliInstallation } from \"../../local-components/managed-install\";\nimport { isBinaryDistribution } from \"../../runtime/distribution\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\nimport {\n buildOpenMeldToolsUpdateContextEnv,\n type OpenMeldToolsUpdateContext,\n} from \"./openmeld-tools-update-context\";\nimport {\n appendBoundedOpenMeldToolsUpdateProcessOutput,\n type OpenMeldToolsUpdateProcessFailure,\n parseOpenMeldToolsUpdateFailureFrame,\n} from \"./openmeld-tools-update-process-frame\";\n\nexport type OpenMeldToolsUpgradeProcessResult = {\n exitCode: number;\n processFailure?: OpenMeldToolsUpdateProcessFailure;\n};\n\ntype BestEffortOutputWrite = (\n fileDescriptor: number,\n chunk: Buffer,\n callback: (error: NodeJS.ErrnoException | null) => void\n) => void;\n\ntype OpenMeldToolsUpgradeProcessDependencies = {\n stderrFileDescriptor?: number;\n stdoutFileDescriptor?: number;\n writeOutput?: BestEffortOutputWrite;\n};\n\nexport async function resolveMaintenanceCliInstallation(): Promise<{\n version: string;\n binaryPath: string;\n}> {\n const installed = isBinaryDistribution()\n ? await readManagedCliInstallation()\n : null;\n return installed && compareSemver(installed.version, OPENMELD_VERSION) >= 0\n ? installed\n : { version: OPENMELD_VERSION, binaryPath: process.execPath };\n}\n\nexport async function runOpenMeldToolsUpgradeProcess(\n context: OpenMeldToolsUpdateContext,\n dependencies: OpenMeldToolsUpgradeProcessDependencies = {}\n): Promise<OpenMeldToolsUpgradeProcessResult> {\n const binaryDistribution = isBinaryDistribution();\n const cli = await resolveMaintenanceCliInstallation();\n // A retained Service/maintenance carrier may be older than the installed CLI.\n // Run the installed CLI for updates; the protected carrier can still repair a\n // missing managed install. npm retains its original installation recipe.\n const { command, argsPrefix } = resolveOpenMeldToolsUpgradeProgram({\n binaryDistribution,\n processEntryScriptPath: process.argv[1],\n processExecutablePath: binaryDistribution\n ? cli.binaryPath\n : process.execPath,\n });\n const writeOutput: BestEffortOutputWrite =\n dependencies.writeOutput ??\n ((fileDescriptor, chunk, callback) => {\n write(fileDescriptor, chunk, (error) => callback(error));\n });\n const forwardStdout = createBestEffortOutputForwarder({\n fileDescriptor: dependencies.stdoutFileDescriptor ?? process.stdout.fd,\n writeOutput,\n });\n const forwardStderr = createBestEffortOutputForwarder({\n fileDescriptor: dependencies.stderrFileDescriptor ?? process.stderr.fd,\n writeOutput,\n });\n return await new Promise((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, [...argsPrefix, \"maintenance-upgrade\"], {\n windowsHide: true,\n env: {\n ...process.env,\n ...buildOpenMeldToolsUpdateContextEnv(context),\n OPENMELD_INTERNAL_SKIP_STARTUP_UPGRADE: \"1\",\n OPENMELD_INTERNAL_MAINTENANCE_WORKER: \"1\",\n },\n // Tee output into the OS-owned worker log while retaining only a bounded\n // stdout tail so the typed terminal failure frame can reach the owner.\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n child.stdout?.on(\"data\", (chunk: Buffer | string) => {\n const text = chunk.toString();\n stdout = appendBoundedOpenMeldToolsUpdateProcessOutput(stdout, text);\n forwardStdout(Buffer.from(text));\n });\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n forwardStderr(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n const processFailure = parseOpenMeldToolsUpdateFailureFrame(stdout);\n resolve({\n exitCode: Number(code ?? 1),\n ...(processFailure ? { processFailure } : {}),\n });\n });\n });\n}\n\nfunction createBestEffortOutputForwarder(input: {\n fileDescriptor: number | undefined;\n writeOutput: BestEffortOutputWrite;\n}): (chunk: Buffer) => void {\n let failed = !Number.isInteger(input.fileDescriptor);\n let writeInFlight = false;\n return (chunk) => {\n if (failed || writeInFlight || input.fileDescriptor === undefined) {\n return;\n }\n writeInFlight = true;\n try {\n input.writeOutput(input.fileDescriptor, chunk, (error) => {\n writeInFlight = false;\n if (error) {\n failed = true;\n }\n });\n } catch {\n writeInFlight = false;\n failed = true;\n }\n };\n}\n\nexport function resolveOpenMeldToolsUpgradeProgram(input: {\n binaryDistribution: boolean;\n processEntryScriptPath?: string;\n processExecutablePath: string;\n}): { argsPrefix: string[]; command: string } {\n if (input.binaryDistribution) {\n return {\n argsPrefix: [],\n command: input.processExecutablePath,\n };\n }\n const sourceEntryScriptPath = input.processEntryScriptPath;\n if (!sourceEntryScriptPath) {\n throw new Error(\"OpenMeld could not find its update program.\");\n }\n return {\n argsPrefix: [sourceEntryScriptPath],\n command: input.processExecutablePath,\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type {\n DaemonServiceUpdateJob,\n OpenMeldToolsUpdateAttempt,\n OpenMeldToolsUpdateOperation,\n OpenMeldToolsUpdateRequestSource,\n} from \"@openmeld/schemas/types\";\nimport { toErrorMessage } from \"@openmeld/utils\";\nimport {\n assessCliUpdate,\n type CliUpdateAssessment,\n} from \"../../command-entry-checks/cli-update-assessment\";\nimport { resolveServiceUpdateUrgency } from \"../../command-entry-checks/service-update-urgency\";\nimport { withDaemonServiceReconcileLock } from \"../../config/daemon-state\";\nimport { resolveOpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../lifecycle/current-daemon-version\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"../lifecycle/daemon-service-alignment-target\";\nimport { inspectDaemonServiceInventory } from \"../lifecycle/daemon-service-inventory\";\nimport { readPendingDaemonServiceUpdate } from \"../lifecycle/daemon-service-update-state\";\nimport { startDaemonServiceUpdateWorker } from \"../lifecycle/daemon-service-update-worker-manager\";\nimport {\n type OpenMeldToolsMaintenancePolicy,\n readOpenMeldToolsMaintenancePolicy,\n} from \"./openmeld-tools-maintenance-policy\";\nimport {\n completeOpenMeldToolsUpdateAttempt,\n discardPendingOpenMeldToolsUpdateAttempt,\n persistOpenMeldToolsUpdateAttempt,\n readPendingOpenMeldToolsUpdateAttempt,\n} from \"./openmeld-tools-update-attempt-state\";\nimport type { OpenMeldToolsUpdateContext } from \"./openmeld-tools-update-context\";\nimport {\n encodePersistedOpenMeldToolsUpdateFailure,\n OpenMeldToolsUpdateFailureError,\n resolveOpenMeldToolsUpdateFailure,\n} from \"./openmeld-tools-update-failure\";\nimport {\n type OpenMeldToolsUpgradeProcessResult,\n resolveMaintenanceCliInstallation,\n runOpenMeldToolsUpgradeProcess,\n} from \"./openmeld-tools-upgrade-process\";\n\ntype OpenMeldToolsUpdateCoordinatorDependencies = {\n withCoordinationLock: <T>(run: () => Promise<T>) => Promise<T>;\n wakeWorker: () => Promise<void>;\n assessUpdate: (input: {\n forceRefresh: boolean;\n }) => Promise<CliUpdateAssessment>;\n serviceNeedsAlignment: (version: string) => Promise<boolean>;\n completeAttempt: (attempt: OpenMeldToolsUpdateAttempt) => Promise<void>;\n createOperationId: () => string;\n discardPendingAttempt: () => Promise<void>;\n now: () => string;\n persistAttempt: (attempt: OpenMeldToolsUpdateAttempt) => Promise<void>;\n readPendingAttempt: () => Promise<OpenMeldToolsUpdateAttempt | null>;\n readPendingServiceJob: () => Promise<DaemonServiceUpdateJob | null>;\n readPolicy: () => Promise<OpenMeldToolsMaintenancePolicy>;\n reportBackgroundError: (error: unknown) => void;\n resolveUrgency: () => Promise<\"available\" | \"required\">;\n runUpgrade: (\n context: OpenMeldToolsUpdateContext\n ) => Promise<OpenMeldToolsUpgradeProcessResult>;\n};\n\nexport type OpenMeldToolsUpdateRequestResult =\n | { status: \"disabled\" }\n | { status: \"unavailable\" }\n | { status: \"current\"; currentVersion: string }\n | {\n status: \"started\" | \"already_running\";\n operation: OpenMeldToolsUpdateOperation;\n };\n\nexport type OpenMeldToolsUpdateCoordinator = {\n requestUpdate: (input: {\n requestSource: OpenMeldToolsUpdateRequestSource;\n }) => Promise<OpenMeldToolsUpdateRequestResult>;\n resumePendingUpdate: () => Promise<boolean>;\n waitForIdle: () => Promise<void>;\n};\n\nexport function createOpenMeldToolsUpdateCoordinator(\n overrides: Partial<OpenMeldToolsUpdateCoordinatorDependencies> = {},\n options: { executeUpdates?: boolean } = {}\n): OpenMeldToolsUpdateCoordinator {\n const deps = resolveDependencies(overrides);\n let inFlight: Promise<void> | null = null;\n let coordination: Promise<void> = Promise.resolve();\n\n const runSerialized = <T>(run: () => Promise<T>): Promise<T> => {\n const result = coordination.then(run, run);\n coordination = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n };\n\n const startAttempt = (attempt: OpenMeldToolsUpdateAttempt): void => {\n if (options.executeUpdates === false) {\n return;\n }\n if (inFlight) {\n return;\n }\n const running = runAttempt(attempt, deps);\n const tracked = running.finally(() => {\n if (inFlight === tracked) {\n inFlight = null;\n }\n });\n inFlight = tracked;\n inFlight.catch(deps.reportBackgroundError);\n };\n\n const resumePendingUpdate = async (): Promise<boolean> => {\n const serviceJob = await deps.readPendingServiceJob();\n const pendingAttempt = await deps.readPendingAttempt();\n if (serviceJob) {\n if (pendingAttempt) {\n await deps.discardPendingAttempt();\n }\n return true;\n }\n if (!pendingAttempt) {\n return false;\n }\n startAttempt(pendingAttempt);\n return true;\n };\n\n const requestUpdate = async ({\n requestSource,\n }: {\n requestSource: OpenMeldToolsUpdateRequestSource;\n }): Promise<OpenMeldToolsUpdateRequestResult> => {\n if (requestSource === \"automatic\") {\n const policy = await deps.readPolicy();\n if (!policy.automaticUpdatesEnabled) {\n return { status: \"disabled\" };\n }\n }\n\n const serviceJob = await deps.readPendingServiceJob();\n if (serviceJob) {\n return {\n status: \"already_running\",\n operation: projectServiceJob(serviceJob),\n };\n }\n const existingAttempt = await deps.readPendingAttempt();\n if (existingAttempt) {\n startAttempt(existingAttempt);\n return {\n status: \"already_running\",\n operation: existingAttempt.operation,\n };\n }\n\n const assessment = await deps.assessUpdate({ forceRefresh: true });\n if (!(assessment.checked && assessment.latestVersion)) {\n return { status: \"unavailable\" };\n }\n const serviceVersion =\n assessment.serviceVersion ?? assessment.latestVersion;\n if (\n !(\n assessment.updateAvailable ||\n (await deps.serviceNeedsAlignment(serviceVersion))\n )\n ) {\n return {\n currentVersion: assessment.currentVersion,\n status: \"current\",\n };\n }\n\n const now = deps.now();\n const attempt: OpenMeldToolsUpdateAttempt = {\n v: 1,\n attempts: 0,\n errorMessage: null,\n operation: {\n operationId: deps.createOperationId(),\n phase: \"updating\",\n requestSource,\n requestedAt: now,\n targetCliVersion: assessment.latestVersion,\n targetServiceVersion: serviceVersion,\n targetVersion: assessment.updateAvailable\n ? assessment.latestVersion\n : serviceVersion,\n updatedAt: now,\n urgency: assessment.floorBreached\n ? \"required\"\n : await deps.resolveUrgency(),\n },\n };\n await deps.persistAttempt(attempt);\n startAttempt(attempt);\n return { status: \"started\", operation: attempt.operation };\n };\n\n return {\n requestUpdate: async (input) => {\n const result = await runSerialized(\n async () => await deps.withCoordinationLock(() => requestUpdate(input))\n );\n if (\n options.executeUpdates === false &&\n (result.status === \"started\" || result.status === \"already_running\") &&\n (await deps.readPendingAttempt())?.operation.operationId ===\n result.operation.operationId\n ) {\n // Release the lifecycle lock before waking the worker. It must be able\n // to acquire that same lock when Task Scheduler starts it.\n await deps.wakeWorker();\n }\n return result;\n },\n resumePendingUpdate: async () => {\n const resumed = await runSerialized(() =>\n deps.withCoordinationLock(resumePendingUpdate)\n );\n if (\n resumed &&\n options.executeUpdates === false &&\n (await deps.readPendingAttempt()) !== null\n ) {\n await deps.wakeWorker();\n }\n return resumed;\n },\n waitForIdle: async () => {\n await coordination;\n while (inFlight) {\n await inFlight;\n }\n },\n };\n}\n\nasync function runAttempt(\n attempt: OpenMeldToolsUpdateAttempt,\n deps: OpenMeldToolsUpdateCoordinatorDependencies\n): Promise<void> {\n const running: OpenMeldToolsUpdateAttempt = {\n ...attempt,\n attempts: attempt.attempts + 1,\n errorMessage: null,\n operation: {\n ...attempt.operation,\n phase: \"updating\",\n updatedAt: deps.now(),\n },\n };\n await deps.persistAttempt(running);\n try {\n const result = await deps.runUpgrade({\n operationId: running.operation.operationId,\n requestedAt: running.operation.requestedAt,\n requestSource: running.operation.requestSource,\n targetCliVersion: running.operation.targetCliVersion,\n targetServiceVersion: running.operation.targetServiceVersion,\n });\n if (result.exitCode !== 0) {\n const fallbackMessage = `OpenMeld update process exited with status ${String(result.exitCode)}.`;\n throw new OpenMeldToolsUpdateFailureError({\n failureCode: result.processFailure?.failureCode ?? \"cli.update.failed\",\n message: result.processFailure?.detail ?? fallbackMessage,\n });\n }\n const serviceJob = await deps.readPendingServiceJob();\n if (serviceJob) {\n await deps.discardPendingAttempt();\n return;\n }\n await deps.completeAttempt({\n ...running,\n errorMessage: null,\n operation: {\n ...running.operation,\n phase: \"updated\",\n updatedAt: deps.now(),\n },\n });\n } catch (error) {\n const failureCode =\n resolveOpenMeldToolsUpdateFailure(error) ?? \"cli.update.failed\";\n await deps.completeAttempt({\n ...running,\n errorMessage: encodePersistedOpenMeldToolsUpdateFailure({\n detail: toErrorMessage(error),\n failureCode,\n }),\n operation: {\n ...running.operation,\n phase: \"needs_help\",\n updatedAt: deps.now(),\n },\n });\n }\n}\n\nfunction resolveDependencies(\n overrides: Partial<OpenMeldToolsUpdateCoordinatorDependencies>\n): OpenMeldToolsUpdateCoordinatorDependencies {\n return {\n withCoordinationLock:\n overrides.withCoordinationLock ?? withDaemonServiceReconcileLock,\n wakeWorker:\n overrides.wakeWorker ?? (() => startDaemonServiceUpdateWorker()),\n assessUpdate:\n overrides.assessUpdate ??\n (async () =>\n await assessCliUpdate({\n environmentTarget: await resolveOpenMeldEnvironmentTarget(),\n forceRefresh: true,\n currentVersion: (await resolveMaintenanceCliInstallation()).version,\n })),\n completeAttempt:\n overrides.completeAttempt ?? completeOpenMeldToolsUpdateAttempt,\n serviceNeedsAlignment:\n overrides.serviceNeedsAlignment ??\n (async (selectedVersion) => {\n const daemonVersion =\n await resolveCurrentDaemonExpectedVersion(selectedVersion);\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: daemonVersion,\n intendedMode: \"background\",\n intent: \"upgrade_reconcile\",\n });\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: buildDaemonServiceTargetSpec({ daemonVersion }),\n });\n return (\n decision.status !== \"already_aligned\" &&\n decision.status !== \"not_installed\"\n );\n }),\n createOperationId: overrides.createOperationId ?? randomUUID,\n discardPendingAttempt:\n overrides.discardPendingAttempt ??\n discardPendingOpenMeldToolsUpdateAttempt,\n now: overrides.now ?? (() => new Date().toISOString()),\n persistAttempt:\n overrides.persistAttempt ?? persistOpenMeldToolsUpdateAttempt,\n readPendingAttempt:\n overrides.readPendingAttempt ?? readPendingOpenMeldToolsUpdateAttempt,\n readPendingServiceJob:\n overrides.readPendingServiceJob ?? readPendingDaemonServiceUpdate,\n readPolicy: overrides.readPolicy ?? readOpenMeldToolsMaintenancePolicy,\n reportBackgroundError:\n overrides.reportBackgroundError ??\n ((error) => {\n console.error(\"[openmeld.tools.update_failed]\", error);\n }),\n resolveUrgency: overrides.resolveUrgency ?? resolveServiceUpdateUrgency,\n runUpgrade: overrides.runUpgrade ?? runOpenMeldToolsUpgradeProcess,\n };\n}\n\nfunction projectServiceJob(\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 ...(job.targetCliVersion ? { targetCliVersion: job.targetCliVersion } : {}),\n ...(job.targetServiceVersion\n ? { targetServiceVersion: job.targetServiceVersion }\n : {}),\n updatedAt: job.updatedAt,\n urgency: job.urgency,\n };\n}\n","import type { DaemonServiceContract } from \"@openmeld/schemas/types\";\nimport {\n type DaemonServiceContractStateInput,\n upsertDaemonServiceContract,\n} from \"../../config/daemon-service-contract\";\nimport { normalizeHeartbeatIntervalMs } from \"../core/logger\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\n\nexport type DaemonServiceContractMissingField =\n | \"daemonVersion\"\n | \"bundleId\"\n | \"deviceId\"\n | \"gatewayUrl\"\n | \"serviceController\";\n\nexport type DaemonServiceContractWriteResult =\n | {\n contract: DaemonServiceContract;\n status: \"written\";\n }\n | {\n missingFields: DaemonServiceContractMissingField[];\n status: \"skipped_missing_fields\";\n };\n\nexport async function writeDaemonServiceContract(input: {\n autoStart: boolean;\n bundleId?: string | null;\n daemonVersion?: string | null;\n desiredState: DaemonServiceContractStateInput[\"desiredState\"];\n deviceId?: string | null;\n connectedComputerId?: string | null;\n gatewayUrl?: string | null;\n heartbeatMs?: number | null;\n lane?: DaemonServiceContractStateInput[\"lane\"];\n ownerUserId?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): Promise<DaemonServiceContractWriteResult> {\n const missingFields = resolveMissingContractFields(input);\n if (missingFields.length > 0) {\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"skipped\",\n metadata: {\n autoStart: input.autoStart,\n desiredState: input.desiredState,\n missingFields,\n reason: \"missing_required_contract_fields\",\n },\n });\n return {\n status: \"skipped_missing_fields\",\n missingFields,\n };\n }\n const completeInput = requireCompleteContractInput(input);\n\n const contract = await upsertDaemonServiceContract(completeInput);\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"completed\",\n metadata: {\n autoStart: input.autoStart,\n desiredState: input.desiredState,\n deviceId: contract.deviceId,\n ...(contract.ownerUserId ? { ownerUserId: contract.ownerUserId } : {}),\n ...(contract.profileId ? { profileId: contract.profileId } : {}),\n serviceController: contract.serviceController,\n },\n });\n return {\n status: \"written\",\n contract,\n };\n}\n\nfunction requireCompleteContractInput(input: {\n autoStart: boolean;\n bundleId?: string | null;\n daemonVersion?: string | null;\n desiredState: DaemonServiceContractStateInput[\"desiredState\"];\n deviceId?: string | null;\n connectedComputerId?: string | null;\n gatewayUrl?: string | null;\n heartbeatMs?: number | null;\n lane?: DaemonServiceContractStateInput[\"lane\"];\n ownerUserId?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): DaemonServiceContractStateInput {\n if (\n !(\n input.daemonVersion &&\n input.bundleId &&\n input.serviceController &&\n input.gatewayUrl &&\n input.deviceId\n )\n ) {\n throw new Error(\n \"OpenMeld Service contract writer received incomplete input.\"\n );\n }\n return {\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 ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n heartbeatMs: normalizeHeartbeatIntervalMs(input.heartbeatMs ?? undefined),\n ...(input.lane ? { lane: input.lane } : {}),\n };\n}\n\nfunction resolveMissingContractFields(input: {\n bundleId?: string | null;\n daemonVersion?: string | null;\n deviceId?: string | null;\n gatewayUrl?: string | null;\n profileId?: string | null;\n serviceController?:\n | DaemonServiceContractStateInput[\"serviceController\"]\n | null;\n}): DaemonServiceContractMissingField[] {\n const missingFields: DaemonServiceContractMissingField[] = [];\n if (!input.daemonVersion) {\n missingFields.push(\"daemonVersion\");\n }\n if (!input.bundleId) {\n missingFields.push(\"bundleId\");\n }\n if (!input.serviceController) {\n missingFields.push(\"serviceController\");\n }\n if (!input.gatewayUrl) {\n missingFields.push(\"gatewayUrl\");\n }\n if (!input.deviceId) {\n missingFields.push(\"deviceId\");\n }\n return missingFields;\n}\n","import {\n getAuthSessionState,\n type StoredAuthSession,\n} from \"../../config/auth-session\";\nimport { resolveAuthBaseUrl } from \"../../config/auth-url\";\nimport { resolveBaseUrlOrNull } from \"../../config/base-url\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport { formatInlineOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\n\nconst DEPENDENCY_PROBE_TIMEOUT_MS = 1200;\n\nexport type DaemonServiceDependencyKind = \"auth\" | \"gateway\";\nexport type DaemonServiceDependencyScope = \"loopback\" | \"remote\";\nexport type DaemonServiceDependencyScopePolicy = \"loopback_only\" | \"all\";\nexport type DaemonServiceDependencyIssueStatus =\n | \"unhealthy_http\"\n | \"unreachable\";\n\nexport type DaemonServiceDependencyIssue = {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: DaemonServiceDependencyIssueStatus;\n httpStatus: number | null;\n};\n\nexport type DaemonServiceDependencyDiagnostics =\n | {\n applicable: false;\n ready: true;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: [];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n }\n | {\n applicable: true;\n ready: true;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: [];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n }\n | {\n applicable: true;\n ready: false;\n lane: OpenMeldEnvPreset;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n issues: DaemonServiceDependencyIssue[];\n checkedUrls: {\n auth: string | null;\n gateway: string | null;\n };\n };\n\ntype DependencyProbeTarget = {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n};\n\ntype DependencyProbeResult =\n | {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: \"reachable\";\n httpStatus: number;\n }\n | {\n kind: DaemonServiceDependencyKind;\n baseUrl: string;\n probeUrl: string;\n scope: DaemonServiceDependencyScope;\n status: DaemonServiceDependencyIssueStatus;\n httpStatus: number | null;\n };\n\nexport async function resolveDaemonServiceDependencyDiagnostics(\n input: {\n authSession?: StoredAuthSession | null;\n authUrl?: string;\n fetchImpl?: typeof fetch;\n gatewayUrl?: string;\n pathInput?: OpenMeldPathResolutionInput;\n scopePolicy?: DaemonServiceDependencyScopePolicy;\n } = {}\n): Promise<DaemonServiceDependencyDiagnostics> {\n const lane = resolveOpenMeldEnvPreset(input.pathInput);\n const scopePolicy = input.scopePolicy ?? \"all\";\n const authSession =\n input.authSession === undefined\n ? ((\n await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null)\n )?.session ?? null)\n : input.authSession;\n const authUrl =\n normalizeOptionalText(input.authUrl) ??\n normalizeOptionalText(authSession?.authBaseUrl) ??\n normalizeOptionalText(resolveAuthBaseUrl()) ??\n null;\n const gatewayUrl =\n normalizeOptionalText(await resolveBaseUrlOrNull(input.gatewayUrl)) ?? null;\n const checkedUrls = {\n auth: authUrl,\n gateway: gatewayUrl,\n };\n const targets = [\n buildDependencyProbeTarget({\n baseUrl: authUrl,\n kind: \"auth\",\n scopePolicy,\n }),\n buildDependencyProbeTarget({\n baseUrl: gatewayUrl,\n kind: \"gateway\",\n scopePolicy,\n }),\n ].filter(\n (candidate): candidate is DependencyProbeTarget => candidate !== null\n );\n\n if (targets.length === 0) {\n return {\n applicable: false,\n ready: true,\n lane,\n scopePolicy,\n issues: [],\n checkedUrls,\n };\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const results = await Promise.all(\n targets.map((target) =>\n probeDependencyAvailability({\n fetchImpl,\n target,\n })\n )\n );\n const issues = results\n .filter(\n (\n result\n ): result is Extract<\n DependencyProbeResult,\n { status: DaemonServiceDependencyIssueStatus }\n > => result.status !== \"reachable\"\n )\n .map((result) => ({\n kind: result.kind,\n baseUrl: result.baseUrl,\n probeUrl: result.probeUrl,\n scope: result.scope,\n status: result.status,\n httpStatus: result.httpStatus,\n }));\n\n if (issues.length === 0) {\n return {\n applicable: true,\n ready: true,\n lane,\n scopePolicy,\n issues: [],\n checkedUrls,\n };\n }\n\n return {\n applicable: true,\n ready: false,\n lane,\n scopePolicy,\n issues,\n checkedUrls,\n };\n}\n\nexport function buildDaemonServiceDependencyTitle(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return shouldUseDevLocalLaneLabel(input)\n ? \"OpenMeld Dev-Local Dependencies Unavailable\"\n : \"OpenMeld Service Dependencies Unavailable\";\n}\n\nexport function buildDaemonServiceDependencySummary(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n const [onlyIssue] = input.issues;\n const subject = buildDependencySubject(input);\n if (onlyIssue && input.issues.length === 1) {\n return `${subject} ${formatDependencyLabel(onlyIssue.kind)} is ${formatIssueStatusLabel(onlyIssue)} at \\`${onlyIssue.baseUrl}\\`.`;\n }\n\n const authIssue = input.issues.find((issue) => issue.kind === \"auth\");\n const gatewayIssue = input.issues.find((issue) => issue.kind === \"gateway\");\n if (authIssue && gatewayIssue) {\n const statusLabel =\n authIssue.status === \"unreachable\" &&\n gatewayIssue.status === \"unreachable\"\n ? \"unavailable\"\n : \"not healthy\";\n return `${subject} auth and gateway are ${statusLabel} at \\`${authIssue.baseUrl}\\` and \\`${gatewayIssue.baseUrl}\\`.`;\n }\n\n const labels = input.issues.map((issue) => formatDependencyLabel(issue.kind));\n return `${subject} dependencies need attention: ${labels.join(\", \")}.`;\n}\n\nexport function buildDaemonServiceDependencyDetails(input: {\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return input.issues\n .map((issue) => {\n const suffix =\n issue.status === \"unhealthy_http\" && issue.httpStatus !== null\n ? `health probe returned HTTP ${String(issue.httpStatus)}`\n : \"health probe was unreachable\";\n return `${formatDependencyTitle(issue.kind)}: \\`${issue.baseUrl}\\` (${suffix})`;\n })\n .join(\"\\n\");\n}\n\nexport function buildDaemonServiceDependencyMeaning(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n if (shouldUseDevLocalLaneLabel(input)) {\n return \"OpenMeld Service cannot finish starting in the dev-local lane until the local auth and gateway stack responds.\";\n }\n return \"OpenMeld Service cannot finish starting until the configured OpenMeld auth and gateway dependencies respond.\";\n}\n\nexport function buildDaemonServiceDependencyNextStep(input: {\n command: \"start\" | \"status\";\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n if (shouldUseDevLocalLaneLabel(input)) {\n return formatInlineOpenMeldCliCommands(\n `Start the local OpenMeld dev stack with \\`pnpm dev\\`, then retry \\`openmeld service ${input.command}\\`.`\n );\n }\n if (input.command === \"start\") {\n return formatInlineOpenMeldCliCommands(\n \"Check the configured OpenMeld auth and gateway endpoints for this lane, then retry `openmeld service start`.\"\n );\n }\n return formatInlineOpenMeldCliCommands(\n \"Check the configured OpenMeld auth and gateway endpoints for this lane, then retry `openmeld service status`.\"\n );\n}\n\nfunction buildDependencyProbeTarget(input: {\n baseUrl: string | null;\n kind: DaemonServiceDependencyKind;\n scopePolicy: DaemonServiceDependencyScopePolicy;\n}): DependencyProbeTarget | null {\n if (!input.baseUrl) {\n return null;\n }\n try {\n const scope = resolveDependencyScope(input.baseUrl);\n if (input.scopePolicy === \"loopback_only\" && scope !== \"loopback\") {\n return null;\n }\n const probeUrl = new URL(input.baseUrl);\n probeUrl.pathname = \"/health\";\n probeUrl.search = \"\";\n probeUrl.hash = \"\";\n return {\n kind: input.kind,\n baseUrl: input.baseUrl,\n probeUrl: probeUrl.toString(),\n scope,\n };\n } catch {\n return null;\n }\n}\n\nasync function probeDependencyAvailability(input: {\n fetchImpl: typeof fetch;\n target: DependencyProbeTarget;\n}): Promise<DependencyProbeResult> {\n try {\n const response = await input.fetchImpl(input.target.probeUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(DEPENDENCY_PROBE_TIMEOUT_MS),\n });\n if (response.ok) {\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"reachable\",\n httpStatus: response.status,\n };\n }\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"unhealthy_http\",\n httpStatus: response.status,\n };\n } catch {\n return {\n kind: input.target.kind,\n baseUrl: input.target.baseUrl,\n probeUrl: input.target.probeUrl,\n scope: input.target.scope,\n status: \"unreachable\",\n httpStatus: null,\n };\n }\n}\n\nfunction buildDependencySubject(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): string {\n return shouldUseDevLocalLaneLabel(input) ? \"OpenMeld dev-local\" : \"OpenMeld\";\n}\n\nfunction shouldUseDevLocalLaneLabel(input: {\n lane: OpenMeldEnvPreset;\n issues: DaemonServiceDependencyIssue[];\n}): boolean {\n return (\n input.lane === \"dev-local\" &&\n input.issues.length > 0 &&\n input.issues.every((issue) => issue.scope === \"loopback\")\n );\n}\n\nfunction resolveDependencyScope(baseUrl: string): DaemonServiceDependencyScope {\n try {\n const url = new URL(baseUrl);\n return isLoopbackHost(url.hostname) ? \"loopback\" : \"remote\";\n } catch {\n return \"remote\";\n }\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction formatDependencyLabel(kind: DaemonServiceDependencyKind): string {\n return kind === \"auth\" ? \"auth\" : \"gateway\";\n}\n\nfunction formatDependencyTitle(kind: DaemonServiceDependencyKind): string {\n return kind === \"auth\" ? \"Auth URL\" : \"Gateway URL\";\n}\n\nfunction formatIssueStatusLabel(issue: DaemonServiceDependencyIssue): string {\n if (issue.status === \"unhealthy_http\") {\n return \"unhealthy\";\n }\n return \"unavailable\";\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","//#region src/planner/onboarding-plan.ts\nconst RERUN_SETUP_HINT = \"rerun_setup\";\nfunction buildOnboardingPlan(facts) {\n\tconst decisions = [];\n\tif (!facts.auth.signedIn) {\n\t\tdecisions.push(decide(\"sign_in\", \"available\", true, \"auth.signed_out\"));\n\t\treturn finalize(decisions);\n\t}\n\tconst setupCommand = resolveSetupCommand(facts.context);\n\tdecisions.push(decide(\"sign_in\", \"done\", false, \"auth.signed_in\"));\n\tif (facts.auth.actingDisplayName === null) {\n\t\tdecisions.push(decide(\"set_display_name\", \"available\", true, \"identity.name_missing\"));\n\t\treturn finalize(decisions);\n\t}\n\tdecisions.push(decide(\"set_display_name\", \"done\", false, \"identity.name_present\"));\n\tif (facts.space === null) {\n\t\tdecisions.push(decide(\"enter_space\", \"available\", true, \"space.none_in_context\"));\n\t\treturn finalize(decisions);\n\t}\n\tif (!facts.space.actingProfileIsMember) {\n\t\tdecisions.push(decide(\"enter_space\", \"available\", true, \"space.not_joined\"));\n\t\treturn finalize(decisions);\n\t}\n\tdecisions.push(decide(\"enter_space\", \"done\", false, \"space.joined\"));\n\tdecisions.push(resolveBringAgentsDecision({\n\t\tfacts,\n\t\tspace: facts.space,\n\t\tactingProfileId: facts.auth.actingProfileId\n\t}));\n\tdecisions.push(resolveConnectComputerDecision({\n\t\tdeviceStatus: facts.device.status,\n\t\tsetupCommand\n\t}));\n\treturn finalize(decisions);\n}\nfunction resolveSetupCommand(context) {\n\tif (context.kind === \"web_setup_handoff\") return `openmeld setup --start-session ${context.startSessionToken} --view agent`;\n\treturn \"openmeld setup --view agent\";\n}\nfunction decide(id, status, blocking, reason, run = null, afterRun = null) {\n\treturn {\n\t\tid,\n\t\tstatus,\n\t\tblocking,\n\t\treason,\n\t\trun,\n\t\tafterRun\n\t};\n}\nfunction activeAgentProfiles(profiles) {\n\treturn profiles.filter((profile) => profile.kind === \"agent\" && profile.active);\n}\nfunction resolveBringAgentsDecision(input) {\n\tif (new Set(input.space.memberAgentProfileIds).size > 0) return decide(\"bring_agents\", \"done\", false, \"agents.member_present\");\n\tif (activeAgentProfiles(input.facts.accountProfiles).length === 0) return decide(\"bring_agents\", \"blocked\", false, \"agents.none_yet\");\n\treturn decide(\"bring_agents\", \"available\", false, \"agents.addable_present\", `openmeld space add-agents ${input.space.spaceId} --profile ${input.actingProfileId} --all --view agent`);\n}\nfunction resolveConnectComputerDecision(input) {\n\tconst { setupCommand } = input;\n\tswitch (input.deviceStatus) {\n\t\tcase \"connected\": return decide(\"connect_this_computer\", \"done\", false, \"computer.connected\");\n\t\tcase \"connecting\": return decide(\"connect_this_computer\", \"available\", false, \"computer.connecting\", setupCommand, RERUN_SETUP_HINT);\n\t\tcase \"not_connected\": return decide(\"connect_this_computer\", \"available\", false, \"computer.not_connected\", setupCommand, RERUN_SETUP_HINT);\n\t\tcase \"unknown\": return decide(\"connect_this_computer\", \"blocked\", false, \"computer.evidence_unavailable\");\n\t\tdefault: return assertNeverDeviceStatus(input.deviceStatus);\n\t}\n}\nfunction finalize(decisions) {\n\treturn {\n\t\tdecisions,\n\t\tsummary: decisions.some((decision) => decision.status === \"available\" || decision.status === \"blocked\") ? \"actions_pending\" : \"nothing_to_do\"\n\t};\n}\nfunction assertNeverDeviceStatus(value) {\n\tthrow new Error(`unexpected device status: ${String(value)}`);\n}\n//#endregion\n//#region src/presentation/computer-connection-progress.ts\nconst PHASE_COPY = {\n\tchecking: {\n\t\tstage: \"Checking this Mac\",\n\t\tdescription: \"Reviewing the current connection and OpenMeld Tools.\"\n\t},\n\tdownloading: {\n\t\tstage: \"Downloading OpenMeld Tools\",\n\t\tdescription: \"Downloading the verified tools for this Mac.\"\n\t},\n\tverifying: {\n\t\tstage: \"Verifying OpenMeld Tools\",\n\t\tdescription: \"Checking the downloaded tools before installation.\"\n\t},\n\tinstalling: {\n\t\tstage: \"Installing OpenMeld Tools\",\n\t\tdescription: \"Installing the verified tools for this Mac.\"\n\t},\n\twaiting_for_confirmation: {\n\t\tstage: \"Waiting for confirmation\",\n\t\tdescription: \"Confirm the account switch to continue.\"\n\t},\n\tswitching_account: {\n\t\tstage: \"Safely switching accounts\",\n\t\tdescription: \"Moving this Mac to the signed-in account.\"\n\t},\n\tfinishing_previous_connection: {\n\t\tstage: \"Finishing the previous connection\",\n\t\tdescription: \"OpenMeld is safely ending the previous connection before continuing.\"\n\t},\n\twaiting_for_current_work: {\n\t\tstage: \"Waiting for current work\",\n\t\tdescription: \"OpenMeld is waiting for accepted local work to finish safely.\"\n\t},\n\tconnecting_service: {\n\t\tstage: \"Connecting OpenMeld Service\",\n\t\tdescription: \"Starting the local service for the signed-in account.\"\n\t},\n\tconfirming: {\n\t\tstage: \"Confirming the connection\",\n\t\tdescription: \"Checking that this Mac is ready for the signed-in account.\"\n\t},\n\tconnected: {\n\t\tstage: \"Connected\",\n\t\tdescription: \"This Mac is connected to the signed-in account.\"\n\t},\n\trestoring: {\n\t\tstage: \"Restoring the previous connection\",\n\t\tdescription: \"The account switch did not finish. Restoring the earlier connection.\"\n\t},\n\tneeds_attention: {\n\t\tstage: \"Connection needs attention\",\n\t\tdescription: \"Review the connection details and try again.\"\n\t}\n};\nfunction presentComputerConnectionProgress(progress) {\n\tconst copy = PHASE_COPY[progress.phase];\n\tconst measurement = progress.measurement;\n\tif (!measurement) return {\n\t\t...copy,\n\t\tdeterminate: false,\n\t\tpercentage: null\n\t};\n\treturn {\n\t\t...measurement.transferAttempt > 1 ? {\n\t\t\tstage: \"Retrying the OpenMeld Tools download\",\n\t\t\tdescription: \"Downloading the verified tools again for this Mac.\"\n\t\t} : copy,\n\t\tdeterminate: true,\n\t\tpercentage: Math.min(100, Math.max(0, Math.round(measurement.value / measurement.total * 100)))\n\t};\n}\nfunction isNewerComputerConnectionProgress(current, candidate) {\n\treturn current === null || current.operationId === candidate.operationId && current.attemptId === candidate.attemptId && candidate.sequence > current.sequence;\n}\nfunction formatComputerConnectionElapsed(startedAt, nowMs) {\n\tconst elapsedSeconds = Math.max(0, Math.floor((nowMs - Date.parse(startedAt)) / 1e3));\n\tif (elapsedSeconds < 10) return null;\n\tconst minutes = Math.floor(elapsedSeconds / 60);\n\tconst seconds = elapsedSeconds % 60;\n\treturn minutes > 0 ? `${minutes}m ${seconds.toString().padStart(2, \"0\")}s` : `${seconds}s`;\n}\n//#endregion\n//#region src/presentation/profile-readiness.ts\nfunction buildDaemonRouteObservationPresentation(observation) {\n\tif (observation.status === \"online\") return {\n\t\tdetail: \"OpenMeld server can see an active reply route for this profile.\",\n\t\tstatusLabel: \"Online\"\n\t};\n\tif (observation.status === \"offline\") return {\n\t\tdetail: \"OpenMeld server can't currently see an active reply route for this profile.\",\n\t\tstatusLabel: \"Offline\"\n\t};\n\tswitch (observation.reasonCode) {\n\t\tcase \"server_unsupported\": return {\n\t\t\tdetail: \"This OpenMeld server can't report route status yet.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"profile_not_agent\": return {\n\t\t\tdetail: \"Only agent profiles have a reply route.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"profile_not_selected\": return {\n\t\t\tdetail: \"Choose an Agent Profile to check reply route status.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tcase \"not_requested\": return {\n\t\t\tdetail: \"OpenMeld did not ask for reply route status.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t\tdefault: return {\n\t\t\tdetail: \"OpenMeld couldn't confirm reply route status yet.\",\n\t\t\tstatusLabel: \"Unavailable\"\n\t\t};\n\t}\n}\n//#endregion\n//#region src/presentation/setup-flow-copy.ts\nconst PREPARE_SESSION_RECONNECT_GRACE_MS = 3e4;\nconst SETUP_FLOW_COPY = {\n\tcommandPlaceholder: \"Building setup command...\",\n\tconnectTerminalCompleteSummary: \"Terminal connected.\",\n\tconnectTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh setup command.\",\n\tconnectTerminalPendingSummary: \"Run the setup command in Terminal.\",\n\tconnectTerminalReconnectingSummary: \"Terminal connection was interrupted. Reconnecting...\",\n\tcopyCommandLabel: \"Copy setup command\",\n\texpiredCommandLabel: \"Setup command expired.\",\n\texpiredCommandPlaceholder: \"Refresh the setup command to continue.\",\n\tmode: \"setup\",\n\tpageDescription: \"Run one command. Setup updates automatically when Terminal connects.\",\n\tpageTitle: \"Connect this computer\",\n\tprepareComputerActiveSummaryByInternalStep: {\n\t\tprepare_selected_agents: \"Enabling local agents.\",\n\t\trefresh_service: \"Preparing OpenMeld Service.\",\n\t\treport_runtime: \"Connecting this computer.\",\n\t\tverify_setup: \"Checking setup.\"\n\t},\n\tprepareComputerBlockedSummary: \"Setup needs attention.\",\n\tprepareComputerCompleteSummary: \"Computer connected.\",\n\tprepareComputerDefaultActiveSummary: \"Connecting this computer.\",\n\tprepareComputerNoLocalAgentsSummary: \"Computer connected. Local agents are syncing in the background.\",\n\tprepareComputerPendingSummary: \"Waiting for Terminal.\",\n\tprepareComputerTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh setup command.\",\n\tprepareComputerTitle: \"Connect this computer\",\n\treadyAccountComputerActionSummary: \"Computer connected. Back to Computers, or reconnect this computer.\",\n\treadyCompleteSummary: \"Computer connected.\",\n\treadyDefaultActionSummary: \"Continue, or reconnect this computer.\",\n\treadyIncompleteSummary: \"Setup not finished yet.\",\n\treadyNoSelectedLocalAgentsActionSummary: \"Computer connected. Local agents will sync in the background. Continue, or reconnect this computer.\",\n\treadyNoSelectedLocalAgentsSummary: \"Computer connected. Local agents will sync in the background.\",\n\treadyRefreshPendingActionSummary: \"Continue after the check, or reconnect this computer.\",\n\treadyRefreshErrorSummary: \"Computer connected. Agent availability could not refresh.\",\n\treadyRefreshPendingSummary: \"Checking agent availability.\",\n\treadySpaceRecoveryActionSummary: \"Computer connected. Back to Space, or reconnect this computer.\",\n\treadyTitle: \"Computer connected\",\n\tcliAiAgentHintTemplate: \"AI setup agents: run {command} for setup.complete.\",\n\tcliBootstrapRepairStatus: \"Preparing OpenMeld...\",\n\tcliBootstrapRunStatus: \"Starting OpenMeld...\",\n\tcliCompletionTitle: \"✓ OpenMeld Setup Complete 🎉\",\n\tcliProgressCheckingLocalAgents: \"Checking local agents...\",\n\tcliProgressConnectingLocalAgents: \"Enabling local agents...\",\n\tcliProgressFinishingSetup: \"Finishing setup...\",\n\tcliProgressStartingService: \"Preparing OpenMeld Service...\",\n\tcliProgressUpdatingSkills: \"Updating OpenMeld skills...\"\n};\nconst UPDATE_SERVICE_FLOW_COPY = {\n\tcommandPlaceholder: \"Building update command...\",\n\tconnectTerminalCompleteSummary: \"Terminal connected.\",\n\tconnectTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh update command.\",\n\tconnectTerminalPendingSummary: \"Run the update command in Terminal.\",\n\tconnectTerminalReconnectingSummary: \"Terminal connection was interrupted. Reconnecting...\",\n\tcopyCommandLabel: \"Copy update command\",\n\texpiredCommandLabel: \"Update command expired.\",\n\texpiredCommandPlaceholder: \"Refresh the update command to continue.\",\n\tmode: \"update_service\",\n\tpageDescription: \"Run one command. The update continues automatically when Terminal reconnects.\",\n\tpageTitle: \"Update OpenMeld Service\",\n\tprepareComputerActiveSummaryByInternalStep: {\n\t\tprepare_selected_agents: \"Checking local agents.\",\n\t\trefresh_service: \"Updating OpenMeld Service.\",\n\t\treport_runtime: \"Connecting this computer.\",\n\t\tverify_setup: \"Checking update.\"\n\t},\n\tprepareComputerBlockedSummary: \"Update needs attention.\",\n\tprepareComputerCompleteSummary: \"OpenMeld Service updated.\",\n\tprepareComputerDefaultActiveSummary: \"Updating OpenMeld Service.\",\n\tprepareComputerNoLocalAgentsSummary: \"OpenMeld Service updated.\",\n\tprepareComputerPendingSummary: \"Waiting for Terminal.\",\n\tprepareComputerTerminalDisconnectedSummary: \"Terminal disconnected. Run a fresh update command.\",\n\tprepareComputerTitle: \"Update OpenMeld Service\",\n\treadyAccountComputerActionSummary: \"Update complete. Back to Computers, or run it again.\",\n\treadyCompleteSummary: \"Update complete.\",\n\treadyDefaultActionSummary: \"Continue, or run it again.\",\n\treadyIncompleteSummary: \"Update not finished yet.\",\n\treadyNoSelectedLocalAgentsActionSummary: \"Update complete. Continue, or run it again.\",\n\treadyNoSelectedLocalAgentsSummary: \"Update complete.\",\n\treadyRefreshPendingActionSummary: \"Continue after the check, or run it again.\",\n\treadyRefreshErrorSummary: \"Update complete. Wake availability could not refresh.\",\n\treadyRefreshPendingSummary: \"Checking Wake availability.\",\n\treadySpaceRecoveryActionSummary: \"Update complete. Back to Space, or run it again.\",\n\treadyTitle: \"Update complete\",\n\tcliAiAgentHintTemplate: \"AI setup agents: run {command} for setup.complete.\",\n\tcliBootstrapRepairStatus: \"Preparing OpenMeld...\",\n\tcliBootstrapRunStatus: \"Starting OpenMeld...\",\n\tcliCompletionTitle: \"✓ OpenMeld Service Update Complete\",\n\tcliProgressCheckingLocalAgents: \"Checking local agents...\",\n\tcliProgressConnectingLocalAgents: \"Checking local agents...\",\n\tcliProgressFinishingSetup: \"Finishing update...\",\n\tcliProgressStartingService: \"Updating OpenMeld Service...\",\n\tcliProgressUpdatingSkills: \"Updating OpenMeld skills...\"\n};\nfunction getSetupFlowCopy(mode) {\n\treturn mode === \"update_service\" ? UPDATE_SERVICE_FLOW_COPY : SETUP_FLOW_COPY;\n}\nfunction resolveSetupComputerActiveSummary(input) {\n\tif (isSetupComputerInternalStepId(input.stepId)) return input.copy.prepareComputerActiveSummaryByInternalStep[input.stepId];\n\treturn input.copy.prepareComputerDefaultActiveSummary;\n}\nfunction isSetupComputerInternalStepId(value) {\n\treturn value === \"prepare_selected_agents\" || value === \"refresh_service\" || value === \"report_runtime\" || value === \"verify_setup\";\n}\n//#endregion\n//#region src/recovery/computer-reply-readiness.ts\nconst LEADING_VERSION_PREFIX_RE = /^v/u;\nconst SEMVER_CORE_RE = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/u;\nfunction resolveComputerReplyReadiness(input) {\n\tif (input.currentDeviceTarget?.availability !== \"resolved\") return buildReadiness(\"needs_setup\", \"current_device.missing\");\n\tconst completedPrepareReadiness = resolveCompletedPrepareSessionReadiness({\n\t\tcurrentDeviceTarget: input.currentDeviceTarget,\n\t\tcurrentExpectedServiceVersion: input.currentExpectedServiceVersion ?? null,\n\t\tsnapshot: input.completedPrepareSessionSnapshot ?? null\n\t});\n\tif (completedPrepareReadiness !== null) return completedPrepareReadiness;\n\tif (input.selectedExecutionTarget === void 0) return buildReadiness(\"checking\", \"start_state.checking\");\n\tconst executionTargetReadiness = resolveExecutionTargetReadiness(input.selectedExecutionTarget);\n\tif (executionTargetReadiness !== null) return buildReadiness(executionTargetReadiness.status, executionTargetReadiness.reasonCode, null, input.selectedExecutionTarget);\n\tif (input.selectedExecutionTarget === null) return buildReadiness(\"unknown\", \"execution_target.unknown\", null, input.selectedExecutionTarget);\n\tconst localAgentReadiness = resolveLocalAgentReadiness(input.selectedExecutionTarget.localAgentCatalog.entries);\n\tif (localAgentReadiness !== null) return buildReadiness(localAgentReadiness.status, localAgentReadiness.reasonCode, null, input.selectedExecutionTarget);\n\treturn buildReadiness(\"ready\", \"ready\", null, input.selectedExecutionTarget);\n}\nfunction shouldUseCompletedPrepareSessionForComputerReadiness(input) {\n\tconst { snapshot } = input;\n\tif (input.currentDeviceTarget?.availability !== \"resolved\" || snapshot === null || snapshot === void 0 || snapshot.lifecycleStatus !== \"completed\" || snapshot.deviceId !== input.currentDeviceTarget.deviceId || snapshot.runtimeLane !== input.currentDeviceTarget.runtimeLane || snapshot.localAgentCatalog === null || !isPrepareStepComplete(snapshot, \"refresh_service\")) return false;\n\treturn true;\n}\nfunction resolveCompletedPrepareSessionReadiness(input) {\n\tconst snapshot = input.snapshot;\n\tif (snapshot === null || !shouldUseCompletedPrepareSessionForComputerReadiness({\n\t\tcurrentDeviceTarget: input.currentDeviceTarget,\n\t\tsnapshot\n\t}) || snapshot.localAgentCatalog === null) return null;\n\tconst service = snapshot.localReadinessSnapshot === null ? null : resolveCompletedPrepareSessionServiceVersion({\n\t\tcurrentExpectedServiceVersion: input.currentExpectedServiceVersion,\n\t\tsnapshot\n\t});\n\tif (snapshot.localReadinessSnapshot !== null) {\n\t\tconst backgroundHelperReadiness = resolveBackgroundHelperReadiness(snapshot.localReadinessSnapshot.service);\n\t\tif (backgroundHelperReadiness !== null) return buildReadiness(backgroundHelperReadiness.status, backgroundHelperReadiness.reasonCode, service);\n\t}\n\tconst localAgentReadiness = resolveLocalAgentReadiness(snapshot.localAgentCatalog.entries);\n\tif (localAgentReadiness !== null) return buildReadiness(localAgentReadiness.status, localAgentReadiness.reasonCode, service);\n\treturn buildReadiness(\"ready\", \"ready\", service);\n}\nfunction resolveExecutionTargetReadiness(executionTarget) {\n\tif (executionTarget === null || executionTarget === void 0) return null;\n\tif (executionTarget.status === \"ready\") return null;\n\tif (executionTarget.status === \"partial\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.partial\"\n\t};\n\tif (executionTarget.status === \"not_ready\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.not_ready\"\n\t};\n\tif (executionTarget.status === \"stale\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"execution_target.stale\"\n\t};\n\treturn {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"execution_target.unknown\"\n\t};\n}\nfunction resolveBackgroundHelperReadiness(backgroundHelper) {\n\tif (backgroundHelper.installStatus === \"not_installed\") return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"background_helper.not_installed\"\n\t};\n\tif (backgroundHelper.installStatus === \"unknown\") return {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"background_helper.unknown\"\n\t};\n\tif (backgroundHelper.executionCompatibility?.status === \"update_required\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.update_required\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"not_running\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.not_running\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"stale\") return {\n\t\tstatus: \"needs_repair\",\n\t\treasonCode: \"background_helper.stale\"\n\t};\n\tif (backgroundHelper.runtimeStatus === \"unknown\") return {\n\t\tstatus: \"unknown\",\n\t\treasonCode: \"background_helper.unknown\"\n\t};\n\treturn null;\n}\nfunction resolveLocalAgentReadiness(entries) {\n\tif (entries.length === 0) return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"local_agent_preparation.not_found\"\n\t};\n\tif (entries.filter((entry) => entry.enabled && entry.launchStatus === \"ready\").length === 0) return {\n\t\tstatus: \"needs_setup\",\n\t\treasonCode: \"local_agent_preparation.not_enabled\"\n\t};\n\treturn null;\n}\nfunction resolveCompletedPrepareSessionServiceVersion(input) {\n\tconst service = input.snapshot.localReadinessSnapshot?.service ?? null;\n\tconst expectedVersion = input.currentExpectedServiceVersion ?? service?.expectedVersion ?? null;\n\treturn {\n\t\tinstallStatus: service?.installStatus === \"installed_current\" && isOlderVersion(service.installedVersion, expectedVersion) ? \"installed_outdated\" : service?.installStatus ?? null,\n\t\truntimeStatus: service?.runtimeStatus ?? null,\n\t\tinstalledVersion: service?.installedVersion ?? null,\n\t\texpectedVersion,\n\t\texecutionCompatibility: service?.executionCompatibility ?? null,\n\t\tobservedAt: input.snapshot.localReadinessSnapshot?.observedAt ?? null\n\t};\n}\nfunction isOlderVersion(installedVersion, expectedVersion) {\n\tif (!(installedVersion && expectedVersion)) return false;\n\treturn compareSemver(installedVersion, expectedVersion) < 0;\n}\nfunction compareSemver(left, right) {\n\tconst leftParts = parseSemverCore(left);\n\tconst rightParts = parseSemverCore(right);\n\tif (!(leftParts && rightParts)) return left.localeCompare(right);\n\tfor (let index = 0; index < leftParts.length; index += 1) {\n\t\tconst leftPart = leftParts[index] ?? 0;\n\t\tconst rightPart = rightParts[index] ?? 0;\n\t\tif (leftPart !== rightPart) return leftPart > rightPart ? 1 : -1;\n\t}\n\treturn 0;\n}\nfunction parseSemverCore(value) {\n\tconst match = value.trim().replace(LEADING_VERSION_PREFIX_RE, \"\").match(SEMVER_CORE_RE);\n\tif (!match) return null;\n\treturn [\n\t\tNumber(match[1]),\n\t\tNumber(match[2]),\n\t\tNumber(match[3])\n\t];\n}\nfunction isPrepareStepComplete(snapshot, stepId) {\n\treturn snapshot.steps.some((step) => step.id === stepId && step.state === \"complete\");\n}\nfunction buildReadiness(status, reasonCode, service = null, executionTarget = null, detailReasonCode = null) {\n\treturn {\n\t\tstatus,\n\t\treasonCode,\n\t\tdetailReasonCode,\n\t\texecutionTargetStatus: executionTarget?.status ?? null,\n\t\tservice\n\t};\n}\n//#endregion\n//#region src/setup-download-command.ts\nconst SAFE_SHELL_WORD_RE = /^[A-Za-z0-9_./:@%+=,-]+$/u;\nconst OPENMELD_SETUP_SCRIPT_END_MARKER = \"# openmeld-setup-script-complete-v1\";\nfunction shellWord(value) {\n\treturn SAFE_SHELL_WORD_RE.test(value) ? value : `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n/** Keep the zero-dependency setup handoff readable in Terminal. */\nfunction buildPosixSetupDownloadCommand(setupUrl, setupArgs = []) {\n\tconst protocol = new URL(setupUrl).protocol;\n\tif (!(protocol === \"https:\" || protocol === \"http:\")) throw new Error(\"OpenMeld setup requires an HTTP or HTTPS download URL.\");\n\treturn `curl -fsSL${protocol === \"https:\" ? \" --proto '=https' --proto-redir '=https'\" : \"\"} ${shellWord(setupUrl)} | sh -s -- ${setupArgs.map(shellWord).join(\" \")}`.trimEnd();\n}\n//#endregion\n//#region src/setup-node-runtime.ts\nconst LEGACY_MAJOR = 20;\nconst CURRENT_MIN_MAJOR = 22;\nconst CURRENT_MAX_MAJOR_EXCLUSIVE = 26;\nconst OPENMELD_NODE_ENGINE_RANGE = `${LEGACY_MAJOR}.x || >=${CURRENT_MIN_MAJOR} <${CURRENT_MAX_MAJOR_EXCLUSIVE}`;\nconst OPENMELD_SUPPORTED_NODE_MAJORS = Object.freeze([LEGACY_MAJOR, ...Array.from({ length: CURRENT_MAX_MAJOR_EXCLUSIVE - CURRENT_MIN_MAJOR }, (_, index) => CURRENT_MIN_MAJOR + index)]);\n//#endregion\nexport { OPENMELD_NODE_ENGINE_RANGE, OPENMELD_SETUP_SCRIPT_END_MARKER, OPENMELD_SUPPORTED_NODE_MAJORS, PREPARE_SESSION_RECONNECT_GRACE_MS, buildDaemonRouteObservationPresentation, buildOnboardingPlan, buildPosixSetupDownloadCommand, formatComputerConnectionElapsed, getSetupFlowCopy, isNewerComputerConnectionProgress, presentComputerConnectionProgress, resolveComputerReplyReadiness, resolveSetupComputerActiveSummary, shouldUseCompletedPrepareSessionForComputerReadiness };\n\n//# sourceMappingURL=index.js.map","import {\n type DaemonRouteObservationResponse,\n daemonRouteObservationResponseSchema,\n type OpenMeldRequestContext,\n} from \"@openmeld/schemas\";\nimport { toDaemonRouteObservationUrl } from \"../protocol/urls\";\nimport { fetchSpaceRequestWithTimeout } from \"../space/fetch-with-timeout\";\nimport { resolveBaseUrl } from \"./base-url\";\nimport { buildOpenMeldRequestContextHeadersWithAuth } from \"./request-headers\";\n\nexport class DaemonRouteObservationFetchError extends Error {\n readonly code: \"lookup_failed\" | \"server_unsupported\";\n readonly status: number | null;\n\n constructor(input: {\n code: \"lookup_failed\" | \"server_unsupported\";\n message: string;\n status?: number | null;\n }) {\n super(input.message);\n this.code = input.code;\n this.name = \"DaemonRouteObservationFetchError\";\n this.status = input.status ?? null;\n }\n}\n\nexport async function fetchDaemonRouteObservation(input: {\n requestContext: OpenMeldRequestContext;\n baseUrl?: string;\n profileId: string;\n}): Promise<DaemonRouteObservationResponse> {\n const baseUrl = await resolveBaseUrl(input.baseUrl);\n const endpoint = toDaemonRouteObservationUrl(baseUrl, input.profileId);\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"daemon.route_observation\",\n init: {\n headers: await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n }),\n },\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new DaemonRouteObservationFetchError({\n code:\n response.status === 404 || response.status === 405\n ? \"server_unsupported\"\n : \"lookup_failed\",\n message: `HTTP ${response.status}: ${raw}`,\n status: response.status,\n });\n }\n\n const parsed = daemonRouteObservationResponseSchema.safeParse(parseJson(raw));\n if (!parsed.success) {\n throw new DaemonRouteObservationFetchError({\n code: \"lookup_failed\",\n message: \"invalid daemon route observation response\",\n });\n }\n return parsed.data;\n}\n\nfunction parseJson(raw: string): unknown {\n if (!raw.trim()) {\n return null;\n }\n\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import {\n createLocalAdapterContainer,\n createLocalAdapterEntries,\n} from \"@openmeld/local-service\";\nimport type { DaemonProfileSkipReason } from \"@openmeld/schemas/types\";\nimport type { Presenter } from \"../../runtime/presenter/types\";\nimport type { ExpectedRoutesReadSession } from \"../../system/expected-routes-read-session\";\nimport type { PrimaryBindingReadSession } from \"../../system/primary-binding-read-session\";\nimport { toErrorMessage } from \"../core/logger\";\nimport type { RouteCatalog } from \"../core/types\";\nimport {\n type DeviceRuntimeStateSyncResult,\n NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON,\n syncDeviceRuntimeStateProjection,\n} from \"../reporting/device-runtime-state-sync\";\nimport { loadDaemonRouteCatalog } from \"../routing/route-catalog\";\n\ntype LocalServiceDemandDecision = \"keep_running\" | \"indeterminate\";\n\nexport type LocalServiceDemand = {\n decision: LocalServiceDemandDecision;\n hasLocalExecutionRoute: boolean;\n repairableReplyCandidateCount: number;\n reason: string;\n localExecutionRouteCount: number;\n projection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null;\n};\n\nconst QUIET_PRESENTER: Presenter = {\n view: \"agent\",\n event: () => undefined,\n line: () => undefined,\n data: () => undefined,\n};\n\nexport async function resolveLocalServiceDemand(input: {\n bindingReads?: PrimaryBindingReadSession;\n expectedRoutesRead?: ExpectedRoutesReadSession;\n ownerUserId?: string | null;\n projection?: DeviceRuntimeStateSyncResult | null;\n routeCatalog?: RouteCatalog;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand> {\n const projection =\n input.projection === undefined\n ? await syncDeviceRuntimeStateProjection({\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n mode: \"check\",\n }).catch(() => null)\n : input.projection;\n const ownerUserId = normalizeOptionalString(input.ownerUserId);\n\n if (!ownerUserId) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: \"owner user is unavailable\",\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n const localAdapterContainer = createLocalAdapterContainer(\n createLocalAdapterEntries({\n runtimeWorkdir: input.runtimeWorkdir ?? process.cwd(),\n })\n );\n if (localAdapterContainer.listAdapters().length === 0) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: \"no local adapters are configured on this device\",\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n let localExecutionRouteCount = 0;\n let repairableReplyCandidateCount = 0;\n try {\n const routeCatalog =\n input.routeCatalog ??\n (await loadDaemonRouteCatalog({\n allowEmpty: true,\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n localAdapterContainer,\n localReplyStateMode: \"check\",\n ownerUserId,\n presenter: QUIET_PRESENTER,\n quiet: true,\n }));\n localExecutionRouteCount = routeCatalog.profileIds.length;\n repairableReplyCandidateCount = routeCatalog.skippedProfiles.filter(\n (profile) => isRepairableSkippedDaemonProfile(profile.skipReason)\n ).length;\n } catch (error) {\n return {\n decision: \"indeterminate\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount: 0,\n reason: `failed to load local daemon routes: ${toErrorMessage(error)}`,\n localExecutionRouteCount: 0,\n projection,\n };\n }\n\n if (localExecutionRouteCount > 0) {\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: true,\n repairableReplyCandidateCount,\n reason: \"local execution routes are available\",\n localExecutionRouteCount,\n projection,\n };\n }\n\n if (repairableReplyCandidateCount > 0) {\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount,\n reason:\n \"reply-capable local agent profiles are still reconciling on this device\",\n localExecutionRouteCount,\n projection,\n };\n }\n\n return {\n decision: \"keep_running\",\n hasLocalExecutionRoute: false,\n repairableReplyCandidateCount,\n reason: resolveZeroLocalValueReason(projection),\n localExecutionRouteCount,\n projection,\n };\n}\n\nfunction isRepairableSkippedDaemonProfile(\n skipReason: DaemonProfileSkipReason\n): boolean {\n return (\n skipReason === \"projection.missing\" || skipReason === \"workspace.missing\"\n );\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveZeroLocalValueReason(\n projection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null\n): string {\n if (!projection) {\n return \"no local execution routes are available\";\n }\n if (\n projection.status === \"ok\" &&\n projection.projectedControllerIds.length === 0\n ) {\n return NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON;\n }\n if (projection.status === \"degraded\") {\n return \"projected local controllers are not currently available for local execution\";\n }\n return \"no local execution routes are available\";\n}\n","import { providerDispatchRuntimeContextSchema } from \"@openmeld/schemas\";\nimport type {\n OpenMeldDaemonTaskResultPayload,\n ProviderDispatchRuntimeContext,\n} from \"@openmeld/schemas/types\";\nimport type { OpenMeldProfile } from \"../../config/openmeld-profiles-api\";\nimport { prepareProviderRuntime } from \"../prepare-provider-runtime\";\nimport type { OpenClawLocalBootstrapResult } from \"./local-bootstrap\";\nimport type { OpenClawLocalBootstrapStoreError } from \"./local-bootstrap-store\";\nimport {\n readOpenClawLocalBootstrapState,\n resolveOpenClawLocalBootstrapPaths,\n} from \"./local-bootstrap-store\";\nimport {\n findOpenClawAgentById,\n findOpenClawAgentsByWorkspace,\n matchesExpectedWorkspace,\n type OpenClawAuthStatus,\n resolveOpenClawAuthStatus,\n resolveOpenClawProviderRuntimeWorkingDirectory,\n} from \"./local-state\";\nimport {\n fetchOpenClawGatewayHealth,\n listOpenClawAgents,\n listOpenClawGatewayAgents,\n type OpenClawAgentSummary,\n} from \"./official-cli\";\n\nexport type OpenClawDiagnosticsMode = \"inspect\" | \"repair\";\n\nexport type OpenClawBootstrapStatus =\n | \"healthy\"\n | \"missing\"\n | \"binding_conflict\"\n | \"workspace_mismatch\"\n | \"workspace_ambiguous\"\n | \"invalid\";\n\nexport type OpenClawBootstrapResolution =\n | OpenClawLocalBootstrapResult[\"resolution\"]\n | null;\n\nexport type OpenClawGatewayHealthStatus = \"healthy\" | \"unhealthy\";\n\nexport type OpenClawGatewayVisibilityDiagnosticStatus =\n | \"visible\"\n | \"not_visible\"\n | \"restarted_then_visible\"\n | \"restart_failed\"\n | \"not_checked\";\n\nexport type OpenClawLocalDiagnostics = {\n agentId: string | null;\n authStatus: OpenClawAuthStatus;\n bootstrapResolution: OpenClawBootstrapResolution;\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n gatewayHealth: OpenClawGatewayHealthStatus;\n gatewayVisibility: OpenClawGatewayVisibilityDiagnosticStatus;\n message: string | null;\n workspaceDir: string;\n};\n\nexport type OpenClawLocalDiagnosticsFailure = {\n errorCode: string | null;\n kind: \"failed\";\n message: string;\n};\n\nexport type OpenClawLocalDiagnosticsState =\n | OpenClawLocalDiagnostics\n | OpenClawLocalDiagnosticsFailure;\n\ntype OpenClawLocalDiagnosticsDeps = {\n fetchGatewayHealth: typeof fetchOpenClawGatewayHealth;\n listAgents: typeof listOpenClawAgents;\n listGatewayAgents: typeof listOpenClawGatewayAgents;\n prepareRuntime: typeof prepareProviderRuntime;\n readBootstrapState: typeof readOpenClawLocalBootstrapState;\n};\n\ntype DiagnosticsBootstrapRead =\n | {\n agentId: string | null;\n error: null;\n kind: \"existing\";\n }\n | {\n agentId: null;\n error: null;\n kind: \"missing\";\n }\n | {\n agentId: null;\n error: OpenClawLocalBootstrapStoreError | null;\n kind: \"invalid\";\n };\n\nconst DEFAULT_OPENCLAW_LOCAL_DIAGNOSTICS_DEPS: OpenClawLocalDiagnosticsDeps = {\n fetchGatewayHealth: fetchOpenClawGatewayHealth,\n listAgents: listOpenClawAgents,\n listGatewayAgents: listOpenClawGatewayAgents,\n prepareRuntime: prepareProviderRuntime,\n readBootstrapState: readOpenClawLocalBootstrapState,\n};\n\nexport async function resolveOpenClawLocalDiagnostics(\n input: {\n mode: OpenClawDiagnosticsMode;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n providerRuntimeWorkingDirectory?: string;\n },\n deps: OpenClawLocalDiagnosticsDeps = DEFAULT_OPENCLAW_LOCAL_DIAGNOSTICS_DEPS\n): Promise<OpenClawLocalDiagnostics> {\n const providerRuntimeWorkingDirectory =\n resolveOpenClawProviderRuntimeWorkingDirectory(\n input.providerRuntimeWorkingDirectory\n );\n const bootstrapPaths = resolveOpenClawLocalBootstrapPaths({\n openMeldProfileId: input.profile.openMeldProfileId,\n });\n\n if (input.mode === \"repair\") {\n return await resolveRepairModeDiagnostics({\n bootstrapPaths,\n providerRuntimeWorkingDirectory,\n deps,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n }\n\n return await resolveInspectModeDiagnostics({\n bootstrapPaths,\n providerRuntimeWorkingDirectory,\n deps,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n}\n\nexport function createOpenClawLocalDiagnosticsFailure(\n error: unknown\n): OpenClawLocalDiagnosticsFailure {\n return {\n errorCode: extractErrorCode(error),\n kind: \"failed\",\n message: toErrorMessage(error),\n };\n}\n\nexport function isOpenClawLocalDiagnosticsFailure(\n diagnostics: OpenClawLocalDiagnosticsState | null | undefined\n): diagnostics is OpenClawLocalDiagnosticsFailure {\n return (\n diagnostics !== null &&\n diagnostics !== undefined &&\n typeof diagnostics === \"object\" &&\n \"kind\" in diagnostics &&\n diagnostics.kind === \"failed\"\n );\n}\n\nexport function resolveOpenClawLocalDiagnosticsValue(\n diagnostics: OpenClawLocalDiagnosticsState | null | undefined\n): OpenClawLocalDiagnostics | null {\n if (!diagnostics || isOpenClawLocalDiagnosticsFailure(diagnostics)) {\n return null;\n }\n return diagnostics;\n}\n\nasync function resolveRepairModeDiagnostics(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n try {\n const preparation = await input.deps.prepareRuntime({\n agentControllerRef: \"builtin:openclaw\",\n daemonWorkingDirectory: input.providerRuntimeWorkingDirectory,\n mode: \"reply_readiness\",\n openClawBin: input.openClawBin,\n profileName: input.profile.profileName,\n runtimeContext: resolveDiagnosticsRuntimeContext(\n input.providerRuntimeWorkingDirectory\n ),\n targetProfileId: input.profile.openMeldProfileId,\n });\n if (preparation.preparationDetails.kind !== \"openclaw\") {\n throw new Error(\n \"OpenClaw runtime preparation returned a non-OpenClaw preparation result\"\n );\n }\n return {\n agentId: preparation.preparationDetails.bootstrap.agentId,\n authStatus: preparation.preparationDetails.bootstrap.authStatus,\n bootstrapResolution: preparation.preparationDetails.bootstrap.resolution,\n bootstrapStatus: \"healthy\",\n errorCode: null,\n gatewayHealth: \"healthy\",\n gatewayVisibility: mapGatewayVisibilityPayload(\n preparation.preparationDetails.openClawGatewayVisibility\n ),\n message: null,\n workspaceDir: preparation.runtimeContext.providerRuntimeWorkingDirectory,\n };\n } catch (error) {\n const inspected = await inspectBootstrapState({\n bootstrapPaths: input.bootstrapPaths,\n providerRuntimeWorkingDirectory: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n error,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n const failureDetail = resolveDiagnosticsFailureDetail({\n error,\n inspected,\n });\n if (failureDetail.errorCode === \"controller.gateway.unhealthy\") {\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: failureDetail.errorCode,\n gatewayHealth: hasGatewayVisibilityPayload(error)\n ? \"healthy\"\n : \"unhealthy\",\n gatewayVisibility: resolveGatewayVisibilityFailureStatus(error),\n message: failureDetail.message,\n };\n }\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: failureDetail.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: failureDetail.message,\n };\n }\n}\n\nasync function resolveInspectModeDiagnostics(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n const inspected = await inspectBootstrapState({\n bootstrapPaths: input.bootstrapPaths,\n providerRuntimeWorkingDirectory: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n error: null,\n openClawBin: input.openClawBin,\n profile: input.profile,\n });\n\n if (inspected.bootstrapStatus !== \"healthy\" || !inspected.agentId) {\n return {\n ...inspected,\n bootstrapResolution: null,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n };\n }\n\n const gatewayHealth = await input.deps\n .fetchGatewayHealth({\n cwd: input.providerRuntimeWorkingDirectory,\n openClawBin: input.openClawBin,\n })\n .then(() => \"healthy\" as const)\n .catch((error) => ({\n errorCode: extractErrorCode(error),\n message: toErrorMessage(error),\n }));\n\n if (gatewayHealth !== \"healthy\") {\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: gatewayHealth.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: gatewayHealth.message,\n };\n }\n\n const visibility = await resolveInspectGatewayVisibility({\n agentId: inspected.agentId,\n cwd: input.providerRuntimeWorkingDirectory,\n deps: input.deps,\n openClawBin: input.openClawBin,\n });\n\n return {\n ...inspected,\n bootstrapResolution: null,\n errorCode: visibility.errorCode,\n gatewayHealth: \"healthy\",\n gatewayVisibility: visibility.gatewayVisibility,\n message: visibility.message,\n };\n}\n\nasync function inspectBootstrapState(input: {\n bootstrapPaths: ReturnType<typeof resolveOpenClawLocalBootstrapPaths>;\n providerRuntimeWorkingDirectory: string;\n deps: OpenClawLocalDiagnosticsDeps;\n error: unknown;\n openClawBin?: string;\n profile: Pick<OpenMeldProfile, \"openMeldProfileId\" | \"profileName\">;\n}): Promise<OpenClawLocalDiagnostics> {\n const listedAgents = await input.deps.listAgents({\n cwd: input.providerRuntimeWorkingDirectory,\n openClawBin: input.openClawBin,\n });\n const workspaceAgents = findOpenClawAgentsByWorkspace({\n agents: listedAgents,\n workspace: input.providerRuntimeWorkingDirectory,\n });\n const bootstrapRead = await readBootstrapStateForDiagnostics({\n openMeldProfileId: input.profile.openMeldProfileId,\n readBootstrapState: input.deps.readBootstrapState,\n });\n const targetAgent = resolveDiagnosticsTargetAgent({\n bootstrapRead,\n listedAgents,\n workspaceAgents,\n });\n const authStatus = await resolveOpenClawAuthStatus({\n agents: listedAgents,\n targetAgent,\n });\n const status = resolveBootstrapStatusForDiagnostics({\n bootstrapRead,\n error: input.error,\n expectedWorkspace: input.providerRuntimeWorkingDirectory,\n targetAgent,\n workspaceAgents,\n });\n\n return {\n agentId: targetAgent?.agentId ?? bootstrapRead.agentId ?? null,\n authStatus,\n bootstrapResolution: null,\n bootstrapStatus: status.bootstrapStatus,\n errorCode: status.errorCode,\n gatewayHealth: \"unhealthy\",\n gatewayVisibility: \"not_checked\",\n message: status.message,\n workspaceDir: input.providerRuntimeWorkingDirectory,\n };\n}\n\nasync function resolveInspectGatewayVisibility(input: {\n agentId: string;\n cwd: string;\n deps: OpenClawLocalDiagnosticsDeps;\n openClawBin?: string;\n}): Promise<{\n errorCode: string | null;\n gatewayVisibility: OpenClawGatewayVisibilityDiagnosticStatus;\n message: string | null;\n}> {\n try {\n const agents = await input.deps.listGatewayAgents({\n cwd: input.cwd,\n openClawBin: input.openClawBin,\n });\n return {\n errorCode: null,\n gatewayVisibility: agents.some((agent) => agent.agentId === input.agentId)\n ? \"visible\"\n : \"not_visible\",\n message: null,\n };\n } catch (error) {\n return {\n errorCode: extractErrorCode(error),\n gatewayVisibility: \"not_checked\",\n message: toErrorMessage(error),\n };\n }\n}\n\nfunction resolveDiagnosticsFailureDetail(input: {\n error: unknown;\n inspected: OpenClawLocalDiagnostics;\n}): {\n errorCode: string | null;\n message: string | null;\n} {\n const inspectedErrorCode =\n typeof input.inspected.errorCode === \"string\" &&\n input.inspected.errorCode.trim().length > 0\n ? input.inspected.errorCode.trim()\n : null;\n const inspectedMessage =\n typeof input.inspected.message === \"string\" &&\n input.inspected.message.trim().length > 0\n ? input.inspected.message.trim()\n : null;\n return {\n errorCode: inspectedErrorCode ?? extractErrorCode(input.error),\n message: inspectedMessage ?? toErrorMessage(input.error),\n };\n}\n\nfunction resolveDiagnosticsTargetAgent(input: {\n bootstrapRead: DiagnosticsBootstrapRead;\n listedAgents: OpenClawAgentSummary[];\n workspaceAgents: OpenClawAgentSummary[];\n}): OpenClawAgentSummary | null {\n if (input.bootstrapRead.kind === \"existing\" && input.bootstrapRead.agentId) {\n return (\n findOpenClawAgentById({\n agentId: input.bootstrapRead.agentId,\n agents: input.listedAgents,\n }) ??\n (input.workspaceAgents.length === 1\n ? (input.workspaceAgents[0] ?? null)\n : null)\n );\n }\n return input.workspaceAgents.length === 1\n ? (input.workspaceAgents[0] ?? null)\n : null;\n}\n\nasync function readBootstrapStateForDiagnostics(input: {\n openMeldProfileId: string;\n readBootstrapState: typeof readOpenClawLocalBootstrapState;\n}): Promise<DiagnosticsBootstrapRead> {\n try {\n const state = await input.readBootstrapState({\n openMeldProfileId: input.openMeldProfileId,\n });\n if (!state) {\n return {\n agentId: null,\n error: null,\n kind: \"missing\",\n };\n }\n return {\n agentId: state.agentId,\n error: null,\n kind: \"existing\",\n };\n } catch (error) {\n return {\n agentId: null,\n error:\n error && typeof error === \"object\" && \"code\" in error && \"path\" in error\n ? (error as OpenClawLocalBootstrapStoreError)\n : null,\n kind: \"invalid\",\n };\n }\n}\n\nfunction resolveBootstrapStatusForDiagnostics(input: {\n bootstrapRead: DiagnosticsBootstrapRead;\n error: unknown;\n expectedWorkspace: string;\n targetAgent: OpenClawAgentSummary | null;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n const explicitDiagnostic = resolveExplicitBootstrapDiagnostic(input.error);\n if (explicitDiagnostic) {\n return explicitDiagnostic;\n }\n\n switch (input.bootstrapRead.kind) {\n case \"existing\":\n return resolveExistingBootstrapStatus({\n expectedWorkspace: input.expectedWorkspace,\n targetAgent: input.targetAgent,\n workspaceAgents: input.workspaceAgents,\n });\n case \"invalid\":\n return resolveInvalidBootstrapStatus({\n bootstrapRead: input.bootstrapRead,\n error: input.error,\n workspaceAgents: input.workspaceAgents,\n });\n case \"missing\":\n return resolveMissingBootstrapStatus(input.workspaceAgents);\n default: {\n const unexpectedBootstrapRead: never = input.bootstrapRead;\n throw new Error(\n `Unexpected OpenClaw bootstrap read kind: ${String(unexpectedBootstrapRead)}`\n );\n }\n }\n}\n\nfunction buildBootstrapDiagnosticStatus(\n bootstrapStatus: OpenClawBootstrapStatus,\n errorCode: string | null,\n message: string | null\n): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n return {\n bootstrapStatus,\n errorCode,\n message,\n };\n}\n\nfunction resolveExplicitBootstrapDiagnostic(error: unknown): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} | null {\n const explicitErrorCode = extractErrorCode(error);\n const explicitMessage = error ? toErrorMessage(error) : null;\n switch (explicitErrorCode) {\n case \"openclaw.bootstrap.binding_conflict\":\n return buildBootstrapDiagnosticStatus(\n \"binding_conflict\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.workspace_mismatch\":\n return buildBootstrapDiagnosticStatus(\n \"workspace_mismatch\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.workspace_ambiguous\":\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n explicitErrorCode,\n explicitMessage\n );\n case \"openclaw.bootstrap.state_invalid\":\n case \"openclaw.bootstrap.version_mismatch\":\n return buildBootstrapDiagnosticStatus(\n \"invalid\",\n explicitErrorCode,\n explicitMessage\n );\n default:\n return null;\n }\n}\n\nfunction resolveExistingBootstrapStatus(input: {\n expectedWorkspace: string;\n targetAgent: OpenClawAgentSummary | null;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (!input.targetAgent) {\n return resolveMissingBootstrapStatus(input.workspaceAgents, {\n missingAgentMeansConflict: true,\n });\n }\n if (\n !matchesExpectedWorkspace({\n actualWorkspace: input.targetAgent.workspace,\n expectedWorkspace: input.expectedWorkspace,\n })\n ) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_mismatch\",\n \"openclaw.bootstrap.workspace_mismatch\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\"healthy\", null, null);\n}\n\nfunction resolveInvalidBootstrapStatus(input: {\n bootstrapRead: Extract<DiagnosticsBootstrapRead, { kind: \"invalid\" }>;\n error: unknown;\n workspaceAgents: OpenClawAgentSummary[];\n}): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (input.workspaceAgents.length > 1) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n \"openclaw.bootstrap.workspace_ambiguous\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\n \"invalid\",\n input.bootstrapRead.error?.code ?? extractErrorCode(input.error),\n input.bootstrapRead.error?.message ??\n (input.error ? toErrorMessage(input.error) : null)\n );\n}\n\nfunction resolveMissingBootstrapStatus(\n workspaceAgents: OpenClawAgentSummary[],\n input: { missingAgentMeansConflict?: boolean } = {}\n): {\n bootstrapStatus: OpenClawBootstrapStatus;\n errorCode: string | null;\n message: string | null;\n} {\n if (workspaceAgents.length > 1) {\n return buildBootstrapDiagnosticStatus(\n \"workspace_ambiguous\",\n \"openclaw.bootstrap.workspace_ambiguous\",\n null\n );\n }\n if (input.missingAgentMeansConflict && workspaceAgents.length === 1) {\n return buildBootstrapDiagnosticStatus(\n \"binding_conflict\",\n \"openclaw.bootstrap.binding_conflict\",\n null\n );\n }\n return buildBootstrapDiagnosticStatus(\"missing\", null, null);\n}\n\nfunction mapGatewayVisibilityPayload(\n visibility: NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n >\n): OpenClawGatewayVisibilityDiagnosticStatus {\n return visibility.gatewayVisibility === \"visible_after_restart\"\n ? \"restarted_then_visible\"\n : \"visible\";\n}\n\nfunction resolveGatewayVisibilityFailureStatus(\n error: unknown\n): OpenClawGatewayVisibilityDiagnosticStatus {\n const providerErrorCode = extractProviderErrorCode(error);\n if (providerErrorCode === \"openclaw.gateway.restart_failed\") {\n return \"restart_failed\";\n }\n if (\n providerErrorCode === \"openclaw.gateway.agent_not_visible\" ||\n providerErrorCode === \"openclaw.gateway.invalid_agent_id\"\n ) {\n return \"not_visible\";\n }\n const openClawGatewayVisibility = extractGatewayVisibilityPayload(error);\n if (\n openClawGatewayVisibility?.gatewayVisibility === \"missing_after_restart\"\n ) {\n return \"not_visible\";\n }\n if (\n openClawGatewayVisibility?.gatewayVisibility === \"missing_before_restart\"\n ) {\n return \"restart_failed\";\n }\n return \"not_checked\";\n}\n\nfunction resolveDiagnosticsRuntimeContext(\n providerRuntimeWorkingDirectory: string\n): ProviderDispatchRuntimeContext {\n const parsed = providerDispatchRuntimeContextSchema.safeParse({\n providerRuntimeWorkingDirectory,\n });\n if (parsed.success) {\n return parsed.data;\n }\n const validationDetails = parsed.error.issues\n .map((issue) => {\n const path =\n issue.path.length > 0\n ? issue.path.join(\".\")\n : \"providerRuntimeWorkingDirectory\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n throw new Error(\n `invalid OpenClaw providerRuntimeWorkingDirectory: ${validationDetails}`\n );\n}\n\nfunction hasGatewayVisibilityPayload(error: unknown): boolean {\n return extractGatewayVisibilityPayload(error) !== null;\n}\n\nfunction extractGatewayVisibilityPayload(\n error: unknown\n): NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n> | null {\n if (!(error && typeof error === \"object\")) {\n return null;\n }\n const openClawGatewayVisibility = (\n error as {\n openClawGatewayVisibility?: NonNullable<\n OpenMeldDaemonTaskResultPayload[\"openClawGatewayVisibility\"]\n > | null;\n }\n ).openClawGatewayVisibility;\n return openClawGatewayVisibility ?? null;\n}\n\nfunction extractErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n const normalized = String((error as { code?: unknown }).code ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction extractProviderErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"providerErrorCode\" in error)) {\n return null;\n }\n const normalized = String(\n (error as { providerErrorCode?: unknown }).providerErrorCode ?? \"\"\n ).trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import {\n OPENMELD_HEADER_PROFILE_ID,\n toErrorMessage,\n} from \"@openmeld/gateway-contract\";\nimport {\n getAuthSessionState,\n type StoredAuthSession,\n} from \"../config/auth-session\";\nimport { resolveBaseUrl } from \"../config/base-url\";\nimport {\n type OpenMeldEnvPreset,\n resolveOpenMeldEnvPreset,\n} from \"../config/paths\";\nimport { buildRequestAuthHeaders } from \"../config/request-headers\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport { DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS as STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS } from \"../strategy-constants\";\n\nexport const DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS =\n STRATEGY_DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS;\n\nexport type GatewayChainFailureKind =\n | \"gateway_unreachable\"\n | \"auth_required\"\n | \"local_dev_session_missing\"\n | \"dispatch_storage_not_ready\"\n | \"chain_unhealthy_unknown\";\n\nexport type GatewayChainReadiness =\n | {\n applicable: false;\n baseUrl: string | null;\n checkedAt: string;\n details: null;\n errorCode: null;\n errorMessage: null;\n failureKind: null;\n ready: true;\n status: null;\n summary: string;\n }\n | {\n applicable: true;\n baseUrl: string;\n checkedAt: string;\n details: null;\n errorCode: null;\n errorMessage: null;\n failureKind: null;\n ready: true;\n status: number;\n summary: string;\n }\n | {\n applicable: true;\n baseUrl: string;\n checkedAt: string;\n details: string;\n errorCode: string | null;\n errorMessage: string | null;\n failureKind: GatewayChainFailureKind;\n ready: false;\n status: number | null;\n summary: string;\n };\n\nexport type GatewayChainGuidance = {\n nextSteps: string[];\n summary: string;\n};\n\nexport type GatewayChainProfile = {\n openMeldProfileId: string;\n profileName?: string | null;\n};\n\nexport async function resolveGatewayChainReadiness(\n input: {\n authSession?: StoredAuthSession | null;\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n profile?: GatewayChainProfile | null;\n timeoutMs?: number;\n } = {}\n): Promise<GatewayChainReadiness> {\n const checkedAt = new Date().toISOString();\n const authSession =\n input.authSession === undefined\n ? await resolveGatewayChainAuthSession()\n : input.authSession;\n const profile = input.profile ?? null;\n\n if (!(authSession && profile?.openMeldProfileId)) {\n return {\n applicable: false,\n baseUrl: null,\n checkedAt,\n details: null,\n errorCode: null,\n errorMessage: null,\n failureKind: null,\n ready: true,\n status: null,\n summary:\n \"Gateway chain check is not applicable for this local connection check.\",\n };\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const fallbackBaseUrl = resolveGatewayChainFailureBaseUrl(input.baseUrl);\n\n try {\n const baseUrl = await resolveBaseUrl(input.baseUrl);\n const endpoint = new URL(\"/v1/diagnostics/chain\", baseUrl).toString();\n const headers = await buildRequestAuthHeaders({\n authSession,\n requestUrl: endpoint,\n });\n headers[OPENMELD_HEADER_PROFILE_ID] = profile.openMeldProfileId;\n const response = await fetchImpl(endpoint, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(\n input.timeoutMs ?? DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS\n ),\n });\n const raw = await response.text();\n if (response.ok) {\n return {\n applicable: true,\n baseUrl,\n checkedAt,\n details: null,\n errorCode: null,\n errorMessage: null,\n failureKind: null,\n ready: true,\n status: response.status,\n summary: \"Gateway auth chain is healthy.\",\n };\n }\n\n const errorDetails = resolveGatewayErrorDetails(raw);\n const failureKind = classifyGatewayChainFailure({\n code: errorDetails.code,\n message: errorDetails.message || errorDetails.details,\n status: response.status,\n });\n return {\n applicable: true,\n baseUrl,\n checkedAt,\n details: formatGatewayHttpFailure(response.status, raw),\n errorCode: errorDetails.code,\n errorMessage: errorDetails.message,\n failureKind,\n ready: false,\n status: response.status,\n summary: describeGatewayChainFailure(failureKind),\n };\n } catch (error) {\n return {\n applicable: true,\n baseUrl: fallbackBaseUrl,\n checkedAt,\n details: toErrorMessage(error),\n errorCode: null,\n errorMessage: toErrorMessage(error),\n failureKind: \"gateway_unreachable\",\n ready: false,\n status: null,\n summary: describeGatewayChainFailure(\"gateway_unreachable\"),\n };\n }\n}\n\nfunction resolveGatewayChainFailureBaseUrl(value: string | undefined): string {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : \"unknown\";\n}\n\nexport function classifyGatewayChainFailure(input: {\n code?: string | null;\n message?: string | null;\n status?: number | null;\n}): GatewayChainFailureKind {\n const status = input.status ?? null;\n const code = String(input.code ?? \"\")\n .trim()\n .toLowerCase();\n const message = String(input.message ?? \"\")\n .trim()\n .toLowerCase();\n const combined = [code, message]\n .filter((value) => value.length > 0)\n .join(\" \");\n\n if (\n combined.includes(\"core dispatch storage is not ready\") ||\n combined.includes(\"shared openmeld_db migration is missing\") ||\n combined.includes(\"apply the shared db gate\")\n ) {\n return \"dispatch_storage_not_ready\";\n }\n\n if (\n combined.includes(\"gatewayauthrpcentrypoint\") ||\n combined.includes(\"resolverequestauth\") ||\n combined.includes(\"couldn't find a local dev session\") ||\n combined.includes('worker \"openmeld-auth\" not found')\n ) {\n return \"local_dev_session_missing\";\n }\n\n if (\n status === 401 ||\n status === 403 ||\n combined.includes(\"auth.unauthenticated\") ||\n combined.includes(\"authentication required\")\n ) {\n return \"auth_required\";\n }\n\n if (\n combined.includes(\"upstream_unreachable\") ||\n combined.includes(\"network.timeout\") ||\n combined.includes(\"timed out\") ||\n combined.includes(\"gateway is unreachable\") ||\n combined.includes(\"can't reach the gateway\")\n ) {\n return \"gateway_unreachable\";\n }\n\n return \"chain_unhealthy_unknown\";\n}\n\nexport function formatGatewayHttpFailure(status: number, raw: string): string {\n const details = extractGatewayErrorDetails(raw);\n if (details) {\n return `HTTP ${status}: ${details}`;\n }\n return `HTTP ${status}`;\n}\n\nexport function extractGatewayErrorDetails(raw: string): string {\n return resolveGatewayErrorDetails(raw).details;\n}\n\nexport function resolveGatewayChainRepairGuidance(input: {\n failureKind?: GatewayChainFailureKind | null;\n lane?: OpenMeldEnvPreset;\n}): GatewayChainGuidance {\n const lane = input.lane ?? resolveOpenMeldEnvPreset();\n if (input.failureKind === \"dispatch_storage_not_ready\") {\n if (lane !== \"dev-local\") {\n return {\n nextSteps: [\n \"Retry the OpenMeld command shortly.\",\n \"If this continues, contact OpenMeld support with the latest command output.\",\n ],\n summary:\n \"OpenMeld cloud execution storage is temporarily unavailable. Retry shortly; if it continues, contact OpenMeld support.\",\n };\n }\n return {\n nextSteps: [\n \"pnpm db:migrate:dev\",\n \"pnpm db:verify:dev\",\n \"pnpm dev:stop\",\n \"pnpm dev\",\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ],\n summary:\n \"Run `pnpm db:migrate:dev`, then `pnpm db:verify:dev`, then restart the local OpenMeld dev stack with `pnpm dev:stop` and `pnpm dev`, then verify with `openmeld service status`.\",\n };\n }\n\n if (lane === \"dev-local\") {\n const repairCommand = formatOpenMeldCliCommand(\"openmeld doctor --repair\");\n return {\n nextSteps: [\"pnpm dev:stop\", \"pnpm dev\", repairCommand],\n summary:\n input.failureKind === \"local_dev_session_missing\"\n ? `Run \\`pnpm dev:stop\\`, then \\`pnpm dev\\`, then \\`${repairCommand}\\`.`\n : `Restart the local OpenMeld dev stack with \\`pnpm dev:stop\\` and \\`pnpm dev\\`, then run \\`${repairCommand}\\`.`,\n };\n }\n\n const statusCommand = formatOpenMeldCliCommand(\"openmeld service status\");\n const repairCommand = formatOpenMeldCliCommand(\"openmeld doctor --repair\");\n return {\n nextSteps: [statusCommand, repairCommand],\n summary: `Run \\`${statusCommand}\\`; if unhealthy run \\`${repairCommand}\\`.`,\n };\n}\n\nexport function resolveGatewayChainRetryGuidance(input: {\n failureKind: GatewayChainFailureKind;\n lane?: OpenMeldEnvPreset;\n}): GatewayChainGuidance {\n const repairGuidance = resolveGatewayChainRepairGuidance(input);\n const retrySummary = repairGuidance.summary.endsWith(\".\")\n ? `${repairGuidance.summary.slice(0, -1)}, then retry.`\n : `${repairGuidance.summary}, then retry.`;\n return {\n nextSteps: repairGuidance.nextSteps,\n summary: retrySummary,\n };\n}\n\nfunction describeGatewayChainFailure(\n failureKind: GatewayChainFailureKind\n): string {\n switch (failureKind) {\n case \"local_dev_session_missing\":\n return \"OpenMeld gateway can't reach the local OpenMeld auth worker session.\";\n case \"auth_required\":\n return \"Gateway auth chain requires sign-in for this OpenMeld environment.\";\n case \"dispatch_storage_not_ready\":\n return \"OpenMeld cloud execution storage is temporarily unavailable.\";\n case \"gateway_unreachable\":\n return \"Gateway auth chain is unavailable.\";\n default:\n return \"Gateway auth chain is unhealthy.\";\n }\n}\n\nasync function resolveGatewayChainAuthSession(): Promise<StoredAuthSession | null> {\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n if (authState?.state !== \"valid\" || !authState.session) {\n return null;\n }\n return authState.session;\n}\n\nfunction resolveGatewayErrorDetails(raw: string): {\n code: string | null;\n details: string;\n message: string | null;\n} {\n const text = raw.trim();\n if (!text) {\n return {\n code: null,\n details: \"\",\n message: null,\n };\n }\n\n const parsed = parseJson(text);\n if (!parsed || typeof parsed !== \"object\") {\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n }\n\n const payload = parsed as {\n error?: unknown;\n };\n if (!payload.error || typeof payload.error !== \"object\") {\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n }\n\n const error = payload.error as {\n code?: unknown;\n message?: unknown;\n };\n const code = typeof error.code === \"string\" ? error.code : null;\n const message = typeof error.message === \"string\" ? error.message : null;\n\n if (code && message) {\n return {\n code,\n details: `${code}: ${message}`,\n message,\n };\n }\n if (message) {\n return {\n code,\n details: message,\n message,\n };\n }\n if (code) {\n return {\n code,\n details: code,\n message,\n };\n }\n return {\n code: null,\n details: truncateText(text),\n message: null,\n };\n}\n\nfunction parseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction truncateText(text: string, maxLength = 220): string {\n if (text.length <= maxLength) {\n return text;\n }\n return `${text.slice(0, maxLength)}...`;\n}\n","import type { OpenClawLocalDiagnostics } from \"../../../provider-hosts/openclaw/diagnostics\";\n\nexport type OpenClawDiagnosticsGuidance = {\n nextCommands: string[];\n summary: string;\n};\n\nexport function resolveOpenClawDiagnosticsGuidance(input: {\n diagnostics: OpenClawLocalDiagnostics;\n profileId: string;\n}): OpenClawDiagnosticsGuidance {\n const diagnostics = input.diagnostics;\n const setupCommand = `openmeld setup --profile ${input.profileId}`;\n if (diagnostics.bootstrapStatus !== \"healthy\") {\n const bootstrapCommandUnavailableSummary =\n resolveBootstrapCommandUnavailableSummary(diagnostics.message);\n if (bootstrapCommandUnavailableSummary) {\n return {\n summary: bootstrapCommandUnavailableSummary,\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n switch (diagnostics.bootstrapStatus) {\n case \"binding_conflict\":\n return {\n summary:\n \"OpenMeld found a local OpenClaw binding conflict for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"workspace_mismatch\":\n return {\n summary:\n \"OpenMeld found a local OpenClaw workspace mismatch for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"workspace_ambiguous\":\n return {\n summary:\n \"OpenMeld found multiple OpenClaw agents claiming the same OpenMeld-managed workspace for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"invalid\":\n return {\n summary:\n \"OpenMeld found an invalid local OpenClaw bootstrap state for this profile.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n default:\n return {\n summary:\n \"OpenMeld could not find a healthy local OpenClaw bootstrap for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n }\n\n if (diagnostics.gatewayHealth !== \"healthy\") {\n return {\n summary: \"The local OpenClaw Gateway is not healthy on this device.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n }\n\n switch (diagnostics.gatewayVisibility) {\n case \"restart_failed\":\n return {\n summary:\n \"OpenMeld could not restart the local OpenClaw Gateway while checking this profile.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n case \"not_visible\":\n return {\n summary:\n \"OpenMeld can reach the local OpenClaw Gateway, but this OpenClaw agent is still not visible there.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n case \"not_checked\":\n return {\n summary:\n \"OpenMeld could not verify local OpenClaw Gateway visibility for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n case \"restarted_then_visible\":\n case \"visible\":\n break;\n default:\n return {\n summary:\n \"OpenMeld could not verify local OpenClaw Gateway visibility for this profile yet.\",\n nextCommands: [setupCommand, \"openclaw health --json\"],\n };\n }\n\n if (diagnostics.authStatus === \"source_missing\") {\n return {\n summary:\n \"OpenMeld could not find a default OpenClaw auth source on this device.\",\n nextCommands: [setupCommand, \"openclaw agents list\"],\n };\n }\n\n return {\n summary: \"This OpenClaw profile can handle OpenMeld local replies.\",\n nextCommands: [\n `openmeld space send YOUR_SPACE_ID \"@YOUR_WAKE_HANDLE hello\"`,\n ],\n };\n}\n\nfunction resolveBootstrapCommandUnavailableSummary(\n message: string | null | undefined\n): string | null {\n const normalized = String(message ?? \"\")\n .trim()\n .toLowerCase();\n if (!normalized.includes(\"openclaw is not installed or not on path\")) {\n return null;\n }\n return \"OpenMeld could not start OpenClaw on this device. Install OpenClaw or fix its PATH for background services, then try again.\";\n}\n","import {\n resolvePublicAgentAvailabilityCopy,\n resolvePublicAgentFailureRecovery,\n} from \"@openmeld/schemas\";\nimport type {\n ReplyReadinessLevel,\n ReplyReadinessReasonCode,\n} from \"@openmeld/schemas/types\";\n\ntype CliOnlyReplyReadinessReasonCode =\n | \"controller.binding.disabled\"\n | \"local_agents.none_needed\"\n | \"profile.inactive\"\n | \"profile.not_selected\"\n | \"projection.missing\"\n | \"runtime.adapter.unsupported\"\n | \"service.account_mismatch\"\n | \"service.auth_missing\"\n | \"service.auth_stale\"\n | \"service.gateway_chain_unhealthy\";\n\ntype SharedRecoveryOnlyReplyReadinessReasonCode =\n | \"controller.launch.choice_required\"\n | \"controller.launch.needs_repair\"\n | \"dispatch.storage_not_ready\"\n | \"workspace.invalid\"\n | \"workspace.missing\";\n\nconst DEFAULT_CLI_GUIDANCE_SUMMARY =\n \"This profile can't reply until local setup is fixed.\";\n\n// These codes describe CLI-only local inspection facts. Every other\n// ReplyReadinessReasonCode is shared with the public schemas dictionary.\nconst CLI_ONLY_AVAILABILITY_COPY = {\n \"controller.binding.disabled\":\n \"The local agent connection is turned off for this profile.\",\n \"local_agents.none_needed\":\n \"No local agents on this device need OpenMeld Service right now.\",\n \"profile.inactive\": \"This profile is not active.\",\n \"profile.not_selected\":\n \"Choose an Agent Profile to check local reply routes.\",\n \"projection.missing\":\n \"OpenMeld is still setting up this device. Run `openmeld doctor --repair`.\",\n \"runtime.adapter.unsupported\":\n \"The local agent controller setup is not supported.\",\n \"service.account_mismatch\":\n \"OpenMeld Service is signed in to a different OpenMeld account.\",\n \"service.auth_missing\": \"OpenMeld Service is not signed in.\",\n \"service.auth_stale\": \"OpenMeld Service needs a fresh sign-in.\",\n \"service.gateway_chain_unhealthy\":\n \"The OpenMeld gateway authentication chain is unavailable.\",\n} as const satisfies Record<CliOnlyReplyReadinessReasonCode, string>;\n\nconst CLI_ONLY_GUIDANCE_COPY = {\n \"controller.binding.disabled\": \"This profile's agent is turned off.\",\n \"local_agents.none_needed\":\n \"This device does not need OpenMeld Service until you choose local agents to bring into a space.\",\n \"profile.inactive\": \"Choose an active agent profile first.\",\n \"profile.not_selected\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"projection.missing\": \"OpenMeld is still setting up this device.\",\n \"runtime.adapter.unsupported\":\n \"This agent setup can't reply from this device.\",\n \"service.account_mismatch\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.auth_missing\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.auth_stale\": DEFAULT_CLI_GUIDANCE_SUMMARY,\n \"service.gateway_chain_unhealthy\":\n \"OpenMeld can't reach the gateway for this device yet.\",\n} as const satisfies Record<CliOnlyReplyReadinessReasonCode, string>;\n\nexport const REPLY_READINESS_COPY = {\n agentReadyReason: \"This profile can reply from Space when mentioned\",\n canReplyLabel: \"Can reply\",\n deviceReadyReason:\n \"This device is ready for Space replies from local agent profiles\",\n localAgentRecoveryTargetLabel: \"A local agent\",\n manualSpaceParticipation:\n \"You can still join the space and send messages yourself.\",\n spaceMember: {\n agentsListRepairInstruction:\n \"Use `openmeld agents list` to find the local agent that needs repair.\",\n checkProfileInstruction:\n \"Open Local Agents in OpenMeld Web and check this profile.\",\n connectedBadge: \"Local setup connected\",\n fallbackLocalTargetLabel: \"this local agent\",\n fallbackProfileLabel: \"This agent\",\n incompleteReason: \"Local setup on this device is still incomplete.\",\n joinsOnlyBadge: \"Joins only for now\",\n needsRepairBadge: \"Needs repair\",\n reconnectProfileInstruction:\n \"Open this Agent in OpenMeld Web and reconnect it to the right local agent on this device.\",\n selectProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and choose the local agent that should handle work from the Space.\",\n turnOnProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and turn on its local agent connection.\",\n },\n guidance: {\n readyMentionInstruction:\n \"Choose Wake in the Space, or send with --wake <agent-profile-id>.\",\n readySummary:\n \"This agent can reply when you select it as a Wake recipient.\",\n selectProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and choose a local agent.\",\n turnOnProfileAgentInstruction:\n \"Open this Agent in OpenMeld Web and turn on its local agent connection.\",\n },\n} as const;\n\nconst REPLY_READINESS_LABEL_PREFIX = {\n blocked: \"Blocked\",\n degraded: \"Limited\",\n unknown: \"Unknown\",\n} as const satisfies Record<Exclude<ReplyReadinessLevel, \"ready\">, string>;\n\nexport function resolveReplyReadinessAvailabilityReasonCopy(\n reasonCode: ReplyReadinessReasonCode\n): string {\n // Availability surfaces describe the current local device, so they must use\n // the shared availabilitySummary tense rather than recovery instructions.\n const sharedAvailability =\n resolvePublicAgentAvailabilityCopy(reasonCode)?.availabilitySummary;\n if (sharedAvailability) {\n return adaptSharedCopyToLocalDevice(sharedAvailability);\n }\n if (isCliOnlyReplyReadinessReasonCode(reasonCode)) {\n return CLI_ONLY_AVAILABILITY_COPY[reasonCode];\n }\n throw new Error(\n `Shared availability copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n}\n\nexport function resolveReplyReadinessStatusReasonCopy(\n reasonCode: ReplyReadinessReasonCode\n): string {\n // These codes are local check failures, not simple availability facts, and\n // the shared dictionary intentionally exposes only their recovery body. The\n // readiness reason slot therefore uses that shared failure/recovery domain.\n if (isSharedRecoveryOnlyReplyReadinessReasonCode(reasonCode)) {\n return resolveSharedRecoveryBody(reasonCode);\n }\n return resolveReplyReadinessAvailabilityReasonCopy(reasonCode);\n}\n\nexport function resolveReplyReadinessGuidanceSummaryCopy(\n reasonCode: ReplyReadinessReasonCode,\n context: { targetLabel?: string } = {}\n): string {\n // Guidance explains a failure and its repair path, so the shared recovery\n // body is the canonical source rather than the present-tense availability.\n if (isCliOnlyReplyReadinessReasonCode(reasonCode)) {\n return CLI_ONLY_GUIDANCE_COPY[reasonCode];\n }\n return resolveSharedRecoveryBody(reasonCode, context.targetLabel);\n}\n\nexport function resolveReplyReadinessReconnectingReasonCopy(): string {\n return requireSharedAvailabilitySummary(\"local_service.reconnecting\");\n}\n\nexport function formatReplyReadinessUnavailableLabelCopy(\n level: Exclude<ReplyReadinessLevel, \"ready\">,\n reasonText: string\n): string {\n return `${REPLY_READINESS_LABEL_PREFIX[level]} (${reasonText})`;\n}\n\nexport function formatManualSpaceParticipationReasonCopy(\n availabilityReason: string\n): string {\n return `${availabilityReason} ${REPLY_READINESS_COPY.manualSpaceParticipation}`;\n}\n\nexport function formatSpaceMemberCommandRecoveryCopy(\n formattedCommand: string\n): string {\n return `Use \\`${formattedCommand}\\` to check the local reply path.`;\n}\n\nfunction resolveSharedRecoveryBody(\n reasonCode: ReplyReadinessReasonCode,\n targetLabel = \"This profile\"\n): string {\n const recovery = resolvePublicAgentFailureRecovery({\n errorCode: reasonCode,\n includeUnknown: false,\n targetLabel,\n });\n if (!recovery) {\n throw new Error(\n `Shared recovery copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n }\n return adaptSharedCopyToLocalDevice(recovery.body);\n}\n\nfunction requireSharedAvailabilitySummary(reasonCode: string): string {\n const availabilitySummary =\n resolvePublicAgentAvailabilityCopy(reasonCode)?.availabilitySummary;\n if (!availabilitySummary) {\n throw new Error(\n `Shared availability copy is missing for CLI reply-readiness reason code: ${reasonCode}`\n );\n }\n return adaptSharedCopyToLocalDevice(availabilitySummary);\n}\n\nfunction isCliOnlyReplyReadinessReasonCode(\n reasonCode: ReplyReadinessReasonCode\n): reasonCode is CliOnlyReplyReadinessReasonCode {\n return Object.hasOwn(CLI_ONLY_AVAILABILITY_COPY, reasonCode);\n}\n\nfunction isSharedRecoveryOnlyReplyReadinessReasonCode(\n reasonCode: ReplyReadinessReasonCode\n): reasonCode is SharedRecoveryOnlyReplyReadinessReasonCode {\n return SHARED_RECOVERY_ONLY_REASON_CODES.has(reasonCode);\n}\n\nconst SHARED_RECOVERY_ONLY_REASON_CODES: ReadonlySet<ReplyReadinessReasonCode> =\n new Set([\n \"controller.launch.choice_required\",\n \"controller.launch.needs_repair\",\n \"dispatch.storage_not_ready\",\n \"workspace.invalid\",\n \"workspace.missing\",\n ] satisfies readonly SharedRecoveryOnlyReplyReadinessReasonCode[]);\n\nfunction adaptSharedCopyToLocalDevice(copy: string): string {\n // Shared copy speaks about another agent's computer. The CLI runs on the\n // inspected machine, so only the subject is adapted; the sentence and\n // recovery meaning remain owned by @openmeld/schemas.\n return copy\n .replaceAll(\"its computer\", \"this device\")\n .replaceAll(\"this computer\", \"this device\");\n}\n","import { providerDispatchRuntimeContextSchema } from \"@openmeld/schemas\";\nimport type {\n ProviderDispatchRuntimeContext,\n ReplyReadinessLevel as SharedReplyReadinessLevel,\n ReplyReadinessReasonCode as SharedReplyReadinessReasonCode,\n} from \"@openmeld/schemas/types\";\nimport { resolveAgentTargetState } from \"../agents/registry\";\nimport { resolveRegistryRuntimeAdapterContractByAgentControllerRef } from \"../agents/registry-source\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../config/daemon-state\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport type { OpenMeldProfile } from \"../config/openmeld-profiles-api\";\nimport { createDefaultRuntimeAgentControllerSettings } from \"../config/runtime-config\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport {\n classifyDaemonServiceWakeability,\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES,\n type DaemonServiceWakeabilityClassification,\n} from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport type { DaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n getEffectiveDaemonRuntimeStatus,\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport type { LocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport { resolveLocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport type { DeviceRuntimeStateSyncResult } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { syncDeviceRuntimeStateProjection } from \"../local-service/reporting/device-runtime-state-sync\";\nimport {\n type EffectiveProfileWorkingFolderRuntimeResolution,\n resolveEffectiveProfileWorkingFolderRuntime,\n} from \"../profile-workspace/effective-runtime-resolution\";\nimport {\n isOpenClawLocalDiagnosticsFailure,\n type OpenClawLocalDiagnostics,\n type OpenClawLocalDiagnosticsState,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport { prepareProviderRuntime } from \"../provider-hosts/prepare-provider-runtime\";\nimport {\n type AgentProfilePrimaryAgentControllerReport,\n resolveAgentProfilePrimaryAgentControllerReport,\n} from \"./agent-profile-primary-binding\";\nimport type {\n GatewayChainProfile,\n GatewayChainReadiness,\n} from \"./gateway-chain-readiness\";\nimport { resolveGatewayChainReadiness } from \"./gateway-chain-readiness\";\nimport type { PrimaryBindingReadSession } from \"./primary-binding-read-session\";\nimport { resolveOpenClawDiagnosticsGuidance } from \"./provider-diagnostics/openclaw/guidance\";\nimport {\n formatManualSpaceParticipationReasonCopy,\n formatReplyReadinessUnavailableLabelCopy,\n REPLY_READINESS_COPY,\n resolveReplyReadinessAvailabilityReasonCopy,\n resolveReplyReadinessGuidanceSummaryCopy,\n resolveReplyReadinessReconnectingReasonCopy,\n resolveReplyReadinessStatusReasonCopy,\n} from \"./reply-readiness-copy\";\n\nconst REPLY_READINESS_REASON_PRIORITY = [\n \"profile.not_selected\",\n \"profile.inactive\",\n \"profile.unbound\",\n \"controller.binding.disabled\",\n \"projection.missing\",\n \"controller.registry.disabled\",\n \"controller.launch.choice_required\",\n \"controller.launch.needs_repair\",\n \"workspace.missing\",\n \"workspace.invalid\",\n \"runtime.adapter.unsupported\",\n \"controller.bootstrap.failed\",\n \"controller.gateway.unhealthy\",\n \"service.not_installed\",\n \"service.drifted\",\n \"service.account_mismatch\",\n \"service.auth_missing\",\n \"service.auth_stale\",\n \"service.not_running\",\n \"dispatch.storage_not_ready\",\n \"service.gateway_chain_unhealthy\",\n \"local_agents.none_needed\",\n \"route.offline\",\n \"route.not_registered\",\n] satisfies readonly ReplyReadinessReasonCode[];\n\nexport type ReplyReadinessLevel = SharedReplyReadinessLevel;\n\nexport type ReplyReadinessReasonCode = SharedReplyReadinessReasonCode;\n\nexport type DeviceReplyReadinessStatus = {\n reasonCodes: ReplyReadinessReasonCode[];\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n serviceWakeability?: Pick<\n DaemonServiceWakeabilityClassification,\n | \"advisoryCodes\"\n | \"blockingCodes\"\n | \"conditionalCodes\"\n | \"executionEvidenceSafe\"\n >;\n updatedAt: string;\n wakeableRouteCount: number;\n};\n\nexport type AgentReplyReadinessStatus = {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n localAgentId?: string | null;\n profileId: string;\n reasonCodes: ReplyReadinessReasonCode[];\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n transportMode: string | null;\n updatedAt: string;\n};\n\ntype ResolveDeviceReplyReadinessInput = {\n baseUrl?: string;\n checkGatewayChain?: boolean;\n gatewayChainProfile?: GatewayChainProfile | null;\n gatewayChainReadiness?: GatewayChainReadiness | null;\n gatewayChainTimeoutMs?: number;\n inventory?: DaemonServiceInventory | null;\n localDemand?: LocalServiceDemand | null;\n ownerUserId?: string | null;\n profile?: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution?: EffectiveProfileWorkingFolderRuntimeResolution | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n runtimeWorkdir?: string;\n status?: DaemonStatus;\n};\n\ntype ResolveAgentReplyReadinessInput = {\n bindingReads?: PrimaryBindingReadSession;\n coreWakeRouteOnline?: boolean;\n deviceReplyReadiness?: DeviceReplyReadinessStatus;\n openClawLocalDiagnostics?: OpenClawLocalDiagnosticsState | null;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n profile: OpenMeldProfile;\n profileWorkspaceRuntimeResolution?: EffectiveProfileWorkingFolderRuntimeResolution | null;\n};\n\ntype AgentPrimaryRuntimeContext = {\n executionTarget: AgentProfilePrimaryAgentControllerReport | null;\n targetState: Awaited<ReturnType<typeof resolveAgentTargetState>> | null;\n transportMode: string | null;\n};\n\nexport async function resolveDeviceReplyReadinessStatus(\n input: ResolveDeviceReplyReadinessInput = {}\n): Promise<DeviceReplyReadinessStatus> {\n const status = input.status ?? (await getDaemonStatus());\n if (!status.installed) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_installed\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"service.not_installed\"\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n\n const inventory =\n input.inventory ?? (await resolveReplyReadinessInventory(status));\n const runtimeStatus =\n input.runtimeStatus ??\n inventory?.runtimeStatus ??\n (await resolveDaemonRuntimeState(status));\n const runtimeProjection = await resolveDeviceReadinessRuntimeProjection(\n input.runtimeProjection\n );\n const localDemand = await resolveDeviceReadinessLocalDemand({\n localDemand: input.localDemand,\n ownerUserId: input.ownerUserId,\n projection: runtimeProjection,\n runtimeWorkdir: input.runtimeWorkdir,\n });\n const profileWorkspaceRuntimeResolution =\n input.profileWorkspaceRuntimeResolution ??\n (input.profile?.profileKind === \"agent\"\n ? await resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: input.profile.defaultProjectId,\n openMeldProfileId: input.profile.openMeldProfileId,\n mode: \"inspect\",\n })\n : null);\n\n const serviceReadiness = await resolveDeviceReplyReadinessFromServiceState({\n inventory,\n localDemand,\n runtimeStatus,\n status,\n });\n if (serviceReadiness) {\n return serviceReadiness;\n }\n\n const gatewayChainReadiness =\n input.checkGatewayChain === true\n ? (input.gatewayChainReadiness ??\n (await resolveGatewayChainReadinessFromInput({\n baseUrl: input.baseUrl,\n profile: input.gatewayChainProfile ?? input.profile ?? null,\n timeoutMs: input.gatewayChainTimeoutMs,\n }).catch(() => null)))\n : null;\n if (gatewayChainReadiness?.applicable && !gatewayChainReadiness.ready) {\n const gatewayChainReasonCode =\n gatewayChainReadiness.failureKind === \"dispatch_storage_not_ready\"\n ? \"dispatch.storage_not_ready\"\n : \"service.gateway_chain_unhealthy\";\n return createDeviceReplyReadinessStatus({\n reasonCode: gatewayChainReasonCode,\n reasonText: gatewayChainReadiness.summary,\n replyReadiness: \"blocked\",\n wakeableRouteCount: localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n\n const profileWorkspaceReadiness =\n resolveDeviceReplyReadinessFromProfileWorkspace({\n localDemand,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n });\n if (profileWorkspaceReadiness) {\n return profileWorkspaceReadiness;\n }\n\n if (localDemand?.hasLocalExecutionRoute) {\n return createDeviceReplyReadinessStatus({\n reasonText: REPLY_READINESS_COPY.deviceReadyReason,\n replyReadiness: \"ready\",\n wakeableRouteCount: localDemand.localExecutionRouteCount,\n });\n }\n\n const projectionBlockedStatus =\n resolveDeviceReplyReadinessFromRuntimeProjection(runtimeProjection);\n if (projectionBlockedStatus) {\n return projectionBlockedStatus;\n }\n\n return createRouteNotRegisteredReplyReadinessStatus({\n localDemand,\n runtimeProjection,\n });\n}\n\nasync function resolveGatewayChainReadinessFromInput(input: {\n baseUrl?: string;\n profile: GatewayChainProfile | OpenMeldProfile | null;\n timeoutMs?: number;\n}): Promise<GatewayChainReadiness | null> {\n if (!input.profile) {\n return null;\n }\n\n return await resolveGatewayChainReadiness({\n baseUrl: input.baseUrl,\n profile: {\n openMeldProfileId: input.profile.openMeldProfileId,\n profileName: input.profile.profileName,\n },\n timeoutMs: input.timeoutMs,\n });\n}\n\nexport async function resolveAgentReplyReadinessStatus(\n input: ResolveAgentReplyReadinessInput\n): Promise<AgentReplyReadinessStatus | null> {\n if (input.profile.profileKind !== \"agent\") {\n return null;\n }\n\n const deviceReplyReadiness =\n input.deviceReplyReadiness ??\n (await resolveDeviceReplyReadinessStatus({\n ownerUserId: input.profile.ownerUserId,\n profile: input.profile,\n profileWorkspaceRuntimeResolution:\n input.profileWorkspaceRuntimeResolution,\n }));\n const profileWorkspaceRuntimeResolution =\n input.profileWorkspaceRuntimeResolution ??\n (await resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: input.profile.defaultProjectId,\n openMeldProfileId: input.profile.openMeldProfileId,\n mode: \"inspect\",\n }));\n const { executionTarget, targetState, transportMode } =\n await resolveAgentPrimaryRuntimeContext({\n bindingReads: input.bindingReads,\n primaryAgentControllerReport: input.primaryAgentControllerReport,\n profile: input.profile,\n });\n const localAgentId = executionTarget?.localAgentId ?? null;\n const deviceReasonCodes = resolveAgentDeviceReasonCodes({\n coreWakeRouteOnline: input.coreWakeRouteOnline === true,\n deviceReasonCodes: deviceReplyReadiness.reasonCodes,\n serviceWakeability: deviceReplyReadiness.serviceWakeability,\n });\n const reasonCodes = collectAgentReplyReadinessReasonCodes({\n bindingReady:\n executionTarget?.bindingState === \"enabled_primary\" &&\n executionTarget.routable,\n deviceReasonCodes,\n profile: input.profile,\n targetState,\n });\n const workspaceReasonCode = resolveBlockingWorkspaceReasonCode({\n profileWorkspaceRuntimeResolution,\n reasonCodes,\n });\n if (workspaceReasonCode) {\n pushReasonCode(reasonCodes, workspaceReasonCode);\n const primaryReasonCode = sortReplyReadinessReasonCodes(reasonCodes)[0];\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonCodes,\n reasonText: describeReplyReadinessReason(\n primaryReasonCode ?? workspaceReasonCode\n ),\n transportMode,\n replyReadiness: resolveReplyReadinessLevel(\n sortReplyReadinessReasonCodes(reasonCodes),\n deviceReplyReadiness\n ),\n });\n }\n const openClawLocalReadinessFailure =\n await resolveOpenClawLocalReadinessFailure({\n agentControllerRef: executionTarget?.agentControllerRef ?? null,\n diagnostics: input.openClawLocalDiagnostics ?? null,\n effectiveRuntimeWorkingDirectory:\n profileWorkspaceRuntimeResolution.status === \"ready\"\n ? profileWorkspaceRuntimeResolution.effectiveRuntimeWorkingDirectory\n : undefined,\n isOpenClawRuntime:\n executionTarget?.localAgentId === \"openclaw\" ||\n executionTarget?.capabilityId === \"openclaw\",\n profile: input.profile,\n reasonCodes,\n });\n if (openClawLocalReadinessFailure) {\n pushReasonCode(reasonCodes, openClawLocalReadinessFailure.reasonCode);\n }\n\n if (reasonCodes.length === 0) {\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonText: REPLY_READINESS_COPY.agentReadyReason,\n transportMode,\n replyReadiness: \"ready\",\n });\n }\n\n const primaryReasonCode = reasonCodes[0] ?? \"route.not_registered\";\n return createAgentReplyReadinessStatus({\n deviceReplyReadiness,\n localAgentId,\n profileId: input.profile.openMeldProfileId,\n reasonCodes,\n reasonText:\n (primaryReasonCode === \"controller.bootstrap.failed\" ||\n primaryReasonCode === \"controller.gateway.unhealthy\") &&\n openClawLocalReadinessFailure\n ? openClawLocalReadinessFailure.message\n : describeReplyReadinessReason(primaryReasonCode),\n transportMode,\n replyReadiness: resolveReplyReadinessLevel(\n reasonCodes,\n deviceReplyReadiness\n ),\n });\n}\n\nfunction resolveAgentDeviceReasonCodes(input: {\n coreWakeRouteOnline: boolean;\n deviceReasonCodes: readonly ReplyReadinessReasonCode[];\n serviceWakeability?: DeviceReplyReadinessStatus[\"serviceWakeability\"];\n}): ReplyReadinessReasonCode[] {\n if (!input.coreWakeRouteOnline) {\n return [...input.deviceReasonCodes];\n }\n\n return input.deviceReasonCodes.filter(\n (reasonCode) =>\n reasonCode !== \"service.not_running\" &&\n reasonCode !== \"route.offline\" &&\n reasonCode !== \"route.not_registered\" &&\n !(\n reasonCode === \"service.drifted\" &&\n isConditionalServiceDrift(input.serviceWakeability)\n )\n );\n}\n\nfunction isConditionalServiceDrift(\n serviceWakeability: DeviceReplyReadinessStatus[\"serviceWakeability\"]\n): boolean {\n if (!serviceWakeability || serviceWakeability.blockingCodes.length === 0) {\n return false;\n }\n return serviceWakeability.blockingCodes.every((code) =>\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(code)\n );\n}\n\nasync function resolveAgentPrimaryRuntimeContext(input: {\n bindingReads?: PrimaryBindingReadSession;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n profile: OpenMeldProfile;\n}): Promise<AgentPrimaryRuntimeContext> {\n const executionTarget =\n input.primaryAgentControllerReport !== undefined\n ? input.primaryAgentControllerReport\n : await resolveAgentProfilePrimaryAgentControllerReport({\n ...(input.bindingReads ? { bindingReads: input.bindingReads } : {}),\n profile: input.profile,\n }).catch(() => null);\n const localAgentId = executionTarget?.localAgentId;\n if (!localAgentId) {\n return {\n executionTarget,\n targetState: null,\n transportMode: null,\n };\n }\n\n const fallbackTransportMode =\n createDefaultRuntimeAgentControllerSettings(localAgentId).transportMode;\n const targetState = await resolveAgentTargetState(localAgentId).catch(\n () => null\n );\n return {\n executionTarget,\n targetState,\n transportMode:\n targetState?.registration?.transportMode ?? fallbackTransportMode,\n };\n}\n\nfunction collectAgentReplyReadinessReasonCodes(input: {\n bindingReady: boolean;\n deviceReasonCodes: readonly ReplyReadinessReasonCode[];\n profile: OpenMeldProfile;\n targetState: Awaited<ReturnType<typeof resolveAgentTargetState>> | null;\n}): ReplyReadinessReasonCode[] {\n const reasonCodes = [...input.deviceReasonCodes];\n const launchStatus = input.targetState?.launchStatus ?? null;\n if (input.profile.status !== \"active\") {\n pushReasonCode(reasonCodes, \"profile.inactive\");\n }\n if (!input.bindingReady) {\n pushReasonCode(reasonCodes, \"profile.unbound\");\n }\n if (\n input.targetState?.registered === false &&\n !(launchStatus === \"needs_choice\" || launchStatus === \"needs_repair\")\n ) {\n pushReasonCode(reasonCodes, \"projection.missing\");\n }\n if (\n input.targetState?.registered === true &&\n input.targetState.enabled !== true\n ) {\n pushReasonCode(reasonCodes, \"controller.registry.disabled\");\n }\n if (launchStatus === \"needs_choice\") {\n pushReasonCode(reasonCodes, \"controller.launch.choice_required\");\n }\n if (launchStatus === \"needs_repair\") {\n pushReasonCode(reasonCodes, \"controller.launch.needs_repair\");\n }\n return reasonCodes;\n}\n\nasync function resolveOpenClawLocalReadinessFailure(input: {\n agentControllerRef: string | null;\n diagnostics?: OpenClawLocalDiagnosticsState | null;\n effectiveRuntimeWorkingDirectory?: string;\n isOpenClawRuntime: boolean;\n profile: OpenMeldProfile;\n reasonCodes: readonly ReplyReadinessReasonCode[];\n}): Promise<{\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null> {\n if (input.reasonCodes.length > 0 || !input.isOpenClawRuntime) {\n return null;\n }\n if (input.diagnostics) {\n return resolveOpenClawLocalReadinessFailureFromAvailableDiagnostics({\n diagnostics: input.diagnostics,\n profileId: input.profile.openMeldProfileId,\n });\n }\n const agentControllerRef = normalizeOptionalText(input.agentControllerRef);\n const runtimeAdapterContract = agentControllerRef\n ? resolveRegistryRuntimeAdapterContractByAgentControllerRef(\n agentControllerRef\n )\n : null;\n if (\n !agentControllerRef ||\n runtimeAdapterContract?.capabilityDeclaration.preparationRequirement !==\n \"required\"\n ) {\n return null;\n }\n try {\n if (!input.effectiveRuntimeWorkingDirectory) {\n throw Object.assign(\n new Error(\n `controller.bootstrap.failed: missing effective runtime working directory for ${input.profile.openMeldProfileId}`\n ),\n {\n code: \"controller.bootstrap.failed\",\n }\n );\n }\n await prepareProviderRuntime({\n agentControllerRef,\n daemonWorkingDirectory: input.effectiveRuntimeWorkingDirectory,\n mode: \"reply_readiness\",\n profileName: input.profile.profileName,\n runtimeContext: resolveReplyReadinessRuntimeContext(\n input.effectiveRuntimeWorkingDirectory,\n input.profile.openMeldProfileId\n ),\n targetProfileId: input.profile.openMeldProfileId,\n });\n return null;\n } catch (error) {\n const errorCode = extractPreparationFailureCode(error);\n return {\n message: error instanceof Error ? error.message : String(error),\n reasonCode:\n errorCode === \"controller.bootstrap.failed\"\n ? \"controller.bootstrap.failed\"\n : \"controller.gateway.unhealthy\",\n };\n }\n}\n\nfunction resolveReplyReadinessRuntimeContext(\n effectiveRuntimeWorkingDirectory: string,\n profileId: string\n): ProviderDispatchRuntimeContext {\n const parsed = providerDispatchRuntimeContextSchema.safeParse({\n providerRuntimeWorkingDirectory: effectiveRuntimeWorkingDirectory,\n });\n if (parsed.success) {\n return parsed.data;\n }\n throw Object.assign(\n new Error(\n `controller.bootstrap.failed: invalid providerRuntimeWorkingDirectory for ${profileId}`\n ),\n {\n code: \"controller.bootstrap.failed\",\n }\n );\n}\n\nfunction resolveDeviceReplyReadinessFromProfileWorkspace(input: {\n localDemand: LocalServiceDemand | null;\n profile: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution: EffectiveProfileWorkingFolderRuntimeResolution | null;\n}): DeviceReplyReadinessStatus | null {\n if (\n input.profile?.profileKind !== \"agent\" ||\n !input.profileWorkspaceRuntimeResolution ||\n input.profileWorkspaceRuntimeResolution.status === \"ready\"\n ) {\n return null;\n }\n\n return createDeviceReplyReadinessStatus({\n reasonCode: input.profileWorkspaceRuntimeResolution.reasonCode,\n reasonText: describeReplyReadinessReason(\n input.profileWorkspaceRuntimeResolution.reasonCode\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n}\n\nfunction resolveBlockingWorkspaceReasonCode(input: {\n profileWorkspaceRuntimeResolution: EffectiveProfileWorkingFolderRuntimeResolution | null;\n reasonCodes: readonly ReplyReadinessReasonCode[];\n}): \"workspace.invalid\" | \"workspace.missing\" | null {\n if (input.reasonCodes.includes(\"workspace.missing\")) {\n return \"workspace.missing\";\n }\n if (input.reasonCodes.includes(\"workspace.invalid\")) {\n return \"workspace.invalid\";\n }\n if (!input.profileWorkspaceRuntimeResolution) {\n return null;\n }\n if (input.profileWorkspaceRuntimeResolution.status === \"missing\") {\n return \"workspace.missing\";\n }\n if (input.profileWorkspaceRuntimeResolution.status === \"invalid\") {\n return \"workspace.invalid\";\n }\n return null;\n}\n\nfunction extractPreparationFailureCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n const normalized = String((error as { code?: unknown }).code ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveOpenClawLocalReadinessFailureFromAvailableDiagnostics(input: {\n diagnostics: OpenClawLocalDiagnosticsState;\n profileId: string;\n}): {\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null {\n if (isOpenClawLocalDiagnosticsFailure(input.diagnostics)) {\n return {\n message: input.diagnostics.message,\n reasonCode:\n input.diagnostics.errorCode?.startsWith(\"openclaw.gateway\") === true\n ? \"controller.gateway.unhealthy\"\n : \"controller.bootstrap.failed\",\n };\n }\n return resolveOpenClawLocalReadinessFailureFromDiagnostics({\n diagnostics: input.diagnostics,\n profileId: input.profileId,\n });\n}\n\nfunction resolveOpenClawLocalReadinessFailureFromDiagnostics(input: {\n diagnostics: OpenClawLocalDiagnostics;\n profileId: string;\n}): {\n message: string;\n reasonCode: \"controller.bootstrap.failed\" | \"controller.gateway.unhealthy\";\n} | null {\n const guidance = resolveOpenClawDiagnosticsGuidance({\n diagnostics: input.diagnostics,\n profileId: input.profileId,\n });\n if (input.diagnostics.bootstrapStatus !== \"healthy\") {\n return {\n message: guidance.summary,\n reasonCode: \"controller.bootstrap.failed\",\n };\n }\n if (\n input.diagnostics.gatewayHealth !== \"healthy\" ||\n input.diagnostics.gatewayVisibility === \"not_checked\" ||\n input.diagnostics.gatewayVisibility === \"not_visible\" ||\n input.diagnostics.gatewayVisibility === \"restart_failed\"\n ) {\n return {\n message: guidance.summary,\n reasonCode: \"controller.gateway.unhealthy\",\n };\n }\n return null;\n}\n\nexport function formatDeviceReplyReadinessLabel(\n input: DeviceReplyReadinessStatus\n): string {\n return formatReplyReadinessSummary({\n replyReadiness: input.replyReadiness,\n reasonText: input.reasonText,\n reasonCodes: input.reasonCodes,\n });\n}\n\nexport function formatReplyReadinessSummary(input: {\n replyReadiness: ReplyReadinessLevel;\n reasonText: string;\n reasonCodes?: readonly ReplyReadinessReasonCode[];\n}): string {\n if (input.replyReadiness === \"ready\") {\n return REPLY_READINESS_COPY.canReplyLabel;\n }\n if (input.reasonCodes?.[0] === \"profile.unbound\") {\n return formatReplyReadinessUnavailableLabelCopy(\n \"blocked\",\n resolveReplyReadinessAvailabilityReasonCopy(\"profile.unbound\")\n );\n }\n return formatReplyReadinessUnavailableLabelCopy(\n input.replyReadiness,\n input.reasonText\n );\n}\n\nexport function formatAgentReplyReadinessLabel(\n input: AgentReplyReadinessStatus\n): string {\n return formatReplyReadinessSummary({\n replyReadiness: input.replyReadiness,\n reasonText: input.reasonText,\n reasonCodes: input.reasonCodes,\n });\n}\n\nexport function formatHumanReplyReadinessReason(input: {\n replyReadiness: ReplyReadinessLevel;\n reasonText: string;\n reasonCodes?: readonly ReplyReadinessReasonCode[];\n}): string {\n if (\n input.replyReadiness === \"blocked\" &&\n input.reasonCodes?.[0] === \"profile.unbound\"\n ) {\n return formatManualSpaceParticipationReasonCopy(\n resolveReplyReadinessAvailabilityReasonCopy(\"profile.unbound\")\n );\n }\n return input.reasonText;\n}\n\nexport function mapAgentReplyReadinessToLegacyAutoReply(\n input: AgentReplyReadinessStatus\n): {\n ready: boolean;\n reason: string | null;\n} {\n return {\n ready: input.replyReadiness === \"ready\",\n reason: input.replyReadiness === \"ready\" ? null : input.reasonText,\n };\n}\n\nasync function resolveDeviceLocalDemand(input: {\n ownerUserId?: string | null;\n projection?: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand | null> {\n return await resolveLocalServiceDemand({\n ownerUserId: input.ownerUserId,\n projection: input.projection,\n runtimeWorkdir: input.runtimeWorkdir,\n }).catch(() => null);\n}\n\nasync function resolveEffectiveRuntimeStatus(input: {\n inventory?: DaemonServiceInventory | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n status: DaemonStatus;\n}): Promise<DaemonServiceRuntimeStatus[\"status\"] | \"not_installed\"> {\n if (!input.status.installed) {\n return \"not_installed\";\n }\n if (input.inventory) {\n return getEffectiveDaemonRuntimeStatus({\n runtimeState: input.inventory.runtimeStatus,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n });\n }\n if (!input.runtimeStatus) {\n return \"unknown\";\n }\n\n const { serviceManagerStatus } =\n await resolveDaemonServiceManagerForRuntimeState({\n runtimeState: input.runtimeStatus,\n status: input.status,\n });\n return getEffectiveDaemonRuntimeStatus({\n runtimeState: input.runtimeStatus,\n serviceManagerStatus,\n });\n}\n\nasync function resolveDeviceReadinessRuntimeProjection(\n runtimeProjection: DeviceRuntimeStateSyncResult | null | undefined\n): Promise<DeviceRuntimeStateSyncResult | null> {\n if (runtimeProjection !== undefined) {\n return runtimeProjection;\n }\n return await resolveReplyReadinessRuntimeProjection();\n}\n\nasync function resolveDeviceReadinessLocalDemand(input: {\n localDemand?: LocalServiceDemand | null;\n ownerUserId?: string | null;\n projection: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n}): Promise<LocalServiceDemand | null> {\n if (input.localDemand !== undefined) {\n return input.localDemand;\n }\n return await resolveDeviceLocalDemand({\n ownerUserId: input.ownerUserId,\n projection: input.projection,\n runtimeWorkdir: input.runtimeWorkdir,\n });\n}\n\nasync function resolveReplyReadinessInventory(\n _status: DaemonStatus\n): Promise<DaemonServiceInventory | null> {\n return await inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intent: \"status_cleanup\",\n }).catch(() => null);\n}\n\nasync function resolveReplyReadinessRuntimeProjection(): Promise<DeviceRuntimeStateSyncResult | null> {\n return await syncDeviceRuntimeStateProjection({\n mode: \"check\",\n }).catch(() => null);\n}\n\nasync function resolveDeviceReplyReadinessFromServiceState(input: {\n inventory?: DaemonServiceInventory | null;\n localDemand: LocalServiceDemand | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n status: DaemonStatus;\n}): Promise<DeviceReplyReadinessStatus | null> {\n const wakeability = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const effectiveRuntimeStatus = await resolveEffectiveRuntimeStatus({\n inventory: input.inventory,\n runtimeStatus: input.runtimeStatus,\n status: input.status,\n });\n if (effectiveRuntimeStatus === \"stale\") {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_running\",\n reasonText: resolveReplyReadinessReconnectingReasonCopy(),\n replyReadiness: \"degraded\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n if (effectiveRuntimeStatus !== \"running\") {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.not_running\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"service.not_running\"\n ),\n replyReadiness:\n effectiveRuntimeStatus === \"unknown\" ? \"unknown\" : \"blocked\",\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n if (wakeability.blocksWake) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"service.drifted\",\n reasonText:\n resolveReplyReadinessAvailabilityReasonCopy(\"service.drifted\"),\n replyReadiness: \"blocked\",\n serviceWakeability: wakeability,\n wakeableRouteCount: input.localDemand?.localExecutionRouteCount ?? 0,\n });\n }\n return null;\n}\n\nfunction resolveDeviceReplyReadinessFromRuntimeProjection(\n runtimeProjection?: DeviceRuntimeStateSyncResult | null\n): DeviceReplyReadinessStatus | null {\n if (runtimeProjection?.status !== \"degraded\") {\n return null;\n }\n if (runtimeProjection.missingControllerIds.length > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"projection.missing\",\n reasonText:\n resolveReplyReadinessAvailabilityReasonCopy(\"projection.missing\"),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n if (runtimeProjection.disabledControllerIds.length > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"controller.registry.disabled\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"controller.registry.disabled\"\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n if ((runtimeProjection.repairRequiredControllerIds?.length ?? 0) > 0) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"controller.launch.needs_repair\",\n reasonText: resolveReplyReadinessGuidanceSummaryCopy(\n \"controller.launch.needs_repair\",\n {\n targetLabel: REPLY_READINESS_COPY.localAgentRecoveryTargetLabel,\n }\n ),\n replyReadiness: \"blocked\",\n wakeableRouteCount: 0,\n });\n }\n return null;\n}\n\nfunction createRouteNotRegisteredReplyReadinessStatus(input: {\n localDemand: LocalServiceDemand | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n}): DeviceReplyReadinessStatus {\n const projectionWithoutLocalDemand =\n input.localDemand?.projection ?? input.runtimeProjection;\n const noProjectedLocalControllers = hasNoProjectedLocalControllers(\n projectionWithoutLocalDemand\n );\n if (\n input.localDemand?.reason === \"owner user is unavailable\" &&\n !noProjectedLocalControllers\n ) {\n return createDeviceReplyReadinessStatus({\n reasonCode: \"profile.not_selected\",\n reasonText: resolveReplyReadinessAvailabilityReasonCopy(\n \"profile.not_selected\"\n ),\n replyReadiness: \"unknown\",\n wakeableRouteCount: 0,\n });\n }\n const reasonCode =\n input.runtimeProjection?.status === \"skipped\" || noProjectedLocalControllers\n ? \"local_agents.none_needed\"\n : \"route.not_registered\";\n return createDeviceReplyReadinessStatus({\n reasonCode,\n reasonText:\n normalizeOptionalText(\n input.localDemand?.reason ?? input.runtimeProjection?.reason\n ) ?? resolveReplyReadinessAvailabilityReasonCopy(reasonCode),\n replyReadiness:\n input.runtimeProjection?.status === \"skipped\" ||\n noProjectedLocalControllers\n ? \"unknown\"\n : \"blocked\",\n wakeableRouteCount: 0,\n });\n}\n\nfunction hasNoProjectedLocalControllers(\n projection: DeviceRuntimeStateSyncResult | null | undefined\n): boolean {\n return (\n projection?.status === \"ok\" &&\n projection.projectedControllerIds.length === 0\n );\n}\n\nfunction createDeviceReplyReadinessStatus(input: {\n reasonCode?: ReplyReadinessReasonCode;\n reasonText: string;\n replyReadiness: ReplyReadinessLevel;\n serviceWakeability?: DeviceReplyReadinessStatus[\"serviceWakeability\"];\n wakeableRouteCount: number;\n}): DeviceReplyReadinessStatus {\n return {\n reasonCodes: sortReplyReadinessReasonCodes(\n input.reasonCode ? [input.reasonCode] : []\n ),\n reasonText: input.reasonText,\n replyReadiness: input.replyReadiness,\n ...(input.serviceWakeability\n ? { serviceWakeability: input.serviceWakeability }\n : {}),\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: input.wakeableRouteCount,\n };\n}\n\nfunction createAgentReplyReadinessStatus(input: {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n localAgentId: string | null;\n profileId: string;\n reasonCodes?: ReplyReadinessReasonCode[];\n reasonText: string;\n transportMode: string | null;\n replyReadiness: ReplyReadinessLevel;\n}): AgentReplyReadinessStatus {\n return {\n deviceReplyReadiness: input.deviceReplyReadiness,\n localAgentId: input.localAgentId,\n profileId: input.profileId,\n reasonCodes: sortReplyReadinessReasonCodes(input.reasonCodes ?? []),\n reasonText: input.reasonText,\n replyReadiness: input.replyReadiness,\n transportMode: input.transportMode,\n updatedAt: new Date().toISOString(),\n };\n}\n\nfunction resolveReplyReadinessLevel(\n reasonCodes: ReplyReadinessReasonCode[],\n deviceReplyReadiness: DeviceReplyReadinessStatus\n): ReplyReadinessLevel {\n if (reasonCodes.length === 0) {\n return \"ready\";\n }\n if (\n deviceReplyReadiness.replyReadiness === \"degraded\" &&\n reasonCodes[0] === \"service.not_running\"\n ) {\n return \"degraded\";\n }\n if (deviceReplyReadiness.replyReadiness === \"unknown\") {\n return \"unknown\";\n }\n return \"blocked\";\n}\n\nfunction pushReasonCode(\n target: ReplyReadinessReasonCode[],\n reasonCode: ReplyReadinessReasonCode\n): void {\n if (target.includes(reasonCode)) {\n return;\n }\n target.push(reasonCode);\n}\n\nfunction sortReplyReadinessReasonCodes(\n reasonCodes: ReplyReadinessReasonCode[]\n): ReplyReadinessReasonCode[] {\n return [...reasonCodes].sort(\n (left, right) =>\n REPLY_READINESS_REASON_PRIORITY.indexOf(left) -\n REPLY_READINESS_REASON_PRIORITY.indexOf(right)\n );\n}\n\nfunction describeReplyReadinessReason(\n reasonCode: ReplyReadinessReasonCode\n): string {\n return resolveReplyReadinessStatusReasonCopy(reasonCode);\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function isOpenClawAgentControllerReport(input: {\n capabilityId?: string | null;\n localAgentId?: string | null;\n}): boolean {\n return input.localAgentId === \"openclaw\" || input.capabilityId === \"openclaw\";\n}\n","import type { RuntimeTransportLookupRouteResponse } from \"@openmeld/schemas/types\";\nimport { buildDaemonRouteObservationPresentation } from \"@openmeld/start\";\nimport {\n DaemonRouteObservationFetchError,\n fetchDaemonRouteObservation,\n} from \"../config/daemon-route-observation-api\";\nimport type {\n DaemonServiceRuntimeStatus,\n DaemonStatus,\n} from \"../config/daemon-state\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport type { OpenMeldProfile } from \"../config/openmeld-profiles-api\";\nimport { buildOpenMeldRequestContextFromProfile } from \"../config/openmeld-request-context\";\nimport { resolveOpenMeldEnvPreset } from \"../config/paths\";\nimport type { RouteCatalog } from \"../local-service/core/types\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport type { DaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type {\n DaemonServiceManager,\n DaemonServiceManagerRuntimeStatus,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveLocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport type { DeviceRuntimeStateSyncResult } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { syncDeviceRuntimeStateProjection } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { readDaemonRouteCatalogCache } from \"../local-service/state/route-catalog-cache\";\nimport { resolveEffectiveProfileWorkingFolderRuntime } from \"../profile-workspace/effective-runtime-resolution\";\nimport type {\n OpenClawDiagnosticsMode,\n OpenClawLocalDiagnosticsState,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport {\n createOpenClawLocalDiagnosticsFailure,\n resolveOpenClawLocalDiagnostics,\n} from \"../provider-hosts/openclaw/diagnostics\";\nimport {\n type AgentProfilePrimaryAgentControllerReport,\n resolveAgentProfilePrimaryAgentControllerReport,\n} from \"./agent-profile-primary-binding\";\nimport {\n createExpectedRoutesReadSession,\n type ExpectedRoutesReadSession,\n} from \"./expected-routes-read-session\";\nimport type {\n GatewayChainProfile,\n GatewayChainReadiness,\n} from \"./gateway-chain-readiness\";\nimport { resolveGatewayChainReadiness } from \"./gateway-chain-readiness\";\nimport {\n createPrimaryBindingReadSession,\n type PrimaryBindingReadSession,\n} from \"./primary-binding-read-session\";\nimport {\n type AgentReplyReadinessStatus,\n type DeviceReplyReadinessStatus,\n isOpenClawAgentControllerReport,\n resolveAgentReplyReadinessStatus,\n resolveDeviceReplyReadinessStatus,\n} from \"./reply-readiness\";\n\nexport type CurrentReplyReadinessSnapshot = {\n daemonRouteObservation: DaemonRouteObservation;\n observedAt: string;\n daemonStatus: DaemonStatus;\n inventory: DaemonServiceInventory | null;\n runtimeProjection: DeviceRuntimeStateSyncResult | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n displayRuntimeStatus: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n gatewayChainReadiness: GatewayChainReadiness | null;\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n agentReplyReadiness: AgentReplyReadinessStatus | null;\n openClawLocalDiagnostics: OpenClawLocalDiagnosticsState | null;\n profileWorkspaceRuntimeResolution: ReturnType<\n typeof resolveEffectiveProfileWorkingFolderRuntime\n > extends Promise<infer TValue>\n ? TValue | null\n : never;\n};\n\nexport type CurrentReplyReadinessLocalServiceObservation = {\n daemonStatus: DaemonStatus;\n inventory: DaemonServiceInventory | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n};\n\nexport type DaemonRouteObservation =\n | {\n detail: null;\n observedAt: string;\n profileId: string;\n reasonCode: \"online\";\n route: RuntimeTransportLookupRouteResponse;\n status: \"online\";\n }\n | {\n detail: string;\n observedAt: string;\n profileId: string;\n reasonCode: \"route.not_registered\";\n route: RuntimeTransportLookupRouteResponse;\n status: \"offline\";\n }\n | {\n detail: string;\n observedAt: string;\n profileId: string | null;\n reasonCode:\n | \"lookup_failed\"\n | \"not_requested\"\n | \"profile_not_agent\"\n | \"profile_not_selected\"\n | \"server_unsupported\";\n route: null;\n status: \"unavailable\";\n };\n\nexport async function resolveCurrentReplyReadinessSnapshot(\n input: {\n baseUrl?: string;\n checkGatewayChain?: boolean;\n gatewayChainProfile?: GatewayChainProfile | null;\n gatewayChainTimeoutMs?: number;\n includeDaemonRouteObservation?: boolean;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n openClawDiagnosticsMode?: OpenClawDiagnosticsMode | null;\n ownerUserId?: string | null;\n preferActiveServiceRouteCatalog?: boolean;\n profile?: OpenMeldProfile | null;\n primaryAgentControllerReport?: AgentProfilePrimaryAgentControllerReport | null;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n runtimeWorkdir?: string;\n } = {}\n): Promise<CurrentReplyReadinessSnapshot> {\n const daemonStatus = await resolveDaemonStatusForSnapshot(\n input.localServiceObservation\n );\n // One snapshot = one binding read per profile: the runtime projection\n // check, the local-service demand catalog, and the agent readiness lookup\n // all share this operation-scoped session instead of re-fanning out.\n const bindingReads = createPrimaryBindingReadSession({\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n });\n const expectedRoutesRead = createExpectedRoutesReadSession({\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n });\n const primaryAgentControllerReportPromise =\n input.primaryAgentControllerReport !== undefined\n ? Promise.resolve(input.primaryAgentControllerReport)\n : resolvePrimaryAgentControllerReportForSnapshot({\n baseUrl: input.baseUrl,\n bindingReads,\n profile: input.profile ?? null,\n });\n const daemonRouteObservationPromise = resolveDaemonRouteObservation({\n baseUrl: input.baseUrl,\n includeDaemonRouteObservation: input.includeDaemonRouteObservation === true,\n profile: input.profile ?? null,\n });\n const inventoryPromise = resolveInventoryForSnapshot(\n input.localServiceObservation\n );\n const ownerUserId = input.ownerUserId ?? input.profile?.ownerUserId ?? null;\n const activeServiceRouteCatalogPromise = inventoryPromise.then(\n async (inventory) =>\n await resolveActiveServiceRouteCatalogForSnapshot({\n enabled: input.preferActiveServiceRouteCatalog === true,\n inventory,\n ownerUserId,\n })\n );\n const runtimeProjectionPromise = resolveRuntimeProjectionForSnapshot({\n activeServiceRouteCatalog: activeServiceRouteCatalogPromise,\n bindingReads,\n daemonStatus,\n expectedRoutesRead,\n runtimeProjection: input.runtimeProjection,\n });\n const runtimeStatusPromise = resolveRuntimeStatusForSnapshot({\n daemonStatus,\n localServiceObservation: input.localServiceObservation,\n });\n const profileWorkspaceRuntimeResolutionPromise =\n resolveProfileWorkspaceRuntimeForSnapshot(input.profile ?? null);\n const runtimeStatus = await runtimeStatusPromise;\n const { serviceManager, serviceManagerStatus } =\n await resolveServiceManagerForSnapshot({\n daemonStatus,\n localServiceObservation: input.localServiceObservation,\n runtimeStatus,\n });\n const [\n runtimeProjection,\n inventory,\n profileWorkspaceRuntimeResolution,\n activeServiceRouteCatalog,\n ] = await Promise.all([\n runtimeProjectionPromise,\n inventoryPromise,\n profileWorkspaceRuntimeResolutionPromise,\n activeServiceRouteCatalogPromise,\n ]);\n const displayRuntimeStatus = enrichRuntimeStateWithManager({\n runtimeState: runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n });\n const localDemand = await resolveLocalServiceDemand({\n bindingReads,\n expectedRoutesRead,\n ownerUserId,\n projection: runtimeProjection,\n ...(activeServiceRouteCatalog\n ? { routeCatalog: activeServiceRouteCatalog }\n : {}),\n runtimeWorkdir: input.runtimeWorkdir,\n }).catch(() => null);\n const localDeviceReplyReadiness = await resolveDeviceReplyReadinessStatus({\n baseUrl: input.baseUrl,\n checkGatewayChain: false,\n gatewayChainProfile: input.gatewayChainProfile,\n gatewayChainReadiness: null,\n gatewayChainTimeoutMs: input.gatewayChainTimeoutMs,\n inventory,\n localDemand,\n ownerUserId,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n runtimeProjection,\n runtimeStatus: displayRuntimeStatus ?? runtimeStatus,\n runtimeWorkdir: input.runtimeWorkdir,\n status: daemonStatus,\n }).catch(() =>\n createFallbackDeviceReplyReadiness({\n daemonStatus,\n runtimeStatus: displayRuntimeStatus ?? runtimeStatus,\n })\n );\n const shouldProbeGatewayChain =\n input.checkGatewayChain === true &&\n !isWakeableLocalReplyReady(localDeviceReplyReadiness) &&\n !localDeviceReplyReadiness.reasonCodes.some(\n (reasonCode) =>\n reasonCode === \"service.drifted\" ||\n reasonCode === \"service.not_installed\" ||\n reasonCode === \"service.not_running\" ||\n reasonCode === \"workspace.invalid\" ||\n reasonCode === \"workspace.missing\"\n );\n const gatewayChainReadiness = shouldProbeGatewayChain\n ? await resolveGatewayChainReadiness({\n baseUrl: input.baseUrl,\n profile:\n input.gatewayChainProfile ??\n (input.profile\n ? {\n openMeldProfileId: input.profile.openMeldProfileId,\n profileName: input.profile.profileName,\n }\n : null),\n timeoutMs: input.gatewayChainTimeoutMs,\n }).catch(() => null)\n : null;\n const deviceReplyReadiness = localDeviceReplyReadiness;\n const openClawLocalDiagnostics =\n await resolveOpenClawLocalDiagnosticsForSnapshot({\n mode: input.openClawDiagnosticsMode ?? null,\n primaryAgentControllerReport: primaryAgentControllerReportPromise,\n profile: input.profile ?? null,\n profileWorkspaceRuntimeResolution,\n });\n const [daemonRouteObservation, primaryAgentControllerReport] =\n await Promise.all([\n daemonRouteObservationPromise,\n primaryAgentControllerReportPromise,\n ]);\n const agentReplyReadiness =\n input.profile?.profileKind === \"agent\"\n ? await resolveAgentReplyReadinessStatus({\n bindingReads,\n coreWakeRouteOnline: daemonRouteObservation.status === \"online\",\n deviceReplyReadiness,\n openClawLocalDiagnostics,\n primaryAgentControllerReport,\n profile: input.profile,\n profileWorkspaceRuntimeResolution,\n }).catch(() => null)\n : null;\n\n return {\n daemonRouteObservation,\n observedAt: new Date().toISOString(),\n daemonStatus,\n inventory,\n runtimeProjection,\n runtimeStatus,\n displayRuntimeStatus,\n serviceManagerStatus,\n gatewayChainReadiness,\n deviceReplyReadiness,\n agentReplyReadiness,\n openClawLocalDiagnostics,\n profileWorkspaceRuntimeResolution,\n };\n}\n\nfunction resolveDaemonStatusForSnapshot(\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation\n): Promise<DaemonStatus> {\n if (localServiceObservation) {\n return Promise.resolve(localServiceObservation.daemonStatus);\n }\n return getDaemonStatus();\n}\n\nfunction resolveRuntimeStatusForSnapshot(input: {\n daemonStatus: DaemonStatus;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n}): Promise<DaemonServiceRuntimeStatus | null> {\n if (input.localServiceObservation) {\n return Promise.resolve(input.localServiceObservation.runtimeStatus);\n }\n return resolveDaemonRuntimeState(input.daemonStatus).catch(() => null);\n}\n\nasync function resolveInventoryForSnapshot(\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation\n): Promise<DaemonServiceInventory | null> {\n if (localServiceObservation) {\n return Promise.resolve(localServiceObservation.inventory);\n }\n return inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intent: \"status_cleanup\",\n }).catch(() => null);\n}\n\nasync function resolveServiceManagerForSnapshot(input: {\n daemonStatus: DaemonStatus;\n localServiceObservation?: CurrentReplyReadinessLocalServiceObservation;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n}): Promise<{\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}> {\n if (input.localServiceObservation) {\n return {\n serviceManager:\n input.localServiceObservation.inventory?.serviceManager ?? null,\n serviceManagerStatus: input.localServiceObservation.serviceManagerStatus,\n };\n }\n return await resolveDaemonServiceManagerForRuntimeState({\n runtimeState: input.runtimeStatus,\n status: input.daemonStatus,\n }).catch(() => ({\n serviceManager: null,\n serviceManagerStatus: null,\n legacySharedService: null,\n }));\n}\n\nfunction isWakeableLocalReplyReady(\n localDeviceReplyReadiness: DeviceReplyReadinessStatus\n): boolean {\n return (\n localDeviceReplyReadiness.replyReadiness === \"ready\" &&\n localDeviceReplyReadiness.wakeableRouteCount > 0\n );\n}\n\nasync function resolveRuntimeProjectionForSnapshot(input: {\n activeServiceRouteCatalog: Promise<RouteCatalog | null>;\n bindingReads: PrimaryBindingReadSession;\n daemonStatus: DaemonStatus;\n expectedRoutesRead: ExpectedRoutesReadSession;\n runtimeProjection?: DeviceRuntimeStateSyncResult | null;\n}): Promise<DeviceRuntimeStateSyncResult | null> {\n if (!input.daemonStatus.installed) {\n return null;\n }\n if (input.runtimeProjection !== undefined) {\n return input.runtimeProjection;\n }\n if (await input.activeServiceRouteCatalog) {\n return {\n status: \"skipped\",\n mode: \"check\",\n projectedControllerIds: [],\n missingControllerIds: [],\n disabledControllerIds: [],\n repairedControllerIds: [],\n reason: \"active service route catalog already exists\",\n };\n }\n return await syncDeviceRuntimeStateProjection({\n bindingReads: input.bindingReads,\n expectedRoutesRead: input.expectedRoutesRead,\n mode: \"check\",\n }).catch(() => null);\n}\n\nasync function resolveActiveServiceRouteCatalogForSnapshot(input: {\n enabled: boolean;\n inventory: DaemonServiceInventory | null;\n ownerUserId: string | null;\n}): Promise<RouteCatalog | null> {\n const serviceBundleId = input.inventory?.activeBundle?.bundleId ?? null;\n if (!(input.enabled && input.ownerUserId && serviceBundleId)) {\n return null;\n }\n return await readDaemonRouteCatalogCache({\n lane: resolveOpenMeldEnvPreset(),\n ownerUserId: input.ownerUserId,\n serviceBundleId,\n }).catch(() => null);\n}\n\nfunction resolveProfileWorkspaceRuntimeForSnapshot(\n profile: OpenMeldProfile | null\n): Promise<CurrentReplyReadinessSnapshot[\"profileWorkspaceRuntimeResolution\"]> {\n if (profile?.profileKind !== \"agent\") {\n return Promise.resolve(null);\n }\n return resolveEffectiveProfileWorkingFolderRuntime({\n defaultProjectId: profile.defaultProjectId,\n openMeldProfileId: profile.openMeldProfileId,\n mode: \"inspect\",\n });\n}\n\nasync function resolveOpenClawLocalDiagnosticsForSnapshot(input: {\n mode: OpenClawDiagnosticsMode | null;\n primaryAgentControllerReport: Promise<AgentProfilePrimaryAgentControllerReport | null>;\n profile: OpenMeldProfile | null;\n profileWorkspaceRuntimeResolution: CurrentReplyReadinessSnapshot[\"profileWorkspaceRuntimeResolution\"];\n}): Promise<OpenClawLocalDiagnosticsState | null> {\n if (\n input.profile?.profileKind !== \"agent\" ||\n !input.mode ||\n input.profileWorkspaceRuntimeResolution?.status !== \"ready\"\n ) {\n return null;\n }\n\n const primaryAgentControllerReport = await input.primaryAgentControllerReport;\n if (!isOpenClawAgentControllerReport(primaryAgentControllerReport ?? {})) {\n return null;\n }\n\n return resolveOpenClawLocalDiagnostics({\n mode: input.mode,\n profile: input.profile,\n providerRuntimeWorkingDirectory:\n input.profileWorkspaceRuntimeResolution.effectiveRuntimeWorkingDirectory,\n }).catch((error) => createOpenClawLocalDiagnosticsFailure(error));\n}\n\nfunction resolvePrimaryAgentControllerReportForSnapshot(input: {\n baseUrl?: string;\n bindingReads: PrimaryBindingReadSession;\n profile: OpenMeldProfile | null;\n}): Promise<AgentProfilePrimaryAgentControllerReport | null> {\n if (input.profile?.profileKind !== \"agent\") {\n return Promise.resolve(null);\n }\n return resolveAgentProfilePrimaryAgentControllerReport({\n baseUrl: input.baseUrl,\n bindingReads: input.bindingReads,\n profile: input.profile,\n }).catch(() => null);\n}\n\nasync function resolveDaemonRouteObservation(input: {\n baseUrl?: string;\n includeDaemonRouteObservation: boolean;\n profile: OpenMeldProfile | null;\n}): Promise<DaemonRouteObservation> {\n const observedAt = new Date().toISOString();\n if (!input.includeDaemonRouteObservation) {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"not_requested\",\n }),\n observedAt,\n profileId: input.profile?.openMeldProfileId ?? null,\n reasonCode: \"not_requested\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n if (!input.profile) {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"profile_not_selected\",\n }),\n observedAt,\n profileId: null,\n reasonCode: \"profile_not_selected\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n if (input.profile.profileKind !== \"agent\") {\n return {\n detail: buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"profile_not_agent\",\n }),\n observedAt,\n profileId: input.profile.openMeldProfileId,\n reasonCode: \"profile_not_agent\",\n route: null,\n status: \"unavailable\",\n };\n }\n\n try {\n const response = await fetchDaemonRouteObservation({\n requestContext: buildOpenMeldRequestContextFromProfile({\n openMeldProfile: input.profile,\n }),\n baseUrl: input.baseUrl,\n profileId: input.profile.openMeldProfileId,\n });\n if (response.route.online) {\n return {\n detail: null,\n observedAt: response.observedAt,\n profileId: response.profileId,\n reasonCode: \"online\",\n route: response.route,\n status: \"online\",\n };\n }\n return {\n detail: `Server can't currently see an active reply route for this agent profile (server reported ${response.route.reasonCode}).`,\n observedAt: response.observedAt,\n profileId: response.profileId,\n reasonCode: \"route.not_registered\",\n route: response.route,\n status: \"offline\",\n };\n } catch (error) {\n const reasonCode =\n error instanceof DaemonRouteObservationFetchError\n ? error.code\n : \"lookup_failed\";\n const detail =\n reasonCode === \"server_unsupported\"\n ? buildCanonicalUnavailableRouteObservationDetail({\n observedAt,\n reasonCode: \"server_unsupported\",\n })\n : buildLookupFailedRouteObservationDetail({\n error,\n observedAt,\n });\n return {\n detail,\n observedAt,\n profileId: input.profile.openMeldProfileId,\n reasonCode,\n route: null,\n status: \"unavailable\",\n };\n }\n}\n\nfunction buildCanonicalUnavailableRouteObservationDetail(input: {\n observedAt: string;\n reasonCode:\n | \"lookup_failed\"\n | \"not_requested\"\n | \"profile_not_agent\"\n | \"profile_not_selected\"\n | \"server_unsupported\";\n}): string {\n const detail = buildDaemonRouteObservationPresentation({\n observedAt: input.observedAt,\n reasonCode: input.reasonCode,\n status: \"unavailable\",\n }).detail;\n if (!detail) {\n throw new Error(\n `missing unavailable reply route detail for ${input.reasonCode}`\n );\n }\n return detail;\n}\n\nfunction buildLookupFailedRouteObservationDetail(input: {\n error: unknown;\n observedAt: string;\n}): string {\n const detail = buildCanonicalUnavailableRouteObservationDetail({\n observedAt: input.observedAt,\n reasonCode: \"lookup_failed\",\n });\n const rawError = toErrorMessage(input.error).trim();\n if (rawError.length === 0 || rawError === detail) {\n return detail;\n }\n return `${detail} Raw lookup error: ${rawError}`;\n}\n\nfunction createFallbackDeviceReplyReadiness(input: {\n daemonStatus: DaemonStatus;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n}): DeviceReplyReadinessStatus {\n if (!input.daemonStatus.installed) {\n return {\n reasonCodes: [\"service.not_installed\"],\n reasonText: \"OpenMeld Service is not installed on this device\",\n replyReadiness: \"blocked\",\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: 0,\n };\n }\n\n return {\n reasonCodes:\n input.runtimeStatus?.status === \"stale\" ? [\"service.not_running\"] : [],\n reasonText:\n input.runtimeStatus?.status === \"stale\"\n ? \"OpenMeld Service is reconnecting on this device\"\n : \"OpenMeld couldn't confirm current reply readiness on this device\",\n replyReadiness:\n input.runtimeStatus?.status === \"stale\" ? \"degraded\" : \"unknown\",\n updatedAt: new Date().toISOString(),\n wakeableRouteCount: 0,\n };\n}\n\nfunction enrichRuntimeStateWithManager(input: {\n runtimeState: DaemonServiceRuntimeStatus | null;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): DaemonServiceRuntimeStatus | null {\n if (!input.runtimeState) {\n return null;\n }\n return {\n ...input.runtimeState,\n managedBySystemService:\n input.runtimeState.managedBySystemService ||\n input.serviceManagerStatus?.installed === true,\n serviceController:\n input.runtimeState.serviceController === \"unknown\" &&\n input.serviceManager?.controller !== undefined\n ? input.serviceManager.controller\n : input.runtimeState.serviceController,\n };\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 { join } from \"node:path\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvPreset,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport type { DaemonServiceDependencyIssue } from \"../../local-service/lifecycle/daemon-service-dependency-diagnostics\";\nimport { dirnamePath, normalizeOptionalText } from \"../core/logger\";\n\nconst DAEMON_START_FAILURE_STATE_FILE = \"daemon-start-failure-state.json\";\nconst DAEMON_START_FAILURE_STATE_SCHEMA = \"daemon.start.failure.state\" as const;\n\nexport type DaemonStartFailureStateReason =\n | \"service_dependencies_unavailable\"\n | \"startup_failed\";\n\nexport type DaemonStartFailureState = {\n schema: typeof DAEMON_START_FAILURE_STATE_SCHEMA;\n v: 1;\n recordedAt: string;\n reason: DaemonStartFailureStateReason;\n detail: string;\n rawLogLine: string | null;\n dependencyIssues: DaemonServiceDependencyIssue[];\n lane: OpenMeldEnvPreset;\n};\n\nexport function daemonStartFailureStatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"data\",\n DAEMON_START_FAILURE_STATE_FILE\n );\n}\n\nexport async function readDaemonStartFailureState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonStartFailureState | null> {\n const raw = await readFile(\n daemonStartFailureStatePath(pathInput),\n \"utf8\"\n ).catch(() => null);\n if (!raw) {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n return parseDaemonStartFailureState(parsed);\n}\n\nexport async function writeDaemonStartFailureState(input: {\n recordedAt?: string;\n pathInput?: OpenMeldPathResolutionInput;\n reason: DaemonStartFailureStateReason;\n detail: string;\n rawLogLine?: string | null;\n dependencyIssues?: DaemonServiceDependencyIssue[];\n}): Promise<DaemonStartFailureState> {\n const lane = resolveOpenMeldEnvPreset(input.pathInput);\n const state: DaemonStartFailureState = {\n schema: DAEMON_START_FAILURE_STATE_SCHEMA,\n v: 1,\n recordedAt: input.recordedAt ?? new Date().toISOString(),\n reason: input.reason,\n detail: input.detail,\n rawLogLine: normalizeOptionalText(input.rawLogLine) ?? null,\n dependencyIssues: normalizeDependencyIssues(input.dependencyIssues ?? []),\n lane,\n };\n await writeJsonAtomic({\n path: daemonStartFailureStatePath(input.pathInput),\n value: state,\n });\n return state;\n}\n\nexport async function clearDaemonStartFailureState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(daemonStartFailureStatePath(pathInput), {\n force: true,\n }).catch(() => undefined);\n}\n\nfunction parseDaemonStartFailureState(\n value: unknown\n): DaemonStartFailureState | null {\n if (!isRecord(value)) {\n return null;\n }\n if (value.schema !== DAEMON_START_FAILURE_STATE_SCHEMA || value.v !== 1) {\n return null;\n }\n const recordedAt = normalizeOptionalText(value.recordedAt);\n const detail = normalizeOptionalText(value.detail);\n const lane = value.lane;\n const reason = value.reason;\n const rawLogLine =\n value.rawLogLine === null ? null : normalizeOptionalText(value.rawLogLine);\n if (\n !(recordedAt && detail) ||\n (lane !== \"prod\" && lane !== \"dev-local\" && lane !== \"canary\") ||\n (reason !== \"service_dependencies_unavailable\" &&\n reason !== \"startup_failed\")\n ) {\n return null;\n }\n const dependencyIssues = normalizeDependencyIssues(\n Array.isArray(value.dependencyIssues) ? value.dependencyIssues : []\n );\n return {\n schema: DAEMON_START_FAILURE_STATE_SCHEMA,\n v: 1,\n recordedAt,\n reason,\n detail,\n rawLogLine,\n dependencyIssues,\n lane,\n };\n}\n\nfunction normalizeDependencyIssues(\n issues: unknown[]\n): DaemonServiceDependencyIssue[] {\n const normalized: DaemonServiceDependencyIssue[] = [];\n for (const issue of issues) {\n if (!isRecord(issue)) {\n continue;\n }\n const kind = issue.kind;\n const status = issue.status;\n const scope = issue.scope;\n const baseUrl = normalizeOptionalText(issue.baseUrl);\n const probeUrl = normalizeOptionalText(issue.probeUrl);\n const httpStatus =\n typeof issue.httpStatus === \"number\" ? issue.httpStatus : null;\n if (\n (kind !== \"auth\" && kind !== \"gateway\") ||\n (status !== \"unhealthy_http\" && status !== \"unreachable\") ||\n (scope !== \"loopback\" && scope !== \"remote\") ||\n !baseUrl ||\n !probeUrl\n ) {\n continue;\n }\n normalized.push({\n kind,\n status,\n scope,\n baseUrl,\n probeUrl,\n httpStatus,\n });\n }\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function writeJsonAtomic(input: {\n path: string;\n value: unknown;\n}): Promise<void> {\n await mkdir(dirnamePath(input.path), {\n recursive: true,\n });\n const tempPath = `${input.path}.tmp-${Date.now()}-${process.pid}`;\n await writeFile(\n tempPath,\n `${JSON.stringify(input.value, null, 2)}\\n`,\n \"utf8\"\n );\n await rename(tempPath, input.path).catch(async (error) => {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n });\n}\n","import { formatOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\nimport { classifyDaemonServiceWakeability } from \"./daemon-service-anomaly-groups\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\n\nexport type DaemonServiceFreshnessStatus = \"current\" | \"update_available\";\n\nexport type DaemonServiceFreshnessWarning = {\n anomalyCodes: DaemonServiceAnomalyCode[];\n blocksWake: false;\n code: \"service_update_available\" | \"service_repair_recommended\";\n detailText: string;\n executionEvidenceSafe: boolean;\n level: \"info\" | \"warning\";\n nextStep: string;\n nextSteps: [string];\n status: \"update_available\";\n summaryText: \"Update OpenMeld Service\" | \"Reconnect OpenMeld Service\";\n title: \"Update OpenMeld Service\" | \"Reconnect OpenMeld Service\";\n};\n\nconst UPDATE_AVAILABLE_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"version_outdated\",\n \"bundle_content_drift\",\n \"bundle_version_drift\",\n \"bundle_strategy_legacy\",\n]);\nconst OPENMELD_COMMAND_PREFIX_RE = /^openmeld/u;\n\nexport function resolveDaemonServiceFreshnessWarning(input: {\n cliEntry?: string | null;\n inventory?: DaemonServiceInventory | null;\n}): DaemonServiceFreshnessWarning | null {\n const inventory = input.inventory;\n if (!inventory) {\n return null;\n }\n\n const wakeability = classifyDaemonServiceWakeability({ inventory });\n if (wakeability.blocksWake || wakeability.advisoryCodes.length === 0) {\n return null;\n }\n\n return resolveDaemonServiceFreshnessWarningForAnomalyCodes({\n anomalyCodes: wakeability.advisoryCodes,\n cliEntry: input.cliEntry,\n executionEvidenceSafe: wakeability.executionEvidenceSafe,\n });\n}\n\nexport function resolveDaemonServiceFreshnessWarningForAnomalyCodes(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n cliEntry?: string | null;\n executionEvidenceSafe?: boolean;\n}): DaemonServiceFreshnessWarning | null {\n const anomalyCodes = dedupeAnomalyCodes(input.anomalyCodes);\n if (anomalyCodes.length === 0) {\n return null;\n }\n const usesUpdateCommand = anomalyCodes.some((code) =>\n UPDATE_AVAILABLE_ANOMALIES.has(code)\n );\n const command = formatServiceCommand({\n cliEntry: input.cliEntry,\n command: \"openmeld setup\",\n });\n\n if (usesUpdateCommand) {\n return {\n anomalyCodes,\n blocksWake: false,\n code: \"service_update_available\",\n detailText:\n \"OpenMeld Service is running, but its local service bundle is not current. Update OpenMeld Service before this computer receives new local Wake work.\",\n executionEvidenceSafe: input.executionEvidenceSafe ?? true,\n level: \"info\",\n nextStep: `Run \\`${command}\\` to update OpenMeld Service.`,\n nextSteps: [command],\n status: \"update_available\",\n summaryText: \"Update OpenMeld Service\",\n title: \"Update OpenMeld Service\",\n };\n }\n\n return {\n anomalyCodes,\n blocksWake: false,\n code: \"service_repair_recommended\",\n detailText:\n \"OpenMeld Service is running, but its local service setup does not fully match this OpenMeld lane. Reconnect OpenMeld Service before this computer receives new local Wake work.\",\n executionEvidenceSafe: input.executionEvidenceSafe ?? true,\n level: \"warning\",\n nextStep: `Run \\`${command}\\` to reconnect OpenMeld Service.`,\n nextSteps: [command],\n status: \"update_available\",\n summaryText: \"Reconnect OpenMeld Service\",\n title: \"Reconnect OpenMeld Service\",\n };\n}\n\nfunction dedupeAnomalyCodes(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): DaemonServiceAnomalyCode[] {\n return [...new Set(anomalyCodes)];\n}\n\nfunction formatServiceCommand(input: {\n cliEntry?: string | null;\n command: \"openmeld setup\";\n}): string {\n const cliEntry = String(input.cliEntry ?? \"\").trim();\n if (cliEntry) {\n return input.command.replace(OPENMELD_COMMAND_PREFIX_RE, cliEntry);\n }\n const [command] = formatOpenMeldCliCommands([input.command]) as [string];\n return command;\n}\n","import { formatOpenMeldCliCommands } from \"../../runtime/cli-entry-command\";\n\nexport type DaemonServiceRepairGuidance = {\n nextSteps: [string];\n summary: string;\n};\n\nexport type DaemonServiceRefreshBlockedReason =\n | \"foreground_service_active\"\n | \"lifecycle_action_in_progress\";\n\nconst DAEMON_SERVICE_SETUP_COMMAND = \"openmeld setup\";\nconst DAEMON_SERVICE_REFRESH_SUMMARY = \"OpenMeld Service needs repair.\";\nconst DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE =\n \"Reconnect OpenMeld Service before this computer can receive local Wake work.\";\nconst DAEMON_SERVICE_UPDATE_REQUIRED_RUNNING_MESSAGE =\n \"OpenMeld Service is running, but this version is not safe for new Wake work. Update OpenMeld Service.\";\nconst DAEMON_SERVICE_UPDATE_REQUIRED_STOPPED_MESSAGE =\n \"OpenMeld Service must be updated before it can start safely.\";\n\nexport function formatDaemonServiceRefreshSummary(): string {\n return DAEMON_SERVICE_REFRESH_SUMMARY;\n}\n\nexport function formatDaemonServiceRefreshReliabilityMessage(): string {\n return DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE;\n}\n\nexport function formatDaemonServiceUpdateRequiredMessage(input: {\n serviceIsRunning: boolean;\n}): string {\n return input.serviceIsRunning\n ? DAEMON_SERVICE_UPDATE_REQUIRED_RUNNING_MESSAGE\n : DAEMON_SERVICE_UPDATE_REQUIRED_STOPPED_MESSAGE;\n}\n\nexport function buildDaemonServiceUpdateRequiredNextStep(input: {\n serviceIsRunning: boolean;\n}): string {\n const command = formatDaemonServiceUpdateCommand();\n return input.serviceIsRunning\n ? `Update OpenMeld Service with \\`${command}\\`.`\n : `Update OpenMeld Service with \\`${command}\\`.`;\n}\n\nexport function buildDaemonServiceRefreshReadinessDetail(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} This computer may still be running an older local OpenMeld Service build, so local Wake work may not be received reliably until it is repaired.`;\n}\n\nexport function buildDaemonServiceRefreshPromptMessage(): string {\n return \"Reconnect OpenMeld Service before this computer can receive local Wake work. OpenMeld can reconnect it for you now.\";\n}\n\nexport function buildDaemonServiceRefreshHandoffMessage(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} Run \\`${formatDaemonServiceRefreshCommand()}\\` in human view, then return to OpenMeld Web.`;\n}\n\nexport function buildDaemonServiceRefreshNextStep(): string {\n return `Run \\`${formatDaemonServiceRefreshCommand()}\\` to repair OpenMeld Service.`;\n}\n\nexport function buildDaemonServiceRefreshRetryNextStep(): string {\n return `${DAEMON_SERVICE_REFRESH_SUMMARY} Run \\`${formatDaemonServiceRefreshCommand()}\\`, then retry.`;\n}\n\nexport function buildDaemonServiceStatusReadOnlyDetail(): string {\n return \"Status is read-only. It does not change OpenMeld Service.\";\n}\n\nexport function buildDaemonServiceTaskRetryNextStep(): string {\n return \"Try again after the current OpenMeld Service task finishes.\";\n}\n\nexport function buildDaemonServiceRefreshBlockedMessage(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n return `${DAEMON_SERVICE_REFRESH_RELIABILITY_MESSAGE} ${buildDaemonServiceRefreshBlockedNextStep(input)}`;\n}\n\nexport function buildDaemonServiceRefreshBlockedNextStep(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n if (input.reason === \"lifecycle_action_in_progress\") {\n return buildDaemonServiceTaskRetryNextStep();\n }\n return `${formatDaemonServiceRefreshBlockedAction(input)}.`;\n}\n\nfunction formatDaemonServiceRefreshBlockedAction(input: {\n reason: DaemonServiceRefreshBlockedReason;\n}): string {\n const unblock =\n input.reason === \"foreground_service_active\"\n ? \"Stop the foreground service first\"\n : \"Wait for the current OpenMeld Service task to finish\";\n return `${unblock}, then run \\`${formatDaemonServiceRefreshCommand()}\\``;\n}\n\nexport function buildDaemonServiceRepairGuidance(): DaemonServiceRepairGuidance {\n return {\n nextSteps: [formatDaemonServiceRefreshCommand()],\n summary: buildDaemonServiceRefreshNextStep(),\n };\n}\n\nfunction formatDaemonServiceRefreshCommand(): string {\n const [reinstallCommand] = formatOpenMeldCliCommands([\n DAEMON_SERVICE_SETUP_COMMAND,\n ]) as [string];\n return reinstallCommand;\n}\n\nfunction formatDaemonServiceUpdateCommand(): string {\n const [updateCommand] = formatOpenMeldCliCommands([\n DAEMON_SERVICE_SETUP_COMMAND,\n ]) as [string];\n return updateCommand;\n}\n","import type { DaemonServiceRuntimeStatus } from \"../config/daemon-state\";\nimport {\n classifyDaemonServiceWakeability,\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES,\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES,\n DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES,\n} from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport {\n resolveDaemonServiceFreshnessWarning,\n resolveDaemonServiceFreshnessWarningForAnomalyCodes,\n} from \"../local-service/lifecycle/daemon-service-freshness\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n buildDaemonServiceRefreshBlockedMessage,\n buildDaemonServiceRefreshBlockedNextStep,\n buildDaemonServiceRefreshReadinessDetail,\n buildDaemonServiceRepairGuidance,\n buildDaemonServiceUpdateRequiredNextStep,\n formatDaemonServiceRefreshReliabilityMessage,\n formatDaemonServiceUpdateRequiredMessage,\n} from \"../local-service/lifecycle/daemon-service-repair-guidance\";\nimport {\n formatOpenMeldCliCommand,\n formatOpenMeldCliCommands,\n} from \"../runtime/cli-entry-command\";\nimport { resolveGatewayChainRepairGuidance } from \"./gateway-chain-readiness\";\nimport type {\n DeviceReplyReadinessStatus,\n ReplyReadinessReasonCode,\n} from \"./reply-readiness\";\n\nexport type ServiceReadinessState =\n | \"ready\"\n | \"update_available\"\n | \"refresh_needed\"\n | \"refresh_blocked\"\n | \"not_installed\"\n | \"not_running\"\n | \"local_repair_needed\"\n | \"profile_required\"\n | \"unknown\";\n\nexport type ServiceRuntimeHeadline =\n | \"running\"\n | \"stale\"\n | \"not running\"\n | \"unknown\";\n\nexport type ServiceReadinessProjection = {\n anomalyCodes: DaemonServiceAnomalyCode[];\n detailText: string;\n nextStepSummary: string | null;\n nextSteps: string[];\n reasonCodes: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n state: ServiceReadinessState;\n summaryText: string;\n};\n\nexport type ServiceReadinessServiceStatus =\n | {\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"ready\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n advisoryAnomalyCodes?: DaemonServiceAnomalyCode[];\n }\n | {\n expectedVersion: string;\n kind: \"missing\";\n }\n | {\n expectedVersion: string;\n installedVersion: string;\n kind: \"outdated\";\n }\n | {\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"not_running\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n }\n | {\n anomalyCodes: string[];\n detail: string;\n expectedVersion: string;\n installedVersion: string | null;\n kind: \"needs_repair\";\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n }\n | {\n detail: string;\n kind: \"inspection_failed\" | \"repair_blocked\" | \"repair_failed\";\n };\n\nconst SERVICE_LOCK_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>([\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nconst LOCAL_REPAIR_REASON_CODES = new Set<ReplyReadinessReasonCode>([\n \"projection.missing\",\n \"controller.launch.needs_repair\",\n \"workspace.missing\",\n \"workspace.invalid\",\n]);\n\nconst SERVICE_DIAGNOSTIC_ONLY_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>(\n [\"bundle_content_drift\", \"bundle_version_drift\", \"version_outdated\"]\n);\n\nexport function resolveServiceReadiness(input: {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n inventory?: DaemonServiceInventory | null;\n profileRequired?: boolean;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n}): ServiceReadinessProjection {\n const reasonCodes = input.deviceReplyReadiness.reasonCodes;\n const anomalyCodes = collectServiceAnomalyCodes(input.inventory);\n const freshnessWarning = resolveDaemonServiceFreshnessWarning({\n inventory: input.inventory,\n });\n const wakeabilityClassification = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const repairAnomalyCodes = wakeabilityClassification.blockingCodes;\n const lockAnomalyCodes = anomalyCodes.filter((code) =>\n SERVICE_LOCK_ANOMALY_CODES.has(code)\n );\n const runtimeHeadline = resolveServiceRuntimeHeadline(input.runtimeStatus);\n\n if (input.profileRequired) {\n return {\n anomalyCodes,\n detailText: \"Choose an Agent Profile to check local service readiness.\",\n nextStepSummary: \"Choose an Agent Profile, then run this command again.\",\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"profile_required\",\n summaryText: \"Choose an Agent Profile\",\n };\n }\n\n if (repairAnomalyCodes.length > 0 && lockAnomalyCodes.length > 0) {\n const reason =\n input.runtimeStatus?.status === \"running\" &&\n input.runtimeStatus.mode === \"foreground\"\n ? \"foreground_service_active\"\n : \"lifecycle_action_in_progress\";\n return {\n anomalyCodes,\n detailText: buildDaemonServiceRefreshBlockedMessage({ reason }),\n nextStepSummary: buildDaemonServiceRefreshBlockedNextStep({ reason }),\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"refresh_blocked\",\n summaryText: \"Repair paused\",\n };\n }\n\n if (\n reasonCodes.includes(\"service.drifted\") ||\n repairAnomalyCodes.length > 0\n ) {\n if (isRuntimeContractUpdateRequired(repairAnomalyCodes)) {\n return createRuntimeContractUpdateRequiredProjection({\n anomalyCodes,\n reasonCodes,\n runtimeHeadline,\n });\n }\n const guidance = buildDaemonServiceRepairGuidance();\n return {\n anomalyCodes,\n detailText: buildDaemonServiceRefreshReadinessDetail(),\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"service.not_installed\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to connect OpenMeld Service.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"not_installed\",\n summaryText: \"Not installed\",\n };\n }\n\n if (reasonCodes.includes(\"service.not_running\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to reconnect OpenMeld Service.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"not_running\",\n summaryText: \"Not running\",\n };\n }\n\n if (reasonCodes.includes(\"service.gateway_chain_unhealthy\")) {\n const guidance = resolveGatewayChainRepairGuidance({});\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"local_repair_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"dispatch.storage_not_ready\")) {\n const guidance = resolveGatewayChainRepairGuidance({\n failureKind: \"dispatch_storage_not_ready\",\n });\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"OpenMeld cloud temporarily unavailable\",\n };\n }\n\n if (reasonCodes.some((code) => LOCAL_REPAIR_REASON_CODES.has(code))) {\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld doctor --repair\"),\n ];\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\`, then retry.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"local_repair_needed\",\n summaryText: \"Needs repair\",\n };\n }\n\n if (reasonCodes.includes(\"local_agents.none_needed\")) {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `If you later bring local agents from this device into a space, run \\`${nextSteps[0]}\\`.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Not needed for this action\",\n };\n }\n\n if (input.deviceReplyReadiness.replyReadiness === \"ready\") {\n if (freshnessWarning) {\n return createServiceStatusProjection({\n anomalyCodes,\n detailText: freshnessWarning.detailText,\n nextStepSummary: freshnessWarning.nextStep,\n nextSteps: freshnessWarning.nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"update_available\",\n summaryText: freshnessWarning.summaryText,\n });\n }\n return {\n anomalyCodes,\n detailText:\n \"OpenMeld Service is running and the local service link is available on this device\",\n nextStepSummary: null,\n nextSteps: [],\n reasonCodes,\n runtimeHeadline,\n state: \"ready\",\n summaryText: \"Running\",\n };\n }\n\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ];\n return {\n anomalyCodes,\n detailText: input.deviceReplyReadiness.reasonText,\n nextStepSummary: `Run \\`${nextSteps[0]}\\` to inspect OpenMeld Service on this device.`,\n nextSteps,\n reasonCodes,\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Unknown\",\n };\n}\n\nexport function resolveServiceReadinessFromServiceStatus(\n serviceStatus: ServiceReadinessServiceStatus\n): ServiceReadinessProjection {\n const runtimeHeadline =\n resolveRuntimeHeadlineFromServiceStatus(serviceStatus);\n\n if (serviceStatus.kind === \"ready\") {\n const freshnessProjection = createServiceFreshnessProjection({\n anomalyCodes: serviceStatus.advisoryAnomalyCodes ?? [],\n runtimeHeadline,\n });\n if (freshnessProjection) {\n return freshnessProjection;\n }\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is running on this device.\",\n nextStepSummary: null,\n nextSteps: [],\n runtimeHeadline,\n state: \"ready\",\n summaryText: \"Running\",\n });\n }\n\n if (serviceStatus.kind === \"missing\") {\n const nextSteps = formatOpenMeldCliCommands([\"openmeld setup\"]);\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is not installed on this device.\",\n nextStepSummary:\n \"Run `openmeld setup` to connect OpenMeld Service for local Wake work.\",\n nextSteps,\n runtimeHeadline,\n state: \"not_installed\",\n summaryText: \"Not installed\",\n });\n }\n\n if (serviceStatus.kind === \"outdated\") {\n return createServiceStatusProjection({\n anomalyCodes: [\"version_outdated\"],\n detailText: \"OpenMeld Service version is older than this CLI.\",\n nextStepSummary: \"Run `openmeld setup` to update OpenMeld Service.\",\n nextSteps: [formatOpenMeldCliCommand(\"openmeld setup\")],\n runtimeHeadline,\n state: \"update_available\",\n summaryText: \"Update OpenMeld Service\",\n });\n }\n\n if (serviceStatus.kind === \"not_running\") {\n const nextSteps: [string] = [formatOpenMeldCliCommand(\"openmeld setup\")];\n return createServiceStatusProjection({\n detailText: \"OpenMeld Service is installed but not running.\",\n nextStepSummary:\n \"Run `openmeld setup` to reconnect OpenMeld Service for local Wake work.\",\n nextSteps,\n runtimeHeadline,\n state: \"not_running\",\n summaryText: \"Not running\",\n });\n }\n\n if (serviceStatus.kind === \"needs_repair\") {\n const anomalyCodes = normalizeServiceAnomalyCodes(\n serviceStatus.anomalyCodes\n );\n if (isRuntimeContractUpdateRequired(anomalyCodes)) {\n return createRuntimeContractUpdateRequiredProjection({\n anomalyCodes,\n reasonCodes: [],\n runtimeHeadline,\n });\n }\n if (\n anomalyCodes.length > 0 &&\n shouldTreatServiceStatusAnomaliesAsDiagnosticOnly({\n anomalyCodes,\n runtimeHeadline,\n })\n ) {\n return createServiceDiagnosticEvidenceProjection({\n anomalyCodes,\n runtimeHeadline,\n });\n }\n const guidance = buildDaemonServiceRepairGuidance();\n return createServiceStatusProjection({\n anomalyCodes,\n detailText: formatDaemonServiceRefreshReliabilityMessage(),\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n });\n }\n\n if (serviceStatus.kind === \"repair_blocked\") {\n return createServiceStatusProjection({\n detailText:\n \"OpenMeld Service needs manual repair before OpenMeld can align it automatically.\",\n nextStepSummary: buildDaemonServiceRefreshBlockedNextStep({\n reason: \"lifecycle_action_in_progress\",\n }),\n nextSteps: formatOpenMeldCliCommands([\"openmeld service repair\"]),\n runtimeHeadline,\n state: \"refresh_blocked\",\n summaryText: \"Repair paused\",\n });\n }\n\n if (serviceStatus.kind === \"repair_failed\") {\n const guidance = buildDaemonServiceRepairGuidance();\n return createServiceStatusProjection({\n detailText:\n \"OpenMeld tried to repair OpenMeld Service automatically, but the service still needs attention.\",\n nextStepSummary: guidance.summary,\n nextSteps: guidance.nextSteps,\n runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Needs repair\",\n });\n }\n\n return createServiceStatusProjection({\n detailText: \"OpenMeld could not inspect OpenMeld Service on this device.\",\n nextStepSummary:\n \"Run `openmeld service status` first. If OpenMeld still cannot inspect the service, run `openmeld service repair`.\",\n nextSteps: formatOpenMeldCliCommands([\n \"openmeld service status\",\n \"openmeld service repair\",\n ]),\n runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Unknown\",\n });\n}\n\nexport function resolveServiceRuntimeHeadline(\n runtimeStatus: DaemonServiceRuntimeStatus | null | undefined\n): ServiceRuntimeHeadline {\n if (!runtimeStatus) {\n return \"unknown\";\n }\n if (runtimeStatus.status === \"running\") {\n return \"running\";\n }\n if (runtimeStatus.status === \"stale\") {\n return \"stale\";\n }\n if (runtimeStatus.status === \"not_running\") {\n return \"not running\";\n }\n return \"unknown\";\n}\n\nfunction collectServiceAnomalyCodes(\n inventory: DaemonServiceInventory | null | undefined\n): DaemonServiceAnomalyCode[] {\n if (!inventory) {\n return [];\n }\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory.anomalies) {\n if (!codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n\nfunction resolveRuntimeHeadlineFromServiceStatus(\n serviceStatus: ServiceReadinessServiceStatus\n): ServiceRuntimeHeadline {\n if (!(\"runtimeStatus\" in serviceStatus)) {\n return \"unknown\";\n }\n return resolveRuntimeHeadlineFromStatus(serviceStatus.runtimeStatus);\n}\n\nfunction resolveRuntimeHeadlineFromStatus(\n status: DaemonServiceRuntimeStatus[\"status\"] | null | undefined\n): ServiceRuntimeHeadline {\n if (status === \"running\") {\n return \"running\";\n }\n if (status === \"stale\") {\n return \"stale\";\n }\n if (status === \"not_running\") {\n return \"not running\";\n }\n return \"unknown\";\n}\n\nfunction createServiceDiagnosticEvidenceProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection {\n const freshnessProjection = createServiceFreshnessProjection(input);\n if (freshnessProjection) {\n return freshnessProjection;\n }\n const nextSteps: [string] = [\n formatOpenMeldCliCommand(\"openmeld service status\"),\n ];\n return createServiceStatusProjection({\n anomalyCodes: input.anomalyCodes,\n detailText:\n \"OpenMeld Service is installed. CLI version and service file differences are diagnostic unless service compatibility fails.\",\n nextStepSummary:\n \"Run `openmeld service status` to inspect OpenMeld Service on this device.\",\n nextSteps,\n runtimeHeadline: input.runtimeHeadline,\n state: \"unknown\",\n summaryText: \"Installed\",\n });\n}\n\nfunction createServiceFreshnessProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection | null {\n if (input.runtimeHeadline !== \"running\") {\n return null;\n }\n const warning = resolveDaemonServiceFreshnessWarningForAnomalyCodes({\n anomalyCodes: input.anomalyCodes ?? [],\n });\n if (!warning) {\n return null;\n }\n return createServiceStatusProjection({\n anomalyCodes: warning.anomalyCodes,\n detailText: warning.detailText,\n nextStepSummary: warning.nextStep,\n nextSteps: warning.nextSteps,\n runtimeHeadline: input.runtimeHeadline,\n state: \"update_available\",\n summaryText: warning.summaryText,\n });\n}\n\nfunction createRuntimeContractUpdateRequiredProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n reasonCodes: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): ServiceReadinessProjection {\n const nextSteps: [string] = [formatOpenMeldCliCommand(\"openmeld setup\")];\n const serviceIsRunning = input.runtimeHeadline === \"running\";\n return createServiceStatusProjection({\n anomalyCodes: input.anomalyCodes,\n detailText: formatDaemonServiceUpdateRequiredMessage({\n serviceIsRunning,\n }),\n nextStepSummary: buildDaemonServiceUpdateRequiredNextStep({\n serviceIsRunning,\n }),\n nextSteps,\n reasonCodes: input.reasonCodes,\n runtimeHeadline: input.runtimeHeadline,\n state: \"refresh_needed\",\n summaryText: \"Update OpenMeld Service\",\n });\n}\n\nfunction createServiceStatusProjection(input: {\n anomalyCodes?: DaemonServiceAnomalyCode[];\n detailText: string;\n nextStepSummary: string | null;\n nextSteps: string[];\n reasonCodes?: ReplyReadinessReasonCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n state: ServiceReadinessState;\n summaryText: string;\n}): ServiceReadinessProjection {\n return {\n anomalyCodes: input.anomalyCodes ?? [],\n detailText: input.detailText,\n nextStepSummary: input.nextStepSummary,\n nextSteps: input.nextSteps,\n reasonCodes: input.reasonCodes ?? [],\n runtimeHeadline: input.runtimeHeadline,\n state: input.state,\n summaryText: input.summaryText,\n };\n}\n\nfunction isRuntimeContractUpdateRequired(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): boolean {\n return (\n anomalyCodes.length === 1 && anomalyCodes[0] === \"runtime_contract_mismatch\"\n );\n}\n\nfunction shouldTreatServiceStatusAnomaliesAsDiagnosticOnly(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n runtimeHeadline: ServiceRuntimeHeadline;\n}): boolean {\n return input.anomalyCodes.every((code) => {\n if (code === \"bundle_content_drift\") {\n return input.runtimeHeadline === \"running\";\n }\n return SERVICE_DIAGNOSTIC_ONLY_ANOMALY_CODES.has(code);\n });\n}\n\nfunction normalizeServiceAnomalyCodes(\n anomalyCodes: readonly string[]\n): DaemonServiceAnomalyCode[] {\n const normalized: DaemonServiceAnomalyCode[] = [];\n for (const code of anomalyCodes) {\n const serviceCode = code as DaemonServiceAnomalyCode;\n if (\n (DAEMON_SERVICE_WAKEABILITY_HARD_BLOCKER_ANOMALIES.has(serviceCode) ||\n DAEMON_SERVICE_WAKEABILITY_CONDITIONAL_ANOMALIES.has(serviceCode) ||\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(serviceCode) ||\n SERVICE_LOCK_ANOMALY_CODES.has(serviceCode)) &&\n !normalized.includes(serviceCode)\n ) {\n normalized.push(serviceCode);\n }\n }\n return normalized;\n}\n","import type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport { resolveServiceReadiness } from \"../../system/service-readiness-resolver\";\nimport type { DaemonLifecycleEvent } from \"../lifecycle/daemon-lifecycle-journal\";\nimport {\n classifyDaemonServiceRunStartability,\n classifyDaemonServiceWakeability,\n} from \"../lifecycle/daemon-service-anomaly-groups\";\nimport { resolveDaemonServiceFreshnessWarning } from \"../lifecycle/daemon-service-freshness\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"../lifecycle/daemon-service-inventory\";\nimport {\n buildDaemonServiceRefreshNextStep,\n buildDaemonServiceUpdateRequiredNextStep,\n formatDaemonServiceRefreshReliabilityMessage,\n formatDaemonServiceUpdateRequiredMessage,\n} from \"../lifecycle/daemon-service-repair-guidance\";\n\nconst STATUS_LOCK_ANOMALY_CODES = new Set<DaemonServiceAnomalyCode>([\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n]);\n\nexport type DaemonStatusAttention = {\n level: \"info\" | \"warning\";\n code:\n | \"authentication_required\"\n | \"service_dependencies_unavailable\"\n | \"foreground_service_active\"\n | \"lifecycle_action_in_progress\"\n | \"service_repair_recommended\"\n | \"service_update_available\"\n | \"service_update_required\";\n title: string;\n message: string;\n nextStep: string | null;\n anomalyCodes: DaemonServiceAnomalyCode[];\n};\n\nexport function resolveDaemonStatusAuthenticationAttention(input: {\n latestConnectionStateEvent: DaemonLifecycleEvent | null;\n}): DaemonStatusAttention | null {\n const event = input.latestConnectionStateEvent;\n if (\n event?.type !== \"connection.state\" ||\n event.result !== \"authentication_required\"\n ) {\n return null;\n }\n\n const authState = normalizeAuthState(event.metadata?.authState);\n return {\n level: \"warning\",\n code: \"authentication_required\",\n title: \"Sign In to OpenMeld\",\n message: `OpenMeld Service is running, but it cannot connect to OpenMeld because this computer is ${formatAuthenticationRequiredReason(authState)}. Wake will recover automatically after sign-in.`,\n nextStep:\n \"Run `openmeld auth login`. If OpenMeld Service still cannot reconnect after sign-in, run `openmeld service repair`.\",\n anomalyCodes: [],\n };\n}\n\nexport function resolveDaemonStatusAttention(input: {\n inventory: DaemonServiceInventory | null;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): DaemonStatusAttention | null {\n if (!input.inventory) {\n return null;\n }\n\n const wakeability = classifyDaemonServiceWakeability({\n inventory: input.inventory,\n });\n const startability = classifyDaemonServiceRunStartability({\n inventory: input.inventory,\n });\n const lockCodes = collectAnomalyCodes(\n input.inventory,\n STATUS_LOCK_ANOMALY_CODES\n );\n const repairCodes = dedupeAnomalyCodes([\n ...wakeability.blockingCodes,\n ...startability.blockingCodes,\n ]).filter((code) => !lockCodes.includes(code));\n if (lockCodes.length > 0 && repairCodes.length > 0) {\n const readiness = resolveServiceReadiness({\n deviceReplyReadiness: createStatusAttentionReplyReadiness(),\n inventory: input.inventory,\n runtimeStatus: input.runtimeState,\n });\n return {\n level: \"warning\",\n code: \"service_repair_recommended\",\n title: \"OpenMeld Service Repair Paused\",\n message: readiness.detailText,\n nextStep: readiness.nextStepSummary,\n anomalyCodes: dedupeAnomalyCodes([...repairCodes, ...lockCodes]),\n };\n }\n if (lockCodes.length > 0 && isForegroundRuntimeActive(input.runtimeState)) {\n return {\n level: \"info\",\n code: \"foreground_service_active\",\n title: \"Foreground Service Active\",\n message:\n \"A foreground OpenMeld service is active on this device, so background cleanup and auto-heal stay paused to avoid fighting the live route owner.\",\n nextStep:\n \"No action is required. Stop the foreground service first if you want OpenMeld to resume background repair or management.\",\n anomalyCodes: lockCodes,\n };\n }\n\n if (lockCodes.length > 0) {\n return {\n level: \"info\",\n code: \"lifecycle_action_in_progress\",\n title: \"OpenMeld Service Task In Progress\",\n message:\n \"Another OpenMeld Service task is already running, so this status check stays read-only until it finishes.\",\n nextStep:\n \"Try `openmeld service status` again after the current OpenMeld Service task finishes.\",\n anomalyCodes: lockCodes,\n };\n }\n if (repairCodes.length === 0) {\n const freshnessWarning = resolveDaemonServiceFreshnessWarning({\n inventory: input.inventory,\n });\n if (freshnessWarning) {\n return {\n level: freshnessWarning.level,\n code: freshnessWarning.code,\n title: freshnessWarning.title,\n message: freshnessWarning.detailText,\n nextStep: freshnessWarning.nextStep,\n anomalyCodes: freshnessWarning.anomalyCodes,\n };\n }\n return null;\n }\n\n const readiness = resolveServiceReadiness({\n deviceReplyReadiness: createStatusAttentionReplyReadiness(),\n inventory: input.inventory,\n runtimeStatus: input.runtimeState,\n });\n const serviceIsRunning = isRuntimeActive(input.runtimeState);\n if (isRuntimeContractUpdateRequired(repairCodes)) {\n return {\n level: \"warning\",\n code: \"service_update_required\",\n title: \"Update OpenMeld Service\",\n message: formatDaemonServiceUpdateRequiredMessage({\n serviceIsRunning,\n }),\n nextStep: buildDaemonServiceUpdateRequiredNextStep({\n serviceIsRunning,\n }),\n anomalyCodes: readiness.anomalyCodes.filter((code) =>\n repairCodes.includes(code)\n ),\n };\n }\n return {\n level: \"warning\",\n code: \"service_repair_recommended\",\n title: \"OpenMeld Service Needs Repair\",\n message: formatDaemonServiceRefreshReliabilityMessage(),\n nextStep: readiness.nextStepSummary ?? buildDaemonServiceRefreshNextStep(),\n anomalyCodes: readiness.anomalyCodes.filter((code) =>\n repairCodes.includes(code)\n ),\n };\n}\n\nfunction collectAnomalyCodes(\n inventory: DaemonServiceInventory,\n allowedCodes: ReadonlySet<DaemonServiceAnomalyCode>\n): DaemonServiceAnomalyCode[] {\n const codes: DaemonServiceAnomalyCode[] = [];\n for (const anomaly of inventory.anomalies) {\n if (allowedCodes.has(anomaly.code) && !codes.includes(anomaly.code)) {\n codes.push(anomaly.code);\n }\n }\n return codes;\n}\n\nfunction isForegroundRuntimeActive(\n runtimeState: DaemonServiceRuntimeStatus | null\n): boolean {\n return (\n runtimeState?.status === \"running\" && runtimeState.mode === \"foreground\"\n );\n}\n\nfunction isRuntimeActive(\n runtimeState: DaemonServiceRuntimeStatus | null\n): boolean {\n return runtimeState?.status === \"running\";\n}\n\nfunction isRuntimeContractUpdateRequired(\n repairCodes: readonly DaemonServiceAnomalyCode[]\n): boolean {\n return (\n repairCodes.length === 1 && repairCodes[0] === \"runtime_contract_mismatch\"\n );\n}\n\nfunction normalizeAuthState(value: unknown): string {\n return typeof value === \"string\" ? value : \"unknown\";\n}\n\nfunction formatAuthenticationRequiredReason(authState: string): string {\n switch (authState) {\n case \"expired\":\n return \"signed in with an expired session\";\n case \"missing\":\n return \"not signed in\";\n case \"invalid\":\n return \"signed in with an invalid local session\";\n case \"revoked\":\n return \"signed in with a revoked session\";\n default:\n return \"not currently authenticated\";\n }\n}\n\nfunction createStatusAttentionReplyReadiness() {\n return {\n reasonCodes: [],\n reasonText:\n \"OpenMeld Service status attention is based on local service state.\",\n replyReadiness: \"ready\" as const,\n updatedAt: new Date(0).toISOString(),\n wakeableRouteCount: 0,\n };\n}\n\nfunction dedupeAnomalyCodes(\n anomalyCodes: readonly DaemonServiceAnomalyCode[]\n): DaemonServiceAnomalyCode[] {\n return [...new Set(anomalyCodes)];\n}\n","import { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { resolveOpenMeldProfileOrNull } from \"../../config/resolve-openmeld-profile\";\nimport {\n type RuntimeContext,\n resolveRuntimeContext,\n} from \"../../runtime/context\";\nimport {\n type CurrentReplyReadinessSnapshot,\n resolveCurrentReplyReadinessSnapshot,\n} from \"../../system/current-reply-readiness-snapshot\";\nimport { DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS } from \"../../system/gateway-chain-readiness\";\nimport {\n type DaemonLifecycleEvent,\n readLatestDaemonLifecycleConnectionStateEvent,\n readLatestDaemonLifecycleOriginEvent,\n} from \"../lifecycle/daemon-lifecycle-journal\";\nimport {\n buildDaemonServiceDependencyMeaning,\n buildDaemonServiceDependencyNextStep,\n buildDaemonServiceDependencySummary,\n buildDaemonServiceDependencyTitle,\n type DaemonServiceDependencyIssue,\n resolveDaemonServiceDependencyDiagnostics,\n} from \"../lifecycle/daemon-service-dependency-diagnostics\";\nimport {\n type DaemonStartFailureState,\n readDaemonStartFailureState,\n} from \"../state/daemon-start-failure-state\";\nimport { readDaemonRuntimeContractRepairReport } from \"../state/runtime-contract-guard\";\nimport type { DaemonLocalStatusSnapshot } from \"./daemon-local-status-snapshot\";\nimport {\n type DaemonStatusAttention,\n resolveDaemonStatusAttention,\n resolveDaemonStatusAuthenticationAttention,\n} from \"./daemon-status-attention\";\n\nexport type DaemonStatusSnapshot = {\n attention: DaemonStatusAttention | null;\n currentReplyReadiness: CurrentReplyReadinessSnapshot;\n latestConnectionStateEvent: DaemonLifecycleEvent | null;\n latestLifecycleEvent: DaemonLifecycleEvent | null;\n runtimeContractRepairReport: Awaited<\n ReturnType<typeof readDaemonRuntimeContractRepairReport>\n > | null;\n};\n\nconst DAEMON_STATUS_GATEWAY_CHAIN_TIMEOUT_MS = DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS;\n\nexport async function resolveDaemonStatusSnapshot(\n input: {\n localSnapshot?: DaemonLocalStatusSnapshot;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<DaemonStatusSnapshot> {\n const runtime =\n input.runtime ??\n (await resolveRuntimeContext({\n profile: input.profile,\n view: input.view,\n }));\n const activeProfile = await resolveOpenMeldProfileOrNull({\n openMeldProfileId: runtime.openMeldProfileId,\n allowDefaultFallback: runtime.resolvedView === \"human\",\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null);\n let gatewayChainProfile: {\n openMeldProfileId: string;\n profileName?: string;\n } | null = null;\n if (activeProfile) {\n gatewayChainProfile = {\n openMeldProfileId: activeProfile.openMeldProfileId,\n profileName: activeProfile.profileName,\n };\n } else if (runtime.openMeldProfileId) {\n gatewayChainProfile = {\n openMeldProfileId: runtime.openMeldProfileId,\n };\n }\n const currentReplyReadiness = await resolveCurrentReplyReadinessSnapshot({\n checkGatewayChain: true,\n gatewayChainProfile,\n gatewayChainTimeoutMs: DAEMON_STATUS_GATEWAY_CHAIN_TIMEOUT_MS,\n includeDaemonRouteObservation: true,\n localServiceObservation: input.localSnapshot,\n ownerUserId: activeProfile?.ownerUserId ?? null,\n preferActiveServiceRouteCatalog: true,\n profile: activeProfile,\n });\n const runtimeContractRepairReport =\n await resolveRuntimeContractRepairReportForStatus({\n daemonInstalled: currentReplyReadiness.daemonStatus.installed,\n localSnapshot: input.localSnapshot,\n });\n const latestLifecycleEvent = input.localSnapshot\n ? input.localSnapshot.latestLifecycleEvent\n : await readLatestDaemonLifecycleOriginEvent().catch(() => null);\n const latestConnectionStateEvent = input.localSnapshot\n ? input.localSnapshot.latestConnectionStateEvent\n : await readLatestDaemonLifecycleConnectionStateEvent().catch(() => null);\n const baseAttention = demoteRepairAttentionForLiveRoute({\n attention: resolveDaemonStatusAttention({\n inventory: currentReplyReadiness.inventory,\n runtimeState:\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus,\n }),\n daemonRouteObservation: currentReplyReadiness.daemonRouteObservation,\n });\n const liveDependencyDiagnostics =\n shouldCheckDaemonServiceDependenciesForStatus(\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus\n )\n ? await resolveDaemonServiceDependencyDiagnostics({\n scopePolicy: \"loopback_only\",\n }).catch(() => null)\n : null;\n const recordedStartFailure = shouldCheckDaemonServiceDependenciesForStatus(\n currentReplyReadiness.displayRuntimeStatus ??\n currentReplyReadiness.runtimeStatus\n )\n ? await readDaemonStartFailureState().catch(() => null)\n : null;\n const attention =\n resolveDaemonStatusAuthenticationAttention({\n latestConnectionStateEvent,\n }) ??\n baseAttention ??\n resolveDaemonStatusServiceDependencyAttention({\n liveDiagnostics: liveDependencyDiagnostics,\n recordedStartFailure,\n });\n return {\n attention,\n currentReplyReadiness,\n latestConnectionStateEvent,\n latestLifecycleEvent,\n runtimeContractRepairReport,\n };\n}\n\nasync function resolveRuntimeContractRepairReportForStatus(input: {\n daemonInstalled: boolean;\n localSnapshot?: DaemonLocalStatusSnapshot;\n}) {\n if (input.localSnapshot) {\n return input.localSnapshot.runtimeContractRepairReport;\n }\n if (!input.daemonInstalled) {\n return null;\n }\n return await readDaemonRuntimeContractRepairReport().catch(() => null);\n}\n\n// facts.md read rule: a live Core Wake route is the authoritative liveness\n// fact for this device. Stale local anomalies stay visible as inventory\n// diagnostics, but they must not headline \"needs repair\" while the cloud\n// confirms this device is carrying Wake traffic right now.\nfunction demoteRepairAttentionForLiveRoute(input: {\n attention: DaemonStatusAttention | null;\n daemonRouteObservation: CurrentReplyReadinessSnapshot[\"daemonRouteObservation\"];\n}): DaemonStatusAttention | null {\n if (!input.attention) {\n return null;\n }\n if (input.attention.code !== \"service_repair_recommended\") {\n return input.attention;\n }\n if (input.daemonRouteObservation.status !== \"online\") {\n return input.attention;\n }\n return null;\n}\n\nfunction shouldCheckDaemonServiceDependenciesForStatus(\n runtimeState: CurrentReplyReadinessSnapshot[\"runtimeStatus\"]\n): boolean {\n return runtimeState?.status !== \"running\";\n}\n\nfunction resolveDaemonStatusServiceDependencyAttention(input: {\n liveDiagnostics: Awaited<\n ReturnType<typeof resolveDaemonServiceDependencyDiagnostics>\n > | null;\n recordedStartFailure: DaemonStartFailureState | null;\n}): DaemonStatusAttention | null {\n if (input.liveDiagnostics?.applicable && !input.liveDiagnostics.ready) {\n return buildDaemonStatusServiceDependencyAttention({\n issues: input.liveDiagnostics.issues,\n lane: input.liveDiagnostics.lane,\n });\n }\n\n if (\n input.recordedStartFailure?.reason === \"service_dependencies_unavailable\" &&\n input.recordedStartFailure.dependencyIssues.length > 0 &&\n input.recordedStartFailure.lane === resolveOpenMeldEnvPreset()\n ) {\n return buildDaemonStatusServiceDependencyAttention({\n issues: input.recordedStartFailure.dependencyIssues,\n lane: input.recordedStartFailure.lane,\n });\n }\n\n return null;\n}\n\nfunction buildDaemonStatusServiceDependencyAttention(input: {\n issues: DaemonServiceDependencyIssue[];\n lane: DaemonStartFailureState[\"lane\"];\n}): DaemonStatusAttention {\n return {\n level: \"warning\",\n code: \"service_dependencies_unavailable\",\n title: buildDaemonServiceDependencyTitle({\n issues: input.issues,\n lane: input.lane,\n }),\n message: `${buildDaemonServiceDependencySummary({\n issues: input.issues,\n lane: input.lane,\n })} ${buildDaemonServiceDependencyMeaning({\n issues: input.issues,\n lane: input.lane,\n })}`,\n nextStep: buildDaemonServiceDependencyNextStep({\n command: \"status\",\n issues: input.issues,\n lane: input.lane,\n }),\n anomalyCodes: [],\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { cp, mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n daemonLifecycleJournalPath,\n daemonRuntimeDataPath,\n daemonRuntimeRootPath,\n daemonRuntimeStateRootPath,\n} from \"../../config/daemon-state\";\nimport { openMeldBackupsDir, openMeldRootDir } from \"../../config/paths\";\nimport type { RuntimeContext } from \"../../runtime/context\";\nimport {\n type DaemonStatusSnapshot,\n resolveDaemonStatusSnapshot,\n} from \"../status/daemon-status-snapshot\";\nimport {\n getDaemonServiceLaunchdLabel,\n getDaemonSystemServiceLogPath,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\nconst DAEMON_SERVICE_EVIDENCE_SCHEMA = \"openmeld-daemon-service-evidence-v3\";\nconst SYSTEM_SERVICE_DIAGNOSTICS_TIMEOUT_MS = 5000;\n\nexport type DaemonServiceEvidencePhase =\n | \"after_failure\"\n | \"before_cleanup\"\n | \"snapshot\";\n\nexport type DaemonServiceFailureStage =\n | \"inspect\"\n | \"backup\"\n | \"stop_or_drain\"\n | \"wait_stopped\"\n | \"unregister\"\n | \"wait_absent\"\n | \"prepare_bundle\"\n | \"install_bundle\"\n | \"write_contract\"\n | \"register_service\"\n | \"restore_runtime_data\"\n | \"start_if_desired\"\n | \"wait_running\"\n | \"verify_final_inventory\"\n | \"restored_verified_previous_state\"\n | \"stopped_safe_current_version\"\n | \"failed_before_safe_state\"\n | \"pre-stop\"\n | \"stop-wait\"\n | \"uninstall-verify\"\n | \"reinstall-install\"\n | \"restore-last-known-good\";\n\ntype EvidenceArtifactStatus = {\n errorMessage: string | null;\n relativePath: string | null;\n sourcePath: string | null;\n status: \"captured\" | \"error\" | \"missing\" | \"skipped\";\n};\n\ntype DaemonServiceEvidenceCapturePhase = {\n artifacts: {\n lifecycleJournal: EvidenceArtifactStatus;\n ownedProcesses: EvidenceArtifactStatus;\n runtimeData: EvidenceArtifactStatus;\n runtimeLogs: EvidenceArtifactStatus;\n runtimeState: EvidenceArtifactStatus;\n systemServiceDiagnostics: EvidenceArtifactStatus;\n };\n capturedAt: string;\n observedStatusSnapshot: DaemonStatusSnapshot | null;\n observedStatusSnapshotError: string | null;\n phase: DaemonServiceEvidencePhase;\n};\n\ntype DaemonServiceEvidenceManifest = {\n captures: Partial<\n Record<DaemonServiceEvidencePhase, DaemonServiceEvidenceCapturePhase>\n >;\n createdAt: string;\n evidencePath: string;\n laneRootPath: string;\n paths: {\n backupsRootPath: string;\n lifecycleJournalPath: string;\n runtimeDataPath: string;\n runtimeLogsPath: string;\n runtimeRootPath: string;\n runtimeStatePath: string;\n systemServiceLogPath: string;\n };\n serviceIdentity: {\n launchdLabel: string;\n };\n schema: typeof DAEMON_SERVICE_EVIDENCE_SCHEMA;\n v: 3;\n};\n\nexport type DaemonServiceEvidenceCapture = {\n evidencePath: string;\n manifestPath: string;\n phase: DaemonServiceEvidencePhase;\n};\n\nexport async function captureDaemonServiceEvidence(\n input: {\n evidencePath?: string;\n phase?: DaemonServiceEvidencePhase;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<DaemonServiceEvidenceCapture> {\n const phase = input.phase ?? \"snapshot\";\n const capturedAt = new Date().toISOString();\n const evidencePath =\n input.evidencePath ?? (await createEvidenceRoot(capturedAt));\n const manifestPath = join(evidencePath, \"manifest.json\");\n const phaseRootPath = join(evidencePath, phase);\n const runtimeRootPath = daemonRuntimeRootPath();\n const runtimeLogsPath = join(runtimeRootPath, \"logs\");\n const runtimeStatePath = daemonRuntimeStateRootPath();\n const runtimeDataPath = daemonRuntimeDataPath();\n const lifecycleJournalPath = daemonLifecycleJournalPath();\n const systemServiceLogPath = getDaemonSystemServiceLogPath();\n\n const [statusSnapshotResult, ownedProcessesResult, systemDiagnosticsResult] =\n await Promise.all([\n resolveDaemonStatusSnapshot({\n profile: input.profile,\n runtime: input.runtime,\n view: input.view,\n })\n .then((snapshot) => ({\n snapshot,\n errorMessage: null,\n }))\n .catch((error) => ({\n snapshot: null,\n errorMessage: toErrorMessage(error),\n })),\n captureOwnedProcessesArtifact(phaseRootPath),\n captureSystemServiceDiagnosticsArtifact(phaseRootPath),\n ]);\n const runtimeLogsArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"logs\"),\n sourcePath: runtimeLogsPath,\n });\n const lifecycleJournalArtifact = await captureFileArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"daemon-lifecycle-journal.jsonl\"),\n sourcePath: lifecycleJournalPath,\n });\n const runtimeStateArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"state\"),\n sourcePath: runtimeStatePath,\n });\n const runtimeDataArtifact = await captureDirectoryArtifact({\n evidencePath: phaseRootPath,\n relativePath: join(\"runtime\", \"data\"),\n sourcePath: runtimeDataPath,\n });\n\n const phaseCapture: DaemonServiceEvidenceCapturePhase = {\n artifacts: {\n lifecycleJournal: lifecycleJournalArtifact,\n ownedProcesses: ownedProcessesResult.artifact,\n runtimeData: runtimeDataArtifact,\n runtimeLogs: runtimeLogsArtifact,\n runtimeState: runtimeStateArtifact,\n systemServiceDiagnostics: systemDiagnosticsResult.artifact,\n },\n observedStatusSnapshot: statusSnapshotResult.snapshot,\n observedStatusSnapshotError: statusSnapshotResult.errorMessage,\n capturedAt,\n phase,\n };\n const existingManifest =\n await readDaemonServiceEvidenceManifest(manifestPath);\n const manifest: DaemonServiceEvidenceManifest = {\n captures: {\n ...(existingManifest?.captures ?? {}),\n [phase]: phaseCapture,\n },\n createdAt: existingManifest?.createdAt ?? capturedAt,\n evidencePath,\n laneRootPath: openMeldRootDir(),\n paths: {\n backupsRootPath: openMeldBackupsDir(),\n lifecycleJournalPath,\n runtimeDataPath,\n runtimeLogsPath,\n runtimeRootPath,\n runtimeStatePath,\n systemServiceLogPath,\n },\n serviceIdentity: {\n launchdLabel: getDaemonServiceLaunchdLabel(),\n },\n schema: DAEMON_SERVICE_EVIDENCE_SCHEMA,\n v: 3,\n };\n\n await writeFile(`${manifestPath}`, `${JSON.stringify(manifest, null, 2)}\\n`, {\n encoding: \"utf8\",\n });\n\n return {\n evidencePath,\n manifestPath,\n phase,\n };\n}\n\nexport async function captureDaemonServiceEvidenceBestEffort(\n input: {\n evidencePath?: string;\n phase?: DaemonServiceEvidencePhase;\n profile?: string;\n runtime?: RuntimeContext;\n view?: string;\n } = {}\n): Promise<string | null> {\n return await captureDaemonServiceEvidence(input)\n .then((result) => result.evidencePath)\n .catch(() => null);\n}\n\nexport async function removeDaemonServiceEvidenceBestEffort(\n evidencePath: string | null | undefined\n): Promise<void> {\n if (!evidencePath) {\n return;\n }\n await rm(evidencePath, {\n force: true,\n recursive: true,\n }).catch(() => undefined);\n}\n\nexport function formatDaemonFailureRetentionText(input: {\n backupDataPath?: string | null;\n evidencePath?: string | null;\n wrapPaths?: boolean;\n}): string {\n const formatPath = (value: string): string =>\n input.wrapPaths === true ? `\\`${value}\\`` : value;\n const notes = [\n input.backupDataPath\n ? `Runtime data backup retained at ${formatPath(input.backupDataPath)}.`\n : null,\n input.evidencePath\n ? `Service evidence snapshot saved at ${formatPath(input.evidencePath)}.`\n : null,\n ].filter((value): value is string => value !== null);\n return notes.join(\" \");\n}\n\nexport function formatDaemonFailureContextText(input: {\n backupDataPath?: string | null;\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n wrapPaths?: boolean;\n}): string {\n const notes = [\n input.failureStage ? `Failure stage: ${input.failureStage}.` : null,\n formatDaemonFailureRetentionText(input),\n ].filter(\n (value): value is string => typeof value === \"string\" && value.length > 0\n );\n return notes.join(\" \");\n}\n\nasync function createEvidenceRoot(createdAt: string): Promise<string> {\n const timestampSegment = createdAt.replaceAll(\":\", \"-\");\n const evidencePath = join(\n openMeldBackupsDir(),\n \"service-evidence\",\n `${timestampSegment}-${String(process.pid)}`\n );\n await mkdir(evidencePath, {\n recursive: true,\n });\n return evidencePath;\n}\n\nasync function readDaemonServiceEvidenceManifest(\n manifestPath: string\n): Promise<DaemonServiceEvidenceManifest | null> {\n const raw = await readFile(manifestPath, \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonServiceEvidenceManifest>;\n if (\n parsed?.schema !== DAEMON_SERVICE_EVIDENCE_SCHEMA ||\n parsed.v !== 3 ||\n typeof parsed.evidencePath !== \"string\" ||\n typeof parsed.createdAt !== \"string\" ||\n typeof parsed.laneRootPath !== \"string\" ||\n !parsed.paths ||\n !parsed.serviceIdentity\n ) {\n return null;\n }\n return parsed as DaemonServiceEvidenceManifest;\n } catch {\n return null;\n }\n}\n\nasync function captureDirectoryArtifact(input: {\n evidencePath: string;\n relativePath: string;\n sourcePath: string;\n}): Promise<EvidenceArtifactStatus> {\n const sourceStats = await stat(input.sourcePath).catch(() => null);\n if (!sourceStats?.isDirectory()) {\n return {\n errorMessage: null,\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"missing\",\n };\n }\n\n const targetPath = join(input.evidencePath, input.relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n await cp(input.sourcePath, targetPath, {\n recursive: true,\n });\n return {\n errorMessage: null,\n relativePath: input.relativePath,\n sourcePath: input.sourcePath,\n status: \"captured\",\n };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"error\",\n };\n }\n}\n\nasync function captureFileArtifact(input: {\n evidencePath: string;\n relativePath: string;\n sourcePath: string;\n}): Promise<EvidenceArtifactStatus> {\n const sourceStats = await stat(input.sourcePath).catch(() => null);\n if (!sourceStats?.isFile()) {\n return {\n errorMessage: null,\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"missing\",\n };\n }\n\n const targetPath = join(input.evidencePath, input.relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n await cp(input.sourcePath, targetPath);\n return {\n errorMessage: null,\n relativePath: input.relativePath,\n sourcePath: input.sourcePath,\n status: \"captured\",\n };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: input.sourcePath,\n status: \"error\",\n };\n }\n}\n\nasync function captureOwnedProcessesArtifact(evidencePath: string): Promise<{\n artifact: EvidenceArtifactStatus;\n}> {\n const relativePath = join(\"diagnostics\", \"owned-processes.json\");\n const targetPath = join(evidencePath, relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n try {\n const ownedProcesses = await listDaemonOwnedProcesses();\n await writeFile(\n `${targetPath}`,\n `${JSON.stringify(ownedProcesses, null, 2)}\\n`,\n \"utf8\"\n );\n return {\n artifact: {\n errorMessage: null,\n relativePath,\n sourcePath: null,\n status: \"captured\",\n },\n };\n } catch (error) {\n return {\n artifact: {\n errorMessage: toErrorMessage(error),\n relativePath: null,\n sourcePath: null,\n status: \"error\",\n },\n };\n }\n}\n\nasync function captureSystemServiceDiagnosticsArtifact(\n evidencePath: string\n): Promise<{\n artifact: EvidenceArtifactStatus;\n}> {\n if (process.platform !== \"darwin\") {\n return {\n artifact: {\n errorMessage:\n \"system service diagnostics are only implemented for macOS in this release\",\n relativePath: null,\n sourcePath: null,\n status: \"skipped\",\n },\n };\n }\n\n const uid =\n typeof process.getuid === \"function\" ? String(process.getuid()) : null;\n if (!uid) {\n return {\n artifact: {\n errorMessage:\n \"could not resolve local user id for launchctl diagnostics\",\n relativePath: null,\n sourcePath: null,\n status: \"error\",\n },\n };\n }\n\n const launchdLabel = getDaemonServiceLaunchdLabel();\n const command = \"launchctl\";\n const args = [\"print\", `gui/${uid}/${launchdLabel}`];\n const result = await runCommand(command, args, {\n timeoutMs: SYSTEM_SERVICE_DIAGNOSTICS_TIMEOUT_MS,\n });\n const relativePath = join(\"diagnostics\", \"system-service.txt\");\n const targetPath = join(evidencePath, relativePath);\n await mkdir(join(targetPath, \"..\"), {\n recursive: true,\n });\n const body = [\n `command: ${command} ${args.join(\" \")}`,\n `exitCode: ${String(result.exitCode)}`,\n \"\",\n \"stdout:\",\n result.stdout.trimEnd(),\n \"\",\n \"stderr:\",\n result.stderr.trimEnd(),\n \"\",\n ].join(\"\\n\");\n await writeFile(`${targetPath}`, body, \"utf8\");\n return {\n artifact: {\n errorMessage:\n result.exitCode === 0\n ? null\n : result.stderr.trim() ||\n `launchctl exited with ${String(result.exitCode)}`,\n relativePath,\n sourcePath: null,\n status: result.exitCode === 0 ? \"captured\" : \"error\",\n },\n };\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n input: {\n timeoutMs?: number;\n } = {}\n): Promise<{\n exitCode: number;\n stderr: string;\n stdout: string;\n}> {\n return await new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const clearListenersAndTimer = (): void => {\n child.removeListener(\"error\", handleError);\n child.removeListener(\"close\", handleClose);\n child.stdout?.removeListener(\"data\", handleStdout);\n child.stderr?.removeListener(\"data\", handleStderr);\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n };\n\n const resolveOnce = (result: {\n exitCode: number;\n stderr: string;\n stdout: string;\n }): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearListenersAndTimer();\n resolve(result);\n };\n\n const handleStdout = (chunk: Buffer | string): void => {\n stdout += chunk.toString();\n };\n const handleStderr = (chunk: Buffer | string): void => {\n stderr += chunk.toString();\n };\n const handleError = (error: Error): void => {\n resolveOnce({\n exitCode: 1,\n stderr: String(error),\n stdout,\n });\n };\n const handleClose = (code: number | null): void => {\n resolveOnce({\n exitCode: typeof code === \"number\" ? code : 1,\n stderr,\n stdout,\n });\n };\n const timeoutHandle =\n typeof input.timeoutMs === \"number\" && input.timeoutMs > 0\n ? setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n clearListenersAndTimer();\n child.kill(\"SIGKILL\");\n resolve({\n exitCode: 1,\n stderr: `timed out after ${input.timeoutMs}ms`,\n stdout,\n });\n }, input.timeoutMs)\n : null;\n\n child.stdout?.on(\"data\", handleStdout);\n child.stderr?.on(\"data\", handleStderr);\n child.once(\"error\", handleError);\n child.once(\"close\", handleClose);\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { cp, mkdtemp, readdir, rm, stat } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeDataPath } from \"../../config/daemon-state\";\n\nconst DAEMON_RUNTIME_DATA_BACKUP_PREFIX = \"openmeld-daemon-runtime-data-\";\nconst DAEMON_RUNTIME_DATA_DIR_NAME = \"data\";\n\nexport type DaemonRuntimeDataBackup = {\n backupRootPath: string;\n backupDataPath: string;\n sourceDataPath: string;\n};\n\nexport async function backupDaemonRuntimeDataForReinstall(): Promise<DaemonRuntimeDataBackup | null> {\n const sourceDataPath = daemonRuntimeDataPath();\n const sourceStats = await stat(sourceDataPath).catch(() => null);\n if (!sourceStats?.isDirectory()) {\n return null;\n }\n\n const backupRootPath = await mkdtemp(\n join(tmpdir(), DAEMON_RUNTIME_DATA_BACKUP_PREFIX)\n );\n const backupDataPath = join(backupRootPath, DAEMON_RUNTIME_DATA_DIR_NAME);\n await cp(sourceDataPath, backupDataPath, {\n recursive: true,\n });\n return {\n backupRootPath,\n backupDataPath,\n sourceDataPath,\n };\n}\n\nexport async function restoreDaemonRuntimeDataForReinstall(\n backup: DaemonRuntimeDataBackup\n): Promise<void> {\n const backupStats = await stat(backup.backupDataPath).catch(() => null);\n if (!backupStats?.isDirectory()) {\n throw new Error(\n `daemon runtime data backup is missing: ${backup.backupDataPath}`\n );\n }\n await cp(backup.backupDataPath, backup.sourceDataPath, {\n recursive: true,\n });\n}\n\nexport async function cleanupDaemonRuntimeDataBackup(\n backup: DaemonRuntimeDataBackup | null\n): Promise<void> {\n if (!backup) {\n return;\n }\n await rm(backup.backupRootPath, {\n recursive: true,\n force: true,\n });\n}\n\nexport async function cleanupStaleDaemonRuntimeDataBackups(\n input: { retainBackupRootPaths?: readonly string[] } = {}\n): Promise<void> {\n const retainBackupRootPaths = new Set(input.retainBackupRootPaths ?? []);\n const tempEntries = await readdir(tmpdir(), {\n withFileTypes: true,\n }).catch(() => []);\n for (const entry of tempEntries) {\n if (\n !(\n entry.isDirectory() &&\n entry.name.startsWith(DAEMON_RUNTIME_DATA_BACKUP_PREFIX)\n )\n ) {\n continue;\n }\n const candidateRootPath = join(tmpdir(), entry.name);\n if (retainBackupRootPaths.has(candidateRootPath)) {\n continue;\n }\n await rm(candidateRootPath, {\n recursive: true,\n force: true,\n });\n }\n}\n","import process from \"node:process\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport { sleep } from \"@openmeld/utils\";\nimport { readDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\nimport type { DaemonOwnedProcess } from \"./daemon-service-process-inventory\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\n\n// Minimum runtime-lease heartbeat stall before the lifecycle stop path may\n// escalate a SIGTERM timeout to SIGKILL. The carrier refreshes the lease\n// heartbeat every few seconds while its run loop is alive, and the runtime\n// observer already treats the lease as stale after DAEMON_HEARTBEAT_STALE_MS\n// (3 minutes); ten minutes is more than three full stale windows on top of\n// that, so a stall this long means the run loop is wedged, not busy.\nexport const FORCE_KILL_MIN_HEARTBEAT_STALL_MS = 10 * 60 * 1000;\n\nconst FORCE_KILL_EXIT_WAIT_MS = 2000;\nconst FORCE_KILL_EXIT_POLL_MS = 100;\n\nexport type StalledDaemonForceKillSkipReason =\n | \"runtime_lease_missing\"\n | \"lease_pid_invalid\"\n | \"lease_pid_not_owned\"\n | \"foreground_process\"\n | \"heartbeat_unparseable\"\n | \"heartbeat_fresh\";\n\nexport type StalledDaemonForceKillVerdict =\n | {\n decision: \"force_kill\";\n pid: number;\n heartbeatStalledMs: number;\n }\n | {\n decision: \"skip\";\n reason: StalledDaemonForceKillSkipReason;\n pid: number | null;\n heartbeatStalledMs: number | null;\n };\n\n// Safety boundary for escalating a stop to SIGKILL. Force-kill fires only when\n// BOTH hold:\n//\n// 1. The user (or setup/repair acting on the user's explicit request) asked\n// the lifecycle to stop this daemon and the graceful SIGTERM window\n// already elapsed. This is never a background reaper.\n// 2. The daemon's runtime lease heartbeat has been stalled for at least\n// FORCE_KILL_MIN_HEARTBEAT_STALL_MS. The carrier cannot accept, run, or\n// report Wake work without its run loop, and the same run loop owns the\n// heartbeat, so a stalled heartbeat is direct evidence that no in-flight\n// Wake execution can be making progress on this process (pre-0.7.99\n// daemons sleeping through SIGTERM inside an uninterruptible reconnect\n// backoff are the motivating production case).\n//\n// This does not conflict with the \"a running execution must not be failed by\n// a fixed wall-clock timeout while fresh lifecycle/progress evidence arrives\"\n// guardrail: the trigger here is the absence of the daemon's own liveness\n// evidence combined with an explicit user stop request, not elapsed time on a\n// live execution. A daemon with a fresh heartbeat is never force-killed; the\n// caller falls back to the existing bounded-failure path instead. Heartbeat\n// staleness is used purely as local stop-safety evidence and must not feed\n// any liveness/readiness/availability projection.\nexport function resolveStalledDaemonForceKillVerdict(input: {\n nowMs: number;\n ownedProcesses: readonly DaemonOwnedProcess[];\n runtimeLease: DaemonRuntimeLease | null;\n}): StalledDaemonForceKillVerdict {\n const lease = input.runtimeLease;\n if (!lease) {\n return {\n decision: \"skip\",\n reason: \"runtime_lease_missing\",\n pid: null,\n heartbeatStalledMs: null,\n };\n }\n if (!Number.isInteger(lease.pid) || lease.pid <= 0) {\n return {\n decision: \"skip\",\n reason: \"lease_pid_invalid\",\n pid: null,\n heartbeatStalledMs: null,\n };\n }\n // Never signal a pid the process inventory does not attribute to an\n // OpenMeld-owned daemon: the lease can outlive its process and the pid can be\n // recycled by the OS.\n const ownedProcess = input.ownedProcesses.find(\n (candidate) =>\n candidate.pid === lease.pid && candidate.ownership !== \"unknown\"\n );\n if (!ownedProcess) {\n return {\n decision: \"skip\",\n reason: \"lease_pid_not_owned\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n // Foreground runs belong to an interactive terminal session; they are not\n // stop candidates for the lifecycle either (see\n // resolveSafeOwnedProcessStopCandidates) and stay out of force-kill scope.\n if (ownedProcess.mode === \"foreground\") {\n return {\n decision: \"skip\",\n reason: \"foreground_process\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n const freshnessTimestamp = lease.heartbeatAt ?? lease.updatedAt;\n const heartbeatMs = Date.parse(freshnessTimestamp);\n if (Number.isNaN(heartbeatMs)) {\n // Fail closed: without parseable heartbeat evidence the stall cannot be\n // proven, so the caller keeps the existing failure path.\n return {\n decision: \"skip\",\n reason: \"heartbeat_unparseable\",\n pid: lease.pid,\n heartbeatStalledMs: null,\n };\n }\n const heartbeatStalledMs = input.nowMs - heartbeatMs;\n if (heartbeatStalledMs < FORCE_KILL_MIN_HEARTBEAT_STALL_MS) {\n return {\n decision: \"skip\",\n reason: \"heartbeat_fresh\",\n pid: lease.pid,\n heartbeatStalledMs,\n };\n }\n return {\n decision: \"force_kill\",\n pid: lease.pid,\n heartbeatStalledMs,\n };\n}\n\nexport type StalledDaemonForceKillOutcome = {\n killed: boolean;\n verdict: StalledDaemonForceKillVerdict;\n};\n\ntype StalledDaemonForceKillDeps = {\n emitLifecycleEvent: typeof emitDaemonLifecycleEvent;\n killProcess: (pid: number, signal: NodeJS.Signals) => void;\n listOwnedProcesses: () => Promise<readonly DaemonOwnedProcess[]>;\n nowMs: () => number;\n readRuntimeLease: () => Promise<DaemonRuntimeLease | null>;\n waitForProcessExit: (pid: number) => Promise<boolean>;\n};\n\nconst defaultStalledDaemonForceKillDeps: StalledDaemonForceKillDeps = {\n emitLifecycleEvent: emitDaemonLifecycleEvent,\n killProcess: (pid, signal) => process.kill(pid, signal),\n listOwnedProcesses: async () =>\n await listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n nowMs: () => Date.now(),\n readRuntimeLease: async () => await readDaemonRuntimeLease(),\n waitForProcessExit: async (pid) => {\n const deadline = Date.now() + FORCE_KILL_EXIT_WAIT_MS;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) {\n return true;\n }\n await sleep(FORCE_KILL_EXIT_POLL_MS);\n }\n return !isPidAlive(pid);\n },\n};\n\n// Last-resort stop escalation for a daemon that ignored SIGTERM through the\n// bounded stop window. Old daemons (before the interruptible reconnect\n// backoff) park in `sleep(backoffMs)` for up to 15 minutes and only then\n// observe the stop flag, which is far longer than any lifecycle stop window;\n// without this fallback, setup/repair on such a machine can never succeed.\n// Every decision (kill or skip) lands in the lifecycle journal.\nexport async function forceKillStalledDaemonAfterStopTimeout(\n input: {\n stage: \"stop_or_drain\" | \"wait_stopped\";\n },\n deps: StalledDaemonForceKillDeps = defaultStalledDaemonForceKillDeps\n): Promise<StalledDaemonForceKillOutcome> {\n const [runtimeLease, ownedProcesses] = await Promise.all([\n deps.readRuntimeLease().catch(() => null),\n deps.listOwnedProcesses().catch((): readonly DaemonOwnedProcess[] => []),\n ]);\n const verdict = resolveStalledDaemonForceKillVerdict({\n nowMs: deps.nowMs(),\n ownedProcesses,\n runtimeLease,\n });\n if (verdict.decision === \"skip\") {\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_kill_skipped\",\n metadata: {\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: verdict.reason,\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: false, verdict };\n }\n try {\n deps.killProcess(verdict.pid, \"SIGKILL\");\n } catch (error) {\n if (!isProcessGoneError(error)) {\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_kill_failed\",\n metadata: {\n errorMessage: error instanceof Error ? error.message : String(error),\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: \"stalled_heartbeat_after_stop_timeout\",\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: false, verdict };\n }\n }\n const exited = await deps.waitForProcessExit(verdict.pid);\n await deps.emitLifecycleEvent({\n type: \"process_stop.action\",\n result: \"force_killed\",\n metadata: {\n exitObserved: exited,\n heartbeatStalledMs: verdict.heartbeatStalledMs,\n pid: verdict.pid,\n reason: \"stalled_heartbeat_after_stop_timeout\",\n signal: \"SIGKILL\",\n stage: input.stage,\n },\n });\n return { killed: true, verdict };\n}\n\nfunction isProcessGoneError(error: unknown): boolean {\n return (\n error instanceof Error && (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n","import type { OpenMeldDistribution } from \"../../runtime/distribution\";\nimport { ensureDaemonSystemServiceCommandFiles } from \"./daemon-service-command-spec\";\nimport type {\n DaemonServiceCommandSpec,\n DaemonServiceManager,\n} from \"./daemon-service-manager\";\n\nconst ROOT_ERROR_PATTERN =\n /\\s*Try re-running the command as root for richer errors\\.?/i;\n\nexport async function startDaemonSystemServiceWithAutoRepair(input: {\n serviceCommandSpec: DaemonServiceCommandSpec;\n systemManager: DaemonServiceManager;\n distribution?: OpenMeldDistribution;\n onAutoRepairAttempt?: () => Promise<void> | void;\n onAutoRepairRecovered?: () => Promise<void> | void;\n}): Promise<{\n autoRepairAttempted: boolean;\n}> {\n let autoRepairAttempted = false;\n try {\n await input.systemManager.start();\n return {\n autoRepairAttempted,\n };\n } catch (error) {\n if (\n !shouldAttemptLaunchdAutoRepair({\n controller: input.systemManager.controller,\n error,\n })\n ) {\n throw error;\n }\n\n autoRepairAttempted = true;\n await input.onAutoRepairAttempt?.();\n try {\n await input.systemManager.uninstall();\n await input.systemManager.waitUntilAbsent();\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.systemManager.controller,\n distribution: input.distribution,\n });\n await input.systemManager.install(input.serviceCommandSpec);\n await input.systemManager.start();\n await input.onAutoRepairRecovered?.();\n return {\n autoRepairAttempted,\n };\n } catch (retryError) {\n throw buildLaunchdAutoRepairFailureError({\n initialError: error,\n retryError,\n });\n }\n }\n}\n\nfunction sanitizeSystemServiceErrorMessage(message: string): string {\n return message.replace(ROOT_ERROR_PATTERN, \"\");\n}\n\nfunction isLaunchdBootstrapIosError(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"bootstrap failed\") &&\n normalized.includes(\"input/output error\")\n );\n}\n\nfunction shouldAttemptLaunchdAutoRepair(input: {\n controller: DaemonServiceManager[\"controller\"];\n error: unknown;\n}): boolean {\n if (input.controller !== \"launchd\") {\n return false;\n }\n const message = sanitizeSystemServiceErrorMessage(\n toErrorMessage(input.error)\n );\n return isLaunchdBootstrapIosError(message);\n}\n\nfunction buildLaunchdAutoRepairFailureError(input: {\n initialError: unknown;\n retryError: unknown;\n}): Error {\n return new Error(\n [\n \"launchd auto-repair retry failed.\",\n `initial error: ${toErrorMessage(input.initialError)}`,\n `retry error: ${toErrorMessage(input.retryError)}`,\n ].join(\" \")\n );\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { sleep } from \"@openmeld/utils\";\nimport type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport {\n type DaemonServiceInventory,\n inspectDaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport {\n type DaemonServiceJobDiagnostics,\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n formatDaemonServiceJobDiagnosticsEvidence,\n} from \"./daemon-service-manager\";\n\nconst DEFAULT_SERVICE_STARTUP_WAIT_MS = 5000;\nconst LAUNCHD_SERVICE_STARTUP_WAIT_MS = 90_000;\nconst WINDOWS_SERVICE_STARTUP_WAIT_MS = 45_000;\n\nexport class SystemServiceStartupTimeoutError extends Error {\n readonly code = \"openmeld.service.startup_timeout\";\n readonly inventory: DaemonServiceInventory | null;\n readonly managerStatus: DaemonServiceManagerRuntimeStatus | null;\n readonly runtimeStatus: DaemonServiceRuntimeStatus | null;\n readonly jobDiagnostics: DaemonServiceJobDiagnostics | null;\n\n constructor(input: {\n inventory: DaemonServiceInventory | null;\n managerStatus: DaemonServiceManagerRuntimeStatus | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n }) {\n super(buildSystemServiceStartupTimeoutMessage(input));\n this.name = \"SystemServiceStartupTimeoutError\";\n this.inventory = input.inventory;\n this.managerStatus = input.managerStatus;\n this.runtimeStatus = input.runtimeStatus;\n this.jobDiagnostics = input.jobDiagnostics ?? null;\n }\n}\n\nexport function resolveSystemServiceStartupWaitMs(\n controller: DaemonServiceManager[\"controller\"]\n): number {\n // launchd may defer a newly loaded background item before it spawns the\n // managed process. Keep one controller-owned budget for both an explicit\n // start and replacement verification.\n if (controller === \"launchd\") {\n return LAUNCHD_SERVICE_STARTUP_WAIT_MS;\n }\n // On a native Windows cold start, the task can be running before the Service\n // finishes initializing its local control plane and publishes its first\n // runtime lease. Keep this separate from the startup budget on other hosts.\n if (controller === \"windows-service\") {\n return WINDOWS_SERVICE_STARTUP_WAIT_MS;\n }\n return DEFAULT_SERVICE_STARTUP_WAIT_MS;\n}\n\nexport function isDaemonInventoryRunningAndStartReady(\n inventory: DaemonServiceInventory,\n blockingAnomalies: ReadonlySet<\n DaemonServiceInventory[\"anomalies\"][number][\"code\"]\n >\n): boolean {\n return (\n inventory.runtimeStatus.status === \"running\" &&\n inventory.runtimeStatus.mode === \"background\" &&\n inventory.runtimeStatus.managedBySystemService === true &&\n inventory.serviceManagerStatus?.running === true &&\n !inventory.anomalies.some((anomaly) => blockingAnomalies.has(anomaly.code))\n );\n}\n\nexport async function waitForSystemServiceStartup(input: {\n expectedVersion: string;\n manager: DaemonServiceManager;\n waitMs?: number;\n pollMs: number;\n isReady: (inventory: DaemonServiceInventory) => boolean;\n intent?: Parameters<typeof inspectDaemonServiceInventory>[0][\"intent\"];\n}): Promise<{\n inventory: DaemonServiceInventory;\n state: \"running\";\n runtimeStatus: DaemonServiceRuntimeStatus;\n}> {\n const waitMs =\n input.waitMs ?? resolveSystemServiceStartupWaitMs(input.manager.controller);\n const deadlineMs = Date.now() + waitMs;\n let lastInventory: DaemonServiceInventory | null = null;\n while (Date.now() < deadlineMs) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: input.intent ?? \"run_background\",\n }).catch(() => null);\n if (inventory) {\n lastInventory = inventory;\n if (input.isReady(inventory)) {\n return {\n inventory,\n state: \"running\",\n runtimeStatus: inventory.runtimeStatus,\n };\n }\n }\n await sleep(input.pollMs);\n }\n\n const finalInventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: input.intent ?? \"run_background\",\n }).catch(() => null);\n if (finalInventory) {\n lastInventory = finalInventory;\n if (input.isReady(finalInventory)) {\n return {\n inventory: finalInventory,\n state: \"running\",\n runtimeStatus: finalInventory.runtimeStatus,\n };\n }\n }\n\n // Raw controller job details explain a failed wait only. Readiness above is\n // decided by the complete local inventory and never by these diagnostics.\n const finalJobDiagnostics =\n (await input.manager.readJobDiagnostics?.().catch(() => null)) ?? null;\n throw new SystemServiceStartupTimeoutError({\n inventory: lastInventory,\n // Report the observation that failed the predicate. A later independent\n // runtime read can be healthy while these inventory anomalies are stale.\n managerStatus: lastInventory?.serviceManagerStatus ?? null,\n runtimeStatus: lastInventory?.runtimeStatus ?? null,\n jobDiagnostics: finalJobDiagnostics,\n });\n}\n\nexport function buildSystemServiceStartupTimeoutMessage(input: {\n inventory: DaemonServiceInventory | null;\n managerStatus: DaemonServiceManagerRuntimeStatus | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n}): string {\n const base = `OpenMeld Service failed to reach a running local service state in time. runtime=${input.runtimeStatus?.status ?? \"unknown\"}, reason=${input.runtimeStatus?.reason || \"unknown\"}, managerRunning=${String(input.managerStatus?.running ?? \"unknown\")}, anomalies=${input.inventory?.anomalies.map((anomaly) => anomaly.code).join(\",\") || \"unknown\"}`;\n const lease = input.inventory?.runtimeLease;\n const observation = input.inventory\n ? `; runtimePid=${input.runtimeStatus?.pid ?? \"unknown\"}, managed=${String(input.runtimeStatus?.managedBySystemService ?? \"unknown\")}, leaseUpdatedAt=${lease?.updatedAt ?? \"missing\"}, leaseHeartbeatAt=${lease?.heartbeatAt ?? \"missing\"}, serviceCandidates=${input.inventory.ownedProcesses.map((candidate) => `${candidate.pid}:${candidate.ownership}`).join(\",\") || \"none\"}`\n : \"\";\n if (!input.jobDiagnostics) {\n return `${base}${observation}`;\n }\n return `${base}${observation}; ${formatDaemonServiceJobDiagnosticsEvidence(input.jobDiagnostics)}`;\n}\n\nexport function isSystemServiceStartupTimeoutError(\n error: unknown\n): error is SystemServiceStartupTimeoutError {\n return (\n error instanceof SystemServiceStartupTimeoutError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"openmeld.service.startup_timeout\")\n );\n}\n","import process from \"node:process\";\nimport type {\n DaemonServiceContract,\n RuntimeTransportStopCause,\n} from \"@openmeld/schemas/types\";\nimport { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport {\n normalizeGatewayBaseUrlOrNull,\n resolveExplicitGatewayUrlOrThrow,\n} from \"../../config/base-url\";\nimport {\n clearDaemonServiceContract,\n isDaemonServiceContractIdentityReusable,\n isUnsafeProductionDeviceId,\n readDaemonServiceContract,\n upsertDaemonServiceContract,\n} from \"../../config/daemon-service-contract\";\nimport {\n type DaemonInstallSource,\n type DaemonInstallState,\n installDaemon,\n readDaemonServiceRuntimeSnapshot,\n restoreDaemonInstallStateSnapshot,\n rotateDaemonControlPlaneTokenIfExpired,\n} from \"../../config/daemon-state\";\nimport {\n type OpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTarget,\n resolveOpenMeldEnvironmentTargetFromEnv,\n} from \"../../config/openmeld-environment-target\";\nimport type { OpenMeldProfile } from \"../../config/openmeld-profiles-api\";\nimport { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { resolveOpenMeldProfileOrNull } from \"../../config/resolve-openmeld-profile\";\nimport { compareSemver, readVersionState } from \"../../config/version-state\";\nimport type { OpenMeldDistribution } from \"../../runtime/distribution\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../core/constants\";\nimport {\n normalizeHeartbeatIntervalMs,\n normalizeOptionalText,\n} from \"../core/logger\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n resolvePreferredDaemonDeviceId,\n} from \"../state/daemon-device-id\";\nimport {\n backupDaemonRuntimeDataForReinstall,\n cleanupDaemonRuntimeDataBackup,\n cleanupStaleDaemonRuntimeDataBackups,\n type DaemonRuntimeDataBackup,\n restoreDaemonRuntimeDataForReinstall,\n} from \"../state/runtime-data-preservation\";\nimport {\n emitDaemonLifecycleEvent,\n runDaemonServiceManagerAction,\n} from \"./daemon-lifecycle-journal\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"./daemon-service-alignment-target\";\nimport {\n activateDaemonServiceBundle,\n type DaemonActiveBundleState,\n discardPreparedDaemonServiceBundle,\n isDaemonBundleSourceAllowedForLane,\n prepareDaemonServiceBundle,\n restoreDaemonActiveBundleStateSnapshot,\n verifyDaemonActiveBundleIntegrity,\n} from \"./daemon-service-bundle\";\nimport { normalizeDaemonCommandPath } from \"./daemon-service-command-path\";\nimport {\n buildDaemonSystemServiceCommandSpec,\n ensureDaemonSystemServiceCommandFiles,\n} from \"./daemon-service-command-spec\";\nimport {\n type DaemonServiceContractMissingField,\n writeDaemonServiceContract,\n} from \"./daemon-service-contract-writer\";\nimport {\n captureDaemonServiceEvidenceBestEffort,\n type DaemonServiceFailureStage,\n} from \"./daemon-service-evidence\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"./daemon-service-inventory\";\nimport { cleanupLegacySharedDaemonServiceState } from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n disableDaemonServiceAutostartIfConfigured,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport { listDaemonOwnedProcesses } from \"./daemon-service-process-inventory\";\nimport {\n clearDaemonRuntimeStateIfDefinitelyStopped,\n getEffectiveDaemonRuntimeStatus,\n readCurrentObservedDaemonRuntimeStatus,\n waitForDaemonSystemServiceToStop,\n} from \"./daemon-service-runtime\";\nimport { forceKillStalledDaemonAfterStopTimeout } from \"./daemon-service-stalled-force-kill\";\nimport { startDaemonSystemServiceWithAutoRepair } from \"./daemon-service-start-recovery\";\nimport {\n isSystemServiceStartupTimeoutError,\n waitForSystemServiceStartup,\n} from \"./daemon-service-startup-wait\";\nimport { ensureDaemonServiceMaintenanceInstalled } from \"./daemon-service-update-worker-manager\";\nimport { resolveVersionChangeDirection } from \"./version-change-direction\";\n\nconst STRICT_TEARDOWN_VERIFY_WAIT_MS = 15_000;\nconst STRICT_TEARDOWN_VERIFY_POLL_MS = 200;\nconst PROCESS_STOP_WAIT_MS = 2000;\nconst MISSING_CONTROLLED_SHUTDOWN_CLOSE_REASON_FIXED_VERSION = \"0.2.88\";\nconst MISSING_REQUIRED_CONTRACT_FIELDS_REASON =\n \"missing_required_contract_fields\";\nconst VERIFIED_ROLLBACK_UNTRUSTED_ANOMALIES = new Set<DaemonServiceAnomalyCode>(\n [\n \"background_foreground_conflict\",\n \"bundle_id_drift\",\n \"bundle_lane_drift\",\n \"bundle_missing\",\n \"bundle_path_invalid\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"duplicate_owned_processes\",\n \"foreground_background_conflict\",\n \"legacy_detached_runtime\",\n \"legacy_shared_service_present\",\n \"lifecycle_locked\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n ]\n);\nconst STOPPED_LIFECYCLE_RUNTIME_SNAPSHOT_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"runtime_stale\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\n ]);\n\nexport type DaemonServiceLifecycleOperation =\n | \"upgrade_reconcile\"\n | \"reinstall\"\n | \"startup_repair\";\n\nexport type DaemonServiceLifecyclePhase =\n | \"inspect\"\n | \"backup\"\n | \"stop_or_drain\"\n | \"wait_stopped\"\n | \"unregister\"\n | \"wait_absent\"\n | \"prepare_bundle\"\n | \"install_bundle\"\n | \"write_contract\"\n | \"register_service\"\n | \"restore_runtime_data\"\n | \"start_if_desired\"\n | \"wait_running\"\n | \"verify_final_inventory\";\n\nexport type DaemonServiceLifecycleRecoveryStatus =\n | \"restored_verified_previous_state\"\n | \"stopped_safe_current_version\"\n | \"failed_before_safe_state\";\n\ntype DaemonServiceLifecycleReasonCode =\n | DaemonServiceAnomalyCode\n | \"unknown_owned_processes\"\n | typeof MISSING_REQUIRED_CONTRACT_FIELDS_REASON;\n\nexport type DaemonServiceLifecycleOutcome =\n | {\n status: \"already_aligned\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: [];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"aligned\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: [];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"stopped_safe\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n failureStage: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n recoveryStatus: \"stopped_safe_current_version\";\n errorMessage: string;\n }\n | {\n status: \"blocked\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"failed\";\n targetVersion: string;\n inventoryBefore: DaemonServiceInventory | null;\n inventoryAfter: DaemonServiceInventory | null;\n reasonCodes: DaemonServiceLifecycleReasonCode[];\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\" | null;\n shouldStartAfterLifecycle: boolean | null;\n backupDataPath: string | null;\n failureStage: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n recoveryStatus: DaemonServiceLifecycleRecoveryStatus;\n errorCode: string | null;\n errorMessage: string;\n };\n\nexport class DaemonServiceLifecycleDrainTimeoutError extends Error {\n readonly waitMs: number;\n\n constructor(waitMs: number) {\n super(`graceful shutdown timed out after ${String(waitMs)}ms`);\n this.name = \"DaemonServiceLifecycleDrainTimeoutError\";\n this.waitMs = waitMs;\n }\n}\n\nclass DaemonServiceLifecycleControlledDrainError extends Error {\n override readonly cause: unknown;\n\n constructor(cause: unknown) {\n super(`controlled service drain failed: ${toErrorMessage(cause)}`);\n this.name = \"DaemonServiceLifecycleControlledDrainError\";\n this.cause = cause;\n }\n}\n\nclass DaemonServiceLifecycleStageError extends Error {\n override readonly cause: unknown;\n readonly reasonCodes: DaemonServiceLifecycleReasonCode[];\n readonly stage: DaemonServiceFailureStage;\n\n constructor(input: {\n cause?: unknown;\n message: string;\n reasonCodes?: DaemonServiceLifecycleReasonCode[];\n stage: DaemonServiceFailureStage;\n }) {\n super(input.message);\n this.name = \"DaemonServiceLifecycleStageError\";\n this.stage = input.stage;\n this.reasonCodes = input.reasonCodes ?? [];\n this.cause = input.cause;\n }\n}\n\ntype DaemonServiceLifecycleRestorePoint = {\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n previousActiveBundle: DaemonActiveBundleState | null;\n previousContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n previousInstallState: DaemonInstallState | null;\n trusted: boolean;\n};\n\ntype DaemonServiceLifecycleMutableState = {\n completedPhases: DaemonServiceLifecyclePhase[];\n inventoryBefore: DaemonServiceInventory | null;\n desiredState: \"background\" | \"stopped\" | null;\n shouldStartAfterLifecycle: boolean | null;\n runtimeDataBackup: DaemonRuntimeDataBackup | null;\n backupDataPath: string | null;\n backupRootPath: string | null;\n evidencePath: string | null;\n failureStage: DaemonServiceFailureStage | null;\n};\n\ntype DaemonServiceLifecycleCommandOptions = {\n environmentTarget: OpenMeldEnvironmentTarget;\n gatewayUrl?: string;\n ownerUserId?: string;\n openMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n};\n\ntype DaemonServiceLifecycleContext = {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n serviceManager: DaemonServiceManager;\n};\n\nfunction toLifecycleIntent(\n operation: DaemonServiceLifecycleOperation\n): \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\" {\n switch (operation) {\n case \"reinstall\":\n return \"reinstall\";\n case \"upgrade_reconcile\":\n return \"upgrade_reconcile\";\n case \"startup_repair\":\n return \"startup_check\";\n default:\n throw new Error(`Unsupported lifecycle operation: ${String(operation)}`);\n }\n}\n\nexport async function runDaemonServiceLifecycle(input: {\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n installSource: DaemonInstallSource;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n desiredState?: \"background\" | \"stopped\";\n shouldStartAfterLifecycle?: boolean;\n forceReinstall?: boolean;\n drainWaitMs?: number;\n forceKillAfterDrainTimeout?: boolean;\n preparedBundle?: DaemonActiveBundleState;\n onPhase?: (phase: DaemonServiceLifecyclePhase) => Promise<void> | void;\n}): Promise<DaemonServiceLifecycleOutcome> {\n let preparedBundle: DaemonActiveBundleState | null =\n input.preparedBundle ?? null;\n const ownsPreparedBundle = input.preparedBundle === undefined;\n const state: DaemonServiceLifecycleMutableState = {\n completedPhases: [],\n inventoryBefore: null,\n desiredState: null,\n shouldStartAfterLifecycle: null,\n runtimeDataBackup: null,\n backupDataPath: null,\n backupRootPath: null,\n evidencePath: null,\n failureStage: null,\n };\n const target = buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n gatewayUrl: input.gatewayUrl,\n });\n const emitPhase = async (\n phase: DaemonServiceLifecyclePhase\n ): Promise<void> => {\n state.completedPhases.push(phase);\n await input.onPhase?.(phase);\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n };\n\n try {\n await emitPhase(\"inspect\");\n state.inventoryBefore = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: resolveLifecycleIntendedMode(input),\n intent: toLifecycleIntent(input.operation),\n });\n const inventoryBefore = state.inventoryBefore;\n const desiredState =\n input.desiredState ?? resolveLifecycleDesiredState(inventoryBefore);\n const shouldStartAfterLifecycle =\n input.shouldStartAfterLifecycle ??\n resolveLifecycleShouldStartAfterLifecycle({\n desiredState,\n inventory: inventoryBefore,\n });\n state.desiredState = desiredState;\n state.shouldStartAfterLifecycle = shouldStartAfterLifecycle;\n const immediateOutcome = resolveImmediateLifecycleOutcome({\n completedPhases: state.completedPhases,\n desiredState,\n expectedVersion: input.expectedVersion,\n forceReinstall: input.forceReinstall === true,\n inventoryBefore,\n shouldStartAfterLifecycle,\n target,\n });\n if (immediateOutcome) {\n if (immediateOutcome.status === \"already_aligned\") {\n await cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n input.operation\n );\n }\n return immediateOutcome;\n }\n const serviceManager =\n await resolveLifecycleServiceManager(inventoryBefore);\n if (!serviceManager) {\n throw new DaemonServiceLifecycleStageError({\n message:\n \"OpenMeld could not resolve a system service manager for local service lifecycle repair.\",\n stage: \"inspect\",\n });\n }\n const commandOptions = await resolveLifecycleCommandOptions({\n inventory: inventoryBefore,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n });\n const restorePoint = await createLifecycleRestorePoint({\n desiredState,\n inventoryBefore,\n shouldStartAfterLifecycle,\n });\n const context: DaemonServiceLifecycleContext = {\n commandOptions,\n currentContract: inventoryBefore.serviceContract ?? null,\n desiredState,\n shouldStartAfterLifecycle,\n serviceManager,\n };\n\n state.evidencePath = await captureDaemonServiceEvidenceBestEffort({\n evidencePath: state.evidencePath ?? undefined,\n phase: \"before_cleanup\",\n profile: input.profile,\n });\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n\n state.failureStage = \"prepare_bundle\";\n await emitPhase(\"prepare_bundle\");\n preparedBundle = await resolveLifecycleReplacementBundle({\n cliScriptPath: input.cliScriptPath,\n daemonVersion: input.expectedVersion,\n preparedBundle,\n });\n\n return await executeDaemonServiceLifecycle({\n context,\n emitPhase,\n expectedVersion: input.expectedVersion,\n installSource: input.installSource,\n inventoryBefore,\n operation: input.operation,\n cliScriptPath: input.cliScriptPath,\n state,\n target,\n restorePoint,\n preparedBundle,\n drainWaitMs: input.drainWaitMs ?? PROCESS_STOP_WAIT_MS,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout === true,\n });\n } catch (error) {\n if (error instanceof DaemonServiceLifecycleDrainTimeoutError) {\n throw error;\n }\n state.evidencePath =\n (await captureDaemonServiceEvidenceBestEffort({\n evidencePath: state.evidencePath ?? undefined,\n phase: \"after_failure\",\n profile: input.profile,\n })) ?? state.evidencePath;\n await writeLifecycleEvidenceEvent({\n evidencePath: state.evidencePath,\n completedPhases: state.completedPhases,\n failureStage: state.failureStage,\n });\n await cleanupStaleDaemonRuntimeDataBackups(\n buildFailedLifecycleBackupCleanupInput(state.backupRootPath)\n ).catch(() => undefined);\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: state.inventoryBefore,\n inventoryAfter: null,\n reasonCodes: [],\n completedPhases: state.completedPhases,\n desiredState: state.desiredState,\n shouldStartAfterLifecycle: state.shouldStartAfterLifecycle,\n backupDataPath: state.backupDataPath,\n failureStage: state.failureStage,\n evidencePath: state.evidencePath,\n recoveryStatus: \"failed_before_safe_state\",\n errorCode: resolveLifecycleFailureErrorCode(error),\n errorMessage: toErrorMessage(error),\n };\n } finally {\n await cleanupPreparedBundleAfterLifecycle({\n operation: input.operation,\n preparedBundle: ownsPreparedBundle ? preparedBundle : null,\n });\n }\n}\n\nfunction resolveLifecycleIntendedMode(input: {\n desiredState?: \"background\" | \"stopped\";\n shouldStartAfterLifecycle?: boolean;\n}): \"background\" | undefined {\n return input.shouldStartAfterLifecycle === true ||\n input.desiredState === \"background\"\n ? \"background\"\n : undefined;\n}\n\nfunction buildFailedLifecycleBackupCleanupInput(\n backupRootPath: string | null\n): { retainBackupRootPaths: string[] } | Record<string, never> {\n return backupRootPath ? { retainBackupRootPaths: [backupRootPath] } : {};\n}\n\nasync function resolveLifecycleReplacementBundle(input: {\n cliScriptPath?: string;\n daemonVersion: string;\n preparedBundle: DaemonActiveBundleState | null;\n}): Promise<DaemonActiveBundleState> {\n if (input.preparedBundle) {\n return input.preparedBundle;\n }\n return await prepareLifecycleReplacementBundle({\n cliScriptPath: input.cliScriptPath,\n daemonVersion: input.daemonVersion,\n });\n}\n\nasync function prepareLifecycleReplacementBundle(input: {\n cliScriptPath?: string;\n daemonVersion: string;\n}): Promise<DaemonActiveBundleState> {\n return await prepareDaemonServiceBundle({\n activate: false,\n daemonVersion: input.daemonVersion,\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n}\n\nasync function cleanupPreparedBundleAfterLifecycle(input: {\n operation: DaemonServiceLifecycleOperation;\n preparedBundle: DaemonActiveBundleState | null;\n}): Promise<void> {\n if (!input.preparedBundle) {\n return;\n }\n try {\n await discardPreparedDaemonServiceBundle(input.preparedBundle);\n } catch (error) {\n console.warn(\"[openmeld.daemon_bundle.cleanup_warning]\", {\n bundleId: input.preparedBundle.bundleId,\n errorMessage: toErrorMessage(error),\n operation: input.operation,\n });\n }\n}\n\nasync function executeDaemonServiceLifecycle(input: {\n context: DaemonServiceLifecycleContext;\n emitPhase: (phase: DaemonServiceLifecyclePhase) => Promise<void>;\n expectedVersion: string;\n installSource: DaemonInstallSource;\n inventoryBefore: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n preparedBundle: DaemonActiveBundleState;\n cliScriptPath?: string;\n state: DaemonServiceLifecycleMutableState;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n restorePoint: DaemonServiceLifecycleRestorePoint;\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n}): Promise<DaemonServiceLifecycleOutcome> {\n try {\n input.state.failureStage = \"stop_or_drain\";\n await input.emitPhase(\"stop_or_drain\");\n await stopLifecycleRuntime({\n drainWaitMs: input.drainWaitMs,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout,\n inventory: input.inventoryBefore,\n operation: input.operation,\n serviceManager: input.context.serviceManager,\n stopCause:\n input.inventoryBefore.serviceContract?.ownerUserId &&\n input.context.commandOptions.ownerUserId &&\n input.inventoryBefore.serviceContract.ownerUserId !==\n input.context.commandOptions.ownerUserId\n ? \"user_stop\"\n : \"controlled_service_update\",\n });\n\n input.state.failureStage = \"wait_stopped\";\n await input.emitPhase(\"wait_stopped\");\n await waitForLifecycleRuntimeStopped({\n inventory: input.inventoryBefore,\n serviceManager: input.context.serviceManager,\n });\n\n input.state.failureStage = \"backup\";\n await input.emitPhase(\"backup\");\n input.state.runtimeDataBackup = await backupDaemonRuntimeDataForReinstall();\n input.state.backupRootPath =\n input.state.runtimeDataBackup?.backupRootPath ?? null;\n input.state.backupDataPath =\n input.state.runtimeDataBackup?.backupDataPath ?? null;\n\n input.state.failureStage = \"unregister\";\n await input.emitPhase(\"unregister\");\n await input.context.serviceManager.uninstall();\n if (input.inventoryBefore.legacySharedService?.present) {\n await cleanupLegacySharedDaemonServiceState();\n await waitForLegacySharedServiceCleanup({\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n });\n }\n\n input.state.failureStage = \"wait_absent\";\n await input.emitPhase(\"wait_absent\");\n await waitForLifecycleRuntimeAbsentWithRetry(input.context.serviceManager);\n\n input.state.failureStage = \"install_bundle\";\n await input.emitPhase(\"install_bundle\");\n const preparedBundle = input.preparedBundle;\n // An older running Service may cache this token when it starts. Rotate only\n // after the previous Service is verified absent so the CLI and Service can\n // never end up using different control-plane credentials.\n await rotateDaemonControlPlaneTokenIfExpired();\n await activateDaemonServiceBundle(preparedBundle);\n await installDaemon({\n daemonVersion: input.expectedVersion,\n source: input.installSource,\n });\n\n input.state.failureStage = \"write_contract\";\n await input.emitPhase(\"write_contract\");\n await ensureLifecycleServiceContract({\n commandOptions: input.context.commandOptions,\n currentContract: input.context.currentContract,\n daemonVersion: input.expectedVersion,\n desiredState: input.context.desiredState,\n preparedBundle,\n serviceController: input.context.serviceManager.controller,\n });\n\n input.state.failureStage = \"register_service\";\n await input.emitPhase(\"register_service\");\n const serviceDistribution: OpenMeldDistribution =\n preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\";\n const serviceCommandSpec = buildDaemonSystemServiceCommandSpec({\n ...(preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: preparedBundle.sourceEntryScriptPath }\n : {}),\n controller: input.context.serviceManager.controller,\n distribution: serviceDistribution,\n environmentTarget: input.context.commandOptions.environmentTarget,\n });\n await installDaemonSystemServiceRegistration({\n distribution: serviceDistribution,\n serviceCommandSpec,\n serviceManager: input.context.serviceManager,\n });\n await ensureDaemonServiceMaintenanceInstalled();\n if (!input.context.shouldStartAfterLifecycle) {\n await input.context.serviceManager.deactivate().catch(() => undefined);\n await input.context.serviceManager.waitUntilStopped();\n }\n\n if (input.state.runtimeDataBackup) {\n input.state.failureStage = \"restore_runtime_data\";\n await input.emitPhase(\"restore_runtime_data\");\n await restoreDaemonRuntimeDataForReinstall(input.state.runtimeDataBackup);\n await cleanupDaemonRuntimeDataBackup(input.state.runtimeDataBackup);\n input.state.runtimeDataBackup = null;\n input.state.backupDataPath = null;\n input.state.backupRootPath = null;\n }\n\n if (input.context.shouldStartAfterLifecycle) {\n input.state.failureStage = \"start_if_desired\";\n await input.emitPhase(\"start_if_desired\");\n await startDaemonSystemServiceWithAutoRepair({\n distribution: serviceDistribution,\n serviceCommandSpec,\n systemManager: input.context.serviceManager,\n });\n\n input.state.failureStage = \"wait_running\";\n await input.emitPhase(\"wait_running\");\n }\n\n input.state.failureStage = \"verify_final_inventory\";\n await input.emitPhase(\"verify_final_inventory\");\n const verifyFinalInventory = async (): Promise<DaemonServiceInventory> =>\n await waitForVerifiedLifecycleInventory({\n desiredState: input.context.desiredState,\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n serviceManager: input.context.serviceManager,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n target: input.target,\n });\n const inventoryAfter = input.context.shouldStartAfterLifecycle\n ? await runDaemonServiceManagerAction({\n action: \"wait_running\",\n controller: input.context.serviceManager.controller,\n intent: toLifecycleIntent(input.operation),\n resolveErrorMetadata: (error) => {\n const startupError = readLifecycleStartupTimeoutError(error);\n return startupError?.jobDiagnostics\n ? { jobDiagnostics: startupError.jobDiagnostics }\n : null;\n },\n run: verifyFinalInventory,\n })\n : await verifyFinalInventory();\n await cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n input.operation\n );\n return {\n status: \"aligned\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter,\n reasonCodes: [],\n completedPhases: input.state.completedPhases,\n desiredState: input.context.desiredState,\n shouldStartAfterLifecycle: input.context.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n } catch (error) {\n if (\n error instanceof DaemonServiceLifecycleDrainTimeoutError ||\n error instanceof DaemonServiceLifecycleControlledDrainError\n ) {\n throw error;\n }\n input.state.evidencePath =\n (await captureDaemonServiceEvidenceBestEffort({\n evidencePath: input.state.evidencePath ?? undefined,\n phase: \"after_failure\",\n })) ?? input.state.evidencePath;\n await writeLifecycleEvidenceEvent({\n evidencePath: input.state.evidencePath,\n completedPhases: input.state.completedPhases,\n failureStage: input.state.failureStage,\n });\n const recovered = await recoverLifecycleFailure({\n commandOptions: input.context.commandOptions,\n currentContract: input.context.currentContract,\n error,\n expectedVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n operation: input.operation,\n restorePoint: input.restorePoint,\n serviceManager: input.context.serviceManager,\n state: input.state,\n target: input.target,\n cliScriptPath: input.cliScriptPath,\n });\n return recovered;\n }\n}\n\nasync function recoverLifecycleFailure(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n error: unknown;\n expectedVersion: string;\n inventoryBefore: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n restorePoint: DaemonServiceLifecycleRestorePoint;\n serviceManager: DaemonServiceManager;\n state: DaemonServiceLifecycleMutableState;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n cliScriptPath?: string;\n}): Promise<DaemonServiceLifecycleOutcome> {\n const originalErrorMessage = toErrorMessage(input.error);\n const originalErrorCode = resolveLifecycleFailureErrorCode(input.error);\n const originalFailureStage = resolveLifecycleFailureStage(\n input.error,\n input.state.failureStage\n );\n const originalReasonCodes = resolveLifecycleFailureReasonCodes(input.error);\n\n let verifiedRollbackError: unknown = null;\n if (\n input.restorePoint.trusted &&\n isVerifiedRollbackEligibleFailureStage(originalFailureStage)\n ) {\n const restoredPrevious = await restoreVerifiedPreviousState({\n restorePoint: input.restorePoint,\n serviceManager: input.serviceManager,\n }).catch((error) => {\n verifiedRollbackError = error;\n console.warn(\"[openmeld.daemon_service.verified_rollback_failed]\", {\n errorMessage: toErrorMessage(error),\n failureStage: originalFailureStage,\n operation: input.operation,\n previousVersion:\n input.restorePoint.previousInstallState?.daemonVersion ?? null,\n targetVersion: input.expectedVersion,\n });\n return null;\n });\n if (restoredPrevious) {\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: restoredPrevious,\n reasonCodes: originalReasonCodes,\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: input.state.backupDataPath,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"restored_verified_previous_state\",\n errorCode: originalErrorCode,\n errorMessage: originalErrorMessage,\n };\n }\n }\n const recoveryErrorMessage = verifiedRollbackError\n ? `${originalErrorMessage}; verified previous Service recovery failed: ${toErrorMessage(verifiedRollbackError)}`\n : originalErrorMessage;\n\n const stoppedSafe = await transitionLifecycleToStoppedSafeCurrentVersion({\n commandOptions: input.commandOptions,\n currentContract: input.currentContract,\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n runtimeDataBackup: input.state.runtimeDataBackup,\n serviceManager: input.serviceManager,\n cliScriptPath: input.cliScriptPath,\n }).catch((safeStopError) => {\n return { safeStopError };\n });\n\n if (\"safeStopError\" in stoppedSafe) {\n await cleanupStaleDaemonRuntimeDataBackups(\n input.state.backupRootPath\n ? {\n retainBackupRootPaths: [input.state.backupRootPath],\n }\n : {}\n );\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: null,\n reasonCodes: dedupeReasonCodes([\n ...originalReasonCodes,\n ...resolveLifecycleFailureReasonCodes(stoppedSafe.safeStopError),\n ]),\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: input.state.backupDataPath,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"failed_before_safe_state\",\n errorCode: originalErrorCode,\n errorMessage: `${recoveryErrorMessage}; stopped-safe recovery failed: ${toErrorMessage(stoppedSafe.safeStopError)}`,\n };\n }\n\n input.state.runtimeDataBackup = null;\n input.state.backupDataPath = null;\n input.state.backupRootPath = null;\n await cleanupStaleDaemonRuntimeDataBackups();\n return {\n status: \"stopped_safe\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: stoppedSafe,\n reasonCodes: originalReasonCodes,\n completedPhases: input.state.completedPhases,\n desiredState: input.restorePoint.desiredState,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n backupDataPath: null,\n failureStage: originalFailureStage,\n evidencePath: input.state.evidencePath,\n recoveryStatus: \"stopped_safe_current_version\",\n errorMessage: recoveryErrorMessage,\n };\n}\n\nfunction isVerifiedRollbackEligibleFailureStage(\n failureStage: DaemonServiceFailureStage | null\n): boolean {\n return (\n failureStage === \"install_bundle\" ||\n failureStage === \"write_contract\" ||\n failureStage === \"register_service\" ||\n failureStage === \"restore_runtime_data\" ||\n failureStage === \"start_if_desired\" ||\n failureStage === \"wait_running\" ||\n failureStage === \"verify_final_inventory\"\n );\n}\n\nasync function restoreVerifiedPreviousState(input: {\n restorePoint: DaemonServiceLifecycleRestorePoint;\n serviceManager: DaemonServiceManager;\n}): Promise<DaemonServiceInventory> {\n const previousVersion =\n input.restorePoint.previousInstallState?.daemonVersion ??\n input.restorePoint.previousContract?.daemonVersion;\n if (!previousVersion) {\n throw new Error(\n \"verified rollback is missing the previous daemon version.\"\n );\n }\n const requiredFloor = (await readVersionState())?.required_floor?.trim();\n if (requiredFloor && compareSemver(previousVersion, requiredFloor) < 0) {\n throw new Error(\n `verified rollback version ${previousVersion} is below the required version floor ${requiredFloor}.`\n );\n }\n await input.serviceManager.uninstall();\n await input.serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n await restoreDaemonInstallStateSnapshot(\n input.restorePoint.previousInstallState\n );\n await restoreDaemonActiveBundleStateSnapshot(\n input.restorePoint.previousActiveBundle\n );\n await restoreLifecycleServiceContractSnapshot(\n input.restorePoint.previousContract\n );\n const previousDistribution: OpenMeldDistribution =\n input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? \"binary\"\n : \"npm\";\n await installDaemonSystemServiceRegistration({\n distribution: previousDistribution,\n serviceCommandSpec: buildDaemonSystemServiceCommandSpec({\n ...(input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? {\n binaryExecutablePath:\n input.restorePoint.previousActiveBundle.sourceEntryScriptPath,\n }\n : {}),\n controller: input.serviceManager.controller,\n distribution: previousDistribution,\n environmentTarget: resolveOpenMeldEnvironmentTargetFromEnv(),\n }),\n serviceManager: input.serviceManager,\n });\n if (input.restorePoint.shouldStartAfterLifecycle) {\n await input.serviceManager.start();\n } else {\n await input.serviceManager.waitUntilStopped();\n }\n const inventoryAfter = await waitForVerifiedLifecycleInventory({\n desiredState: input.restorePoint.desiredState,\n expectedVersion: previousVersion,\n operation: \"upgrade_reconcile\",\n serviceManager: input.serviceManager,\n shouldStartAfterLifecycle: input.restorePoint.shouldStartAfterLifecycle,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: previousVersion,\n distribution:\n input.restorePoint.previousActiveBundle?.bundleFormat === \"binary_v1\"\n ? \"binary\"\n : \"npm\",\n }),\n });\n return inventoryAfter;\n}\n\nasync function transitionLifecycleToStoppedSafeCurrentVersion(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n runtimeDataBackup: DaemonRuntimeDataBackup | null;\n serviceManager: DaemonServiceManager;\n cliScriptPath?: string;\n}): Promise<DaemonServiceInventory> {\n await input.serviceManager.uninstall().catch(() => undefined);\n await input.serviceManager.waitUntilAbsent().catch(() => undefined);\n await ensureNoOwnedProcessesRemain();\n const preparedBundle = await prepareDaemonServiceBundle({\n daemonVersion: input.expectedVersion,\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n await installDaemon({\n daemonVersion: input.expectedVersion,\n source: \"cli.auto_check\",\n });\n await ensureLifecycleServiceContract({\n commandOptions: input.commandOptions,\n currentContract: input.currentContract,\n daemonVersion: input.expectedVersion,\n desiredState: \"stopped\",\n preparedBundle,\n serviceController: input.serviceManager.controller,\n });\n const serviceDistribution: OpenMeldDistribution =\n preparedBundle.bundleFormat === \"binary_v1\" ? \"binary\" : \"npm\";\n await installDaemonSystemServiceRegistration({\n distribution: serviceDistribution,\n serviceCommandSpec: buildDaemonSystemServiceCommandSpec({\n ...(preparedBundle.bundleFormat === \"binary_v1\"\n ? { binaryExecutablePath: preparedBundle.sourceEntryScriptPath }\n : {}),\n controller: input.serviceManager.controller,\n distribution: serviceDistribution,\n environmentTarget: input.commandOptions.environmentTarget,\n }),\n serviceManager: input.serviceManager,\n });\n await input.serviceManager.waitUntilStopped();\n if (input.runtimeDataBackup) {\n await restoreDaemonRuntimeDataForReinstall(input.runtimeDataBackup);\n await cleanupDaemonRuntimeDataBackup(input.runtimeDataBackup);\n }\n return await waitForVerifiedLifecycleInventory({\n desiredState: \"stopped\",\n expectedVersion: input.expectedVersion,\n operation: input.operation,\n serviceManager: input.serviceManager,\n shouldStartAfterLifecycle: false,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n }),\n });\n}\n\nfunction readLifecycleStartupTimeoutError(error: unknown) {\n if (isSystemServiceStartupTimeoutError(error)) {\n return error;\n }\n if (\n error instanceof DaemonServiceLifecycleStageError &&\n isSystemServiceStartupTimeoutError(error.cause)\n ) {\n return error.cause;\n }\n return null;\n}\n\nasync function createLifecycleRestorePoint(input: {\n desiredState: \"background\" | \"stopped\";\n inventoryBefore: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): Promise<DaemonServiceLifecycleRestorePoint> {\n const previousActiveBundle = input.inventoryBefore.activeBundle ?? null;\n const activeBundleIntegrityVerified = previousActiveBundle\n ? await verifyDaemonActiveBundleIntegrity(previousActiveBundle).catch(\n () => false\n )\n : false;\n return {\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n previousActiveBundle,\n previousContract: input.inventoryBefore.serviceContract ?? null,\n previousInstallState: input.inventoryBefore.installStatus.installed\n ? input.inventoryBefore.installStatus.state\n : null,\n trusted: isVerifiedRollbackRestorePointTrusted({\n activeBundleIntegrityVerified,\n inventory: input.inventoryBefore,\n }),\n };\n}\n\nfunction isVerifiedRollbackRestorePointTrusted(input: {\n activeBundleIntegrityVerified: boolean;\n inventory: DaemonServiceInventory;\n}): boolean {\n const inventory = input.inventory;\n const previousInstallState = inventory.installStatus.installed\n ? inventory.installStatus.state\n : null;\n const previousContract = inventory.serviceContract ?? null;\n const previousActiveBundle = inventory.activeBundle ?? null;\n if (!(previousInstallState && previousContract && previousActiveBundle)) {\n return false;\n }\n if (!isDaemonServiceContractIdentityReusable(previousContract)) {\n return false;\n }\n if (previousContract.serviceController === \"legacy-detached\") {\n return false;\n }\n if (\n previousInstallState.daemonVersion !== previousContract.daemonVersion ||\n previousInstallState.daemonVersion !== previousActiveBundle.daemonVersion\n ) {\n return false;\n }\n if (previousContract.bundleId !== previousActiveBundle.bundleId) {\n return false;\n }\n if (\n previousActiveBundle.bundleFormat !== \"self_contained_v1\" &&\n previousActiveBundle.bundleFormat !== \"binary_v1\"\n ) {\n return false;\n }\n if (!input.activeBundleIntegrityVerified) {\n return false;\n }\n if (\n inventory.anomalies.some((anomaly) =>\n VERIFIED_ROLLBACK_UNTRUSTED_ANOMALIES.has(anomaly.code)\n )\n ) {\n return false;\n }\n return (\n typeof inventory.activeBundleEntryPath === \"string\" &&\n inventory.activeBundleEntryPath.length > 0\n );\n}\n\nasync function stopLifecycleRuntime(input: {\n stopCause: RuntimeTransportStopCause;\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n inventory: DaemonServiceInventory;\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const lifecycleIntent = toLifecycleIntent(input.operation);\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: lifecycleIntent,\n metadata: {\n drainWaitMs: input.drainWaitMs,\n forceKillAfterDrainTimeout: input.forceKillAfterDrainTimeout,\n strategy: \"controlled_drain\",\n },\n result: \"selected\",\n stopCause: input.stopCause,\n type: \"stop.strategy.selected\",\n });\n const usesSystemService =\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.serviceManagerStatus?.installed === true ||\n input.inventory.serviceManagerStatus?.running === true;\n if (usesSystemService) {\n await stopLifecycleSystemServiceRuntime({\n ...input,\n lifecycleIntent,\n });\n return;\n }\n const runtimeStatus = input.inventory.runtimeStatus;\n if (runtimeStatus.status !== \"running\") {\n return;\n }\n if (!Number.isInteger(runtimeStatus.pid) || runtimeStatus.pid === null) {\n throw new DaemonServiceLifecycleStageError({\n message: \"OpenMeld runtime is marked running but no pid is available.\",\n stage: \"stop_or_drain\",\n });\n }\n const terminated = await stopDaemonProcessWithTimeout(\n runtimeStatus.pid,\n \"SIGTERM\",\n input.drainWaitMs\n );\n if (terminated) {\n return;\n }\n // `forceKillAfterDrainTimeout` stays the explicit user-confirmed force\n // path; the stalled-heartbeat fallback below is the automatic escape for\n // daemons that are provably wedged and would otherwise keep every stop\n // and repair failing.\n if (input.forceKillAfterDrainTimeout) {\n await stopDaemonProcess(runtimeStatus.pid, \"SIGKILL\");\n return;\n }\n const forceKill = await forceKillStalledDaemonAfterStopTimeout({\n stage: \"stop_or_drain\",\n });\n if (!forceKill.killed) {\n throw new DaemonServiceLifecycleDrainTimeoutError(input.drainWaitMs);\n }\n}\n\nasync function stopLifecycleSystemServiceRuntime(input: {\n stopCause: RuntimeTransportStopCause;\n drainWaitMs: number;\n forceKillAfterDrainTimeout: boolean;\n inventory: DaemonServiceInventory;\n lifecycleIntent: \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\";\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const restoreAutostartOnDrainFailure =\n await disableDaemonServiceAutostartIfConfigured({\n manager: input.serviceManager,\n status: input.inventory.serviceManagerStatus,\n });\n let drained = false;\n try {\n drained =\n hasActiveLifecycleRuntimeEvidence(input.inventory) &&\n !input.forceKillAfterDrainTimeout &&\n (await requestControlledSystemServiceDrain({\n drainWaitMs: input.drainWaitMs,\n inventory: input.inventory,\n lifecycleIntent: input.lifecycleIntent,\n operation: input.operation,\n stopCause: input.stopCause,\n }));\n } catch (drainError) {\n if (restoreAutostartOnDrainFailure) {\n try {\n await input.serviceManager.enableAutostart();\n } catch (restoreError) {\n throw new DaemonServiceLifecycleStageError({\n cause: restoreError,\n message: `${toErrorMessage(drainError)}; failed to restore service autostart: ${toErrorMessage(restoreError)}`,\n stage: \"stop_or_drain\",\n });\n }\n }\n throw drainError;\n }\n await input.serviceManager.stop();\n if (drained) {\n return;\n }\n const stopCandidates = resolveSafeOwnedProcessStopCandidates(input.inventory);\n for (const processInfo of stopCandidates) {\n await stopDaemonProcess(processInfo.pid, \"SIGTERM\");\n }\n}\n\nfunction hasActiveLifecycleRuntimeEvidence(\n inventory: DaemonServiceInventory\n): boolean {\n return (\n inventory.runtimeStatus.status === \"running\" ||\n inventory.serviceManagerStatus?.running === true ||\n inventory.ownedProcesses.length > 0\n );\n}\n\nasync function requestControlledSystemServiceDrain(input: {\n stopCause: RuntimeTransportStopCause;\n drainWaitMs: number;\n inventory: DaemonServiceInventory;\n lifecycleIntent: \"startup_check\" | \"reinstall\" | \"upgrade_reconcile\";\n operation: DaemonServiceLifecycleOperation;\n}): Promise<boolean> {\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n gracePeriodMs: input.drainWaitMs,\n mode: \"graceful\",\n },\n // New Services bound their post-work result-receipt and socket-close\n // waits. Bound this request too so an older Service cannot hold setup\n // forever; the compatibility path below still preserves the guarded\n // stale-heartbeat force-kill boundary.\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: input.lifecycleIntent,\n metadata: {\n accepted: shutdown.accepted,\n gracePeriodMs: shutdown.gracePeriodMs,\n mode: shutdown.mode,\n },\n result: shutdown.accepted ? \"completed\" : \"unsupported\",\n stopCause: input.stopCause,\n type: \"stop.controlled_drain\",\n });\n return shutdown.accepted;\n } catch (error) {\n const isLegacyShutdownContract =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.contract_mismatch\";\n const isManagerRunningWithoutRuntime =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.endpoint_missing\" &&\n input.inventory.runtimeStatus.status !== \"running\" &&\n input.inventory.ownedProcesses.length === 0;\n const isLegacyMissingCloseReason =\n isLegacyMissingControlledShutdownCloseReason({\n error,\n inventory: input.inventory,\n });\n const isLegacyControlledShutdownTimeout =\n isOlderServiceControlledShutdownTimeout({\n error,\n inventory: input.inventory,\n });\n const isCompatibilityFallback =\n isLegacyShutdownContract ||\n isLegacyMissingCloseReason ||\n isLegacyControlledShutdownTimeout ||\n isManagerRunningWithoutRuntime;\n const observedDaemonVersion =\n isLegacyMissingCloseReason || isLegacyControlledShutdownTimeout\n ? resolveObservedDaemonVersion(input.inventory)\n : null;\n await emitDaemonLifecycleEvent({\n command: `openmeld service ${input.operation.replaceAll(\"_\", \"-\")}`,\n intent: input.lifecycleIntent,\n metadata: {\n compatibilityFallback: isCompatibilityFallback,\n ...(isLegacyMissingCloseReason\n ? {\n compatibilityReason: \"legacy_missing_close_reason\",\n observedDaemonVersion,\n }\n : {}),\n ...(isLegacyControlledShutdownTimeout\n ? {\n compatibilityReason: \"legacy_controlled_shutdown_timeout\",\n observedDaemonVersion,\n reasonCode: \"socket_close_timeout\",\n }\n : {}),\n ...(isManagerRunningWithoutRuntime\n ? {\n compatibilityReason: \"manager_running_without_runtime\",\n }\n : {}),\n errorMessage: toErrorMessage(error),\n },\n result: isCompatibilityFallback ? \"fallback\" : \"failed\",\n stopCause: input.stopCause,\n type: \"stop.controlled_drain\",\n });\n if (isCompatibilityFallback) {\n return false;\n }\n throw new DaemonServiceLifecycleControlledDrainError(error);\n }\n}\n\nfunction isOlderServiceControlledShutdownTimeout(input: {\n error: unknown;\n inventory: DaemonServiceInventory;\n}): boolean {\n if (\n !(input.error instanceof LocalDaemonControlPlaneClientError) ||\n input.error.code !== \"daemon.control.timeout\"\n ) {\n return false;\n }\n const observedDaemonVersion = resolveObservedDaemonVersion(input.inventory);\n if (!observedDaemonVersion) {\n return false;\n }\n try {\n return (\n resolveVersionChangeDirection({\n fromVersion: observedDaemonVersion,\n toVersion: input.inventory.expectedVersion,\n }) === \"upgrade\"\n );\n } catch {\n return false;\n }\n}\n\nfunction isLegacyMissingControlledShutdownCloseReason(input: {\n error: unknown;\n inventory: DaemonServiceInventory;\n}): boolean {\n if (\n !(input.error instanceof LocalDaemonControlPlaneClientError) ||\n input.error.code !== \"daemon.run.socket_closed\" ||\n input.error.message !== \"daemon stream closed (code=1000, reason=closed)\"\n ) {\n return false;\n }\n const observedDaemonVersion = resolveObservedDaemonVersion(input.inventory);\n if (!observedDaemonVersion) {\n return false;\n }\n try {\n return (\n resolveVersionChangeDirection({\n fromVersion: observedDaemonVersion,\n toVersion: MISSING_CONTROLLED_SHUTDOWN_CLOSE_REASON_FIXED_VERSION,\n }) === \"upgrade\"\n );\n } catch {\n return false;\n }\n}\n\nfunction resolveObservedDaemonVersion(\n inventory: DaemonServiceInventory\n): string | null {\n return (\n inventory.activeBundle?.daemonVersion ??\n inventory.serviceContract?.daemonVersion ??\n (inventory.installStatus.installed\n ? inventory.installStatus.state?.daemonVersion\n : null) ??\n null\n );\n}\n\nasync function ensureLifecycleRuntimeStopped(): Promise<void> {\n const runtimeAfterStop = await readCurrentObservedDaemonRuntimeStatus();\n if (runtimeAfterStop.status === \"stale\") {\n await clearDaemonRuntimeStateIfDefinitelyStopped();\n return;\n }\n if (runtimeAfterStop.status === \"running\") {\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld service is still running after stop phase (pid=${String(\n runtimeAfterStop.pid\n )}).`,\n stage: \"wait_stopped\",\n });\n }\n}\n\nasync function waitForLifecycleRuntimeStopped(input: {\n inventory: DaemonServiceInventory;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n const usesSystemService =\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.serviceManagerStatus?.installed === true ||\n input.inventory.serviceManagerStatus?.running === true;\n\n if (usesSystemService) {\n const stopped = await waitForDaemonSystemServiceToStop({\n manager: input.serviceManager,\n waitMs: STRICT_TEARDOWN_VERIFY_WAIT_MS,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n });\n // A daemon that survived the graceful window may be wedged (old daemons\n // sleep through SIGTERM inside reconnect backoff for up to 15 minutes,\n // which no lifecycle stop window can cover). Escalate to SIGKILL only\n // under the stalled-heartbeat safety boundary; a fresh heartbeat keeps\n // the existing failure below.\n const stoppedAfterForceKill =\n stopped ||\n ((await forceKillStalledDaemonAfterStopTimeout({ stage: \"wait_stopped\" }))\n .killed &&\n (await waitForDaemonSystemServiceToStop({\n manager: input.serviceManager,\n waitMs: STRICT_TEARDOWN_VERIFY_WAIT_MS,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n })));\n if (!stoppedAfterForceKill) {\n const runtimeAfterWait = await readCurrentObservedDaemonRuntimeStatus();\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld service is still running after stop phase (pid=${String(\n runtimeAfterWait.pid\n )}).`,\n stage: \"wait_stopped\",\n });\n }\n }\n\n await ensureLifecycleRuntimeStopped();\n}\n\nasync function waitForLifecycleRuntimeAbsentWithRetry(\n serviceManager: DaemonServiceManager\n): Promise<void> {\n let initialError: unknown;\n try {\n await serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n return;\n } catch (error) {\n initialError = error;\n }\n\n try {\n // A controlled drain may finish just after launchd's first absence window.\n // Give that same process one final bounded verification window before any\n // reinstall or stopped-safe recovery mutates the persistent Service state.\n await serviceManager.waitUntilAbsent();\n await ensureNoOwnedProcessesRemain();\n } catch (retryError) {\n throw new DaemonServiceLifecycleStageError({\n cause: retryError,\n message: `${toErrorMessage(retryError)}; initial absence verification failed: ${toErrorMessage(initialError)}`,\n stage: \"wait_absent\",\n });\n }\n}\n\nasync function cleanupStaleDaemonRuntimeDataBackupsAfterHealthyLifecycle(\n operation: DaemonServiceLifecycleOperation\n): Promise<void> {\n try {\n await cleanupStaleDaemonRuntimeDataBackups();\n } catch (error) {\n // The Service is already verified healthy, so stale temporary data must\n // never trigger destructive lifecycle recovery. Keep the failure visible\n // and retry cleanup on the next already-aligned lifecycle check.\n console.warn(\"[openmeld.daemon_runtime_data.cleanup_warning]\", {\n errorMessage: toErrorMessage(error),\n operation,\n });\n }\n}\n\nasync function ensureNoOwnedProcessesRemain(): Promise<void> {\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n while (Date.now() < deadline) {\n const [ownedProcesses, runtimeStatus] = await Promise.all([\n listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (ownedProcesses.length === 0) {\n if (runtimeStatus.status === \"not_running\") {\n return;\n }\n if (runtimeStatus.status === \"stale\") {\n await clearDaemonRuntimeStateIfDefinitelyStopped();\n return;\n }\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n const [ownedProcesses, runtimeStatus] = await Promise.all([\n listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }),\n readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (ownedProcesses.length > 0) {\n const summary = ownedProcesses\n .map(\n (processInfo) => `${processInfo.ownership}:${String(processInfo.pid)}`\n )\n .join(\", \");\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld-owned service processes are still present after teardown (${summary}).`,\n stage: \"wait_absent\",\n });\n }\n if (runtimeStatus.status !== \"not_running\") {\n throw new DaemonServiceLifecycleStageError({\n message: `OpenMeld runtime is still ${runtimeStatus.status} after teardown.`,\n stage: \"wait_absent\",\n });\n }\n}\n\nasync function waitForLegacySharedServiceCleanup(input: {\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n shouldStartAfterLifecycle: boolean;\n}): Promise<void> {\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n let lastInventory: DaemonServiceInventory | null = null;\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intent: toLifecycleIntent(input.operation),\n });\n lastInventory = inventory;\n const hasLegacySharedService =\n inventory.legacySharedService?.present === true ||\n inventory.anomalies.some(\n (anomaly) => anomaly.code === \"legacy_shared_service_present\"\n );\n if (!hasLegacySharedService) {\n return;\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n\n throw new DaemonServiceLifecycleStageError({\n message:\n \"OpenMeld Service legacy shared registration is still present after cleanup. reason=legacy_shared_service_present\",\n reasonCodes: [\"legacy_shared_service_present\"],\n stage: \"unregister\",\n cause: lastInventory,\n });\n}\n\nfunction resolveSafeOwnedProcessStopCandidates(\n inventory: DaemonServiceInventory\n) {\n const seenPids = new Set<number>();\n return inventory.ownedProcesses.filter((processInfo) => {\n if (processInfo.ownership === \"unknown\") {\n return false;\n }\n if (processInfo.mode === \"foreground\") {\n return false;\n }\n if (seenPids.has(processInfo.pid)) {\n return false;\n }\n seenPids.add(processInfo.pid);\n return true;\n });\n}\n\nasync function resolveLifecycleCommandOptions(input: {\n inventory: DaemonServiceInventory;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<DaemonServiceLifecycleCommandOptions> {\n const [currentContract, runtimeSnapshot, runtimePaths, fallbackProfile] =\n await Promise.all([\n Promise.resolve(\n input.inventory.serviceContract ?? readDaemonServiceContract()\n ).catch(() => null),\n readDaemonServiceRuntimeSnapshot().catch(() => null),\n ensureDaemonRuntimePaths().catch(() => null),\n resolveOpenMeldProfileOrNull({\n allowDefaultFallback: true,\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null),\n ]);\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n currentContract\n )\n ? currentContract\n : null;\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const explicitGatewayUrl = await resolveExplicitGatewayUrlOrThrow(\n input.gatewayUrl\n );\n const commandGatewayUrl = environmentTarget.gatewayUrl;\n const preferCommandGateway = shouldPreferCommandResolvedGatewayForLifecycle();\n const gatewayUrl = resolveLifecycleGatewayUrl({\n explicitGatewayUrl,\n preferCommandGateway,\n commandGatewayUrl,\n currentGatewayUrl: normalizeGatewayBaseUrlOrNull(\n currentContract?.gatewayUrl\n ),\n runtimeGatewayUrl: normalizeGatewayBaseUrlOrNull(\n runtimeSnapshot?.gatewayUrl\n ),\n });\n const openMeldProfileId =\n normalizeOptionalText(input.profile) ??\n normalizeOptionalText(runtimeSnapshot?.openMeldProfileId) ??\n fallbackProfile?.openMeldProfileId ??\n reusableCurrentContract?.profileId;\n const ownerUserId = await resolveLifecycleCommandOwnerUserId({\n openMeldProfileId,\n fallbackProfile,\n reusableCurrentContract,\n });\n const shouldDiscardPersistedDeviceId =\n resolveOpenMeldEnvPreset() === \"prod\"\n ? isUnsafeProductionDeviceId\n : undefined;\n const deviceId = runtimePaths\n ? await resolveDaemonDeviceId({\n deviceId: resolvePreferredDaemonDeviceId({\n explicitDeviceId: input.deviceId,\n contractDeviceId: reusableCurrentContract?.deviceId,\n }),\n deviceIdPath: runtimePaths.deviceIdPath,\n ...(shouldDiscardPersistedDeviceId\n ? { shouldDiscardPersistedDeviceId }\n : {}),\n }).catch(() => reusableCurrentContract?.deviceId ?? null)\n : (normalizeOptionalText(input.deviceId) ??\n reusableCurrentContract?.deviceId ??\n null);\n const heartbeatMs = normalizeHeartbeatIntervalMs(\n input.heartbeatMs ?? currentContract?.heartbeatMs\n );\n return {\n environmentTarget,\n ...(gatewayUrl ? { gatewayUrl } : {}),\n ...(ownerUserId ? { ownerUserId } : {}),\n ...(openMeldProfileId ? { openMeldProfileId } : {}),\n ...(deviceId ? { deviceId } : {}),\n ...(typeof heartbeatMs === \"number\" ? { heartbeatMs } : {}),\n };\n}\n\nfunction resolveLifecycleGatewayUrl(input: {\n explicitGatewayUrl?: string | null;\n preferCommandGateway: boolean;\n commandGatewayUrl: string;\n currentGatewayUrl: string | null;\n runtimeGatewayUrl: string | null;\n}): string | null {\n if (input.explicitGatewayUrl) {\n return input.explicitGatewayUrl;\n }\n if (input.preferCommandGateway) {\n return input.commandGatewayUrl;\n }\n if (input.currentGatewayUrl) {\n return input.currentGatewayUrl;\n }\n if (input.runtimeGatewayUrl) {\n return input.runtimeGatewayUrl;\n }\n return input.commandGatewayUrl;\n}\n\nasync function resolveLifecycleCommandOwnerUserId(input: {\n openMeldProfileId?: string | null;\n fallbackProfile: OpenMeldProfile | null;\n reusableCurrentContract: DaemonServiceContract | null;\n}): Promise<string | undefined> {\n const profileId = normalizeOptionalText(input.openMeldProfileId);\n if (profileId && input.fallbackProfile?.openMeldProfileId === profileId) {\n return (\n normalizeOptionalText(input.fallbackProfile.ownerUserId) ?? undefined\n );\n }\n\n if (profileId) {\n const selectedProfile = await resolveOpenMeldProfileOrNull({\n openMeldProfileId: profileId,\n allowDefaultFallback: false,\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null);\n const fallbackFromResolved = normalizeOptionalText(\n selectedProfile?.ownerUserId\n );\n if (fallbackFromResolved) {\n return fallbackFromResolved;\n }\n }\n\n if (profileId && input.reusableCurrentContract?.profileId === profileId) {\n return (\n normalizeOptionalText(input.reusableCurrentContract.ownerUserId) ??\n undefined\n );\n }\n\n if (!profileId) {\n return (\n normalizeOptionalText(input.reusableCurrentContract?.ownerUserId) ??\n undefined\n );\n }\n\n return undefined;\n}\n\nfunction shouldPreferCommandResolvedGatewayForLifecycle(): boolean {\n if (normalizeOptionalText(process.env.OPENMELD_GATEWAY_URL)) {\n return true;\n }\n const preset = resolveOpenMeldEnvPreset();\n return preset === \"dev-local\" || preset === \"canary\";\n}\n\nfunction resolveLifecycleDesiredState(\n inventory: DaemonServiceInventory\n): \"background\" | \"stopped\" {\n if (inventory.serviceContract?.desiredState === \"background\") {\n return \"background\";\n }\n if (inventory.serviceContract?.desiredState === \"stopped\") {\n return \"stopped\";\n }\n if (inventory.serviceManagerStatus?.running) {\n return \"background\";\n }\n if (inventory.runtimeStatus.mode !== \"background\") {\n return \"stopped\";\n }\n return inventory.runtimeStatus.status === \"running\" ||\n inventory.runtimeStatus.status === \"stale\" ||\n inventory.runtimeStatus.managedBySystemService ||\n inventory.runtimeStatus.autoStart\n ? \"background\"\n : \"stopped\";\n}\n\nfunction resolveLifecycleShouldStartAfterLifecycle(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n}): boolean {\n if (input.desiredState !== \"background\") {\n return false;\n }\n if (input.inventory.serviceManagerStatus?.running) {\n return true;\n }\n if (input.inventory.runtimeStatus.mode !== \"background\") {\n return false;\n }\n return (\n input.inventory.runtimeStatus.status === \"running\" ||\n input.inventory.runtimeStatus.status === \"stale\" ||\n input.inventory.runtimeStatus.managedBySystemService ||\n input.inventory.runtimeStatus.autoStart\n );\n}\n\nasync function resolveLifecycleServiceManager(\n inventory: DaemonServiceInventory\n): Promise<DaemonServiceManager | null> {\n if (inventory.serviceManager) {\n return inventory.serviceManager;\n }\n if (inventory.legacySharedService?.serviceManager) {\n return inventory.legacySharedService.serviceManager;\n }\n if (\n inventory.runtimeStatus.serviceController !== \"unknown\" &&\n inventory.runtimeStatus.serviceController !== \"legacy-detached\"\n ) {\n return await resolveDaemonServiceManager(\n inventory.runtimeStatus.serviceController\n ).catch(() => null);\n }\n return await resolveDaemonServiceManager().catch(() => null);\n}\n\nfunction resolveUnsafeOwnedProcessReasonCodes(\n inventory: DaemonServiceInventory\n): DaemonServiceLifecycleReasonCode[] {\n if (\n inventory.ownedProcesses.some(\n (processInfo) => processInfo.ownership === \"unknown\"\n )\n ) {\n return [\"unknown_owned_processes\"];\n }\n return [];\n}\n\nfunction resolveImmediateLifecycleOutcome(input: {\n completedPhases: DaemonServiceLifecyclePhase[];\n desiredState: \"background\" | \"stopped\";\n expectedVersion: string;\n forceReinstall: boolean;\n inventoryBefore: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}):\n | Extract<DaemonServiceLifecycleOutcome, { status: \"already_aligned\" }>\n | Extract<DaemonServiceLifecycleOutcome, { status: \"blocked\" }>\n | null {\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory: input.inventoryBefore,\n target: input.target,\n });\n if (!input.forceReinstall && decision.status === \"already_aligned\") {\n return {\n status: \"already_aligned\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: input.inventoryBefore,\n reasonCodes: [],\n completedPhases: input.completedPhases,\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n }\n const unsafeReasonCodes = resolveUnsafeOwnedProcessReasonCodes(\n input.inventoryBefore\n );\n if (\n input.forceReinstall ||\n (decision.status !== \"not_installed\" &&\n decision.status !== \"blocked\" &&\n unsafeReasonCodes.length === 0)\n ) {\n return null;\n }\n return {\n status: \"blocked\",\n targetVersion: input.expectedVersion,\n inventoryBefore: input.inventoryBefore,\n inventoryAfter: input.inventoryBefore,\n reasonCodes: dedupeReasonCodes([\n ...decision.reasonCodes,\n ...unsafeReasonCodes,\n ]),\n completedPhases: input.completedPhases,\n desiredState: input.desiredState,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n backupDataPath: null,\n errorMessage: null,\n };\n}\n\nfunction dedupeReasonCodes(\n reasonCodes: DaemonServiceLifecycleReasonCode[]\n): DaemonServiceLifecycleReasonCode[] {\n return [...new Set(reasonCodes)];\n}\n\nasync function ensureLifecycleServiceContract(input: {\n commandOptions: DaemonServiceLifecycleCommandOptions;\n currentContract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n daemonVersion: string;\n desiredState: \"background\" | \"stopped\";\n preparedBundle: Awaited<ReturnType<typeof prepareDaemonServiceBundle>>;\n serviceController: DaemonServiceManager[\"controller\"];\n}): Promise<void> {\n const bundleId =\n input.preparedBundle.bundleId ?? input.currentContract?.bundleId ?? null;\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n input.currentContract\n )\n ? input.currentContract\n : null;\n const writeResult = await writeDaemonServiceContract({\n daemonVersion: input.daemonVersion,\n bundleId,\n desiredState: input.desiredState,\n serviceController: input.serviceController,\n autoStart: input.desiredState === \"background\",\n gatewayUrl: input.commandOptions.gatewayUrl ?? null,\n ...(input.commandOptions.ownerUserId\n ? { ownerUserId: input.commandOptions.ownerUserId }\n : {}),\n ...(input.commandOptions.openMeldProfileId\n ? { profileId: input.commandOptions.openMeldProfileId }\n : {}),\n deviceId: input.commandOptions.deviceId ?? null,\n heartbeatMs:\n input.commandOptions.heartbeatMs ??\n input.currentContract?.heartbeatMs ??\n null,\n ...(reusableCurrentContract ? { lane: reusableCurrentContract.lane } : {}),\n });\n if (writeResult.status === \"skipped_missing_fields\") {\n throw new DaemonServiceLifecycleStageError({\n message: formatMissingContractFieldsLifecycleError(\n writeResult.missingFields\n ),\n reasonCodes: [MISSING_REQUIRED_CONTRACT_FIELDS_REASON],\n stage: \"write_contract\",\n });\n }\n}\n\nfunction formatMissingContractFieldsLifecycleError(\n missingFields: DaemonServiceContractMissingField[]\n): string {\n const fields = missingFields.length > 0 ? missingFields.join(\",\") : \"unknown\";\n return `OpenMeld Service contract cannot be written. reason=${MISSING_REQUIRED_CONTRACT_FIELDS_REASON} missingFields=${fields}`;\n}\n\nasync function restoreLifecycleServiceContractSnapshot(\n snapshot: Awaited<ReturnType<typeof readDaemonServiceContract>>\n): Promise<void> {\n if (!snapshot) {\n await clearDaemonServiceContract();\n return;\n }\n await upsertDaemonServiceContract({\n daemonVersion: snapshot.daemonVersion,\n bundleId: snapshot.bundleId,\n desiredState: snapshot.desiredState,\n serviceController: snapshot.serviceController,\n autoStart: snapshot.autoStart,\n gatewayUrl: snapshot.gatewayUrl,\n ...(snapshot.ownerUserId ? { ownerUserId: snapshot.ownerUserId } : {}),\n ...(snapshot.profileId ? { profileId: snapshot.profileId } : {}),\n deviceId: snapshot.deviceId,\n ...(snapshot.connectedComputerId\n ? { connectedComputerId: snapshot.connectedComputerId }\n : {}),\n heartbeatMs: snapshot.heartbeatMs,\n lane: snapshot.lane,\n });\n}\n\ntype VerifiedLifecycleInventoryInput = {\n desiredState: \"background\" | \"stopped\";\n expectedVersion: string;\n operation: DaemonServiceLifecycleOperation;\n serviceManager: DaemonServiceManager;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n};\n\nasync function waitForStartedLifecycleInventory(\n input: VerifiedLifecycleInventoryInput\n): Promise<DaemonServiceInventory> {\n try {\n const result = await waitForSystemServiceStartup({\n expectedVersion: input.expectedVersion,\n manager: input.serviceManager,\n pollMs: STRICT_TEARDOWN_VERIFY_POLL_MS,\n intent: toLifecycleIntent(input.operation),\n isReady: (inventory) =>\n verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: true,\n target: input.target,\n }) === null,\n });\n return result.inventory;\n } catch (error) {\n if (!isSystemServiceStartupTimeoutError(error)) {\n throw error;\n }\n const inventory = error.inventory;\n const verificationError = inventory\n ? verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: true,\n target: input.target,\n })\n : null;\n throw new DaemonServiceLifecycleStageError({\n cause: error,\n message: verificationError ?? error.message,\n reasonCodes: inventory\n ? readDaemonServiceInventoryAnomalyCodes(inventory)\n : [],\n stage: \"verify_final_inventory\",\n });\n }\n}\n\nasync function waitForVerifiedLifecycleInventory(\n input: VerifiedLifecycleInventoryInput\n): Promise<DaemonServiceInventory> {\n if (input.shouldStartAfterLifecycle) {\n return await waitForStartedLifecycleInventory(input);\n }\n\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n let lastInventory: DaemonServiceInventory | null = null;\n let lastError: string | null = null;\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intent: toLifecycleIntent(input.operation),\n });\n const verificationError = verifyLifecycleInventory({\n desiredState: input.desiredState,\n inventory,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n target: input.target,\n });\n if (!verificationError) {\n return inventory;\n }\n if (\n !shouldRetryLifecycleInventoryVerification({\n inventory,\n shouldStartAfterLifecycle: input.shouldStartAfterLifecycle,\n })\n ) {\n throw new DaemonServiceLifecycleStageError({\n message: verificationError,\n reasonCodes: readDaemonServiceInventoryAnomalyCodes(inventory),\n stage: \"verify_final_inventory\",\n cause: inventory,\n });\n }\n lastInventory = inventory;\n lastError = verificationError;\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n throw new DaemonServiceLifecycleStageError({\n message:\n lastError ??\n \"OpenMeld could not verify the final local service inventory state.\",\n reasonCodes: lastInventory\n ? readDaemonServiceInventoryAnomalyCodes(lastInventory)\n : [],\n stage: \"verify_final_inventory\",\n cause: lastInventory,\n });\n}\n\nfunction readDaemonServiceInventoryAnomalyCodes(\n inventory: DaemonServiceInventory\n): DaemonServiceLifecycleReasonCode[] {\n return inventory.anomalies.map((anomaly) => anomaly.code);\n}\n\nasync function installDaemonSystemServiceRegistration(input: {\n distribution: OpenMeldDistribution;\n serviceCommandSpec: ReturnType<typeof buildDaemonSystemServiceCommandSpec>;\n serviceManager: DaemonServiceManager;\n}): Promise<void> {\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.serviceManager.controller,\n distribution: input.distribution,\n });\n await input.serviceManager.install(input.serviceCommandSpec);\n}\n\nfunction verifyLifecycleInventory(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const staticVerificationFailure =\n verifyLifecycleInventoryStaticRequirements(input);\n if (staticVerificationFailure) {\n return staticVerificationFailure;\n }\n const effectiveRuntimeStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState: input.inventory.runtimeStatus,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n });\n const serviceManagerStatus = input.inventory.serviceManagerStatus;\n if (!serviceManagerStatus) {\n return \"Lifecycle verification failed because system service registration is missing.\";\n }\n if (input.shouldStartAfterLifecycle) {\n if (\n effectiveRuntimeStatus !== \"running\" ||\n input.inventory.runtimeStatus.mode !== \"background\" ||\n serviceManagerStatus.running !== true\n ) {\n return `Lifecycle verification failed because background service did not recover. runtime=${effectiveRuntimeStatus}, mode=${input.inventory.runtimeStatus.mode ?? \"unknown\"}, managerRunning=${String(\n serviceManagerStatus.running\n )}`;\n }\n return null;\n }\n if (effectiveRuntimeStatus === \"running\") {\n return \"Lifecycle verification failed because the service is still running even though it should remain stopped.\";\n }\n if (serviceManagerStatus.running) {\n return \"Lifecycle verification failed because the system service manager still reports the service as running.\";\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryStaticRequirements(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n return (\n verifyLifecycleInventoryDecision(input) ??\n verifyLifecycleInventoryContractState(input) ??\n verifyLifecycleInventoryBundleState(input) ??\n verifyLifecycleInventoryManagerState(input) ??\n (input.shouldStartAfterLifecycle\n ? verifyLifecycleInventoryRuntimeBundleState(input)\n : null)\n );\n}\n\nfunction verifyLifecycleInventoryDecision(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const inventory = buildLifecycleAlignmentInventory(input);\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: input.target,\n });\n if (decision.status === \"already_aligned\") {\n return null;\n }\n return `Lifecycle verification failed because the service is still ${decision.status}. reasons=${decision.reasonCodes.join(\",\") || \"none\"}`;\n}\n\nfunction buildLifecycleAlignmentInventory(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): DaemonServiceInventory {\n if (\n input.shouldStartAfterLifecycle ||\n input.inventory.serviceManagerStatus?.running !== false ||\n input.inventory.ownedProcesses.length > 0\n ) {\n return input.inventory;\n }\n\n return {\n ...input.inventory,\n anomalies: input.inventory.anomalies.filter(\n (anomaly) =>\n !STOPPED_LIFECYCLE_RUNTIME_SNAPSHOT_ANOMALIES.has(anomaly.code)\n ),\n };\n}\n\nfunction verifyLifecycleInventoryContractState(input: {\n desiredState: \"background\" | \"stopped\";\n inventory: DaemonServiceInventory;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n const contract = input.inventory.serviceContract ?? null;\n if (!contract) {\n return \"Lifecycle verification failed because the service contract is missing.\";\n }\n if (contract.daemonVersion !== input.target.daemonVersion) {\n return `Lifecycle verification failed because service contract version is ${contract.daemonVersion} instead of ${input.target.daemonVersion}.`;\n }\n if (\n input.inventory.activeBundle &&\n contract.bundleId !== input.inventory.activeBundle.bundleId\n ) {\n return `Lifecycle verification failed because service contract bundle is ${contract.bundleId} instead of ${input.inventory.activeBundle.bundleId}.`;\n }\n if (contract.desiredState !== input.desiredState) {\n return `Lifecycle verification failed because service contract desiredState is ${contract.desiredState} instead of ${input.desiredState}.`;\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryBundleState(input: {\n inventory: DaemonServiceInventory;\n target: ReturnType<typeof buildDaemonServiceTargetSpec>;\n}): string | null {\n if (!input.inventory.activeBundle) {\n return \"Lifecycle verification failed because the active service bundle is missing.\";\n }\n if (input.inventory.activeBundle.bundleFormat !== input.target.bundleFormat) {\n return `Lifecycle verification failed because bundle format is ${input.inventory.activeBundle.bundleFormat}.`;\n }\n if (\n input.inventory.activeBundle.daemonVersion !== input.target.daemonVersion\n ) {\n return `Lifecycle verification failed because active bundle version is ${input.inventory.activeBundle.daemonVersion} instead of ${input.target.daemonVersion}.`;\n }\n if (\n !isDaemonBundleSourceAllowedForLane({\n sourceKind: input.inventory.activeBundle.sourceKind,\n })\n ) {\n return \"Lifecycle verification failed because the active service bundle came from repo-local workspace source in a lane that only allows published or packaged bundles.\";\n }\n if (input.inventory.activeBundleEntryPath) {\n return null;\n }\n return \"Lifecycle verification failed because the active bundle entry path is missing.\";\n}\n\nfunction verifyLifecycleInventoryManagerState(input: {\n inventory: DaemonServiceInventory;\n}): string | null {\n if (!input.inventory.serviceManagerStatus?.installed) {\n return \"Lifecycle verification failed because system service registration is missing.\";\n }\n if (!input.inventory.serviceManagerStatus.enabled) {\n return \"Lifecycle verification failed because system service registration is disabled.\";\n }\n if (resolveUnsafeOwnedProcessReasonCodes(input.inventory).length > 0) {\n return \"Lifecycle verification failed because OpenMeld still detected an unknown owned process.\";\n }\n return null;\n}\n\nfunction verifyLifecycleInventoryRuntimeBundleState(input: {\n inventory: DaemonServiceInventory;\n}): string | null {\n if (!input.inventory.runtimeCommandEntryPath) {\n return \"Lifecycle verification failed because runtime state does not point at a concrete service bundle entry path.\";\n }\n if (input.inventory.runtimeCommandPathExists !== true) {\n return \"Lifecycle verification failed because the running service still points at a bundle entry path that no longer exists.\";\n }\n const activeBundleEntryPath = input.inventory.activeBundleEntryPath;\n if (!activeBundleEntryPath) {\n return \"Lifecycle verification failed because the active bundle entry path is missing.\";\n }\n if (\n normalizeDaemonCommandPath(input.inventory.runtimeCommandEntryPath) ===\n normalizeDaemonCommandPath(activeBundleEntryPath)\n ) {\n return null;\n }\n return `Lifecycle verification failed because runtime is still using ${input.inventory.runtimeCommandEntryPath} instead of ${activeBundleEntryPath}.`;\n}\n\nfunction shouldRetryLifecycleInventoryVerification(input: {\n inventory: DaemonServiceInventory;\n shouldStartAfterLifecycle: boolean;\n}): boolean {\n if (!input.shouldStartAfterLifecycle) {\n return true;\n }\n return !hasTerminalRuntimeBundleMismatch(input.inventory);\n}\n\nfunction hasTerminalRuntimeBundleMismatch(\n inventory: DaemonServiceInventory\n): boolean {\n if (inventory.runtimeStatus.status !== \"running\") {\n return false;\n }\n if (inventory.runtimeCommandPathExists !== true) {\n return false;\n }\n if (!(inventory.runtimeCommandEntryPath && inventory.activeBundleEntryPath)) {\n return false;\n }\n return (\n normalizeDaemonCommandPath(inventory.runtimeCommandEntryPath) !==\n normalizeDaemonCommandPath(inventory.activeBundleEntryPath)\n );\n}\n\nfunction resolveLifecycleFailureStage(\n error: unknown,\n fallback: DaemonServiceFailureStage | null\n): DaemonServiceFailureStage | null {\n if (error instanceof DaemonServiceLifecycleStageError) {\n return error.stage;\n }\n if (error instanceof DaemonServiceLifecycleDrainTimeoutError) {\n return \"stop_or_drain\";\n }\n return fallback;\n}\n\nfunction resolveLifecycleFailureReasonCodes(\n error: unknown\n): DaemonServiceLifecycleReasonCode[] {\n if (error instanceof DaemonServiceLifecycleStageError) {\n return error.reasonCodes;\n }\n return [];\n}\n\nfunction resolveLifecycleFailureErrorCode(error: unknown): string | null {\n const visited = new Set<unknown>();\n let current = error;\n while (current && !visited.has(current)) {\n visited.add(current);\n if (current instanceof LocalDaemonControlPlaneClientError) {\n return current.code;\n }\n if (current instanceof Error && current.cause) {\n current = current.cause;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n\nasync function stopDaemonProcess(\n pid: number,\n signal: NodeJS.Signals\n): Promise<boolean> {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if (\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ) {\n return true;\n }\n throw new Error(\n `Failed to send ${signal} to pid ${String(pid)}: ${toErrorMessage(error)}`\n );\n }\n if (signal === \"SIGKILL\") {\n return true;\n }\n return await waitForProcessToExit(pid, PROCESS_STOP_WAIT_MS);\n}\n\nasync function stopDaemonProcessWithTimeout(\n pid: number,\n signal: NodeJS.Signals,\n timeoutMs: number\n): Promise<boolean> {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if (\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n ) {\n return true;\n }\n throw new Error(\n `Failed to send ${signal} to pid ${String(pid)}: ${toErrorMessage(error)}`\n );\n }\n return await waitForProcessToExit(pid, timeoutMs);\n}\n\nasync function waitForProcessToExit(\n pid: number,\n timeoutMs: number\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) {\n return true;\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n return !isPidAlive(pid);\n}\n\nasync function writeLifecycleEvidenceEvent(input: {\n evidencePath: string | null;\n completedPhases: readonly DaemonServiceLifecyclePhase[];\n failureStage: DaemonServiceFailureStage | null;\n}): Promise<void> {\n if (!input.evidencePath) {\n return;\n }\n const { writeFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n await writeFile(\n join(input.evidencePath, \"lifecycle.json\"),\n `${JSON.stringify(\n {\n schema: \"openmeld-daemon-service-lifecycle-v1\",\n completedPhases: input.completedPhases,\n failureStage: input.failureStage,\n updatedAt: new Date().toISOString(),\n },\n null,\n 2\n )}\\n`,\n \"utf8\"\n ).catch(() => undefined);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { OpenMeldToolsUpdateRequestSource } from \"@openmeld/schemas/types\";\nimport { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport { hasPendingComputerSetupContinuation } from \"../../config/auth-session\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { hasIndependentMaintenanceRegistration } from \"../../config/daemon-service-update-worker-registration\";\nimport { withDaemonServiceReconcileLock } from \"../../config/daemon-state\";\nimport {\n type CliBinaryReleaseInfo,\n compareSemver,\n} from \"../../config/version-state\";\nimport { withManagedInstallTransaction } from \"../../local-components/managed-install\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonServiceUpdateReadiness,\n} from \"../control-plane/client\";\nimport type { DaemonActiveBundleState } from \"./daemon-service-bundle\";\nimport { prepareDaemonServiceBundle } from \"./daemon-service-bundle\";\nimport type {\n DaemonServiceLifecycleOutcome,\n DaemonServiceLifecycleRecoveryStatus,\n} from \"./daemon-service-lifecycle\";\nimport { runDaemonServiceLifecycle } from \"./daemon-service-lifecycle\";\nimport { assertDaemonMaintenanceInstallationOwnership } from \"./daemon-service-manager-command-match\";\nimport { readCurrentObservedDaemonRuntimeStatus } from \"./daemon-service-runtime\";\nimport {\n completePendingDaemonServiceUpdate,\n DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n type DaemonServiceUpdateJob,\n persistPendingDaemonServiceUpdate,\n readPendingDaemonServiceUpdate,\n} from \"./daemon-service-update-state\";\nimport {\n installDaemonServiceUpdateWorker,\n prepareDaemonServiceUpdateWorkerCarrier,\n pruneDaemonServiceUpdateWorkerManagedVersions,\n registerDaemonServiceUpdateWorker,\n startDaemonServiceUpdateWorker,\n} from \"./daemon-service-update-worker-manager\";\n\nconst MAX_BACKGROUND_UPDATE_ATTEMPTS = 5;\n\ntype DaemonServiceUpdateReconcileLock = <T>(\n run: () => Promise<T>\n) => Promise<T>;\n\ntype ManagedInstallTransaction = <T>(run: () => Promise<T>) => Promise<T>;\n\ntype ScheduleDaemonServiceUpdateInput = {\n binaryRelease?: CliBinaryReleaseInfo;\n cliScriptPath?: string;\n operationId?: string;\n requestedAt?: string;\n requestSource?: OpenMeldToolsUpdateRequestSource;\n targetCliVersion?: string;\n targetServiceVersion?: string;\n targetVersion: string;\n urgency: \"available\" | \"required\";\n};\n\ntype ScheduleDaemonServiceUpdateDependencies = {\n createJobId: () => string;\n installWorker: (job: DaemonServiceUpdateJob) => Promise<void>;\n now: () => string;\n persistPendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n prepareBundle: (input: {\n activate: false;\n daemonVersion: string;\n cliScriptPath?: string;\n binaryRelease?: CliBinaryReleaseInfo;\n }) => Promise<DaemonActiveBundleState>;\n prepareWorkerCarrier: (job: DaemonServiceUpdateJob) => Promise<void>;\n pruneWorkerVersions: (job: DaemonServiceUpdateJob) => Promise<void>;\n readPendingJob: () => Promise<DaemonServiceUpdateJob | null>;\n resolveDesiredState: () => Promise<\"background\" | \"stopped\">;\n startWorker: (job: DaemonServiceUpdateJob) => Promise<void>;\n withReconcileLock: DaemonServiceUpdateReconcileLock;\n withManagedInstallTransaction: ManagedInstallTransaction;\n};\n\ntype RunPendingDaemonServiceUpdateDependencies = {\n completePendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n now: () => string;\n persistPendingJob: (job: DaemonServiceUpdateJob) => Promise<void>;\n readPendingJob: () => Promise<DaemonServiceUpdateJob | null>;\n runLifecycle: (input: {\n expectedVersion: string;\n operation: \"upgrade_reconcile\";\n installSource: \"cli.auto_check\";\n desiredState: \"background\" | \"stopped\";\n shouldStartAfterLifecycle: boolean;\n forceReinstall: true;\n forceKillAfterDrainTimeout: false;\n preparedBundle: DaemonActiveBundleState;\n }) => Promise<\n Pick<DaemonServiceLifecycleOutcome, \"errorMessage\" | \"status\"> & {\n recoveryStatus?: DaemonServiceLifecycleRecoveryStatus;\n }\n >;\n waitUntilSafeToSwitch: (job: DaemonServiceUpdateJob) => Promise<void>;\n withReconcileLock: DaemonServiceUpdateReconcileLock;\n};\n\nexport type ScheduleDaemonServiceUpdateResult = {\n job: DaemonServiceUpdateJob;\n status: \"scheduled\" | \"already_scheduled\";\n};\n\nexport async function scheduleDaemonServiceUpdate(\n input: ScheduleDaemonServiceUpdateInput,\n overrides: Partial<ScheduleDaemonServiceUpdateDependencies> = {}\n): Promise<ScheduleDaemonServiceUpdateResult> {\n const deps = resolveScheduleDependencies(overrides, {\n useDefaultLock: Object.keys(overrides).length === 0,\n });\n return await deps.withReconcileLock(\n async () => await scheduleDaemonServiceUpdateLocked(input, deps)\n );\n}\n\nasync function scheduleDaemonServiceUpdateLocked(\n input: ScheduleDaemonServiceUpdateInput,\n deps: ScheduleDaemonServiceUpdateDependencies\n): Promise<ScheduleDaemonServiceUpdateResult> {\n const pending = await deps.readPendingJob();\n if (pending) {\n return await reschedulePendingDaemonServiceUpdate({\n dependencies: deps,\n pending,\n request: input,\n });\n }\n\n const preparedBundle = await deps.prepareBundle({\n activate: false,\n daemonVersion: input.targetVersion,\n ...(input.binaryRelease ? { binaryRelease: input.binaryRelease } : {}),\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n const now = deps.now();\n const job: DaemonServiceUpdateJob = {\n v: 2,\n schema: DAEMON_SERVICE_UPDATE_JOB_SCHEMA,\n attempts: 0,\n desiredState: await deps.resolveDesiredState(),\n errorMessage: null,\n jobId: input.operationId ?? deps.createJobId(),\n preparedBundle,\n requestedAt: input.requestedAt ?? now,\n phase: \"waiting_for_work\",\n requestSource: input.requestSource ?? \"cli\",\n ...(input.targetCliVersion\n ? { targetCliVersion: input.targetCliVersion }\n : {}),\n ...(input.targetServiceVersion\n ? { targetServiceVersion: input.targetServiceVersion }\n : {}),\n targetVersion: input.targetVersion,\n updatedAt: now,\n urgency: input.urgency,\n };\n\n // Register the OS-owned worker before publishing the pending job. After the\n // atomic write, the initiating Terminal or browser is no longer responsible\n // for completing the update.\n await deps.withManagedInstallTransaction(async () => {\n await deps.prepareWorkerCarrier(job);\n await deps.installWorker(job);\n await deps.persistPendingJob(job);\n });\n await deps.startWorker(job);\n await pruneWorkerVersionsBestEffort({ dependencies: deps, job });\n return { job, status: \"scheduled\" };\n}\n\nasync function reschedulePendingDaemonServiceUpdate(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n pending: DaemonServiceUpdateJob;\n request: ScheduleDaemonServiceUpdateInput;\n}): Promise<ScheduleDaemonServiceUpdateResult> {\n const replaceTarget =\n isNewerTargetVersion(\n input.request.targetVersion,\n input.pending.targetVersion\n ) && input.pending.phase !== \"updated\";\n const escalateUrgency =\n input.pending.phase !== \"updated\" &&\n input.request.urgency === \"required\" &&\n input.pending.urgency === \"available\";\n const retained: DaemonServiceUpdateJob =\n replaceTarget || escalateUrgency\n ? {\n ...input.pending,\n ...(replaceTarget ? await prepareReplacementJobFields(input) : {}),\n updatedAt: input.dependencies.now(),\n urgency: escalateUrgency ? \"required\" : input.pending.urgency,\n }\n : input.pending;\n if (retained !== input.pending) {\n await input.dependencies.withManagedInstallTransaction(async () => {\n await input.dependencies.prepareWorkerCarrier(retained);\n await input.dependencies.persistPendingJob(retained);\n });\n }\n // A pending job proves the OS worker is already registered. Keep that\n // recovery carrier untouched until replacement state is durable, then wake\n // the existing worker against the same stable job path.\n await input.dependencies.startWorker(retained);\n if (retained !== input.pending) {\n await pruneWorkerVersionsBestEffort({\n dependencies: input.dependencies,\n job: retained,\n });\n }\n return { job: retained, status: \"already_scheduled\" };\n}\n\nasync function prepareReplacementJobFields(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n request: ScheduleDaemonServiceUpdateInput;\n}): Promise<Partial<DaemonServiceUpdateJob>> {\n return {\n attempts: 0,\n errorMessage: null,\n phase: \"waiting_for_work\",\n preparedBundle: await input.dependencies.prepareBundle({\n activate: false,\n daemonVersion: input.request.targetVersion,\n ...(input.request.binaryRelease\n ? { binaryRelease: input.request.binaryRelease }\n : {}),\n ...(input.request.cliScriptPath\n ? { cliScriptPath: input.request.cliScriptPath }\n : {}),\n }),\n requestSource: input.request.requestSource ?? \"cli\",\n ...(input.request.targetCliVersion\n ? { targetCliVersion: input.request.targetCliVersion }\n : {}),\n ...(input.request.targetServiceVersion\n ? { targetServiceVersion: input.request.targetServiceVersion }\n : {}),\n targetVersion: input.request.targetVersion,\n };\n}\n\nasync function pruneWorkerVersionsBestEffort(input: {\n dependencies: ScheduleDaemonServiceUpdateDependencies;\n job: DaemonServiceUpdateJob;\n}): Promise<void> {\n await input.dependencies.pruneWorkerVersions(input.job).catch((error) => {\n console.warn(\"[openmeld.daemon_service.update_worker_prune_failed]\", {\n errorMessage: toErrorMessage(error),\n operationId: input.job.jobId,\n targetVersion: input.job.targetVersion,\n });\n });\n}\n\nexport async function runPendingDaemonServiceUpdate(\n overrides: Partial<RunPendingDaemonServiceUpdateDependencies> = {}\n): Promise<DaemonServiceUpdateJob | null> {\n const deps = resolveRunDependencies(overrides, {\n useDefaultLock: Object.keys(overrides).length === 0,\n });\n const pending = await deps.withReconcileLock(\n async () => await preparePendingUpdateForSwitch(deps)\n );\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n if (pending.urgency === \"available\") {\n try {\n await deps.waitUntilSafeToSwitch(pending);\n } catch (waitError) {\n try {\n await deps.withReconcileLock(\n async () =>\n await recordSafeSwitchWaitFailure(deps, pending, waitError)\n );\n } catch (recordError) {\n throw new AggregateError(\n [waitError, recordError],\n \"OpenMeld could not safely switch the Service or record the failure.\"\n );\n }\n throw waitError;\n }\n }\n return await deps.withReconcileLock(\n async () => await runPreparedPendingUpdate(deps)\n );\n}\n\nasync function preparePendingUpdateForSwitch(\n deps: RunPendingDaemonServiceUpdateDependencies\n): Promise<DaemonServiceUpdateJob | null> {\n const pending = await deps.readPendingJob();\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n if (pending.urgency === \"available\") {\n const waiting: DaemonServiceUpdateJob = {\n ...pending,\n errorMessage: null,\n phase: \"waiting_for_work\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(waiting);\n return waiting;\n }\n return pending;\n}\n\nasync function recordSafeSwitchWaitFailure(\n deps: RunPendingDaemonServiceUpdateDependencies,\n waiting: DaemonServiceUpdateJob,\n error: unknown\n): Promise<void> {\n const current = await deps.readPendingJob();\n if (!(current && isSameWaitingUpdate(current, waiting))) {\n return;\n }\n await deps.persistPendingJob({\n ...current,\n errorMessage: toErrorMessage(error),\n updatedAt: deps.now(),\n });\n}\n\nfunction isSameWaitingUpdate(\n current: DaemonServiceUpdateJob,\n waiting: DaemonServiceUpdateJob\n): boolean {\n return (\n current.jobId === waiting.jobId &&\n current.targetVersion === waiting.targetVersion &&\n current.preparedBundle.bundleId === waiting.preparedBundle.bundleId &&\n current.urgency === waiting.urgency &&\n current.phase === \"waiting_for_work\" &&\n current.attempts === waiting.attempts\n );\n}\n\nasync function runPreparedPendingUpdate(\n deps: RunPendingDaemonServiceUpdateDependencies\n): Promise<DaemonServiceUpdateJob | null> {\n const pending = await deps.readPendingJob();\n if (!pending) {\n return null;\n }\n if (pending.phase === \"updated\") {\n return pending;\n }\n\n const running: DaemonServiceUpdateJob = {\n ...pending,\n attempts: pending.attempts + 1,\n errorMessage: null,\n phase: \"updating\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(running);\n\n try {\n const lifecycle = await deps.runLifecycle({\n desiredState: running.desiredState,\n expectedVersion: running.targetVersion,\n forceKillAfterDrainTimeout: false,\n forceReinstall: true,\n installSource: \"cli.auto_check\",\n operation: \"upgrade_reconcile\",\n preparedBundle: running.preparedBundle,\n shouldStartAfterLifecycle: running.desiredState === \"background\",\n });\n if (\n lifecycle.status !== \"aligned\" &&\n lifecycle.status !== \"already_aligned\"\n ) {\n const failed = finishJob(running, {\n errorMessage:\n lifecycle.errorMessage ||\n \"OpenMeld restored the previous Service after the replacement did not become healthy.\",\n now: deps.now(),\n phase:\n lifecycle.recoveryStatus === \"restored_verified_previous_state\"\n ? \"restored\"\n : \"needs_help\",\n });\n await deps.completePendingJob(failed);\n return failed;\n }\n\n const completed = finishJob(running, {\n errorMessage: null,\n now: deps.now(),\n phase: \"updated\",\n });\n await deps.completePendingJob(completed);\n return completed;\n } catch (error) {\n const errorMessage = toErrorMessage(error);\n if (running.attempts < MAX_BACKGROUND_UPDATE_ATTEMPTS) {\n const retry: DaemonServiceUpdateJob = {\n ...running,\n errorMessage,\n phase: \"waiting_for_work\",\n updatedAt: deps.now(),\n };\n await deps.persistPendingJob(retry);\n throw error;\n }\n const failed = finishJob(running, {\n errorMessage,\n now: deps.now(),\n phase: \"needs_help\",\n });\n await deps.completePendingJob(failed);\n return failed;\n }\n}\n\nfunction resolveWorkerInstallation(useDefaultLock: boolean) {\n const noOperation = async () => undefined;\n if (!useDefaultLock) {\n return { install: installDaemonServiceUpdateWorker, prepare: noOperation };\n }\n if (process.env.OPENMELD_INTERNAL_MAINTENANCE_WORKER === \"1\") {\n // A maintenance child must not boot out its own OS-owned parent before\n // publishing the job. That worker already owns this update operation.\n return {\n install: async (job: DaemonServiceUpdateJob) => {\n if (!(await hasIndependentMaintenanceRegistration())) {\n await registerDaemonServiceUpdateWorker(job);\n }\n },\n prepare: async (job: DaemonServiceUpdateJob) => {\n if (!(await hasIndependentMaintenanceRegistration())) {\n await prepareDaemonServiceUpdateWorkerCarrier(job);\n }\n },\n };\n }\n return {\n // No Service update has been published yet. Refresh the executor from the\n // verified CLI artifact before accepting work that relies on its contract.\n // A pre-existing definition is not proof that its process runs this code.\n install: registerDaemonServiceUpdateWorker,\n prepare: prepareDaemonServiceUpdateWorkerCarrier,\n };\n}\n\nfunction resolveScheduleDependencies(\n overrides: Partial<ScheduleDaemonServiceUpdateDependencies>,\n options: { useDefaultLock: boolean }\n): ScheduleDaemonServiceUpdateDependencies {\n const workerInstall = resolveWorkerInstallation(options.useDefaultLock);\n return {\n createJobId: overrides.createJobId ?? randomUUID,\n installWorker: overrides.installWorker ?? workerInstall.install,\n now: overrides.now ?? (() => new Date().toISOString()),\n persistPendingJob:\n overrides.persistPendingJob ?? persistPendingDaemonServiceUpdate,\n prepareBundle: overrides.prepareBundle ?? prepareDaemonServiceBundle,\n prepareWorkerCarrier:\n overrides.prepareWorkerCarrier ?? workerInstall.prepare,\n pruneWorkerVersions:\n overrides.pruneWorkerVersions ??\n pruneDaemonServiceUpdateWorkerManagedVersions,\n readPendingJob: overrides.readPendingJob ?? readPendingDaemonServiceUpdate,\n resolveDesiredState:\n overrides.resolveDesiredState ?? resolveCurrentDaemonDesiredState,\n startWorker: overrides.startWorker ?? startDaemonServiceUpdateWorker,\n withReconcileLock:\n overrides.withReconcileLock ??\n (options.useDefaultLock\n ? withDaemonServiceUpdateScheduleLock\n : runWithoutReconcileLock),\n withManagedInstallTransaction:\n overrides.withManagedInstallTransaction ??\n (options.useDefaultLock\n ? withManagedInstallTransaction\n : runWithoutReconcileLock),\n };\n}\n\nfunction resolveRunDependencies(\n overrides: Partial<RunPendingDaemonServiceUpdateDependencies>,\n options: { useDefaultLock: boolean }\n): RunPendingDaemonServiceUpdateDependencies {\n return {\n completePendingJob:\n overrides.completePendingJob ??\n (async (job) =>\n await completePendingDaemonServiceUpdate(\n job,\n {},\n job.phase === \"updated\" &&\n (await hasPendingComputerSetupContinuation())\n )),\n now: overrides.now ?? (() => new Date().toISOString()),\n persistPendingJob:\n overrides.persistPendingJob ?? persistPendingDaemonServiceUpdate,\n readPendingJob: overrides.readPendingJob ?? readPendingDaemonServiceUpdate,\n runLifecycle:\n overrides.runLifecycle ??\n (async (input) => {\n // Recheck under the lifecycle lock: another setup may have claimed the\n // lane while this worker was downloading or waiting for active work.\n await assertDaemonMaintenanceInstallationOwnership();\n return await runDaemonServiceLifecycle(input);\n }),\n waitUntilSafeToSwitch:\n overrides.waitUntilSafeToSwitch ?? waitUntilDaemonServiceSafeSwitch,\n withReconcileLock:\n overrides.withReconcileLock ??\n (options.useDefaultLock\n ? withDaemonServiceUpdateWorkerLock\n : runWithoutReconcileLock),\n };\n}\n\nasync function withDaemonServiceUpdateScheduleLock<T>(\n run: () => Promise<T>\n): Promise<T> {\n return await withDaemonServiceReconcileLock(run, {\n command: \"openmeld service update\",\n intent: \"upgrade_reconcile\",\n });\n}\n\nasync function withDaemonServiceUpdateWorkerLock<T>(\n run: () => Promise<T>\n): Promise<T> {\n return await withDaemonServiceReconcileLock(run, {\n command: \"openmeld service update-worker\",\n intent: \"upgrade_reconcile\",\n });\n}\n\nasync function runWithoutReconcileLock<T>(run: () => Promise<T>): Promise<T> {\n return await run();\n}\n\nexport async function waitUntilDaemonServiceSafeSwitch(\n job: DaemonServiceUpdateJob,\n overrides: {\n readPendingJob?: () => Promise<DaemonServiceUpdateJob | null>;\n requestReadiness?: typeof requestLocalDaemonServiceUpdateReadiness;\n sleep?: typeof sleep;\n } = {}\n): Promise<void> {\n const readPendingJob =\n overrides.readPendingJob ?? readPendingDaemonServiceUpdate;\n const requestReadiness =\n overrides.requestReadiness ?? requestLocalDaemonServiceUpdateReadiness;\n const wait = overrides.sleep ?? sleep;\n while (true) {\n const pending = await readPendingJob();\n if (\n pending === null ||\n pending.jobId !== job.jobId ||\n pending.urgency === \"required\"\n ) {\n return;\n }\n try {\n const readiness = await requestReadiness();\n if (readiness.safeToSwitch) {\n return;\n }\n } catch (error) {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n (error.code === \"daemon.control.contract_mismatch\" ||\n error.code === \"daemon.control.endpoint_missing\")\n ) {\n // A stopped Service cannot answer readiness. Delegate to the lifecycle\n // owner, which verifies absence or performs controlled drain under its\n // lock. This is not permission to kill an unresponsive live Service or\n // discard accepted work and durable replies. The same boundary handles\n // older Services that predate the readiness command.\n return;\n }\n // A missing process or unreadable runtime projection does not prove that\n // accepted work and its durable result acknowledgement are complete.\n // Keep this available update pending until the Service supplies the\n // positive readiness fact or the durable job changes.\n }\n await wait(2000);\n }\n}\n\nasync function resolveCurrentDaemonDesiredState(): Promise<\n \"background\" | \"stopped\"\n> {\n const contract = await readDaemonServiceContract().catch(() => null);\n if (contract) {\n return contract.desiredState;\n }\n const runtime = await readCurrentObservedDaemonRuntimeStatus();\n return runtime.status === \"running\" && runtime.mode === \"background\"\n ? \"background\"\n : \"stopped\";\n}\n\nfunction finishJob(\n job: DaemonServiceUpdateJob,\n input: {\n errorMessage: string | null;\n now: string;\n phase: \"updated\" | \"restored\" | \"needs_help\";\n }\n): DaemonServiceUpdateJob {\n return {\n ...job,\n errorMessage: input.errorMessage,\n phase: input.phase,\n updatedAt: input.now,\n };\n}\n\nfunction isNewerTargetVersion(candidate: string, current: string): boolean {\n return compareSemver(candidate, current) > 0;\n}\n"],"mappings":"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CX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAEH,MAAa,qDACX,IAAI,IAA8B;CAChC;CACA;CACA;AACF,CAAC;AAEH,MAAa,kDACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAwBH,MAAa,wDACX,IAAI,IAA8B;CAChC,GAAG,CAAC,mBAAG,IAvBL,IAA8B;EAChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAIS,CAAuC,CAAC,CAAC,QAC7C,SACC,SAAS,mBACT,SAAS,sBACT,SAAS,sBACb;CACA;CACA;AACF,CAAC;AAEH,MAAa,oEACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;AACF,CAAC;AAEH,MAAa,mEACX,IAAI,IAA8B,CAAC,kBAAkB,qBAAqB,CAAC;AAE7E,MAAa,gEACX,IAAI,IAA8B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAeH,SAAgB,iCAAiC,OAEN;CACzC,MAAM,eAAe,0BAA0B,MAAM,SAAS;CAC9D,MAAM,wBAAwB,0CAA0C;EACtE;EACA,WAAW,MAAM;CACnB,CAAC;CACD,MAAM,gBAA4C,CAAC;CACnD,MAAM,gBAA4C,CAAC;CACnD,MAAM,mBAA+C,CAAC;CAEtD,KAAK,MAAM,QAAQ,cAAc;EAC/B,IAAI,kDAAkD,IAAI,IAAI,GAAG;GAC/D,cAAc,KAAK,IAAI;GACvB;EACF;EAEA,IAAI,iDAAiD,IAAI,IAAI,GAAG;GAC9D,iBAAiB,KAAK,IAAI;GAC1B,IACE,yCAAyC;IACvC;IACA;GACF,CAAC,GAED,cAAc,KAAK,IAAI;QAEvB,cAAc,KAAK,IAAI;GAEzB;EACF;EAEA,IAAI,8CAA8C,IAA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"}
|