openmeld 0.3.232 → 0.3.233

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 (102) hide show
  1. package/dist/{add-me-membership-ChntsjGm.js → add-me-membership-_O3IzRLn.js} +2 -2
  2. package/dist/{add-me-membership-ChntsjGm.js.map → add-me-membership-_O3IzRLn.js.map} +1 -1
  3. package/dist/{agents-DruPcNSg.js → agents-B5E7c7sQ.js} +9 -9
  4. package/dist/{agents-DruPcNSg.js.map → agents-B5E7c7sQ.js.map} +1 -1
  5. package/dist/{api-client-foundation-CDj_9Rks.js → api-client-foundation-1p1VVFJ_.js} +1 -1
  6. package/dist/{api-client-foundation-EZpFLGVC.js → api-client-foundation-C-RPnq_p.js} +3 -3
  7. package/dist/{api-client-foundation-EZpFLGVC.js.map → api-client-foundation-C-RPnq_p.js.map} +1 -1
  8. package/dist/auth-session-CmjjkLiB.js +4 -0
  9. package/dist/{auth-session-DhSHCYvl.js → auth-session-iXCJO5oB.js} +4 -4
  10. package/dist/{auth-session-DhSHCYvl.js.map → auth-session-iXCJO5oB.js.map} +1 -1
  11. package/dist/{channel-tvFZSSVr.js → channel-BciBrA3Y.js} +4 -4
  12. package/dist/{channel-tvFZSSVr.js.map → channel-BciBrA3Y.js.map} +1 -1
  13. package/dist/{cli-binary-manifest-Bjf6T7Ef.js → cli-binary-manifest-ETxqCzfS.js} +8 -1
  14. package/dist/cli-binary-manifest-ETxqCzfS.js.map +1 -0
  15. package/dist/{command-0yoZa1GT.js → command-D0pcAIoE.js} +16 -16
  16. package/dist/{command-0yoZa1GT.js.map → command-D0pcAIoE.js.map} +1 -1
  17. package/dist/{computer-connection-CoBDorh6.js → computer-connection-CHP1-0rK.js} +2 -2
  18. package/dist/{computer-connection-CoBDorh6.js.map → computer-connection-CHP1-0rK.js.map} +1 -1
  19. package/dist/{computer-connection-review-Dy7p1LXZ.js → computer-connection-review-dHotFqmD.js} +5 -5
  20. package/dist/{computer-connection-review-Dy7p1LXZ.js.map → computer-connection-review-dHotFqmD.js.map} +1 -1
  21. package/dist/{computer-disconnect-4Ks_DVXV.js → computer-disconnect-B2DLDxWx.js} +7 -7
  22. package/dist/{computer-disconnect-4Ks_DVXV.js.map → computer-disconnect-B2DLDxWx.js.map} +1 -1
  23. package/dist/{computer-setup-continuation-ZcQb7MvI.js → computer-setup-continuation-Cv_c1B-7.js} +3 -3
  24. package/dist/{computer-setup-continuation-ZcQb7MvI.js.map → computer-setup-continuation-Cv_c1B-7.js.map} +1 -1
  25. package/dist/{context-BPIoofMa.js → context-BnhlFS8m.js} +3 -3
  26. package/dist/{context-BPIoofMa.js.map → context-BnhlFS8m.js.map} +1 -1
  27. package/dist/{control-plane-rTE2rHZ5.js → control-plane-QqGL-jtT.js} +2 -2
  28. package/dist/{control-plane-rTE2rHZ5.js.map → control-plane-QqGL-jtT.js.map} +1 -1
  29. package/dist/{daemon-device-id-DDazRZUV.js → daemon-device-id-DbSIqHoZ.js} +5 -5
  30. package/dist/{daemon-device-id-DDazRZUV.js.map → daemon-device-id-DbSIqHoZ.js.map} +1 -1
  31. package/dist/{daemon-lifecycle-journal-CRxQL9m6.js → daemon-lifecycle-journal-DsVVvKJe.js} +6 -6
  32. package/dist/{daemon-lifecycle-journal-CRxQL9m6.js.map → daemon-lifecycle-journal-DsVVvKJe.js.map} +1 -1
  33. package/dist/{daemon-service-runtime-BTzL0w6s.js → daemon-service-runtime-DZI6Ke3_.js} +4 -4
  34. package/dist/{daemon-service-runtime-BTzL0w6s.js.map → daemon-service-runtime-DZI6Ke3_.js.map} +1 -1
  35. package/dist/{daemon-service-update-coordinator-BDs0p4bA.js → daemon-service-update-coordinator-BgVBlJ4d.js} +13 -13
  36. package/dist/{daemon-service-update-coordinator-BDs0p4bA.js.map → daemon-service-update-coordinator-BgVBlJ4d.js.map} +1 -1
  37. package/dist/{dispatch-owned-runtime-CK2YJ2Oo.js → dispatch-owned-runtime-BeIQetEt.js} +9 -9
  38. package/dist/{dispatch-owned-runtime-CK2YJ2Oo.js.map → dispatch-owned-runtime-BeIQetEt.js.map} +1 -1
  39. package/dist/{dist-Bw6OBFYo.js → dist-BgYBvEBB.js} +13 -7
  40. package/dist/dist-BgYBvEBB.js.map +1 -0
  41. package/dist/{dist--TaSMxQz.js → dist-DQS0XYkb.js} +3 -3
  42. package/dist/{dist--TaSMxQz.js.map → dist-DQS0XYkb.js.map} +1 -1
  43. package/dist/{dist-B12upl5l.js → dist-z72xYz5Z.js} +1 -1
  44. package/dist/{elapsed-time-C3nfbdd9.js → elapsed-time-C7S-6bWV.js} +6 -6
  45. package/dist/{elapsed-time-C3nfbdd9.js.map → elapsed-time-C7S-6bWV.js.map} +1 -1
  46. package/dist/{entry-De__5RVq.js → entry-CX24qHnm.js} +7 -7
  47. package/dist/{entry-De__5RVq.js.map → entry-CX24qHnm.js.map} +1 -1
  48. package/dist/{installation-inventory-Bq8iZfSa.js → installation-inventory-B3mwQFEA.js} +3 -3
  49. package/dist/{installation-inventory-Bq8iZfSa.js.map → installation-inventory-B3mwQFEA.js.map} +1 -1
  50. package/dist/{installer-C7iSAOSz.js → installer-DnIJ4y3l.js} +2 -2
  51. package/dist/{installer-C7iSAOSz.js.map → installer-DnIJ4y3l.js.map} +1 -1
  52. package/dist/{local-components-DleLEzSU.js → local-components-DJiMS67S.js} +36 -3
  53. package/dist/local-components-DJiMS67S.js.map +1 -0
  54. package/dist/{meta-api-BpwJWE22.js → meta-api-DgHkiIdr.js} +4 -4
  55. package/dist/{meta-api-BpwJWE22.js.map → meta-api-DgHkiIdr.js.map} +1 -1
  56. package/dist/{openmeld-C0OSZJtn.js → openmeld-kYp99hOl.js} +32 -32
  57. package/dist/{openmeld-C0OSZJtn.js.map → openmeld-kYp99hOl.js.map} +1 -1
  58. package/dist/{openmeld-maintenance-worker-DY90mkWW.js → openmeld-maintenance-worker-BqU1Asrm.js} +9 -9
  59. package/dist/{openmeld-maintenance-worker-DY90mkWW.js.map → openmeld-maintenance-worker-BqU1Asrm.js.map} +1 -1
  60. package/dist/{openmeld-tools-update-join-DgzNuaDy.js → openmeld-tools-update-join-BKJnGR5h.js} +4 -4
  61. package/dist/{openmeld-tools-update-join-DgzNuaDy.js.map → openmeld-tools-update-join-BKJnGR5h.js.map} +1 -1
  62. package/dist/{openmeld-tools-update-process-frame-DbEZ3fEh.js → openmeld-tools-update-process-frame-Csy2XKUf.js} +1 -1
  63. package/dist/{openmeld-tools-update-process-frame-BtFKp70p.js → openmeld-tools-update-process-frame-YLOS82E3.js} +2 -2
  64. package/dist/{openmeld-tools-update-process-frame-BtFKp70p.js.map → openmeld-tools-update-process-frame-YLOS82E3.js.map} +1 -1
  65. package/dist/openmeld.js +5 -5
  66. package/dist/{prepare-provider-runtime-BGdfbFyZ.js → prepare-provider-runtime-CD6XRt7X.js} +374 -175
  67. package/dist/prepare-provider-runtime-CD6XRt7X.js.map +1 -0
  68. package/dist/{prepare-session-executor-CA1gq8dR.js → prepare-session-executor-DY2s4FuY.js} +19 -19
  69. package/dist/{prepare-session-executor-CA1gq8dR.js.map → prepare-session-executor-DY2s4FuY.js.map} +1 -1
  70. package/dist/{process-channel-C1wRGUmk.js → process-channel-CzgOWiuh.js} +2 -2
  71. package/dist/{process-channel-C1wRGUmk.js.map → process-channel-CzgOWiuh.js.map} +1 -1
  72. package/dist/{runtime-DFlEdls4.js → runtime-Br4Ga0rJ.js} +17 -17
  73. package/dist/{runtime-DFlEdls4.js.map → runtime-Br4Ga0rJ.js.map} +1 -1
  74. package/dist/{runtime-agent-controller-reporting-submission-C_xD2A-P.js → runtime-agent-controller-reporting-submission-CQjbBiHh.js} +139 -33
  75. package/dist/runtime-agent-controller-reporting-submission-CQjbBiHh.js.map +1 -0
  76. package/dist/{runtime-reporting-health-state-_bvJcV1y.js → runtime-reporting-health-state-a1FUE1S-.js} +13 -12
  77. package/dist/{runtime-reporting-health-state-_bvJcV1y.js.map → runtime-reporting-health-state-a1FUE1S-.js.map} +1 -1
  78. package/dist/{runtime-transport-DH8Ks-AU.js → runtime-transport-D4CVffnp.js} +3 -3
  79. package/dist/{runtime-transport-DH8Ks-AU.js.map → runtime-transport-D4CVffnp.js.map} +1 -1
  80. package/dist/{service-KHA_Yv8q.js → service-D9QVc4_y.js} +56 -20
  81. package/dist/service-D9QVc4_y.js.map +1 -0
  82. package/dist/{service-account-authorization-BHWs8cRP.js → service-account-authorization-DLhUgGDb.js} +2 -2
  83. package/dist/{service-account-authorization-BHWs8cRP.js.map → service-account-authorization-DLhUgGDb.js.map} +1 -1
  84. package/dist/{service-account-control-BcHjpVid.js → service-account-control-DIdQILmo.js} +9 -9
  85. package/dist/{service-account-control-BcHjpVid.js.map → service-account-control-DIdQILmo.js.map} +1 -1
  86. package/dist/{service-control-capabilities-DTKD2-o0.js → service-control-capabilities-BvHU_NcX.js} +1 -1
  87. package/dist/{service-control-capabilities-B4433dGT.js → service-control-capabilities-CGv5Cuxo.js} +3 -3
  88. package/dist/{service-control-capabilities-B4433dGT.js.map → service-control-capabilities-CGv5Cuxo.js.map} +1 -1
  89. package/dist/{state-iJqU2XWw.js → state-AWe5DSV8.js} +2 -2
  90. package/dist/{state-iJqU2XWw.js.map → state-AWe5DSV8.js.map} +1 -1
  91. package/dist/upgrade-CLnZ4WBF.js +4 -0
  92. package/dist/{upgrade-DlBDEvs4.js → upgrade-CcnlL7FH.js} +8 -8
  93. package/dist/{upgrade-DlBDEvs4.js.map → upgrade-CcnlL7FH.js.map} +1 -1
  94. package/package.json +14 -14
  95. package/dist/auth-session-BOG3gV2K2.js +0 -4
  96. package/dist/cli-binary-manifest-Bjf6T7Ef.js.map +0 -1
  97. package/dist/dist-Bw6OBFYo.js.map +0 -1
  98. package/dist/local-components-DleLEzSU.js.map +0 -1
  99. package/dist/prepare-provider-runtime-BGdfbFyZ.js.map +0 -1
  100. package/dist/runtime-agent-controller-reporting-submission-C_xD2A-P.js.map +0 -1
  101. package/dist/service-KHA_Yv8q.js.map +0 -1
  102. package/dist/upgrade-CuzsgsKh.js +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-lifecycle-journal-CRxQL9m6.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 { createHash } from \"node:crypto\";\nimport { 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 resolveCliBinaryPlatform,\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 // Cache identity only; the managed installation owns channel selection.\n release_source?: string;\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 releaseSource = toNonEmptyString(parsed.release_source);\n const selectedSource = currentReleaseSource();\n const sourceMatches = releaseSource\n ? releaseSource === selectedSource\n : selectedSource === \"npm\" ||\n selectedSource === binaryReleaseSource(DEFAULT_CLI_BINARY_MANIFEST_URL);\n const next: OpenMeldVersionStateV1 = {\n v: 1,\n ...(lastVersion ? { last_version: lastVersion } : {}),\n ...(sourceMatches && latestVersion\n ? { latest_version: latestVersion }\n : {}),\n ...(sourceMatches && lastCheckedAt\n ? { last_checked_at: lastCheckedAt }\n : {}),\n ...(!sourceMatches || dismissedVersion === undefined\n ? {}\n : { dismissed_version: dismissedVersion }),\n ...(sourceMatches && requiredFloor !== undefined\n ? { required_floor: requiredFloor }\n : {}),\n ...(releaseSource ? { release_source: releaseSource } : {}),\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 release_source: currentReleaseSource(),\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 release_source: currentReleaseSource(),\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) ??\n resolveCliBinaryPlatform(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 DEFAULT_CLI_BINARY_MANIFEST_URL = \"https://openmeld.ai/cli/manifest.json\";\nconst CLI_BINARY_MANIFEST_URL =\n toNonEmptyString(process.env.OPENMELD_CLI_BINARY_MANIFEST_URL) ??\n DEFAULT_CLI_BINARY_MANIFEST_URL;\n\nfunction currentReleaseSource(): string {\n return isBinaryDistribution()\n ? binaryReleaseSource(CLI_BINARY_MANIFEST_URL)\n : \"npm\";\n}\n\nfunction binaryReleaseSource(url: string): string {\n // Cache keys must distinguish channels without persisting custom URLs that\n // might contain credentials in a development environment.\n return `binary:${createHash(\"sha256\").update(url).digest(\"hex\")}`;\n}\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
+ {"version":3,"file":"daemon-lifecycle-journal-DsVVvKJe.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 { createHash } from \"node:crypto\";\nimport { 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 resolveCliBinaryPlatform,\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 // Cache identity only; the managed installation owns channel selection.\n release_source?: string;\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 releaseSource = toNonEmptyString(parsed.release_source);\n const selectedSource = currentReleaseSource();\n const sourceMatches = releaseSource\n ? releaseSource === selectedSource\n : selectedSource === \"npm\" ||\n selectedSource === binaryReleaseSource(DEFAULT_CLI_BINARY_MANIFEST_URL);\n const next: OpenMeldVersionStateV1 = {\n v: 1,\n ...(lastVersion ? { last_version: lastVersion } : {}),\n ...(sourceMatches && latestVersion\n ? { latest_version: latestVersion }\n : {}),\n ...(sourceMatches && lastCheckedAt\n ? { last_checked_at: lastCheckedAt }\n : {}),\n ...(!sourceMatches || dismissedVersion === undefined\n ? {}\n : { dismissed_version: dismissedVersion }),\n ...(sourceMatches && requiredFloor !== undefined\n ? { required_floor: requiredFloor }\n : {}),\n ...(releaseSource ? { release_source: releaseSource } : {}),\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 release_source: currentReleaseSource(),\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 release_source: currentReleaseSource(),\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) ??\n resolveCliBinaryPlatform(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 DEFAULT_CLI_BINARY_MANIFEST_URL = \"https://openmeld.ai/cli/manifest.json\";\nconst CLI_BINARY_MANIFEST_URL =\n toNonEmptyString(process.env.OPENMELD_CLI_BINARY_MANIFEST_URL) ??\n DEFAULT_CLI_BINARY_MANIFEST_URL;\n\nfunction currentReleaseSource(): string {\n return isBinaryDistribution()\n ? binaryReleaseSource(CLI_BINARY_MANIFEST_URL)\n : \"npm\";\n}\n\nfunction binaryReleaseSource(url: string): string {\n // Cache keys must distinguish channels without persisting custom URLs that\n // might contain credentials in a development environment.\n return `binary:${createHash(\"sha256\").update(url).digest(\"hex\")}`;\n}\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,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { C as openMeldManagedBinaryName, E as openMeldManagedVersionDir, F as resolveOpenMeldRootDir, L as resolveOpenMeldServiceScope, O as openMeldVersionsDir, P as resolveOpenMeldEnvPreset, S as openMeldBinDir, T as openMeldManagedVersionBinaryPath, t as OPENMELD_HOME_ENV_KEY, w as openMeldManagedBinaryPath } from "./paths-De9xdA2h.js";
4
+ import { T as openMeldToolsUpdateRequestSourceSchema, x as openMeldToolsUpdateOperationPhaseSchema } from "./local-components-DJiMS67S.js";
4
5
  import { i as windowsPublisherNameSchema, n as WINDOWS_PROCESS_HELPER_FILENAME } from "./windows-artifact-D99JU1ll.js";
5
- import { a as cliBinaryServiceReleaseSchema, n as OPENMELD_MACOS_CLI_SIGNING_REQUIREMENT, o as resolveCliBinaryPlatform, r as cliBinaryDeltaPatchSchema, t as OPENMELD_MACOS_CLI_SIGNING_IDENTITY } from "./cli-binary-manifest-Bjf6T7Ef.js";
6
- import { b as openMeldToolsUpdateOperationPhaseSchema, w as openMeldToolsUpdateRequestSourceSchema } from "./local-components-DleLEzSU.js";
6
+ import { a as cliBinaryServiceReleaseSchema, n as OPENMELD_MACOS_CLI_SIGNING_REQUIREMENT, o as resolveCliBinaryPlatform, r as cliBinaryDeltaPatchSchema, t as OPENMELD_MACOS_CLI_SIGNING_IDENTITY } from "./cli-binary-manifest-ETxqCzfS.js";
7
7
  import { r as readDaemonRuntimeLease } from "./daemon-runtime-lease-Bv6vhqOe.js";
8
8
  import { l as resolveWindowsPowerShellPath, o as powerShellEncodedArguments, s as pruneWindowsBinaryBundle } from "./process-identity-BRbhGGTM.js";
9
9
  import { a as isOpenMeldOrphanedLockError, d as runWithHeldLock, i as isOpenMeldLockError, t as acquireLock } from "./lock-BMI00i2F.js";
@@ -12,7 +12,7 @@ import { n as resolveOpenMeldDistribution, t as isBinaryDistribution } from "./d
12
12
  import { A as getDaemonStatus, C as daemonServiceStableBinaryExecutablePath, D as daemonStatePath, E as daemonServiceUpdateWorkerBinaryExecutablePath, T as daemonServiceStableLauncherPath, U as uninstallDaemon, _ as daemonRuntimeStateRootPath, a as DAEMON_SERVICE_RUNTIME_MODE_ENV, b as daemonServiceLegacyExecutableWrapperPath, g as daemonRuntimeServiceManagerPath, h as daemonRuntimeRootPath, i as DAEMON_SERVICE_RUNTIME_DETACHED_ENV, k as getDaemonRuntimeStatus, l as clearDaemonServiceRuntimeState, n as DAEMON_SERVICE_RUNTIME_AUTO_START_ENV, p as daemonRuntimeBundlesPath, r as DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV, s as DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV, t as DAEMON_HEARTBEAT_STALE_MS, v as daemonServiceActiveBundleStatePath, w as daemonServiceStableExecutableWrapperPath, x as daemonServiceRecognizedExecutablePaths$1, y as daemonServiceExecutableWrapperPaths$1 } from "./daemon-state-Dte9re5V.js";
13
13
  import { t as assertNoPublishedProductionMutationDuringTests } from "./published-production-safety-zANGAGDI.js";
14
14
  import { i as readDaemonServiceContract } from "./daemon-service-contract-COPKbCy_.js";
15
- import { d as compareSemver, l as OPENMELD_VERSION, t as emitDaemonLifecycleEvent, v as package_default } from "./daemon-lifecycle-journal-CRxQL9m6.js";
15
+ import { d as compareSemver, l as OPENMELD_VERSION, t as emitDaemonLifecycleEvent, v as package_default } from "./daemon-lifecycle-journal-DsVVvKJe.js";
16
16
  import { a as reconcileWindowsManagedLauncher, i as readWindowsManagedCliVersion, n as placeWindowsManagedVersion, t as activateWindowsManagedCli } from "./windows-managed-install-BVlswqjA.js";
17
17
  import { a as expectedBinaryServiceFingerprint, c as verifyWindowsServiceSubsystem, l as windowsMaintenanceBinaryPath, o as hashBinaryServiceBundle, s as prepareWindowsMaintenanceBinary } from "./windows-user-task-CTsMnmD4.js";
18
18
  import { t as sleep } from "./dist-BLuEEVHh.js";
@@ -3314,4 +3314,4 @@ async function readObservedRuntimeState() {
3314
3314
  //#endregion
3315
3315
  export { readPendingDaemonServiceUpdate as $, prepareDaemonServiceBundle as A, resolveDaemonServiceArtifact as B, daemonServiceExecutableWrapperPath as C, ensureDaemonServiceStableBinaryExecutable as D, discardPreparedDaemonServiceBundle as E, restoreDaemonActiveBundleStateSnapshot as F, readManagedCliInstallation as G, buildInstallSelfJsonPayload as H, runAuditedServiceManagerCarrierMutation as I, withManagedInstallTransaction as J, reconcileManagedCliLauncher as K, verifyDaemonActiveBundleIntegrity as L, resolveAlignedDaemonActiveBundleEntryPath as M, resolveDaemonBundleEntryPathFromState as N, ensureDaemonServiceUpdateWorkerBinaryExecutable as O, resolveInstalledDaemonBundleFingerprint as P, readLastDaemonServiceUpdate as Q, writeDaemonServiceExecutableWrapper as R, daemonServiceBinaryExecutablePath as S, daemonServiceUpdateWorkerBinaryPath as T, performManagedInstall as U, collectLocalOperationFailure as V, pruneManagedInstallVersions as W, completePendingDaemonServiceUpdate as X, DAEMON_SERVICE_UPDATE_JOB_SCHEMA as Y, persistPendingDaemonServiceUpdate as Z, matchesExpectedDaemonServiceManagerDefinition as _, resolveDaemonRuntimeState as a, resolveDaemonServiceUpdateWorkerIdentity as at, cleanupInactiveDaemonServiceBundles as b, resolveObservedDaemonRuntimeStatus as c, resolveDaemonServiceUpdateWorkerSystemdTimerUnitPath as ct, inspectLegacySharedDaemonService as d, DEFAULT_CLI_BINARY_DOWNLOAD_POLICY as dt, resolveBundledServiceRelease as et, listDaemonOwnedProcesses as f, allowUnsignedWindowsInternalPreview as ft, assertDaemonMaintenanceInstallationOwnership as g, verifyCliBinaryCodeSignature as gt, resolveDaemonBundleIdFromEntryPath as h, resolveCliBinaryUpdatePlan as ht, readCurrentObservedDaemonRuntimeStatus as i, hasIndependentMaintenanceRegistration as it, readDaemonActiveBundleState as j, isDaemonBundleSourceAllowedForLane as k, resolveObservedRuntimeCommandEntryPath as l, resolveDaemonServiceUpdateWorkerSystemdUnitPath as lt, normalizeDaemonCommandPath as m, prepareCliBinaryProcessHelper as mt, getEffectiveDaemonRuntimeStatus as n, configureDaemonMaintenanceEnvironment as nt, resolveDaemonServiceManagerForRuntimeState as o, resolveDaemonServiceUpdateWorkerLaunchdPlistPath as ot, extractDaemonCommandEntryPath as p, downloadCliBinaryUpdateArtifact as pt, resolveCliSelfVersion as q, readCurrentDaemonRuntimeContext as r, daemonServiceUpdateWorkerNpmEntryPath as rt, waitForDaemonSystemServiceToStop as s, resolveDaemonServiceUpdateWorkerSystemdPathUnitPath as st, clearDaemonRuntimeStateIfDefinitelyStopped as t, INDEPENDENT_MAINTENANCE_REGISTRATION as tt, cleanupLegacySharedDaemonServiceState as u, resolveDaemonServiceUpdateWorkerWindowsScriptPath as ut, isOpenMeldManagedBinaryPath as v, daemonServiceLauncherPath as w, clearDaemonServiceUpdateWorkerBinaryExecutable as x, activateDaemonServiceBundle as y, writeDaemonServiceLauncher as z };
3316
3316
 
3317
- //# sourceMappingURL=daemon-service-runtime-BTzL0w6s.js.map
3317
+ //# sourceMappingURL=daemon-service-runtime-DZI6Ke3_.js.map