openmeld 0.3.222 → 0.3.224

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/{add-me-membership-Wc69O6rA.js → add-me-membership-CGISMRPF.js} +2 -2
  2. package/dist/{add-me-membership-Wc69O6rA.js.map → add-me-membership-CGISMRPF.js.map} +1 -1
  3. package/dist/{agents-B8zhQnGw.js → agents-CR7BebgO.js} +12 -12
  4. package/dist/{agents-B8zhQnGw.js.map → agents-CR7BebgO.js.map} +1 -1
  5. package/dist/{api-client-foundation-DTiFoGpI.js → api-client-foundation-CqbIn_de.js} +1 -1
  6. package/dist/{api-client-foundation-DnJ_JYli.js → api-client-foundation-DpVwrgh-.js} +3 -3
  7. package/dist/{api-client-foundation-DnJ_JYli.js.map → api-client-foundation-DpVwrgh-.js.map} +1 -1
  8. package/dist/auth-session-BJfKu74u.js +4 -0
  9. package/dist/{auth-session-nhS8jyux.js → auth-session-uEk_Tx6T.js} +8 -8
  10. package/dist/auth-session-uEk_Tx6T.js.map +1 -0
  11. package/dist/{base-url-CMBApK1J.js → base-url-DXrUiSMI.js} +1 -1
  12. package/dist/{base-url-D7uE_xTo.js → base-url-DvjOkKPs.js} +2 -2
  13. package/dist/{base-url-D7uE_xTo.js.map → base-url-DvjOkKPs.js.map} +1 -1
  14. package/dist/{channel-ggx0o_aG.js → channel-B2fD2_be.js} +4 -4
  15. package/dist/{channel-ggx0o_aG.js.map → channel-B2fD2_be.js.map} +1 -1
  16. package/dist/{cli-binary-manifest-DiUulkp0.js → cli-binary-manifest-CT5X05lk.js} +30 -4
  17. package/dist/cli-binary-manifest-CT5X05lk.js.map +1 -0
  18. package/dist/{command-Bz9x7V2T.js → command-CQ9XRwqf.js} +22 -165
  19. package/dist/command-CQ9XRwqf.js.map +1 -0
  20. package/dist/{computer-connection-M3N6plkj.js → computer-connection-Dm7iTnRK.js} +2 -2
  21. package/dist/{computer-connection-M3N6plkj.js.map → computer-connection-Dm7iTnRK.js.map} +1 -1
  22. package/dist/{computer-connection-review-DY5BK_27.js → computer-connection-review-RHAoddSS.js} +6 -6
  23. package/dist/{computer-connection-review-DY5BK_27.js.map → computer-connection-review-RHAoddSS.js.map} +1 -1
  24. package/dist/{computer-disconnect-DR1WDSPK.js → computer-disconnect-BWRsge_2.js} +10 -10
  25. package/dist/{computer-disconnect-DR1WDSPK.js.map → computer-disconnect-BWRsge_2.js.map} +1 -1
  26. package/dist/{computer-setup-continuation-2gs8z-nB.js → computer-setup-continuation-BOCRH0qq.js} +4 -4
  27. package/dist/{computer-setup-continuation-2gs8z-nB.js.map → computer-setup-continuation-BOCRH0qq.js.map} +1 -1
  28. package/dist/context-Bdh3nAzw.js +162 -0
  29. package/dist/context-Bdh3nAzw.js.map +1 -0
  30. package/dist/{control-plane-e3W6PD2M.js → control-plane-rTE2rHZ5.js} +2 -2
  31. package/dist/{control-plane-e3W6PD2M.js.map → control-plane-rTE2rHZ5.js.map} +1 -1
  32. package/dist/{daemon-device-id-DWO9_QW6.js → daemon-device-id-B1Af2Zmn.js} +344 -36
  33. package/dist/daemon-device-id-B1Af2Zmn.js.map +1 -0
  34. package/dist/{daemon-frame-transport-D2-tazuK.js → daemon-frame-transport-WiB73yhT.js} +519 -12
  35. package/dist/daemon-frame-transport-WiB73yhT.js.map +1 -0
  36. package/dist/{daemon-lifecycle-journal-DyKx1xzm.js → daemon-lifecycle-journal-CDZLWgMj.js} +11 -11
  37. package/dist/daemon-lifecycle-journal-CDZLWgMj.js.map +1 -0
  38. package/dist/{daemon-runtime-lease-BUr4qsLo.js → daemon-runtime-lease-1LMeZ6IS.js} +2 -2
  39. package/dist/{daemon-runtime-lease-BUr4qsLo.js.map → daemon-runtime-lease-1LMeZ6IS.js.map} +1 -1
  40. package/dist/{daemon-runtime-lease-C9X8xV_F.js → daemon-runtime-lease-Bz0ucJj3.js} +1 -1
  41. package/dist/{daemon-service-contract-BpOBMGX0.js → daemon-service-contract-GLmAxsq-.js} +4 -4
  42. package/dist/{daemon-service-contract-BpOBMGX0.js.map → daemon-service-contract-GLmAxsq-.js.map} +1 -1
  43. package/dist/{daemon-service-manager-HL4VKbIU.js → daemon-service-manager-C8RUCMDo.js} +9 -7
  44. package/dist/daemon-service-manager-C8RUCMDo.js.map +1 -0
  45. package/dist/{daemon-service-manager-B-QrDe5p.js → daemon-service-manager-CU-79a4z.js} +1 -1
  46. package/dist/{daemon-service-runtime-bKt0YjC7.js → daemon-service-runtime-CBJtgM4P.js} +397 -51
  47. package/dist/daemon-service-runtime-CBJtgM4P.js.map +1 -0
  48. package/dist/{daemon-service-update-coordinator-D8O1uTtu.js → daemon-service-update-coordinator-0LB_XGVZ.js} +48 -33
  49. package/dist/daemon-service-update-coordinator-0LB_XGVZ.js.map +1 -0
  50. package/dist/{daemon-state-B44aq2nm.js → daemon-state-Ca0WK5x0.js} +3 -3
  51. package/dist/{daemon-state-B44aq2nm.js.map → daemon-state-Ca0WK5x0.js.map} +1 -1
  52. package/dist/{dist-B07ziN_u.js → dist-BeJcIdCZ.js} +25 -17
  53. package/dist/dist-BeJcIdCZ.js.map +1 -0
  54. package/dist/dist-C32frPV2.js +4 -0
  55. package/dist/{dist-B2EauBG6.js → dist-YbTZ-Y-2.js} +16 -12
  56. package/dist/dist-YbTZ-Y-2.js.map +1 -0
  57. package/dist/{elapsed-time-Ooo4IC25.js → elapsed-time-q8lSPcfm.js} +6 -6
  58. package/dist/{elapsed-time-Ooo4IC25.js.map → elapsed-time-q8lSPcfm.js.map} +1 -1
  59. package/dist/{entry-DeIRMCiW.js → entry-CpS6tnIk.js} +12 -12
  60. package/dist/{entry-DeIRMCiW.js.map → entry-CpS6tnIk.js.map} +1 -1
  61. package/dist/{installation-inventory-DThnBEhV.js → installation-inventory-C5FsAvrf.js} +5 -5
  62. package/dist/{installation-inventory-DThnBEhV.js.map → installation-inventory-C5FsAvrf.js.map} +1 -1
  63. package/dist/{installer-D2bWZT88.js → installer-054NLJg6.js} +2 -2
  64. package/dist/{installer-D2bWZT88.js.map → installer-054NLJg6.js.map} +1 -1
  65. package/dist/io-DT66typ4.js +16 -0
  66. package/dist/io-DT66typ4.js.map +1 -0
  67. package/dist/{local-components-B6SCXZf9.js → local-components-DleLEzSU.js} +2 -1
  68. package/dist/local-components-DleLEzSU.js.map +1 -0
  69. package/dist/{lock-Bsl_ElWy.js → lock-iue1J2xy.js} +8 -5
  70. package/dist/lock-iue1J2xy.js.map +1 -0
  71. package/dist/{cli-space-api-CQtKu9Zt.js → meta-api-B1k3mwHN.js} +203 -19
  72. package/dist/meta-api-B1k3mwHN.js.map +1 -0
  73. package/dist/{openmeld-BQy0nMox.js → openmeld-BFO3sfC_.js} +93 -1027
  74. package/dist/openmeld-BFO3sfC_.js.map +1 -0
  75. package/dist/openmeld-dev.js +1 -1
  76. package/dist/{openmeld-environment-target-B6HqY0_a.js → openmeld-environment-target-BBn5Ko6p.js} +3 -3
  77. package/dist/{openmeld-environment-target-B6HqY0_a.js.map → openmeld-environment-target-BBn5Ko6p.js.map} +1 -1
  78. package/dist/{openmeld-maintenance-worker-BSODPHbn.js → openmeld-maintenance-worker-Ce4ehQ-c.js} +15 -14
  79. package/dist/openmeld-maintenance-worker-Ce4ehQ-c.js.map +1 -0
  80. package/dist/{openmeld-tools-update-join-BfY0GnDs.js → openmeld-tools-update-join-D24llJ9L.js} +4 -4
  81. package/dist/{openmeld-tools-update-join-BfY0GnDs.js.map → openmeld-tools-update-join-D24llJ9L.js.map} +1 -1
  82. package/dist/{openmeld-tools-update-process-frame-B-XB4dmO.js → openmeld-tools-update-process-frame-BtFKp70p.js} +2 -2
  83. package/dist/{openmeld-tools-update-process-frame-B-XB4dmO.js.map → openmeld-tools-update-process-frame-BtFKp70p.js.map} +1 -1
  84. package/dist/{openmeld-tools-update-process-frame-j-RXwFsK.js → openmeld-tools-update-process-frame-DbEZ3fEh.js} +1 -1
  85. package/dist/openmeld.js +9 -5
  86. package/dist/openmeld.js.map +1 -1
  87. package/dist/{prepare-provider-runtime-CWZcuMF6.js → prepare-provider-runtime-MB-BxOgt.js} +3342 -1327
  88. package/dist/prepare-provider-runtime-MB-BxOgt.js.map +1 -0
  89. package/dist/{prepare-session-executor-CkDxstsf.js → prepare-session-executor-zvSZ6jqy.js} +29 -28
  90. package/dist/prepare-session-executor-zvSZ6jqy.js.map +1 -0
  91. package/dist/{presenter-BcxiQyJg.js → presenter-MJ5YgsOT.js} +3 -13
  92. package/dist/presenter-MJ5YgsOT.js.map +1 -0
  93. package/dist/{process-channel-BQwtOlRc.js → process-channel-CgbduFCz.js} +2 -2
  94. package/dist/{process-channel-BQwtOlRc.js.map → process-channel-CgbduFCz.js.map} +1 -1
  95. package/dist/process-environment-BWSFeUu6.js +49 -0
  96. package/dist/process-environment-BWSFeUu6.js.map +1 -0
  97. package/dist/process-identity-BQLdaZdB.js +190 -0
  98. package/dist/process-identity-BQLdaZdB.js.map +1 -0
  99. package/dist/process-launch-B0pHlkV_.js +173 -0
  100. package/dist/process-launch-B0pHlkV_.js.map +1 -0
  101. package/dist/{published-production-safety-dp-fOmmB.js → published-production-safety-C40hKrBA.js} +2 -2
  102. package/dist/{published-production-safety-dp-fOmmB.js.map → published-production-safety-C40hKrBA.js.map} +1 -1
  103. package/dist/{runtime-BYaFkkLK.js → runtime-D6jItuQ-.js} +155 -702
  104. package/dist/runtime-D6jItuQ-.js.map +1 -0
  105. package/dist/{runtime-agent-controller-reporting-submission-BUUub9_1.js → runtime-agent-controller-reporting-submission-D9ysbi7R.js} +9 -9
  106. package/dist/{runtime-agent-controller-reporting-submission-BUUub9_1.js.map → runtime-agent-controller-reporting-submission-D9ysbi7R.js.map} +1 -1
  107. package/dist/{runtime-reporting-health-state-BgwfrH7f.js → runtime-reporting-health-state-DA-_vW-n.js} +2210 -60
  108. package/dist/runtime-reporting-health-state-DA-_vW-n.js.map +1 -0
  109. package/dist/{runtime-transport-Cc_RN-PL.js → runtime-transport-YIYHSJPn.js} +99 -14
  110. package/dist/runtime-transport-YIYHSJPn.js.map +1 -0
  111. package/dist/{service-CfO38_a-.js → service-Dz2MsvGr.js} +126 -550
  112. package/dist/service-Dz2MsvGr.js.map +1 -0
  113. package/dist/{service-account-admission-Dy2W3n3_.js → service-account-admission-BfdJ-kKR.js} +18 -10
  114. package/dist/service-account-admission-BfdJ-kKR.js.map +1 -0
  115. package/dist/{service-account-authorization-DKpIpxXo.js → service-account-authorization-DZbUOD29.js} +6 -6
  116. package/dist/{service-account-authorization-DKpIpxXo.js.map → service-account-authorization-DZbUOD29.js.map} +1 -1
  117. package/dist/{service-account-control-CCPQAZzn.js → service-account-control-DCMOKXDT.js} +16 -16
  118. package/dist/service-account-control-DCMOKXDT.js.map +1 -0
  119. package/dist/{service-control-capabilities-C9UHSMPz.js → service-control-capabilities-3_bdeHXu.js} +1 -1
  120. package/dist/{service-control-capabilities-xGylBNoH.js → service-control-capabilities-Bb738e_d.js} +19 -15
  121. package/dist/service-control-capabilities-Bb738e_d.js.map +1 -0
  122. package/dist/{service-control-carrier-capability-DDNyE5cB.js → service-control-carrier-capability-gMk5gMKU.js} +11 -4
  123. package/dist/service-control-carrier-capability-gMk5gMKU.js.map +1 -0
  124. package/dist/{state-CQG3k9eh.js → state-GxF_KAM1.js} +4 -4
  125. package/dist/{state-CQG3k9eh.js.map → state-GxF_KAM1.js.map} +1 -1
  126. package/dist/{upgrade-D5FxGbh1.js → upgrade-DfJwCD5H.js} +52 -32
  127. package/dist/upgrade-DfJwCD5H.js.map +1 -0
  128. package/dist/upgrade-DgmYWeNu.js +4 -0
  129. package/dist/windows/openmeld-windows-process.exe +0 -0
  130. package/dist/windows-artifact-DJ9DKjfc.js +16 -0
  131. package/dist/windows-artifact-DJ9DKjfc.js.map +1 -0
  132. package/dist/windows-task-command-COu_6Ke3.js +74 -0
  133. package/dist/windows-task-command-COu_6Ke3.js.map +1 -0
  134. package/dist/windows-task-entry-CtRpUbiK.js +50 -0
  135. package/dist/windows-task-entry-CtRpUbiK.js.map +1 -0
  136. package/dist/{windows-user-task-Bx2yYnOM.js → windows-user-task-B8NcRg_u.js} +1 -1
  137. package/dist/{windows-user-task-CRGbKggi.js → windows-user-task-Io5QuEVR.js} +108 -51
  138. package/dist/windows-user-task-Io5QuEVR.js.map +1 -0
  139. package/package.json +12 -12
  140. package/skills/openmeld-cli/playbooks/space-ops.md +9 -3
  141. package/skills/openmeld-cli/references/commands.md +0 -1
  142. package/dist/auth-session-D8dbMpaK.js +0 -4
  143. package/dist/auth-session-nhS8jyux.js.map +0 -1
  144. package/dist/cli-binary-manifest-DiUulkp0.js.map +0 -1
  145. package/dist/cli-space-api-CQtKu9Zt.js.map +0 -1
  146. package/dist/command-Bz9x7V2T.js.map +0 -1
  147. package/dist/context-l_31Mn4X.js +0 -473
  148. package/dist/context-l_31Mn4X.js.map +0 -1
  149. package/dist/daemon-device-id-DWO9_QW6.js.map +0 -1
  150. package/dist/daemon-frame-transport-D2-tazuK.js.map +0 -1
  151. package/dist/daemon-lifecycle-journal-DyKx1xzm.js.map +0 -1
  152. package/dist/daemon-service-manager-HL4VKbIU.js.map +0 -1
  153. package/dist/daemon-service-runtime-bKt0YjC7.js.map +0 -1
  154. package/dist/daemon-service-update-coordinator-D8O1uTtu.js.map +0 -1
  155. package/dist/dist-B07ziN_u.js.map +0 -1
  156. package/dist/dist-B2EauBG6.js.map +0 -1
  157. package/dist/dist-DhWI1iyi.js +0 -4
  158. package/dist/local-components-B6SCXZf9.js.map +0 -1
  159. package/dist/lock-Bsl_ElWy.js.map +0 -1
  160. package/dist/openmeld-BQy0nMox.js.map +0 -1
  161. package/dist/openmeld-maintenance-worker-BSODPHbn.js.map +0 -1
  162. package/dist/prepare-provider-runtime-CWZcuMF6.js.map +0 -1
  163. package/dist/prepare-session-executor-CkDxstsf.js.map +0 -1
  164. package/dist/presenter-BcxiQyJg.js.map +0 -1
  165. package/dist/process-identity-CNus0e6E.js +0 -146
  166. package/dist/process-identity-CNus0e6E.js.map +0 -1
  167. package/dist/runtime-BYaFkkLK.js.map +0 -1
  168. package/dist/runtime-reporting-health-state-BgwfrH7f.js.map +0 -1
  169. package/dist/runtime-transport-Cc_RN-PL.js.map +0 -1
  170. package/dist/service-CfO38_a-.js.map +0 -1
  171. package/dist/service-account-admission-Dy2W3n3_.js.map +0 -1
  172. package/dist/service-account-control-CCPQAZzn.js.map +0 -1
  173. package/dist/service-control-capabilities-xGylBNoH.js.map +0 -1
  174. package/dist/service-control-carrier-capability-DDNyE5cB.js.map +0 -1
  175. package/dist/upgrade-D5FxGbh1.js.map +0 -1
  176. package/dist/upgrade-DhFEu0k6.js +0 -4
  177. package/dist/windows-user-task-CRGbKggi.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-lifecycle-journal-DyKx1xzm.js","names":["packageJson"],"sources":["../src/local-service/control-plane/client.ts","../package.json","../src/config/version-state.ts","../src/runtime/version.ts","../src/local-service/lifecycle/daemon-lifecycle-journal.ts"],"sourcesContent":["import { createConnection } from \"node:net\";\nimport type {\n OpenMeldDaemonControlPlaneRequest,\n OpenMeldDaemonConversationExecutionStatusPayload,\n OpenMeldDaemonConversationExecutionStatusRequestPayload,\n OpenMeldDaemonRequestAgentActivitySyncPayload,\n OpenMeldDaemonRequestAgentActivitySyncRequestPayload,\n OpenMeldDaemonServiceUpdateReadinessPayload,\n OpenMeldDaemonSetLocalAgentEnabledPayload,\n OpenMeldDaemonSetLocalAgentEnabledRequestPayload,\n OpenMeldDaemonShutdownRequestPayload,\n OpenMeldDaemonSyncRouteCatalogPayload,\n OpenMeldDaemonSyncRouteCatalogRequestPayload,\n} from \"@openmeld/schemas\";\nimport {\n OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n openMeldDaemonControlPlaneResponseSchema,\n} from \"@openmeld/schemas\";\nimport type { OpenMeldDaemonControlPlaneResponse } from \"@openmeld/schemas/types\";\nimport {\n readDaemonControlPlaneToken,\n resolveDaemonControlPlaneEndpoint,\n} from \"../../config/daemon-state\";\n\nconst DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS = 5000;\n\nexport class LocalDaemonControlPlaneClientError extends Error {\n code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport async function sendLocalDaemonControlPlaneRequest(input: {\n endpoint?: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonControlPlaneResponse> {\n const endpoint = input.endpoint ?? resolveDaemonControlPlaneEndpoint();\n const authToken = await readDaemonControlPlaneToken();\n if (!authToken) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.auth_token_missing\",\n \"daemon control token is missing\"\n );\n }\n\n const request = {\n ...input.request,\n authToken,\n } satisfies OpenMeldDaemonControlPlaneRequest;\n\n const rawResponse = await writeControlPlaneRequest({\n endpoint,\n request,\n timeoutMs: input.timeoutMs ?? DEFAULT_LOCAL_DAEMON_CONTROL_PLANE_TIMEOUT_MS,\n });\n const parsed =\n openMeldDaemonControlPlaneResponseSchema.safeParse(rawResponse);\n if (!parsed.success) {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an invalid response\"\n );\n }\n if (parsed.data.code === \"service.error\") {\n throw new LocalDaemonControlPlaneClientError(\n parsed.data.payload.errorCode,\n parsed.data.payload.errorMessage\n );\n }\n return parsed.data;\n}\n\nexport async function requestLocalConversationExecutionStatus(input: {\n endpoint?: string;\n payload: OpenMeldDaemonConversationExecutionStatusRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonConversationExecutionStatusPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"conversation_execution_status\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.conversation_execution_status\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for conversation execution status\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSyncRouteCatalog(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSyncRouteCatalogRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSyncRouteCatalogPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"sync_route_catalog\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.sync_route_catalog\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for route catalog sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalAgentActivitySync(input: {\n endpoint?: string;\n payload: OpenMeldDaemonRequestAgentActivitySyncRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonRequestAgentActivitySyncPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"request_agent_activity_sync\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.agent_activity_sync_requested\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for Agent Activity sync\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalSetLocalAgentEnabled(input: {\n endpoint?: string;\n payload: OpenMeldDaemonSetLocalAgentEnabledRequestPayload;\n timeoutMs?: number;\n}): Promise<OpenMeldDaemonSetLocalAgentEnabledPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"set_local_agent_enabled\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.set_local_agent_enabled\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for local agent enablement\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonShutdown(input: {\n endpoint?: string;\n payload: OpenMeldDaemonShutdownRequestPayload;\n timeoutMs?: number;\n}): Promise<\n Extract<\n OpenMeldDaemonControlPlaneResponse,\n { code: \"service.shutdown\" }\n >[\"payload\"]\n> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"shutdown\",\n payload: input.payload,\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.shutdown\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for shutdown\"\n );\n }\n return response.payload;\n}\n\nexport async function requestLocalDaemonServiceUpdateReadiness(\n input: { endpoint?: string; timeoutMs?: number } = {}\n): Promise<OpenMeldDaemonServiceUpdateReadinessPayload> {\n let response: OpenMeldDaemonControlPlaneResponse;\n try {\n response = await sendLocalDaemonControlPlaneRequest({\n endpoint: input.endpoint,\n timeoutMs: input.timeoutMs,\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"service_update_readiness\",\n },\n });\n } catch (error) {\n throw rewriteDaemonControlPlaneContractMismatch(error);\n }\n if (response.code !== \"service.update_readiness\") {\n throw new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_response\",\n \"local daemon control returned an unexpected response for service update readiness\"\n );\n }\n return response.payload;\n}\n\nfunction rewriteDaemonControlPlaneContractMismatch(error: unknown): unknown {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"service.invalid_request\"\n ) {\n return new LocalDaemonControlPlaneClientError(\n \"daemon.control.contract_mismatch\",\n \"local OpenMeld Service must be restarted because the daemon control-plane contract changed on this device\"\n );\n }\n return error;\n}\n\nasync function writeControlPlaneRequest(input: {\n endpoint: string;\n request: OpenMeldDaemonControlPlaneRequest;\n timeoutMs: number;\n}): Promise<unknown> {\n return await new Promise<unknown>((resolve, reject) => {\n const socket = createConnection(input.endpoint);\n let responseBuffer = \"\";\n let settled = false;\n const cleanup = () => {\n socket.setTimeout(0);\n socket.off(\"connect\", handleConnect);\n socket.off(\"data\", handleData);\n socket.off(\"end\", handleEnd);\n socket.off(\"error\", handleError);\n socket.off(\"timeout\", handleTimeout);\n };\n const settle = (action: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n action();\n };\n const fail = (error: LocalDaemonControlPlaneClientError) => {\n settle(() => {\n socket.destroy();\n reject(error);\n });\n };\n\n const handleConnect = () => {\n socket.write(`${JSON.stringify(input.request)}\\n`);\n };\n const handleData = (chunk: string) => {\n if (!responseBuffer && chunk.trim().length === 0) {\n return;\n }\n responseBuffer += chunk;\n };\n const handleEnd = () => {\n settle(() => {\n const rawResponse = responseBuffer.trim();\n if (!rawResponse) {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.empty_response\",\n \"local daemon control returned an empty response\"\n )\n );\n return;\n }\n try {\n resolve(JSON.parse(rawResponse) as unknown);\n } catch {\n reject(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.invalid_json\",\n \"local daemon control returned malformed JSON\"\n )\n );\n }\n });\n };\n const handleError = (error: Error | NodeJS.ErrnoException) => {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as NodeJS.ErrnoException).code)\n : \"daemon.control.connection_failed\";\n fail(\n new LocalDaemonControlPlaneClientError(\n code === \"ENOENT\" || code === \"ECONNREFUSED\"\n ? \"daemon.control.endpoint_missing\"\n : code,\n error instanceof Error\n ? error.message\n : \"failed to connect to local daemon control\"\n )\n );\n };\n const handleTimeout = () => {\n fail(\n new LocalDaemonControlPlaneClientError(\n \"daemon.control.timeout\",\n `local daemon control timed out after ${String(input.timeoutMs)}ms`\n )\n );\n };\n\n socket.setEncoding(\"utf8\");\n socket.setTimeout(input.timeoutMs);\n socket.once(\"connect\", handleConnect);\n socket.on(\"data\", handleData);\n socket.once(\"end\", handleEnd);\n socket.once(\"error\", handleError);\n socket.once(\"timeout\", handleTimeout);\n });\n}\n","","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type CliBinaryManifest,\n type CliBinaryRelease,\n cliBinaryManifestSchema,\n} from \"@openmeld/schemas\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport { openMeldRootDir } from \"./paths\";\n\nconst VERSION_STATE_FILENAME = \"version.json\";\nconst NPM_REGISTRY_LATEST_TIMEOUT_MS = 5000;\nconst VERSION_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst LEADING_V_PREFIX_REGEX = /^v/;\nconst SEMVER_CORE_REGEX =\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+.*)?$/;\nconst NUMERIC_SEMVER_IDENTIFIER_REGEX = /^\\d+$/;\nconst versionCache = new Map<\n string,\n { info: PackageLatestInfo; fetchedAt: number }\n>();\nconst versionMetadataCache = new Map<\n string,\n {\n metadata: PackageVersionMetadata;\n fetchedAt: number;\n }\n>();\nconst inFlightVersionRequests = new Map<string, Promise<PackageLatestInfo>>();\nconst inFlightVersionMetadataRequests = new Map<\n string,\n Promise<PackageVersionMetadata>\n>();\n\nexport type OpenMeldVersionStateV1 = {\n v: 1;\n last_version?: string;\n latest_version?: string;\n last_checked_at?: string;\n dismissed_version?: string | null;\n // Projection of the published \"minimum required CLI version\" floor\n // (`openmeld.minRequiredCliVersion` on the npm `latest` manifest). Cached so the\n // forced-update gate can read it without a network probe on every command.\n required_floor?: string | null;\n updated_at: string;\n};\n\nexport type PackageVersionMetadata = {\n version: string;\n deprecated: string | null;\n};\n\nexport type PackageLatestInfo = {\n version: string;\n minRequiredCliVersion: string | null;\n serviceVersion?: string;\n};\n\nexport type CliBinaryReleaseInfo = PackageLatestInfo &\n CliBinaryRelease & {\n platform: string;\n service?: CliBinaryRelease & { version: string; platform: string };\n };\n\nexport function versionStatePath(): string {\n return join(openMeldRootDir(), VERSION_STATE_FILENAME);\n}\n\nexport async function readVersionState(): Promise<OpenMeldVersionStateV1 | null> {\n const raw = await readFile(versionStatePath(), \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<OpenMeldVersionStateV1>;\n if (parsed.v !== 1 || typeof parsed.updated_at !== \"string\") {\n return null;\n }\n const lastVersion = toNonEmptyString(parsed.last_version);\n const latestVersion = toNonEmptyString(parsed.latest_version);\n const lastCheckedAt = toNonEmptyString(parsed.last_checked_at);\n const dismissedVersion =\n parsed.dismissed_version === null\n ? null\n : toNonEmptyString(parsed.dismissed_version);\n const requiredFloor = parseStoredRequiredFloor(parsed.required_floor);\n const next: OpenMeldVersionStateV1 = {\n v: 1,\n ...(lastVersion ? { last_version: lastVersion } : {}),\n ...(latestVersion ? { latest_version: latestVersion } : {}),\n ...(lastCheckedAt ? { last_checked_at: lastCheckedAt } : {}),\n ...(dismissedVersion === undefined\n ? {}\n : { dismissed_version: dismissedVersion }),\n ...(requiredFloor === undefined ? {} : { required_floor: requiredFloor }),\n updated_at: parsed.updated_at,\n };\n return next;\n } catch {\n return null;\n }\n}\n\nexport async function writeVersionState(\n state: OpenMeldVersionStateV1\n): Promise<void> {\n await mkdir(openMeldRootDir(), { recursive: true });\n await writeFile(versionStatePath(), `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nexport function createInitialVersionState(input: {\n currentVersion: string;\n checkedAt?: string;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: input.currentVersion,\n last_checked_at: checkedAt,\n dismissed_version: null,\n updated_at: checkedAt,\n };\n}\n\nexport function hasValidLastVersion(\n state: OpenMeldVersionStateV1 | null\n): boolean {\n return Boolean(toNonEmptyString(state?.last_version));\n}\n\nexport async function ensureVersionStateReady(input: {\n currentVersion: string;\n}): Promise<OpenMeldVersionStateV1> {\n const previousVersionState = await readVersionState();\n if (!previousVersionState) {\n const nextState = createInitialVersionState({\n currentVersion: input.currentVersion,\n });\n await writeVersionState(nextState);\n return nextState;\n }\n\n if (hasValidLastVersion(previousVersionState)) {\n return previousVersionState;\n }\n\n const nextState: OpenMeldVersionStateV1 = {\n ...previousVersionState,\n last_version: input.currentVersion,\n latest_version: previousVersionState.latest_version ?? input.currentVersion,\n };\n await writeVersionState(nextState);\n return nextState;\n}\n\nexport function buildNextVersionState(input: {\n previous: OpenMeldVersionStateV1 | null;\n currentVersion: string;\n latestVersion?: string;\n checkedAt?: string;\n dismissedVersion?: string | null;\n // When provided (including `null`), overwrites the cached floor with the\n // freshly observed value; when omitted, the previous floor is carried\n // forward so callers that do not resolve the floor leave it untouched.\n requiredFloor?: string | null;\n}): OpenMeldVersionStateV1 {\n const checkedAt = input.checkedAt ?? new Date().toISOString();\n const latestVersion =\n toNonEmptyString(input.latestVersion) ??\n toNonEmptyString(input.previous?.latest_version) ??\n input.currentVersion;\n const requiredFloor =\n input.requiredFloor === undefined\n ? (input.previous?.required_floor ?? null)\n : input.requiredFloor;\n return {\n v: 1,\n last_version: input.currentVersion,\n latest_version: latestVersion,\n last_checked_at: checkedAt,\n dismissed_version:\n input.dismissedVersion ?? input.previous?.dismissed_version ?? null,\n ...(requiredFloor ? { required_floor: requiredFloor } : {}),\n updated_at: checkedAt,\n };\n}\n\nfunction parseStoredRequiredFloor(value: unknown): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return null;\n }\n return toNonEmptyString(value);\n}\n\nexport async function fetchLatestPackageInfo(\n packageName: string,\n input: { forceRefresh?: boolean } = {}\n): Promise<PackageLatestInfo> {\n const now = Date.now();\n const cached = input.forceRefresh ? undefined : versionCache.get(packageName);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.info;\n }\n\n const requestKey = input.forceRefresh\n ? `${packageName}:force_refresh`\n : packageName;\n const inFlight = inFlightVersionRequests.get(requestKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestLatestPackageInfo(packageName);\n inFlightVersionRequests.set(requestKey, request);\n\n try {\n const info = await request;\n versionCache.set(packageName, {\n info,\n fetchedAt: Date.now(),\n });\n return info;\n } finally {\n inFlightVersionRequests.delete(requestKey);\n }\n}\n\nexport async function fetchLatestPackageVersion(\n packageName: string\n): Promise<string> {\n const info = await fetchLatestPackageInfo(packageName);\n return info.version;\n}\n\nexport async function fetchLatestCliBinaryRelease(input?: {\n platform?: string;\n}): Promise<CliBinaryReleaseInfo> {\n const manifest = await requestCliBinaryManifest();\n const platform =\n toNonEmptyString(input?.platform) ?? `${process.platform}-${process.arch}`;\n const release = manifest.platforms[platform];\n if (!release) {\n throw new Error(\n `version check failed: invalid CLI manifest response: missing platform ${platform}`\n );\n }\n const serviceRelease = manifest.service?.platforms[platform];\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n platform,\n ...release,\n ...(manifest.service && serviceRelease\n ? {\n service: {\n ...serviceRelease,\n version: manifest.service.version,\n platform,\n },\n }\n : {}),\n };\n}\n\nexport async function fetchPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n const packageName = input.packageName.trim();\n const version = input.version.trim();\n const cacheKey = `${packageName}@${version}`;\n const now = Date.now();\n const cached = versionMetadataCache.get(cacheKey);\n if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS) {\n return cached.metadata;\n }\n\n const inFlight = inFlightVersionMetadataRequests.get(cacheKey);\n if (inFlight) {\n return inFlight;\n }\n\n const request = requestPackageVersionMetadata({\n packageName,\n version,\n });\n inFlightVersionMetadataRequests.set(cacheKey, request);\n\n try {\n const metadata = await request;\n versionMetadataCache.set(cacheKey, {\n metadata,\n fetchedAt: Date.now(),\n });\n return metadata;\n } finally {\n inFlightVersionMetadataRequests.delete(cacheKey);\n }\n}\n\nexport function resetVersionCheckCacheForTests(): void {\n versionCache.clear();\n versionMetadataCache.clear();\n inFlightVersionRequests.clear();\n inFlightVersionMetadataRequests.clear();\n}\n\nasync function requestLatestPackageInfo(\n packageName: string\n): Promise<PackageLatestInfo> {\n if (isBinaryDistribution()) {\n return await requestLatestPackageInfoFromCliManifest();\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as { version?: unknown; openmeld?: unknown };\n const version =\n typeof parsed.version === \"string\" ? parsed.version.trim() : \"\";\n if (!version) {\n throw new Error(\"missing version\");\n }\n return {\n version,\n minRequiredCliVersion: readMinRequiredCliVersion(parsed.openmeld),\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// Binary distribution reads the same version-gate inputs (latest version +\n// minRequiredCliVersion floor) from the R2 cli/manifest.json instead of the npm\n// registry. The gate logic (floorBreached) is unchanged; only the data source\n// differs. The URL is a production Web route; override with\n// OPENMELD_CLI_BINARY_MANIFEST_URL for non-prod lanes.\nconst CLI_BINARY_MANIFEST_URL =\n toNonEmptyString(process.env.OPENMELD_CLI_BINARY_MANIFEST_URL) ??\n \"https://openmeld.ai/cli/manifest.json\";\n\nasync function requestLatestPackageInfoFromCliManifest(): Promise<PackageLatestInfo> {\n const manifest = await requestCliBinaryManifest();\n return {\n version: manifest.version,\n minRequiredCliVersion: manifest.minRequiredCliVersion,\n ...(manifest.service ? { serviceVersion: manifest.service.version } : {}),\n };\n}\n\ntype ParsedCliBinaryManifest = CliBinaryManifest[\"channels\"][\"stable\"] & {\n minRequiredCliVersion: string | null;\n};\n\nasync function requestCliBinaryManifest(): Promise<ParsedCliBinaryManifest> {\n const response = await fetch(CLI_BINARY_MANIFEST_URL, {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n return parseCliBinaryManifest(raw);\n } catch (error) {\n throw new Error(\n `version check failed: invalid CLI manifest response: ${toErrorMessage(error)}`\n );\n }\n}\n\nfunction parseCliBinaryManifest(raw: string): ParsedCliBinaryManifest {\n const parsed = cliBinaryManifestSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const stable = parsed.data.channels.stable;\n return {\n ...stable,\n minRequiredCliVersion: stable.minRequiredCliVersion ?? null,\n };\n}\n\nfunction readMinRequiredCliVersion(openmeld: unknown): string | null {\n if (!openmeld || typeof openmeld !== \"object\") {\n return null;\n }\n const value = (openmeld as { minRequiredCliVersion?: unknown })\n .minRequiredCliVersion;\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n // A malformed floor must be treated as \"no signal\", never a hard gate:\n // `compareSemver` falls back to lexical compare on unparseable input, which\n // could wrongly read as a floor breach. Validate before trusting it.\n return trimmed.length > 0 && isPlainReleaseVersion(trimmed) ? trimmed : null;\n}\n\nasync function requestPackageVersionMetadata(input: {\n packageName: string;\n version: string;\n}): Promise<PackageVersionMetadata> {\n if (isBinaryDistribution()) {\n // Binary distribution has no npm-style per-version deprecation metadata.\n return { version: input.version, deprecated: null };\n }\n const response = await fetch(\n `https://registry.npmjs.org/${encodeURIComponent(input.packageName)}/${encodeURIComponent(input.version)}`,\n {\n method: \"GET\",\n signal: AbortSignal.timeout(NPM_REGISTRY_LATEST_TIMEOUT_MS),\n }\n );\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(`version check failed: HTTP ${response.status}: ${raw}`);\n }\n try {\n const parsed = JSON.parse(raw) as {\n version?: unknown;\n deprecated?: unknown;\n };\n const resolvedVersion =\n typeof parsed.version === \"string\" && parsed.version.trim().length > 0\n ? parsed.version.trim()\n : input.version;\n const deprecated =\n typeof parsed.deprecated === \"string\" &&\n parsed.deprecated.trim().length > 0\n ? parsed.deprecated.trim()\n : null;\n return {\n version: resolvedVersion,\n deprecated,\n };\n } catch (error) {\n throw new Error(\n `version check failed: invalid registry response: ${toErrorMessage(error)}`\n );\n }\n}\n\n// A forced-update floor must be a plain published release version — no\n// prerelease, no build metadata. This is stricter than general semver on\n// purpose: it rejects malformed values (e.g. \"9.0.0+bad meta\") so they fail\n// open instead of hard-gating, and sidesteps prerelease-precedence ambiguity\n// since a floor is always a shipped stable release. Must match the release\n// tool's plain-version check in scripts/release/local-components.mjs.\nconst PLAIN_RELEASE_VERSION_RE = /^\\d+\\.\\d+\\.\\d+$/;\n\nexport function isPlainReleaseVersion(value: string): boolean {\n return PLAIN_RELEASE_VERSION_RE.test(value.trim());\n}\n\nexport function compareSemver(a: string, b: string): number {\n const left = parseSemver(a);\n const right = parseSemver(b);\n if (!(left && right)) {\n return a.localeCompare(b);\n }\n if (left.major !== right.major) {\n return left.major > right.major ? 1 : -1;\n }\n if (left.minor !== right.minor) {\n return left.minor > right.minor ? 1 : -1;\n }\n if (left.patch !== right.patch) {\n return left.patch > right.patch ? 1 : -1;\n }\n return comparePrereleaseIdentifiers(left.prerelease, right.prerelease);\n}\n\nfunction parseSemver(value: string): {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[] | null;\n} | null {\n const normalized = value.trim().replace(LEADING_V_PREFIX_REGEX, \"\");\n const match = normalized.match(SEMVER_CORE_REGEX);\n if (!match) {\n return null;\n }\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : null,\n };\n}\n\nfunction comparePrereleaseIdentifiers(\n left: string[] | null,\n right: string[] | null\n): number {\n if (!(left || right)) {\n return 0;\n }\n if (!left) {\n return 1;\n }\n if (!right) {\n return -1;\n }\n\n const maxLength = Math.max(left.length, right.length);\n for (let index = 0; index < maxLength; index += 1) {\n const leftIdentifier = left[index];\n const rightIdentifier = right[index];\n const lengthComparison = comparePrereleaseLengthAtIndex(\n leftIdentifier,\n rightIdentifier\n );\n if (lengthComparison !== 0) {\n return lengthComparison;\n }\n if (!(leftIdentifier && rightIdentifier)) {\n continue;\n }\n const compared = compareSinglePrereleaseIdentifier(\n leftIdentifier,\n rightIdentifier\n );\n if (compared !== 0) {\n return compared;\n }\n }\n return 0;\n}\n\nfunction comparePrereleaseLengthAtIndex(\n leftIdentifier: string | undefined,\n rightIdentifier: string | undefined\n): number {\n if (leftIdentifier === undefined && rightIdentifier === undefined) {\n return 0;\n }\n if (leftIdentifier === undefined) {\n return -1;\n }\n if (rightIdentifier === undefined) {\n return 1;\n }\n return 0;\n}\n\nfunction compareSinglePrereleaseIdentifier(\n leftIdentifier: string,\n rightIdentifier: string\n): number {\n if (leftIdentifier === rightIdentifier) {\n return 0;\n }\n\n const leftNumber = toNumericPrereleaseIdentifier(leftIdentifier);\n const rightNumber = toNumericPrereleaseIdentifier(rightIdentifier);\n if (leftNumber !== null && rightNumber !== null) {\n if (leftNumber === rightNumber) {\n return 0;\n }\n return leftNumber > rightNumber ? 1 : -1;\n }\n if (leftNumber !== null) {\n return -1;\n }\n if (rightNumber !== null) {\n return 1;\n }\n return leftIdentifier > rightIdentifier ? 1 : -1;\n}\n\nfunction toNumericPrereleaseIdentifier(identifier: string): number | null {\n if (!NUMERIC_SEMVER_IDENTIFIER_REGEX.test(identifier)) {\n return null;\n }\n return Number(identifier);\n}\n\nfunction toNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import packageJson from \"../../package.json\";\n\ndeclare const __OPENMELD_VERSION__: string | undefined;\n\n/**\n * The version of the running CLI and Service bundle.\n *\n * npm builds use package.json. Binary builds may inject an isolated staging\n * prerelease so the real update lifecycle can be exercised before a production\n * version exists.\n */\nexport function resolveOpenMeldVersion(): string {\n const injected =\n typeof __OPENMELD_VERSION__ === \"string\" ? __OPENMELD_VERSION__.trim() : \"\";\n return injected || packageJson.version;\n}\n\nexport const OPENMELD_VERSION = resolveOpenMeldVersion();\n","import { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport {\n type DaemonLifecycleIntent,\n daemonLifecycleJournalPath,\n readDaemonServiceLifecycleLockMeta,\n} from \"../../config/daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport { resolveOpenMeldEnvPreset } from \"../../config/paths\";\nimport { assertNoPublishedProductionMutationDuringTests } from \"../../config/published-production-safety\";\nimport { resolveCliContextId } from \"../../config/session-profile\";\n\nconst DAEMON_LIFECYCLE_EVENT_TYPES = [\n \"connection.state\",\n \"daemon.crash\",\n \"lifecycle.command.begin\",\n \"lifecycle.command.end\",\n \"owner.snapshot\",\n \"route_catalog.initial_load\",\n \"runtime_state.takeover\",\n \"stop.controlled_drain\",\n \"stop.strategy.selected\",\n \"service_manager.action\",\n \"service_manager.registration_reconcile\",\n \"process_stop.action\",\n \"service_contract.write\",\n \"stop.signal.observed\",\n] as const;\n\nconst DAEMON_STOP_CAUSES = [\n \"user_stop\",\n \"controlled_service_update\",\n \"service_crash\",\n \"network_disconnect\",\n \"unknown\",\n] as const;\n\nexport type DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\";\n v: 1;\n type: DaemonLifecycleEventType;\n timestamp: string;\n lane: string;\n intent: string;\n command: string;\n pid: number;\n sessionId: string | null;\n stopCause?: DaemonStopCause;\n result: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type DaemonStopCause =\n | \"user_stop\"\n | \"controlled_service_update\"\n | \"service_crash\"\n | \"network_disconnect\"\n | \"unknown\";\n\nexport type DaemonLifecycleAttribution = {\n command: string;\n intent: DaemonLifecycleIntent | \"unknown\";\n lane: string;\n pid: number;\n sessionId: string | null;\n};\n\ntype DaemonLifecycleEventType = (typeof DAEMON_LIFECYCLE_EVENT_TYPES)[number];\n\nfunction toJournalErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction normalizeSessionId(value: string | undefined | null): string | null {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveDaemonStopCause(input: {\n explicitCause?: DaemonStopCause;\n intent: DaemonLifecycleIntent | \"unknown\";\n result: string;\n type: DaemonLifecycleEventType;\n}): DaemonStopCause {\n if (input.explicitCause) {\n return input.explicitCause;\n }\n if (input.type === \"daemon.crash\") {\n return \"service_crash\";\n }\n // A transport observation does not establish why the connection was lost,\n // and must not inherit a concurrent CLI command's stop/update attribution.\n if (input.type === \"connection.state\") {\n return \"unknown\";\n }\n if (input.intent === \"stop\") {\n return \"user_stop\";\n }\n if (\n input.intent === \"upgrade_reconcile\" ||\n input.intent === \"reinstall\" ||\n input.intent === \"startup_check\" ||\n input.intent === \"status_cleanup\"\n ) {\n return \"controlled_service_update\";\n }\n return \"unknown\";\n}\n\nfunction isDaemonLifecycleEvent(event: unknown): event is DaemonLifecycleEvent {\n if (typeof event !== \"object\" || event === null) {\n return false;\n }\n const candidate = event as Partial<DaemonLifecycleEvent>;\n return (\n candidate.schema === \"openmeld-daemon-lifecycle-event-v1\" &&\n candidate.v === 1 &&\n DAEMON_LIFECYCLE_EVENT_TYPES.includes(\n candidate.type as DaemonLifecycleEventType\n ) &&\n typeof candidate.timestamp === \"string\" &&\n candidate.timestamp.length > 0 &&\n typeof candidate.lane === \"string\" &&\n candidate.lane.length > 0 &&\n typeof candidate.intent === \"string\" &&\n candidate.intent.length > 0 &&\n typeof candidate.command === \"string\" &&\n candidate.command.length > 0 &&\n typeof candidate.pid === \"number\" &&\n Number.isInteger(candidate.pid) &&\n candidate.pid > 0 &&\n (candidate.sessionId === null ||\n (typeof candidate.sessionId === \"string\" &&\n candidate.sessionId.length > 0)) &&\n (candidate.stopCause === undefined ||\n DAEMON_STOP_CAUSES.includes(candidate.stopCause)) &&\n typeof candidate.result === \"string\" &&\n candidate.result.length > 0\n );\n}\n\nasync function resolveDaemonLifecycleAttribution(input: {\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleAttribution> {\n const lockMeta = await readDaemonServiceLifecycleLockMeta().catch(() => null);\n const command =\n input.command?.trim() ||\n (typeof lockMeta?.command === \"string\" ? lockMeta.command.trim() : \"\") ||\n \"unknown\";\n const intent =\n input.intent ??\n (typeof lockMeta?.intent === \"string\" ? lockMeta.intent : \"unknown\");\n return {\n command,\n intent,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid:\n typeof lockMeta?.pid === \"number\" && lockMeta.pid > 0\n ? lockMeta.pid\n : process.pid,\n sessionId: normalizeSessionId(lockMeta?.sessionId) ?? resolveCliContextId(),\n };\n}\n\nexport async function emitDaemonLifecycleEvent(input: {\n type: DaemonLifecycleEventType;\n result: string;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n command?: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n stopCause?: DaemonStopCause;\n}): Promise<void> {\n assertNoPublishedProductionMutationDuringTests(\n input.pathInput ?? {},\n \"OpenMeld Service lifecycle journal\"\n );\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n const timestamp = new Date().toISOString();\n const attribution =\n input.type === \"connection.state\"\n ? {\n command: \"openmeld service run\",\n intent: \"unknown\" as const,\n lane: resolveOpenMeldEnvPreset(input.pathInput),\n pid: process.pid,\n sessionId: resolveCliContextId(),\n }\n : await resolveDaemonLifecycleAttribution(input);\n const event: DaemonLifecycleEvent = {\n schema: \"openmeld-daemon-lifecycle-event-v1\",\n v: 1,\n type: input.type,\n timestamp,\n lane: attribution.lane,\n intent: attribution.intent,\n command: attribution.command,\n pid: attribution.pid,\n sessionId: attribution.sessionId,\n stopCause: resolveDaemonStopCause({\n explicitCause: input.stopCause,\n intent: attribution.intent,\n result: input.result,\n type: input.type,\n }),\n result: input.result,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n\n if (!isDaemonLifecycleEvent(event)) {\n console.warn(\n `[openmeld:lifecycle-journal] rejected invalid event ${input.type}`\n );\n return;\n }\n\n try {\n await mkdir(dirname(journalPath), { recursive: true });\n await appendFile(journalPath, `${JSON.stringify(event)}\\n`, \"utf8\");\n } catch (error) {\n console.warn(\n `[openmeld:lifecycle-journal] failed to append event ${input.type}: ${toJournalErrorMessage(error)}`\n );\n }\n}\n\nexport async function runWithDaemonLifecycleCommandJournal<T>(input: {\n command: string;\n intent: DaemonLifecycleIntent;\n /**\n * Stamps the begin event with `processUptimeMs`, the milliseconds this\n * process has been running when the command begins. It is opt-in because it\n * is only meaningful for the long-lived daemon run: `begin timestamp -\n * processUptimeMs` recovers the process spawn moment, which splits the gap\n * between the previous `service_manager.action start` and this begin into\n * launchd/BTM spawn-decision latency versus daemon early initialization.\n * Local diagnostic evidence only; it must never feed readiness decisions.\n */\n includeProcessUptime?: boolean;\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n resolveResult?: (result: T) => {\n metadata?: Record<string, unknown>;\n result: string;\n };\n run: () => Promise<T>;\n}): Promise<T> {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.begin\",\n result: \"started\",\n metadata: input.includeProcessUptime\n ? {\n ...input.metadata,\n processUptimeMs: Math.round(process.uptime() * 1000),\n }\n : input.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n\n try {\n const result = await input.run();\n const resolvedResult = input.resolveResult?.(result) ?? {\n result: \"completed\",\n };\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: resolvedResult.result,\n metadata: resolvedResult.metadata,\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n type: \"lifecycle.command.end\",\n result: \"failed\",\n metadata: {\n errorMessage: toJournalErrorMessage(error),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nexport async function runDaemonServiceManagerAction<T>(input: {\n action:\n | \"deactivate\"\n | \"install\"\n | \"start\"\n | \"stop\"\n | \"uninstall\"\n | \"wait_running\";\n command?: string;\n controller: string;\n intent?: DaemonLifecycleIntent | \"unknown\";\n metadata?: Record<string, unknown>;\n pathInput?: OpenMeldPathResolutionInput;\n /**\n * Extracts structured failure evidence from the thrown error so the\n * journal entry alone carries the diagnosis (e.g. launchd job state on a\n * wait_running timeout). Extraction failures are swallowed: journaling\n * must never change the thrown error.\n */\n resolveErrorMetadata?: (error: unknown) => Record<string, unknown> | null;\n run: () => Promise<T>;\n}): Promise<T> {\n const startedAtMs = Date.now();\n try {\n const result = await input.run();\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"completed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n return result;\n } catch (error) {\n let errorMetadata: Record<string, unknown> | null = null;\n try {\n errorMetadata = input.resolveErrorMetadata?.(error) ?? null;\n } catch {\n errorMetadata = null;\n }\n await emitDaemonLifecycleEvent({\n type: \"service_manager.action\",\n result: \"failed\",\n metadata: {\n action: input.action,\n controller: input.controller,\n durationMs: Date.now() - startedAtMs,\n errorMessage: toJournalErrorMessage(error),\n ...(errorMetadata ?? {}),\n ...(input.metadata ?? {}),\n },\n pathInput: input.pathInput,\n command: input.command,\n intent: input.intent,\n });\n throw error;\n }\n}\n\nconst DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES = new Set<DaemonLifecycleEventType>([\n \"daemon.crash\",\n \"lifecycle.command.end\",\n \"process_stop.action\",\n \"runtime_state.takeover\",\n \"service_contract.write\",\n \"service_manager.action\",\n]);\n\nexport async function readLatestDaemonLifecycleOriginEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: DAEMON_LIFECYCLE_ORIGIN_EVENT_TYPES,\n });\n}\n\nexport async function readLatestDaemonLifecycleConnectionStateEvent(\n input: { pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<DaemonLifecycleEvent | null> {\n return await readLatestDaemonLifecycleEvent({\n pathInput: input.pathInput,\n typeFilter: new Set<DaemonLifecycleEventType>([\"connection.state\"]),\n });\n}\n\nasync function readLatestDaemonLifecycleEvent(input: {\n pathInput?: OpenMeldPathResolutionInput;\n typeFilter: ReadonlySet<DaemonLifecycleEventType>;\n}): Promise<DaemonLifecycleEvent | null> {\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed) && input.typeFilter.has(parsed.type)) {\n return parsed;\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return null;\n}\n\nexport async function readRecentDaemonLifecycleEvents(input: {\n maxEntries: number;\n pathInput?: OpenMeldPathResolutionInput;\n}): Promise<DaemonLifecycleEvent[]> {\n if (input.maxEntries <= 0) {\n return [];\n }\n const journalPath = daemonLifecycleJournalPath(input.pathInput);\n let content: string;\n try {\n content = await readFile(journalPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lines = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const recent: DaemonLifecycleEvent[] = [];\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (isDaemonLifecycleEvent(parsed)) {\n recent.push(parsed);\n if (recent.length >= input.maxEntries) {\n break;\n }\n }\n } catch {\n // Ignore malformed journal lines and keep scanning older entries.\n }\n }\n\n return recent.reverse();\n}\n\nexport async function resolveRecentDaemonSignalStopCause(\n input: { maxAgeMs?: number; pathInput?: OpenMeldPathResolutionInput } = {}\n): Promise<\n | Extract<DaemonStopCause, \"user_stop\" | \"controlled_service_update\">\n | \"unknown\"\n> {\n const nowMs = Date.now();\n const maxAgeMs = input.maxAgeMs ?? 30_000;\n const events = await readRecentDaemonLifecycleEvents({\n maxEntries: 32,\n pathInput: input.pathInput,\n });\n for (const event of events.toReversed()) {\n const eventAtMs = Date.parse(event.timestamp);\n if (\n !Number.isFinite(eventAtMs) ||\n nowMs - eventAtMs < 0 ||\n nowMs - eventAtMs > maxAgeMs\n ) {\n continue;\n }\n if (\n event.stopCause === \"user_stop\" ||\n event.stopCause === \"controlled_service_update\"\n ) {\n return event.stopCause;\n }\n }\n return \"unknown\";\n}\n\nexport function formatDaemonLifecycleOriginSummary(\n event: DaemonLifecycleEvent\n): string {\n const intent = formatDaemonLifecycleIntent(event.intent);\n return `${event.result} ${intent} from ${event.command} at ${event.timestamp} (pid ${event.pid})`;\n}\n\nfunction formatDaemonLifecycleIntent(intent: string): string {\n if (intent === \"unknown\") {\n return \"OpenMeld Service task\";\n }\n return intent.replaceAll(\"_\", \" \");\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-service-manager-HL4VKbIU.js","names":["runCommand"],"sources":["../src/local-service/lifecycle/daemon-service-identity.ts","../src/local-service/lifecycle/native-command.ts","../src/local-service/lifecycle/daemon-service-manager.ts"],"sourcesContent":["import type {\n OpenMeldEnvPreset,\n OpenMeldPathResolutionInput,\n} from \"../../config/paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldServiceScope,\n} from \"../../config/paths\";\n\nexport type DaemonServiceIdentity = {\n envPreset: OpenMeldEnvPreset;\n serviceName: string;\n launchdLabel: string;\n windowsServiceName: string;\n windowsDisplayName: string;\n cliEntryAliases: readonly string[];\n};\n\nconst DAEMON_SERVICE_IDENTITY_BY_PRESET = {\n prod: {\n envPreset: \"prod\",\n serviceName: \"openmeld-daemon\",\n launchdLabel: \"com.openmeld.openmeld-background-service\",\n windowsServiceName: \"OpenMeld-Daemon\",\n windowsDisplayName: \"OpenMeld Daemon Service\",\n cliEntryAliases: [\"openmeld\"],\n },\n \"dev-local\": {\n envPreset: \"dev-local\",\n serviceName: \"openmeld-daemon-dev-local\",\n launchdLabel: \"com.openmeld.openmeld-background-service.dev-local\",\n windowsServiceName: \"OpenMeld-Daemon-DevLocal\",\n windowsDisplayName: \"OpenMeld Daemon Service (Dev Local)\",\n cliEntryAliases: [\"openmeld-dev\"],\n },\n canary: {\n envPreset: \"canary\",\n serviceName: \"openmeld-daemon-canary\",\n launchdLabel: \"com.openmeld.openmeld-background-service.canary\",\n windowsServiceName: \"OpenMeld-Daemon-Canary\",\n windowsDisplayName: \"OpenMeld Daemon Service (Canary)\",\n cliEntryAliases: [\"openmeld-canary\"],\n },\n} as const satisfies Record<OpenMeldEnvPreset, DaemonServiceIdentity>;\n\nexport function resolveDaemonServiceIdentity(\n input: OpenMeldPathResolutionInput = {}\n): DaemonServiceIdentity {\n const preset = resolveOpenMeldEnvPreset(input);\n const identity = DAEMON_SERVICE_IDENTITY_BY_PRESET[preset];\n const scope = resolveOpenMeldServiceScope(input);\n return scope\n ? {\n ...identity,\n serviceName: `${identity.serviceName}-${scope}`,\n launchdLabel: `${identity.launchdLabel}.${scope}`,\n windowsServiceName: `${identity.windowsServiceName}-${scope}`,\n windowsDisplayName: `${identity.windowsDisplayName} (${scope})`,\n }\n : identity;\n}\n","import { spawn } from \"node:child_process\";\nimport { currentDaemonServiceLifecycleLock } from \"../../config/daemon-state\";\nimport {\n attachLockProcess,\n type OpenMeldLock,\n releaseLock,\n} from \"../../config/lock\";\n\n// The shell waits without spawning another process. exec preserves its PID\n// and start identity. EOF before a grant prevents the platform command.\nconst EXEC_HANDSHAKE =\n 'IFS= read -r grant && [ \"$grant\" = \"execute\" ] || exit 125; exec \"$@\"';\n\nexport async function runNativeServiceCommand(input: {\n command: string;\n args: string[];\n env?: NodeJS.ProcessEnv;\n throwOnError?: boolean;\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const lock = currentDaemonServiceLifecycleLock();\n const attached = lock !== null && process.platform !== \"win32\";\n const child = spawn(\n attached ? \"/bin/sh\" : input.command,\n attached\n ? [\n \"-c\",\n EXEC_HANDSHAKE,\n \"openmeld-native-command\",\n input.command,\n ...input.args,\n ]\n : input.args,\n {\n stdio: [attached ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n env: input.env ?? process.env,\n windowsHide: true,\n }\n );\n let stdout = \"\";\n let stderr = \"\";\n let spawnError: Error | undefined;\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (error) => {\n spawnError = error;\n });\n // EPIPE is expected when a waiting participant exits before the grant.\n child.stdin?.on(\"error\", () => undefined);\n const completion = new Promise<number>((resolve) => {\n child.once(\"close\", (code) => resolve(code ?? 1));\n });\n let participant: OpenMeldLock | undefined;\n try {\n if (attached) {\n if (!child.pid) {\n throw new Error(\"Native command did not establish a process.\");\n }\n participant = await attachLockProcess(lock, child.pid);\n child.stdin?.end(\"execute\\n\");\n }\n const exitCode = await completion;\n if (input.throwOnError && (spawnError || exitCode !== 0)) {\n throw (\n spawnError ??\n new Error(\n [\n `command failed: ${input.command} ${input.args.join(\" \")}`,\n stdout.trim(),\n stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n )\n );\n }\n return {\n exitCode,\n stdout,\n stderr: `${stderr}${spawnError ? String(spawnError) : \"\"}`,\n };\n } finally {\n child.stdin?.destroy();\n if (child.exitCode === null && child.signalCode === null) {\n child.kill();\n }\n await completion;\n if (participant) {\n await releaseLock(participant);\n }\n }\n}\n","import { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n mkdir,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { WindowsUserTaskRequest } from \"@openmeld/schemas\";\nimport { sleep } from \"@openmeld/utils\";\nimport type { DaemonServiceController } from \"../../config/daemon-state\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport { assertSafePublishedProductionServiceRegistrationMutation } from \"../../config/published-production-safety\";\nimport { resolveDaemonServiceIdentity } from \"./daemon-service-identity\";\nimport { runNativeServiceCommand as runCommand } from \"./native-command\";\nimport {\n readWindowsTaskAction,\n runWindowsUserTask,\n windowsPowerShellPath,\n windowsTaskActionArguments,\n} from \"./windows-user-task\";\n\nexport type RunCommandResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type RunCommandOptions = {\n args: string[];\n command: string;\n env?: NodeJS.ProcessEnv;\n throwOnError?: boolean;\n};\n\nexport type DaemonServiceCommandSpec = {\n executable: string;\n args: string[];\n env: Record<string, string>;\n workingDirectory?: string;\n};\n\nexport type DaemonServiceManagerRuntimeStatus = {\n installed: boolean;\n running: boolean;\n enabled: boolean;\n definitionPath?: string | null;\n commandSummary?: string | null;\n /** Native launch action when the supervisor does not use a definition file. */\n commandSpec?: DaemonServiceCommandSpec;\n /**\n * The OpenMeld backend target persisted in the OS service definition.\n * `undefined` is reserved for older/custom manager implementations that do\n * not expose this observation; `null` means the definition was readable but\n * did not contain one complete, valid target.\n */\n environmentTarget?: OpenMeldEnvironmentTarget | null;\n};\n\nexport type DaemonServiceJobDiagnostics = {\n controller: DaemonServiceController;\n /** The service definition is loaded in the OS service manager domain. */\n loaded: boolean;\n /** How many times the OS service manager spawned the process since load. */\n runs: number | null;\n state: string | null;\n /** Raw last-exit text as reported, e.g. \"(never exited)\" or \"78\". */\n lastExitCodeText: string | null;\n /** Numeric last exit code when the raw text is a plain integer. */\n lastExitCode: number | null;\n /** launchd marker for deferred non-demand startup; not proof of permission denial. */\n pendedNondemandSpawn: string | null;\n /** Job is configured to auto-start and stay alive (keepalive + runatload). */\n keepaliveRunAtLoad: boolean;\n};\n\nexport type DaemonServiceManager = {\n controller: DaemonServiceController;\n /**\n * Installs or refreshes the supervisor definition without starting another\n * process. When the definition was absent, success means a fresh status\n * probe confirmed that it is installed and enabled. A failed install or\n * verification removes that newly created definition before rejecting.\n */\n install: (spec: DaemonServiceCommandSpec) => Promise<void>;\n uninstall: () => Promise<void>;\n enableAutostart: () => Promise<void>;\n disableAutostart: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n deactivate: () => Promise<void>;\n status: () => Promise<DaemonServiceManagerRuntimeStatus>;\n waitUntilAbsent: () => Promise<void>;\n waitUntilStopped: () => Promise<void>;\n waitUntilRunning: () => Promise<void>;\n /**\n * Controller-reported job-state evidence for startup failure diagnosis\n * (for launchd: `launchctl print` runs/state/last exit code/pended spawn).\n * Diagnostic evidence only; it must never feed availability, readiness,\n * or lifecycle decisions. Resolves null when the controller offers no\n * job-state evidence or the probe fails.\n */\n readJobDiagnostics?: () => Promise<DaemonServiceJobDiagnostics | null>;\n};\n\n/**\n * Disables autostart only when the OS definition is already committed.\n * Setup can run a candidate Service from its stable carrier before that\n * definition exists; the process can still be stopped without toggling it.\n */\nexport async function disableDaemonServiceAutostartIfConfigured(input: {\n manager: DaemonServiceManager;\n status: DaemonServiceManagerRuntimeStatus | null;\n}): Promise<boolean> {\n if (!(input.status?.installed === true && input.status.enabled === true)) {\n return false;\n }\n await input.manager.disableAutostart();\n return true;\n}\n\nconst SHELL_QUOTING_PATTERN = /[\\s\"\\\\]/g;\nconst SHELL_BACKSLASH_PATTERN = /\\\\/g;\nconst SHELL_DOUBLE_QUOTE_PATTERN = /\"/g;\nconst WINDOWS_QUOTE_PATTERN = /\"/g;\nconst XML_AMPERSAND_PATTERN = /&/g;\nconst XML_LESS_THAN_PATTERN = /</g;\nconst XML_GREATER_THAN_PATTERN = />/g;\nconst XML_DOUBLE_QUOTE_ESCAPE_PATTERN = /\"/g;\nconst XML_SINGLE_QUOTE_PATTERN = /'/g;\nconst LAUNCHD_ENABLED_PATTERN = /enabled\\s*=\\s*(true|false)/i;\nconst LAUNCHD_STATE_PATTERN = /state\\s*=\\s*running/i;\nconst LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN =\n /\"([^\"]+)\"\\s*=>\\s*(enabled|disabled)/i;\nconst LAUNCHD_STRING_PATTERN = /<string>([^<]+)<\\/string>/g;\nconst LAUNCHD_SERVICE_PROCESS_TYPE = \"Interactive\";\nconst LAUNCHD_PROCESS_TYPE_PATTERN =\n /<key>ProcessType<\\/key>\\s*<string>([^<]+)<\\/string>/;\nconst LAUNCHD_RESTART_ON_FAILURE_PATTERN =\n /<key>KeepAlive<\\/key>\\s*<dict>\\s*<key>SuccessfulExit<\\/key>\\s*<false\\s*\\/>\\s*<\\/dict>/;\nconst LAUNCHD_ENVIRONMENT_BLOCK_PATTERN =\n /<key>EnvironmentVariables<\\/key>\\s*<dict>([\\s\\S]*?)<\\/dict>/;\nconst WINDOWS_LINE_SEPARATOR_PATTERN = /\\r?\\n/;\nconst WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN = /^set \"([^=]+)=(.*)\"$/i;\nconst SYSTEMD_ACTIVE_STATES = new Set([\n \"active\",\n \"reloading\",\n \"inactive\",\n \"failed\",\n \"activating\",\n \"deactivating\",\n \"maintenance\",\n \"unknown\",\n]);\nconst SYSTEMD_ENABLED_STATES = new Set([\n \"enabled\",\n \"enabled-runtime\",\n \"linked\",\n \"linked-runtime\",\n \"alias\",\n \"masked\",\n \"masked-runtime\",\n \"static\",\n \"indirect\",\n \"generated\",\n \"transient\",\n \"disabled\",\n \"bad\",\n \"not-found\",\n]);\nconst LAUNCHD_ALREADY_PATTERN = /already/i;\nconst WINDOWS_SCRIPT_LINE_SPLIT_PATTERN = /\\r?\\n/u;\nconst LAUNCHD_SERVICE_NOT_FOUND_PATTERNS = [\n /could not find service/i,\n /service could not be found/i,\n /could not find domain/i,\n] as const;\nconst LAUNCHD_PRINT_RUNS_PATTERN = /^\\s*runs\\s*=\\s*(\\d+)\\s*$/m;\nconst LAUNCHD_PRINT_STATE_PATTERN = /^\\s*state\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN =\n /^\\s*last exit code\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN =\n /^\\s*pended nondemand spawn\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PROPERTIES_PATTERN = /^\\s*properties\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN = /\\bkeepalive\\b/i;\nconst LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN = /\\brunatload\\b/i;\nconst INTEGER_TEXT_PATTERN = /^-?\\d+$/;\nconst SYSTEM_SERVICE_WAIT_MS = 15_000;\nconst SYSTEM_SERVICE_POLL_MS = 200;\n\nconst QUOTED_XML_REPLACEMENT = \"&quot;\";\nconst APOSTROPHE_XML_REPLACEMENT = \"&apos;\";\nconst GREATER_XML_REPLACEMENT = \"&gt;\";\nconst LESS_XML_REPLACEMENT = \"&lt;\";\nconst AMPERSAND_XML_REPLACEMENT = \"&amp;\";\n\nexport function getDaemonSystemServiceLogPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n \"daemon-system-service.log\"\n );\n}\n\nexport function getDaemonServiceLaunchdLabel(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return resolveDaemonServiceIdentity(pathInput).launchdLabel;\n}\n\nconst SYSTEMD_CONTROLLER: DaemonServiceController = \"systemd\";\nconst LAUNCHD_CONTROLLER: DaemonServiceController = \"launchd\";\nconst WINDOWS_CONTROLLER: DaemonServiceController = \"windows-service\";\nconst DAEMON_SERVICE_RESTART_BACKOFF_SECONDS = 60;\n\nexport async function startLaunchdService(input: {\n serviceKey: string;\n guiDomain: string;\n plistPath: string;\n run?: (options: RunCommandOptions) => Promise<RunCommandResult>;\n}): Promise<void> {\n const run = input.run ?? runCommand;\n const observed = await run({\n command: \"launchctl\",\n args: [\"print\", input.serviceKey],\n throwOnError: false,\n });\n if (observed.exitCode !== 0 && !isLaunchdServiceMissing(observed)) {\n throw buildServiceManagerProbeError(\"launchctl print\", observed);\n }\n await run({\n command: \"launchctl\",\n args: [\"enable\", input.serviceKey],\n throwOnError: true,\n });\n // A loaded job must not be bootstrapped again: launchd can report EIO for\n // that case, which is not evidence that its registration needs replacing.\n if (observed.exitCode !== 0) {\n const bootstrap = await run({\n command: \"launchctl\",\n args: [\"bootstrap\", input.guiDomain, input.plistPath],\n throwOnError: false,\n });\n if (\n bootstrap.exitCode !== 0 &&\n !LAUNCHD_ALREADY_PATTERN.test(bootstrap.stderr)\n ) {\n throw new Error(\n `failed to start launchd service: ${bootstrap.stderr.trim() || bootstrap.stdout.trim()}`\n );\n }\n }\n // Registration/KeepAlive is not a demand start. Never use -k: an existing\n // healthy instance must survive repeated setup/start requests.\n await run({\n command: \"launchctl\",\n args: [\"kickstart\", input.serviceKey],\n throwOnError: true,\n });\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n}\n\n// Thrown when a service-manager wait (running/stopped/absent) times out. On the\n// launchd running path it carries the structured launchd job-state verdict so\n// upstream lifecycle journaling can distinguish a never-spawned (Login Items\n// blocked) job from a crash loop — matching the `openmeld service run` startup path.\n// Diagnostic evidence only: jobDiagnostics must never gate lifecycle decisions.\nexport class DaemonServiceWaitTimeoutError extends Error {\n readonly jobDiagnostics: DaemonServiceJobDiagnostics | null;\n\n constructor(input: {\n message: string;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n }) {\n super(input.message);\n this.name = \"DaemonServiceWaitTimeoutError\";\n this.jobDiagnostics = input.jobDiagnostics ?? null;\n }\n}\n\nexport function isDaemonServiceWaitTimeoutError(\n error: unknown\n): error is DaemonServiceWaitTimeoutError {\n return error instanceof DaemonServiceWaitTimeoutError;\n}\n\nfunction buildSystemServiceWaitTimeoutError(input: {\n action: \"absent\" | \"running\" | \"stopped\";\n controller: DaemonServiceController;\n details?: string | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n}): DaemonServiceWaitTimeoutError {\n const detailSuffix =\n input.details && input.details.trim().length > 0\n ? ` Last observed state: ${input.details.trim()}`\n : \"\";\n return new DaemonServiceWaitTimeoutError({\n message: `timed out waiting for ${input.controller} service to become ${input.action}.${detailSuffix}`,\n jobDiagnostics: input.jobDiagnostics ?? null,\n });\n}\n\nasync function waitForCondition(input: {\n waitMs?: number;\n pollMs?: number;\n until: () => Promise<boolean>;\n onTimeout: () => Promise<Error> | Error;\n}): Promise<void> {\n const deadline = Date.now() + (input.waitMs ?? SYSTEM_SERVICE_WAIT_MS);\n const pollMs = input.pollMs ?? SYSTEM_SERVICE_POLL_MS;\n while (Date.now() < deadline) {\n if (await input.until()) {\n return;\n }\n await sleep(pollMs);\n }\n throw await input.onTimeout();\n}\n\nfunction isLaunchdServiceMissing(result: RunCommandResult): boolean {\n if (result.exitCode === 0) {\n return false;\n }\n const output = `${result.stdout}\\n${result.stderr}`;\n return LAUNCHD_SERVICE_NOT_FOUND_PATTERNS.some((pattern) =>\n pattern.test(output)\n );\n}\n\nexport async function waitForLaunchdJobUnloaded(\n serviceKey: string\n): Promise<void> {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", serviceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: () =>\n new Error(`Timed out waiting for launchd job ${serviceKey} to unload.`),\n });\n}\n\nfunction formatManagerStatusDetails(\n status: DaemonServiceManagerRuntimeStatus\n): string {\n return `installed=${String(status.installed)} running=${String(status.running)} enabled=${String(status.enabled)}`;\n}\n\nfunction quoteShellValue(input: string): string {\n if (input === \"\") {\n return '\"\"';\n }\n if (SHELL_QUOTING_PATTERN.test(input)) {\n return `\"${input\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n }\n return input;\n}\n\nfunction quoteWindowsArg(input: string): string {\n return `\"${input.replace(WINDOWS_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction escapeXmlText(input: string): string {\n return input\n .replace(XML_AMPERSAND_PATTERN, AMPERSAND_XML_REPLACEMENT)\n .replace(XML_LESS_THAN_PATTERN, LESS_XML_REPLACEMENT)\n .replace(XML_GREATER_THAN_PATTERN, GREATER_XML_REPLACEMENT)\n .replace(XML_DOUBLE_QUOTE_ESCAPE_PATTERN, QUOTED_XML_REPLACEMENT)\n .replace(XML_SINGLE_QUOTE_PATTERN, APOSTROPHE_XML_REPLACEMENT);\n}\n\nexport function buildSystemdUnitFile(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const command = [\n quoteShellValue(spec.executable),\n ...spec.args.map(quoteShellValue),\n ].join(\" \");\n const workingDirectory = quoteShellValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n );\n const envRows = Object.entries(spec.env).map(\n ([key, value]) =>\n `Environment=${key}=${quoteSystemdEnvironmentValue(value)}`\n );\n return `# Managed by OpenMeld CLI\n[Unit]\nDescription=OpenMeld Daemon Service\nAfter=network-online.target\n\n[Service]\nType=simple\nWorkingDirectory=${workingDirectory}\nExecStart=${command}\nRestart=always\nRestartSec=${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}\n${envRows.join(\"\\n\")}\nStandardOutput=append:${serviceLogPath}\nStandardError=append:${serviceLogPath}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nfunction quoteSystemdEnvironmentValue(value: string): string {\n return `\"${value\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction sanitizeLaunchdEnvironmentValue(value: string): string {\n return sanitizeControlCharacters(value);\n}\n\nfunction sanitizeControlCharacters(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) {\n continue;\n }\n if (code === 0x7f) {\n continue;\n }\n sanitized += char;\n }\n return sanitized;\n}\n\nexport function matchesLaunchdServiceStartupPolicy(\n definition: string\n): boolean {\n return (\n LAUNCHD_PROCESS_TYPE_PATTERN.exec(definition)?.[1] ===\n LAUNCHD_SERVICE_PROCESS_TYPE &&\n LAUNCHD_RESTART_ON_FAILURE_PATTERN.test(definition)\n );\n}\n\n/** Reads only the owned definition; callers report drift through existing diagnostics. */\nexport async function readDaemonServiceStartupPolicyCurrent(input: {\n controller: DaemonServiceController | null;\n status: DaemonServiceManagerRuntimeStatus | null;\n}): Promise<boolean | null> {\n if (\n input.controller !== \"launchd\" ||\n !input.status?.installed ||\n !input.status.definitionPath\n ) {\n return null;\n }\n const definition = await readFile(input.status.definitionPath, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n // An uninstalled definition is not evidence of a scheduling-policy mismatch.\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n return definition === null\n ? null\n : matchesLaunchdServiceStartupPolicy(definition);\n}\n\nexport function buildLaunchdPlist(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const args = [spec.executable, ...spec.args]\n .map((value) => ` <string>${escapeXmlText(value)}</string>`)\n .join(\"\\n\");\n const workingDirectory = escapeXmlText(\n sanitizeLaunchdEnvironmentValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n )\n );\n const envRows = Object.entries(spec.env)\n .filter(([key, value]) => key.trim() !== \"\" && value !== \"\")\n .map(\n ([key, value]) =>\n ` <key>${escapeXmlText(key)}</key>\\n <string>${escapeXmlText(\n sanitizeLaunchdEnvironmentValue(value)\n )}</string>`\n )\n .join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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>${serviceIdentity.launchdLabel}</string>\n <key>ProgramArguments</key>\n <array>\n${args}\n </array>\n <key>WorkingDirectory</key>\n <string>${workingDirectory}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>ProcessType</key>\n <string>${LAUNCHD_SERVICE_PROCESS_TYPE}</string>\n <key>ThrottleInterval</key>\n <integer>${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}</integer>\n <key>EnvironmentVariables</key>\n <dict>\n${envRows}\n </dict>\n <key>StandardOutPath</key>\n <string>${serviceLogPath}</string>\n <key>StandardErrorPath</key>\n <string>${serviceLogPath}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction resolveSystemdUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \".config\",\n \"systemd\",\n \"user\",\n `${serviceIdentity.serviceName}.service`\n );\n}\n\nfunction resolveLaunchdPlistPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \"Library\",\n \"LaunchAgents\",\n `${serviceIdentity.launchdLabel}.plist`\n );\n}\n\nfunction resolveWindowsServiceScriptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n daemonRuntimeRootPath(pathInput),\n `${serviceIdentity.serviceName}-runner.bat`\n );\n}\n\nfunction parseRegexGroup(input: string, pattern: RegExp): string | null {\n const match = input.match(pattern);\n return match?.[1] ?? null;\n}\n\nfunction parseLaunchdEnabled(output: string): boolean {\n const value = parseRegexGroup(output, LAUNCHD_ENABLED_PATTERN);\n return value !== null && value.toLowerCase() === \"true\";\n}\n\nexport function parseLaunchdServiceJobDiagnostics(\n printOutput: string\n): DaemonServiceJobDiagnostics {\n const runsText = parseRegexGroup(printOutput, LAUNCHD_PRINT_RUNS_PATTERN);\n const lastExitCodeText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN\n );\n const propertiesText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PROPERTIES_PATTERN\n );\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: true,\n runs: runsText === null ? null : Number.parseInt(runsText, 10),\n state: parseRegexGroup(printOutput, LAUNCHD_PRINT_STATE_PATTERN),\n lastExitCodeText,\n lastExitCode:\n lastExitCodeText !== null && INTEGER_TEXT_PATTERN.test(lastExitCodeText)\n ? Number.parseInt(lastExitCodeText, 10)\n : null,\n pendedNondemandSpawn: parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN\n ),\n keepaliveRunAtLoad:\n propertiesText !== null &&\n LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN.test(propertiesText) &&\n LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN.test(propertiesText),\n };\n}\n\nexport function isDaemonServiceJobNeverSpawned(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.loaded &&\n diagnostics.runs === 0 &&\n diagnostics.keepaliveRunAtLoad\n );\n}\n\n// A pending spawn is evidence of deferred startup, not of a denied permission.\n// launchd also reports it when the GUI domain is in on-demand-only mode.\nexport function isDaemonServiceJobSpawnPending(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.controller === LAUNCHD_CONTROLLER &&\n isDaemonServiceJobNeverSpawned(diagnostics) &&\n diagnostics.pendedNondemandSpawn !== null\n );\n}\n\nexport function readDaemonServiceJobCrashExitCode(\n diagnostics: DaemonServiceJobDiagnostics\n): number | null {\n if (!diagnostics.loaded) {\n return null;\n }\n if (diagnostics.runs === null || diagnostics.runs <= 0) {\n return null;\n }\n if (diagnostics.lastExitCode === null || diagnostics.lastExitCode === 0) {\n return null;\n }\n return diagnostics.lastExitCode;\n}\n\nexport function formatDaemonServiceJobDiagnosticsEvidence(\n diagnostics: DaemonServiceJobDiagnostics\n): string {\n if (!diagnostics.loaded) {\n return `${diagnostics.controller} job: not loaded`;\n }\n const parts = [\n `state=${diagnostics.state ?? \"unknown\"}`,\n `runs=${diagnostics.runs ?? \"unknown\"}`,\n `last exit code=${diagnostics.lastExitCodeText ?? \"unknown\"}`,\n ...(diagnostics.pendedNondemandSpawn\n ? [`pended nondemand spawn=${diagnostics.pendedNondemandSpawn}`]\n : []),\n ...(diagnostics.keepaliveRunAtLoad\n ? [\"properties=keepalive|runatload\"]\n : []),\n ];\n return `${diagnostics.controller} job: ${parts.join(\", \")}`;\n}\n\nfunction parseLaunchdEnabledFromDisabledServices(\n output: string,\n label: string\n): boolean | null {\n const lines = output.split(\"\\n\");\n for (const line of lines) {\n const match = line.match(LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN);\n if (!match) {\n continue;\n }\n const serviceLabel = match[1];\n const state = match[2];\n if (!(serviceLabel && state) || serviceLabel !== label) {\n continue;\n }\n return state.toLowerCase() === \"enabled\";\n }\n return null;\n}\n\nexport async function installMissingServiceDefinitionFailAtomically(input: {\n definitionWasPresent: boolean;\n install: () => Promise<void>;\n rollbackNewDefinition: () => Promise<void>;\n verifyNewDefinition: () => Promise<void>;\n}): Promise<void> {\n try {\n await input.install();\n await input.verifyNewDefinition();\n } catch (installError) {\n if (input.definitionWasPresent) {\n throw installError;\n }\n try {\n await input.rollbackNewDefinition();\n } catch (rollbackError) {\n throw new AggregateError(\n [installError, rollbackError],\n \"service registration install failed and its new definition could not be rolled back\"\n );\n }\n throw installError;\n }\n}\n\nexport function readSystemdServiceActiveProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ACTIVE_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-active\", result);\n }\n return state === \"active\" || state === \"reloading\";\n}\n\nexport function readSystemdServiceEnabledProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ENABLED_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-enabled\", result);\n }\n return state === \"enabled\" || state === \"enabled-runtime\";\n}\n\nexport function assertServiceManagerProbeSucceeded(\n probe: string,\n result: RunCommandResult\n): void {\n if (result.exitCode !== 0) {\n throw buildServiceManagerProbeError(probe, result);\n }\n}\n\nfunction buildServiceManagerProbeError(\n probe: string,\n result: RunCommandResult\n): Error {\n return new Error(\n [\n `${probe} probe failed`,\n `exitCode=${result.exitCode}`,\n result.stdout.trim(),\n result.stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n );\n}\n\nexport async function runServiceDefinitionRollbackSteps(\n steps: ReadonlyArray<() => Promise<unknown>>\n): Promise<void> {\n const errors: unknown[] = [];\n for (const step of steps) {\n try {\n await step();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n \"one or more service registration rollback steps failed\"\n );\n }\n}\n\nfunction assertServiceRegistrationInstalledAndEnabled(\n controller: DaemonServiceController,\n status: DaemonServiceManagerRuntimeStatus\n): void {\n if (status.installed && status.enabled) {\n return;\n }\n throw new Error(\n `${controller} service registration install did not restore an installed, enabled registration`\n );\n}\n\nfunction buildSystemdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const unitPath = resolveSystemdUnitPath(pathInput);\n const unitName = `${serviceIdentity.serviceName}.service`;\n\n return {\n controller: SYSTEMD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(unitPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(unitPath), { recursive: true });\n await writeFile(unitPath, buildSystemdUnitFile(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n const user = process.env.USER || userInfo().username;\n await runCommand({\n command: \"loginctl\",\n args: [\"enable-linger\", user],\n throwOnError: false,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n }),\n async () => await rm(unitPath, { force: true }),\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildSystemdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n SYSTEMD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: false,\n });\n await rm(unitPath, { force: true });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: false,\n });\n },\n enableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n });\n },\n start: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"stop\", unitName],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(unitPath);\n const activeResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-active\", unitName],\n throwOnError: false,\n });\n const enabledResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-enabled\", unitName],\n throwOnError: false,\n });\n return {\n installed,\n running: readSystemdServiceActiveProbe(activeResult),\n enabled: readSystemdServiceEnabledProbe(enabledResult),\n definitionPath: installed ? unitPath : null,\n commandSummary: installed\n ? await readSystemServiceCommandSummary(unitPath, \"ExecStart=\")\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: SYSTEMD_CONTROLLER,\n path: unitPath,\n })\n : null,\n };\n },\n // systemd does not expose the launchd-style job spawn evidence yet.\n readJobDiagnostics: async () => null,\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return !(status.installed || status.running || status.enabled);\n },\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () =>\n !(await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n };\n}\n\nfunction buildLaunchdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const plistPath = resolveLaunchdPlistPath(pathInput);\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const launchdServiceKey = `${guiDomain}/${serviceIdentity.launchdLabel}`;\n\n return {\n controller: LAUNCHD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(plistPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(plistPath), { recursive: true });\n await writeFile(plistPath, buildLaunchdPlist(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o644,\n });\n await chmod(plistPath, 0o644);\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n }),\n async () => await rm(plistPath, { force: true }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n LAUNCHD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"remove\", serviceIdentity.launchdLabel],\n throwOnError: false,\n });\n await rm(plistPath, { force: true });\n },\n enableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n start: async () => {\n await startLaunchdService({\n serviceKey: launchdServiceKey,\n guiDomain,\n plistPath,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(plistPath);\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n const disabledResult = await runCommand({\n command: \"launchctl\",\n args: [\"print-disabled\", guiDomain],\n throwOnError: false,\n });\n if (printResult.exitCode !== 0 && !isLaunchdServiceMissing(printResult)) {\n throw buildServiceManagerProbeError(\"launchctl print\", printResult);\n }\n assertServiceManagerProbeSucceeded(\n \"launchctl print-disabled\",\n disabledResult\n );\n const output = `${printResult.stdout}\\n${printResult.stderr}`;\n const disabledOutput = `${disabledResult.stdout}\\n${disabledResult.stderr}`;\n const enabledFromDisabledServices =\n parseLaunchdEnabledFromDisabledServices(\n disabledOutput,\n serviceIdentity.launchdLabel\n );\n return {\n installed,\n running: LAUNCHD_STATE_PATTERN.test(output),\n enabled: enabledFromDisabledServices ?? parseLaunchdEnabled(output),\n definitionPath: installed ? plistPath : null,\n commandSummary: installed\n ? await readLaunchdProgramArguments(plistPath)\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: LAUNCHD_CONTROLLER,\n path: plistPath,\n })\n : null,\n };\n },\n readJobDiagnostics: async () => {\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (printResult.exitCode === 0) {\n return parseLaunchdServiceJobDiagnostics(\n `${printResult.stdout}\\n${printResult.stderr}`\n );\n }\n if (isLaunchdServiceMissing(printResult)) {\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: false,\n runs: null,\n state: null,\n lastExitCodeText: null,\n lastExitCode: null,\n pendedNondemandSpawn: null,\n keepaliveRunAtLoad: false,\n };\n }\n return null;\n },\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const [installed, printResult] = await Promise.all([\n pathExists(plistPath),\n runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n }),\n ]);\n return !installed && isLaunchdServiceMissing(printResult);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildLaunchdManager(pathInput).status()).running,\n onTimeout: async () => {\n const manager = buildLaunchdManager(pathInput);\n const status = await manager.status();\n // Diagnostic-only launchd job-state probe on timeout, mirroring the\n // `openmeld service run` startup path so the lifecycle journal can record a\n // never-spawned vs crash-loop verdict. Best-effort; never gates state.\n const jobDiagnostics = manager.readJobDiagnostics\n ? await manager.readJobDiagnostics().catch(() => null)\n : null;\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n jobDiagnostics,\n });\n },\n });\n },\n };\n}\n\nfunction buildWindowsManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const identity = resolveDaemonServiceIdentity(pathInput);\n const scriptPath = resolveWindowsServiceScriptPath(pathInput);\n const task = (operation: WindowsUserTaskRequest[\"operation\"]) =>\n runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation,\n });\n const status = async (): Promise<DaemonServiceManagerRuntimeStatus> => {\n const observed = await task(\"status\");\n if (observed.actionArguments !== null) {\n const action = readWindowsTaskAction(observed.actionArguments);\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: `Task Scheduler: ${identity.windowsServiceName} (current user)`,\n commandSummary: [\n quoteWindowsArg(action.executable),\n ...action.args.map(quoteWindowsArg),\n ].join(\" \"),\n commandSpec: action,\n environmentTarget: serviceEnvironmentTarget(action.env),\n };\n }\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: observed.installed ? scriptPath : null,\n commandSummary: observed.installed\n ? await readWindowsRunnerCommandSummary(scriptPath)\n : null,\n environmentTarget: observed.installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: WINDOWS_CONTROLLER,\n path: scriptPath,\n })\n : null,\n };\n };\n const wait = async (action: \"absent\" | \"stopped\" | \"running\") => {\n await waitForCondition({\n until: async () => {\n const current = await status();\n if (action === \"running\") {\n return current.running;\n }\n return action === \"stopped\" ? !current.running : !current.installed;\n },\n onTimeout: async () =>\n buildSystemServiceWaitTimeoutError({\n action,\n controller: WINDOWS_CONTROLLER,\n details: formatManagerStatusDetails(await status()),\n }),\n });\n };\n return {\n controller: WINDOWS_CONTROLLER,\n install: async (spec) => {\n await ensureServiceLogDirectory(pathInput);\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation: \"install\",\n executable: windowsPowerShellPath(),\n arguments: windowsTaskActionArguments({\n ...spec,\n logPath: getDaemonSystemServiceLogPath(pathInput),\n }),\n workingDirectory:\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput),\n });\n assertServiceRegistrationInstalledAndEnabled(\n WINDOWS_CONTROLLER,\n await status()\n );\n await rm(scriptPath, { force: true });\n },\n uninstall: async () => {\n await task(\"uninstall\");\n await rm(scriptPath, { force: true });\n },\n enableAutostart: async () => {\n await task(\"enable\");\n },\n disableAutostart: async () => {\n await task(\"disable\");\n },\n start: async () => {\n await task(\"enable\");\n await task(\"start\");\n },\n stop: async () => {\n await task(\"disable\");\n await task(\"stop\");\n },\n deactivate: async () => {\n await task(\"stop\");\n },\n status,\n readJobDiagnostics: async () => null,\n waitUntilAbsent: () => wait(\"absent\"),\n waitUntilStopped: () => wait(\"stopped\"),\n waitUntilRunning: () => wait(\"running\"),\n };\n}\n\nexport async function readWindowsRunnerCommandSummary(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const lines = file\n .split(WINDOWS_SCRIPT_LINE_SPLIT_PATTERN)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n const normalizedLine = line.toLowerCase();\n if (\n !(\n normalizedLine === \"@echo off\" ||\n normalizedLine === \"setlocal\" ||\n normalizedLine.startsWith(\"set \")\n )\n ) {\n return line;\n }\n }\n return null;\n}\n\nasync function readSystemServiceCommandSummary(\n path: string,\n prefix: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const line = file\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .find((entry) => entry.startsWith(prefix));\n if (!line) {\n return null;\n }\n return line.slice(prefix.length).trim() || null;\n}\n\nasync function readLaunchdProgramArguments(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const matches = [...file.matchAll(LAUNCHD_STRING_PATTERN)].map(\n (match) => match[1]\n );\n if (matches.length === 0) {\n return null;\n }\n return matches.join(\" \");\n}\n\nconst SERVICE_ENVIRONMENT_TARGET_KEYS = {\n preset: \"OPENMELD_ENV_PRESET\",\n gatewayUrl: \"OPENMELD_GATEWAY_URL\",\n authBaseUrl: \"OPENMELD_AUTH_URL\",\n userFacingCommand: \"OPENMELD_USER_FACING_CLI_COMMAND\",\n} as const;\n\nexport function parseDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): OpenMeldEnvironmentTarget | null {\n return serviceEnvironmentTarget(\n parseDaemonServiceEnvironmentFromDefinition(input)\n );\n}\n\nexport function parseDaemonServiceEnvironmentFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): Record<string, string> {\n if (input.controller === SYSTEMD_CONTROLLER) {\n return parseSystemdEnvironment(input.definition);\n }\n if (input.controller === LAUNCHD_CONTROLLER) {\n return parseLaunchdEnvironment(input.definition);\n }\n return parseWindowsEnvironment(input.definition);\n}\n\nfunction serviceEnvironmentTarget(\n environment: Record<string, string>\n): OpenMeldEnvironmentTarget | null {\n const preset = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.preset];\n const gatewayUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.gatewayUrl];\n const authBaseUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.authBaseUrl];\n const userFacingCommand =\n environment[SERVICE_ENVIRONMENT_TARGET_KEYS.userFacingCommand];\n if (\n !(\n (preset === \"prod\" || preset === \"canary\" || preset === \"dev-local\") &&\n gatewayUrl &&\n authBaseUrl &&\n userFacingCommand\n )\n ) {\n return null;\n }\n return {\n preset,\n gatewayUrl,\n authBaseUrl,\n userFacingCommand,\n };\n}\n\nasync function readDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n path: string;\n}): Promise<OpenMeldEnvironmentTarget | null> {\n const definition = await readFile(input.path, \"utf8\").catch(() => null);\n if (!definition) {\n return null;\n }\n return parseDaemonServiceEnvironmentTargetFromDefinition({\n controller: input.controller,\n definition,\n });\n}\n\nfunction parseSystemdEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line.startsWith(\"Environment=\")) {\n continue;\n }\n const assignment = line.slice(\"Environment=\".length);\n const separatorIndex = assignment.indexOf(\"=\");\n if (separatorIndex <= 0) {\n continue;\n }\n const key = assignment.slice(0, separatorIndex);\n let value = assignment.slice(separatorIndex + 1);\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n }\n environment[key] = value;\n }\n return environment;\n}\n\nfunction parseLaunchdEnvironment(definition: string): Record<string, string> {\n const environmentBlock = definition.match(\n LAUNCHD_ENVIRONMENT_BLOCK_PATTERN\n )?.[1];\n if (!environmentBlock) {\n return {};\n }\n const environment: Record<string, string> = {};\n for (const match of environmentBlock.matchAll(\n /<key>([^<]+)<\\/key>\\s*<string>([^<]*)<\\/string>/g\n )) {\n const key = decodeXmlText(match[1] ?? \"\");\n if (!key) {\n continue;\n }\n environment[key] = decodeXmlText(match[2] ?? \"\");\n }\n return environment;\n}\n\nfunction parseWindowsEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(WINDOWS_LINE_SEPARATOR_PATTERN)) {\n const match = rawLine.trim().match(WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN);\n if (!(match?.[1] && match[2] !== undefined)) {\n continue;\n }\n environment[match[1]] = match[2].replace(/\\\\\"/g, '\"');\n }\n return environment;\n}\n\nfunction decodeXmlText(value: string): string {\n return value\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, \">\")\n .replace(/&lt;/g, \"<\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction isSystemdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"--version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isLaunchdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"launchctl\",\n args: [\"version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isWindowsTaskSchedulerAvailable(): Promise<boolean> {\n return runCommand({\n command: windowsPowerShellPath(),\n args: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"$ErrorActionPreference='Stop'; $s=New-Object -ComObject Schedule.Service; $s.Connect()\",\n ],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nasync function ensureServiceLogDirectory(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(dirname(getDaemonSystemServiceLogPath(pathInput)), {\n recursive: true,\n });\n}\n\nexport function guardDaemonServiceManagerMutations(\n manager: DaemonServiceManager,\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const assertMutationAllowed = async (operation: string): Promise<void> => {\n assertSafePublishedProductionServiceRegistrationMutation(\n operation,\n pathInput\n );\n if (resolveOpenMeldEnvPreset(pathInput) !== \"dev-local\") {\n return;\n }\n const status = await manager.status();\n if (!status.installed) {\n return;\n }\n const env =\n status.commandSpec?.env ??\n (status.definitionPath\n ? parseDaemonServiceEnvironmentFromDefinition({\n controller: manager.controller,\n definition: await readFile(status.definitionPath, \"utf8\"),\n })\n : {});\n if (\n env.OPENMELD_ENV_PRESET !== \"dev-local\" ||\n !env.OPENMELD_HOME ||\n resolve(env.OPENMELD_HOME) !== resolve(resolveOpenMeldRootDir(pathInput))\n ) {\n throw new Error(\n `Cannot ${operation} OpenMeld Service: its registered development home does not match this environment.`\n );\n }\n };\n return {\n ...manager,\n install: async (spec) => {\n await assertMutationAllowed(\"install\");\n await manager.install(spec);\n },\n uninstall: async () => {\n await assertMutationAllowed(\"uninstall\");\n await manager.uninstall();\n },\n enableAutostart: async () => {\n await assertMutationAllowed(\"enable autostart for\");\n await manager.enableAutostart();\n },\n disableAutostart: async () => {\n await assertMutationAllowed(\"disable autostart for\");\n await manager.disableAutostart();\n },\n start: async () => {\n await assertMutationAllowed(\"start\");\n await manager.start();\n },\n stop: async () => {\n await assertMutationAllowed(\"stop\");\n await manager.stop();\n },\n deactivate: async () => {\n await assertMutationAllowed(\"deactivate\");\n await manager.deactivate();\n },\n };\n}\n\nexport async function resolveDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n const manager = await resolveUnguardedDaemonServiceManager(\n controller,\n pathInput\n );\n return manager\n ? guardDaemonServiceManagerMutations(manager, pathInput)\n : null;\n}\n\nasync function resolveUnguardedDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n if (controller === SYSTEMD_CONTROLLER) {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (controller === LAUNCHD_CONTROLLER) {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (controller === WINDOWS_CONTROLLER) {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n if (process.platform === \"darwin\") {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (process.platform === \"linux\") {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (process.platform === \"win32\") {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n return null;\n}\n"],"mappings":"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"}