openmeld 0.3.217 → 0.3.219

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/dist/{add-me-membership-C2Ys6Gq2.js → add-me-membership-DUspkb62.js} +2 -2
  3. package/dist/{add-me-membership-C2Ys6Gq2.js.map → add-me-membership-DUspkb62.js.map} +1 -1
  4. package/dist/{agents-ClqMS9aO.js → agents-B0LFMdki.js} +9 -9
  5. package/dist/{agents-ClqMS9aO.js.map → agents-B0LFMdki.js.map} +1 -1
  6. package/dist/{api-client-foundation-CMVD057A.js → api-client-foundation-DJ9KlXwz.js} +1 -1
  7. package/dist/{api-client-foundation-Cib1elkI.js → api-client-foundation-Dmjk9vVk.js} +3 -3
  8. package/dist/{api-client-foundation-Cib1elkI.js.map → api-client-foundation-Dmjk9vVk.js.map} +1 -1
  9. package/dist/{auth-session-DOjVKRI_.js → auth-session-CDhQANWx.js} +22 -6
  10. package/dist/auth-session-CDhQANWx.js.map +1 -0
  11. package/dist/auth-session-DsBkEFct.js +4 -0
  12. package/dist/{channel-BfTy6fDo.js → channel-D5ABuavH.js} +3 -3
  13. package/dist/{channel-BfTy6fDo.js.map → channel-D5ABuavH.js.map} +1 -1
  14. package/dist/{cli-space-api-BT_Pu9Yg.js → cli-space-api-DVfyQOhC.js} +6 -6
  15. package/dist/{cli-space-api-BT_Pu9Yg.js.map → cli-space-api-DVfyQOhC.js.map} +1 -1
  16. package/dist/{command-C1w0UpIu.js → command-CFDUoorG.js} +15 -15
  17. package/dist/{command-C1w0UpIu.js.map → command-CFDUoorG.js.map} +1 -1
  18. package/dist/{computer-connection-DsjsjmPp.js → computer-connection-DYnof5Xw.js} +2 -2
  19. package/dist/{computer-connection-DsjsjmPp.js.map → computer-connection-DYnof5Xw.js.map} +1 -1
  20. package/dist/{computer-connection-review-RXJyryCh.js → computer-connection-review-Brrrl6Hk.js} +5 -5
  21. package/dist/{computer-connection-review-RXJyryCh.js.map → computer-connection-review-Brrrl6Hk.js.map} +1 -1
  22. package/dist/{computer-disconnect-B_LZM2QE.js → computer-disconnect-B0BqUt8x.js} +7 -7
  23. package/dist/{computer-disconnect-B_LZM2QE.js.map → computer-disconnect-B0BqUt8x.js.map} +1 -1
  24. package/dist/{computer-setup-continuation-BVI7SD0M.js → computer-setup-continuation-BWwd7hfl.js} +3 -3
  25. package/dist/{computer-setup-continuation-BVI7SD0M.js.map → computer-setup-continuation-BWwd7hfl.js.map} +1 -1
  26. package/dist/{context-Di5R4iik.js → context-D9Ebb5wl.js} +4 -4
  27. package/dist/{context-Di5R4iik.js.map → context-D9Ebb5wl.js.map} +1 -1
  28. package/dist/{daemon-device-id-bfkbZj9G.js → daemon-device-id-YnLMx1kN.js} +5 -5
  29. package/dist/{daemon-device-id-bfkbZj9G.js.map → daemon-device-id-YnLMx1kN.js.map} +1 -1
  30. package/dist/{daemon-frame-transport-saNQVOyi.js → daemon-frame-transport-BOZpAMMJ.js} +34 -7
  31. package/dist/daemon-frame-transport-BOZpAMMJ.js.map +1 -0
  32. package/dist/{daemon-lifecycle-journal-DP01txRB.js → daemon-lifecycle-journal-Bp0fPeui.js} +7 -8
  33. package/dist/{daemon-lifecycle-journal-DP01txRB.js.map → daemon-lifecycle-journal-Bp0fPeui.js.map} +1 -1
  34. package/dist/{daemon-service-manager-CRHq3YSj.js → daemon-service-manager-ReGjcyjq.js} +1 -1
  35. package/dist/{daemon-service-manager-CXbN836B.js → daemon-service-manager-rNRRVrj1.js} +2 -2
  36. package/dist/{daemon-service-manager-CXbN836B.js.map → daemon-service-manager-rNRRVrj1.js.map} +1 -1
  37. package/dist/{daemon-service-runtime-DpiD8oap.js → daemon-service-runtime-BYWOcDb7.js} +5 -5
  38. package/dist/{daemon-service-runtime-DpiD8oap.js.map → daemon-service-runtime-BYWOcDb7.js.map} +1 -1
  39. package/dist/{daemon-service-update-coordinator-BuCEBJoe.js → daemon-service-update-coordinator-Cf4NtdK7.js} +16 -12
  40. package/dist/daemon-service-update-coordinator-Cf4NtdK7.js.map +1 -0
  41. package/dist/{dist-DkRliHib.js → dist-B6Z-8B4v.js} +44 -4
  42. package/dist/dist-B6Z-8B4v.js.map +1 -0
  43. package/dist/{dist-BdibASYs.js → dist-ChS52b_E.js} +2 -2
  44. package/dist/{dist-BdibASYs.js.map → dist-ChS52b_E.js.map} +1 -1
  45. package/dist/{dist-RR7jryeV.js → dist-uyFidGQU.js} +1 -1
  46. package/dist/{elapsed-time-CR9OIZSD.js → elapsed-time-BP84Tz_l.js} +5 -5
  47. package/dist/{elapsed-time-CR9OIZSD.js.map → elapsed-time-BP84Tz_l.js.map} +1 -1
  48. package/dist/{entry-CSoHtCQ9.js → entry-B4G_hqId.js} +7 -7
  49. package/dist/{entry-CSoHtCQ9.js.map → entry-B4G_hqId.js.map} +1 -1
  50. package/dist/{installation-inventory-CscX0nmD.js → installation-inventory-vyAkTNzT.js} +3 -3
  51. package/dist/{installation-inventory-CscX0nmD.js.map → installation-inventory-vyAkTNzT.js.map} +1 -1
  52. package/dist/{installer-CkF3gSdD.js → installer-Cw05xb5l.js} +2 -2
  53. package/dist/{installer-CkF3gSdD.js.map → installer-Cw05xb5l.js.map} +1 -1
  54. package/dist/native/openmeld-keychain.node +0 -0
  55. package/dist/{open-code-permission-Doem1R2N.js → open-code-permission-DHFJYc_o.js} +5 -1
  56. package/dist/open-code-permission-DHFJYc_o.js.map +1 -0
  57. package/dist/{openmeld-BcyBlby4.js → openmeld-CheYNGUc.js} +238 -43
  58. package/dist/openmeld-CheYNGUc.js.map +1 -0
  59. package/dist/openmeld-dev.js +0 -0
  60. package/dist/{openmeld-maintenance-worker-Brsfy22C.js → openmeld-maintenance-worker-BlGoUmXC.js} +10 -10
  61. package/dist/{openmeld-maintenance-worker-Brsfy22C.js.map → openmeld-maintenance-worker-BlGoUmXC.js.map} +1 -1
  62. package/dist/{openmeld-tools-update-join-CUh0JERe.js → openmeld-tools-update-join-BZp2dx06.js} +4 -4
  63. package/dist/{openmeld-tools-update-join-CUh0JERe.js.map → openmeld-tools-update-join-BZp2dx06.js.map} +1 -1
  64. package/dist/openmeld.js +4 -4
  65. package/dist/{prepare-provider-runtime-DxaGSe3R.js → prepare-provider-runtime-niE5QEAv.js} +100 -74
  66. package/dist/prepare-provider-runtime-niE5QEAv.js.map +1 -0
  67. package/dist/{prepare-session-executor-CyouBl49.js → prepare-session-executor-DhWSYpJX.js} +19 -19
  68. package/dist/{prepare-session-executor-CyouBl49.js.map → prepare-session-executor-DhWSYpJX.js.map} +1 -1
  69. package/dist/{process-channel-Cocpv3Br.js → process-channel-B2BU2X7x.js} +2 -2
  70. package/dist/{process-channel-Cocpv3Br.js.map → process-channel-B2BU2X7x.js.map} +1 -1
  71. package/dist/{runtime-DGT66AR-.js → runtime-COI2XGXX.js} +142 -21
  72. package/dist/runtime-COI2XGXX.js.map +1 -0
  73. package/dist/{runtime-agent-controller-reporting-submission-C1Vc_JWm.js → runtime-agent-controller-reporting-submission-BgkhnPU5.js} +8 -8
  74. package/dist/{runtime-agent-controller-reporting-submission-C1Vc_JWm.js.map → runtime-agent-controller-reporting-submission-BgkhnPU5.js.map} +1 -1
  75. package/dist/{runtime-reporting-health-state-CPWlQ5IX.js → runtime-reporting-health-state-HhsHeySN.js} +9 -36
  76. package/dist/runtime-reporting-health-state-HhsHeySN.js.map +1 -0
  77. package/dist/{runtime-transport-BLtOFrtv.js → runtime-transport-0F5E6So6.js} +73 -2
  78. package/dist/runtime-transport-0F5E6So6.js.map +1 -0
  79. package/dist/{service-ClETdJbz.js → service-CgAFfq0Y.js} +21 -21
  80. package/dist/service-CgAFfq0Y.js.map +1 -0
  81. package/dist/{service-account-authorization-kciEaW5t.js → service-account-authorization-DAPQy2yP.js} +2 -2
  82. package/dist/{service-account-authorization-kciEaW5t.js.map → service-account-authorization-DAPQy2yP.js.map} +1 -1
  83. package/dist/{service-account-control-3n_YwNsF.js → service-account-control-DiLG-w18.js} +10 -10
  84. package/dist/{service-account-control-3n_YwNsF.js.map → service-account-control-DiLG-w18.js.map} +1 -1
  85. package/dist/{service-control-capabilities-DoW5MW7A.js → service-control-capabilities-BP8sLHBA.js} +1 -1
  86. package/dist/{service-control-capabilities-C2tMMuFl.js → service-control-capabilities-DEiDpmzc.js} +4 -4
  87. package/dist/{service-control-capabilities-C2tMMuFl.js.map → service-control-capabilities-DEiDpmzc.js.map} +1 -1
  88. package/dist/{state-CMs4p0wo.js → state-Cwf0cTLu.js} +2 -2
  89. package/dist/{state-CMs4p0wo.js.map → state-Cwf0cTLu.js.map} +1 -1
  90. package/dist/{upgrade-2epQATRq.js → upgrade-CaPzHLuW.js} +14 -7
  91. package/dist/upgrade-CaPzHLuW.js.map +1 -0
  92. package/dist/upgrade-DYxQKdbJ.js +4 -0
  93. package/dist/{windows-user-task-CSJpDs-S.js → windows-user-task-D4uMvea3.js} +84 -3
  94. package/dist/windows-user-task-D4uMvea3.js.map +1 -0
  95. package/dist/{windows-user-task-CWDzkJCq.js → windows-user-task-hNE24Gqr.js} +1 -1
  96. package/package.json +41 -43
  97. package/dist/auth-session-D7oAIuHk.js +0 -4
  98. package/dist/auth-session-DOjVKRI_.js.map +0 -1
  99. package/dist/daemon-frame-transport-saNQVOyi.js.map +0 -1
  100. package/dist/daemon-service-update-coordinator-BuCEBJoe.js.map +0 -1
  101. package/dist/dist-DkRliHib.js.map +0 -1
  102. package/dist/open-code-permission-Doem1R2N.js.map +0 -1
  103. package/dist/openmeld-BcyBlby4.js.map +0 -1
  104. package/dist/prepare-provider-runtime-DxaGSe3R.js.map +0 -1
  105. package/dist/runtime-DGT66AR-.js.map +0 -1
  106. package/dist/runtime-reporting-health-state-CPWlQ5IX.js.map +0 -1
  107. package/dist/runtime-transport-BLtOFrtv.js.map +0 -1
  108. package/dist/service-ClETdJbz.js.map +0 -1
  109. package/dist/upgrade-2epQATRq.js.map +0 -1
  110. package/dist/upgrade-BVIot_cP.js +0 -4
  111. package/dist/windows-user-task-CSJpDs-S.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-ClETdJbz.js","names":["toAuthEndpoint","parseResponseJson","normalizeOptionalString","process","normalizeOptionalString","toAuthEndpoint","toErrorMessage","parseResponseJson","normalizeOptionalString","toErrorMessage","normalizeOptionalString","sleep","normalizeOptionalString","buildAuthPromptMessage","toErrorMessage","invalidResponse","toErrorMessage","resolveDaemonRunMode","parseDaemonRunMode","normalizeText","buildResultFrame","buildResultFrame","toErrorMessage","normalizeText","applyIntervalJitterMs","applyIntervalJitterMsInternal","normalizeText","normalizeOptionalText","toErrorMessage","resolveDaemonRunMode","createMutableRouteCatalogStateInternal","process","process","isPidAlive","normalizeOptionalText","toErrorMessage","unexpectedOutcome","isStartupTimeoutError","toErrorMessage","isDaemonInventoryRunningAndStartReadyWithBlockers","waitForSystemServiceStartupWithPredicate","toErrorMessage","waitForSystemServiceToStop","toErrorMessage","toErrorMessage","normalizeOptionalText"],"sources":["../../../packages/schemas/dist/schemas/daemon/service-connection-correlation.js","../../../packages/schemas/dist/schemas/cli/daemon-status-server-requirement.js","../../../packages/schemas/dist/schemas/http/organization-join-link.js","../../../packages/schemas/dist/schemas/cli/json-output.js","../src/commands/auth-device-session-client.ts","../src/command-entry-checks/current-command-check-state.ts","../src/auth/agent-overview.ts","../src/lib/open-url.ts","../src/ui/interactive-prompt.ts","../src/ui/text-entry.ts","../src/ui/card-frame.ts","../src/ui/info-card.ts","../src/commands/auth-status-shared.ts","../src/commands/one-time-token-auth-session.ts","../src/commands/auth.ts","../src/auth/command-auth.ts","../src/transport/ws.ts","../src/local-service/control-plane/server.ts","../src/local-service/execution-host/catalog-client.ts","../src/local-service/execution-host/launch.ts","../src/local-service/folder-picker/local-folder-picker-helper-process.ts","../src/local-service/folder-picker/local-folder-picker-service.ts","../src/local-service/lifecycle/daemon-service-launch-scope.ts","../src/local-service/lifecycle/daemon-service-registration-repair-state.ts","../src/local-service/lifecycle/daemon-service-registration-reconcile.ts","../src/local-service/lifecycle/service-connection-evidence.ts","../src/local-service/lifecycle/service-connection-evidence-observer.ts","../src/local-service/reporting/runtime-reporting-auth-recovery.ts","../src/local-service/state/daemon-runtime-state.ts","../src/local-service/state/runtime-state-tracker.ts","../src/local-service/state/service-connection-state.ts","../src/local-service/adapters/resolve-daemon-capabilities.ts","../src/local-service/execution-host/socket-link.ts","../src/local-service/file-access/computer-file-access-handler.ts","../src/local-service/folder-picker/local-folder-picker-handler.ts","../src/local-service/maintenance/openmeld-tools-control-handler.ts","../src/local-service/projects/local-project-activity-sync.ts","../../../packages/projects/dist/index.js","../src/local-service/projects/git-repository-verifier.ts","../src/local-service/projects/local-project-connection.ts","../src/local-service/projects/local-project-control-idempotency.ts","../src/local-service/projects/profile-workspace-candidates.ts","../src/local-service/projects/local-project-discovery.ts","../src/local-service/projects/local-project-discovery-epoch.ts","../src/local-service/projects/local-project-control-handler.ts","../src/local-service/reporting/local-wake-route-report.ts","../src/local-service/carrier/daemon-stream-keepalive.ts","../src/local-service/carrier/heartbeat-loop.ts","../src/local-service/carrier/register-session.ts","../src/local-service/carrier/run-socket-session.ts","../src/local-service/status/service-participation-status.ts","../src/local-components/manifest.ts","../src/local-service/carrier/service-local-components-observation.ts","../src/local-service/carrier/stop-aware-delay.ts","../src/local-service/carrier/service-runner.ts","../src/local-service/lifecycle/daemon-process-crash-guard.ts","../src/local-service/lifecycle/daemon-service-hygiene.ts","../src/local-service/lifecycle/daemon-service-startup-recovery.ts","../src/local-service/lifecycle/daemon-start-failure-log.ts","../src/local-service/lifecycle/daemon-service-alignment-executor.ts","../src/local-service/lifecycle/daemon-service-repair-journal.ts","../src/local-service/lifecycle/daemon-service-auto-heal.ts","../src/local-service/lifecycle/daemon-startup-preflight.ts","../src/local-service/status/daemon-local-status-snapshot.ts","../src/runtime/cli-json-output.ts","../src/ui/human-error-card.ts","../src/system/local-service-start-decision.ts","../src/runtime/agent-overview-output.ts","../src/ui/delayed-spinner.ts","../src/commands/service-agent-overview.ts","../src/commands/service-output.ts","../src/command-entry-checks/version-reconciliation.ts","../src/profile-workspace/presentation.ts","../src/system/service-participation-readiness.ts","../src/commands/service-status-view.ts","../src/commands/service-control-command.ts","../src/commands/service-reinstall-view.ts","../src/commands/service-run-result.ts","../src/commands/service-error-text.ts","../src/commands/service-start-failure.ts","../src/commands/service-stop-command.ts","../src/commands/service-teardown.ts","../src/commands/service.ts"],"sourcesContent":["import * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/service-connection-correlation.ts\nconst SERVICE_CONNECTION_ID_QUERY_PARAMETER = \"connectionId\";\nconst serviceConnectionDiagnosticIdSchema = z$1.uuid();\n//#endregion\nexport { SERVICE_CONNECTION_ID_QUERY_PARAMETER, serviceConnectionDiagnosticIdSchema };\n\n//# sourceMappingURL=service-connection-correlation.js.map","import { localCliComponentUpdateProjectionSchema, localServiceComponentUpdateProjectionSchema } from \"../local-components.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/cli/daemon-status-server-requirement.ts\nconst cliVersionVerdictKindSchema = z$1.enum([\n\t\"aligned\",\n\t\"channel_behind\",\n\t\"channel_ahead\",\n\t\"channel_unavailable\",\n\t\"server_unavailable\"\n]);\nconst serviceVersionVerdictKindSchema = z$1.enum([\n\t\"aligned\",\n\t\"update_available\",\n\t\"update_required\",\n\t\"unknown\",\n\t\"server_unavailable\"\n]);\nconst cliVersionVerdictSchema = z$1.strictObject({\n\tkind: cliVersionVerdictKindSchema,\n\tmessage: z$1.string().trim().min(1)\n});\nconst serviceVersionVerdictSchema = z$1.strictObject({\n\tkind: serviceVersionVerdictKindSchema,\n\tmessage: z$1.string().trim().min(1)\n});\nconst daemonStatusServerRequirementUnavailableReasonSchema = z$1.enum([\n\t\"signed_out\",\n\t\"offline\",\n\t\"request_failed\"\n]);\nconst availableDaemonStatusServerRequirementSchema = z$1.strictObject({\n\tavailable: z$1.literal(true),\n\tgeneratedAt: z$1.iso.datetime({ offset: true }),\n\tcli: localCliComponentUpdateProjectionSchema,\n\tservice: localServiceComponentUpdateProjectionSchema,\n\tverdict: z$1.strictObject({\n\t\tcli: cliVersionVerdictSchema,\n\t\tservice: serviceVersionVerdictSchema\n\t})\n});\nconst unavailableDaemonStatusServerRequirementSchema = z$1.strictObject({\n\tavailable: z$1.literal(false),\n\treason: daemonStatusServerRequirementUnavailableReasonSchema,\n\tdetail: z$1.string().nullable()\n});\nconst daemonStatusServerRequirementSchema = z$1.discriminatedUnion(\"available\", [availableDaemonStatusServerRequirementSchema, unavailableDaemonStatusServerRequirementSchema]);\n//#endregion\nexport { cliVersionVerdictKindSchema, cliVersionVerdictSchema, daemonStatusServerRequirementSchema, daemonStatusServerRequirementUnavailableReasonSchema, serviceVersionVerdictKindSchema, serviceVersionVerdictSchema };\n\n//# sourceMappingURL=daemon-status-server-requirement.js.map","import { boolean, discriminatedUnion, enum as enumFactory, iso, literal, strictObject, string, url } from \"../../lazy-zod.js\";\nimport { openMeldRequestContextSchema } from \"../daemon/profile-identity.js\";\nimport { centerAgentToolSpeakerSchema } from \"./center-agent-speaker.js\";\n//#region src/schemas/http/organization-join-link.ts\nconst ORGANIZATION_JOIN_LINK_WEB_PATH = \"/join-organization\";\nconst ORGANIZATION_JOIN_LINK_TOKEN_PREFIX = \"joinlink_\";\nconst ORGANIZATION_JOIN_LINK_ACCEPT_RATE_LIMITED_ERROR_CODE = \"organization.join_link.accept.rate_limited\";\nconst organizationJoinLinkTokenSchema = string().regex(/^joinlink_[0-9a-f]{64}$/);\nconst organizationJoinLinkManagementQuerySchema = strictObject({\n\torganizationId: string().trim().min(1).max(255),\n\tspaceId: string().trim().min(1).max(255).optional(),\n\tmode: enumFactory([\"direct\", \"request\"]).optional(),\n\tresponseVersion: literal(\"3\").optional()\n});\nconst organizationJoinLinkSchema = strictObject({\n\tid: string().min(1),\n\torganizationId: string().min(1),\n\ttoken: organizationJoinLinkTokenSchema,\n\turl: url(),\n\trole: literal(\"member\"),\n\tcreatedBy: string().min(1),\n\tcreatedAt: iso.datetime(),\n\tmode: enumFactory([\"direct\", \"request\"]).optional(),\n\texpiresAt: iso.datetime().nullable().optional(),\n\tspaceId: string().min(1).nullable().optional()\n});\nconst getOrganizationJoinLinkResponseSchema = strictObject({\n\tok: literal(true),\n\tjoinLink: organizationJoinLinkSchema.nullable()\n});\nconst CENTER_AGENT_ORGANIZATION_INVITE_LINK_GENERATION_GUIDANCE = {\n\trequiredRole: \"member\",\n\tsettingsLocation: \"Settings → Workspace → General\",\n\tsettingsSection: \"Invite link\"\n};\nconst centerAgentGetOrganizationInviteLinkToolRpcInputSchema = strictObject({ context: openMeldRequestContextSchema });\nconst centerAgentOrganizationInviteLinkGenerationGuidanceSchema = strictObject({\n\trequiredRole: literal(CENTER_AGENT_ORGANIZATION_INVITE_LINK_GENERATION_GUIDANCE.requiredRole),\n\tsettingsLocation: literal(CENTER_AGENT_ORGANIZATION_INVITE_LINK_GENERATION_GUIDANCE.settingsLocation),\n\tsettingsSection: literal(CENTER_AGENT_ORGANIZATION_INVITE_LINK_GENERATION_GUIDANCE.settingsSection)\n});\nconst centerAgentGetOrganizationInviteLinkResponseSchema = discriminatedUnion(\"active\", [strictObject({\n\tactive: literal(true),\n\torganizationName: string().trim().min(1),\n\turl: url()\n}), strictObject({\n\tactive: literal(false),\n\tgenerationGuidance: centerAgentOrganizationInviteLinkGenerationGuidanceSchema\n})]);\nconst organizationJoinLinkEnsureErrorCodeSchema = enumFactory([\n\t\"organization.join_link.forbidden\",\n\t\"organization.join_link.inactive\",\n\t\"organization.join_link.invalid_input\",\n\t\"organization.metadata_invalid\",\n\t\"organization.personal_no_members\"\n]);\nconst ensureOrganizationJoinLinkOnBehalfOfRpcInputSchema = strictObject({\n\tactorUserId: string().trim().min(1).max(255),\n\torganizationId: string().trim().min(1).max(255)\n});\nconst ensureOrganizationJoinLinkOnBehalfOfRpcResponseSchema = discriminatedUnion(\"ok\", [strictObject({\n\tjoinLink: organizationJoinLinkSchema,\n\tok: literal(true),\n\torganizationName: string().trim().min(1)\n}), strictObject({\n\tcode: organizationJoinLinkEnsureErrorCodeSchema,\n\tmessage: string().trim().min(1),\n\tok: literal(false)\n})]);\nconst centerAgentCreateOrganizationInviteLinkToolRpcInputSchema = strictObject({\n\tcontext: openMeldRequestContextSchema,\n\tspeakerMember: centerAgentToolSpeakerSchema\n});\nconst centerAgentCreateOrganizationInviteLinkResponseSchema = discriminatedUnion(\"ok\", [strictObject({\n\tok: literal(true),\n\torganizationName: string().trim().min(1),\n\turl: url()\n}), strictObject({\n\terror: strictObject({\n\t\tcode: organizationJoinLinkEnsureErrorCodeSchema,\n\t\tmessage: string().trim().min(1)\n\t}),\n\tok: literal(false)\n})]);\nconst revokeOrganizationJoinLinkResponseSchema = strictObject({\n\tok: literal(true),\n\trevoked: boolean()\n});\nconst previewOrganizationJoinLinkQuerySchema = strictObject({\n\ttoken: organizationJoinLinkTokenSchema,\n\tresponseVersion: enumFactory([\"2\", \"3\"]).optional()\n});\nconst previewOrganizationJoinLinkResponseSchema = discriminatedUnion(\"active\", [strictObject({\n\tok: literal(true),\n\tactive: literal(true),\n\torganizationName: string().min(1),\n\torganizationSlug: string().min(1),\n\tmode: enumFactory([\"direct\", \"request\"]).optional(),\n\texpiresAt: iso.datetime().nullable().optional(),\n\tspaceId: string().min(1).nullable().optional()\n}), strictObject({\n\tok: literal(true),\n\tactive: literal(false)\n})]);\nconst acceptOrganizationJoinLinkBodySchema = strictObject({ token: organizationJoinLinkTokenSchema });\nconst acceptOrganizationJoinLinkResponseSchema = strictObject({\n\tok: literal(true),\n\torganizationId: string().min(1),\n\torganizationName: string().min(1),\n\torganizationSlug: string().min(1),\n\trole: enumFactory([\n\t\t\"owner\",\n\t\t\"admin\",\n\t\t\"member\"\n\t]),\n\talreadyMember: boolean()\n});\nconst organizationJoinLinkErrorCodeSchema = enumFactory([\n\t\"auth.invalid_origin\",\n\tORGANIZATION_JOIN_LINK_ACCEPT_RATE_LIMITED_ERROR_CODE,\n\t\"organization.join_link.invalid_input\",\n\t\"organization.join_link.authentication_required\",\n\t\"organization.join_link.approval_required\",\n\t\"organization.join_link.forbidden\",\n\t\"organization.join_link.email_verification_required\",\n\t\"organization.join_link.inactive\",\n\t\"organization.personal_no_members\",\n\t\"organization.metadata_invalid\"\n]);\nconst organizationJoinLinkErrorResponseSchema = strictObject({\n\tok: literal(false),\n\tcode: organizationJoinLinkErrorCodeSchema,\n\tmessage: string().min(1)\n});\n//#endregion\nexport { CENTER_AGENT_ORGANIZATION_INVITE_LINK_GENERATION_GUIDANCE, ORGANIZATION_JOIN_LINK_ACCEPT_RATE_LIMITED_ERROR_CODE, ORGANIZATION_JOIN_LINK_TOKEN_PREFIX, ORGANIZATION_JOIN_LINK_WEB_PATH, acceptOrganizationJoinLinkBodySchema, acceptOrganizationJoinLinkResponseSchema, centerAgentCreateOrganizationInviteLinkResponseSchema, centerAgentCreateOrganizationInviteLinkToolRpcInputSchema, centerAgentGetOrganizationInviteLinkResponseSchema, centerAgentGetOrganizationInviteLinkToolRpcInputSchema, centerAgentOrganizationInviteLinkGenerationGuidanceSchema, ensureOrganizationJoinLinkOnBehalfOfRpcInputSchema, ensureOrganizationJoinLinkOnBehalfOfRpcResponseSchema, getOrganizationJoinLinkResponseSchema, organizationJoinLinkEnsureErrorCodeSchema, organizationJoinLinkErrorCodeSchema, organizationJoinLinkErrorResponseSchema, organizationJoinLinkManagementQuerySchema, organizationJoinLinkSchema, organizationJoinLinkTokenSchema, previewOrganizationJoinLinkQuerySchema, previewOrganizationJoinLinkResponseSchema, revokeOrganizationJoinLinkResponseSchema };\n\n//# sourceMappingURL=organization-join-link.js.map","import { archiveProjectResponseSchema, createProjectResponseSchema, listProjectsResponseSchema, projectSchema, updateProjectResponseSchema } from \"../http/projects.js\";\nimport { localProjectControlConnectionSchema } from \"../daemon/local-project-control.js\";\nimport { agentActivitySnapshotResponseSchema } from \"../http/agent-activity.js\";\nimport { createCenterAgentRoutineResponseSchema, deleteCenterAgentRoutineResponseSchema, listCenterAgentRoutineRunsResponseSchema, listCenterAgentRoutinesResponseSchema, pauseCenterAgentRoutineResponseSchema, resumeCenterAgentRoutineResponseSchema, updateCenterAgentRoutineResponseSchema } from \"../http/center-agent-routines.js\";\nimport { agentActivitySessionInventoryResponseSchema } from \"../http/agent-activity-sessions.js\";\nimport { organizationComputersResponseSchema } from \"../http/organization-computers.js\";\nimport { spaceMemberAgentWakeAvailabilitySchema, spaceMemberDirectoryAllowedRelationsSchema, spaceMemberDirectorySchema, spaceMemberKindSchema } from \"../http/space-members.js\";\nimport { getOrganizationSkillResponseSchema, listOrganizationSkillsResponseSchema, organizationSkillReleaseSummarySchema, organizationSkillSummarySchema } from \"../http/organization-skills.js\";\nimport { daemonStatusServerRequirementSchema } from \"./daemon-status-server-requirement.js\";\nimport { serviceControlCapabilitiesSchema } from \"../../service-account-admission.js\";\nimport { submitFeedbackIssueRequestSchema, submitFeedbackIssueResponseSchema } from \"../http/feedback.js\";\nimport { organizationDirectoryResponseSchema } from \"../http/organization-directory.js\";\nimport { getOrganizationJoinLinkResponseSchema, revokeOrganizationJoinLinkResponseSchema } from \"../http/organization-join-link.js\";\nimport { organizationSpaceDirectoryWithMemberCountsResponseSchema } from \"../http/organization-space-directory.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/cli/json-output.ts\n/**\n* Shared contract for the OpenMeld CLI `--json` machine-readable output boundary.\n*\n* This is the single source of truth for the stdout envelope a non-interactive\n* driver (Desktop GUI, scripts, CI) parses when a command is run with `--json`.\n* The CLI must derive its envelope types from these schemas via `z.infer`\n* instead of hand-writing a parallel shape that can drift\n* (`developing/architecture/shared-contracts.md`: \"CLI JSON\" is a shared\n* boundary; \"Do not create a separate hand-written shared type that can drift\n* from the runtime schema.\").\n*\n* Scope: this owns ONLY the `{ schemaVersion: 1, type, ... }` `--json` envelope.\n* It does NOT own the separate `--view agent` presenter protocol (the flat\n* `{ type: \"error\", code, message }` / `{ type: \"hints\", ... }` lines and the\n* `{ type: \"result\", code, payload }` stream), which is a distinct\n* machine-readable surface emitted without `schemaVersion`.\n*/\n/**\n* The CLI `--json` envelope schema version. This versions the envelope wire\n* surface independently of `OPENMELD_SCHEMA_VERSION` and the other component schema\n* versions, mirroring `LOCAL_COMPONENTS_SCHEMA_VERSION`, because the `--json`\n* boundary evolves on its own cadence. It is currently `1` everywhere the CLI\n* emits an envelope.\n*/\nconst CLI_JSON_OUTPUT_SCHEMA_VERSION = 1;\nconst schemaVersionSchema = z$1.literal(1);\n/**\n* Stable error codes a blocked command entry-check emits under `--json`. These\n* are the closed set the CLI routes blocked entry states to; defining the set\n* here keeps the CLI from minting drift codes. The error envelope itself stays\n* open (`error.code` is any string) because errors also originate outside the\n* entry-check flow (e.g. `cli.error`, gateway codes).\n*/\nconst cliJsonEntryCheckBlockedErrorCodeSchema = z$1.enum([\n\t\"auth.authentication_required\",\n\t\"auth.session_token_unavailable\",\n\t\"profile.required\",\n\t\"local_state.repair_required\",\n\t\"upgrade.required\"\n]);\n/**\n* The failure envelope: the top-level boundary prints exactly this when a\n* command throws (or a blocking entry-check fires) under `--json`, then exits 1.\n* Fully owned, so it is strict.\n*/\nconst cliJsonErrorEnvelopeSchema = z$1.strictObject({\n\tschemaVersion: schemaVersionSchema,\n\ttype: z$1.literal(\"error\"),\n\terror: z$1.strictObject({\n\t\tcode: z$1.string(),\n\t\tmessage: z$1.string(),\n\t\trequestId: z$1.string().optional()\n\t})\n});\n/**\n* Success envelopes share the `{ schemaVersion, type }` frame and then flatten a\n* command-specific result onto the envelope. The deep result shapes (daemon\n* install/run/status state, runtime projections, agent registration summaries)\n* are owned by their respective daemon / agents runtime contracts. This envelope\n* is the FRAME owner: it pins the version literal and the closed `type`\n* discriminant, and deliberately RELAXES the flattened payload via\n* `z.looseObject` rather than re-deriving those domain-owned shapes here — doing\n* so would create a second source of truth for payloads another owner already\n* defines. (`shared-contracts.md`: \"Document any relaxed object boundary.\")\n*\n* Only fields the CLI authors directly on the envelope (and that carry a stable\n* literal or primitive shape) are validated here; everything flattened from a\n* domain payload passes through the relaxed boundary.\n*/\nfunction defineSuccessEnvelope(type, shape) {\n\treturn z$1.looseObject({\n\t\tschemaVersion: schemaVersionSchema,\n\t\ttype: z$1.literal(type),\n\t\t...shape\n\t});\n}\nfunction defineStrictSuccessEnvelope(type, shape) {\n\treturn z$1.strictObject({\n\t\tschemaVersion: schemaVersionSchema,\n\t\ttype: z$1.literal(type),\n\t\t...shape\n\t});\n}\nconst cliJsonDaemonRunEnvelopeSchema = defineSuccessEnvelope(\"daemon.run\", { ok: z$1.boolean() });\nconst cliJsonDaemonInstallEnvelopeSchema = defineSuccessEnvelope(\"daemon.install\", { status: z$1.string() });\nconst cliJsonDaemonUninstallEnvelopeSchema = defineSuccessEnvelope(\"daemon.uninstall\", { status: z$1.enum([\"removed\", \"not_installed\"]) });\nconst cliJsonDaemonReinstallEnvelopeSchema = defineSuccessEnvelope(\"daemon.reinstall\", {});\nconst cliJsonDaemonStatusEnvelopeSchema = defineSuccessEnvelope(\"daemon.status\", {\n\truntimeFlavor: z$1.enum([\"binary\", \"node-bundle\"]).optional(),\n\tserverRequirement: daemonStatusServerRequirementSchema.optional()\n});\nconst cliJsonServiceControlCapabilitiesEnvelopeSchema = defineSuccessEnvelope(\"service.control_capabilities\", serviceControlCapabilitiesSchema.shape);\nconst cliJsonDaemonStopEnvelopeSchema = defineSuccessEnvelope(\"daemon.stop\", {});\nconst cliJsonDaemonAutostartEnvelopeSchema = defineSuccessEnvelope(\"daemon.autostart\", {\n\taction: z$1.enum([\"enable\", \"disable\"]),\n\tenabled: z$1.boolean()\n});\nconst cliJsonAgentsDetectEnvelopeSchema = defineSuccessEnvelope(\"agents.detect\", { count: z$1.number().int().nonnegative() });\nconst cliJsonAgentsListEnvelopeSchema = defineSuccessEnvelope(\"agents.list\", { count: z$1.number().int().nonnegative() });\nconst cliJsonAgentsShowEnvelopeSchema = defineSuccessEnvelope(\"agents.show\", {});\nconst cliJsonAgentsEnableEnvelopeSchema = defineSuccessEnvelope(\"agents.enable\", {});\nconst cliJsonAgentsDisableEnvelopeSchema = defineSuccessEnvelope(\"agents.disable\", {});\nconst cliJsonFeedbackSubmittedEnvelopeSchema = defineSuccessEnvelope(\"feedback_submitted\", {\n\tissueId: submitFeedbackIssueResponseSchema.shape.issueId,\n\tcategory: submitFeedbackIssueRequestSchema.shape.category,\n\tsubmitterKind: submitFeedbackIssueRequestSchema.shape.submitterKind,\n\tanonymous: z$1.boolean()\n});\nconst cliJsonAgentActivityLocalBindingSchema = z$1.strictObject({\n\tboundAtMs: z$1.number().int().nonnegative(),\n\torganizationId: z$1.string().min(1),\n\tprojectId: z$1.string().min(1),\n\tprojectSlug: z$1.string().min(1),\n\trepositoryFingerprint: z$1.string().nullable(),\n\trepositoryPath: z$1.string().min(1)\n});\nconst cliJsonProjectsListEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.list\", {\n\t...listProjectsResponseSchema.shape,\n\tlocalBindings: z$1.array(cliJsonAgentActivityLocalBindingSchema)\n});\nconst cliJsonProjectsCreateEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.create\", createProjectResponseSchema.shape);\nconst cliJsonProjectsUpdateEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.update\", updateProjectResponseSchema.shape);\nconst cliJsonProjectsArchiveEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.archive\", archiveProjectResponseSchema.shape);\nconst cliJsonAgentActivityIntegrationUpdateSchema = z$1.strictObject({\n\tclaude: z$1.enum([\n\t\t\"changed\",\n\t\t\"missing\",\n\t\t\"reused\"\n\t]),\n\tcodex: z$1.enum([\n\t\t\"changed\",\n\t\t\"missing\",\n\t\t\"reused\"\n\t]),\n\tcursor: z$1.enum([\n\t\t\"changed\",\n\t\t\"missing\",\n\t\t\"reused\"\n\t]),\n\topenCode: z$1.enum([\n\t\t\"changed\",\n\t\t\"missing\",\n\t\t\"reused\"\n\t])\n});\nconst cliJsonProjectsBindEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.bind\", {\n\tbinding: cliJsonAgentActivityLocalBindingSchema,\n\tintegrationSetup: z$1.discriminatedUnion(\"status\", [z$1.strictObject({\n\t\tintegrations: cliJsonAgentActivityIntegrationUpdateSchema,\n\t\tstatus: z$1.literal(\"ready\")\n\t}), z$1.strictObject({\n\t\tmessage: z$1.string().trim().min(1).max(512),\n\t\tstatus: z$1.literal(\"needs_attention\")\n\t})]),\n\tproject: projectSchema\n});\nconst cliJsonProjectsUnbindEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.unbind\", {\n\torganizationId: z$1.string().min(1),\n\tprojectSlug: z$1.string().min(1),\n\tunbound: z$1.literal(true)\n});\nconst cliJsonProjectConnectionSnapshotShape = {\n\torganizationId: z$1.string().min(1),\n\tprojectId: z$1.string().min(1),\n\tprojectSlug: z$1.string().min(1),\n\tconnections: z$1.array(localProjectControlConnectionSchema)\n};\nconst cliJsonProjectsConnectionsListEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.connections.list\", { ...cliJsonProjectConnectionSnapshotShape });\nconst cliJsonProjectsConnectionsSetDefaultEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.connections.set_default\", {\n\t...cliJsonProjectConnectionSnapshotShape,\n\tstatus: z$1.enum([\"updated\", \"unchanged\"])\n});\nconst cliJsonProjectsConnectionsRemoveEnvelopeSchema = defineStrictSuccessEnvelope(\"projects.connections.remove\", {\n\t...cliJsonProjectConnectionSnapshotShape,\n\tstatus: z$1.enum([\"removed\", \"unchanged\"])\n});\nconst cliJsonAgentActivityReadEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.read\", agentActivitySnapshotResponseSchema.shape);\nconst cliJsonAgentActivitySessionsEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.sessions\", agentActivitySessionInventoryResponseSchema.shape);\nconst cliJsonAgentActivityIntegrationStatusSchema = z$1.strictObject({\n\tclaude: z$1.boolean(),\n\tcodex: z$1.boolean(),\n\tcursor: z$1.boolean(),\n\topenCode: z$1.boolean()\n});\nconst cliJsonAgentActivityHealthSchema = z$1.strictObject({\n\tpending: z$1.number().int().nonnegative(),\n\tpermanentlyRejected: z$1.number().int().nonnegative(),\n\tretrying: z$1.number().int().nonnegative()\n});\nconst cliJsonAgentActivityInstallEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.install\", { integrations: cliJsonAgentActivityIntegrationUpdateSchema });\nconst cliJsonAgentActivityUninstallEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.uninstall\", { integrations: cliJsonAgentActivityIntegrationUpdateSchema });\nconst cliJsonAgentActivityStatusEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.status\", {\n\tcontrollerTaskHealth: cliJsonAgentActivityHealthSchema,\n\thealth: cliJsonAgentActivityHealthSchema,\n\tintegrations: cliJsonAgentActivityIntegrationStatusSchema\n});\nconst cliJsonAgentActivityHealthEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.health\", {\n\tcontrollerTaskHealth: cliJsonAgentActivityHealthSchema,\n\thealth: cliJsonAgentActivityHealthSchema\n});\nconst cliJsonAgentActivitySyncEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.sync\", { result: z$1.strictObject({\n\tcontrollerTaskEventSubmittedCount: z$1.number().int().nonnegative(),\n\tcontrollerTaskHealth: cliJsonAgentActivityHealthSchema,\n\thealth: cliJsonAgentActivityHealthSchema,\n\tobservedCount: z$1.number().int().nonnegative(),\n\treason: z$1.enum([\n\t\t\"service_contract_unavailable\",\n\t\t\"auth_unavailable\",\n\t\t\"registration_rejected\",\n\t\t\"write_auth_rejected\",\n\t\t\"write_endpoint_unavailable\",\n\t\t\"write_retryable_http_failure\",\n\t\t\"write_response_invalid\",\n\t\t\"write_timeout\",\n\t\t\"write_transport_failure\",\n\t\t\"inventory_write_auth_rejected\",\n\t\t\"inventory_endpoint_unavailable\",\n\t\t\"inventory_write_retryable_http_failure\",\n\t\t\"inventory_write_transport_failure\"\n\t]).nullable(),\n\tsessionInventory: z$1.strictObject({\n\t\treason: z$1.enum([\n\t\t\t\"service_contract_unavailable\",\n\t\t\t\"auth_unavailable\",\n\t\t\t\"registration_rejected\",\n\t\t\t\"inventory_write_auth_rejected\",\n\t\t\t\"inventory_endpoint_unavailable\",\n\t\t\t\"inventory_write_retryable_http_failure\",\n\t\t\t\"inventory_write_transport_failure\"\n\t\t]).nullable(),\n\t\tsessionCount: z$1.number().int().nonnegative(),\n\t\tsourceCount: z$1.number().int().nonnegative(),\n\t\tstatus: z$1.enum([\n\t\t\t\"idle\",\n\t\t\t\"submitted\",\n\t\t\t\"unavailable\"\n\t\t]),\n\t\tsubmittedSourceCount: z$1.number().int().nonnegative()\n\t}),\n\tstatus: z$1.enum([\n\t\t\"idle\",\n\t\t\"submitted\",\n\t\t\"unavailable\"\n\t]),\n\tsubmittedCount: z$1.number().int().nonnegative()\n}) });\nconst cliJsonAgentActivityContextEnvelopeSchema = defineStrictSuccessEnvelope(\"activity.context\", { context: z$1.string().min(1).max(300).nullable() });\nconst cliJsonRoutinesListEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.list\", listCenterAgentRoutinesResponseSchema.shape);\nconst cliJsonRoutinesCreateEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.create\", createCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesShowEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.show\", createCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesUpdateEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.update\", updateCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesPauseEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.pause\", pauseCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesResumeEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.resume\", resumeCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesDeleteEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.delete\", deleteCenterAgentRoutineResponseSchema.shape);\nconst cliJsonRoutinesRunsEnvelopeSchema = defineStrictSuccessEnvelope(\"routines.runs\", listCenterAgentRoutineRunsResponseSchema.shape);\nconst cliJsonSpaceMembersEnvelopeSchema = defineStrictSuccessEnvelope(\"space.members\", spaceMemberDirectorySchema.shape);\nconst cliJsonSpaceMembersBriefEnvelopeSchema = defineStrictSuccessEnvelope(\"space.members.brief\", {\n\tspaceId: z$1.string().trim().min(1),\n\tgeneratedAt: z$1.iso.datetime({ offset: true }),\n\tmembers: z$1.array(z$1.strictObject({\n\t\tprofileId: z$1.string().trim().min(1),\n\t\tdisplayName: z$1.string().trim().min(1),\n\t\tprofileKind: spaceMemberKindSchema,\n\t\tprimaryMentionLabel: z$1.string().trim().min(1),\n\t\tallowedRelations: spaceMemberDirectoryAllowedRelationsSchema,\n\t\twakeAvailability: spaceMemberAgentWakeAvailabilitySchema.pick({\n\t\t\taction: true,\n\t\t\tphase: true,\n\t\t\treasonCode: true,\n\t\t\tstatus: true,\n\t\t\tsummary: true\n\t\t}).optional(),\n\t\tcanWakeNow: z$1.boolean().optional()\n\t}))\n});\nconst cliJsonSpaceListOrganizationEnvelopeSchema = defineStrictSuccessEnvelope(\"space.list.organization\", {\n\tscope: z$1.literal(\"organization\"),\n\torganizationId: organizationSpaceDirectoryWithMemberCountsResponseSchema.shape.organizationId,\n\tgeneratedAt: organizationSpaceDirectoryWithMemberCountsResponseSchema.shape.generatedAt,\n\ttotal: z$1.number().int().nonnegative(),\n\treturned: z$1.number().int().nonnegative(),\n\tspaces: organizationSpaceDirectoryWithMemberCountsResponseSchema.shape.spaces\n});\nconst cliJsonOrganizationDirectoryEnvelopeSchema = defineStrictSuccessEnvelope(\"organization.directory\", organizationDirectoryResponseSchema.shape);\nconst cliJsonOrganizationComputersEnvelopeSchema = defineStrictSuccessEnvelope(\"organization.computers\", organizationComputersResponseSchema.shape);\nconst cliJsonOrganizationInviteLinkGetEnvelopeSchema = defineStrictSuccessEnvelope(\"organization.invite_link.get\", getOrganizationJoinLinkResponseSchema.shape);\nconst cliJsonOrganizationInviteLinkCreateEnvelopeSchema = defineStrictSuccessEnvelope(\"organization.invite_link.create\", getOrganizationJoinLinkResponseSchema.shape);\nconst cliJsonOrganizationInviteLinkRevokeEnvelopeSchema = defineStrictSuccessEnvelope(\"organization.invite_link.revoke\", revokeOrganizationJoinLinkResponseSchema.shape);\nconst cliJsonSkillsListEnvelopeSchema = defineStrictSuccessEnvelope(\"skills.list\", listOrganizationSkillsResponseSchema.shape);\nconst cliJsonSkillsShowEnvelopeSchema = defineStrictSuccessEnvelope(\"skills.show\", getOrganizationSkillResponseSchema.shape);\nconst cliJsonSkillsLoadEnvelopeSchema = defineStrictSuccessEnvelope(\"skills.load\", {\n\tcachePath: z$1.string().min(1),\n\tdigest: organizationSkillReleaseSummarySchema.shape.digest,\n\torganizationId: organizationSkillSummarySchema.shape.organizationId,\n\treleaseId: organizationSkillReleaseSummarySchema.shape.id,\n\tresourcePaths: z$1.array(z$1.string().min(1)).max(128),\n\treused: z$1.boolean(),\n\tskillId: organizationSkillSummarySchema.shape.id,\n\tskillMarkdownPath: z$1.string().min(1),\n\tskillName: organizationSkillSummarySchema.shape.name\n});\n/**\n* The full `--json` output envelope: the failure envelope plus every success\n* envelope, discriminated on `type`. A `--json` driver dispatches on\n* `schemaVersion` + `type`; that frame is the contract this validates.\n*/\nconst cliJsonOutputEnvelopeSchema = z$1.discriminatedUnion(\"type\", [\n\tcliJsonErrorEnvelopeSchema,\n\tcliJsonDaemonRunEnvelopeSchema,\n\tcliJsonDaemonInstallEnvelopeSchema,\n\tcliJsonDaemonUninstallEnvelopeSchema,\n\tcliJsonDaemonReinstallEnvelopeSchema,\n\tcliJsonDaemonStatusEnvelopeSchema,\n\tcliJsonServiceControlCapabilitiesEnvelopeSchema,\n\tcliJsonDaemonStopEnvelopeSchema,\n\tcliJsonDaemonAutostartEnvelopeSchema,\n\tcliJsonAgentsDetectEnvelopeSchema,\n\tcliJsonAgentsListEnvelopeSchema,\n\tcliJsonAgentsShowEnvelopeSchema,\n\tcliJsonAgentsEnableEnvelopeSchema,\n\tcliJsonAgentsDisableEnvelopeSchema,\n\tcliJsonFeedbackSubmittedEnvelopeSchema,\n\tcliJsonProjectsListEnvelopeSchema,\n\tcliJsonProjectsCreateEnvelopeSchema,\n\tcliJsonProjectsUpdateEnvelopeSchema,\n\tcliJsonProjectsArchiveEnvelopeSchema,\n\tcliJsonProjectsBindEnvelopeSchema,\n\tcliJsonProjectsUnbindEnvelopeSchema,\n\tcliJsonProjectsConnectionsListEnvelopeSchema,\n\tcliJsonProjectsConnectionsSetDefaultEnvelopeSchema,\n\tcliJsonProjectsConnectionsRemoveEnvelopeSchema,\n\tcliJsonAgentActivityReadEnvelopeSchema,\n\tcliJsonAgentActivitySessionsEnvelopeSchema,\n\tcliJsonAgentActivityInstallEnvelopeSchema,\n\tcliJsonAgentActivityUninstallEnvelopeSchema,\n\tcliJsonAgentActivityStatusEnvelopeSchema,\n\tcliJsonAgentActivityHealthEnvelopeSchema,\n\tcliJsonAgentActivitySyncEnvelopeSchema,\n\tcliJsonAgentActivityContextEnvelopeSchema,\n\tcliJsonRoutinesListEnvelopeSchema,\n\tcliJsonRoutinesCreateEnvelopeSchema,\n\tcliJsonRoutinesShowEnvelopeSchema,\n\tcliJsonRoutinesUpdateEnvelopeSchema,\n\tcliJsonRoutinesPauseEnvelopeSchema,\n\tcliJsonRoutinesResumeEnvelopeSchema,\n\tcliJsonRoutinesDeleteEnvelopeSchema,\n\tcliJsonRoutinesRunsEnvelopeSchema,\n\tcliJsonSpaceMembersEnvelopeSchema,\n\tcliJsonSpaceMembersBriefEnvelopeSchema,\n\tcliJsonSpaceListOrganizationEnvelopeSchema,\n\tcliJsonOrganizationDirectoryEnvelopeSchema,\n\tcliJsonOrganizationComputersEnvelopeSchema,\n\tcliJsonOrganizationInviteLinkGetEnvelopeSchema,\n\tcliJsonOrganizationInviteLinkCreateEnvelopeSchema,\n\tcliJsonOrganizationInviteLinkRevokeEnvelopeSchema,\n\tcliJsonSkillsListEnvelopeSchema,\n\tcliJsonSkillsShowEnvelopeSchema,\n\tcliJsonSkillsLoadEnvelopeSchema\n]);\n/**\n* The closed set of `--json` envelope `type` discriminants, in the order the\n* union declares them. Useful for parity tests and contract documentation.\n*/\nconst CLI_JSON_OUTPUT_TYPES = [\n\t\"error\",\n\t\"daemon.run\",\n\t\"daemon.install\",\n\t\"daemon.uninstall\",\n\t\"daemon.reinstall\",\n\t\"daemon.status\",\n\t\"service.control_capabilities\",\n\t\"daemon.stop\",\n\t\"daemon.autostart\",\n\t\"agents.detect\",\n\t\"agents.list\",\n\t\"agents.show\",\n\t\"agents.enable\",\n\t\"agents.disable\",\n\t\"feedback_submitted\",\n\t\"projects.list\",\n\t\"projects.create\",\n\t\"projects.update\",\n\t\"projects.archive\",\n\t\"projects.bind\",\n\t\"projects.unbind\",\n\t\"projects.connections.list\",\n\t\"projects.connections.set_default\",\n\t\"projects.connections.remove\",\n\t\"activity.read\",\n\t\"activity.sessions\",\n\t\"activity.install\",\n\t\"activity.uninstall\",\n\t\"activity.status\",\n\t\"activity.health\",\n\t\"activity.sync\",\n\t\"activity.context\",\n\t\"routines.list\",\n\t\"routines.create\",\n\t\"routines.show\",\n\t\"routines.update\",\n\t\"routines.pause\",\n\t\"routines.resume\",\n\t\"routines.delete\",\n\t\"routines.runs\",\n\t\"space.members\",\n\t\"space.members.brief\",\n\t\"space.list.organization\",\n\t\"organization.directory\",\n\t\"organization.computers\",\n\t\"organization.invite_link.get\",\n\t\"organization.invite_link.create\",\n\t\"organization.invite_link.revoke\",\n\t\"skills.list\",\n\t\"skills.show\",\n\t\"skills.load\"\n];\n//#endregion\nexport { CLI_JSON_OUTPUT_SCHEMA_VERSION, CLI_JSON_OUTPUT_TYPES, cliJsonAgentActivityContextEnvelopeSchema, cliJsonAgentActivityHealthEnvelopeSchema, cliJsonAgentActivityInstallEnvelopeSchema, cliJsonAgentActivityReadEnvelopeSchema, cliJsonAgentActivitySessionsEnvelopeSchema, cliJsonAgentActivityStatusEnvelopeSchema, cliJsonAgentActivitySyncEnvelopeSchema, cliJsonAgentActivityUninstallEnvelopeSchema, cliJsonAgentsDetectEnvelopeSchema, cliJsonAgentsDisableEnvelopeSchema, cliJsonAgentsEnableEnvelopeSchema, cliJsonAgentsListEnvelopeSchema, cliJsonAgentsShowEnvelopeSchema, cliJsonDaemonAutostartEnvelopeSchema, cliJsonDaemonInstallEnvelopeSchema, cliJsonDaemonReinstallEnvelopeSchema, cliJsonDaemonRunEnvelopeSchema, cliJsonDaemonStatusEnvelopeSchema, cliJsonDaemonStopEnvelopeSchema, cliJsonDaemonUninstallEnvelopeSchema, cliJsonEntryCheckBlockedErrorCodeSchema, cliJsonErrorEnvelopeSchema, cliJsonFeedbackSubmittedEnvelopeSchema, cliJsonOrganizationComputersEnvelopeSchema, cliJsonOrganizationDirectoryEnvelopeSchema, cliJsonOrganizationInviteLinkCreateEnvelopeSchema, cliJsonOrganizationInviteLinkGetEnvelopeSchema, cliJsonOrganizationInviteLinkRevokeEnvelopeSchema, cliJsonOutputEnvelopeSchema, cliJsonProjectsArchiveEnvelopeSchema, cliJsonProjectsBindEnvelopeSchema, cliJsonProjectsConnectionsListEnvelopeSchema, cliJsonProjectsConnectionsRemoveEnvelopeSchema, cliJsonProjectsConnectionsSetDefaultEnvelopeSchema, cliJsonProjectsCreateEnvelopeSchema, cliJsonProjectsListEnvelopeSchema, cliJsonProjectsUnbindEnvelopeSchema, cliJsonProjectsUpdateEnvelopeSchema, cliJsonRoutinesCreateEnvelopeSchema, cliJsonRoutinesDeleteEnvelopeSchema, cliJsonRoutinesListEnvelopeSchema, cliJsonRoutinesPauseEnvelopeSchema, cliJsonRoutinesResumeEnvelopeSchema, cliJsonRoutinesRunsEnvelopeSchema, cliJsonRoutinesShowEnvelopeSchema, cliJsonRoutinesUpdateEnvelopeSchema, cliJsonServiceControlCapabilitiesEnvelopeSchema, cliJsonSkillsListEnvelopeSchema, cliJsonSkillsLoadEnvelopeSchema, cliJsonSkillsShowEnvelopeSchema, cliJsonSpaceListOrganizationEnvelopeSchema, cliJsonSpaceMembersBriefEnvelopeSchema, cliJsonSpaceMembersEnvelopeSchema };\n\n//# sourceMappingURL=json-output.js.map","import {\n BETTER_AUTH_DEVICE_AUTHORIZATION_GRANT_TYPE,\n type BetterAuthDeviceAuthorizationTokenResponse,\n type BetterAuthSessionUserSnapshot,\n betterAuthDeviceAuthorizationErrorResponseSchema,\n betterAuthDeviceAuthorizationTokenRequestSchema,\n betterAuthDeviceAuthorizationTokenResponseSchema,\n betterAuthSessionSnapshotResponseSchema,\n} from \"@openmeld/schemas\";\n\nconst DEFAULT_DEVICE_CLIENT_ID = \"openmeld-cli\";\nconst DEVICE_CLIENT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{1,63}$/;\n\nexport type DeviceTokenSuccessResponse =\n BetterAuthDeviceAuthorizationTokenResponse;\nexport type AuthUserSnapshot = BetterAuthSessionUserSnapshot;\n\ntype DeviceTokenErrorResponse = {\n error?: string;\n error_description?: string;\n message?: string;\n detail?: string;\n};\n\nexport type AuthDeviceSessionOperation =\n | \"exchange_device_token\"\n | \"read_auth_session\"\n | \"revoke_auth_session\";\n\nexport class AuthDeviceSessionClientError extends Error {\n readonly endpoint: string;\n readonly operation: AuthDeviceSessionOperation;\n readonly status: number | null;\n\n constructor(input: {\n endpoint: string;\n message: string;\n operation: AuthDeviceSessionOperation;\n status?: number | null;\n cause?: unknown;\n }) {\n super(\n input.message,\n input.cause === undefined ? undefined : { cause: input.cause }\n );\n this.name = \"AuthDeviceSessionClientError\";\n this.endpoint = input.endpoint;\n this.operation = input.operation;\n this.status = input.status ?? null;\n }\n}\n\nexport type RevokeAuthAccessTokenResult =\n | { ok: true }\n | { ok: false; error: AuthDeviceSessionClientError };\n\nexport async function requestDeviceToken(input: {\n authBaseUrl: string;\n clientId: string;\n deviceCode: string;\n}): Promise<\n | { ok: true; data: DeviceTokenSuccessResponse }\n | { ok: false; error: DeviceTokenErrorResponse; status: number }\n> {\n const endpoint = toAuthEndpoint(input.authBaseUrl, \"/api/auth/device/token\");\n const parsedRequest =\n betterAuthDeviceAuthorizationTokenRequestSchema.safeParse({\n grant_type: BETTER_AUTH_DEVICE_AUTHORIZATION_GRANT_TYPE,\n device_code: input.deviceCode,\n client_id: input.clientId,\n });\n if (!parsedRequest.success) {\n throw createClientError({\n endpoint,\n operation: \"exchange_device_token\",\n message: \"computer authorization token request was invalid\",\n cause: parsedRequest.error,\n });\n }\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(parsedRequest.data),\n signal: AbortSignal.timeout(10_000),\n });\n } catch (error) {\n throw createClientError({\n endpoint,\n operation: \"exchange_device_token\",\n message: \"computer authorization token request failed\",\n cause: error,\n });\n }\n\n const payload = await parseResponseJson(response);\n if (response.ok) {\n const parsed =\n betterAuthDeviceAuthorizationTokenResponseSchema.safeParse(payload);\n if (!parsed.success) {\n throw createClientError({\n endpoint,\n operation: \"exchange_device_token\",\n status: response.status,\n message: \"computer authorization token response was invalid\",\n cause: parsed.error,\n });\n }\n return { ok: true, data: parsed.data };\n }\n\n const parsedError =\n betterAuthDeviceAuthorizationErrorResponseSchema.safeParse(payload);\n return {\n ok: false,\n error: parsedError.success\n ? parsedError.data\n : { message: response.statusText || `HTTP ${response.status}` },\n status: response.status,\n };\n}\n\nexport async function fetchAuthUserSnapshot(input: {\n authBaseUrl: string;\n accessToken: string;\n}): Promise<AuthUserSnapshot> {\n const endpoint = toAuthEndpoint(input.authBaseUrl, \"/api/auth/get-session\");\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n authorization: `Bearer ${input.accessToken}`,\n },\n signal: AbortSignal.timeout(10_000),\n });\n } catch (error) {\n throw createClientError({\n endpoint,\n operation: \"read_auth_session\",\n message: \"computer authorization account request failed\",\n cause: error,\n });\n }\n if (!response.ok) {\n const payload = await parseResponseJson(response);\n throw createClientError({\n endpoint,\n operation: \"read_auth_session\",\n status: response.status,\n message: `computer authorization account request failed: ${extractAuthApiErrorMessage(payload, response.status)}`,\n });\n }\n\n const payload = await parseResponseJson(response);\n const parsed = betterAuthSessionSnapshotResponseSchema.safeParse(payload);\n if (!parsed.success) {\n throw createClientError({\n endpoint,\n operation: \"read_auth_session\",\n status: response.status,\n message: \"computer authorization account response was invalid\",\n cause: parsed.error,\n });\n }\n if (!parsed.data?.user) {\n throw createClientError({\n endpoint,\n operation: \"read_auth_session\",\n status: response.status,\n message: \"computer authorization account response did not include a user\",\n });\n }\n return parsed.data.user;\n}\n\nexport async function revokeAuthAccessToken(input: {\n accessToken: string;\n authBaseUrl: string;\n tokenType: string;\n}): Promise<RevokeAuthAccessTokenResult> {\n const endpoint = toAuthEndpoint(input.authBaseUrl, \"/api/auth/sign-out\");\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n authorization: `${input.tokenType} ${input.accessToken}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(10_000),\n });\n } catch (error) {\n return {\n ok: false,\n error: createClientError({\n endpoint,\n operation: \"revoke_auth_session\",\n message: \"unused computer authorization session could not be revoked\",\n cause: error,\n }),\n };\n }\n if (!response.ok) {\n const payload = await parseResponseJson(response);\n return {\n ok: false,\n error: createClientError({\n endpoint,\n operation: \"revoke_auth_session\",\n status: response.status,\n message: `unused computer authorization session could not be revoked: ${extractAuthApiErrorMessage(payload, response.status)}`,\n }),\n };\n }\n return { ok: true };\n}\n\nexport function resolveDeviceAuthClientId(value: string | undefined): string {\n const clientId =\n normalizeOptionalString(value) ??\n normalizeOptionalString(process.env.OPENMELD_AUTH_CLIENT_ID) ??\n DEFAULT_DEVICE_CLIENT_ID;\n if (!DEVICE_CLIENT_ID_PATTERN.test(clientId)) {\n throw new Error(\n `invalid client_id \"${clientId}\" (allowed: letters, numbers, . _ : -)`\n );\n }\n return clientId;\n}\n\nexport function resolveDeviceTokenExpiresAt(\n expiresIn: number | undefined\n): string | undefined {\n if (\n typeof expiresIn !== \"number\" ||\n !Number.isFinite(expiresIn) ||\n expiresIn <= 0\n ) {\n return undefined;\n }\n\n const now = Date.now();\n const MAX_DATE_MS = 8_640_000_000_000_000;\n const maxFutureMs = Math.max(\n 0,\n Math.min(Number.MAX_SAFE_INTEGER, MAX_DATE_MS) - now\n );\n const safeExpiresInSeconds = Math.min(\n Math.floor(expiresIn),\n Math.floor(maxFutureMs / 1000)\n );\n if (safeExpiresInSeconds <= 0) {\n return undefined;\n }\n\n return new Date(now + safeExpiresInSeconds * 1000).toISOString();\n}\n\nexport function extractAuthApiErrorMessage(\n payload: unknown,\n status: number\n): string {\n const parsed =\n betterAuthDeviceAuthorizationErrorResponseSchema.safeParse(payload);\n if (!parsed.success) {\n return `HTTP ${status}`;\n }\n return (\n normalizeOptionalString(parsed.data.error_description) ??\n normalizeOptionalString(parsed.data.detail) ??\n normalizeOptionalString(parsed.data.message) ??\n normalizeOptionalString(parsed.data.error) ??\n `HTTP ${status}`\n );\n}\n\nexport function readAuthUserFromSessionPayload(\n payload: unknown\n): AuthUserSnapshot | null {\n const parsed = betterAuthSessionSnapshotResponseSchema.safeParse(payload);\n return parsed.success ? (parsed.data?.user ?? null) : null;\n}\n\nfunction createClientError(input: {\n endpoint: string;\n message: string;\n operation: AuthDeviceSessionOperation;\n status?: number | null;\n cause?: unknown;\n}): AuthDeviceSessionClientError {\n return new AuthDeviceSessionClientError(input);\n}\n\nfunction toAuthEndpoint(baseUrl: string, pathname: string): string {\n const url = new URL(baseUrl);\n url.pathname = pathname;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nasync function parseResponseJson(response: Response): Promise<unknown> {\n const raw = await response.text();\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return { message: raw };\n }\n}\n","import type { CurrentCommandCheckState } from \"./types\";\n\nconst currentCommandCheckState: CurrentCommandCheckState = {\n signIn: null,\n selectedProfile: null,\n};\nlet currentCommandCheckScopeDepth = 0;\n\nexport function resetCurrentCommandCheckState(): void {\n currentCommandCheckState.signIn = null;\n currentCommandCheckState.selectedProfile = null;\n}\n\nexport function getCurrentCommandCheckState(): CurrentCommandCheckState {\n return currentCommandCheckState;\n}\n\nexport function startCurrentCommandCheckScope(): void {\n if (currentCommandCheckScopeDepth === 0) {\n resetCurrentCommandCheckState();\n }\n currentCommandCheckScopeDepth += 1;\n}\n\nexport function finishCurrentCommandCheckScope(): void {\n if (currentCommandCheckScopeDepth === 0) {\n resetCurrentCommandCheckState();\n return;\n }\n currentCommandCheckScopeDepth -= 1;\n if (currentCommandCheckScopeDepth === 0) {\n resetCurrentCommandCheckState();\n }\n}\n\nexport function isCurrentCommandCheckScopeActive(): boolean {\n return currentCommandCheckScopeDepth > 0;\n}\n","import { buildAgentOverviewFromContract } from \"../command-contracts/helpers\";\nimport { getCommandEntryContract } from \"../command-contracts/registry\";\nimport type { CommandEntryName } from \"../command-entry-checks/types\";\nimport type { Presenter } from \"../runtime/presenter\";\n\nexport type AuthAgentOverviewCommand = \"menu\" | \"status\" | \"login\" | \"logout\";\n\nexport function emitAuthAgentOverview(input: {\n presenter: Presenter;\n command: AuthAgentOverviewCommand;\n}): void {\n input.presenter.data({\n code: `auth.${input.command}.agent_overview`,\n payload: buildAuthAgentOverviewPayload(input.command),\n });\n}\n\nfunction buildAuthAgentOverviewPayload(\n command: AuthAgentOverviewCommand\n): Record<string, unknown> {\n const entryName = `auth.${command}` as CommandEntryName;\n const contract = getCommandEntryContract(entryName);\n if (!contract?.agentOverview) {\n throw new Error(`missing ${entryName} command contract`);\n }\n return buildAgentOverviewFromContract({\n context: {\n includeViewFlag: true,\n },\n overview: contract.agentOverview,\n });\n}\n","import { spawn } from \"node:child_process\";\n\nexport function tryOpenUrl(url: string): Promise<boolean> {\n const target = String(url ?? \"\").trim();\n if (!target) {\n return Promise.resolve(false);\n }\n\n const command = resolveOpenCommand();\n\n return new Promise<boolean>((resolve) => {\n const child = spawn(command, [target], {\n detached: true,\n stdio: \"ignore\",\n });\n\n let settled = false;\n const settle = (result: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(result);\n };\n\n child.once(\"error\", () => settle(false));\n child.once(\"spawn\", () => settle(true));\n child.unref();\n });\n}\n\nfunction resolveOpenCommand(): string {\n if (process.platform === \"darwin\") {\n return \"open\";\n }\n if (process.platform === \"win32\") {\n return \"explorer.exe\";\n }\n return \"xdg-open\";\n}\n","import { readSync } from \"node:fs\";\nimport type { Key } from \"node:readline\";\nimport stringWidth from \"string-width\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\n\nconst TERMINAL_READ_BUFFER_BYTES = 64;\n\nexport type InteractivePromptStatus = \"active\" | \"submitted\" | \"cancelled\";\n\n// Interactive prompts default to the process std streams, but callers can pass\n// an explicit terminal (e.g. /dev/tty) so a prompt can run even when stdin is\n// redirected to /dev/null — as happens in the `curl | sh` setup bootstrap.\nexport type InteractivePromptStreams = {\n input: NodeJS.ReadStream;\n output: NodeJS.WriteStream;\n};\n\nexport type InteractivePromptKeypressResult<State, Result> =\n | { type: \"state\"; state: State }\n | {\n type: \"result\";\n result: Result;\n status: Exclude<InteractivePromptStatus, \"active\">;\n state?: State;\n }\n | { type: \"ignore\" };\n\nexport type InteractivePromptKeypressEvent = {\n key: Key;\n str: string | undefined;\n};\n\nexport function isReturnKeypress(input: {\n str: string | undefined;\n key: Key;\n}): boolean {\n return (\n input.key.name === \"return\" ||\n input.key.name === \"enter\" ||\n input.key.sequence === \"\\r\" ||\n input.key.sequence === \"\\n\" ||\n input.str === \"\\r\" ||\n input.str === \"\\n\"\n );\n}\n\nexport function parseInteractivePromptInputData(\n chunk: Buffer | string | Uint8Array\n): InteractivePromptKeypressEvent[] {\n const text =\n typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(\"utf8\");\n const events: InteractivePromptKeypressEvent[] = [];\n let index = 0;\n\n while (index < text.length) {\n const parsed = parseNextInteractivePromptKeypress(text, index);\n events.push(parsed.event);\n index += parsed.length;\n }\n\n return events;\n}\n\nfunction parseNextInteractivePromptKeypress(\n text: string,\n index: number\n): {\n event: InteractivePromptKeypressEvent;\n length: number;\n} {\n const remaining = text.slice(index);\n return (\n parseAnsiEscapeKeypress(remaining) ??\n parseControlKeypress(text[index] ?? \"\") ??\n parsePrintableKeypress(text, index) ?? {\n event: {\n str: text[index],\n key: { sequence: text[index] },\n },\n length: 1,\n }\n );\n}\n\nfunction parseAnsiEscapeKeypress(input: string): {\n event: InteractivePromptKeypressEvent;\n length: number;\n} | null {\n if (input.startsWith(\"\\u001b[A\")) {\n return {\n event: { str: undefined, key: { name: \"up\", sequence: \"\\u001b[A\" } },\n length: 3,\n };\n }\n if (input.startsWith(\"\\u001b[B\")) {\n return {\n event: { str: undefined, key: { name: \"down\", sequence: \"\\u001b[B\" } },\n length: 3,\n };\n }\n if (input.startsWith(\"\\u001b[C\")) {\n return {\n event: { str: undefined, key: { name: \"right\", sequence: \"\\u001b[C\" } },\n length: 3,\n };\n }\n if (input.startsWith(\"\\u001b[D\")) {\n return {\n event: { str: undefined, key: { name: \"left\", sequence: \"\\u001b[D\" } },\n length: 3,\n };\n }\n if (input.startsWith(\"\\u001b[Z\")) {\n return {\n event: {\n str: undefined,\n key: { name: \"tab\", sequence: \"\\u001b[Z\", shift: true },\n },\n length: 3,\n };\n }\n if (input.startsWith(\"\\u001b\")) {\n return {\n event: { str: undefined, key: { name: \"escape\", sequence: \"\\u001b\" } },\n length: 1,\n };\n }\n return null;\n}\n\nfunction parseControlKeypress(character: string): {\n event: InteractivePromptKeypressEvent;\n length: number;\n} | null {\n const key = readControlKey(character);\n return key\n ? {\n event: {\n str: character,\n key,\n },\n length: 1,\n }\n : null;\n}\n\nfunction readControlKey(character: string): Key | null {\n if (character === \"\\u0003\") {\n return { ctrl: true, name: \"c\", sequence: character };\n }\n if (character === \"\\u0015\") {\n return { ctrl: true, name: \"u\", sequence: character };\n }\n if (character === \"\\r\" || character === \"\\n\") {\n return { name: \"return\", sequence: character };\n }\n if (character === \"\\u007f\" || character === \"\\b\") {\n return { name: \"backspace\", sequence: character };\n }\n if (character === \"\\t\") {\n return { name: \"tab\", sequence: character };\n }\n if (character === \" \") {\n return { name: \"space\", sequence: character };\n }\n return null;\n}\n\nfunction parsePrintableKeypress(\n text: string,\n index: number\n): {\n event: InteractivePromptKeypressEvent;\n length: number;\n} | null {\n const printableRun = readPrintableRun(text, index);\n return printableRun.length > 0\n ? {\n event: {\n str: printableRun,\n key: {\n name: printableRun.length === 1 ? printableRun : undefined,\n sequence: printableRun,\n },\n },\n length: printableRun.length,\n }\n : null;\n}\n\nfunction readPrintableRun(text: string, startIndex: number): string {\n let index = startIndex;\n while (index < text.length) {\n const charCode = text.charCodeAt(index);\n if (charCode < 0x21 || charCode > 0x7e) {\n break;\n }\n if (text[index] === \"\\u001b\") {\n break;\n }\n index += 1;\n }\n return text.slice(startIndex, index);\n}\n\nexport function resolveSynchronousTerminalInputFd(\n inputStream: NodeJS.ReadStream\n): number | null {\n if (!isBinaryDistribution()) {\n return null;\n }\n const fd = (inputStream as { fd?: unknown }).fd;\n return typeof fd === \"number\" && Number.isInteger(fd) && fd >= 0 ? fd : null;\n}\n\ntype RunInteractivePromptInput<State, Result> = {\n initialState: State;\n fallbackResult: Result;\n renderLines: (state: State, status: InteractivePromptStatus) => string[];\n handleKeypress: (input: {\n state: State;\n str: string | undefined;\n key: Key;\n }) => InteractivePromptKeypressResult<State, Result>;\n};\n\nexport function runInteractivePrompt<State, Result>(\n input: RunInteractivePromptInput<State, Result>,\n streams?: InteractivePromptStreams\n): Promise<Result> {\n // Keep wrap-aware prompt rendering in one place so every interactive prompt\n // clears the full terminal frame after line wrapping.\n const inputStream = streams?.input ?? process.stdin;\n const outputStream = streams?.output ?? process.stdout;\n if (\n inputStream.isTTY !== true ||\n outputStream.isTTY !== true ||\n typeof inputStream.setRawMode !== \"function\"\n ) {\n return Promise.resolve(input.fallbackResult);\n }\n\n return new Promise((resolve) => {\n let state = input.initialState;\n let lastRenderHeight = 0;\n let cleanedUp = false;\n const synchronousInputFd = resolveSynchronousTerminalInputFd(inputStream);\n\n inputStream.setRawMode(true);\n if (synchronousInputFd === null) {\n inputStream.resume();\n }\n\n const clearRender = () => {\n if (lastRenderHeight <= 0) {\n return;\n }\n outputStream.write(`\\u001B[${String(lastRenderHeight)}A`);\n for (let index = 0; index < lastRenderHeight; index += 1) {\n outputStream.write(\"\\u001B[2K\\u001B[1B\");\n }\n outputStream.write(`\\u001B[${String(lastRenderHeight)}A`);\n };\n\n const render = (status: InteractivePromptStatus = \"active\") => {\n clearRender();\n const lines = input.renderLines(state, status);\n outputStream.write(`${lines.join(\"\\n\")}\\n`);\n lastRenderHeight = measureRenderedTerminalLinesHeight(\n lines,\n outputStream.columns\n );\n };\n\n const cleanup = () => {\n if (cleanedUp) {\n return;\n }\n cleanedUp = true;\n if (synchronousInputFd === null) {\n inputStream.removeListener(\"data\", onData);\n inputStream.pause();\n }\n inputStream.setRawMode(false);\n };\n\n const finish = (\n result: Result,\n status: Exclude<InteractivePromptStatus, \"active\">,\n nextState?: State\n ) => {\n if (nextState) {\n state = nextState;\n }\n render(status);\n cleanup();\n resolve(result);\n };\n\n const handleParsedKeypress = (str: string | undefined, key: Key) => {\n const keypressResult = input.handleKeypress({\n state,\n str,\n key,\n });\n if (keypressResult.type === \"ignore\") {\n return;\n }\n if (keypressResult.type === \"result\") {\n finish(\n keypressResult.result,\n keypressResult.status,\n keypressResult.state\n );\n return;\n }\n state = keypressResult.state;\n render();\n };\n\n const handleInputChunk = (chunk: Buffer | string | Uint8Array) => {\n for (const event of parseInteractivePromptInputData(chunk)) {\n handleParsedKeypress(event.str, event.key);\n if (cleanedUp) {\n return;\n }\n }\n };\n\n const onData = (chunk: Buffer | string) => {\n handleInputChunk(chunk);\n };\n\n const readSynchronouslyFromTerminal = () => {\n const buffer = Buffer.alloc(TERMINAL_READ_BUFFER_BYTES);\n while (!cleanedUp && synchronousInputFd !== null) {\n let bytesRead = 0;\n try {\n bytesRead = readSync(\n synchronousInputFd,\n buffer,\n 0,\n buffer.length,\n null\n );\n } catch {\n finish(input.fallbackResult, \"cancelled\");\n return;\n }\n if (bytesRead <= 0) {\n finish(input.fallbackResult, \"cancelled\");\n return;\n }\n handleInputChunk(buffer.subarray(0, bytesRead));\n }\n };\n\n if (synchronousInputFd === null) {\n inputStream.on(\"data\", onData);\n }\n render();\n if (synchronousInputFd !== null) {\n setImmediate(readSynchronouslyFromTerminal);\n }\n });\n}\n\nexport function measureRenderedTerminalLinesHeight(\n lines: string[],\n columns: number | undefined\n): number {\n const normalizedColumns =\n typeof columns === \"number\" && Number.isFinite(columns) && columns > 0\n ? Math.trunc(columns)\n : null;\n if (normalizedColumns === null) {\n return lines.length;\n }\n\n return lines.reduce(\n (height, line) =>\n height + measureRenderedTerminalLineHeight(line, normalizedColumns),\n 0\n );\n}\n\nexport function measureRenderedTerminalLineHeight(\n line: string,\n columns: number\n): number {\n const width = stringWidth(line);\n if (width <= 0) {\n return 1;\n }\n return Math.max(1, Math.ceil(width / columns));\n}\n","import type { Key } from \"node:readline\";\nimport pc from \"picocolors\";\nimport {\n type InteractivePromptKeypressResult,\n type InteractivePromptStatus,\n isReturnKeypress,\n measureRenderedTerminalLinesHeight,\n runInteractivePrompt,\n} from \"./interactive-prompt\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\n\nconst PROMPT_SYMBOL_ACTIVE = pc.green(\"◇\");\nconst PROMPT_SYMBOL_CANCELLED = pc.red(\"■\");\nconst CURSOR_SYMBOL = pc.cyan(\"❯\");\nconst BAR_SYMBOL = pc.dim(\"│\");\nconst DEFAULT_PLACEHOLDER = \"\";\nconst PRINTABLE_TEXT_INPUT_REGEX = /^[\\x20-\\x7E]+$/;\n\ntype TextEntryPromptStatus = InteractivePromptStatus;\nexport type TextEntryPromptFocus = \"input\" | \"back\";\n\nexport type TextEntryState = {\n readonly message: string;\n readonly description?: string;\n readonly placeholder: string;\n readonly allowBack: boolean;\n readonly allowEmpty: boolean;\n readonly backLabel: string;\n readonly requiredMessage: string;\n readonly value: string;\n readonly focus: TextEntryPromptFocus;\n readonly errorMessage?: string;\n};\n\ntype TextEntryKeypressResult = InteractivePromptKeypressResult<\n TextEntryState,\n TextEntryPromptResult\n>;\n\ntype CreateTextEntryStateInput = {\n message: string;\n description?: string;\n placeholder?: string;\n allowBack?: boolean;\n allowEmpty?: boolean;\n backLabel?: string;\n requiredMessage?: string;\n value?: string;\n focus?: TextEntryPromptFocus;\n errorMessage?: string;\n};\n\nexport type TextEntryPromptResult =\n | { status: \"submitted\"; value: string }\n | { status: \"back\" }\n | { status: \"cancelled\" };\n\nexport function createTextEntryState(\n input: CreateTextEntryStateInput\n): TextEntryState {\n return {\n message: sanitizeTerminalDisplayText(input.message, \"single-line\"),\n description:\n typeof input.description === \"string\"\n ? sanitizeTerminalDisplayText(input.description, \"single-line\")\n : undefined,\n placeholder: sanitizeTerminalDisplayText(\n input.placeholder ?? DEFAULT_PLACEHOLDER,\n \"single-line\"\n ),\n allowBack: input.allowBack === true,\n allowEmpty: input.allowEmpty === true,\n backLabel: sanitizeTerminalDisplayText(\n input.backLabel ?? \"Back\",\n \"single-line\"\n ),\n requiredMessage: sanitizeTerminalDisplayText(\n input.requiredMessage ?? \"Space ID is required.\",\n \"single-line\"\n ),\n value: input.value ?? \"\",\n focus: input.focus ?? \"input\",\n errorMessage: input.errorMessage,\n };\n}\n\nexport function promptTextEntry(input: {\n message: string;\n description?: string;\n placeholder?: string;\n allowBack?: boolean;\n allowEmpty?: boolean;\n backLabel?: string;\n requiredMessage?: string;\n validate?: (value: string) => string | null;\n}): Promise<TextEntryPromptResult> {\n return runInteractivePrompt({\n initialState: createTextEntryState(input),\n fallbackResult: {\n status: input.allowBack === true ? \"back\" : \"cancelled\",\n },\n renderLines: (state, status) => renderTextEntryPromptLines(state, status),\n handleKeypress: ({ state, str, key }) =>\n handleTextEntryKeypress({\n state,\n str,\n key,\n validate: input.validate,\n }),\n });\n}\n\nexport function handleTextEntryKeypress(input: {\n state: TextEntryState;\n str: string | undefined;\n key: Key;\n validate?: (value: string) => string | null;\n}): TextEntryKeypressResult {\n const { state, str, key, validate } = input;\n if (!key) {\n return { type: \"ignore\" };\n }\n\n if (key.ctrl === true && key.name === \"c\") {\n return {\n type: \"result\",\n result: { status: \"cancelled\" },\n status: \"cancelled\",\n };\n }\n\n if (key.name === \"escape\") {\n return resolveTextEntryEscape(state);\n }\n\n if (isTextEntryFocusToggleKey(key.name)) {\n return {\n type: \"state\",\n state: toggleTextEntryFocus(state),\n };\n }\n\n if (isReturnKeypress({ key, str })) {\n return submitTextEntryValue({\n state,\n validate,\n });\n }\n\n if (state.focus !== \"input\") {\n return { type: \"ignore\" };\n }\n\n if (key.name === \"backspace\") {\n return {\n type: \"state\",\n state: {\n ...state,\n value: state.value.slice(0, -1),\n errorMessage: undefined,\n },\n };\n }\n\n if (key.ctrl === true && key.name === \"u\") {\n return {\n type: \"state\",\n state: {\n ...state,\n value: \"\",\n errorMessage: undefined,\n },\n };\n }\n\n if (!isPrintableTextInput(str)) {\n return { type: \"ignore\" };\n }\n\n return {\n type: \"state\",\n state: {\n ...state,\n value: `${state.value}${str}`,\n errorMessage: undefined,\n },\n };\n}\n\nfunction resolveTextEntryEscape(\n state: TextEntryState\n): TextEntryKeypressResult {\n if (!state.allowBack) {\n return {\n type: \"result\",\n result: { status: \"cancelled\" },\n status: \"cancelled\",\n };\n }\n\n return {\n type: \"result\",\n result: { status: \"back\" },\n status: \"submitted\",\n state: {\n ...state,\n focus: \"back\",\n errorMessage: undefined,\n },\n };\n}\n\nfunction toggleTextEntryFocus(state: TextEntryState): TextEntryState {\n if (!state.allowBack) {\n return state;\n }\n\n return {\n ...state,\n focus: state.focus === \"input\" ? \"back\" : \"input\",\n errorMessage: undefined,\n };\n}\n\nfunction submitTextEntryValue(input: {\n state: TextEntryState;\n validate?: (value: string) => string | null;\n}): TextEntryKeypressResult {\n if (input.state.focus === \"back\") {\n return {\n type: \"result\",\n result: { status: \"back\" },\n status: \"submitted\",\n };\n }\n\n const normalized = input.state.value.trim();\n if (!input.state.allowEmpty && normalized.length === 0) {\n return {\n type: \"state\",\n state: {\n ...input.state,\n errorMessage: input.state.requiredMessage,\n },\n };\n }\n\n const validationError = input.validate?.(normalized) ?? null;\n if (validationError) {\n return {\n type: \"state\",\n state: {\n ...input.state,\n errorMessage: validationError,\n },\n };\n }\n\n return {\n type: \"result\",\n result: { status: \"submitted\", value: normalized },\n status: \"submitted\",\n };\n}\n\nfunction isTextEntryFocusToggleKey(name: string | undefined): boolean {\n return name === \"up\" || name === \"down\" || name === \"tab\";\n}\n\nexport function renderTextEntryPromptLines(\n state: TextEntryState,\n status: TextEntryPromptStatus\n): string[] {\n const symbol =\n status === \"cancelled\" ? PROMPT_SYMBOL_CANCELLED : PROMPT_SYMBOL_ACTIVE;\n const lines = [`${symbol} ${pc.bold(state.message)}`];\n\n if (status === \"submitted\") {\n if (state.focus === \"back\") {\n lines.push(`${BAR_SYMBOL} ${pc.dim(state.backLabel)}`);\n return lines;\n }\n lines.push(`${BAR_SYMBOL} ${pc.dim(state.value.trim())}`);\n return lines;\n }\n\n if (status === \"cancelled\") {\n lines.push(`${BAR_SYMBOL} ${pc.strikethrough(pc.dim(\"Cancelled\"))}`);\n return lines;\n }\n\n if (state.description) {\n lines.push(`${BAR_SYMBOL} ${pc.dim(state.description)}`);\n }\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(\n state.allowBack ? \"enter confirm, esc back\" : \"enter confirm\"\n )}`\n );\n lines.push(`${BAR_SYMBOL}`);\n lines.push(renderTextEntryInputLine(state));\n\n if (state.errorMessage) {\n lines.push(`${BAR_SYMBOL} ${pc.red(state.errorMessage)}`);\n }\n\n if (state.allowBack) {\n lines.push(`${BAR_SYMBOL}`);\n lines.push(renderTextEntryBackLine(state));\n }\n\n lines.push(pc.dim(\"└\"));\n return lines;\n}\n\nexport function measureRenderedTextEntryPromptHeight(\n lines: string[],\n columns: number | undefined\n): number {\n return measureRenderedTerminalLinesHeight(lines, columns);\n}\n\nfunction renderTextEntryInputLine(state: TextEntryState): string {\n const prefix = state.focus === \"input\" ? CURSOR_SYMBOL : \" \";\n const content =\n state.value.length > 0 ? state.value : pc.dim(state.placeholder || \" \");\n const rendered =\n state.focus === \"input\" ? `${content}${pc.inverse(\" \")}` : content;\n return `${BAR_SYMBOL} ${prefix} ${rendered}`;\n}\n\nfunction renderTextEntryBackLine(state: TextEntryState): string {\n const prefix = state.focus === \"back\" ? CURSOR_SYMBOL : \" \";\n const label =\n state.focus === \"back\" ? pc.underline(state.backLabel) : state.backLabel;\n return `${BAR_SYMBOL} ${prefix} ${label}`;\n}\n\nfunction isPrintableTextInput(value: string | undefined): boolean {\n return typeof value === \"string\" && value.length > 0\n ? PRINTABLE_TEXT_INPUT_REGEX.test(value)\n : false;\n}\n","import process from \"node:process\";\nimport pc from \"picocolors\";\nimport stringWidth from \"string-width\";\n\nexport type UnifiedCardFrame = {\n top: string;\n empty: string;\n rows: string[];\n bottom: string;\n contentWidth: number;\n};\n\nexport function buildUnifiedCardFrame(input: {\n title: string;\n rowTextList: string[];\n minContentWidth?: number;\n horizontalPadding?: number;\n}): UnifiedCardFrame {\n const horizontalPadding = Math.max(0, input.horizontalPadding ?? 2);\n const minContentWidth = input.minContentWidth ?? 56;\n const maxContentWidth = resolveMaxContentWidth(horizontalPadding);\n const naturalContentWidth = Math.max(\n 0,\n ...input.rowTextList.map((row) => visibleWidth(row))\n );\n const initialContentWidth = resolveInitialContentWidth({\n maxContentWidth,\n minContentWidth,\n naturalContentWidth,\n });\n const wrappedRows = input.rowTextList.flatMap((row) =>\n wrapCardRowText(row, initialContentWidth)\n );\n const contentWidth = Math.max(\n wrappedRows.length > 0 ? 0 : initialContentWidth,\n ...wrappedRows.map((row) => visibleWidth(row))\n );\n const titleWidth = visibleWidth(input.title);\n const frameInnerWidth = Math.max(\n contentWidth + horizontalPadding * 2,\n titleWidth + 1\n );\n const rowContentWidth = frameInnerWidth - horizontalPadding * 2;\n const topBorderWidth = Math.max(1, frameInnerWidth - titleWidth);\n const top = `${input.title} ${pc.dim(\n \"─\".repeat(topBorderWidth)\n )}${pc.dim(\"┐\")}`;\n const empty = `${pc.dim(\"│\")}${\" \".repeat(horizontalPadding)}${\" \".repeat(rowContentWidth)}${\" \".repeat(horizontalPadding)}${pc.dim(\"│\")}`;\n const rows = wrappedRows.map(\n (row) =>\n `${pc.dim(\"│\")}${\" \".repeat(horizontalPadding)}${padEndVisibleWidth(\n row,\n rowContentWidth\n )}${\" \".repeat(horizontalPadding)}${pc.dim(\"│\")}`\n );\n const bottom = `${pc.dim(\"└\")}${pc.dim(\"─\".repeat(frameInnerWidth))}${pc.dim(\"┘\")}`;\n\n return {\n top,\n empty,\n rows,\n bottom,\n contentWidth: rowContentWidth,\n };\n}\n\nfunction visibleWidth(value: string): number {\n return stringWidth(value);\n}\n\nfunction padEndVisibleWidth(value: string, targetWidth: number): string {\n const valueWidth = visibleWidth(value);\n if (valueWidth >= targetWidth) {\n return value;\n }\n return `${value}${\" \".repeat(targetWidth - valueWidth)}`;\n}\n\nfunction resolveInitialContentWidth(input: {\n maxContentWidth: number | null;\n minContentWidth: number;\n naturalContentWidth: number;\n}): number {\n if (input.maxContentWidth === null) {\n return Math.max(input.minContentWidth, input.naturalContentWidth);\n }\n\n if (input.maxContentWidth >= input.minContentWidth) {\n return Math.max(\n input.minContentWidth,\n Math.min(input.naturalContentWidth, input.maxContentWidth)\n );\n }\n\n return input.maxContentWidth;\n}\n\nfunction resolveMaxContentWidth(horizontalPadding: number): number | null {\n if (!process.stdout.isTTY || typeof process.stdout.columns !== \"number\") {\n return null;\n }\n const availableWidth = process.stdout.columns - horizontalPadding * 2 - 2;\n return Math.max(16, availableWidth);\n}\n\nfunction wrapCardRowText(value: string, width: number): string[] {\n if (width <= 0 || visibleWidth(value) <= width) {\n return [value];\n }\n\n const words = value.split(\" \");\n const lines: string[] = [];\n let currentLine = \"\";\n\n for (const word of words) {\n if (currentLine.length === 0) {\n pushWrappedWord(word, width, lines, (nextLine) => {\n currentLine = nextLine;\n });\n continue;\n }\n\n const candidate = `${currentLine} ${word}`;\n if (visibleWidth(candidate) <= width) {\n currentLine = candidate;\n continue;\n }\n\n lines.push(currentLine);\n currentLine = \"\";\n pushWrappedWord(word, width, lines, (nextLine) => {\n currentLine = nextLine;\n });\n }\n\n if (currentLine.length > 0) {\n lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction pushWrappedWord(\n word: string,\n width: number,\n lines: string[],\n setCurrentLine: (value: string) => void\n): void {\n if (visibleWidth(word) <= width) {\n setCurrentLine(word);\n return;\n }\n\n let segment = \"\";\n for (const character of word) {\n const candidate = `${segment}${character}`;\n if (segment.length > 0 && visibleWidth(candidate) > width) {\n lines.push(segment);\n segment = character;\n continue;\n }\n segment = candidate;\n }\n setCurrentLine(segment);\n}\n","import type { Presenter } from \"../runtime/presenter\";\nimport { buildUnifiedCardFrame } from \"./card-frame\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\n\nexport type InfoCardRow = {\n label: string;\n value: string;\n};\n\nexport function renderInfoCard(input: {\n presenter: Presenter;\n title: string;\n codePrefix: string;\n rows: InfoCardRow[];\n sanitize?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n compact?: boolean;\n}): void {\n const frame = buildInfoCardFrame(input);\n\n input.presenter.line({ code: `${input.codePrefix}.top`, text: frame.top });\n if (!input.compact) {\n input.presenter.line({\n code: `${input.codePrefix}.empty.start`,\n text: frame.empty,\n });\n }\n\n for (const rowText of frame.rows) {\n input.presenter.line({ code: `${input.codePrefix}.row`, text: rowText });\n }\n\n if (!input.compact) {\n input.presenter.line({\n code: `${input.codePrefix}.empty.end`,\n text: frame.empty,\n });\n }\n input.presenter.line({\n code: `${input.codePrefix}.bottom`,\n text: frame.bottom,\n });\n}\n\nexport function renderTextInfoCard(input: {\n title: string;\n rows: InfoCardRow[];\n emitLine: (line: string) => void;\n sanitize?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n compact?: boolean;\n}): void {\n for (const line of buildTextInfoCardLines(input)) {\n input.emitLine(line);\n }\n}\n\nexport function buildTextInfoCardLines(input: {\n title: string;\n rows: InfoCardRow[];\n sanitize?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n compact?: boolean;\n}): string[] {\n const frame = buildInfoCardFrame(input);\n const lines = [frame.top];\n if (!input.compact) {\n lines.push(frame.empty);\n }\n lines.push(...frame.rows);\n if (!input.compact) {\n lines.push(frame.empty);\n }\n lines.push(frame.bottom);\n return lines;\n}\n\nfunction buildInfoCardFrame(input: {\n title: string;\n rows: InfoCardRow[];\n sanitize?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n}) {\n const rowTextList = input.rows.map((row) =>\n toCardRowText(row, Boolean(input.sanitize))\n );\n return buildUnifiedCardFrame({\n title: input.sanitize ? sanitizeCardTitle(input.title) : input.title,\n rowTextList,\n minContentWidth: input.minContentWidth ?? 48,\n horizontalPadding: input.horizontalPadding,\n });\n}\n\nfunction toCardRowText(row: InfoCardRow, sanitize: boolean): string {\n const label = sanitize ? sanitizeCardLabel(row.label) : row.label;\n const value = sanitize ? sanitizeCardValue(row.value) : row.value;\n const normalizedLabel = label.trim();\n const normalizedValue = value.trim();\n if (normalizedLabel.length === 0 && normalizedValue.length === 0) {\n return \"\";\n }\n if (normalizedValue.length === 0) {\n return `${label}:`;\n }\n if (normalizedLabel.length === 0) {\n return value;\n }\n return `${label}: ${value}`;\n}\n\nfunction sanitizeCardLabel(value: string): string {\n return sanitizeTerminalDisplayText(value, \"single-line\")\n .replaceAll(/\\s+/g, \" \")\n .trim();\n}\n\nfunction sanitizeCardTitle(value: string): string {\n return sanitizeTerminalDisplayText(value, \"single-line\")\n .replaceAll(/\\s+/g, \" \")\n .trim();\n}\n\nfunction sanitizeCardValue(value: string): string {\n return sanitizeTerminalDisplayText(value, \"single-line\")\n .replaceAll(/[\\r\\n\\t]+/g, \" \")\n .replaceAll(/\\s+/g, \" \")\n .trim();\n}\n","import {\n type AuthenticationGuidance,\n buildAuthenticationStatusLabel,\n buildHumanAuthenticationCard,\n resolveAuthenticationGuidance,\n resolveAuthenticationReasonFromState,\n} from \"../auth/auth-guidance\";\nimport type {\n AuthSessionState,\n AuthSessionStateReasonCode,\n AuthSessionStateResult,\n StoredActiveOrganization,\n} from \"../config/auth-session\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { renderInfoCard } from \"../ui/info-card\";\n\ntype AuthStatusSnapshot = {\n signedIn: boolean;\n state: AuthSessionState;\n reasonCode?: AuthSessionStateReasonCode;\n errorMessage?: string;\n userId: string | null;\n userEmail: string | null;\n userName: string | null;\n clientId: string | null;\n authBaseUrl: string | null;\n tokenType: string | null;\n scope: string | null;\n createdAt: string | null;\n expiresAt: string | null;\n expiresIn: string | null;\n expired: boolean;\n activeOrganization: StoredActiveOrganization | null;\n};\n\nexport type { AuthStatusSnapshot };\n\nexport function buildAuthStatusSnapshot(\n input: AuthSessionStateResult\n): AuthStatusSnapshot {\n const session = input.session;\n if (!session) {\n return {\n signedIn: false,\n state: input.state,\n ...(input.reasonCode ? { reasonCode: input.reasonCode } : {}),\n ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),\n userId: null,\n userEmail: null,\n userName: null,\n clientId: null,\n authBaseUrl: null,\n tokenType: null,\n scope: null,\n createdAt: null,\n expiresAt: null,\n expiresIn: null,\n expired: false,\n activeOrganization: null,\n };\n }\n\n const expiresAt = normalizeOptionalString(session.expiresAt);\n const expiresAtMs = expiresAt ? Date.parse(expiresAt) : Number.NaN;\n const hasValidExpiresAt = Number.isFinite(expiresAtMs);\n const expiresInMs = hasValidExpiresAt ? expiresAtMs - Date.now() : Number.NaN;\n const expired = hasValidExpiresAt ? expiresInMs <= 0 : false;\n\n return {\n signedIn: input.state === \"valid\",\n state: input.state,\n ...(input.reasonCode ? { reasonCode: input.reasonCode } : {}),\n ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),\n userId: normalizeOptionalString(session.user?.id),\n userEmail: normalizeOptionalString(session.user?.email),\n userName: normalizeOptionalString(session.user?.name),\n clientId: normalizeOptionalString(session.clientId),\n authBaseUrl: normalizeOptionalString(session.authBaseUrl),\n tokenType: normalizeOptionalString(session.tokenType),\n scope: normalizeOptionalString(session.scope),\n createdAt: normalizeOptionalString(session.createdAt),\n expiresAt,\n expiresIn: hasValidExpiresAt ? formatRemainingDuration(expiresInMs) : null,\n expired,\n activeOrganization: session.activeOrganization ?? null,\n };\n}\n\nexport function renderAuthStatusCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n auth: AuthStatusSnapshot;\n codePrefix: string;\n}): void {\n renderInfoCard({\n presenter: input.presenter,\n title: \"Authentication Status\",\n codePrefix: input.codePrefix,\n rows: buildAuthStatusRows(input.auth),\n });\n}\n\nexport function renderAuthStatusGuidanceCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n guidance: AuthenticationGuidance;\n codePrefix: string;\n}): void {\n const card = buildHumanAuthenticationCard({\n guidance: input.guidance,\n mode: \"error\",\n });\n renderInfoCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: input.codePrefix,\n rows: card.rows,\n });\n}\n\nfunction buildSignedInRows(\n auth: AuthStatusSnapshot\n): Array<{ label: string; value: string }> {\n const rows: Array<{ label: string; value: string }> = [\n { label: \"Status\", value: \"signed in\" },\n ];\n\n appendRowIfValue(rows, \"Email\", auth.userEmail);\n appendRowIfValue(rows, \"User ID\", auth.userId);\n appendRowIfValue(rows, \"Name\", auth.userName);\n rows.push({\n label: \"Active Organization\",\n value: auth.activeOrganization\n ? formatActiveOrganizationLabel(auth.activeOrganization)\n : \"not selected\",\n });\n appendRowIfValue(rows, \"Client ID\", auth.clientId);\n appendRowIfValue(rows, \"Auth URL\", auth.authBaseUrl);\n appendRowIfValue(rows, \"Token Type\", auth.tokenType);\n appendRowIfValue(rows, \"Scope\", auth.scope);\n appendRowIfValue(rows, \"Created At\", auth.createdAt);\n appendRowIfValue(rows, \"Expires At\", auth.expiresAt);\n appendRowIfValue(rows, \"Expires In\", auth.expiresIn);\n rows.push({ label: \"Expired\", value: auth.expired ? \"yes\" : \"no\" });\n\n return rows;\n}\n\nexport function formatActiveOrganizationLabel(\n organization: StoredActiveOrganization\n): string {\n const role = organization.role ? `, ${organization.role}` : \"\";\n return `${organization.name} (${organization.slug})${role}`;\n}\n\nexport function buildAuthStatusRows(\n auth: AuthStatusSnapshot\n): Array<{ label: string; value: string }> {\n if (auth.state === \"valid\") {\n return buildSignedInRows(auth);\n }\n\n const rows: Array<{ label: string; value: string }> = [\n { label: \"Status\", value: buildAuthStatusLabel(auth.state) },\n ];\n const reason = resolveAuthenticationReasonFromState(auth.state);\n if (reason) {\n rows.push({\n label: \"Next\",\n value: resolveAuthenticationGuidance({\n reason,\n }).errorNextStep,\n });\n }\n\n appendRowIfValue(rows, \"Client ID\", auth.clientId);\n appendRowIfValue(rows, \"Auth URL\", auth.authBaseUrl);\n appendRowIfValue(rows, \"Created At\", auth.createdAt);\n appendRowIfValue(rows, \"Expires At\", auth.expiresAt);\n appendRowIfValue(rows, \"Expires In\", auth.expiresIn);\n return rows;\n}\n\nfunction buildAuthStatusLabel(state: AuthSessionState): string {\n return buildAuthenticationStatusLabel(state);\n}\n\nfunction appendRowIfValue(\n rows: Array<{ label: string; value: string }>,\n label: string,\n value: string | null\n): void {\n if (!value) {\n return;\n }\n rows.push({ label, value });\n}\n\nfunction normalizeOptionalString(\n value: string | null | undefined\n): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction formatRemainingDuration(inputMs: number): string {\n if (inputMs <= 0) {\n return \"expired\";\n }\n\n const totalSeconds = Math.floor(inputMs / 1000);\n const days = Math.floor(totalSeconds / 86_400);\n const hours = Math.floor((totalSeconds % 86_400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n if (days > 0) {\n return `${days}d ${hours}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n }\n return `${seconds}s`;\n}\n","import {\n type AuthDeviceSessionClientError,\n extractAuthApiErrorMessage,\n fetchAuthUserSnapshot,\n readAuthUserFromSessionPayload,\n revokeAuthAccessToken,\n} from \"./auth-device-session-client\";\nimport type { PreparedAuthSession } from \"./prepared-auth-session\";\n\nexport type OneTimeTokenAuthFailureCode =\n | \"invalid_token\"\n | \"expired_token\"\n | \"missing_access_token\"\n | \"session_not_saved\"\n | \"unknown\";\n\nexport class OneTimeTokenAuthError extends Error {\n readonly code: OneTimeTokenAuthFailureCode;\n\n constructor(\n code: OneTimeTokenAuthFailureCode,\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = \"OneTimeTokenAuthError\";\n this.code = code;\n }\n}\n\nexport type OneTimeTokenErrorDiagnostic = {\n cause?: OneTimeTokenErrorDiagnostic;\n code?: number | string;\n endpoint?: string;\n message: string;\n name: string;\n operation?: string;\n path?: string;\n stack?: string;\n status?: number | null;\n};\n\nexport class OneTimeTokenCandidateSessionCleanupError extends OneTimeTokenAuthError {\n readonly cleanup: OneTimeTokenErrorDiagnostic;\n\n constructor(input: {\n cause: unknown;\n cleanupError: AuthDeviceSessionClientError;\n redactedValues?: readonly string[];\n }) {\n const redactedValues = input.redactedValues ?? [];\n const cleanup = createSanitizedErrorDiagnostic(\n input.cleanupError,\n redactedValues\n );\n const primary = createSanitizedErrorDiagnostic(input.cause, redactedValues);\n const safeCause =\n input.cause instanceof OneTimeTokenLocalSessionRecoveryError\n ? input.cause\n : createErrorFromDiagnostic(primary);\n const status =\n cleanup.status === null\n ? \"network error\"\n : `HTTP ${String(cleanup.status)}`;\n super(\n input.cause instanceof OneTimeTokenAuthError\n ? input.cause.code\n : \"unknown\",\n `${primary.message}; cleanup failed at ${cleanup.endpoint ?? \"unknown endpoint\"} (${status}): ${cleanup.message}`,\n { cause: safeCause }\n );\n this.name = \"OneTimeTokenCandidateSessionCleanupError\";\n this.cleanup = cleanup;\n }\n}\n\nexport class OneTimeTokenLocalSessionRecoveryError extends OneTimeTokenAuthError {\n readonly primary: OneTimeTokenErrorDiagnostic;\n readonly recovery: OneTimeTokenErrorDiagnostic;\n\n constructor(input: {\n cause: unknown;\n recoveryError: unknown;\n redactedValues?: readonly string[];\n }) {\n const redactedValues = input.redactedValues ?? [];\n const primary = createSanitizedErrorDiagnostic(input.cause, redactedValues);\n const recovery = createSanitizedErrorDiagnostic(\n input.recoveryError,\n redactedValues\n );\n const aggregateCause = new AggregateError(\n [createErrorFromDiagnostic(primary), createErrorFromDiagnostic(recovery)],\n \"one-time token local session recovery failed\"\n );\n super(\n input.cause instanceof OneTimeTokenAuthError\n ? input.cause.code\n : \"unknown\",\n `${primary.message}; local session recovery failed: ${recovery.message}`,\n { cause: aggregateCause }\n );\n this.name = \"OneTimeTokenLocalSessionRecoveryError\";\n this.primary = primary;\n this.recovery = recovery;\n }\n}\n\nexport async function rejectOneTimeTokenCandidateSession(input: {\n cause: unknown;\n session: {\n accessToken: string;\n authBaseUrl: string;\n tokenType: string;\n };\n}): Promise<never> {\n const cleanup = await revokeAuthAccessToken(input.session);\n if (cleanup.ok) {\n throw input.cause;\n }\n throw new OneTimeTokenCandidateSessionCleanupError({\n cause: input.cause,\n cleanupError: cleanup.error,\n redactedValues: [input.session.accessToken],\n });\n}\n\nexport async function exchangeOneTimeTokenAuthSession(input: {\n authBaseUrl: string;\n clientId: string;\n token: string;\n}): Promise<PreparedAuthSession> {\n const endpoint = toAuthEndpoint(\n input.authBaseUrl,\n \"/api/auth/one-time-token/verify\"\n );\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ token: input.token }),\n signal: AbortSignal.timeout(10_000),\n });\n } catch (error) {\n throw new OneTimeTokenAuthError(\n \"unknown\",\n `one-time token verification request failed at ${endpoint}: ${toErrorMessage(error)}`\n );\n }\n const payload = await parseResponseJson(response);\n if (!response.ok) {\n throw mapOneTimeTokenHttpError(payload, response.status);\n }\n\n const accessToken = normalizeOptionalString(\n response.headers.get(\"set-auth-token\")\n );\n if (!accessToken) {\n throw new OneTimeTokenAuthError(\n \"missing_access_token\",\n \"one-time token verified but auth response is missing set-auth-token\"\n );\n }\n\n try {\n const user =\n readAuthUserFromSessionPayload(payload) ??\n (await fetchAuthUserSnapshot({\n authBaseUrl: input.authBaseUrl,\n accessToken,\n }));\n const userId = normalizeOptionalString(user.id);\n if (!userId) {\n throw new OneTimeTokenAuthError(\n \"unknown\",\n \"one-time token account response did not include a user id\"\n );\n }\n\n return {\n accessToken,\n tokenType: \"Bearer\",\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n ...readSessionExpiresAtFromPayload(payload),\n user: {\n ...user,\n id: userId,\n },\n };\n } catch (error) {\n return await rejectOneTimeTokenCandidateSession({\n cause: error,\n session: {\n accessToken,\n authBaseUrl: input.authBaseUrl,\n tokenType: \"Bearer\",\n },\n });\n }\n}\n\nfunction mapOneTimeTokenHttpError(\n payload: unknown,\n status: number\n): OneTimeTokenAuthError {\n const message = extractAuthApiErrorMessage(payload, status);\n const normalizedMessage = message.toLowerCase();\n if (normalizedMessage.includes(\"expired\")) {\n return new OneTimeTokenAuthError(\n \"expired_token\",\n \"one-time token expired; generate a new token and retry\"\n );\n }\n if (normalizedMessage.includes(\"session not found\")) {\n return new OneTimeTokenAuthError(\n \"expired_token\",\n \"one-time token session is no longer valid; sign in to OpenMeld Web again, copy a fresh command, and retry\"\n );\n }\n if (normalizedMessage.includes(\"invalid\")) {\n return new OneTimeTokenAuthError(\n \"invalid_token\",\n \"invalid one-time token; generate a new token and retry\"\n );\n }\n return new OneTimeTokenAuthError(\n \"unknown\",\n `one-time token verification failed: ${message}`\n );\n}\n\nfunction readSessionExpiresAtFromPayload(payload: unknown): {\n expiresAt?: string;\n} {\n if (!(payload && typeof payload === \"object\" && \"session\" in payload)) {\n return {};\n }\n const session = (payload as Record<string, unknown>).session;\n if (!(session && typeof session === \"object\")) {\n return {};\n }\n const raw = normalizeOptionalString(\n (session as Record<string, unknown>).expiresAt\n );\n if (!raw) {\n return {};\n }\n const expiresAtMs = Date.parse(raw);\n return Number.isNaN(expiresAtMs)\n ? {}\n : { expiresAt: new Date(expiresAtMs).toISOString() };\n}\n\nfunction toAuthEndpoint(baseUrl: string, pathname: string): string {\n const url = new URL(baseUrl);\n url.pathname = pathname;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : String(error ?? \"unknown error\");\n}\n\nfunction createSanitizedErrorDiagnostic(\n error: unknown,\n redactedValues: readonly string[],\n seen = new Set<unknown>(),\n depth = 0\n): OneTimeTokenErrorDiagnostic {\n if (depth >= 8) {\n return {\n message: \"Nested error cause omitted after maximum diagnostic depth\",\n name: \"ErrorCauseDepthLimit\",\n };\n }\n if (\n (typeof error === \"object\" && error !== null) ||\n typeof error === \"function\"\n ) {\n if (seen.has(error)) {\n return {\n message: \"Circular error cause omitted\",\n name: \"CircularErrorCause\",\n };\n }\n seen.add(error);\n }\n\n const record = isRecord(error) ? error : null;\n const name =\n error instanceof Error && error.name.trim()\n ? error.name.trim()\n : (readDiagnosticString(record?.name) ?? \"Error\");\n const diagnostic: OneTimeTokenErrorDiagnostic = {\n name: redactSensitiveText(name, redactedValues),\n message: redactSensitiveText(toErrorMessage(error), redactedValues),\n };\n const stack =\n error instanceof Error ? readDiagnosticString(error.stack) : undefined;\n if (stack) {\n diagnostic.stack = redactSensitiveText(stack, redactedValues);\n }\n copyDiagnosticString(record, diagnostic, \"path\", redactedValues);\n copyDiagnosticString(record, diagnostic, \"endpoint\", redactedValues);\n copyDiagnosticString(record, diagnostic, \"operation\", redactedValues);\n const code = record?.code;\n if (typeof code === \"string\" || typeof code === \"number\") {\n diagnostic.code =\n typeof code === \"string\"\n ? redactSensitiveText(code, redactedValues)\n : code;\n }\n const status = record?.status;\n if (status === null || typeof status === \"number\") {\n diagnostic.status = status;\n }\n if (record && \"cause\" in record && record.cause !== undefined) {\n diagnostic.cause = createSanitizedErrorDiagnostic(\n record.cause,\n redactedValues,\n seen,\n depth + 1\n );\n }\n return diagnostic;\n}\n\nfunction createErrorFromDiagnostic(\n diagnostic: OneTimeTokenErrorDiagnostic\n): Error {\n const cause = diagnostic.cause\n ? createErrorFromDiagnostic(diagnostic.cause)\n : undefined;\n const error = new Error(\n diagnostic.message,\n cause === undefined ? undefined : { cause }\n );\n error.name = diagnostic.name;\n if (diagnostic.stack) {\n error.stack = diagnostic.stack;\n }\n const enriched = error as Error & {\n code?: number | string;\n endpoint?: string;\n operation?: string;\n path?: string;\n status?: number | null;\n };\n enriched.code = diagnostic.code;\n enriched.endpoint = diagnostic.endpoint;\n enriched.operation = diagnostic.operation;\n enriched.path = diagnostic.path;\n enriched.status = diagnostic.status;\n return enriched;\n}\n\nfunction copyDiagnosticString(\n source: Record<string, unknown> | null,\n target: OneTimeTokenErrorDiagnostic,\n key: \"endpoint\" | \"operation\" | \"path\",\n redactedValues: readonly string[]\n): void {\n const value = readDiagnosticString(source?.[key]);\n if (value) {\n target[key] = redactSensitiveText(value, redactedValues);\n }\n}\n\nfunction readDiagnosticString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction redactSensitiveText(\n value: string,\n redactedValues: readonly string[]\n): string {\n let redacted = value;\n for (const sensitiveValue of redactedValues) {\n if (sensitiveValue) {\n redacted = redacted.split(sensitiveValue).join(\"[REDACTED]\");\n }\n }\n return redacted;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\");\n}\n\nasync function parseResponseJson(response: Response): Promise<unknown> {\n const raw = await response.text();\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return { message: raw };\n }\n}\n","import { setTimeout as sleep } from \"node:timers/promises\";\nimport { cancel, isCancel, select } from \"@clack/prompts\";\nimport {\n type BetterAuthDeviceAuthorizationCodeResponse,\n betterAuthDeviceAuthorizationCodeRequestSchema,\n betterAuthDeviceAuthorizationCodeResponseSchema,\n} from \"@openmeld/schemas\";\nimport pc from \"picocolors\";\nimport {\n type AuthAgentOverviewCommand,\n emitAuthAgentOverview,\n} from \"../auth/agent-overview\";\nimport {\n type AuthenticationGuidance,\n resolveAuthenticationGuidance,\n} from \"../auth/auth-guidance\";\nimport {\n type AuthSessionState,\n type AuthSessionTransition,\n assertAuthSessionMutationAvailable,\n beginAuthSessionTransition,\n clearAuthSession,\n getAuthSessionState,\n setAuthSession,\n} from \"../config/auth-session\";\nimport { resolveAuthBaseUrl } from \"../config/auth-url\";\nimport { resolveBaseUrlOrNull } from \"../config/base-url\";\nimport {\n type ClearAllSelectedOpenMeldProfileIdsResult,\n clearAllSelectedOpenMeldProfileIds,\n} from \"../config/openmeld-profile-selection\";\nimport { canAttachAuthTokenToRequest } from \"../config/request-headers\";\nimport { tryOpenUrl } from \"../lib/open-url\";\nimport { formatInlineOpenMeldCliCommands } from \"../runtime/cli-entry-command\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { createAuthLoginGuideError } from \"../runtime/dual-view-guide-catalog\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport { createPresenter } from \"../runtime/presenter\";\nimport { promptTextEntry } from \"../ui/text-entry\";\nimport {\n type AuthUserSnapshot,\n type DeviceTokenSuccessResponse,\n extractAuthApiErrorMessage,\n fetchAuthUserSnapshot,\n requestDeviceToken,\n resolveDeviceAuthClientId,\n resolveDeviceTokenExpiresAt,\n} from \"./auth-device-session-client\";\nimport {\n type AuthStatusSnapshot,\n buildAuthStatusSnapshot,\n renderAuthStatusCard,\n renderAuthStatusGuidanceCard,\n} from \"./auth-status-shared\";\nimport {\n exchangeOneTimeTokenAuthSession,\n OneTimeTokenAuthError,\n type OneTimeTokenAuthFailureCode,\n OneTimeTokenLocalSessionRecoveryError,\n rejectOneTimeTokenCandidateSession,\n} from \"./one-time-token-auth-session\";\nimport { bestEffortStopCurrentLaneDaemonService } from \"./service\";\n\nconst LOGIN_METHOD_DEVICE = \"device\";\nconst LOGIN_METHOD_OTT = \"ott\";\nconst LOGIN_METHOD_CANCEL = \"__auth_login_method_cancel__\";\nconst AUTH_MENU_ACTION_STATUS = \"status\";\nconst AUTH_MENU_ACTION_LOGIN = \"login\";\nconst AUTH_MENU_ACTION_LOGOUT = \"logout\";\nconst DEFAULT_POLL_INTERVAL_SECONDS = 5;\nconst MAX_POLL_INTERVAL_SECONDS = 60;\nconst MIN_POLL_INTERVAL_SECONDS = 1;\nconst POLL_PROGRESS_EMIT_INTERVAL_MS = 15_000;\nconst TRAILING_SLASH_PATTERN = /\\/+$/;\n\ntype AuthLoginMethod = typeof LOGIN_METHOD_DEVICE | typeof LOGIN_METHOD_OTT;\ntype DeviceCodeResponse = BetterAuthDeviceAuthorizationCodeResponse;\n\ntype DevicePollProgressEvent = \"authorization_pending\" | \"slow_down\";\n\ntype DevicePollProgress = {\n event: DevicePollProgressEvent;\n attempt: number;\n intervalSeconds: number;\n remainingSeconds: number;\n};\n\ntype DeviceAuthFailureCode =\n | \"access_denied\"\n | \"expired_token\"\n | \"invalid_grant\"\n | \"unknown\";\n\ntype ResolvedAuthLoginRequest =\n | {\n method: typeof LOGIN_METHOD_DEVICE;\n }\n | {\n method: typeof LOGIN_METHOD_OTT;\n token: string;\n };\n\ntype ResolvedAuthLoginRequestResult =\n | {\n status: \"submitted\";\n value: ResolvedAuthLoginRequest;\n }\n | {\n status: \"back\" | \"cancelled\";\n };\n\ntype AuthLoginNavigationResult = \"completed\" | \"back\" | \"cancelled\";\n\ntype OneTimeTokenPromptResult =\n | {\n status: \"submitted\";\n value: string;\n }\n | {\n status: \"back\" | \"cancelled\";\n };\n\nclass DeviceAuthError extends Error {\n readonly code: DeviceAuthFailureCode;\n\n constructor(code: DeviceAuthFailureCode, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nclass AuthHttpError extends Error {\n readonly status: number;\n readonly endpoint: string;\n\n constructor(input: { message: string; status: number; endpoint: string }) {\n super(input.message);\n this.status = input.status;\n this.endpoint = input.endpoint;\n }\n}\n\nexport async function runAuthLogin(input: {\n authUrl?: string;\n clientId?: string;\n open?: boolean;\n method?: string;\n ott?: string;\n view?: string;\n agentOverviewHandled?: boolean;\n allowBackToCaller?: boolean;\n}): Promise<AuthLoginNavigationResult> {\n await assertAuthSessionMutationAvailable();\n const runtime = await resolveRuntimeContext({ view: input.view });\n const presenter = createPresenter(runtime);\n emitAuthOverviewIfNeeded({\n presenter,\n resolvedView: runtime.resolvedView,\n handled: input.agentOverviewHandled,\n command: \"login\",\n });\n const authBaseUrl = resolveAuthBaseUrl(input.authUrl);\n const clientId = resolveClientIdForLogin(\n input.clientId,\n runtime.resolvedView\n );\n const requestedBrowserOpen = input.open ?? true;\n const isHumanView = runtime.resolvedView === \"human\";\n const resolved = await resolveAuthLoginRequest({\n authBaseUrl,\n presenter,\n runtime,\n method: input.method,\n ott: input.ott,\n allowBackToCaller: input.allowBackToCaller === true,\n }).catch((error) => {\n if (runtime.resolvedView === \"agent\") {\n throw createAuthLoginGuideError(toErrorMessage(error));\n }\n throw error;\n });\n if (resolved.status !== \"submitted\") {\n return handleAuthLoginExit({\n status: resolved.status,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n }\n const request = resolved.value;\n\n try {\n if (request.method === LOGIN_METHOD_DEVICE) {\n await runDeviceLoginFlow({\n authBaseUrl,\n clientId,\n isHumanView,\n interactive: runtime.interactive,\n presenter,\n requestedBrowserOpen,\n runtimeResolvedView: runtime.resolvedView,\n });\n return \"completed\";\n }\n\n await runOneTimeTokenLoginFlow({\n authBaseUrl,\n clientId,\n isHumanView,\n presenter,\n token: request.token,\n });\n return \"completed\";\n } catch (error) {\n if (request.method === LOGIN_METHOD_DEVICE) {\n const localHint = resolveLocalAuthAdaptationHint(error, {\n authBaseUrl,\n clientId,\n });\n if (localHint) {\n emitLineWithHumanSpacer({\n presenter,\n isHumanView,\n code: \"auth.login.local_adaptation_hint\",\n text: isHumanView\n ? `${pc.yellow(\"⚠️ Local Dev Tip\")} ${localHint}`\n : localHint,\n });\n }\n }\n\n if (runtime.resolvedView === \"agent\") {\n if (request.method === LOGIN_METHOD_DEVICE) {\n const failure = toDeviceAuthError(error);\n presenter.data({\n code: \"auth.login.failure.hints\",\n payload: {\n method: LOGIN_METHOD_DEVICE,\n reason: failure.code,\n message: failure.message,\n nextSteps: buildAgentFailureNextSteps(failure.code),\n },\n });\n } else {\n const failure = toOneTimeTokenAuthError(error);\n presenter.data({\n code: \"auth.login.failure.hints\",\n payload: {\n method: LOGIN_METHOD_OTT,\n reason: failure.code,\n message: failure.message,\n nextSteps: buildAgentOttFailureNextSteps({\n authBaseUrl,\n code: failure.code,\n }),\n },\n });\n }\n throw createAuthLoginGuideError(toErrorMessage(error));\n }\n throw error;\n }\n}\n\nexport async function runAuthMenu(input?: { view?: string }): Promise<void> {\n const runtime = await resolveRuntimeContext({ view: input?.view });\n const presenter = createPresenter(runtime);\n emitAuthOverviewIfNeeded({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"menu\",\n });\n if (!canUseInteractivePrompts(runtime)) {\n await runAuthStatus({\n view: input?.view,\n agentOverviewHandled: true,\n });\n return;\n }\n\n while (true) {\n const action = await select({\n message: \"Sign-in action\",\n initialValue: AUTH_MENU_ACTION_STATUS,\n options: [\n {\n value: AUTH_MENU_ACTION_STATUS,\n label: \"Status\",\n hint: \"Show your current sign-in status\",\n },\n {\n value: AUTH_MENU_ACTION_LOGIN,\n label: \"Sign in\",\n hint: \"Sign in through your browser or with a one-time token\",\n },\n {\n value: AUTH_MENU_ACTION_LOGOUT,\n label: \"Sign out\",\n hint: \"Sign out on this device\",\n },\n ],\n });\n\n if (isCancel(action)) {\n cancel(\"Cancelled.\");\n return;\n }\n\n if (action === AUTH_MENU_ACTION_LOGIN) {\n const result = await runAuthLogin({\n view: input?.view,\n allowBackToCaller: true,\n });\n if (result === \"back\" || result === \"cancelled\") {\n continue;\n }\n return;\n }\n\n if (action === AUTH_MENU_ACTION_LOGOUT) {\n await runAuthLogout({ view: input?.view });\n return;\n }\n\n await runAuthStatus({ view: input?.view });\n return;\n }\n}\n\nasync function resolveAuthLoginRequest(input: {\n authBaseUrl: string;\n presenter: ReturnType<typeof createPresenter>;\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>;\n method?: string;\n ott?: string;\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult> {\n const explicitMethod = parseAuthLoginMethod(input.method);\n const providedToken = normalizeOptionalString(input.ott);\n const isInteractiveHuman =\n input.runtime.resolvedView === \"human\" &&\n canUseInteractivePrompts(input.runtime);\n\n if (providedToken && explicitMethod === LOGIN_METHOD_DEVICE) {\n throw new Error(\"`--ott` cannot be used with `--method device`\");\n }\n\n const explicitRequest = await resolveExplicitAuthLoginRequest({\n authBaseUrl: input.authBaseUrl,\n presenter: input.presenter,\n runtimeResolvedView: input.runtime.resolvedView,\n explicitMethod,\n providedToken,\n isInteractiveHuman,\n allowBackToCaller: input.allowBackToCaller,\n });\n if (explicitRequest) {\n return explicitRequest;\n }\n\n return resolveDefaultAuthLoginRequest({\n authBaseUrl: input.authBaseUrl,\n presenter: input.presenter,\n runtimeResolvedView: input.runtime.resolvedView,\n isInteractiveHuman,\n allowBackToCaller: input.allowBackToCaller,\n });\n}\n\nasync function resolveExplicitAuthLoginRequest(input: {\n authBaseUrl: string;\n presenter: ReturnType<typeof createPresenter>;\n runtimeResolvedView: \"human\" | \"agent\";\n explicitMethod: AuthLoginMethod | null;\n providedToken: string | null;\n isInteractiveHuman: boolean;\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult | null> {\n if (input.providedToken) {\n return {\n status: \"submitted\",\n value: {\n method: LOGIN_METHOD_OTT,\n token: input.providedToken,\n },\n };\n }\n if (input.explicitMethod === LOGIN_METHOD_DEVICE) {\n return {\n status: \"submitted\",\n value: { method: LOGIN_METHOD_DEVICE },\n };\n }\n if (input.explicitMethod !== LOGIN_METHOD_OTT) {\n return null;\n }\n if (input.isInteractiveHuman) {\n return await promptExplicitOttLoginRequest({\n allowBackToCaller: input.allowBackToCaller,\n });\n }\n if (input.runtimeResolvedView === \"agent\") {\n emitAgentOttRequired({\n authBaseUrl: input.authBaseUrl,\n presenter: input.presenter,\n });\n throw new OneTimeTokenAuthError(\n \"missing_access_token\",\n \"agent sign-in requires `--ott <token>`\"\n );\n }\n throw new OneTimeTokenAuthError(\n \"missing_access_token\",\n \"one-time token is required; pass `--ott <token>`\"\n );\n}\n\nasync function promptExplicitOttLoginRequest(input: {\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult> {\n const token = await promptOneTimeTokenForHuman({\n allowBack: input.allowBackToCaller,\n backLabel: \"Back\",\n });\n if (token.status !== \"submitted\") {\n return {\n status: resolveAuthLoginNestedExitStatus(input.allowBackToCaller),\n };\n }\n return {\n status: \"submitted\",\n value: {\n method: LOGIN_METHOD_OTT,\n token: token.value,\n },\n };\n}\n\nasync function resolveDefaultAuthLoginRequest(input: {\n authBaseUrl: string;\n presenter: ReturnType<typeof createPresenter>;\n runtimeResolvedView: \"human\" | \"agent\";\n isInteractiveHuman: boolean;\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult> {\n if (input.runtimeResolvedView === \"agent\") {\n emitAgentOttRequired({\n authBaseUrl: input.authBaseUrl,\n presenter: input.presenter,\n });\n throw new Error(\n \"agent sign-in requires `--ott <token>`; to force browser sign-in, pass `--method device`\"\n );\n }\n if (!input.isInteractiveHuman) {\n return {\n status: \"submitted\",\n value: { method: LOGIN_METHOD_DEVICE },\n };\n }\n return await promptInteractiveAuthLoginMethod({\n allowBackToCaller: input.allowBackToCaller,\n });\n}\n\nasync function promptInteractiveAuthLoginMethod(input: {\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult> {\n for (;;) {\n const choice = await select({\n message: \"Choose a sign-in method\",\n initialValue: LOGIN_METHOD_DEVICE,\n options: [\n {\n value: LOGIN_METHOD_DEVICE,\n label: \"Browser sign-in\",\n hint: \"Open the sign-in page in your browser\",\n },\n {\n value: LOGIN_METHOD_OTT,\n label: \"One-time sign-in token\",\n hint: \"Paste a token from the sign-in page\",\n },\n {\n value: LOGIN_METHOD_CANCEL,\n label: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n },\n ],\n });\n\n if (isCancel(choice) || choice === LOGIN_METHOD_CANCEL) {\n return {\n status: resolveAuthLoginNestedExitStatus(input.allowBackToCaller),\n };\n }\n if (choice === LOGIN_METHOD_DEVICE) {\n return {\n status: \"submitted\",\n value: { method: LOGIN_METHOD_DEVICE },\n };\n }\n\n const tokenRequest = await promptNestedOttLoginRequest({\n allowBackToCaller: input.allowBackToCaller,\n });\n if (tokenRequest.status === \"back\") {\n continue;\n }\n return tokenRequest;\n }\n}\n\nasync function promptNestedOttLoginRequest(input: {\n allowBackToCaller: boolean;\n}): Promise<ResolvedAuthLoginRequestResult> {\n const token = await promptOneTimeTokenForHuman({\n allowBack: true,\n backLabel: \"Back\",\n });\n if (token.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n if (token.status === \"cancelled\") {\n return {\n status: resolveAuthLoginNestedExitStatus(input.allowBackToCaller),\n };\n }\n if (token.status !== \"submitted\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"submitted\",\n value: {\n method: LOGIN_METHOD_OTT,\n token: token.value,\n },\n };\n}\n\nasync function runDeviceLoginFlow(input: {\n authBaseUrl: string;\n clientId: string;\n isHumanView: boolean;\n interactive: boolean;\n presenter: ReturnType<typeof createPresenter>;\n requestedBrowserOpen: boolean;\n runtimeResolvedView: \"human\" | \"agent\";\n}): Promise<void> {\n const shouldOpenBrowser =\n input.runtimeResolvedView === \"agent\" ? false : input.requestedBrowserOpen;\n emitDeviceLoginStartLine({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n });\n\n if (input.runtimeResolvedView === \"agent\" && input.requestedBrowserOpen) {\n input.presenter.line({\n code: \"auth.login.browser_disabled_for_agent\",\n text: \"agent view detected; browser auto-open is disabled by default\",\n });\n }\n\n const deviceCodeResponse = await requestDeviceCode({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n });\n\n const verificationUrl = resolveVerificationUrl(\n deviceCodeResponse,\n input.authBaseUrl\n );\n const userCode = normalizeRequiredString(\n deviceCodeResponse.user_code,\n \"missing user_code in device code response\"\n );\n\n emitVerificationLines({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n verificationUrl,\n userCode,\n });\n\n maybeEmitAgentHumanActionRequired({\n presenter: input.presenter,\n isAgentView: input.runtimeResolvedView === \"agent\",\n verificationUrl,\n userCode,\n });\n\n if (shouldOpenBrowser && input.interactive) {\n const opened = await tryOpenUrl(verificationUrl);\n emitBrowserOpenLine({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n opened,\n verificationUrl,\n });\n }\n\n const intervalSeconds = resolvePollingIntervalSeconds(\n deviceCodeResponse.interval\n );\n const expiresInSeconds = resolveExpiresInSeconds(\n deviceCodeResponse.expires_in\n );\n const token = await pollForDeviceToken({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n deviceCode: deviceCodeResponse.device_code,\n intervalSeconds,\n expiresInSeconds,\n onProgress: createPollingProgressEmitter({\n presenter: input.presenter,\n resolvedView: input.runtimeResolvedView,\n }),\n });\n const authUser = await fetchAuthUserSnapshot({\n authBaseUrl: input.authBaseUrl,\n accessToken: token.access_token,\n });\n\n await setAuthSession({\n accessToken: token.access_token,\n tokenType: token.token_type ?? \"Bearer\",\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n expiresAt: resolveDeviceTokenExpiresAt(token.expires_in),\n scope: normalizeOptionalString(token.scope) ?? undefined,\n user: authUser ?? undefined,\n });\n\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.success\",\n text: input.isHumanView\n ? pc.green(resolveHumanLoginSuccessText(authUser))\n : \"sign-in successful; bearer token saved on this device\",\n });\n}\n\nasync function runOneTimeTokenLoginFlow(input: {\n authBaseUrl: string;\n clientId: string;\n isHumanView: boolean;\n presenter: ReturnType<typeof createPresenter>;\n token: string;\n}): Promise<void> {\n emitOneTimeTokenLoginStartLine({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n authBaseUrl: input.authBaseUrl,\n });\n\n const verified = await exchangeOneTimeTokenAuthSession({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n token: input.token,\n });\n\n let transition: AuthSessionTransition | null = null;\n try {\n transition = await beginAuthSessionTransition({\n accessToken: verified.accessToken,\n tokenType: verified.tokenType,\n authBaseUrl: verified.authBaseUrl,\n clientId: verified.clientId,\n expiresAt: verified.expiresAt,\n user: verified.user,\n });\n await assertOneTimeTokenAuthSessionSaved({\n accessToken: verified.accessToken,\n });\n await transition.commit();\n } catch (error) {\n let failure = error;\n if (transition) {\n try {\n await transition.rollback();\n } catch (recoveryError) {\n failure = new OneTimeTokenLocalSessionRecoveryError({\n cause: error,\n recoveryError,\n redactedValues: [verified.accessToken],\n });\n }\n }\n await rejectOneTimeTokenCandidateSession({\n cause: failure,\n session: verified,\n });\n }\n\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.success\",\n text: input.isHumanView\n ? pc.green(resolveHumanLoginSuccessText(verified.user))\n : \"one-time token verified; bearer token saved on this device\",\n });\n}\n\nasync function assertOneTimeTokenAuthSessionSaved(input: {\n accessToken: string;\n}): Promise<void> {\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n if (authState?.state !== \"valid\" || !authState.session) {\n const state = authState?.state ?? \"unknown\";\n throw new OneTimeTokenAuthError(\n \"session_not_saved\",\n `one-time token verified, but OpenMeld could not save a usable local sign-in session (${state}); copy a fresh setup command from OpenMeld Web and retry`\n );\n }\n\n if (authState.session.accessToken !== input.accessToken) {\n throw new OneTimeTokenAuthError(\n \"session_not_saved\",\n \"one-time token verified, but OpenMeld saved a different local sign-in session; copy a fresh setup command from OpenMeld Web and retry\"\n );\n }\n\n const ownerUserId = normalizeOptionalString(authState.session.user?.id);\n if (!ownerUserId) {\n throw new OneTimeTokenAuthError(\n \"session_not_saved\",\n \"one-time token verified, but the saved local sign-in is missing its OpenMeld account ID; copy a fresh setup command from OpenMeld Web and retry\"\n );\n }\n}\n\nasync function promptOneTimeTokenForHuman(input: {\n allowBack: boolean;\n backLabel: string;\n}): Promise<OneTimeTokenPromptResult> {\n const result = await promptTextEntry({\n message: \"Paste your one-time sign-in token\",\n placeholder: \"token from the sign-in page\",\n allowBack: input.allowBack,\n backLabel: input.backLabel,\n requiredMessage: \"Enter a one-time sign-in token.\",\n validate: (value) =>\n normalizeOptionalString(value) ? null : \"Enter a one-time sign-in token.\",\n });\n if (result.status !== \"submitted\") {\n return result;\n }\n const token = normalizeOptionalString(result.value);\n if (!token) {\n throw new OneTimeTokenAuthError(\n \"missing_access_token\",\n \"one-time token is required\"\n );\n }\n return {\n status: \"submitted\",\n value: token,\n };\n}\n\nfunction resolveAuthLoginNestedExitStatus(\n allowBackToCaller: boolean\n): \"back\" | \"cancelled\" {\n return allowBackToCaller ? \"back\" : \"cancelled\";\n}\n\nfunction handleAuthLoginExit(input: {\n status: \"back\" | \"cancelled\";\n allowBackToCaller: boolean;\n}): AuthLoginNavigationResult {\n if (input.status === \"back\" || input.allowBackToCaller) {\n return \"back\";\n }\n cancel(\"Cancelled.\");\n return \"cancelled\";\n}\n\nfunction emitAgentOttRequired(input: {\n authBaseUrl: string;\n presenter: ReturnType<typeof createPresenter>;\n}): void {\n const loginUrl = `${input.authBaseUrl}/`;\n input.presenter.data({\n code: \"auth.login.ott.required\",\n payload: {\n reason: \"agent_view_requires_explicit_login_method\",\n method: LOGIN_METHOD_OTT,\n authBaseUrl: input.authBaseUrl,\n steps: [\n `Open ${loginUrl} in a human-operated browser and sign in.`,\n \"Click 'Generate One-Time Token (3 min)' on the auth home page.\",\n \"Pass the token back to the agent.\",\n formatInlineOpenMeldCliCommands(\n \"Run: `openmeld login --view agent --ott <token>`\"\n ),\n ],\n fallback: formatInlineOpenMeldCliCommands(\n \"If you must use device flow, run: `openmeld login --view agent --method device --no-open`\"\n ),\n },\n });\n}\n\nfunction parseAuthLoginMethod(\n value: string | undefined\n): AuthLoginMethod | null {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (!normalized) {\n return null;\n }\n if (normalized === LOGIN_METHOD_DEVICE || normalized === LOGIN_METHOD_OTT) {\n return normalized;\n }\n throw new Error(\"invalid --method value: use device|ott\");\n}\n\nfunction resolveClientIdForLogin(\n value: string | undefined,\n resolvedView: \"human\" | \"agent\"\n): string {\n try {\n return resolveDeviceAuthClientId(value);\n } catch (error) {\n if (resolvedView === \"agent\") {\n throw createAuthLoginGuideError(toErrorMessage(error));\n }\n throw error;\n }\n}\n\nfunction emitDeviceLoginStartLine(input: {\n presenter: ReturnType<typeof createPresenter>;\n isHumanView: boolean;\n authBaseUrl: string;\n clientId: string;\n}): void {\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.start\",\n text: input.isHumanView\n ? `${pc.cyan(\"🔐 Device Sign-In\")} ${pc.dim(`client ${input.clientId}`)} ${pc.dim(`auth ${input.authBaseUrl}`)}`\n : `starting device sign-in (auth: ${input.authBaseUrl}, client_id: ${input.clientId})`,\n });\n}\n\nfunction emitOneTimeTokenLoginStartLine(input: {\n presenter: ReturnType<typeof createPresenter>;\n isHumanView: boolean;\n authBaseUrl: string;\n}): void {\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.start\",\n text: input.isHumanView\n ? `${pc.cyan(\"🔐 One-Time Token Sign-In\")} ${pc.dim(`auth ${input.authBaseUrl}`)}`\n : `starting one-time-token sign-in (auth: ${input.authBaseUrl})`,\n });\n}\n\nfunction emitVerificationLines(input: {\n presenter: ReturnType<typeof createPresenter>;\n isHumanView: boolean;\n verificationUrl: string;\n userCode: string;\n}): void {\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.verification_url\",\n text: input.isHumanView\n ? `${pc.cyan(\"🌐 Verify URL\")} ${pc.underline(input.verificationUrl)}`\n : `open this URL to authorize: ${input.verificationUrl}`,\n data: {\n verificationUrl: input.verificationUrl,\n },\n });\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: input.isHumanView,\n code: \"auth.login.user_code\",\n text: input.isHumanView\n ? `${pc.yellow(\"🔑 Code\")} ${pc.bold(input.userCode)}`\n : `enter this code: ${input.userCode}`,\n data: {\n userCode: input.userCode,\n },\n });\n}\n\nfunction maybeEmitAgentHumanActionRequired(input: {\n presenter: ReturnType<typeof createPresenter>;\n isAgentView: boolean;\n verificationUrl: string;\n userCode: string;\n}): void {\n if (!input.isAgentView) {\n return;\n }\n input.presenter.data({\n code: \"auth.login.human_action_required\",\n payload: {\n verificationUrl: input.verificationUrl,\n userCode: input.userCode,\n steps: [\n \"Ask the human user to open verificationUrl in browser.\",\n \"Ask the human to confirm the userCode shown on page.\",\n \"Ask the human to approve the device request.\",\n \"Wait until the CLI polling returns access_token.\",\n ],\n },\n });\n}\n\nfunction emitBrowserOpenLine(input: {\n presenter: ReturnType<typeof createPresenter>;\n isHumanView: boolean;\n opened: boolean;\n verificationUrl: string;\n}): void {\n if (input.isHumanView) {\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView: true,\n code: input.opened\n ? \"auth.login.browser_opened\"\n : \"auth.login.browser_open_failed\",\n text: input.opened\n ? pc.green(\"✅ Browser opened\")\n : `${pc.yellow(\"⚠️ Open URL manually\")} ${pc.underline(input.verificationUrl)}`,\n });\n return;\n }\n\n input.presenter.line({\n code: input.opened\n ? \"auth.login.browser_opened\"\n : \"auth.login.browser_open_failed\",\n text: input.opened\n ? \"browser opened for verification\"\n : \"could not auto-open browser; open the URL manually\",\n });\n}\n\nexport async function runAuthLogout(input?: {\n view?: string;\n agentOverviewHandled?: boolean;\n}): Promise<void> {\n await assertAuthSessionMutationAvailable();\n const runtime = await resolveRuntimeContext({ view: input?.view });\n const presenter = createPresenter(runtime);\n emitAuthOverviewIfNeeded({\n presenter,\n resolvedView: runtime.resolvedView,\n handled: input?.agentOverviewHandled,\n command: \"logout\",\n });\n const cleanup = await performLogoutLocalCleanup({\n runtime,\n });\n emitLogoutCleanupResult({\n cleanup,\n presenter,\n });\n const cleared = await clearAuthSession();\n if (cleared.preservedSessionPath) {\n presenter.line({\n code: \"auth.logout.damaged_session_preserved\",\n text: \"The damaged sign-in record was saved locally for support. OpenMeld could not identify its old credential. You can review old sign-ins in Account sessions.\",\n data: { preservedSessionPath: cleared.preservedSessionPath },\n });\n }\n if (!cleared.hadLocalSession) {\n presenter.line({\n code: \"auth.logout.no_session\",\n text: \"No local sign-in session found.\",\n });\n return;\n }\n\n presenter.line({\n code: \"auth.logout.cleared\",\n text: \"Signed out on this device. To reconnect, get a new setup command from OpenMeld Web.\",\n });\n}\n\nexport async function runAuthStatus(input?: {\n view?: string;\n agentOverviewHandled?: boolean;\n}): Promise<void> {\n const runtime = await resolveRuntimeContext({ view: input?.view });\n const presenter = createPresenter(runtime);\n emitAuthOverviewIfNeeded({\n presenter,\n resolvedView: runtime.resolvedView,\n handled: input?.agentOverviewHandled,\n command: \"status\",\n });\n const sessionState = await getAuthSessionState({\n validateRemote: true,\n });\n const humanDataMode = runtime.viewCustomization?.render?.human?.dataMode;\n const mismatchGuidance =\n await resolveAuthStatusEnvironmentMismatch(sessionState);\n if (mismatchGuidance) {\n process.exitCode = 1;\n if (runtime.resolvedView === \"human\" && humanDataMode !== \"envelope\") {\n renderAuthStatusGuidanceCard({\n presenter,\n guidance: mismatchGuidance,\n codePrefix: \"auth.status.card\",\n });\n return;\n }\n presenter.data({\n code: \"auth.status.session\",\n payload: buildAuthStatusMismatchPayload({\n guidance: mismatchGuidance,\n snapshot: buildAuthStatusSnapshot(sessionState),\n }),\n });\n return;\n }\n const authSnapshot = buildAuthStatusSnapshot(sessionState);\n const statusPayload = buildAuthStatusPayload(authSnapshot);\n process.exitCode = sessionState.state === \"valid\" ? 0 : 1;\n\n if (runtime.resolvedView === \"human\" && humanDataMode !== \"envelope\") {\n renderAuthStatusCard({\n presenter,\n auth: authSnapshot,\n codePrefix: \"auth.status.card\",\n });\n return;\n }\n\n presenter.data({\n code: \"auth.status.session\",\n payload: statusPayload,\n });\n}\n\nasync function resolveAuthStatusEnvironmentMismatch(\n sessionState: Awaited<ReturnType<typeof getAuthSessionState>>\n): Promise<AuthenticationGuidance | null> {\n if (sessionState.state !== \"valid\" || !sessionState.session) {\n return null;\n }\n\n const gatewayUrl = await resolveBaseUrlOrNull();\n if (!gatewayUrl) {\n return null;\n }\n\n if (canAttachAuthTokenToRequest(sessionState.session, gatewayUrl)) {\n return null;\n }\n\n return resolveAuthenticationGuidance({\n reason: \"mismatch\",\n authBaseUrl: sessionState.session.authBaseUrl,\n gatewayUrl,\n });\n}\n\nfunction buildAuthStatusPayload(input: AuthStatusSnapshot): {\n signedIn: boolean;\n state: AuthSessionState;\n reasonCode?: AuthStatusSnapshot[\"reasonCode\"];\n errorMessage?: string;\n authBaseUrl: string | null;\n clientId: string | null;\n tokenType: string | null;\n createdAt: string | null;\n expiresAt: string | null;\n user: { id?: string; email?: string; name?: string } | null;\n organization: {\n active: AuthStatusSnapshot[\"activeOrganization\"];\n };\n} {\n const hasUser = Boolean(input.userId || input.userEmail || input.userName);\n return {\n signedIn: input.signedIn,\n state: input.state,\n ...(input.reasonCode ? { reasonCode: input.reasonCode } : {}),\n ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n tokenType: input.tokenType,\n createdAt: input.createdAt,\n expiresAt: input.expiresAt,\n user: hasUser\n ? {\n ...(input.userId ? { id: input.userId } : {}),\n ...(input.userEmail ? { email: input.userEmail } : {}),\n ...(input.userName ? { name: input.userName } : {}),\n }\n : null,\n organization: {\n active: input.activeOrganization,\n },\n };\n}\n\nfunction buildAuthStatusMismatchPayload(input: {\n snapshot: AuthStatusSnapshot;\n guidance: AuthenticationGuidance;\n}): {\n signedIn: false;\n state: \"mismatch\";\n guidanceReason: \"mismatch\";\n authBaseUrl: string | null;\n gatewayUrl: string | null;\n clientId: string | null;\n tokenType: string | null;\n createdAt: string | null;\n expiresAt: string | null;\n user: { id?: string; email?: string; name?: string } | null;\n organization: {\n active: AuthStatusSnapshot[\"activeOrganization\"];\n };\n} {\n const hasUser = Boolean(\n input.snapshot.userId || input.snapshot.userEmail || input.snapshot.userName\n );\n return {\n signedIn: false,\n state: \"mismatch\",\n guidanceReason: \"mismatch\",\n authBaseUrl: input.guidance.authBaseUrl,\n gatewayUrl: input.guidance.gatewayUrl,\n clientId: input.snapshot.clientId,\n tokenType: input.snapshot.tokenType,\n createdAt: input.snapshot.createdAt,\n expiresAt: input.snapshot.expiresAt,\n user: hasUser\n ? {\n ...(input.snapshot.userId ? { id: input.snapshot.userId } : {}),\n ...(input.snapshot.userEmail\n ? { email: input.snapshot.userEmail }\n : {}),\n ...(input.snapshot.userName ? { name: input.snapshot.userName } : {}),\n }\n : null,\n organization: {\n active: input.snapshot.activeOrganization,\n },\n };\n}\n\nfunction emitAuthOverviewIfNeeded(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: \"human\" | \"agent\";\n command: AuthAgentOverviewCommand;\n handled?: boolean;\n}): void {\n if (input.resolvedView !== \"agent\" || input.handled) {\n return;\n }\n emitAuthAgentOverview({\n presenter: input.presenter,\n command: input.command,\n });\n}\n\nasync function performLogoutLocalCleanup(input: {\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>;\n}): Promise<{\n daemonStop: Awaited<\n ReturnType<typeof bestEffortStopCurrentLaneDaemonService>\n >;\n selectedProfiles: ClearAllSelectedOpenMeldProfileIdsResult;\n}> {\n const daemonStop = await bestEffortStopCurrentLaneDaemonService({\n runtime: input.runtime,\n });\n const selectedProfiles = await clearAllSelectedOpenMeldProfileIds();\n return {\n daemonStop,\n selectedProfiles,\n };\n}\n\nfunction emitLogoutCleanupResult(input: {\n cleanup: {\n daemonStop: Awaited<\n ReturnType<typeof bestEffortStopCurrentLaneDaemonService>\n >;\n selectedProfiles: ClearAllSelectedOpenMeldProfileIdsResult;\n };\n presenter: ReturnType<typeof createPresenter>;\n}): void {\n const warningText = buildLogoutCleanupWarningText(input.cleanup);\n const data = {\n clearedSessionSelections:\n input.cleanup.selectedProfiles.clearedSessionSelections,\n daemonStopStatus: input.cleanup.daemonStop.status,\n failedSessionIds: input.cleanup.selectedProfiles.failedSessionIds,\n removedFallbackSelection:\n input.cleanup.selectedProfiles.removedFallbackSelection,\n removedLegacySelectionFile:\n input.cleanup.selectedProfiles.removedLegacySelectionFile,\n removedLegacySessionSelectionDirectory:\n input.cleanup.selectedProfiles.removedLegacySessionSelectionDirectory,\n ...(input.cleanup.daemonStop.status === \"stopped\"\n ? {\n daemonStopSignal: input.cleanup.daemonStop.signal,\n }\n : {}),\n };\n if (warningText) {\n input.presenter.line({\n code: \"auth.logout.cleanup_warning\",\n text: warningText,\n data,\n });\n return;\n }\n\n input.presenter.line({\n code: \"auth.logout.cleanup\",\n text: \"Local sign-out cleanup finished for your local OpenMeld.\",\n data,\n });\n}\n\nfunction buildLogoutCleanupWarningText(input: {\n daemonStop: Awaited<\n ReturnType<typeof bestEffortStopCurrentLaneDaemonService>\n >;\n selectedProfiles: ClearAllSelectedOpenMeldProfileIdsResult;\n}): string | null {\n const warnings: string[] = [];\n if (input.daemonStop.status === \"warning\") {\n warnings.push(resolveDaemonStopWarningText(input.daemonStop));\n }\n if (input.selectedProfiles.failedSessionIds.length > 0) {\n warnings.push(\n `some selected OpenMeld profile pointers could not be cleared (${input.selectedProfiles.failedSessionIds.join(\", \")})`\n );\n }\n if (warnings.length === 0) {\n return null;\n }\n return `Local sign-out cleanup needs attention: ${warnings.join(\"; \")}`;\n}\n\nfunction resolveDaemonStopWarningText(\n input: Extract<\n Awaited<ReturnType<typeof bestEffortStopCurrentLaneDaemonService>>,\n { status: \"warning\" }\n >\n): string {\n if (input.reason === \"process_timeout\" || input.reason === \"system_timeout\") {\n return formatInlineOpenMeldCliCommands(\n \"OpenMeld could not confirm that OpenMeld Service stopped. Run `openmeld service stop --force` if it is still running.\"\n );\n }\n if (input.reason === \"invalid_state\") {\n return \"OpenMeld found stale local OpenMeld Service runtime state and cleared what it could.\";\n }\n const detail = input.errorMessage ? ` ${input.errorMessage}` : \"\";\n return formatInlineOpenMeldCliCommands(\n `OpenMeld could not stop OpenMeld Service cleanly.${detail} Run \\`openmeld service stop --force\\` if it is still running.`\n );\n}\n\nasync function requestDeviceCode(input: {\n authBaseUrl: string;\n clientId: string;\n}): Promise<DeviceCodeResponse> {\n const endpoint = toAuthEndpoint(input.authBaseUrl, \"/api/auth/device/code\");\n const requestBody = betterAuthDeviceAuthorizationCodeRequestSchema.parse({\n client_id: input.clientId,\n });\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n signal: AbortSignal.timeout(10_000),\n });\n const payload = await parseResponseJson(response);\n\n if (!response.ok) {\n throw new AuthHttpError({\n message: `failed to request device code: ${extractApiErrorMessage(payload, response.status)}`,\n status: response.status,\n endpoint,\n });\n }\n\n const parsed =\n betterAuthDeviceAuthorizationCodeResponseSchema.safeParse(payload);\n if (!parsed.success) {\n throw new AuthHttpError({\n message: \"device code response did not match the Better Auth contract\",\n status: response.status,\n endpoint,\n });\n }\n return parsed.data;\n}\n\nasync function pollForDeviceToken(input: {\n authBaseUrl: string;\n clientId: string;\n deviceCode: string;\n intervalSeconds: number;\n expiresInSeconds: number;\n onProgress?: (progress: DevicePollProgress) => void;\n}): Promise<DeviceTokenSuccessResponse> {\n const deadline = Date.now() + input.expiresInSeconds * 1000;\n let intervalSeconds = input.intervalSeconds;\n let attempt = 0;\n\n while (Date.now() < deadline) {\n attempt += 1;\n const result = await requestDeviceToken({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n deviceCode: input.deviceCode,\n });\n\n if (result.ok) {\n return result.data;\n }\n\n const errorCode = normalizeOptionalString(result.error.error);\n if (errorCode === \"authorization_pending\") {\n input.onProgress?.({\n event: \"authorization_pending\",\n attempt,\n intervalSeconds,\n remainingSeconds: Math.max(\n 0,\n Math.ceil((deadline - Date.now()) / 1000)\n ),\n });\n await sleep(intervalSeconds * 1000);\n continue;\n }\n if (errorCode === \"slow_down\") {\n intervalSeconds = Math.min(\n intervalSeconds + 5,\n MAX_POLL_INTERVAL_SECONDS\n );\n input.onProgress?.({\n event: \"slow_down\",\n attempt,\n intervalSeconds,\n remainingSeconds: Math.max(\n 0,\n Math.ceil((deadline - Date.now()) / 1000)\n ),\n });\n await sleep(intervalSeconds * 1000);\n continue;\n }\n if (errorCode === \"access_denied\") {\n throw new DeviceAuthError(\n \"access_denied\",\n \"browser sign-in was canceled\"\n );\n }\n if (errorCode === \"expired_token\") {\n throw new DeviceAuthError(\n \"expired_token\",\n \"browser sign-in expired; sign in again\"\n );\n }\n if (errorCode === \"invalid_grant\") {\n throw new DeviceAuthError(\n \"invalid_grant\",\n \"browser sign-in is no longer valid; sign in again\"\n );\n }\n\n throw new DeviceAuthError(\n \"unknown\",\n `browser sign-in failed: ${extractAuthApiErrorMessage(result.error, result.status)}`\n );\n }\n\n throw new DeviceAuthError(\n \"expired_token\",\n \"browser sign-in timed out; sign in again\"\n );\n}\n\nfunction resolveVerificationUrl(\n response: DeviceCodeResponse,\n authBaseUrl: string\n): string {\n const raw =\n normalizeOptionalString(response.verification_uri_complete) ??\n normalizeOptionalString(response.verification_uri);\n if (!raw) {\n throw new Error(\"missing verification_uri in device code response\");\n }\n\n const url = toAbsoluteUrl(raw, authBaseUrl);\n if (!url.searchParams.has(\"user_code\")) {\n url.searchParams.set(\"user_code\", response.user_code);\n }\n return url.toString();\n}\n\nfunction toAuthEndpoint(baseUrl: string, pathname: string): string {\n const url = new URL(baseUrl);\n url.pathname = pathname;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction toAbsoluteUrl(raw: string, baseUrl: string): URL {\n try {\n return new URL(raw);\n } catch {\n return new URL(raw, baseUrl);\n }\n}\n\nfunction resolvePollingIntervalSeconds(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return DEFAULT_POLL_INTERVAL_SECONDS;\n }\n return clampInteger(\n value,\n MIN_POLL_INTERVAL_SECONDS,\n MAX_POLL_INTERVAL_SECONDS\n );\n}\n\nfunction resolveExpiresInSeconds(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return 30 * 60;\n }\n return clampInteger(value, 60, 24 * 60 * 60);\n}\n\nfunction clampInteger(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, Math.floor(value)));\n}\n\nfunction normalizeRequiredString(\n value: string | null,\n message: string\n): string {\n const normalized = normalizeOptionalString(value);\n if (!normalized) {\n throw new Error(message);\n }\n return normalized;\n}\n\nfunction normalizeOptionalString(\n value: string | null | undefined\n): string | null {\n const normalized = String(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\nfunction readStringField(payload: unknown, key: string): string | null {\n if (!(payload && typeof payload === \"object\" && key in payload)) {\n return null;\n }\n\n const value = (payload as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : null;\n}\n\nasync function parseResponseJson(response: Response): Promise<unknown> {\n const raw = await response.text();\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return { message: raw };\n }\n}\n\nfunction extractApiErrorMessage(payload: unknown, status: number): string {\n const errorDescription = normalizeOptionalString(\n readStringField(payload, \"error_description\")\n );\n if (errorDescription) {\n return errorDescription;\n }\n const detail = normalizeOptionalString(readStringField(payload, \"detail\"));\n if (detail) {\n return detail;\n }\n const message = normalizeOptionalString(readStringField(payload, \"message\"));\n if (message) {\n return message;\n }\n const errorCode = normalizeOptionalString(readStringField(payload, \"error\"));\n if (errorCode) {\n return errorCode;\n }\n return `HTTP ${status}`;\n}\n\nfunction createPollingProgressEmitter(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: \"human\" | \"agent\";\n}): (progress: DevicePollProgress) => void {\n let lastPendingEmitAt = 0;\n const isHumanView = input.resolvedView === \"human\";\n\n return (progress) => {\n const now = Date.now();\n if (\n progress.event === \"authorization_pending\" &&\n now - lastPendingEmitAt < POLL_PROGRESS_EMIT_INTERVAL_MS\n ) {\n return;\n }\n\n if (progress.event === \"authorization_pending\") {\n lastPendingEmitAt = now;\n const remaining = formatCountdown(progress.remainingSeconds);\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView,\n code: \"auth.login.polling.pending\",\n text: isHumanView\n ? `${pc.yellow(\"⏳\")} ${pc.bold(remaining)} left · poll ${progress.intervalSeconds}s · try ${progress.attempt}`\n : `waiting for approval (attempt ${progress.attempt}, poll in ${progress.intervalSeconds}s, remaining ${progress.remainingSeconds}s)`,\n data: progress,\n });\n return;\n }\n\n const remaining = formatCountdown(progress.remainingSeconds);\n emitLineWithHumanSpacer({\n presenter: input.presenter,\n isHumanView,\n code: \"auth.login.polling.slow_down\",\n text: isHumanView\n ? `${pc.yellow(\"⚠️ Poll Slowed\")} ${pc.bold(remaining)} left · poll ${progress.intervalSeconds}s`\n : `server requested slower polling; now every ${progress.intervalSeconds}s (remaining ${progress.remainingSeconds}s)`,\n data: progress,\n });\n };\n}\n\nfunction emitLineWithHumanSpacer(input: {\n presenter: ReturnType<typeof createPresenter>;\n isHumanView: boolean;\n code: string;\n text: string;\n data?: Record<string, unknown>;\n}): void {\n input.presenter.line({\n code: input.code,\n text: input.text,\n ...(input.data ? { data: input.data } : {}),\n });\n if (!input.isHumanView) {\n return;\n }\n input.presenter.line({\n code: `${input.code}.spacer`,\n text: \"\",\n });\n}\n\nfunction resolveHumanLoginSuccessText(user: AuthUserSnapshot | null): string {\n const email = normalizeOptionalString(user?.email);\n if (email) {\n return `✅ Welcome ${email}`;\n }\n return \"✅ Signed in.\";\n}\n\nfunction toDeviceAuthError(error: unknown): DeviceAuthError {\n if (error instanceof DeviceAuthError) {\n return error;\n }\n if (error instanceof Error) {\n return new DeviceAuthError(\"unknown\", error.message);\n }\n return new DeviceAuthError(\"unknown\", String(error));\n}\n\nfunction toOneTimeTokenAuthError(error: unknown): OneTimeTokenAuthError {\n if (error instanceof OneTimeTokenAuthError) {\n return error;\n }\n if (error instanceof Error) {\n return new OneTimeTokenAuthError(\"unknown\", error.message);\n }\n return new OneTimeTokenAuthError(\"unknown\", String(error));\n}\n\nfunction buildAgentFailureNextSteps(code: DeviceAuthFailureCode): string[] {\n if (code === \"access_denied\") {\n return [\n \"Ask the human to sign in again and approve the device request.\",\n \"Confirm the verification URL and user_code were opened and submitted.\",\n \"If denial was intentional, stop retrying.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n if (code === \"expired_token\") {\n return [\n \"Sign in again to get a fresh device_code.\",\n \"Complete approval promptly before token expiry.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n if (code === \"invalid_grant\") {\n return [\n \"Sign in again to refresh device_code and user_code.\",\n \"Verify client_id is allowed (openmeld-cli or openmeld-cli-dev).\",\n \"Verify auth URL points to the expected auth worker.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n return [\n \"Retry sign-in once.\",\n \"If still failing, check auth worker logs and response payload.\",\n \"Verify auth URL and client_id configuration.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n}\n\nfunction buildAgentOttFailureNextSteps(input: {\n authBaseUrl: string;\n code: OneTimeTokenAuthFailureCode;\n}): string[] {\n if (input.code === \"missing_access_token\") {\n return [\n \"Auth worker returned no set-auth-token header; verify bearer plugin is enabled.\",\n \"Retry after confirming auth worker deployment includes one-time-token + bearer plugins.\",\n ];\n }\n if (input.code === \"session_not_saved\") {\n return [\n \"Verify the local CLI can persist and reload the bearer session after one-time-token verification.\",\n \"Return to OpenMeld Web to inspect the current connection state and recovery action.\",\n \"If it still fails, run `openmeld login --ott <token> --view agent` and inspect the auth worker response.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n if (input.code === \"expired_token\") {\n return [\n `Open ${input.authBaseUrl}/ and generate a fresh one-time token.`,\n \"Run `openmeld login --view agent --ott <new-token>` immediately.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n if (input.code === \"invalid_token\") {\n return [\n `Open ${input.authBaseUrl}/ and generate a new one-time token.`,\n \"Use the latest token exactly once: `openmeld login --view agent --ott <token>`.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n }\n return [\n \"Retry once with a newly generated one-time token.\",\n `If it still fails, verify auth URL points to the expected worker: ${input.authBaseUrl}`,\n \"Check auth worker logs for /api/auth/one-time-token/verify.\",\n ].map((step) => formatInlineOpenMeldCliCommands(step));\n}\n\nfunction resolveLocalAuthAdaptationHint(\n error: unknown,\n context: { authBaseUrl: string; clientId: string }\n): string | null {\n if (!(error instanceof AuthHttpError)) {\n return null;\n }\n if (error.status !== 404) {\n return null;\n }\n if (!error.endpoint.endsWith(\"/api/auth/device/code\")) {\n return null;\n }\n\n const normalizedBaseUrl = context.authBaseUrl.replace(\n TRAILING_SLASH_PATTERN,\n \"\"\n );\n const isDefaultHost = normalizedBaseUrl === \"https://auth.openmeld.ai\";\n if (!isDefaultHost) {\n return null;\n }\n\n return formatInlineOpenMeldCliCommands(\n [\n \"auth worker does not expose device endpoint on current auth URL.\",\n \"for local dev: run `openmeld login --auth-url http://localhost:8788 --client-id openmeld-cli-dev`.\",\n \"or set `OPENMELD_AUTH_URL=http://localhost:8788` before running `openmeld login`.\",\n ].join(\" \")\n );\n}\n\nfunction formatCountdown(inputSeconds: number): string {\n const totalSeconds = Math.max(0, Math.floor(inputSeconds));\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n }\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n","import { cancel, isCancel, select } from \"@clack/prompts\";\nimport { sanitizeDispatchErrorSummary } from \"@openmeld/schemas\";\nimport {\n getCurrentCommandCheckState,\n isCurrentCommandCheckScopeActive,\n} from \"../command-entry-checks/current-command-check-state\";\nimport { runAuthLogin } from \"../commands/auth\";\nimport { deriveAuthBaseUrlFromGatewayUrl } from \"../config/auth-request-compatibility\";\nimport {\n type AuthSessionStateReasonCode,\n type AuthSessionStateResult,\n getAuthSessionState,\n type StoredAuthSession,\n} from \"../config/auth-session\";\nimport { canAttachAuthTokenToRequest } from \"../config/request-headers\";\nimport type { RuntimeContext } from \"../runtime/types\";\nimport { renderTextInfoCard } from \"../ui/info-card\";\nimport { outLine } from \"../ui/io\";\nimport {\n buildCommandAuthenticationPromptMessage as buildAuthPromptMessage,\n buildHumanAuthenticationCard,\n createAuthenticationError,\n extractAuthenticationPromptAction,\n resolveAuthenticationGuidance,\n} from \"./auth-guidance\";\n\nconst COMMAND_AUTH_ACTION_LOGIN = \"__command_auth_login__\";\nconst COMMAND_AUTH_ACTION_CANCEL = \"__command_auth_cancel__\";\n\nexport type CommandAuthenticationStatus =\n | \"valid\"\n | \"missing\"\n | \"invalid\"\n | \"expired\"\n | \"revoked\"\n | \"mismatch\"\n | \"unavailable\"\n | \"unknown\";\n\nexport type EvaluatedCommandAuthentication = {\n status: CommandAuthenticationStatus;\n session: StoredAuthSession | null;\n email: string | null;\n authBaseUrl: string | null;\n reasonCode: AuthSessionStateReasonCode | null;\n errorMessage: string | null;\n};\n\nexport async function evaluateCommandAuthentication(input?: {\n gatewayUrl?: string;\n}): Promise<EvaluatedCommandAuthentication> {\n let authState = await readCommandAuthState();\n if (authState?.reasonCode === \"session_token_unavailable\") {\n // This recovers one-off token-store failures. A timed-out macOS Keychain\n // helper is cached by its owner, so this re-read never launches it twice.\n authState = (await readCommandAuthState()) ?? authState;\n }\n const session = authState?.session ?? null;\n const authBaseUrl = normalizeOptionalString(session?.authBaseUrl);\n const email = normalizeOptionalString(session?.user?.email);\n const isCompatibleWithGateway =\n authState?.state === \"valid\" &&\n session !== null &&\n (!(input?.gatewayUrl && input.gatewayUrl.trim().length > 0) ||\n canAttachAuthTokenToRequest(session, input.gatewayUrl));\n\n return {\n status: resolveCommandAuthenticationStatus({\n authState,\n isCompatibleWithGateway,\n }),\n session,\n email,\n authBaseUrl,\n reasonCode: authState?.reasonCode ?? null,\n errorMessage: sanitizeAuthStateErrorMessage(authState?.errorMessage),\n };\n}\n\nexport async function ensureCommandAuthenticationOrCancel(input: {\n runtime: Pick<RuntimeContext, \"resolvedView\" | \"interactive\">;\n gatewayUrl?: string;\n promptMessage: string;\n allowPrompt?: boolean;\n evaluated?: EvaluatedCommandAuthentication;\n onAuthenticatedSession?: (session: StoredAuthSession) => void;\n}): Promise<boolean> {\n const currentState = getCurrentCommandCheckState();\n if (\n isCurrentCommandCheckScopeActive() &&\n currentState.signIn &&\n currentState.signIn.status === \"valid\" &&\n currentState.signIn.checkedGatewayUrl ===\n normalizeOptionalString(input.gatewayUrl)\n ) {\n return true;\n }\n const auth =\n input.evaluated ??\n (await evaluateCommandAuthentication({\n gatewayUrl: input.gatewayUrl,\n }));\n if (auth.status === \"valid\" && auth.session) {\n input.onAuthenticatedSession?.(auth.session);\n return true;\n }\n\n const canPrompt = input.allowPrompt ?? input.runtime.interactive;\n const guidance = resolveAuthenticationGuidance({\n reason: auth.status === \"mismatch\" ? \"mismatch\" : resolveAuthReason(auth),\n action: extractAuthenticationPromptAction(input.promptMessage),\n authBaseUrl: auth.authBaseUrl,\n gatewayUrl: input.gatewayUrl,\n });\n\n if (auth.status === \"unavailable\") {\n throw createAuthenticationError({\n reason: guidance.reason,\n action: guidance.action,\n authBaseUrl: guidance.authBaseUrl,\n gatewayUrl: guidance.gatewayUrl,\n });\n }\n\n if (input.runtime.resolvedView !== \"human\" || !canPrompt) {\n throw createAuthenticationError({\n reason: guidance.reason,\n action: guidance.action,\n authBaseUrl: guidance.authBaseUrl,\n gatewayUrl: guidance.gatewayUrl,\n });\n }\n\n const card = buildHumanAuthenticationCard({\n guidance,\n mode: \"prompt\",\n });\n renderTextInfoCard({\n title: card.title,\n rows: card.rows,\n emitLine: outLine,\n });\n\n const action = await select({\n message: \"What do you want to do?\",\n options: [\n {\n value: COMMAND_AUTH_ACTION_LOGIN,\n label: \"Sign in now\",\n },\n {\n value: COMMAND_AUTH_ACTION_CANCEL,\n label: \"Cancel\",\n },\n ],\n });\n if (isCancel(action) || action === COMMAND_AUTH_ACTION_CANCEL) {\n cancel(\"Cancelled.\");\n return false;\n }\n\n const authUrl =\n auth.status === \"mismatch\" && input.gatewayUrl\n ? deriveAuthBaseUrlFromGatewayUrl(input.gatewayUrl)\n : null;\n await runAuthLogin({\n ...(authUrl ? { authUrl } : {}),\n view: input.runtime.resolvedView,\n });\n\n const afterLogin = await evaluateCommandAuthentication({\n gatewayUrl: input.gatewayUrl,\n });\n if (afterLogin.status !== \"valid\" || !afterLogin.session) {\n cancel(\"Cancelled.\");\n return false;\n }\n input.onAuthenticatedSession?.(afterLogin.session);\n if (isCurrentCommandCheckScopeActive()) {\n currentState.signIn = {\n checkedGatewayUrl: normalizeOptionalString(input.gatewayUrl),\n status: \"valid\",\n };\n }\n\n return true;\n}\n\nexport function buildCommandAuthMismatchSummary(input: {\n gatewayUrl: string | null;\n authBaseUrl: string | null;\n}): string {\n return resolveAuthenticationGuidance({\n reason: \"mismatch\",\n authBaseUrl: input.authBaseUrl,\n gatewayUrl: input.gatewayUrl,\n }).summary;\n}\n\nexport function buildCommandAuthMismatchErrorMessage(input: {\n gatewayUrl: string | null;\n authBaseUrl: string | null;\n}): string {\n return resolveAuthenticationGuidance({\n reason: \"mismatch\",\n authBaseUrl: input.authBaseUrl,\n gatewayUrl: input.gatewayUrl,\n }).commandErrorMessage;\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveAuthReason(\n auth: EvaluatedCommandAuthentication\n): \"required\" | \"expired\" | \"invalid\" | \"revoked\" | \"unavailable\" {\n if (\n auth.status === \"expired\" ||\n auth.status === \"invalid\" ||\n auth.status === \"revoked\" ||\n auth.status === \"unavailable\"\n ) {\n return auth.status;\n }\n return \"required\";\n}\n\nasync function readCommandAuthState(): Promise<AuthSessionStateResult | null> {\n try {\n return await getAuthSessionState({\n validateRemote: true,\n });\n } catch (error) {\n return {\n state: \"invalid\",\n session: null,\n reasonCode: \"session_token_unavailable\",\n errorMessage:\n sanitizeAuthStateErrorMessage(\n error instanceof Error ? error.message : error\n ) ?? \"Authentication state could not be read.\",\n };\n }\n}\n\nfunction sanitizeAuthStateErrorMessage(value: unknown): string | null {\n return sanitizeDispatchErrorSummary(normalizeOptionalString(value));\n}\n\nfunction resolveCommandAuthenticationStatus(input: {\n authState: AuthSessionStateResult | null;\n isCompatibleWithGateway: boolean;\n}): CommandAuthenticationStatus {\n if (\n input.authState?.state === \"valid\" &&\n input.authState.session !== null &&\n !input.isCompatibleWithGateway\n ) {\n return \"mismatch\";\n }\n if (input.authState?.reasonCode === \"session_token_unavailable\") {\n return \"unavailable\";\n }\n return input.authState?.state ?? \"unknown\";\n}\n\nexport function buildCommandAuthenticationPromptMessage(\n action?: string\n): string {\n return buildAuthPromptMessage(action);\n}\n","import type { IncomingMessage } from \"node:http\";\nimport WebSocket from \"ws\";\n\nexport type WsClient = {\n readonly bufferedAmount?: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n terminate(): void;\n onMessage(handler: (data: string) => void): void;\n onClose(handler: (code: number, reason: string) => void): void;\n onError(handler: (err: unknown) => void): void;\n waitUntilClosed(): Promise<void>;\n};\n\nconst MAX_UPGRADE_REJECTION_BODY_BYTES = 2048;\nconst UPGRADE_REJECTION_BODY_READ_TIMEOUT_MS = 1000;\nconst OPENMELD_REQUEST_ID_HEADER = \"x-openmeld-request-id\";\nconst CLOUDFLARE_RAY_HEADER = \"cf-ray\";\nconst WEBSOCKET_ERROR_FALLBACK =\n \"WebSocket connection failed without additional details.\";\n\nexport class WebSocketConnectionError extends Error {\n readonly kind: \"open_timeout\" | \"closed_before_open\" | \"upgrade_rejected\";\n readonly status?: number;\n readonly requestId?: string;\n constructor(\n message: string,\n kind: \"open_timeout\" | \"closed_before_open\" | \"upgrade_rejected\",\n status?: number,\n requestId?: string\n ) {\n super(message);\n this.name = \"WebSocketConnectionError\";\n this.kind = kind;\n this.status = status;\n this.requestId = requestId;\n }\n}\n\nexport async function connectWebSocket(\n url: string,\n input?: { headers?: Record<string, string>; openTimeoutMs?: number }\n): Promise<WsClient> {\n return await new Promise((resolve, reject) => {\n let settled = false;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url, {\n headers: input?.headers,\n });\n } catch (error) {\n reject(normalizeWebSocketError(error));\n return;\n }\n const openTimeoutMs = normalizeOpenTimeoutMs(input?.openTimeoutMs);\n const openTimeout =\n openTimeoutMs === null\n ? null\n : setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n ws.terminate();\n reject(\n new WebSocketConnectionError(\n `websocket open timeout after ${openTimeoutMs}ms`,\n \"open_timeout\"\n )\n );\n }, openTimeoutMs);\n const closePromise = new Promise<void>((r) => {\n ws.on(\"close\", () => r());\n ws.on(\"error\", () => r());\n });\n ws.on(\"close\", (code, reason) => {\n if (settled) {\n return;\n }\n settled = true;\n if (openTimeout) {\n clearTimeout(openTimeout);\n }\n reject(\n new WebSocketConnectionError(\n `websocket closed before open (code=${String(code)}, reason=${reason.toString(\"utf8\")})`,\n \"closed_before_open\"\n )\n );\n });\n\n if (!isBunRuntime()) {\n ws.on(\"unexpected-response\", (_request, response) => {\n if (settled) {\n return;\n }\n settled = true;\n if (openTimeout) {\n clearTimeout(openTimeout);\n }\n buildWebSocketUpgradeRejectedError(response)\n .then(reject)\n .catch((error: unknown) =>\n reject(\n new Error(\n `daemon stream upgrade rejected (status=${String(\n response.statusCode ?? \"unknown\"\n )}, evidenceReadError=${JSON.stringify(toErrorMessage(error))})`\n )\n )\n );\n });\n }\n\n ws.on(\"open\", () => {\n if (settled) {\n return;\n }\n settled = true;\n if (openTimeout) {\n clearTimeout(openTimeout);\n }\n resolve({\n get bufferedAmount() {\n return ws.bufferedAmount;\n },\n send: (data) => ws.send(data),\n close: (code, reason) => ws.close(code, reason),\n terminate: () => ws.terminate(),\n onMessage: (handler) => {\n ws.on(\"message\", (buf) => handler(toUtf8(buf)));\n },\n onClose: (handler) => {\n ws.on(\"close\", (code, reason) =>\n handler(code, reason.toString(\"utf8\"))\n );\n },\n onError: (handler) => {\n ws.on(\"error\", (error) => handler(normalizeWebSocketError(error)));\n },\n waitUntilClosed: async () => {\n await closePromise;\n },\n });\n });\n\n ws.on(\"error\", (err) => {\n if (settled) {\n return;\n }\n settled = true;\n if (openTimeout) {\n clearTimeout(openTimeout);\n }\n reject(normalizeWebSocketError(err));\n });\n });\n}\n\nexport function normalizeWebSocketError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n const nestedError = readErrorLikeField(error, \"error\");\n if (nestedError instanceof Error) {\n return nestedError;\n }\n\n const message =\n normalizeErrorText(readErrorLikeField(error, \"message\")) ??\n normalizeErrorText(nestedError) ??\n normalizeErrorText(readErrorLikeField(nestedError, \"message\")) ??\n normalizeErrorText(error);\n return new Error(message ?? WEBSOCKET_ERROR_FALLBACK);\n}\n\nfunction readErrorLikeField(\n value: unknown,\n field: \"error\" | \"message\"\n): unknown {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n try {\n return (value as Record<string, unknown>)[field];\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeErrorText(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 isBunRuntime(): boolean {\n return Boolean((globalThis as unknown as { Bun?: unknown }).Bun);\n}\n\nfunction normalizeOpenTimeoutMs(value: unknown): number | null {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n const normalized = Math.trunc(value);\n return normalized > 0 ? normalized : null;\n}\n\nasync function buildWebSocketUpgradeRejectedError(\n response: IncomingMessage\n): Promise<Error> {\n const body = await readBodyExcerpt(response);\n const requestId =\n readHeaderValue(response, OPENMELD_REQUEST_ID_HEADER) ??\n readRequestIdFromJsonBody(body.excerpt);\n const cfRay = readHeaderValue(response, CLOUDFLARE_RAY_HEADER);\n const fields = [\n `status=${String(response.statusCode ?? \"unknown\")}`,\n ...(response.statusMessage\n ? [`statusText=${JSON.stringify(response.statusMessage)}`]\n : []),\n ...(requestId ? [`requestId=${JSON.stringify(requestId)}`] : []),\n ...(cfRay ? [`cfRay=${JSON.stringify(cfRay)}`] : []),\n ...(body.excerpt\n ? [\n `bodyExcerpt=${JSON.stringify(body.excerpt)}${\n body.truncated ? \" bodyTruncated=true\" : \"\"\n }`,\n ]\n : []),\n ];\n return new WebSocketConnectionError(\n `daemon stream upgrade rejected (${fields.join(\", \")})`,\n \"upgrade_rejected\",\n response.statusCode,\n requestId ?? undefined\n );\n}\n\nfunction readBodyExcerpt(\n response: IncomingMessage\n): Promise<{ excerpt: string; truncated: boolean }> {\n return new Promise((resolve) => {\n let totalBytes = 0;\n let bufferedBytes = 0;\n let done = false;\n const chunks: Buffer[] = [];\n\n const finish = (): void => {\n if (done) {\n return;\n }\n done = true;\n clearTimeout(timeout);\n response.off(\"data\", onData);\n response.off(\"end\", finish);\n response.off(\"error\", finish);\n response.off(\"close\", finish);\n\n resolve({\n excerpt: normalizeBodyExcerpt(Buffer.concat(chunks).toString(\"utf8\")),\n truncated: totalBytes > MAX_UPGRADE_REJECTION_BODY_BYTES,\n });\n };\n\n const onData = (chunk: Buffer | string): void => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n const remaining = MAX_UPGRADE_REJECTION_BODY_BYTES - bufferedBytes;\n if (remaining > 0) {\n const excerptChunk = buffer.subarray(0, remaining);\n chunks.push(excerptChunk);\n bufferedBytes += excerptChunk.byteLength;\n }\n totalBytes += buffer.byteLength;\n if (totalBytes >= MAX_UPGRADE_REJECTION_BODY_BYTES) {\n response.destroy();\n finish();\n }\n };\n\n const timeout = setTimeout(finish, UPGRADE_REJECTION_BODY_READ_TIMEOUT_MS);\n\n response.on(\"data\", onData);\n response.on(\"end\", finish);\n response.on(\"error\", finish);\n response.on(\"close\", finish);\n });\n}\n\nfunction readHeaderValue(\n response: IncomingMessage,\n headerName: string\n): string | null {\n const value = response.headers[headerName.toLowerCase()];\n if (Array.isArray(value)) {\n return normalizeOptionalText(value[0]);\n }\n return normalizeOptionalText(value);\n}\n\nfunction readRequestIdFromJsonBody(bodyExcerpt: string): string | null {\n if (!bodyExcerpt) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(bodyExcerpt);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"requestId\" in parsed\n ) {\n return normalizeOptionalText(parsed.requestId);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction normalizeBodyExcerpt(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toUtf8(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof Buffer) {\n return value.toString(\"utf8\");\n }\n if (Array.isArray(value)) {\n return Buffer.concat(value).toString(\"utf8\");\n }\n return String(value);\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { rm } from \"node:fs/promises\";\nimport { createServer } from \"node:net\";\nimport type { OpenMeldDaemonControlPlaneContext } from \"@openmeld/local-execution\";\nimport { buildAuthenticatedControlPlaneResponse } from \"@openmeld/local-execution\";\nimport {\n OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n openMeldDaemonControlPlaneResponseSchema,\n} from \"@openmeld/schemas\";\nimport { resolveDaemonControlPlaneEndpoint } from \"../../config/daemon-state\";\n\nconst MAX_CONTROL_PLANE_REQUEST_SIZE_BYTES = 64 * 1024;\nconst CONTROL_PLANE_RESPONSE_PROGRESS_INTERVAL_MS = 1000;\n\ntype DaemonControlPlaneTokenSource =\n | {\n expectedToken: string;\n resolveExpectedToken?: never;\n }\n | {\n expectedToken?: never;\n resolveExpectedToken: () => Promise<string> | string;\n };\n\nexport async function startLocalDaemonControlPlaneServer(\n input: DaemonControlPlaneTokenSource & {\n endpoint?: string;\n getContext: () =>\n | Promise<OpenMeldDaemonControlPlaneContext>\n | OpenMeldDaemonControlPlaneContext;\n onRequestPhase?: (event: {\n command?: string;\n phase: \"received\" | \"authenticated\" | \"shutdown_admitted\";\n requestId?: string;\n }) => void;\n }\n): Promise<{\n close: () => Promise<void>;\n endpoint: string;\n}> {\n const endpoint = input.endpoint ?? resolveDaemonControlPlaneEndpoint();\n const resolveExpectedToken = buildExpectedTokenResolver(input);\n if (process.platform !== \"win32\") {\n await rm(endpoint, { force: true }).catch(() => undefined);\n }\n\n const server = createServer((socket) => {\n let buffer = \"\";\n let handled = false;\n\n const respond = (request: unknown) => {\n const requestId = readOptionalRequestId(request);\n const command = readOptionalCommand(request);\n input.onRequestPhase?.({\n ...(command ? { command } : {}),\n phase: \"received\",\n ...(requestId ? { requestId } : {}),\n });\n let progressInterval: NodeJS.Timeout | null = null;\n const stopResponseProgress = () => {\n if (progressInterval) {\n clearInterval(progressInterval);\n progressInterval = null;\n }\n };\n const startResponseProgress = () => {\n if (progressInterval || socket.destroyed) {\n return;\n }\n progressInterval = setInterval(() => {\n if (!socket.destroyed && socket.writable) {\n socket.write(\" \");\n }\n }, CONTROL_PLANE_RESPONSE_PROGRESS_INTERVAL_MS);\n progressInterval.unref?.();\n };\n socket.once(\"close\", stopResponseProgress);\n socket.once(\"error\", stopResponseProgress);\n buildResponse({\n getContext: input.getContext,\n onAuthenticated: () => {\n input.onRequestPhase?.({\n ...(command ? { command } : {}),\n phase: \"authenticated\",\n ...(requestId ? { requestId } : {}),\n });\n },\n onShutdownAdmitted: () => {\n input.onRequestPhase?.({\n ...(command ? { command } : {}),\n phase: \"shutdown_admitted\",\n ...(requestId ? { requestId } : {}),\n });\n startResponseProgress();\n },\n request,\n requestId,\n resolveExpectedToken,\n })\n .then((response) => {\n socket.end(`${JSON.stringify(response)}\\n`);\n })\n .finally(() => {\n stopResponseProgress();\n socket.off(\"close\", stopResponseProgress);\n socket.off(\"error\", stopResponseProgress);\n });\n };\n\n socket.setEncoding(\"utf8\");\n socket.on(\"error\", () => undefined);\n socket.on(\"data\", (chunk) => {\n const normalizedChunk =\n typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(\"utf8\");\n if (handled) {\n return;\n }\n if (wouldExceedMaxControlPlaneRequestSize(buffer, normalizedChunk)) {\n handled = true;\n respondInvalidRequest(socket);\n return;\n }\n buffer += normalizedChunk;\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n handled = true;\n const rawRequest = buffer.slice(0, newlineIndex).trim();\n if (!rawRequest) {\n respondInvalidRequest(socket);\n return;\n }\n respond(parseJsonRequest(rawRequest));\n });\n socket.on(\"end\", () => {\n if (handled) {\n return;\n }\n handled = true;\n // `data` already rejects oversized requests before appending to `buffer`.\n // Keep this end-path guard as a defensive last check for unexpected edge\n // cases where the stream closes without going through the normal newline path.\n if (isOversizedControlPlaneRequest(buffer)) {\n respondInvalidRequest(socket);\n return;\n }\n const rawRequest = buffer.trim();\n if (!rawRequest) {\n respondInvalidRequest(socket);\n return;\n }\n respond(parseJsonRequest(rawRequest));\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(endpoint, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return {\n endpoint,\n close: async () => {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n }).finally(async () => {\n if (process.platform !== \"win32\") {\n await rm(endpoint, { force: true }).catch(() => undefined);\n }\n });\n },\n };\n}\n\nfunction buildExpectedTokenResolver(\n input: DaemonControlPlaneTokenSource\n): () => Promise<string> | string {\n if (input.resolveExpectedToken) {\n return input.resolveExpectedToken;\n }\n return () => input.expectedToken;\n}\n\nasync function buildResponse(input: {\n getContext: () =>\n | Promise<OpenMeldDaemonControlPlaneContext>\n | OpenMeldDaemonControlPlaneContext;\n onAuthenticated: () => void;\n onShutdownAdmitted: () => void;\n request: unknown;\n requestId?: string;\n resolveExpectedToken: () => Promise<string> | string;\n}) {\n try {\n const expectedToken = await input.resolveExpectedToken();\n const context = await input.getContext();\n return await buildAuthenticatedControlPlaneResponse({\n context,\n expectedToken,\n lifecycle: {\n onAuthenticated: input.onAuthenticated,\n onShutdownAdmitted: input.onShutdownAdmitted,\n },\n request: input.request,\n });\n } catch (error) {\n return buildControlPlaneErrorResponse({\n errorCode: resolveControlPlaneErrorCode(error),\n errorMessage:\n error instanceof Error ? error.message : \"local daemon control failed\",\n requestId: input.requestId,\n });\n }\n}\n\nfunction respondInvalidRequest(socket: import(\"node:net\").Socket) {\n const response = buildControlPlaneErrorResponse({\n errorCode: \"service.invalid_request\",\n errorMessage: \"invalid daemon control-plane request\",\n });\n socket.end(`${JSON.stringify(response)}\\n`);\n}\n\nfunction wouldExceedMaxControlPlaneRequestSize(\n buffer: string,\n chunk: string\n): boolean {\n return (\n Buffer.byteLength(buffer, \"utf8\") + Buffer.byteLength(chunk, \"utf8\") >\n MAX_CONTROL_PLANE_REQUEST_SIZE_BYTES\n );\n}\n\nfunction isOversizedControlPlaneRequest(buffer: string): boolean {\n return (\n Buffer.byteLength(buffer, \"utf8\") > MAX_CONTROL_PLANE_REQUEST_SIZE_BYTES\n );\n}\n\nfunction parseJsonRequest(rawRequest: string): unknown {\n try {\n return JSON.parse(rawRequest) as unknown;\n } catch {\n return null;\n }\n}\n\nfunction readOptionalRequestId(request: unknown): string | undefined {\n if (!request || typeof request !== \"object\") {\n return undefined;\n }\n const requestId = (request as { requestId?: unknown }).requestId;\n if (typeof requestId !== \"string\") {\n return undefined;\n }\n const normalized = requestId.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction readOptionalCommand(request: unknown): string | undefined {\n if (!request || typeof request !== \"object\") {\n return undefined;\n }\n const command = (request as { command?: unknown }).command;\n return typeof command === \"string\" && command.length > 0\n ? command\n : undefined;\n}\n\nfunction buildControlPlaneErrorResponse(input: {\n errorCode: string;\n errorMessage: string;\n requestId?: string;\n}) {\n const parsed = openMeldDaemonControlPlaneResponseSchema.safeParse({\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n ...(input.requestId ? { requestId: input.requestId } : {}),\n code: \"service.error\",\n payload: {\n errorCode: input.errorCode,\n errorMessage: input.errorMessage,\n },\n });\n if (!parsed.success) {\n throw new Error(\"invalid daemon control-plane error response\");\n }\n return parsed.data;\n}\n\nfunction resolveControlPlaneErrorCode(error: unknown): string {\n if (\n error instanceof Error &&\n typeof (error as { code?: unknown }).code === \"string\"\n ) {\n return String((error as { code?: string }).code);\n }\n if (error instanceof Error && error.message === \"auth.unauthenticated\") {\n return \"auth.unauthenticated\";\n }\n if (\n error instanceof Error &&\n error.message === \"invalid daemon control-plane request\"\n ) {\n return \"service.invalid_request\";\n }\n if (\n error instanceof Error &&\n error.message === \"invalid daemon control-plane response\"\n ) {\n return \"service.invalid_response\";\n }\n return \"service.internal\";\n}\n","import type { RouteCatalog } from \"../core/types\";\nimport type { ExecutionHostPort } from \"./port\";\n\nexport function createExecutionHostCatalogClient(host: ExecutionHostPort) {\n let resolved = false;\n return {\n isResolved: () => resolved,\n async load(): Promise<RouteCatalog> {\n const catalog = await host.call(\"loadCatalog\", { initial: !resolved });\n resolved = true;\n return {\n executionHostCatalogRevision: catalog.revision,\n expectedRoutesContractVersion: catalog.expectedRoutesContractVersion,\n profileIds: catalog.profileIds,\n routeByProfileId: new Map(\n catalog.routes.map((route) => [route.profileId, route])\n ),\n skippedProfiles: catalog.skippedProfiles,\n workingFolderExpectedProfileIds:\n catalog.workingFolderExpectedProfileIds,\n workingFolderObservations: catalog.workingFolderObservations,\n };\n },\n async persist(catalog: RouteCatalog): Promise<void> {\n if (catalog.executionHostCatalogRevision) {\n await host.call(\"persistCatalog\", {\n revision: catalog.executionHostCatalogRevision,\n });\n }\n },\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { isAbsolute } from \"node:path\";\nimport {\n type ServiceExecutionHostIdentity,\n type ServiceExecutionHostInput,\n type ServiceExecutionHostMethod,\n type ServiceExecutionHostOutput,\n type ServiceExecutionHostSnapshot,\n serviceExecutionHostSnapshotSchema,\n} from \"@openmeld/schemas\";\nimport { isBinaryDistribution } from \"../../runtime/distribution\";\nimport { createExecutionHostClient, ExecutionHostError } from \"./channel\";\nimport type { ExecutionHostEvent, ExecutionHostPort } from \"./port\";\nimport { childExecutionHostChannel } from \"./process-channel\";\n\nconst HOST_HEALTH_TIMEOUT_MS = 2000;\n\n// Both distributions launch their own exact entry and bundled Host. No PATH\n// lookup, newer installed CLI, shell string, or renderer-selected executable.\nexport function executionHostLaunchArguments(input: {\n binary: boolean;\n entry?: string;\n execArgv: string[];\n hostInstanceId: string;\n}): string[] {\n const command = [\"service\", \"execution-host\", input.hostInstanceId];\n if (input.binary) {\n return command;\n }\n if (!(input.entry && isAbsolute(input.entry))) {\n throw new ExecutionHostError(\n \"host.entry_unavailable\",\n \"The Service cannot identify its bundled execution-host entry.\"\n );\n }\n return [...input.execArgv, input.entry, ...command];\n}\n\nexport function launchExecutionHost(input: {\n identity: ServiceExecutionHostIdentity;\n onFailure(error: Error): void;\n}): ExecutionHostPort & {\n hostInstanceId: string;\n initialized: Promise<ServiceExecutionHostSnapshot>;\n close(): Promise<void>;\n} {\n const hostInstanceId = randomUUID();\n const child = spawn(\n process.execPath,\n executionHostLaunchArguments({\n binary: isBinaryDistribution(),\n entry: process.argv[1],\n execArgv: process.execArgv,\n hostInstanceId,\n }),\n {\n cwd: process.cwd(),\n env: { ...process.env, OPENMELD_HOME: input.identity.stateRoot },\n serialization: \"json\",\n stdio: [\"ignore\", \"inherit\", \"inherit\", \"ipc\"],\n windowsHide: true,\n }\n );\n const exited = new Promise<void>((resolve, reject) => {\n child.once(\"exit\", (code, signal) => {\n if (code === 0 && !signal) {\n resolve();\n } else {\n reject(\n new ExecutionHostError(\n \"host.exit_unconfirmed\",\n \"The Host did not report a clean process exit.\"\n )\n );\n }\n });\n child.once(\"error\", reject);\n });\n exited.catch(() => undefined);\n let lastSnapshot: ServiceExecutionHostSnapshot | null = null;\n let observedAtMs: number | null = null;\n let responsive = false;\n let failed = false;\n let closing = false;\n const eventListeners = new Set<(event: ExecutionHostEvent) => void>();\n const availabilityListeners = new Set<() => void>();\n const setResponsive = (next: boolean) => {\n if (responsive === next) {\n return;\n }\n responsive = next;\n for (const listener of availabilityListeners) {\n listener();\n }\n };\n const client = createExecutionHostClient({\n channel: childExecutionHostChannel(child),\n hostInstanceId,\n onEvent: (event) => {\n for (const listener of eventListeners) {\n listener(event);\n }\n },\n onFailure: (error) => {\n failed = true;\n setResponsive(false);\n if (!closing) {\n input.onFailure(error);\n }\n },\n });\n\n async function call<M extends ServiceExecutionHostMethod>(\n method: M,\n payload: ServiceExecutionHostInput<M>,\n options?: { timeoutMs?: number | null }\n ): Promise<ServiceExecutionHostOutput<M>> {\n try {\n if (method !== \"initialize\") {\n await initialized;\n }\n const result = await client.call(method, payload, {\n ...(method === \"health\" ? { timeoutMs: HOST_HEALTH_TIMEOUT_MS } : {}),\n ...options,\n });\n const observation = serviceExecutionHostSnapshotSchema.safeParse(result);\n if (observation.success) {\n if (observation.data.pid !== child.pid) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"The Host response belongs to a different process.\"\n );\n }\n lastSnapshot = observation.data;\n observedAtMs = Date.now();\n if (!failed) {\n setResponsive(true);\n }\n }\n return result;\n } catch (error) {\n // A failed health observation closes admission, never kills/restarts work.\n // A later observation of this same process may establish responsiveness.\n if (\n method === \"health\" ||\n method === \"initialize\" ||\n method === \"heartbeat\"\n ) {\n setResponsive(false);\n }\n throw error;\n }\n }\n\n const initialized = call(\"initialize\", input.identity);\n // The connector starts independently. Callers may await initialization for\n // execution commands; retaining this handler prevents an unobserved rejection.\n initialized.catch(() => undefined);\n return {\n hostInstanceId,\n initialized,\n call,\n available: () => responsive && !failed,\n snapshot: () => lastSnapshot,\n observation: () => ({\n hostInstanceId,\n observedAtMs,\n responsive: responsive && !failed,\n admission: lastSnapshot?.admission ?? null,\n activeCount: lastSnapshot?.activeCount ?? null,\n pendingCount: lastSnapshot?.pendingCount ?? null,\n unacknowledgedResultCount:\n lastSnapshot?.unacknowledgedResultCount ?? null,\n startupReplayPending: lastSnapshot?.startupReplayPending ?? null,\n }),\n onEvent: (listener) => {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n onAvailabilityChanged: (listener) => {\n availabilityListeners.add(listener);\n return () => {\n availabilityListeners.delete(listener);\n };\n },\n async close() {\n closing = true;\n try {\n // No total task timeout: this joins the Host's accepted drain. A dead\n // Host rejects; its last snapshot is never treated as a successful stop.\n await call(\"stop\", {}, { timeoutMs: null });\n if (child.connected) {\n child.disconnect();\n }\n await exited;\n } finally {\n // Parent loss withdraws observation, never kills accepted work. The\n // Host retains drain ownership after a lost initialization/stop ACK.\n if (child.connected) {\n child.disconnect();\n }\n client.dispose();\n eventListeners.clear();\n availabilityListeners.clear();\n }\n },\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { accessSync, constants } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { localFolderPickerHelperProtocolResultSchema } from \"@openmeld/schemas\";\nimport type {\n LocalFolderPickerHelperResult,\n LocalFolderPickerPurpose,\n} from \"@openmeld/schemas/types\";\nimport { warnDaemonEvent } from \"../core/logger\";\nimport type { RunLocalFolderPickerHelper } from \"./local-folder-picker-service\";\n\nconst LOCAL_FOLDER_PICKER_TIMEOUT_MS = 590_000;\nconst LOCAL_FOLDER_PICKER_FORCE_KILL_DELAY_MS = 2000;\nconst MAX_HELPER_OUTPUT_BYTES = 256 * 1024;\nconst LINUX_PATH_SEPARATOR = \"\\u001e\";\nconst LEADING_BYTE_ORDER_MARK_PATTERN = /^\\uFEFF/;\nconst TERMINAL_LINE_BREAK_PATTERN = /\\r?\\n$/;\n\ntype ProcessResult = { exitCode: number; stdout: string };\ntype LocalFolderPickerHelperAdapter =\n | \"linux_kdialog\"\n | \"linux_zenity\"\n | \"macos_jxa\"\n | \"windows_forms\";\ntype LocalFolderPickerHelperDiagnosticCode =\n | \"aborted\"\n | \"invalid_response\"\n | \"non_zero_exit\"\n | \"output_limit\"\n | \"spawn_failed\"\n | \"timed_out\";\ntype LocalFolderPickerHelperDiagnostic = {\n adapter: LocalFolderPickerHelperAdapter;\n code: LocalFolderPickerHelperDiagnosticCode;\n exitCode?: number;\n platform: NodeJS.Platform;\n};\ntype DiagnoseLocalFolderPickerHelper = (\n diagnostic: LocalFolderPickerHelperDiagnostic\n) => void;\ntype InvokeHelper = (input: {\n args: string[];\n executablePath: string;\n signal: AbortSignal;\n stdin: string;\n timeoutMs: number;\n}) => Promise<ProcessResult>;\n\ntype ResolveSystemPickerInput = {\n diagnose?: DiagnoseLocalFolderPickerHelper;\n env?: NodeJS.ProcessEnv;\n executableExists?: (path: string) => boolean;\n invoke?: InvokeHelper;\n platform?: NodeJS.Platform;\n};\n\nexport function resolveSystemLocalFolderPickerHelper(\n input: ResolveSystemPickerInput = {}\n): RunLocalFolderPickerHelper | null {\n const platform = input.platform ?? process.platform;\n const env = input.env ?? process.env;\n const executableExists = input.executableExists ?? isExecutable;\n const invoke = input.invoke ?? invokeLocalFolderPickerProcess;\n const diagnose = input.diagnose ?? emitLocalFolderPickerHelperDiagnostic;\n\n if (platform === \"darwin\") {\n const executablePath = \"/usr/bin/osascript\";\n return executableExists(executablePath)\n ? createJsonScriptPicker({\n args: [\"-l\", \"JavaScript\"],\n buildScript: buildMacOsPickerScript,\n diagnosticContext: {\n adapter: \"macos_jxa\",\n diagnose,\n platform,\n },\n executablePath,\n invoke,\n })\n : null;\n }\n\n if (platform === \"win32\") {\n const systemRoot = env.SystemRoot ?? env.WINDIR;\n if (!systemRoot) {\n return null;\n }\n const executablePath = join(\n systemRoot,\n \"System32\",\n \"WindowsPowerShell\",\n \"v1.0\",\n \"powershell.exe\"\n );\n return executableExists(executablePath)\n ? createJsonScriptPicker({\n args: [\n \"-NoLogo\",\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-STA\",\n \"-Command\",\n \"-\",\n ],\n buildScript: buildWindowsPickerScript,\n diagnosticContext: {\n adapter: \"windows_forms\",\n diagnose,\n platform,\n },\n executablePath,\n invoke,\n })\n : null;\n }\n\n if (platform === \"linux\") {\n const zenityPath = findExecutableOnPath(\n \"zenity\",\n env.PATH,\n executableExists\n );\n if (zenityPath) {\n return createZenityPicker({\n diagnosticContext: {\n adapter: \"linux_zenity\",\n diagnose,\n platform,\n },\n env,\n executablePath: zenityPath,\n invoke,\n });\n }\n const kdialogPath = findExecutableOnPath(\n \"kdialog\",\n env.PATH,\n executableExists\n );\n return kdialogPath\n ? createKDialogPicker({\n diagnosticContext: {\n adapter: \"linux_kdialog\",\n diagnose,\n platform,\n },\n env,\n executablePath: kdialogPath,\n invoke,\n })\n : null;\n }\n\n return null;\n}\n\nfunction createJsonScriptPicker(input: {\n args: string[];\n buildScript: (allowMultiple: boolean, prompt: string) => string;\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext;\n executablePath: string;\n invoke: InvokeHelper;\n}): RunLocalFolderPickerHelper {\n return async ({ allowMultiple, purpose, signal }) => {\n try {\n const processResult = await input.invoke({\n args: input.args,\n executablePath: input.executablePath,\n signal,\n stdin: input.buildScript(\n allowMultiple,\n resolveLocalFolderPickerPrompt(purpose, allowMultiple)\n ),\n timeoutMs: LOCAL_FOLDER_PICKER_TIMEOUT_MS,\n });\n if (processResult.exitCode !== 0) {\n diagnoseLocalFolderPickerHelper(input.diagnosticContext, {\n code: \"non_zero_exit\",\n exitCode: processResult.exitCode,\n });\n return internalError();\n }\n return parseJsonHelperResult(\n processResult.stdout,\n input.diagnosticContext\n );\n } catch (error) {\n return processFailureResult(error, input.diagnosticContext);\n }\n };\n}\n\nfunction createZenityPicker(input: {\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n invoke: InvokeHelper;\n}): RunLocalFolderPickerHelper {\n return async ({ allowMultiple, purpose, signal }) => {\n if (!hasLinuxDesktopSession(input.env)) {\n return noInteractiveSession();\n }\n try {\n const result = await input.invoke({\n args: [\n \"--file-selection\",\n \"--directory\",\n `--title=${resolveLocalFolderPickerPrompt(purpose, allowMultiple)}`,\n ...(allowMultiple\n ? [\"--multiple\", `--separator=${LINUX_PATH_SEPARATOR}`]\n : []),\n ],\n executablePath: input.executablePath,\n signal,\n stdin: \"\",\n timeoutMs: LOCAL_FOLDER_PICKER_TIMEOUT_MS,\n });\n if (result.exitCode === 1) {\n return { status: \"cancelled\" };\n }\n if (result.exitCode !== 0) {\n diagnoseLocalFolderPickerHelper(input.diagnosticContext, {\n code: \"non_zero_exit\",\n exitCode: result.exitCode,\n });\n return internalError();\n }\n return pathsFromLinuxOutput(\n result.stdout,\n LINUX_PATH_SEPARATOR,\n input.diagnosticContext\n );\n } catch (error) {\n return processFailureResult(error, input.diagnosticContext);\n }\n };\n}\n\nfunction createKDialogPicker(input: {\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext;\n env: NodeJS.ProcessEnv;\n executablePath: string;\n invoke: InvokeHelper;\n}): RunLocalFolderPickerHelper {\n return async ({ allowMultiple, purpose, signal }) => {\n if (!hasLinuxDesktopSession(input.env)) {\n return noInteractiveSession();\n }\n try {\n const result = await input.invoke({\n args: [\n \"--getexistingdirectory\",\n \".\",\n \"--title\",\n resolveLocalFolderPickerPrompt(purpose, allowMultiple),\n ],\n executablePath: input.executablePath,\n signal,\n stdin: \"\",\n timeoutMs: LOCAL_FOLDER_PICKER_TIMEOUT_MS,\n });\n if (result.exitCode === 1) {\n return { status: \"cancelled\" };\n }\n if (result.exitCode !== 0) {\n diagnoseLocalFolderPickerHelper(input.diagnosticContext, {\n code: \"non_zero_exit\",\n exitCode: result.exitCode,\n });\n return internalError();\n }\n return pathsFromLinuxOutput(result.stdout, null, input.diagnosticContext);\n } catch (error) {\n return processFailureResult(error, input.diagnosticContext);\n }\n };\n}\n\ntype LocalFolderPickerHelperDiagnosticContext = {\n adapter: LocalFolderPickerHelperAdapter;\n diagnose: DiagnoseLocalFolderPickerHelper;\n platform: NodeJS.Platform;\n};\n\nfunction parseJsonHelperResult(\n stdout: string,\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext\n): LocalFolderPickerHelperResult {\n let raw: unknown;\n try {\n raw = JSON.parse(stdout.replace(LEADING_BYTE_ORDER_MARK_PATTERN, \"\"));\n } catch {\n diagnoseLocalFolderPickerHelper(diagnosticContext, {\n code: \"invalid_response\",\n });\n return invalidResponse();\n }\n const parsed = localFolderPickerHelperProtocolResultSchema.safeParse(raw);\n if (!parsed.success) {\n diagnoseLocalFolderPickerHelper(diagnosticContext, {\n code: \"invalid_response\",\n });\n return invalidResponse();\n }\n const { v: _version, ...result } = parsed.data;\n return result;\n}\n\nfunction pathsFromLinuxOutput(\n stdout: string,\n separator: string | null,\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext\n): LocalFolderPickerHelperResult {\n const output = stdout.replace(TERMINAL_LINE_BREAK_PATTERN, \"\");\n const rawPaths = separator ? output.split(separator) : [output];\n const parsed = localFolderPickerHelperProtocolResultSchema.safeParse({\n paths: rawPaths,\n status: \"selected\",\n v: 1,\n });\n if (!parsed.success || parsed.data.status !== \"selected\") {\n diagnoseLocalFolderPickerHelper(diagnosticContext, {\n code: \"invalid_response\",\n });\n return invalidResponse();\n }\n return { paths: parsed.data.paths, status: \"selected\" };\n}\n\nfunction processFailureResult(\n error: unknown,\n diagnosticContext: LocalFolderPickerHelperDiagnosticContext\n): LocalFolderPickerHelperResult {\n const diagnosticCode = resolveProcessFailureDiagnosticCode(error);\n diagnoseLocalFolderPickerHelper(diagnosticContext, { code: diagnosticCode });\n if (diagnosticCode === \"timed_out\") {\n return {\n code: \"local.folder_picker.timed_out\",\n status: \"unavailable\",\n };\n }\n return internalError();\n}\n\nfunction resolveProcessFailureDiagnosticCode(\n error: unknown\n): LocalFolderPickerHelperDiagnosticCode {\n if (!(error instanceof Error && \"code\" in error)) {\n return \"spawn_failed\";\n }\n switch (error.code) {\n case \"LOCAL_FOLDER_PICKER_ABORTED\":\n return \"aborted\";\n case \"LOCAL_FOLDER_PICKER_OUTPUT_LIMIT\":\n return \"output_limit\";\n case \"LOCAL_FOLDER_PICKER_TIMEOUT\":\n return \"timed_out\";\n default:\n return \"spawn_failed\";\n }\n}\n\nfunction diagnoseLocalFolderPickerHelper(\n context: LocalFolderPickerHelperDiagnosticContext,\n diagnostic: Pick<LocalFolderPickerHelperDiagnostic, \"code\" | \"exitCode\">\n): void {\n context.diagnose({\n adapter: context.adapter,\n code: diagnostic.code,\n ...(diagnostic.exitCode === undefined\n ? {}\n : { exitCode: diagnostic.exitCode }),\n platform: context.platform,\n });\n}\n\nfunction emitLocalFolderPickerHelperDiagnostic(\n diagnostic: LocalFolderPickerHelperDiagnostic\n): void {\n warnDaemonEvent(\"[openmeld.local_folder_picker.helper_failed]\", {\n adapter: diagnostic.adapter,\n code: diagnostic.code,\n event: \"cli.local_folder_picker.helper_failed\",\n exitCode: diagnostic.exitCode,\n platform: diagnostic.platform,\n });\n}\n\nfunction invalidResponse(): LocalFolderPickerHelperResult {\n return {\n code: \"local.folder_picker.invalid_response\",\n status: \"unavailable\",\n };\n}\n\nfunction internalError(): LocalFolderPickerHelperResult {\n return {\n code: \"local.folder_picker.internal_error\",\n status: \"unavailable\",\n };\n}\n\nfunction noInteractiveSession(): LocalFolderPickerHelperResult {\n return {\n code: \"local.folder_picker.no_interactive_session\",\n status: \"unavailable\",\n };\n}\n\nfunction hasLinuxDesktopSession(env: NodeJS.ProcessEnv): boolean {\n return Boolean(\n env.WAYLAND_DISPLAY ||\n env.DISPLAY ||\n (env.DBUS_SESSION_BUS_ADDRESS && env.XDG_RUNTIME_DIR)\n );\n}\n\nfunction resolveLocalFolderPickerPrompt(\n purpose: LocalFolderPickerPurpose,\n allowMultiple: boolean\n): string {\n if (purpose === \"project_connection\") {\n return \"Choose a Project folder for OpenMeld\";\n }\n if (purpose === \"agent_profile_working_folder\") {\n return \"Choose a working folder for OpenMeld\";\n }\n return allowMultiple\n ? \"Choose folders for OpenMeld file access\"\n : \"Choose a folder for OpenMeld file access\";\n}\n\nfunction findExecutableOnPath(\n executableName: string,\n pathValue: string | undefined,\n executableExists: (path: string) => boolean\n): string | null {\n if (!pathValue) {\n return null;\n }\n for (const pathEntry of pathValue.split(delimiter)) {\n if (!pathEntry) {\n continue;\n }\n const candidate = join(pathEntry, executableName);\n if (executableExists(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction isExecutable(filePath: string): boolean {\n try {\n accessSync(filePath, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction buildMacOsPickerScript(\n allowMultiple: boolean,\n prompt: string\n): string {\n return `\nObjC.import(\"AppKit\");\nconst nativeApp = $.NSApplication.sharedApplication;\nnativeApp.setActivationPolicy($.NSApplicationActivationPolicyAccessory);\nnativeApp.activateIgnoringOtherApps(true);\nconst app = Application.currentApplication();\napp.includeStandardAdditions = true;\ntry {\n const selection = app.chooseFolder({\n multipleSelectionsAllowed: ${allowMultiple ? \"true\" : \"false\"},\n withPrompt: ${JSON.stringify(prompt)}\n });\n const values = Array.isArray(selection) ? selection : [selection];\n JSON.stringify({ paths: values.map((value) => value.toString()), status: \"selected\", v: 1 });\n} catch (error) {\n if (Number(error.errorNumber) === -128) {\n JSON.stringify({ status: \"cancelled\", v: 1 });\n } else {\n JSON.stringify({\n code: \"local.folder_picker.internal_error\",\n status: \"unavailable\",\n v: 1\n });\n }\n}\n`.trim();\n}\n\nfunction buildWindowsPickerScript(\n _allowMultiple: boolean,\n prompt: string\n): string {\n return `\n$ErrorActionPreference = \"Stop\"\ntry {\n $currentSession = [System.Diagnostics.Process]::GetCurrentProcess().SessionId\n $hasExplorer = @(Get-Process -Name explorer -ErrorAction SilentlyContinue | Where-Object { $_.SessionId -eq $currentSession }).Count -gt 0\n if (-not $hasExplorer) {\n [Console]::Out.Write('{\"code\":\"local.folder_picker.no_interactive_session\",\"status\":\"unavailable\",\"v\":1}')\n exit 0\n }\n Add-Type -AssemblyName System.Windows.Forms\n $dialog = New-Object System.Windows.Forms.FolderBrowserDialog\n $dialog.Description = ${JSON.stringify(prompt)}\n $dialog.ShowNewFolderButton = $true\n if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {\n $result = @{ paths = @($dialog.SelectedPath); status = \"selected\"; v = 1 } | ConvertTo-Json -Compress\n [Console]::Out.Write($result)\n } else {\n [Console]::Out.Write('{\"status\":\"cancelled\",\"v\":1}')\n }\n} catch {\n [Console]::Out.Write('{\"code\":\"local.folder_picker.internal_error\",\"status\":\"unavailable\",\"v\":1}')\n}\n`.trim();\n}\n\nasync function invokeLocalFolderPickerProcess(input: {\n args: string[];\n executablePath: string;\n signal: AbortSignal;\n stdin: string;\n timeoutMs: number;\n}): Promise<ProcessResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(input.executablePath, input.args, {\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n windowsHide: true,\n });\n const chunks: Buffer[] = [];\n let outputBytes = 0;\n let settled = false;\n let terminationError: Error | null = null;\n let forceKillTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearLifecycle = () => {\n clearTimeout(timeoutId);\n if (forceKillTimer) {\n clearTimeout(forceKillTimer);\n }\n input.signal.removeEventListener(\"abort\", onAbort);\n };\n const requestTermination = (error: Error) => {\n if (settled || terminationError) {\n return;\n }\n terminationError = error;\n try {\n child.kill();\n } catch {\n // The close/error lifecycle below remains the authority for settlement.\n }\n forceKillTimer = setTimeout(() => {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // Keep waiting for close so the Service never admits a second picker\n // while the first helper may still be alive.\n }\n }, LOCAL_FOLDER_PICKER_FORCE_KILL_DELAY_MS);\n };\n const onAbort = () => {\n requestTermination(\n Object.assign(new Error(\"Local Folder Picker helper was stopped.\"), {\n code: \"LOCAL_FOLDER_PICKER_ABORTED\",\n })\n );\n };\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n requestTermination(\n Object.assign(new Error(\"Local Folder Picker helper timed out.\"), {\n code: \"LOCAL_FOLDER_PICKER_TIMEOUT\",\n })\n );\n }, input.timeoutMs);\n input.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n outputBytes += chunk.byteLength;\n if (outputBytes > MAX_HELPER_OUTPUT_BYTES) {\n requestTermination(\n Object.assign(\n new Error(\"Local Folder Picker helper output was too large.\"),\n { code: \"LOCAL_FOLDER_PICKER_OUTPUT_LIMIT\" }\n )\n );\n return;\n }\n chunks.push(chunk);\n });\n child.once(\"error\", (error) => {\n if (settled) {\n return;\n }\n terminationError ??= error;\n });\n child.once(\"close\", (exitCode) => {\n if (settled) {\n return;\n }\n settled = true;\n clearLifecycle();\n if (terminationError) {\n reject(terminationError);\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout:\n outputBytes > MAX_HELPER_OUTPUT_BYTES\n ? \"\"\n : Buffer.concat(chunks).toString(\"utf8\"),\n });\n });\n if (input.signal.aborted) {\n onAbort();\n }\n child.stdin.end(input.stdin);\n });\n}\n","import { stat } from \"node:fs/promises\";\nimport { localFolderPickerHelperResultSchema } from \"@openmeld/schemas\";\nimport type {\n LocalFolderPickerHelperErrorCode,\n LocalFolderPickerHelperResult,\n LocalFolderPickerPurpose,\n LocalFolderPickerRequest,\n LocalFolderPickerResult,\n} from \"@openmeld/schemas/types\";\nexport type RunLocalFolderPickerHelper = (input: {\n allowMultiple: boolean;\n purpose: LocalFolderPickerPurpose;\n signal: AbortSignal;\n}) => Promise<LocalFolderPickerHelperResult>;\n\nexport type LocalFolderPickerService = {\n available: boolean;\n close: () => Promise<void>;\n selectFolders: (\n request: LocalFolderPickerRequest\n ) => Promise<LocalFolderPickerResult>;\n};\n\nexport function createLocalFolderPickerService(input: {\n deviceId: string;\n runHelper: RunLocalFolderPickerHelper | null;\n}): LocalFolderPickerService {\n let pickerOpen = false;\n let activeAbortController: AbortController | null = null;\n let activePickerClosed: PromiseWithResolvers<void> | null = null;\n\n return {\n available: input.runHelper !== null,\n close: async () => {\n const pickerClosed = activePickerClosed;\n activeAbortController?.abort();\n await pickerClosed?.promise;\n },\n selectFolders: async (request) => {\n if (!input.runHelper) {\n return {\n code: \"local.folder_picker.helper_missing\",\n message:\n \"Update or repair OpenMeld Service to choose folders on this computer.\",\n status: \"unavailable\",\n };\n }\n if (pickerOpen) {\n return {\n code: \"local.folder_picker.picker_busy\",\n message:\n \"A folder picker is already open on this computer. Finish or close it, then try again.\",\n status: \"unavailable\",\n };\n }\n\n pickerOpen = true;\n const abortController = new AbortController();\n const pickerClosed = Promise.withResolvers<void>();\n activeAbortController = abortController;\n activePickerClosed = pickerClosed;\n try {\n const helperResult = localFolderPickerHelperResultSchema.safeParse(\n await input.runHelper({\n allowMultiple: request.allowMultiple,\n purpose: request.purpose,\n signal: abortController.signal,\n })\n );\n if (!helperResult.success) {\n return invalidResponse();\n }\n if (helperResult.data.status === \"selected\") {\n if (!(await areExistingDirectories(helperResult.data.paths))) {\n return invalidResponse();\n }\n return {\n deviceId: input.deviceId,\n paths: helperResult.data.paths,\n status: \"selected\",\n };\n }\n if (helperResult.data.status === \"cancelled\") {\n return { deviceId: input.deviceId, status: \"cancelled\" };\n }\n return unavailableResult(helperResult.data.code);\n } catch {\n return {\n code: \"local.folder_picker.internal_error\",\n message: \"OpenMeld couldn’t open the folder picker. Try again.\",\n status: \"unavailable\",\n };\n } finally {\n pickerOpen = false;\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n if (activePickerClosed === pickerClosed) {\n activePickerClosed = null;\n }\n pickerClosed.resolve();\n }\n },\n };\n}\n\nasync function areExistingDirectories(\n paths: readonly string[]\n): Promise<boolean> {\n try {\n const stats = await Promise.all(\n paths.map(async (path) => await stat(path))\n );\n return stats.every((entry) => entry.isDirectory());\n } catch {\n return false;\n }\n}\n\nfunction unavailableResult(\n code: LocalFolderPickerHelperErrorCode\n): LocalFolderPickerResult {\n const messages: Record<LocalFolderPickerHelperErrorCode, string> = {\n \"local.folder_picker.internal_error\":\n \"OpenMeld couldn’t open the folder picker. Try again.\",\n \"local.folder_picker.invalid_response\":\n \"OpenMeld received an invalid response from the folder picker.\",\n \"local.folder_picker.no_interactive_session\":\n \"Sign in to this computer to choose a folder.\",\n \"local.folder_picker.portal_unavailable\":\n \"A desktop folder picker isn’t available in this Linux session.\",\n \"local.folder_picker.timed_out\":\n \"The folder picker closed because it was open too long.\",\n \"local.folder_picker.unsupported_platform\":\n \"OpenMeld can’t open a folder picker on this computer.\",\n };\n return { code, message: messages[code], status: \"unavailable\" };\n}\n\nfunction invalidResponse(): LocalFolderPickerResult {\n return {\n code: \"local.folder_picker.invalid_response\",\n message: \"OpenMeld received an invalid response from the folder picker.\",\n status: \"unavailable\",\n };\n}\n","import { realpath } from \"node:fs/promises\";\nimport {\n isPublishedOpenMeldHome,\n type OpenMeldPathResolutionInput,\n resolveOpenMeldEnvPreset,\n} from \"../../config/paths\";\nimport { isOpenMeldManagedBinaryPath } from \"./daemon-managed-binary-path\";\n\n/** Reject borrowing the installed production executable for isolated smoke.\n * A home override alone does not change its process-inventory identity.\n * This is an entry guard, not execution ownership or account authorization.\n */\nexport async function assertDaemonServiceLaunchScope(\n input: OpenMeldPathResolutionInput & { executablePath?: string } = {}\n): Promise<void> {\n if (\n isPublishedOpenMeldHome(input) &&\n resolveOpenMeldEnvPreset(input) === \"prod\"\n ) {\n return;\n }\n const executablePath = input.executablePath ?? process.execPath;\n const resolvedExecutable = await realpath(executablePath).catch(\n () => executablePath\n );\n const productionPaths = {\n ...input,\n env: {\n ...(input.env ?? process.env),\n OPENMELD_ENV_PRESET: \"prod\",\n OPENMELD_HOME: \"\",\n },\n };\n if (\n isOpenMeldManagedBinaryPath(executablePath, productionPaths) ||\n isOpenMeldManagedBinaryPath(resolvedExecutable, productionPaths)\n ) {\n throw new Error(\n \"Cannot start an isolated Service with the installed Production executable. Use openmeld-dev for local development or the official Staging Canary Setup command. OPENMELD_HOME alone does not isolate the Service.\"\n );\n }\n}\n","import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { DaemonServiceController } from \"../../config/daemon-state\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport {\n type OpenMeldPathResolutionInput,\n resolveOpenMeldServiceOwnedPathInput,\n} from \"../../config/paths\";\n\nconst REGISTRATION_REPAIR_STATE_SCHEMA =\n \"openmeld-service-registration-repair-v1\";\nconst REGISTRATION_REPAIR_STATE_FILENAME = \"registration-repair.json\";\n\nexport type DaemonServiceRegistrationRepairState = {\n v: 1;\n schema: typeof REGISTRATION_REPAIR_STATE_SCHEMA;\n controller: DaemonServiceController;\n pendingSince: string;\n};\n\nexport async function readDaemonServiceRegistrationRepairState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceRegistrationRepairState | null> {\n const path = registrationRepairStatePath(pathInput);\n const raw = await readFile(path, \"utf8\").catch((error: unknown) => {\n if (readErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n const parsed = JSON.parse(\n raw\n ) as Partial<DaemonServiceRegistrationRepairState>;\n if (\n parsed.v !== 1 ||\n parsed.schema !== REGISTRATION_REPAIR_STATE_SCHEMA ||\n !isDaemonServiceController(parsed.controller) ||\n typeof parsed.pendingSince !== \"string\" ||\n parsed.pendingSince.length === 0\n ) {\n throw new Error(\"service registration repair state is invalid\");\n }\n return {\n v: 1,\n schema: REGISTRATION_REPAIR_STATE_SCHEMA,\n controller: parsed.controller,\n pendingSince: parsed.pendingSince,\n };\n}\n\nexport async function markDaemonServiceRegistrationRepairPending(\n controller: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const path = registrationRepairStatePath(pathInput);\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n const state: DaemonServiceRegistrationRepairState = {\n v: 1,\n schema: REGISTRATION_REPAIR_STATE_SCHEMA,\n controller,\n pendingSince: new Date().toISOString(),\n };\n await mkdir(dirname(path), { recursive: true });\n try {\n await writeFile(tempPath, `${JSON.stringify(state, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(tempPath, path);\n } catch (writeError) {\n try {\n await rm(tempPath, { force: true });\n } catch (cleanupError) {\n throw new AggregateError(\n [writeError, cleanupError],\n \"service registration repair state write failed and its temporary file could not be removed\"\n );\n }\n throw writeError;\n }\n}\n\nexport async function clearDaemonServiceRegistrationRepairPending(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(registrationRepairStatePath(pathInput), { force: true });\n}\n\nfunction registrationRepairStatePath(\n pathInput: OpenMeldPathResolutionInput\n): string {\n const ownerPathInput = resolveOpenMeldServiceOwnedPathInput(pathInput);\n return join(\n daemonRuntimeStateRootPath(ownerPathInput),\n REGISTRATION_REPAIR_STATE_FILENAME\n );\n}\n\nfunction isDaemonServiceController(\n value: unknown\n): value is DaemonServiceController {\n return (\n value === \"launchd\" ||\n value === \"systemd\" ||\n value === \"windows-service\" ||\n value === \"legacy-detached\" ||\n value === \"unknown\"\n );\n}\n\nfunction readErrorCode(error: unknown): string | null {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return typeof error.code === \"string\" ? error.code : null;\n }\n return null;\n}\n","import {\n resolveDaemonServiceRuntimeMetadata,\n withDaemonServiceRegistrationMutationLock,\n} from \"../../config/daemon-state\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\nimport {\n buildDaemonSystemServiceCommandSpec,\n ensureDaemonSystemServiceCommandFiles,\n} from \"./daemon-service-command-spec\";\nimport type { DaemonServiceManager } from \"./daemon-service-manager\";\nimport { resolveDaemonServiceManager } from \"./daemon-service-manager\";\nimport {\n clearDaemonServiceRegistrationRepairPending,\n markDaemonServiceRegistrationRepairPending,\n readDaemonServiceRegistrationRepairState,\n} from \"./daemon-service-registration-repair-state\";\n\nconst DEFAULT_RECONCILE_INTERVAL_MS = 10 * 60_000;\nconst STATUS_PROBE_TIMEOUT_MS = 10_000;\nconst STOP_SIGNAL_PROBE_TIMEOUT_MS = 2500;\nconst MAX_CONSECUTIVE_REPAIR_FAILURES = 3;\n\nexport type SupervisorRegistrationObservation = {\n installed: boolean;\n running: boolean;\n enabled: boolean;\n};\n\nexport type SupervisorRegistrationReconcileDecision =\n | {\n action: \"repair\";\n reason: \"registration_missing\" | \"repair_incomplete\";\n }\n | {\n action: \"none\";\n reason:\n | \"registration_present\"\n | \"not_supervised\"\n | \"status_unavailable\"\n | \"repair_exhausted\";\n };\n\n/**\n * The OS supervisor registration (launchd plist / systemd unit / Windows\n * service) is the only thing that restarts OpenMeld Service after a crash or\n * an external kill. A supervised daemon therefore treats a missing\n * registration as recoverable drift and re-installs the registration files.\n * It never boots or starts the job — this process already is the job, and a\n * second spawn would race it.\n */\nexport function resolveSupervisorRegistrationReconcileDecision(input: {\n consecutiveRepairFailures: number;\n managedBySystemService: boolean;\n observation: SupervisorRegistrationObservation | null;\n repairPending: boolean;\n}): SupervisorRegistrationReconcileDecision {\n if (!input.managedBySystemService) {\n return { action: \"none\", reason: \"not_supervised\" };\n }\n if (!input.observation) {\n return { action: \"none\", reason: \"status_unavailable\" };\n }\n if (input.observation.installed && input.observation.enabled) {\n return { action: \"none\", reason: \"registration_present\" };\n }\n if (\n input.observation.installed &&\n !(input.repairPending && !input.observation.enabled)\n ) {\n return { action: \"none\", reason: \"registration_present\" };\n }\n if (input.consecutiveRepairFailures >= MAX_CONSECUTIVE_REPAIR_FAILURES) {\n return { action: \"none\", reason: \"repair_exhausted\" };\n }\n if (input.observation.installed) {\n return { action: \"repair\", reason: \"repair_incomplete\" };\n }\n return { action: \"repair\", reason: \"registration_missing\" };\n}\n\nexport function startDaemonServiceRegistrationReconcileLoop(input: {\n intervalMs?: number;\n isStopRequested: () => boolean;\n onWarn?: (message: string, payload?: Record<string, unknown>) => void;\n}): () => Promise<void> {\n let stopped = false;\n let inFlight: Promise<void> | null = null;\n let consecutiveRepairFailures = 0;\n let exhaustionJournaled = false;\n\n const run = () => {\n if (stopped || inFlight || input.isStopRequested()) {\n return;\n }\n inFlight = withDaemonServiceRegistrationMutationLock(\n async () =>\n await reconcileSupervisorRegistrationOnce({\n consecutiveRepairFailures,\n isStopRequested: input.isStopRequested,\n exhaustionJournaled,\n onWarn: input.onWarn,\n }),\n {\n intent: \"upgrade_reconcile\",\n command: \"OpenMeld Service registration reconcile\",\n }\n )\n .then((outcome) => {\n consecutiveRepairFailures = outcome.consecutiveRepairFailures;\n exhaustionJournaled = outcome.exhaustionJournaled;\n })\n .catch((error) => {\n input.onWarn?.(\n `supervisor registration reconcile failed: ${toErrorMessage(error)}`\n );\n })\n .finally(() => {\n inFlight = null;\n });\n };\n\n const timer = setInterval(\n run,\n input.intervalMs ?? DEFAULT_RECONCILE_INTERVAL_MS\n );\n timer.unref();\n return async () => {\n stopped = true;\n clearInterval(timer);\n await inFlight;\n };\n}\n\nasync function reconcileSupervisorRegistrationOnce(input: {\n consecutiveRepairFailures: number;\n exhaustionJournaled: boolean;\n isStopRequested: () => boolean;\n onWarn?: (message: string, payload?: Record<string, unknown>) => void;\n}): Promise<{\n consecutiveRepairFailures: number;\n exhaustionJournaled: boolean;\n}> {\n const unchanged = {\n consecutiveRepairFailures: input.consecutiveRepairFailures,\n exhaustionJournaled: input.exhaustionJournaled,\n };\n const runtimeMetadata = resolveDaemonServiceRuntimeMetadata();\n if (!runtimeMetadata.managedBySystemService) {\n return unchanged;\n }\n const manager = await resolveDaemonServiceManager(\n runtimeMetadata.serviceController ?? undefined\n );\n if (!manager) {\n input.onWarn?.(\n \"supervisor registration manager was unavailable; skipping this reconcile pass\",\n {\n controller: runtimeMetadata.serviceController,\n }\n );\n return unchanged;\n }\n let observationErrorMessage: string | null = null;\n const observation = await observeSupervisorRegistration(\n manager,\n STATUS_PROBE_TIMEOUT_MS,\n (error) => {\n observationErrorMessage = toErrorMessage(error);\n }\n );\n const repairState = await readDaemonServiceRegistrationRepairState();\n if (repairState && repairState.controller !== manager.controller) {\n throw new Error(\n `service registration repair state belongs to ${repairState.controller}, not ${manager.controller}`\n );\n }\n const decision = resolveSupervisorRegistrationReconcileDecision({\n consecutiveRepairFailures: input.consecutiveRepairFailures,\n managedBySystemService: runtimeMetadata.managedBySystemService,\n observation,\n repairPending: repairState !== null,\n });\n\n if (decision.action === \"none\") {\n if (decision.reason === \"registration_present\") {\n if (repairState) {\n await clearDaemonServiceRegistrationRepairPending();\n }\n return {\n consecutiveRepairFailures: 0,\n exhaustionJournaled: false,\n };\n }\n if (decision.reason === \"status_unavailable\") {\n input.onWarn?.(\n \"supervisor registration status probe was unavailable; skipping this reconcile pass\",\n {\n controller: manager.controller,\n errorMessage: observationErrorMessage,\n }\n );\n return unchanged;\n }\n if (decision.reason === \"repair_exhausted\" && !input.exhaustionJournaled) {\n await emitDaemonLifecycleEvent({\n type: \"service_manager.registration_reconcile\",\n result: \"repair_exhausted\",\n metadata: {\n consecutiveRepairFailures: input.consecutiveRepairFailures,\n controller: manager.controller,\n },\n });\n return { ...unchanged, exhaustionJournaled: true };\n }\n return unchanged;\n }\n\n await emitDaemonLifecycleEvent({\n type: \"service_manager.registration_reconcile\",\n result: \"drift_detected\",\n metadata: {\n controller: manager.controller,\n observation: observation\n ? {\n enabled: observation.enabled,\n installed: observation.installed,\n running: observation.running,\n }\n : null,\n },\n });\n\n if (input.isStopRequested()) {\n return unchanged;\n }\n\n try {\n await markDaemonServiceRegistrationRepairPending(manager.controller);\n await ensureDaemonSystemServiceCommandFiles({\n controller: manager.controller,\n });\n await manager.install(\n buildDaemonSystemServiceCommandSpec({ controller: manager.controller })\n );\n await clearDaemonServiceRegistrationRepairPending();\n await emitDaemonLifecycleEvent({\n type: \"service_manager.registration_reconcile\",\n result: \"repaired\",\n metadata: { controller: manager.controller },\n });\n return {\n consecutiveRepairFailures: 0,\n exhaustionJournaled: false,\n };\n } catch (error) {\n const nextFailures = input.consecutiveRepairFailures + 1;\n await emitDaemonLifecycleEvent({\n type: \"service_manager.registration_reconcile\",\n result: \"repair_failed\",\n metadata: {\n consecutiveRepairFailures: nextFailures,\n controller: manager.controller,\n errorMessage: toErrorMessage(error),\n errorMessages: collectErrorMessages(error),\n },\n });\n return {\n consecutiveRepairFailures: nextFailures,\n exhaustionJournaled: false,\n };\n }\n}\n\nexport async function observeSupervisorRegistration(\n manager: DaemonServiceManager,\n timeoutMs: number = STATUS_PROBE_TIMEOUT_MS,\n onError?: (error: unknown) => void\n): Promise<SupervisorRegistrationObservation | null> {\n try {\n const status = await withProbeTimeout(manager.status(), timeoutMs);\n return {\n enabled: status.enabled,\n installed: status.installed,\n running: status.running,\n };\n } catch (error) {\n onError?.(error);\n return null;\n }\n}\n\n/**\n * Fire-and-forget stop-signal evidence. An external `launchctl bootout` or\n * uninstall delivers a plain SIGTERM and leaves no trace in this lane's\n * journal, so the daemon snapshots its own supervisor registration while\n * shutting down: a missing registration in this event is the durable proof\n * that the supervisor was torn down externally. Never blocks shutdown.\n */\nexport function journalDaemonStopSignalEvidence(\n signal: \"SIGINT\" | \"SIGTERM\",\n input: {\n onWarn?: (message: string, payload?: Record<string, unknown>) => void;\n } = {}\n): void {\n collectDaemonStopSignalEvidence(signal).catch((error) => {\n input.onWarn?.(\"stop-signal supervisor evidence collection failed\", {\n errorMessage: toErrorMessage(error),\n signal,\n });\n });\n}\n\nasync function collectDaemonStopSignalEvidence(\n signal: \"SIGINT\" | \"SIGTERM\"\n): Promise<void> {\n const runtimeMetadata = resolveDaemonServiceRuntimeMetadata();\n let supervisorRegistrationError: string | null = null;\n let manager: DaemonServiceManager | null = null;\n if (runtimeMetadata.managedBySystemService) {\n try {\n manager = await resolveDaemonServiceManager(\n runtimeMetadata.serviceController ?? undefined\n );\n } catch (error) {\n supervisorRegistrationError = toErrorMessage(error);\n }\n }\n const observation = manager\n ? await observeSupervisorRegistration(\n manager,\n STOP_SIGNAL_PROBE_TIMEOUT_MS,\n (error) => {\n supervisorRegistrationError = toErrorMessage(error);\n }\n )\n : null;\n await emitDaemonLifecycleEvent({\n type: \"stop.signal.observed\",\n result: \"observed\",\n metadata: {\n controller: manager?.controller ?? null,\n managedBySystemService: runtimeMetadata.managedBySystemService,\n signal,\n supervisorRegistration: observation\n ? {\n enabled: observation.enabled,\n installed: observation.installed,\n running: observation.running,\n }\n : null,\n supervisorRegistrationError,\n },\n });\n}\n\nasync function withProbeTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number\n): Promise<T> {\n let timer: NodeJS.Timeout | null = null;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(\"supervisor registration status probe timed out\"));\n }, timeoutMs);\n timer.unref();\n }),\n ]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction collectErrorMessages(error: unknown): string[] {\n const messages: string[] = [];\n const visited = new Set<unknown>();\n const visit = (value: unknown): void => {\n if (visited.has(value)) {\n return;\n }\n visited.add(value);\n messages.push(toErrorMessage(value));\n if (value instanceof AggregateError) {\n for (const nestedError of value.errors) {\n visit(nestedError);\n }\n }\n if (value instanceof Error && value.cause !== undefined) {\n visit(value.cause);\n }\n };\n visit(error);\n return [...new Set(messages)];\n}\n","import { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport { createServiceConnectionEvidenceApi } from \"@openmeld/api-client\";\nimport {\n serviceConnectionEvidenceEventSchema,\n serviceConnectionEvidenceJournalSchema,\n} from \"@openmeld/schemas\";\nimport type {\n ServiceConnectionEvidenceEvent,\n ServiceConnectionEvidenceJournal,\n ServiceConnectionIncident,\n ServiceConnectionIncidentReceipt,\n ServiceConnectionIncidentReport,\n} from \"@openmeld/schemas/types\";\nimport {\n readDaemonLocalStateFile,\n writeDaemonLocalStateFile,\n} from \"../../config/daemon-local-state-file\";\nimport { daemonRuntimeStateRootPath } from \"../../config/daemon-state\";\nimport { createCliApiClientFoundation } from \"../../space/api-client-foundation\";\nimport { WebSocketConnectionError } from \"../../transport/ws\";\n\nconst LOCAL_RETENTION_MS = 7 * 24 * 60 * 60_000;\nconst MAX_JOURNAL_BYTES = 1024 * 1024;\nconst MAX_PENDING_EVENT_WRITES = 128;\n\n// A bounded diagnostic journal derived from carrier events. It cannot change\n// transport state, retry policy, readiness, credentials, or execution ownership.\nexport function createServiceConnectionEvidenceRecorder(input: {\n ownerUserId: string;\n gatewayUrl: string;\n identity: Pick<\n ServiceConnectionIncident,\n \"deviceId\" | \"runtimeLane\" | \"serviceSessionId\" | \"serviceVersion\"\n >;\n sendIncident?: (\n report: ServiceConnectionIncidentReport\n ) => Promise<ServiceConnectionIncidentReceipt>;\n}) {\n const ownerKey = createHash(\"sha256\").update(input.ownerUserId).digest(\"hex\");\n const path = join(\n daemonRuntimeStateRootPath(),\n `connection-evidence-${ownerKey}.json`\n );\n const send =\n input.sendIncident ??\n createServiceConnectionEvidenceApi(\n createCliApiClientFoundation(input.gatewayUrl, {\n expectedOwnerUserId: input.ownerUserId,\n })\n ).report;\n let journal: ServiceConnectionEvidenceJournal | null = null;\n let writes: Promise<void> = Promise.resolve();\n let prelude: ServiceConnectionEvidenceEvent[] = [];\n let online = false;\n let disposed = false;\n let uploading = false;\n let failureCount = 0;\n let uploadTimer: ReturnType<typeof setTimeout> | null = null;\n let pendingEventWrites = 0;\n const truncatedRecoveryIds = new Set<string>();\n let writeFailureReported = false;\n\n function mutate(update: (state: ServiceConnectionEvidenceJournal) => void) {\n writes = writes\n .then(async () => {\n journal ??= (await readDaemonLocalStateFile({\n path,\n schema: serviceConnectionEvidenceJournalSchema,\n })) ?? { v: 1, entries: [] };\n update(journal);\n journal.entries = journal.entries.filter(\n (entry) => entry.incident.endedAtMs >= Date.now() - LOCAL_RETENTION_MS\n );\n while (\n journal.entries.length > 32 ||\n Buffer.byteLength(JSON.stringify(journal, null, 2), \"utf8\") + 1 >\n MAX_JOURNAL_BYTES\n ) {\n journal.entries.shift();\n }\n await writeDaemonLocalStateFile({\n path,\n value: journal,\n schema: serviceConnectionEvidenceJournalSchema,\n mode: 0o600,\n });\n writeFailureReported = false;\n })\n .catch(() => {\n // Diagnostics never interrupt heartbeat or recover credentials themselves.\n if (!writeFailureReported) {\n writeFailureReported = true;\n console.warn(\n \"[openmeld:connection-evidence] Local connection history could not be saved.\"\n );\n }\n });\n return writes;\n }\n\n function scheduleUpload(delayMs = 0) {\n if (disposed || !online || uploading || uploadTimer) {\n return;\n }\n uploadTimer = setTimeout(() => {\n uploadTimer = null;\n uploadPending().catch(() => undefined);\n }, delayMs);\n uploadTimer.unref();\n }\n\n async function uploadPending() {\n if (!online || disposed || uploading) {\n return;\n }\n uploading = true;\n try {\n await mutate(() => undefined);\n const entry = journal?.entries.find(\n (item) =>\n item.uploadedAtMs === null &&\n (item.incident.outcome === \"recovered\" ||\n item.incident.serviceSessionId !== input.identity.serviceSessionId)\n );\n if (!entry) {\n return;\n }\n const receipt = await send({\n uploaderServiceSessionId: input.identity.serviceSessionId,\n incident: entry.incident,\n });\n if (receipt.incidentId !== entry.incident.incidentId) {\n throw new Error(\"connection_incident_receipt_mismatch\");\n }\n await mutate((state) => {\n const saved = state.entries.find(\n (item) => item.incident.incidentId === receipt.incidentId\n );\n if (saved) {\n saved.uploadedAtMs = receipt.receivedAtMs;\n }\n });\n failureCount = 0;\n } catch {\n failureCount += 1;\n } finally {\n uploading = false;\n if (\n journal?.entries.some(\n (item) =>\n item.uploadedAtMs === null &&\n (item.incident.outcome === \"recovered\" ||\n item.incident.serviceSessionId !==\n input.identity.serviceSessionId)\n )\n ) {\n scheduleUpload(\n failureCount\n ? Math.min(15 * 60_000, 30_000 * 2 ** Math.min(failureCount - 1, 5))\n : 1000\n );\n }\n }\n }\n\n function record(inputEvent: {\n recovery: { recoveryId: string; disconnectedAt: number } | null;\n event: ServiceConnectionEvidenceEvent;\n }): void {\n if (disposed) {\n return;\n }\n const parsed = serviceConnectionEvidenceEventSchema.safeParse(\n inputEvent.event\n );\n if (!parsed.success) {\n return;\n }\n const event = parsed.data;\n if (!inputEvent.recovery) {\n prelude = [...prelude, event]\n .filter((item) => item.lastAtMs >= event.lastAtMs - 5 * 60_000)\n .slice(-10);\n return;\n }\n const recovery = inputEvent.recovery;\n // A stalled filesystem must not turn diagnostic promises into an unbounded\n // in-memory queue. The persisted incident explicitly records lost detail.\n if (pendingEventWrites >= MAX_PENDING_EVENT_WRITES) {\n if (truncatedRecoveryIds.size < 32) {\n truncatedRecoveryIds.add(recovery.recoveryId);\n }\n return;\n }\n const precedingEvents = prelude;\n prelude = [];\n pendingEventWrites += 1;\n mutate((state) => {\n let entry = state.entries.find(\n (item) => item.incident.incidentId === recovery.recoveryId\n );\n if (!entry) {\n entry = {\n uploadedAtMs: null,\n incident: {\n v: 1,\n ...input.identity,\n incidentId: recovery.recoveryId,\n startedAtMs: recovery.disconnectedAt,\n endedAtMs: Math.max(recovery.disconnectedAt, event.lastAtMs),\n outcome: \"interrupted\",\n evidenceTruncated: false,\n events: precedingEvents,\n },\n };\n state.entries.push(entry);\n }\n const incident = entry.incident;\n if (truncatedRecoveryIds.delete(recovery.recoveryId)) {\n incident.evidenceTruncated = true;\n }\n appendEvent(incident, event);\n incident.endedAtMs = Math.max(incident.endedAtMs, event.lastAtMs);\n if (event.kind === \"registered\" && event.reason === \"recovered\") {\n incident.outcome = \"recovered\";\n }\n })\n .then(() => scheduleUpload())\n .finally(() => {\n pendingEventWrites -= 1;\n })\n .catch(() => undefined);\n }\n\n return {\n record,\n setOnline(value: boolean) {\n if (online === value) {\n return;\n }\n online = value;\n if (uploadTimer) {\n clearTimeout(uploadTimer);\n uploadTimer = null;\n }\n if (value) {\n scheduleUpload();\n }\n },\n flush: () => writes,\n dispose() {\n disposed = true;\n online = false;\n if (uploadTimer) {\n clearTimeout(uploadTimer);\n uploadTimer = null;\n }\n },\n };\n}\n\nfunction appendEvent(\n incident: ServiceConnectionIncident,\n event: ServiceConnectionEvidenceEvent\n) {\n const previous = incident.events.at(-1);\n if (\n previous &&\n previous.kind === event.kind &&\n previous.reason === event.reason &&\n previous.phase === event.phase &&\n previous.connectionId === event.connectionId &&\n previous.nativeErrorCode === event.nativeErrorCode &&\n previous.closeCode === event.closeCode\n ) {\n incident.events[incident.events.length - 1] = {\n ...event,\n firstAtMs: previous.firstAtMs,\n count: Math.min(10_000_000, previous.count + event.count),\n };\n } else {\n incident.events.push(event);\n }\n if (incident.events.length > 100) {\n incident.events.splice(10, incident.events.length - 100);\n incident.evidenceTruncated = true;\n }\n}\n\nexport function readServiceConnectionFailureEvidence(\n error: unknown\n): Pick<\n ServiceConnectionEvidenceEvent,\n \"reason\" | \"nativeErrorCode\" | \"requestId\"\n> {\n const code =\n typeof error === \"object\" && error !== null && \"code\" in error\n ? error.code\n : undefined;\n const nativeCode =\n serviceConnectionEvidenceEventSchema.shape.nativeErrorCode.safeParse(code);\n const requestId =\n serviceConnectionEvidenceEventSchema.shape.requestId.safeParse(\n error instanceof WebSocketConnectionError ? error.requestId : undefined\n );\n let reason: ServiceConnectionEvidenceEvent[\"reason\"] = \"unknown\";\n if (error instanceof WebSocketConnectionError) {\n if (error.kind === \"open_timeout\") {\n reason = \"open_timeout\";\n } else if (error.kind === \"closed_before_open\") {\n reason = \"socket_closed\";\n } else if (error.status === 401) {\n reason = \"auth_rejected\";\n }\n }\n return {\n reason,\n ...(nativeCode.success && nativeCode.data\n ? { nativeErrorCode: nativeCode.data }\n : {}),\n ...(requestId.success && requestId.data\n ? { requestId: requestId.data }\n : {}),\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { ServiceConnectionEvidenceEvent } from \"@openmeld/schemas/types\";\nimport type { WsClient } from \"../../transport/ws\";\nimport {\n createServiceConnectionEvidenceRecorder,\n readServiceConnectionFailureEvidence,\n} from \"./service-connection-evidence\";\n\nexport function createServiceConnectionEvidenceObserver(\n input: Parameters<typeof createServiceConnectionEvidenceRecorder>[0] & {\n getRecovery: () => { recoveryId: string; disconnectedAt: number } | null;\n isStopping: () => boolean;\n }\n) {\n const recorder = createServiceConnectionEvidenceRecorder(input);\n let connectionId = randomUUID();\n let phase: ServiceConnectionEvidenceEvent[\"phase\"] = \"credentials\";\n let lastHeartbeatAckAtMs: number | undefined;\n let attemptStartedAtMs = Date.now();\n let retryDueAtMs: number | undefined;\n const record = (\n event: Omit<\n ServiceConnectionEvidenceEvent,\n \"connectionId\" | \"firstAtMs\" | \"lastAtMs\" | \"count\" | \"phase\"\n >\n ) => {\n const atMs = Date.now();\n recorder.record({\n recovery: input.getRecovery(),\n event: {\n ...event,\n connectionId,\n phase,\n firstAtMs: atMs,\n lastAtMs: atMs,\n count: 1,\n ...(lastHeartbeatAckAtMs === undefined ? {} : { lastHeartbeatAckAtMs }),\n },\n });\n };\n return {\n get connectionDiagnosticId() {\n return connectionId;\n },\n beginAttempt() {\n connectionId = randomUUID();\n phase = \"credentials\";\n attemptStartedAtMs = Date.now();\n record({\n kind: \"connecting\",\n reason: \"unknown\",\n ...(retryDueAtMs === undefined\n ? {}\n : {\n eventLoopDelayMs: Math.max(0, attemptStartedAtMs - retryDueAtMs),\n }),\n });\n retryDueAtMs = undefined;\n },\n opening() {\n phase = \"opening\";\n },\n opened(socket: WsClient) {\n phase = \"registering\";\n record({ kind: \"transport_open\", reason: \"unknown\" });\n const openedId = connectionId;\n socket.onClose((closeCode) => {\n if (openedId === connectionId) {\n record({\n kind: \"disconnected\",\n reason: input.isStopping() ? \"stopped\" : \"socket_closed\",\n closeCode,\n });\n }\n });\n },\n acknowledged(heartbeatAt: string, transitioned: boolean) {\n const timestamp = Date.parse(heartbeatAt);\n if (Number.isFinite(timestamp)) {\n lastHeartbeatAckAtMs = timestamp;\n }\n phase = \"online\";\n if (transitioned) {\n record({\n kind: \"registered\",\n reason: \"recovered\",\n durationMs: Math.max(\n 0,\n Date.now() -\n (input.getRecovery()?.disconnectedAt ?? attemptStartedAtMs)\n ),\n });\n }\n recorder.setOnline(true);\n },\n retry(error: unknown, connectionReason: string | null, backoffMs: number) {\n recorder.setOnline(false);\n const evidence = readServiceConnectionFailureEvidence(error);\n const reason =\n connectionReason === \"auth_unavailable\" ||\n connectionReason === \"auth_rejected\"\n ? connectionReason\n : evidence.reason;\n record({\n kind: \"disconnected\",\n ...evidence,\n reason,\n durationMs: Math.max(0, Date.now() - attemptStartedAtMs),\n });\n phase = \"waiting\";\n retryDueAtMs = Date.now() + backoffMs;\n record({ kind: \"retry_scheduled\", reason, retryAtMs: retryDueAtMs });\n },\n credential(reason: ServiceConnectionEvidenceEvent[\"reason\"]) {\n record({ kind: \"credential_cache\", reason });\n },\n dispose: recorder.dispose,\n };\n}\n","export type RuntimeReportingAuthenticationFailure = {\n credentialFingerprint?: string;\n message: string;\n reasonCode: string;\n};\n\nexport type RuntimeReportingAuthenticationRecoveryResult =\n | { status: \"requested\" }\n | { status: \"debounced\"; retryAfterMs: number };\n\nconst AUTHENTICATION_RECOVERY_COOLDOWN_MS = 5 * 60_000;\n\nexport function createRuntimeReportingAuthenticationRecovery(input: {\n now?: () => number;\n requestCarrierHandshake: (\n failure: RuntimeReportingAuthenticationFailure\n ) => Promise<void> | void;\n}): (\n failure: RuntimeReportingAuthenticationFailure\n) => Promise<RuntimeReportingAuthenticationRecoveryResult> {\n let lastRecoveryAttemptAtMs: number | null = null;\n const now = input.now ?? Date.now;\n\n return async (failure) => {\n const nowMs = now();\n if (lastRecoveryAttemptAtMs !== null) {\n const retryAfterMs = Math.max(\n 0,\n AUTHENTICATION_RECOVERY_COOLDOWN_MS - (nowMs - lastRecoveryAttemptAtMs)\n );\n if (retryAfterMs > 0) {\n return { retryAfterMs, status: \"debounced\" };\n }\n }\n\n lastRecoveryAttemptAtMs = nowMs;\n await input.requestCarrierHandshake(failure);\n return { status: \"requested\" };\n };\n}\n","import {\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_STATE_SCHEMA,\n type DaemonRunMode,\n type DaemonServiceController,\n type DaemonServiceRuntimeMetadata,\n} from \"../../config/daemon-state\";\nimport {\n DEFAULT_RECONNECT_DELAY_MS,\n MAX_RECONNECT_DELAY_MS,\n RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS,\n} from \"../core/constants\";\nimport { normalizeText } from \"../core/logger\";\nimport type { ServiceConnectionDegradedReason } from \"./service-connection-state\";\n\nconst AUTHENTICATION_REQUIRED_RECONNECT_MAX_DELAY_MS = 15 * 60 * 1000;\nconst AUTHENTICATION_REQUIRED_RECONNECT_DELAYS_MS = [\n 60_000,\n 5 * 60_000,\n AUTHENTICATION_REQUIRED_RECONNECT_MAX_DELAY_MS,\n] as const;\n\nexport function resolveDaemonRunMode(\n inputMode: DaemonRunMode | undefined\n): DaemonRunMode {\n if (process.env[DAEMON_SERVICE_RUNTIME_DETACHED_ENV] === \"1\") {\n return \"background\";\n }\n\n const envMode = parseDaemonRunMode(\n process.env[DAEMON_SERVICE_RUNTIME_MODE_ENV]\n );\n if (envMode) {\n return envMode;\n }\n if (inputMode === \"foreground\") {\n return \"foreground\";\n }\n return \"background\";\n}\n\nexport function parseDaemonRunMode(value: unknown): DaemonRunMode | null {\n const normalized = normalizeText(value).toLowerCase();\n if (normalized === \"foreground\" || normalized === \"background\") {\n return normalized;\n }\n return null;\n}\n\nexport function shouldPersistDaemonRuntimeState(input: {\n forcePersist: boolean;\n lastPersistedAtMs: number;\n nowMs: number;\n updates: Partial<{\n heartbeatAt: string | null;\n updatedAt: string;\n stopRequestedAt: string | null;\n }>;\n}): boolean {\n if (input.forcePersist) {\n return true;\n }\n if (\"stopRequestedAt\" in input.updates) {\n return true;\n }\n return (\n input.nowMs - input.lastPersistedAtMs >=\n RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS\n );\n}\n\nexport function resolveReconnectBackoffMs(attempt: number): number {\n const normalizedAttempt = Math.max(1, attempt);\n const next = DEFAULT_RECONNECT_DELAY_MS * 2 ** (normalizedAttempt - 1);\n return Math.min(MAX_RECONNECT_DELAY_MS, next);\n}\n\nexport function resolveServiceConnectionReconnectBackoffMs(input: {\n attempt: number;\n reason: ServiceConnectionDegradedReason | null;\n}): number {\n if (input.reason !== \"auth_rejected\") {\n return resolveReconnectBackoffMs(input.attempt);\n }\n const index = Math.max(0, input.attempt - 1);\n return (\n AUTHENTICATION_REQUIRED_RECONNECT_DELAYS_MS[index] ??\n AUTHENTICATION_REQUIRED_RECONNECT_DELAYS_MS.at(-1) ??\n AUTHENTICATION_REQUIRED_RECONNECT_MAX_DELAY_MS\n );\n}\n\nexport function toDaemonStreamUrl(baseUrl: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/v1/daemon/stream\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nexport function buildDaemonProcessCommand(): string {\n const script = normalizeText(process.argv[1]);\n const args = process.argv.slice(2);\n const values = script ? [script, ...args] : args;\n if (values.length === 0) {\n return process.execPath;\n }\n return `${process.execPath} ${values.join(\" \")}`;\n}\n\nexport function createDaemonRuntimeState(input: {\n command: string;\n gatewayUrl: string | null;\n heartbeatAt: string | null;\n mode: DaemonRunMode;\n pid: number;\n openMeldProfileId: string | null;\n workingDirectory: string | null;\n runtimeMetadata: DaemonServiceRuntimeMetadata;\n startedAt: string;\n stopRequestedAt: string | null;\n updatedAt: string;\n}): {\n command: string;\n gatewayUrl: string | null;\n heartbeatAt: string | null;\n mode: DaemonRunMode;\n pid: number;\n openMeldProfileId: string | null;\n workingDirectory: string | null;\n startedAt: string;\n stopRequestedAt: string | null;\n status: \"running\";\n v: 1;\n schema: typeof DAEMON_SERVICE_RUNTIME_STATE_SCHEMA;\n updatedAt: string;\n managedBySystemService: boolean;\n serviceController: DaemonServiceController;\n autoStart: boolean;\n} {\n return {\n v: 1,\n schema: DAEMON_SERVICE_RUNTIME_STATE_SCHEMA,\n status: \"running\",\n mode: input.mode,\n pid: input.pid,\n command: input.command,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n workingDirectory: input.workingDirectory,\n stopRequestedAt: input.stopRequestedAt,\n startedAt: input.startedAt,\n updatedAt: input.updatedAt,\n heartbeatAt: input.heartbeatAt,\n managedBySystemService: input.runtimeMetadata.managedBySystemService,\n serviceController: input.runtimeMetadata.serviceController,\n autoStart: input.runtimeMetadata.autoStart,\n };\n}\n","import { writeDaemonRuntimeLease } from \"../../config/daemon-runtime-lease\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { setDaemonServiceRuntimeState } from \"../../config/daemon-state\";\nimport {\n readDaemonActiveBundleState,\n resolveDaemonBundleEntryPathFromState,\n} from \"../../local-service/lifecycle/daemon-service-bundle\";\nimport {\n extractDaemonCommandEntryPath,\n resolveDaemonBundleIdFromEntryPath,\n} from \"../../local-service/lifecycle/daemon-service-command-path\";\nimport { nowIsoString } from \"../core/logger\";\nimport {\n type createDaemonRuntimeState,\n shouldPersistDaemonRuntimeState,\n} from \"./daemon-runtime-state\";\n\nexport type DaemonRuntimeState = ReturnType<typeof createDaemonRuntimeState>;\n\nexport type DaemonRuntimeLeaseDescriptor = {\n bundleId: string;\n generation: number;\n};\n\nexport type DaemonRuntimeStateTouch = (\n updates: Partial<{\n heartbeatAt: string | null;\n updatedAt: string;\n stopRequestedAt: string | null;\n }>,\n options?: {\n forcePersist?: boolean;\n }\n) => Promise<void>;\n\nexport function createDaemonRuntimeStateTracker(input: {\n initialState: DaemonRuntimeState;\n leaseDescriptor: DaemonRuntimeLeaseDescriptor | null;\n}): {\n getRuntimeState: () => DaemonRuntimeState;\n touchRuntimeState: DaemonRuntimeStateTouch;\n} {\n // OPENMELD_SERVICE_THIN_CORE: local runtime state projection.\n // This writes the local service status/lease projection. It is diagnostic\n // evidence for this computer, not product readiness or Wake outcome truth.\n let runtimeState = input.initialState;\n let lastRuntimeStatePersistAtMs = Date.now();\n\n const touchRuntimeState: DaemonRuntimeStateTouch = async (\n updates,\n options\n ) => {\n const nowAt = nowIsoString();\n const previousHeartbeatAt = runtimeState.heartbeatAt;\n runtimeState = {\n ...runtimeState,\n ...updates,\n updatedAt: updates.updatedAt ?? nowAt,\n };\n const receivedFirstHeartbeat =\n previousHeartbeatAt === null &&\n typeof updates.heartbeatAt === \"string\" &&\n updates.heartbeatAt.length > 0;\n const shouldPersist = shouldPersistDaemonRuntimeState({\n forcePersist: options?.forcePersist === true || receivedFirstHeartbeat,\n nowMs: Date.now(),\n lastPersistedAtMs: lastRuntimeStatePersistAtMs,\n updates,\n });\n if (!shouldPersist) {\n return;\n }\n await setDaemonServiceRuntimeState(runtimeState);\n if (input.leaseDescriptor) {\n await writeDaemonRuntimeLease(\n buildDaemonRuntimeLease({\n descriptor: input.leaseDescriptor,\n runtimeState,\n })\n );\n }\n lastRuntimeStatePersistAtMs = Date.now();\n };\n\n return {\n getRuntimeState: () => runtimeState,\n touchRuntimeState,\n };\n}\n\nexport async function resolveDaemonRuntimeLeaseDescriptor(input: {\n command: string;\n}): Promise<DaemonRuntimeLeaseDescriptor | null> {\n const [contract, activeBundle] = await Promise.all([\n readDaemonServiceContract().catch(() => null),\n readDaemonActiveBundleState().catch(() => null),\n ]);\n if (contract) {\n return {\n generation: contract.generation,\n bundleId: contract.bundleId,\n };\n }\n const activeBundleEntryPath = await resolveDaemonBundleEntryPathFromState(\n activeBundle\n ).catch(() => null);\n const commandEntryPath = extractDaemonCommandEntryPath(input.command);\n const bundleId =\n (commandEntryPath\n ? resolveDaemonBundleIdFromEntryPath(commandEntryPath)\n : null) ??\n (activeBundleEntryPath\n ? resolveDaemonBundleIdFromEntryPath(activeBundleEntryPath)\n : null) ??\n activeBundle?.bundleId ??\n null;\n if (!bundleId) {\n return null;\n }\n return {\n generation: 0,\n bundleId,\n };\n}\n\nexport function buildDaemonRuntimeLease(input: {\n descriptor: DaemonRuntimeLeaseDescriptor;\n runtimeState: DaemonRuntimeState;\n}) {\n return {\n schema: \"openmeld-daemon-runtime-lease-v1\",\n v: 1,\n generation: input.descriptor.generation,\n bundleId: input.descriptor.bundleId,\n pid: input.runtimeState.pid,\n mode: input.runtimeState.mode,\n startedAt: input.runtimeState.startedAt,\n updatedAt: input.runtimeState.updatedAt,\n heartbeatAt: input.runtimeState.heartbeatAt,\n serviceController: input.runtimeState.serviceController,\n managedBySystemService: input.runtimeState.managedBySystemService,\n } as const;\n}\n","// Local service connection state machine (facts.md fact #4: the service's\n// self-description). One source for \"is this service actually carrying its\n// cloud connection right now, and if not, why\" — consumed by the local\n// control plane health payload and transition-logged exactly once per change\n// so failures are visible without log spam.\n\nexport type ServiceConnectionStateName =\n | \"starting\"\n | \"connecting\"\n | \"authentication_required\"\n | \"online\"\n | \"degraded\"\n | \"stopping\";\n\nexport type ServiceConnectionAuthState =\n | \"missing\"\n | \"valid\"\n | \"expired\"\n | \"invalid\"\n | \"revoked\";\n\nexport type ServiceConnectionDegradedReason =\n | \"auth_rejected\"\n | \"auth_unavailable\"\n | \"network_unreachable\"\n | \"internal\";\n\nexport type ServiceConnectionState = {\n state: ServiceConnectionStateName;\n reason: ServiceConnectionDegradedReason | \"reconnecting\" | null;\n detail: string | null;\n authState: ServiceConnectionAuthState | null;\n updatedAt: string;\n};\n\nexport type ServiceConnectionStateTracker = {\n get: () => ServiceConnectionState;\n set: (\n state: ServiceConnectionStateName,\n options?: {\n reason?: ServiceConnectionState[\"reason\"];\n detail?: string | null;\n authState?: ServiceConnectionAuthState | null;\n }\n ) => void;\n};\n\nconst DAEMON_STREAM_UPGRADE_REJECTION_STATUS_PATTERN =\n /daemon stream upgrade rejected \\(status=(\\d+)/;\n\nexport function createServiceConnectionStateTracker(input?: {\n onTransition?: (next: ServiceConnectionState) => void;\n}): ServiceConnectionStateTracker {\n let current: ServiceConnectionState = {\n state: \"starting\",\n reason: null,\n detail: null,\n authState: null,\n updatedAt: new Date().toISOString(),\n };\n\n return {\n get: () => current,\n set: (state, options) => {\n const reason = options?.reason ?? null;\n const detail = options?.detail ?? null;\n const authState = options?.authState ?? null;\n if (\n current.state === state &&\n current.reason === reason &&\n current.detail === detail &&\n current.authState === authState\n ) {\n return;\n }\n current = {\n state,\n reason,\n detail,\n authState,\n updatedAt: new Date().toISOString(),\n };\n input?.onTransition?.(current);\n },\n };\n}\n\n// Map a connect/session failure to a degraded reason. Conservative: only\n// claim auth when the evidence says auth; everything network-shaped is\n// network_unreachable; the rest is internal (with detail preserved).\nexport function classifyConnectionFailureReason(\n message: string\n): ServiceConnectionDegradedReason {\n const lowered = message.toLowerCase();\n const upgradeRejectionStatus =\n readDaemonStreamUpgradeRejectionStatus(lowered);\n if (upgradeRejectionStatus !== null) {\n return upgradeRejectionStatus === 401 ? \"auth_rejected\" : \"internal\";\n }\n if (\n lowered.includes(\"fetch failed\") ||\n lowered.includes(\"timed out\") ||\n lowered.includes(\"timeout\") ||\n lowered.includes(\"econn\") ||\n lowered.includes(\"enotfound\") ||\n lowered.includes(\"socket\") ||\n lowered.includes(\"network\")\n ) {\n return \"network_unreachable\";\n }\n return \"internal\";\n}\n\nfunction readDaemonStreamUpgradeRejectionStatus(\n message: string\n): number | null {\n const match = DAEMON_STREAM_UPGRADE_REJECTION_STATUS_PATTERN.exec(message);\n if (!match) {\n return null;\n }\n return Number.parseInt(match[1] ?? \"\", 10);\n}\n\nexport function toHealthProjection(state: ServiceConnectionState): {\n state: \"ok\" | \"degraded\";\n runtimeState: \"healthy\" | \"suspect\" | \"idle\";\n reasonCode: string;\n} {\n if (state.state === \"online\") {\n return { state: \"ok\", runtimeState: \"healthy\", reasonCode: \"ok\" };\n }\n if (state.state === \"stopping\") {\n return { state: \"degraded\", runtimeState: \"idle\", reasonCode: \"stopping\" };\n }\n if (state.state === \"authentication_required\") {\n return {\n state: \"degraded\",\n runtimeState: \"suspect\",\n reasonCode: \"authentication_required\",\n };\n }\n return {\n state: \"degraded\",\n runtimeState: \"suspect\",\n reasonCode: state.reason ?? state.state,\n };\n}\n","import type { LocalDaemonAdapterContainer } from \"@openmeld/local-service\";\nimport type {\n DaemonRuntimeAdapterCapabilitySnapshot,\n LocalComponentsStatus,\n RuntimeTransportBaseCapabilities,\n} from \"@openmeld/schemas/types\";\nimport { resolveRegistryRuntimeAdapterCapabilitySnapshot } from \"../../agents/registry-source\";\n\nexport function resolveDaemonCapabilities(input: {\n localAdapterContainer: LocalDaemonAdapterContainer;\n localComponentsStatus?: LocalComponentsStatus | null;\n profileConfigurationRevision?: boolean;\n}): RuntimeTransportBaseCapabilities {\n return resolveDaemonCapabilitiesFromAdapterIds({\n ...input,\n adapterIds: input.localAdapterContainer\n .listAdapters()\n .map((entry) => entry.adapterId),\n });\n}\n\nexport function resolveDaemonCapabilitiesFromAdapterIds(input: {\n adapterIds: readonly string[];\n localComponentsStatus?: LocalComponentsStatus | null;\n profileConfigurationRevision?: boolean;\n}): RuntimeTransportBaseCapabilities {\n const runtimeAdapters = input.adapterIds\n .map(resolveRegistryRuntimeAdapterCapabilitySnapshot)\n .filter(\n (entry): entry is DaemonRuntimeAdapterCapabilitySnapshot => entry !== null\n )\n .sort((left, right) => left.adapterId.localeCompare(right.adapterId));\n\n return {\n agentReplyContextReview: true,\n informationProtectionPrompt: true,\n workingLanguagePrompt: true,\n localAgentInteraction: true,\n ...(input.profileConfigurationRevision === true\n ? { profileConfigurationRevision: true as const }\n : {}),\n ...(input.localComponentsStatus\n ? { localComponents: input.localComponentsStatus }\n : {}),\n openMeldToolsControl: {\n requestAutomaticUpdate: true,\n requestUpdate: true,\n setAutomaticUpdates: true,\n },\n localAgentControl: {\n cancel: true,\n forkSession: true,\n interrupt: true,\n manageInstallations: true,\n manageInstallationsSafely: true,\n refreshCatalog: true,\n resumeControllerConversation: true,\n setEnabled: true,\n setProfileWorkspace: true,\n },\n localProjectControl: {\n connectCandidate: true,\n connectDeclaredPath: true,\n discoverProjects: true,\n readConnections: true,\n moveConnection: true,\n removeConnection: true,\n removeMissingConnections: true,\n setDefaultConnection: true,\n },\n ...(runtimeAdapters.length > 0 ? { runtimeAdapters } : {}),\n };\n}\n","import {\n RUNTIME_TRANSPORT_SCHEMA_VERSION,\n type ServiceExecutionHostOutput,\n serviceExecutionHostMethods,\n} from \"@openmeld/schemas\";\nimport type { RuntimeTransportLease } from \"@openmeld/schemas/types\";\nimport { warnDaemonEvent } from \"../core/logger\";\nimport type { DaemonFrameSink, ParsedDaemonFrame } from \"../core/types\";\nimport type { RuntimeReportingAuthenticationFailure } from \"../reporting/runtime-reporting-auth-recovery\";\nimport { ExecutionHostError } from \"./channel\";\nimport type { ExecutionHostPort } from \"./port\";\n\n// Connection-local forwarding and observation only. Accepted work, approval\n// state and result receipts remain in the one process-lifetime Host.\nexport function createExecutionHostSocketLink(input: {\n host: ExecutionHostPort;\n socket: DaemonFrameSink;\n onAdmissionChanged(): void;\n onInvalidation(scope: \"routes\" | \"activity\" | \"execution\"): void;\n onAuthenticationFailure(failure: RuntimeReportingAuthenticationFailure): void;\n onError(error: unknown): void;\n}) {\n let generation: number | null = null;\n let bound = false;\n let closed = false;\n let observed: ServiceExecutionHostOutput<\"health\"> | null = null;\n let observation: Promise<void> | null = null;\n let observationDirty = false;\n let configuration: Promise<void> = Promise.resolve();\n let queuedFrames = 0;\n let publishedAdmission = false;\n const canAccept = () =>\n !closed &&\n bound &&\n input.host.available() &&\n observed?.admission === \"open\" &&\n !observed.startupReplayPending;\n const notifyAdmission = () => {\n const next = canAccept();\n if (next !== publishedAdmission) {\n publishedAdmission = next;\n input.onAdmissionChanged();\n }\n };\n\n const refreshObservation = (): Promise<void> => {\n if (observation) {\n observationDirty = true;\n return observation;\n }\n if (!(observation || closed)) {\n observationDirty = false;\n observation = input.host\n .call(\"health\", {})\n .then((next) => {\n observed = next;\n })\n .catch((error: unknown) => {\n observed = null;\n input.onError(error);\n })\n .finally(() => {\n observation = null;\n if (!closed) {\n notifyAdmission();\n if (observationDirty) {\n refreshObservation();\n }\n }\n });\n }\n return observation ?? Promise.resolve();\n };\n\n const stopEvents = input.host.onEvent((event) => {\n if (closed) {\n return;\n }\n if (event.type === \"frame\") {\n if (event.connectionGeneration === generation) {\n input.socket.send(JSON.stringify(event.frame));\n }\n } else if (event.type === \"authentication_failure\") {\n if (\n event.connectionGeneration === null ||\n event.connectionGeneration === generation\n ) {\n input.onAuthenticationFailure(event.failure);\n } else {\n warnDaemonEvent(\"[openmeld.runtime_reporting.auth_recovery_ignored]\", {\n event: \"cli.runtime_reporting.auth_recovery_ignored\",\n reason: \"stale_socket\",\n reasonCode: event.failure.reasonCode,\n });\n }\n } else if (event.type === \"invalidate\") {\n input.onInvalidation(event.scope);\n if (event.scope === \"execution\") {\n refreshObservation();\n }\n }\n });\n const stopAvailability = input.host.onAvailabilityChanged(() => {\n if (!input.host.available()) {\n observed = null;\n }\n notifyAdmission();\n });\n\n return {\n canAccept,\n snapshot: () => observed,\n async configure(request: {\n executionAdmissionConfirmation?: boolean;\n connectionGeneration: number;\n catalogRevision: number;\n leases: RuntimeTransportLease[];\n }): Promise<void> {\n const previous = configuration;\n bound = false;\n generation = request.connectionGeneration;\n notifyAdmission();\n const next = previous\n .catch(() => undefined)\n .then(async () => {\n if (closed || generation !== request.connectionGeneration) {\n throw new ExecutionHostError(\n \"host.connection_replaced\",\n \"This socket was replaced before Host configuration.\"\n );\n }\n observed = await input.host.call(\"configureConnection\", request);\n if (!closed && generation === request.connectionGeneration) {\n bound = true;\n notifyAdmission();\n }\n });\n configuration = next;\n await next;\n },\n forward(frame: ParsedDaemonFrame): boolean {\n const request = serviceExecutionHostMethods.handleFrame.input.safeParse({\n connectionGeneration: generation ?? 1,\n frame: { v: RUNTIME_TRANSPORT_SCHEMA_VERSION, ...frame },\n });\n if (!request.success) {\n return false;\n }\n if (closed || generation === null || queuedFrames >= 60) {\n input.onError(\n new ExecutionHostError(\n \"host.busy\",\n \"Host forwarding is not available; the source retains delivery ownership.\"\n )\n );\n return true;\n }\n queuedFrames += 1;\n const expectedGeneration = generation;\n configuration\n .then(async () => {\n if (closed || generation !== expectedGeneration) {\n return;\n }\n await input.host.call(\"handleFrame\", {\n ...request.data,\n connectionGeneration: expectedGeneration,\n });\n })\n .catch(input.onError)\n .finally(() => {\n queuedFrames -= 1;\n });\n return true;\n },\n observe: refreshObservation,\n heartbeat(staleProfileIds: string[]) {\n const expectedGeneration = generation;\n if (closed || !bound || expectedGeneration === null) {\n return;\n }\n // Never await Host responsiveness on the cloud heartbeat path. An IPC\n // failure closes execution admission, not the healthy transport socket.\n input.host\n .call(\n \"heartbeat\",\n { connectionGeneration: expectedGeneration, staleProfileIds },\n { timeoutMs: 2000 }\n )\n .then((next) => {\n if (!closed && generation === expectedGeneration) {\n observed = next;\n notifyAdmission();\n }\n })\n .catch((error: unknown) => {\n observed = null;\n input.onError(error);\n if (!closed) {\n notifyAdmission();\n }\n });\n },\n async detach() {\n if (closed) {\n return;\n }\n closed = true;\n bound = false;\n stopEvents();\n stopAvailability();\n if (generation !== null) {\n // Queue detach behind any admitted configure. Otherwise its delayed\n // completion could reinstall a sink belonging to an already closed WS.\n await configuration.catch(() => undefined);\n await input.host.call(\n \"detachConnection\",\n { connectionGeneration: generation },\n { timeoutMs: 2000 }\n );\n }\n },\n };\n}\n","import { computerFileAccessDaemonFrameSchema } from \"@openmeld/schemas\";\nimport type {\n ComputerFileAccessDaemonFrame,\n ComputerFileAccessErrorResponse,\n ComputerFileAccessPolicy,\n ComputerFileAccessPolicyResult,\n} from \"@openmeld/schemas/types\";\nimport {\n ComputerFileAccessStoreError,\n readComputerFileAccessPolicy,\n updateComputerFileAccessPolicy,\n} from \"./computer-file-access-store\";\n\ntype RequestFrame = Extract<\n ComputerFileAccessDaemonFrame,\n {\n code:\n | \"daemon.computer_file_access.read_policy\"\n | \"daemon.computer_file_access.update_policy\";\n }\n>;\n\ntype ResultFrame = Extract<\n ComputerFileAccessDaemonFrame,\n {\n code:\n | \"daemon.computer_file_access.read_policy_result\"\n | \"daemon.computer_file_access.update_policy_result\";\n }\n>;\n\nexport async function handleComputerFileAccessFrame(input: {\n deviceId: string;\n frame: RequestFrame;\n nowMs?: number;\n storePath: string;\n}): Promise<ResultFrame> {\n const request = input.frame.payload.request;\n if (request.expectedDeviceId !== input.deviceId) {\n return buildResultFrame(\n input.frame,\n rejected(\n \"computer.file_access.device_mismatch\",\n \"This file access request targeted a different Computer. Refresh Computers and try again.\"\n )\n );\n }\n try {\n const policy = await resolvePolicy(input);\n return buildResultFrame(input.frame, {\n deviceId: input.deviceId,\n policy,\n });\n } catch (error) {\n if (error instanceof ComputerFileAccessStoreError) {\n return buildResultFrame(input.frame, rejected(error.code, error.message));\n }\n return buildResultFrame(\n input.frame,\n rejected(\n \"computer.file_access.internal_error\",\n \"OpenMeld couldn’t update file access on this computer. Try again.\"\n )\n );\n }\n}\n\nfunction resolvePolicy(input: {\n frame: RequestFrame;\n nowMs?: number;\n storePath: string;\n}): Promise<ComputerFileAccessPolicy> {\n if (input.frame.code === \"daemon.computer_file_access.read_policy\") {\n return readComputerFileAccessPolicy(input.storePath);\n }\n return updateComputerFileAccessPolicy({\n expectedRevision: input.frame.payload.request.expectedRevision,\n idempotencyKey: input.frame.payload.request.idempotencyKey,\n ...(input.nowMs === undefined ? {} : { nowMs: input.nowMs }),\n policy: input.frame.payload.request.policy,\n storePath: input.storePath,\n });\n}\n\nfunction rejected(\n code: ComputerFileAccessErrorResponse[\"code\"],\n message: string\n): ComputerFileAccessErrorResponse {\n return { code, message, status: \"rejected\" };\n}\n\nfunction buildResultFrame(\n frame: RequestFrame,\n result: ComputerFileAccessPolicyResult\n): ResultFrame {\n return computerFileAccessDaemonFrameSchema.parse({\n code: `${frame.code}_result`,\n payload: { requestId: frame.payload.requestId, result },\n v: 1,\n }) as ResultFrame;\n}\n","import { localFolderPickerDaemonFrameSchema } from \"@openmeld/schemas\";\nimport type {\n LocalFolderPickerDaemonFrame,\n LocalFolderPickerRequest,\n LocalFolderPickerResult,\n} from \"@openmeld/schemas/types\";\n\ntype RequestFrame = Extract<\n LocalFolderPickerDaemonFrame,\n { code: \"daemon.local_folder_picker.select_folders\" }\n>;\n\ntype ResultFrame = Extract<\n LocalFolderPickerDaemonFrame,\n { code: \"daemon.local_folder_picker.select_folders_result\" }\n>;\n\nexport type SelectLocalFolders = (\n request: LocalFolderPickerRequest\n) => Promise<LocalFolderPickerResult>;\n\nexport async function handleLocalFolderPickerFrame(input: {\n deviceId: string;\n frame: RequestFrame;\n selectFolders: SelectLocalFolders;\n}): Promise<ResultFrame> {\n const request = input.frame.payload.request;\n if (request.expectedDeviceId !== input.deviceId) {\n return buildResultFrame(input.frame, {\n code: \"local.folder_picker.device_mismatch\",\n message:\n \"This folder request targeted a different Computer. Refresh Computers and try again.\",\n status: \"unavailable\",\n });\n }\n\n try {\n return buildResultFrame(input.frame, await input.selectFolders(request));\n } catch {\n return buildResultFrame(input.frame, {\n code: \"local.folder_picker.internal_error\",\n message: \"OpenMeld couldn’t open the folder picker. Try again.\",\n status: \"unavailable\",\n });\n }\n}\n\nfunction buildResultFrame(\n frame: RequestFrame,\n result: LocalFolderPickerResult\n): ResultFrame {\n return localFolderPickerDaemonFrameSchema.parse({\n code: \"daemon.local_folder_picker.select_folders_result\",\n payload: { requestId: frame.payload.requestId, result },\n v: 1,\n }) as ResultFrame;\n}\n","import type {\n OpenMeldToolsControlRequest,\n OpenMeldToolsControlResult,\n} from \"@openmeld/schemas/types\";\nimport {\n readOpenMeldToolsMaintenancePolicy,\n writeOpenMeldToolsMaintenancePolicy,\n} from \"./openmeld-tools-maintenance-policy\";\nimport type { OpenMeldToolsUpdateCoordinator } from \"./openmeld-tools-update-coordinator\";\n\nexport async function handleOpenMeldToolsControlRequest(input: {\n coordinator?: OpenMeldToolsUpdateCoordinator;\n request: OpenMeldToolsControlRequest;\n}): Promise<OpenMeldToolsControlResult> {\n if (input.request.operation === \"request_update\") {\n return {\n operation: \"request_update\",\n result: input.coordinator\n ? await input.coordinator.requestUpdate({\n requestSource: input.request.requestSource,\n })\n : { status: \"unavailable\" },\n };\n }\n\n const current = await readOpenMeldToolsMaintenancePolicy();\n if (\n current.automaticUpdatesEnabled === input.request.automaticUpdatesEnabled\n ) {\n return {\n operation: \"set_automatic_updates\",\n result: {\n automaticUpdatesEnabled: current.automaticUpdatesEnabled,\n status: \"unchanged\",\n },\n };\n }\n await writeOpenMeldToolsMaintenancePolicy({\n automaticUpdatesEnabled: input.request.automaticUpdatesEnabled,\n });\n return {\n operation: \"set_automatic_updates\",\n result: {\n automaticUpdatesEnabled: input.request.automaticUpdatesEnabled,\n status: \"updated\",\n },\n };\n}\n","import type { LocalProjectControlDaemonFrame } from \"@openmeld/schemas/types\";\n\nexport function didLocalProjectConnectionsChange(\n frame: LocalProjectControlDaemonFrame\n): boolean {\n switch (frame.code) {\n case \"daemon.local_project_control.connect_candidate_result\":\n case \"daemon.local_project_control.connect_declared_path_result\":\n return (\n \"status\" in frame.payload.result &&\n frame.payload.result.status === \"connected\"\n );\n case \"daemon.local_project_control.remove_connection_result\":\n return (\n \"status\" in frame.payload.result &&\n frame.payload.result.status === \"removed\"\n );\n case \"daemon.local_project_control.remove_missing_connections_result\":\n return (\n \"removedCount\" in frame.payload.result &&\n frame.payload.result.removedCount > 0\n );\n case \"daemon.local_project_control.set_default_connection_result\":\n return (\n \"status\" in frame.payload.result &&\n frame.payload.result.status === \"updated\"\n );\n default:\n return false;\n }\n}\n","//#region src/index.ts\nconst PROJECT_SLUG_MAX_CHARS = 80;\nconst COMBINING_MARK_PATTERN = /\\p{M}+/gu;\nconst NON_ASCII_ALPHANUMERIC_PATTERN = /[^a-z0-9]+/gu;\nconst SURROUNDING_HYPHEN_PATTERN = /^-+|-+$/gu;\nconst SCP_REMOTE_PATTERN = /^(?:[^@/\\s]+@)?(?<host>[^:/\\s]+):(?<path>.+)$/u;\nconst WINDOWS_ABSOLUTE_PATH_PATTERN = /^(?:[a-zA-Z]:[\\\\/]|\\\\\\\\)/u;\nconst FILE_PROTOCOL_PATTERN = /^file:/iu;\nconst SURROUNDING_SLASH_PATTERN = /^\\/+|\\/+$/gu;\nconst GIT_SUFFIX_PATTERN = /\\.git$/iu;\nconst QUERY_OR_FRAGMENT_PATTERN = /[?#]/u;\nconst NETWORK_PROTOCOLS = /* @__PURE__ */ new Set([\n\t\"git:\",\n\t\"http:\",\n\t\"https:\",\n\t\"ssh:\"\n]);\nconst CASE_INSENSITIVE_REPOSITORY_HOSTS = /* @__PURE__ */ new Set([\n\t\"bitbucket.org\",\n\t\"github.com\",\n\t\"gitlab.com\"\n]);\nfunction generateProjectSlug(name, sequence = 1) {\n\tif (!Number.isInteger(sequence) || sequence < 1 || sequence > 99) return null;\n\tconst base = name.trim().normalize(\"NFKD\").replace(COMBINING_MARK_PATTERN, \"\").toLowerCase().replace(NON_ASCII_ALPHANUMERIC_PATTERN, \"-\").replace(SURROUNDING_HYPHEN_PATTERN, \"\") || \"project\";\n\tconst suffix = sequence === 1 ? \"\" : `-${sequence}`;\n\treturn `${base.slice(0, PROJECT_SLUG_MAX_CHARS - suffix.length).replace(SURROUNDING_HYPHEN_PATTERN, \"\") || \"project\"}${suffix}`;\n}\nfunction normalizeRepositoryRemote(value) {\n\tconst remote = value.trim();\n\tif (!remote || FILE_PROTOCOL_PATTERN.test(remote) || remote.startsWith(\"/\") || remote.startsWith(\"\\\\\") || WINDOWS_ABSOLUTE_PATH_PATTERN.test(remote)) return null;\n\tif (!remote.includes(\"://\")) {\n\t\tconst scp = SCP_REMOTE_PATTERN.exec(remote);\n\t\tif (!scp?.groups) return null;\n\t\tconst { host, path } = scp.groups;\n\t\treturn host && path ? normalizeNetworkRepository(host, path) : null;\n\t}\n\ttry {\n\t\tconst url = new URL(remote);\n\t\tif (!NETWORK_PROTOCOLS.has(url.protocol)) return null;\n\t\treturn normalizeNetworkRepository(url.host, decodeURI(url.pathname));\n\t} catch {\n\t\treturn null;\n\t}\n}\nasync function buildRepositoryFingerprint(value) {\n\tconst normalized = normalizeRepositoryRemote(value);\n\tif (!normalized) return null;\n\tconst digest = await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(normalized));\n\treturn `sha256:${Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\nfunction buildCanonicalRepositoryUrl(value) {\n\tconst normalized = normalizeRepositoryRemote(value);\n\treturn normalized ? `https://${normalized}` : null;\n}\nfunction normalizeNetworkRepository(rawHost, rawPath) {\n\tconst host = rawHost.trim().toLowerCase();\n\tconst hostname = host.startsWith(\"[\") ? host.slice(0, host.indexOf(\"]\") + 1) : host.split(\":\", 1)[0];\n\tlet path = (rawPath.split(QUERY_OR_FRAGMENT_PATTERN, 1)[0] ?? \"\").trim().replace(SURROUNDING_SLASH_PATTERN, \"\").replace(GIT_SUFFIX_PATTERN, \"\").normalize(\"NFC\");\n\tif (hostname && CASE_INSENSITIVE_REPOSITORY_HOSTS.has(hostname)) path = path.toLowerCase();\n\treturn host && path ? `${host}/${path}` : null;\n}\n//#endregion\nexport { buildCanonicalRepositoryUrl, buildRepositoryFingerprint, generateProjectSlug, normalizeRepositoryRemote };\n\n//# sourceMappingURL=index.js.map","import { execFile } from \"node:child_process\";\nimport { realpath } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { buildRepositoryFingerprint } from \"@openmeld/projects\";\nimport type { LocalProjectControlGitStatus } from \"@openmeld/schemas\";\n\nconst GIT_COMMAND_TIMEOUT_MS = 10_000;\nconst DEFAULT_GIT_CONCURRENCY = 4;\nconst MISSING_ORIGIN_PATTERN = /no such remote|not found/iu;\nconst NOT_GIT_REPOSITORY_PATTERN = /not a git repository/iu;\n\nexport type GitCommandInput = {\n args: string[];\n command: string;\n timeoutMs: number;\n};\n\nexport type GitCommandOutput = {\n stderr: string;\n stdout: string;\n};\n\nexport type RunGitCommand = (\n input: GitCommandInput\n) => Promise<GitCommandOutput>;\n\ntype GitCommandFailureReason =\n | \"exit\"\n | \"not_installed\"\n | \"timed_out\"\n | \"unavailable\";\n\nexport class GitCommandFailure extends Error {\n readonly exitCode: number | null;\n readonly reason: GitCommandFailureReason;\n readonly stderr: string;\n\n constructor(\n reason: GitCommandFailureReason,\n message: string,\n stderr = \"\",\n exitCode: number | null = null\n ) {\n super(message);\n this.exitCode = exitCode;\n this.name = \"GitCommandFailure\";\n this.reason = reason;\n this.stderr = stderr;\n }\n}\n\nexport class GitVerificationUnavailableError extends Error {\n readonly status: LocalProjectControlGitStatus;\n\n constructor(status: LocalProjectControlGitStatus) {\n super(`Git verification is unavailable: ${status}`);\n this.name = \"GitVerificationUnavailableError\";\n this.status = status;\n }\n}\n\nexport class NotGitRepositoryError extends Error {\n readonly path: string;\n\n constructor(path: string) {\n super(`The folder is not a Git repository: ${path}`);\n this.name = \"NotGitRepositoryError\";\n this.path = path;\n }\n}\n\nexport type InspectedGitRepository = {\n canonicalPath: string;\n originUrl: string | null;\n repositoryFingerprint: string | null;\n};\n\nexport type GitRepositoryVerifier = ReturnType<\n typeof createGitRepositoryVerifier\n>;\n\nexport function createGitRepositoryVerifier(\n input: {\n canonicalizePath?: (path: string) => Promise<string>;\n deadlineMs?: number;\n maxConcurrency?: number;\n now?: () => number;\n platform?: NodeJS.Platform;\n runCommand?: RunGitCommand;\n } = {}\n) {\n const now = input.now ?? Date.now;\n const platform = input.platform ?? process.platform;\n const runCommand = input.runCommand ?? runGitCommand;\n const canonicalizePath = input.canonicalizePath ?? realpath;\n const semaphore =\n input.maxConcurrency === undefined\n ? GLOBAL_GIT_COMMAND_SEMAPHORE\n : new CommandSemaphore(input.maxConcurrency);\n let availability: Promise<LocalProjectControlGitStatus> | null = null;\n\n const withinDeadline = async <T>(operation: Promise<T>): Promise<T> => {\n if (input.deadlineMs === undefined) {\n return await operation;\n }\n const remainingMs = input.deadlineMs - now();\n if (remainingMs <= 0) {\n throw discoveryBudgetExpired();\n }\n return await rejectAfter(operation, remainingMs, discoveryBudgetExpired);\n };\n\n const run = async (command: {\n args: string[];\n command: string;\n }): Promise<GitCommandOutput> => {\n return await withinDeadline(\n semaphore.run(async () => {\n const remainingMs =\n input.deadlineMs === undefined\n ? GIT_COMMAND_TIMEOUT_MS\n : input.deadlineMs - now();\n if (remainingMs <= 0) {\n throw discoveryBudgetExpired();\n }\n return await runCommand({\n ...command,\n timeoutMs: Math.min(GIT_COMMAND_TIMEOUT_MS, remainingMs),\n });\n })\n );\n };\n\n const checkAvailability = async (): Promise<LocalProjectControlGitStatus> => {\n availability ??= (async () => {\n if (platform === \"darwin\") {\n try {\n await run({ args: [\"-p\"], command: \"xcode-select\" });\n } catch {\n return \"command_line_tools_missing\";\n }\n }\n try {\n await run({ args: [\"--version\"], command: \"git\" });\n return \"available\";\n } catch (error) {\n return gitFailureToStatus(error);\n }\n })();\n return await availability;\n };\n\n const inspectRepository = async (\n path: string\n ): Promise<InspectedGitRepository> => {\n const status = await checkAvailability();\n if (status !== \"available\") {\n throw new GitVerificationUnavailableError(status);\n }\n let toplevel: GitCommandOutput;\n try {\n toplevel = await run({\n args: [\"-C\", path, \"rev-parse\", \"--show-toplevel\"],\n command: \"git\",\n });\n } catch (error) {\n if (\n error instanceof GitCommandFailure &&\n error.reason === \"exit\" &&\n NOT_GIT_REPOSITORY_PATTERN.test(error.stderr || error.message)\n ) {\n throw new NotGitRepositoryError(path);\n }\n throw new GitVerificationUnavailableError(gitFailureToStatus(error));\n }\n const rawToplevel = toplevel.stdout.trim();\n if (!rawToplevel) {\n throw new GitVerificationUnavailableError(\"unavailable\");\n }\n const canonicalPath = await withinDeadline(\n canonicalizePath(resolve(rawToplevel))\n );\n let originUrl: string | null;\n try {\n originUrl = (\n await run({\n args: [\"-C\", canonicalPath, \"remote\", \"get-url\", \"origin\"],\n command: \"git\",\n })\n ).stdout.trim();\n originUrl ||= null;\n } catch (error) {\n if (isMissingOrigin(error)) {\n originUrl = null;\n } else {\n throw new GitVerificationUnavailableError(gitFailureToStatus(error));\n }\n }\n return {\n canonicalPath,\n originUrl,\n repositoryFingerprint: originUrl\n ? await buildRepositoryFingerprint(originUrl)\n : null,\n };\n };\n\n const listWorktrees = async (repositoryPath: string): Promise<string[]> => {\n const status = await checkAvailability();\n if (status !== \"available\") {\n throw new GitVerificationUnavailableError(status);\n }\n try {\n const result = await run({\n args: [\"-C\", repositoryPath, \"worktree\", \"list\", \"--porcelain\"],\n command: \"git\",\n });\n const canonicalPaths = await withinDeadline(\n Promise.all(\n parseGitWorktreeList(result.stdout).map(async (path) => {\n const absolutePath = resolve(path);\n return await canonicalizePath(absolutePath).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n })\n )\n );\n return canonicalPaths.filter((path): path is string => path !== null);\n } catch (error) {\n if (error instanceof GitVerificationUnavailableError) {\n throw error;\n }\n throw new GitVerificationUnavailableError(gitFailureToStatus(error));\n }\n };\n\n return {\n checkAvailability,\n inspectRepository,\n listWorktrees,\n runForTest: run,\n };\n}\n\nexport function parseGitWorktreeList(value: string): string[] {\n return value\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"worktree \"))\n .map((line) => line.slice(\"worktree \".length).trim())\n .filter(Boolean);\n}\n\nfunction isMissingOrigin(error: unknown): boolean {\n return Boolean(\n error instanceof GitCommandFailure &&\n error.reason === \"exit\" &&\n MISSING_ORIGIN_PATTERN.test(error.stderr || error.message)\n );\n}\n\nfunction gitFailureToStatus(error: unknown): LocalProjectControlGitStatus {\n if (!(error instanceof GitCommandFailure)) {\n return \"unavailable\";\n }\n if (error.reason === \"not_installed\") {\n return \"not_installed\";\n }\n if (error.reason === \"timed_out\") {\n return \"timed_out\";\n }\n return \"unavailable\";\n}\n\nclass CommandSemaphore {\n private active = 0;\n private readonly maximum: number;\n private readonly queue: Array<() => void> = [];\n\n constructor(maximum: number) {\n if (!Number.isInteger(maximum) || maximum < 1) {\n throw new Error(\"Git command concurrency must be a positive integer.\");\n }\n this.maximum = maximum;\n }\n\n async run<T>(operation: () => Promise<T>): Promise<T> {\n if (this.active >= this.maximum) {\n await new Promise<void>((resolveWaiter) =>\n this.queue.push(resolveWaiter)\n );\n }\n this.active += 1;\n try {\n return await operation();\n } finally {\n this.active -= 1;\n this.queue.shift()?.();\n }\n }\n}\n\nconst GLOBAL_GIT_COMMAND_SEMAPHORE = new CommandSemaphore(\n DEFAULT_GIT_CONCURRENCY\n);\n\nfunction discoveryBudgetExpired(): GitCommandFailure {\n return new GitCommandFailure(\n \"timed_out\",\n \"The local Project discovery budget expired.\"\n );\n}\n\nasync function rejectAfter<T>(\n operation: Promise<T>,\n timeoutMs: number,\n createError: () => Error\n): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(createError()), timeoutMs);\n timer.unref();\n });\n try {\n return await Promise.race([operation, timeout]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nconst runGitCommand: RunGitCommand = async (input) =>\n await new Promise<GitCommandOutput>((resolveCommand, rejectCommand) => {\n execFile(\n input.command,\n input.args,\n {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n timeout: input.timeoutMs,\n },\n (error, stdout, stderr) => {\n if (!error) {\n resolveCommand({ stderr, stdout });\n return;\n }\n const nodeError = error as NodeJS.ErrnoException & {\n killed?: boolean;\n signal?: string | null;\n };\n if (nodeError.code === \"ENOENT\") {\n rejectCommand(\n new GitCommandFailure(\"not_installed\", error.message, stderr)\n );\n return;\n }\n if (nodeError.killed || nodeError.signal === \"SIGTERM\") {\n rejectCommand(\n new GitCommandFailure(\"timed_out\", error.message, stderr)\n );\n return;\n }\n rejectCommand(\n new GitCommandFailure(\n \"exit\",\n error.message,\n stderr,\n typeof nodeError.code === \"number\" ? nodeError.code : null\n )\n );\n }\n );\n });\n","import { constants } from \"node:fs\";\nimport { access, realpath, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { LocalProjectControlGitStatus } from \"@openmeld/schemas\";\nimport {\n createGitRepositoryVerifier,\n type GitRepositoryVerifier,\n GitVerificationUnavailableError,\n NotGitRepositoryError,\n} from \"./git-repository-verifier\";\n\nexport type LocalProjectConnectionErrorCode =\n | \"confirmation_required\"\n | \"git_repository_required\"\n | \"git_verification_unavailable\"\n | \"path_not_directory\"\n | \"path_not_found\"\n | \"path_unreadable\"\n | \"repository_fingerprint_mismatch\";\n\nexport class LocalProjectConnectionError extends Error {\n readonly code: LocalProjectConnectionErrorCode;\n readonly gitStatus?: LocalProjectControlGitStatus;\n\n constructor(\n code: LocalProjectConnectionErrorCode,\n message: string,\n options: { gitStatus?: LocalProjectControlGitStatus } = {}\n ) {\n super(message);\n this.code = code;\n this.gitStatus = options.gitStatus;\n this.name = \"LocalProjectConnectionError\";\n }\n}\n\nexport async function validateLocalProjectConnectionPath(\n input: {\n allowUnverifiedNonGit: boolean;\n declaredPath: string;\n projectRepositoryFingerprint: string | null;\n },\n dependencies: { verifier?: GitRepositoryVerifier } = {}\n): Promise<{\n canonicalPath: string;\n normalizedFrom: string | null;\n repositoryFingerprint: string | null;\n}> {\n const requestedPath = resolve(input.declaredPath);\n const canonicalDeclaredPath = await realpath(requestedPath).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n throw new LocalProjectConnectionError(\n \"path_not_found\",\n \"OpenMeld couldn’t find that folder on this computer. Check the path and try again.\"\n );\n }\n throw error;\n }\n );\n const metadata = await stat(canonicalDeclaredPath);\n if (!metadata.isDirectory()) {\n throw new LocalProjectConnectionError(\n \"path_not_directory\",\n \"That path is not a folder. Enter the Project’s folder path.\"\n );\n }\n await access(canonicalDeclaredPath, constants.R_OK).catch(() => {\n throw new LocalProjectConnectionError(\n \"path_unreadable\",\n \"OpenMeld can’t read that folder. Check its permissions and try again.\"\n );\n });\n\n const verifier = dependencies.verifier ?? createGitRepositoryVerifier({});\n try {\n const repository = await verifier.inspectRepository(canonicalDeclaredPath);\n if (\n input.projectRepositoryFingerprint &&\n repository.repositoryFingerprint !== input.projectRepositoryFingerprint\n ) {\n throw new LocalProjectConnectionError(\n \"repository_fingerprint_mismatch\",\n repository.repositoryFingerprint\n ? \"This folder belongs to a different Git repository. Choose the folder that matches this Project.\"\n : \"This Project has a saved repository identity, but this Git repository has no supported origin.\"\n );\n }\n return {\n canonicalPath: repository.canonicalPath,\n normalizedFrom:\n repository.canonicalPath === canonicalDeclaredPath\n ? null\n : canonicalDeclaredPath,\n repositoryFingerprint: repository.repositoryFingerprint,\n };\n } catch (error) {\n if (error instanceof LocalProjectConnectionError) {\n throw error;\n }\n if (error instanceof NotGitRepositoryError) {\n if (input.projectRepositoryFingerprint) {\n throw new LocalProjectConnectionError(\n \"git_repository_required\",\n \"This Project has a saved repository identity, but this folder is not a Git repository.\"\n );\n }\n return allowUnverifiedConnectionOrThrow(\n canonicalDeclaredPath,\n input.allowUnverifiedNonGit\n );\n }\n if (error instanceof GitVerificationUnavailableError) {\n if (input.projectRepositoryFingerprint) {\n throw new LocalProjectConnectionError(\n \"git_verification_unavailable\",\n \"OpenMeld can’t verify this repository because Git tools aren’t available on this computer. Install Git tools, then try again.\",\n { gitStatus: error.status }\n );\n }\n return allowUnverifiedConnectionOrThrow(\n canonicalDeclaredPath,\n input.allowUnverifiedNonGit\n );\n }\n throw error;\n }\n}\n\nfunction allowUnverifiedConnectionOrThrow(\n canonicalPath: string,\n allowed: boolean\n): {\n canonicalPath: string;\n normalizedFrom: null;\n repositoryFingerprint: null;\n} {\n if (!allowed) {\n throw new LocalProjectConnectionError(\n \"confirmation_required\",\n \"OpenMeld couldn’t verify this folder with Git. You can still connect it, but automatic matching and worktree discovery won’t be available.\"\n );\n }\n return {\n canonicalPath,\n normalizedFrom: null,\n repositoryFingerprint: null,\n };\n}\n","import { createHash } from \"node:crypto\";\n\nconst MAX_IDEMPOTENCY_RESULTS = 512;\n\nexport type LocalProjectControlIdempotencyResolution<T> =\n | { status: \"conflict\" }\n | { status: \"fresh\" | \"replayed\"; value: T };\n\nexport class LocalProjectControlIdempotencyCache<T> {\n private readonly results = new Map<\n string,\n { requestSignature: string; value: Promise<T> }\n >();\n\n async resolve(input: {\n execute: () => Promise<T>;\n idempotencyKey: string;\n operationCode: string;\n organizationId: string;\n projectId: string;\n request: unknown;\n }): Promise<LocalProjectControlIdempotencyResolution<T>> {\n const cacheKey = [\n input.operationCode,\n input.organizationId,\n input.projectId,\n input.idempotencyKey,\n ].join(\"\\0\");\n const requestSignature = stableHash(input.request);\n const cached = this.results.get(cacheKey);\n if (cached) {\n if (cached.requestSignature !== requestSignature) {\n return { status: \"conflict\" };\n }\n return { status: \"replayed\", value: await cached.value };\n }\n\n const value = input.execute();\n if (this.results.size >= MAX_IDEMPOTENCY_RESULTS) {\n const oldestKey = this.results.keys().next().value;\n if (oldestKey !== undefined) {\n this.results.delete(oldestKey);\n }\n }\n this.results.set(cacheKey, { requestSignature, value });\n return { status: \"fresh\", value: await value };\n }\n}\n\nfunction stableHash(value: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\");\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { accountsDir, normalizeAccountKey } from \"../../config/paths\";\nimport {\n readProfileWorkspaceConfigForAccount,\n resolveConfiguredProfileWorkspacePathForAccount,\n} from \"../../profile-workspace/service\";\n\nexport async function collectProfileWorkspaceCandidatePaths(\n signal?: AbortSignal\n): Promise<string[]> {\n const paths = new Set<string>();\n throwIfAborted(signal);\n const hostEntries = await readDirectories(accountsDir(), signal);\n for (const hostEntry of hostEntries) {\n throwIfAborted(signal);\n const hostPath = join(accountsDir(), hostEntry);\n for (const userEntry of await readDirectories(hostPath, signal)) {\n throwIfAborted(signal);\n const account = normalizeAccountKey({\n hostKey: hostEntry,\n userKey: userEntry,\n });\n const profilesPath = join(hostPath, userEntry, \"profiles\");\n for (const profileId of await readDirectories(profilesPath, signal)) {\n throwIfAborted(signal);\n const result = await readProfileWorkspaceConfigForAccount({\n account,\n openMeldProfileId: profileId,\n });\n if (result.status !== \"valid\") {\n continue;\n }\n paths.add(\n resolveConfiguredProfileWorkspacePathForAccount({\n account,\n value: result.value,\n openMeldProfileId: profileId,\n })\n );\n }\n }\n }\n return [...paths].sort();\n}\n\nasync function readDirectories(\n path: string,\n signal?: AbortSignal\n): Promise<string[]> {\n throwIfAborted(signal);\n const entries = await readdir(path, { withFileTypes: true }).catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n );\n throwIfAborted(signal);\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Local Project candidate scan cancelled.\");\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, stat } from \"node:fs/promises\";\nimport type {\n LocalProjectControlCandidate,\n LocalProjectControlDiscoverProjectsResponse,\n LocalProjectControlGitStatus,\n LocalProjectControlProjectDiscovery,\n} from \"@openmeld/schemas\";\nimport { localProjectControlDiscoverProjectsResponseSchema } from \"@openmeld/schemas\";\nimport { collectObservedSessionWorkingDirectories } from \"../../agent-activity/local-observer\";\nimport {\n listProjectBindings,\n type ProjectBinding,\n} from \"../../agent-activity/project-bindings\";\nimport {\n createGitRepositoryVerifier,\n type GitRepositoryVerifier,\n GitVerificationUnavailableError,\n NotGitRepositoryError,\n} from \"./git-repository-verifier\";\nimport { collectProfileWorkspaceCandidatePaths } from \"./profile-workspace-candidates\";\n\nconst DISCOVERY_BUDGET_MS = 25_000;\nconst MAX_PROJECTS = 500;\n\nexport type CanonicalLocalProject = {\n projectId: string;\n repositoryFingerprint: string | null;\n};\n\ntype CandidateSource = {\n confirmedRepository: boolean;\n kind: \"repository\" | \"worktree\";\n path: string;\n};\n\ntype DiscoveryDependencies = {\n budgetMs?: number;\n collectProfileWorkspacePaths?: (signal?: AbortSignal) => Promise<string[]>;\n collectSessionWorkingDirectories?: (\n signal?: AbortSignal\n ) => Promise<string[]>;\n createVerifier?: typeof createGitRepositoryVerifier;\n now?: () => number;\n onDiagnostic?: (input: DiscoveryDiagnostic) => void;\n};\n\ntype DiscoveryDiagnostic = {\n code:\n | \"candidate_source_failed\"\n | \"connection_status_failed\"\n | \"metadata_source_failed\";\n errorCode: string | null;\n errorName: string;\n};\n\nclass DiscoveryDeadlineExceededError extends Error {\n constructor() {\n super(\"The local Project discovery budget expired.\");\n this.name = \"DiscoveryDeadlineExceededError\";\n }\n}\n\nexport async function discoverLocalProjects(\n input: {\n includeCandidates?: boolean;\n checkedAtMs?: number;\n clientGeneration: number;\n deviceId: string;\n expectedOrganizationId: string;\n homeDir?: string;\n projects: CanonicalLocalProject[];\n requestId: string;\n rootDir?: string;\n },\n dependencies: DiscoveryDependencies = {}\n): Promise<LocalProjectControlDiscoverProjectsResponse> {\n if (input.projects.length > MAX_PROJECTS) {\n throw new Error(\"Local Project discovery accepts at most 500 Projects.\");\n }\n const now = dependencies.now ?? Date.now;\n const deadlineMs = now() + (dependencies.budgetMs ?? DISCOVERY_BUDGET_MS);\n const localState = await readLocalDiscoveryState({\n deadlineMs,\n expectedOrganizationId: input.expectedOrganizationId,\n now,\n onDiagnostic: dependencies.onDiagnostic,\n rootDir: input.rootDir,\n });\n if (localState.status === \"timed_out\") {\n return buildDiscoveryResponse({\n candidates: [],\n checkedAtMs: input.checkedAtMs ?? now(),\n clientGeneration: input.clientGeneration,\n connectionsByProject: new Map(),\n deviceId: input.deviceId,\n gitStatus: \"timed_out\",\n projects: input.projects,\n requestId: input.requestId,\n });\n }\n const { bindings, connectionsByProject } = localState;\n if (input.includeCandidates === false) {\n return buildDiscoveryResponse({\n candidates: [],\n checkedAtMs: input.checkedAtMs ?? now(),\n clientGeneration: input.clientGeneration,\n connectionsByProject,\n deviceId: input.deviceId,\n gitStatus: \"not_checked\",\n projects: input.projects,\n requestId: input.requestId,\n });\n }\n const verifier = (dependencies.createVerifier ?? createGitRepositoryVerifier)(\n { deadlineMs, now }\n );\n let gitStatus = await runWithinDeadline(\n () => verifier.checkAvailability(),\n deadlineMs,\n now\n ).catch((error: unknown) =>\n error instanceof DiscoveryDeadlineExceededError\n ? (\"timed_out\" as const)\n : (\"unavailable\" as const)\n );\n const candidatesByPath = new Map<string, LocalProjectControlCandidate>();\n\n if (gitStatus === \"available\") {\n const collected = await collectCandidateSources({\n bindings,\n deadlineMs,\n dependencies,\n homeDir: input.homeDir,\n now,\n });\n gitStatus = collected.gitStatus;\n if (gitStatus === \"available\") {\n gitStatus = await collectVerifiedCandidates({\n candidatesByPath,\n deadlineMs,\n initialGitStatus: gitStatus,\n now,\n onDiagnostic: dependencies.onDiagnostic,\n sources: collected.sources,\n verifier,\n });\n }\n }\n\n return buildDiscoveryResponse({\n candidates: [...candidatesByPath.values()],\n checkedAtMs: input.checkedAtMs ?? now(),\n clientGeneration: input.clientGeneration,\n connectionsByProject,\n deviceId: input.deviceId,\n gitStatus,\n projects: input.projects,\n requestId: input.requestId,\n });\n}\n\nasync function readLocalDiscoveryState(input: {\n deadlineMs: number;\n expectedOrganizationId: string;\n now: () => number;\n onDiagnostic?: DiscoveryDependencies[\"onDiagnostic\"];\n rootDir?: string;\n}): Promise<\n | {\n bindings: ProjectBinding[];\n connectionsByProject: Awaited<\n ReturnType<typeof inspectConnectionAvailability>\n >;\n status: \"ready\";\n }\n | { status: \"timed_out\" }\n> {\n try {\n const bindings = await runWithinDeadline(\n () =>\n listProjectBindings({\n organizationId: input.expectedOrganizationId,\n rootDir: input.rootDir,\n }),\n input.deadlineMs,\n input.now\n );\n const connectionsByProject = await runWithinDeadline(\n () =>\n inspectConnectionAvailability(bindings, {\n onDiagnostic: input.onDiagnostic,\n }),\n input.deadlineMs,\n input.now\n );\n return { bindings, connectionsByProject, status: \"ready\" };\n } catch (error) {\n if (error instanceof DiscoveryDeadlineExceededError) {\n return { status: \"timed_out\" };\n }\n throw error;\n }\n}\n\nasync function collectCandidateSources(input: {\n bindings: ProjectBinding[];\n deadlineMs: number;\n dependencies: DiscoveryDependencies;\n homeDir?: string;\n now: () => number;\n}): Promise<{\n gitStatus: \"available\" | \"timed_out\";\n sources: CandidateSource[];\n}> {\n const abortController = new AbortController();\n let results: [PromiseSettledResult<string[]>, PromiseSettledResult<string[]>];\n try {\n results = await Promise.allSettled([\n runWithinDeadline(\n () =>\n (\n input.dependencies.collectSessionWorkingDirectories ??\n ((signal?: AbortSignal) =>\n collectObservedSessionWorkingDirectories({\n homeDir: input.homeDir,\n signal,\n }))\n )(abortController.signal),\n input.deadlineMs,\n input.now\n ),\n runWithinDeadline(\n () =>\n (\n input.dependencies.collectProfileWorkspacePaths ??\n collectProfileWorkspaceCandidatePaths\n )(abortController.signal),\n input.deadlineMs,\n input.now\n ),\n ]);\n } finally {\n abortController.abort(new DiscoveryDeadlineExceededError());\n }\n const [sessionPathsResult, profileWorkspacePathsResult] = results;\n for (const result of results) {\n if (\n result.status === \"rejected\" &&\n !(result.reason instanceof DiscoveryDeadlineExceededError)\n ) {\n reportDiscoveryDiagnostic(input.dependencies, {\n code: \"metadata_source_failed\",\n error: result.reason,\n });\n }\n }\n const sessionPaths =\n sessionPathsResult.status === \"fulfilled\" ? sessionPathsResult.value : [];\n const profileWorkspacePaths =\n profileWorkspacePathsResult.status === \"fulfilled\"\n ? profileWorkspacePathsResult.value\n : [];\n return {\n gitStatus: results.some(isDeadlineRejection) ? \"timed_out\" : \"available\",\n sources: [\n ...input.bindings.map((binding) => ({\n confirmedRepository: true,\n kind: \"repository\" as const,\n path: binding.repositoryPath,\n })),\n ...sessionPaths.map((path) => ({\n confirmedRepository: false,\n kind: \"repository\" as const,\n path,\n })),\n ...profileWorkspacePaths.map((path) => ({\n confirmedRepository: false,\n kind: \"repository\" as const,\n path,\n })),\n ],\n };\n}\n\nfunction buildDiscoveryResponse(input: {\n candidates: LocalProjectControlCandidate[];\n checkedAtMs: number;\n clientGeneration: number;\n connectionsByProject: Awaited<\n ReturnType<typeof inspectConnectionAvailability>\n >;\n deviceId: string;\n gitStatus: LocalProjectControlGitStatus;\n projects: CanonicalLocalProject[];\n requestId: string;\n}): LocalProjectControlDiscoverProjectsResponse {\n const response = {\n checkedAtMs: input.checkedAtMs,\n clientGeneration: input.clientGeneration,\n deviceId: input.deviceId,\n gitStatus: input.gitStatus,\n projects: input.projects.map((project) =>\n buildProjectDiscovery({\n candidates: input.candidates,\n connections: input.connectionsByProject.get(project.projectId) ?? [],\n gitStatus: input.gitStatus,\n project,\n })\n ),\n requestId: input.requestId,\n };\n const parsed =\n localProjectControlDiscoverProjectsResponseSchema.safeParse(response);\n if (!parsed.success) {\n throw new Error(\"Local Project discovery produced an invalid response.\", {\n cause: parsed.error,\n });\n }\n return parsed.data;\n}\n\nasync function inspectConnectionAvailability(\n bindings: readonly ProjectBinding[],\n dependencies: Pick<DiscoveryDependencies, \"onDiagnostic\"> = {}\n): Promise<\n Map<\n string,\n Array<{\n bindingGeneration: string;\n isDefault: boolean;\n path: string;\n status: \"available\" | \"missing\";\n }>\n >\n> {\n const byProject = new Map<\n string,\n Array<{\n bindingGeneration: string;\n isDefault: boolean;\n path: string;\n status: \"available\" | \"missing\";\n }>\n >();\n await Promise.all(\n bindings.map(async (binding) => {\n const metadata = await stat(binding.repositoryPath).catch(\n (error: unknown) => {\n if (!isMissingPathError(error)) {\n reportDiscoveryDiagnostic(dependencies, {\n code: \"connection_status_failed\",\n error,\n });\n }\n return null;\n }\n );\n const connection = {\n bindingGeneration: binding.bindingGeneration,\n isDefault: binding.isDefault,\n path: binding.repositoryPath,\n status: metadata?.isDirectory()\n ? (\"available\" as const)\n : (\"missing\" as const),\n };\n const connections = byProject.get(binding.projectId) ?? [];\n connections.push(connection);\n byProject.set(binding.projectId, connections);\n })\n );\n for (const connections of byProject.values()) {\n connections.sort(\n (left, right) => Number(right.isDefault) - Number(left.isDefault)\n );\n }\n return byProject;\n}\n\nasync function collectVerifiedCandidates(input: {\n candidatesByPath: Map<string, LocalProjectControlCandidate>;\n deadlineMs: number;\n initialGitStatus: LocalProjectControlGitStatus;\n now: () => number;\n onDiagnostic?: DiscoveryDependencies[\"onDiagnostic\"];\n sources: CandidateSource[];\n verifier: GitRepositoryVerifier;\n}): Promise<LocalProjectControlGitStatus> {\n const inspectedSourcePaths = new Set<string>();\n const worktreesListedFor = new Set<string>();\n for (const source of input.sources) {\n if (input.now() >= input.deadlineMs) {\n return \"timed_out\";\n }\n if (inspectedSourcePaths.has(source.path)) {\n continue;\n }\n inspectedSourcePaths.add(source.path);\n let outcome: LocalProjectControlGitStatus | null;\n try {\n outcome = await inspectCandidateSource({\n candidatesByPath: input.candidatesByPath,\n deadlineMs: input.deadlineMs,\n now: input.now,\n onDiagnostic: input.onDiagnostic,\n source,\n sources: input.sources,\n verifier: input.verifier,\n worktreesListedFor,\n });\n } catch (error) {\n if (error instanceof DiscoveryDeadlineExceededError) {\n return \"timed_out\";\n }\n throw error;\n }\n if (outcome !== null) {\n return outcome;\n }\n }\n return input.initialGitStatus;\n}\n\nasync function inspectCandidateSource(input: {\n candidatesByPath: Map<string, LocalProjectControlCandidate>;\n deadlineMs: number;\n now: () => number;\n onDiagnostic?: DiscoveryDependencies[\"onDiagnostic\"];\n source: CandidateSource;\n sources: CandidateSource[];\n verifier: GitRepositoryVerifier;\n worktreesListedFor: Set<string>;\n}): Promise<LocalProjectControlGitStatus | null> {\n const metadata = await runWithinDeadline(\n () => stat(input.source.path),\n input.deadlineMs,\n input.now\n ).catch((error: unknown) => {\n if (error instanceof DiscoveryDeadlineExceededError) {\n throw error;\n }\n if (!isMissingPathError(error)) {\n reportDiscoveryDiagnostic(input, {\n code: \"candidate_source_failed\",\n error,\n });\n }\n return null;\n });\n if (!metadata?.isDirectory()) {\n return null;\n }\n try {\n await runWithinDeadline(\n () => access(input.source.path, constants.R_OK),\n input.deadlineMs,\n input.now\n );\n } catch (error) {\n if (error instanceof DiscoveryDeadlineExceededError) {\n return \"timed_out\";\n }\n reportDiscoveryDiagnostic(input, {\n code: \"candidate_source_failed\",\n error,\n });\n return null;\n }\n try {\n const repository = await runWithinDeadline(\n () => input.verifier.inspectRepository(input.source.path),\n input.deadlineMs,\n input.now\n );\n recordVerifiedCandidate({\n candidatesByPath: input.candidatesByPath,\n repository,\n sourceKind: input.source.kind,\n });\n await appendConfirmedRepositoryWorktrees({\n deadlineMs: input.deadlineMs,\n now: input.now,\n repositoryPath: repository.canonicalPath,\n shouldList:\n input.source.confirmedRepository &&\n !input.worktreesListedFor.has(repository.canonicalPath),\n sources: input.sources,\n verifier: input.verifier,\n worktreesListedFor: input.worktreesListedFor,\n });\n return null;\n } catch (error) {\n if (error instanceof DiscoveryDeadlineExceededError) {\n return \"timed_out\";\n }\n if (error instanceof NotGitRepositoryError) {\n return null;\n }\n if (\n error instanceof GitVerificationUnavailableError &&\n error.status !== \"unavailable\"\n ) {\n return error.status;\n }\n reportDiscoveryDiagnostic(input, {\n code: \"candidate_source_failed\",\n error,\n });\n return null;\n }\n}\n\nfunction recordVerifiedCandidate(input: {\n candidatesByPath: Map<string, LocalProjectControlCandidate>;\n repository: Awaited<ReturnType<GitRepositoryVerifier[\"inspectRepository\"]>>;\n sourceKind: CandidateSource[\"kind\"];\n}): void {\n if (!input.repository.repositoryFingerprint) {\n return;\n }\n const existing = input.candidatesByPath.get(input.repository.canonicalPath);\n input.candidatesByPath.set(input.repository.canonicalPath, {\n candidateId: buildLocalProjectCandidateId(\n input.repository.canonicalPath,\n input.repository.repositoryFingerprint\n ),\n candidateKind:\n existing?.candidateKind === \"worktree\" || input.sourceKind === \"worktree\"\n ? \"worktree\"\n : \"repository\",\n canonicalPath: input.repository.canonicalPath,\n repositoryFingerprint: input.repository.repositoryFingerprint,\n });\n}\n\nasync function appendConfirmedRepositoryWorktrees(input: {\n deadlineMs: number;\n now: () => number;\n repositoryPath: string;\n shouldList: boolean;\n sources: CandidateSource[];\n verifier: GitRepositoryVerifier;\n worktreesListedFor: Set<string>;\n}): Promise<void> {\n if (!input.shouldList) {\n return;\n }\n input.worktreesListedFor.add(input.repositoryPath);\n const worktrees = await runWithinDeadline(\n () => input.verifier.listWorktrees(input.repositoryPath),\n input.deadlineMs,\n input.now\n );\n for (const worktreePath of worktrees) {\n if (worktreePath !== input.repositoryPath) {\n input.sources.push({\n confirmedRepository: false,\n kind: \"worktree\",\n path: worktreePath,\n });\n }\n }\n}\n\nfunction isDeadlineRejection(result: PromiseSettledResult<unknown>): boolean {\n return (\n result.status === \"rejected\" &&\n result.reason instanceof DiscoveryDeadlineExceededError\n );\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction reportDiscoveryDiagnostic(\n dependencies: Pick<DiscoveryDependencies, \"onDiagnostic\">,\n input: { code: DiscoveryDiagnostic[\"code\"]; error: unknown }\n): void {\n const diagnostic: DiscoveryDiagnostic = {\n code: input.code,\n errorCode:\n input.error && typeof input.error === \"object\" && \"code\" in input.error\n ? String(input.error.code)\n : null,\n errorName: input.error instanceof Error ? input.error.name : \"UnknownError\",\n };\n if (dependencies.onDiagnostic) {\n dependencies.onDiagnostic(diagnostic);\n return;\n }\n process.stderr.write(\n `[openmeld.local_project_discovery.${diagnostic.code}] ${JSON.stringify(diagnostic)}\\n`\n );\n}\n\nasync function runWithinDeadline<T>(\n operation: () => Promise<T>,\n deadlineMs: number,\n now: () => number\n): Promise<T> {\n const remainingMs = deadlineMs - now();\n if (remainingMs <= 0) {\n throw new DiscoveryDeadlineExceededError();\n }\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new DiscoveryDeadlineExceededError()),\n remainingMs\n );\n timer.unref();\n });\n try {\n return await Promise.race([operation(), timeout]);\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n }\n}\n\nfunction buildProjectDiscovery(input: {\n candidates: LocalProjectControlCandidate[];\n connections: Array<{\n bindingGeneration: string;\n isDefault: boolean;\n path: string;\n status: \"available\" | \"missing\";\n }>;\n gitStatus: LocalProjectControlGitStatus;\n project: CanonicalLocalProject;\n}): LocalProjectControlProjectDiscovery {\n const connectionPaths = new Set(\n input.connections.map((connection) => connection.path)\n );\n const candidates = input.project.repositoryFingerprint\n ? input.candidates.filter(\n (candidate) =>\n candidate.repositoryFingerprint ===\n input.project.repositoryFingerprint &&\n !connectionPaths.has(candidate.canonicalPath)\n )\n : [];\n if (input.connections.length > 0) {\n const defaultConnection = input.connections.find(\n (connection) => connection.isDefault\n );\n return {\n candidates,\n connections: input.connections,\n projectId: input.project.projectId,\n status:\n defaultConnection?.status === \"available\"\n ? \"connected\"\n : \"connected_folder_missing\",\n };\n }\n if (input.gitStatus !== \"available\") {\n return {\n candidates: [],\n connections: [],\n projectId: input.project.projectId,\n status:\n input.gitStatus === \"not_checked\"\n ? \"not_connected\"\n : \"verification_unavailable\",\n };\n }\n if (candidates.length > 0) {\n return {\n candidates,\n connections: [],\n projectId: input.project.projectId,\n status: \"found\",\n };\n }\n return {\n candidates: [],\n connections: [],\n projectId: input.project.projectId,\n status: \"not_found\",\n };\n}\n\nexport function buildLocalProjectCandidateId(\n path: string,\n repositoryFingerprint: string\n): string {\n return `candidate-${createHash(\"sha256\")\n .update(`${path}\\0${repositoryFingerprint}`)\n .digest(\"hex\")}`;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport type { LocalProjectControlProjectDiscovery } from \"@openmeld/schemas\";\n\ntype DiscoveryEpochToken = {\n epochId: string;\n organizationId: string;\n sequence: number;\n};\n\ntype CurrentDiscoveryEpoch = DiscoveryEpochToken & {\n discoveryCandidateIdsByToken: Map<string, string>;\n};\n\nexport class LocalProjectDiscoveryEpochs {\n private readonly currentByOrganization = new Map<\n string,\n CurrentDiscoveryEpoch\n >();\n private nextSequence = 1;\n private readonly createEpochId: () => string;\n\n constructor(createEpochId: () => string = randomUUID) {\n this.createEpochId = createEpochId;\n }\n\n begin(input: { organizationId: string }): DiscoveryEpochToken {\n const token = {\n epochId: this.createEpochId(),\n ...input,\n sequence: this.nextSequence,\n };\n this.nextSequence += 1;\n this.currentByOrganization.set(input.organizationId, {\n ...token,\n discoveryCandidateIdsByToken: new Map(),\n });\n return token;\n }\n\n complete(\n token: DiscoveryEpochToken,\n projects: readonly LocalProjectControlProjectDiscovery[]\n ): LocalProjectControlProjectDiscovery[] {\n const scopedProjects = projects.map((project) => ({\n ...project,\n candidates: project.candidates.map((candidate) => ({\n ...candidate,\n candidateId: buildEpochCandidateId({\n candidateId: candidate.candidateId,\n epochId: token.epochId,\n }),\n })),\n }));\n const current = this.currentByOrganization.get(token.organizationId);\n if (!current || current.sequence !== token.sequence) {\n return scopedProjects;\n }\n const discoveryCandidateIdsByToken = new Map<string, string>();\n for (const [projectIndex, project] of scopedProjects.entries()) {\n for (const [candidateIndex, candidate] of project.candidates.entries()) {\n const discoveryCandidateId =\n projects[projectIndex]?.candidates[candidateIndex]?.candidateId;\n if (!discoveryCandidateId) {\n throw new Error(\n \"The scoped Project candidate is missing its identity.\"\n );\n }\n discoveryCandidateIdsByToken.set(\n buildCandidateToken({\n candidateId: candidate.candidateId,\n candidatePath: candidate.canonicalPath,\n projectId: project.projectId,\n }),\n discoveryCandidateId\n );\n }\n }\n this.currentByOrganization.set(token.organizationId, {\n ...token,\n discoveryCandidateIdsByToken,\n });\n return scopedProjects;\n }\n\n resolveDiscoveryCandidateId(input: {\n candidateId: string;\n candidatePath: string;\n organizationId: string;\n projectId: string;\n }): string | null {\n const current = this.currentByOrganization.get(input.organizationId);\n return (\n current?.discoveryCandidateIdsByToken.get(buildCandidateToken(input)) ??\n null\n );\n }\n}\n\nfunction buildEpochCandidateId(input: {\n candidateId: string;\n epochId: string;\n}): string {\n return createHash(\"sha256\").update(JSON.stringify(input)).digest(\"hex\");\n}\n\nfunction buildCandidateToken(input: {\n candidateId: string;\n candidatePath: string;\n projectId: string;\n}): string {\n const identity = {\n candidateId: input.candidateId,\n candidatePath: input.candidatePath,\n projectId: input.projectId,\n };\n return createHash(\"sha256\").update(JSON.stringify(identity)).digest(\"hex\");\n}\n","import {\n type LocalProjectControlConnection,\n type LocalProjectControlDaemonFrame,\n type LocalProjectControlErrorResponse,\n localProjectControlDaemonFrameSchema,\n} from \"@openmeld/schemas\";\nimport {\n bindProject,\n listProjectConnectionsWithStatus,\n ProjectBindingOperationError,\n ProjectBindingStoreUpdateRequiredError,\n removeMissingProjectConnections,\n removeProjectConnection,\n setDefaultProjectConnection,\n} from \"../../agent-activity/project-bindings\";\nimport {\n LocalProjectConnectionError,\n validateLocalProjectConnectionPath,\n} from \"./local-project-connection\";\nimport { LocalProjectControlIdempotencyCache } from \"./local-project-control-idempotency\";\nimport {\n buildLocalProjectCandidateId,\n discoverLocalProjects,\n} from \"./local-project-discovery\";\nimport { LocalProjectDiscoveryEpochs } from \"./local-project-discovery-epoch\";\n\ntype HandlerDependencies = {\n bind?: typeof bindProject;\n discoveryEpochs?: LocalProjectDiscoveryEpochs;\n discover?: typeof discoverLocalProjects;\n idempotencyCache?: LocalProjectControlIdempotencyCache<LocalProjectControlDaemonFrame>;\n listConnections?: typeof listProjectConnectionsWithStatus;\n remove?: typeof removeProjectConnection;\n removeMissing?: typeof removeMissingProjectConnections;\n setDefault?: typeof setDefaultProjectConnection;\n validate?: typeof validateLocalProjectConnectionPath;\n};\n\nconst defaultDiscoveryEpochs = new LocalProjectDiscoveryEpochs();\nconst defaultIdempotencyCache =\n new LocalProjectControlIdempotencyCache<LocalProjectControlDaemonFrame>();\n\ntype RequestFrame = Extract<\n LocalProjectControlDaemonFrame,\n {\n code:\n | \"daemon.local_project_control.connect_candidate\"\n | \"daemon.local_project_control.connect_declared_path\"\n | \"daemon.local_project_control.discover_projects\"\n | \"daemon.local_project_control.remove_connection\"\n | \"daemon.local_project_control.remove_missing_connections\"\n | \"daemon.local_project_control.set_default_connection\";\n }\n>;\n\nexport async function handleLocalProjectControlFrame(\n input: {\n deviceId: string;\n frame: unknown;\n rootDir?: string;\n },\n dependencies: HandlerDependencies = {}\n): Promise<LocalProjectControlDaemonFrame> {\n const parsed = localProjectControlDaemonFrameSchema.safeParse(input.frame);\n if (!(parsed.success && isRequestFrame(parsed.data))) {\n throw new Error(\"The local Project control request frame is invalid.\", {\n cause: parsed.success ? undefined : parsed.error,\n });\n }\n const frame = parsed.data;\n if (isIdempotentRequestFrame(frame)) {\n return await executeIdempotentRequestFrame(frame, input, dependencies);\n }\n try {\n return await executeRequestFrame(frame, input, dependencies);\n } catch (error) {\n return buildErrorResultFrame(frame, toControlError(error));\n }\n}\n\nasync function executeIdempotentRequestFrame(\n frame: Exclude<\n RequestFrame,\n { code: \"daemon.local_project_control.discover_projects\" }\n >,\n input: { deviceId: string; rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const resolution = await (\n dependencies.idempotencyCache ?? defaultIdempotencyCache\n ).resolve({\n execute: () =>\n executeRequestFrame(frame, input, dependencies).catch((error: unknown) =>\n buildErrorResultFrame(frame, toControlError(error))\n ),\n idempotencyKey: request.idempotencyKey,\n operationCode: frame.code,\n organizationId: request.expectedOrganizationId,\n projectId: request.projectId,\n request,\n });\n if (resolution.status === \"conflict\") {\n return buildErrorResultFrame(\n frame,\n rejection(\n \"invalid_request\",\n \"This idempotency key was already used for a different Project connection request.\"\n )\n );\n }\n return resolution.status === \"replayed\"\n ? rebuildResultFrame(frame, resolution.value)\n : resolution.value;\n}\n\nasync function executeRequestFrame(\n frame: RequestFrame,\n input: { deviceId: string; rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n switch (frame.code) {\n case \"daemon.local_project_control.discover_projects\":\n return await handleDiscoverFrame(frame, input, dependencies);\n case \"daemon.local_project_control.connect_candidate\":\n return await handleConnectCandidateFrame(frame, input, dependencies);\n case \"daemon.local_project_control.connect_declared_path\":\n return await handleConnectDeclaredPathFrame(frame, input, dependencies);\n case \"daemon.local_project_control.set_default_connection\":\n return await handleSetDefaultFrame(frame, input, dependencies);\n case \"daemon.local_project_control.remove_connection\":\n return await handleRemoveFrame(frame, input, dependencies);\n case \"daemon.local_project_control.remove_missing_connections\":\n return await handleRemoveMissingFrame(frame, input, dependencies);\n default:\n throw new Error(\"Unsupported local Project control operation.\");\n }\n}\n\nasync function handleDiscoverFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.discover_projects\" }\n >,\n input: { deviceId: string; rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const epoch =\n frame.payload.request.includeCandidates === false\n ? null\n : (dependencies.discoveryEpochs ?? defaultDiscoveryEpochs).begin({\n organizationId: frame.payload.request.expectedOrganizationId,\n });\n const response = await (dependencies.discover ?? discoverLocalProjects)({\n ...frame.payload.request,\n deviceId: input.deviceId,\n requestId: frame.payload.requestId,\n rootDir: input.rootDir,\n });\n const projects = epoch\n ? (dependencies.discoveryEpochs ?? defaultDiscoveryEpochs).complete(\n epoch,\n response.projects\n )\n : response.projects;\n return buildResultFrame(\n \"daemon.local_project_control.discover_projects_result\",\n frame.payload.requestId,\n { ...response, projects }\n );\n}\n\nasync function handleConnectCandidateFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.connect_candidate\" }\n >,\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const discoveryCandidateId = (\n dependencies.discoveryEpochs ?? defaultDiscoveryEpochs\n ).resolveDiscoveryCandidateId({\n candidateId: request.candidateId,\n candidatePath: request.candidatePath,\n organizationId: request.expectedOrganizationId,\n projectId: request.projectId,\n });\n if (!discoveryCandidateId) {\n return buildResultFrame(\n \"daemon.local_project_control.connect_candidate_result\",\n frame.payload.requestId,\n rejection(\n \"candidate_unavailable\",\n \"This discovered folder is no longer available. Discover Projects again and choose a current result.\"\n )\n );\n }\n const connection = await (\n dependencies.validate ?? validateLocalProjectConnectionPath\n )({\n allowUnverifiedNonGit: false,\n declaredPath: request.candidatePath,\n projectRepositoryFingerprint: request.repositoryFingerprint,\n });\n if (\n connection.repositoryFingerprint === null ||\n buildLocalProjectCandidateId(\n connection.canonicalPath,\n connection.repositoryFingerprint\n ) !== discoveryCandidateId\n ) {\n return buildResultFrame(\n \"daemon.local_project_control.connect_candidate_result\",\n frame.payload.requestId,\n rejection(\n \"candidate_unavailable\",\n \"This discovered folder is no longer available. Discover Projects again and choose a current result.\"\n )\n );\n }\n const result = await connectValidatedPath({\n bind: dependencies.bind,\n connection,\n request,\n rootDir: input.rootDir,\n });\n return buildResultFrame(\n \"daemon.local_project_control.connect_candidate_result\",\n frame.payload.requestId,\n result\n );\n}\n\nasync function handleConnectDeclaredPathFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.connect_declared_path\" }\n >,\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const connection = await (\n dependencies.validate ?? validateLocalProjectConnectionPath\n )({\n allowUnverifiedNonGit: request.confirmNonGit === true,\n declaredPath: request.declaredPath,\n projectRepositoryFingerprint: request.repositoryFingerprint,\n });\n const result = await connectValidatedPath({\n bind: dependencies.bind,\n connection,\n request,\n rootDir: input.rootDir,\n });\n return buildResultFrame(\n \"daemon.local_project_control.connect_declared_path_result\",\n frame.payload.requestId,\n result\n );\n}\n\nasync function handleSetDefaultFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.set_default_connection\" }\n >,\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const before = await projectConnections(request, input, dependencies);\n const target = before.find(\n (connection) =>\n connection.bindingGeneration === request.targetBindingGeneration\n );\n if (!target) {\n throw new ProjectBindingOperationError(\n \"binding_generation_stale\",\n \"The Project connection is missing or stale.\"\n );\n }\n await (dependencies.setDefault ?? setDefaultProjectConnection)({\n expectedBindingGeneration: request.targetBindingGeneration,\n organizationId: request.expectedOrganizationId,\n projectId: request.projectId,\n rootDir: input.rootDir,\n });\n return buildResultFrame(\n \"daemon.local_project_control.set_default_connection_result\",\n frame.payload.requestId,\n {\n connections: await projectConnections(request, input, dependencies),\n status: target.isDefault ? \"unchanged\" : \"updated\",\n }\n );\n}\n\nasync function handleRemoveFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.remove_connection\" }\n >,\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const before = await projectConnections(request, input, dependencies);\n if (\n !before.some(\n (connection) => connection.bindingGeneration === request.bindingGeneration\n )\n ) {\n return buildResultFrame(\n \"daemon.local_project_control.remove_connection_result\",\n frame.payload.requestId,\n { connections: before, status: \"unchanged\" }\n );\n }\n await (dependencies.remove ?? removeProjectConnection)({\n expectedBindingGeneration: request.bindingGeneration,\n organizationId: request.expectedOrganizationId,\n projectId: request.projectId,\n replacementBindingGeneration: request.replacementBindingGeneration,\n rootDir: input.rootDir,\n });\n return buildResultFrame(\n \"daemon.local_project_control.remove_connection_result\",\n frame.payload.requestId,\n {\n connections: await projectConnections(request, input, dependencies),\n status: \"removed\",\n }\n );\n}\n\nasync function handleRemoveMissingFrame(\n frame: Extract<\n RequestFrame,\n { code: \"daemon.local_project_control.remove_missing_connections\" }\n >,\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlDaemonFrame> {\n const request = frame.payload.request;\n const result = await (\n dependencies.removeMissing ?? removeMissingProjectConnections\n )({\n organizationId: request.expectedOrganizationId,\n projectId: request.projectId,\n rootDir: input.rootDir,\n });\n return buildResultFrame(\n \"daemon.local_project_control.remove_missing_connections_result\",\n frame.payload.requestId,\n {\n connections: await projectConnections(request, input, dependencies),\n removedCount: result.removed.length,\n }\n );\n}\n\nfunction isRequestFrame(\n frame: LocalProjectControlDaemonFrame\n): frame is RequestFrame {\n return !frame.code.endsWith(\"_result\");\n}\n\nfunction isIdempotentRequestFrame(\n frame: RequestFrame\n): frame is Exclude<\n RequestFrame,\n { code: \"daemon.local_project_control.discover_projects\" }\n> {\n return frame.code !== \"daemon.local_project_control.discover_projects\";\n}\n\nfunction rebuildResultFrame(\n requestFrame: Exclude<\n RequestFrame,\n { code: \"daemon.local_project_control.discover_projects\" }\n >,\n cachedFrame: LocalProjectControlDaemonFrame\n): LocalProjectControlDaemonFrame {\n if (\n !(cachedFrame.code.endsWith(\"_result\") && \"result\" in cachedFrame.payload)\n ) {\n return buildErrorResultFrame(\n requestFrame,\n rejection(\n \"internal_error\",\n \"The cached Project control result is invalid.\"\n )\n );\n }\n return buildResultFrame(\n `${requestFrame.code}_result` as Parameters<typeof buildResultFrame>[0],\n requestFrame.payload.requestId,\n cachedFrame.payload.result\n );\n}\n\nasync function connectValidatedPath(input: {\n bind?: typeof bindProject;\n connection: Awaited<ReturnType<typeof validateLocalProjectConnectionPath>>;\n request: {\n expectedOrganizationId: string;\n moveConfirmationToken?: string;\n projectId: string;\n projectSlug: string;\n };\n rootDir?: string;\n}) {\n const before = await listProjectConnectionsWithStatus({\n organizationId: input.request.expectedOrganizationId,\n rootDir: input.rootDir,\n });\n const existing = before.find(\n (binding) =>\n binding.projectId === input.request.projectId &&\n binding.repositoryPath === input.connection.canonicalPath\n );\n const binding = await (input.bind ?? bindProject)({\n moveConfirmationToken: input.request.moveConfirmationToken,\n organizationId: input.request.expectedOrganizationId,\n projectId: input.request.projectId,\n projectSlug: input.request.projectSlug,\n repositoryFingerprint: input.connection.repositoryFingerprint,\n repositoryPath: input.connection.canonicalPath,\n rootDir: input.rootDir,\n });\n return {\n bindingGeneration: binding.bindingGeneration,\n canonicalPath: binding.repositoryPath,\n isDefault: binding.isDefault,\n status:\n existing?.bindingGeneration === binding.bindingGeneration\n ? (\"unchanged\" as const)\n : (\"connected\" as const),\n };\n}\n\nasync function projectConnections(\n request: { expectedOrganizationId: string; projectId: string },\n input: { rootDir?: string },\n dependencies: HandlerDependencies\n): Promise<LocalProjectControlConnection[]> {\n return (\n await (dependencies.listConnections ?? listProjectConnectionsWithStatus)({\n organizationId: request.expectedOrganizationId,\n rootDir: input.rootDir,\n })\n )\n .filter((connection) => connection.projectId === request.projectId)\n .map((connection) => ({\n bindingGeneration: connection.bindingGeneration,\n isDefault: connection.isDefault,\n path: connection.repositoryPath,\n status: connection.status,\n }))\n .sort(\n (left, right) =>\n Number(right.isDefault) - Number(left.isDefault) ||\n left.path.localeCompare(right.path)\n );\n}\n\nfunction rejection(\n code: Exclude<LocalProjectControlErrorResponse[\"code\"], \"path_conflict\">,\n message: string\n): LocalProjectControlErrorResponse {\n return { code, message, status: \"rejected\" };\n}\n\nfunction toControlError(error: unknown): LocalProjectControlErrorResponse {\n if (error instanceof ProjectBindingOperationError) {\n if (error.code === \"path_conflict\") {\n if (!error.pathConflict) {\n return rejection(\"internal_error\", error.message);\n }\n return {\n code: error.code,\n ...error.pathConflict,\n message: error.message,\n status: \"rejected\",\n };\n }\n return rejection(error.code, error.message);\n }\n if (error instanceof ProjectBindingStoreUpdateRequiredError) {\n return rejection(\"service_update_required\", error.message);\n }\n if (error instanceof LocalProjectConnectionError) {\n if (error.code === \"git_verification_unavailable\") {\n let code: \"command_line_tools_missing\" | \"git_unavailable\" | \"timeout\" =\n \"git_unavailable\";\n if (error.gitStatus === \"command_line_tools_missing\") {\n code = \"command_line_tools_missing\";\n } else if (error.gitStatus === \"timed_out\") {\n code = \"timeout\";\n }\n return rejection(code, error.message);\n }\n const code = {\n confirmation_required: \"needs_confirmation\",\n git_repository_required: \"git_repository_required\",\n path_not_directory: \"path_not_directory\",\n path_not_found: \"path_not_found\",\n path_unreadable: \"path_unreadable\",\n repository_fingerprint_mismatch: \"fingerprint_mismatch\",\n }[error.code] as Exclude<\n LocalProjectControlErrorResponse[\"code\"],\n \"path_conflict\"\n >;\n return rejection(code, error.message);\n }\n return rejection(\n \"internal_error\",\n error instanceof Error\n ? error.message\n : \"Local Project control failed unexpectedly.\"\n );\n}\n\nfunction buildResultFrame(\n code:\n | \"daemon.local_project_control.connect_candidate_result\"\n | \"daemon.local_project_control.connect_declared_path_result\"\n | \"daemon.local_project_control.discover_projects_result\"\n | \"daemon.local_project_control.remove_connection_result\"\n | \"daemon.local_project_control.remove_missing_connections_result\"\n | \"daemon.local_project_control.set_default_connection_result\",\n requestId: string,\n result: unknown\n): LocalProjectControlDaemonFrame {\n return localProjectControlDaemonFrameSchema.parse({\n code,\n payload: { requestId, result },\n v: 1,\n });\n}\n\nfunction buildErrorResultFrame(\n frame: RequestFrame,\n error: LocalProjectControlErrorResponse\n): LocalProjectControlDaemonFrame {\n const code = `${frame.code}_result` as Parameters<typeof buildResultFrame>[0];\n return buildResultFrame(code, frame.payload.requestId, error);\n}\n","import {\n daemonServiceLaneSchema,\n localWakeRouteWorkingFolderObservationSchema,\n} from \"@openmeld/schemas\";\nimport type {\n LocalWakeRouteReport,\n LocalWakeRouteWorkingFolderObservation,\n} from \"@openmeld/schemas/types\";\nimport type { RouteCatalog } from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\n\nexport function createLocalWakeRouteReport(input: {\n daemonSessionId: string;\n deviceId: string;\n lane: string;\n reportedAtMs: number;\n routeCatalog: RouteCatalog;\n serviceVersion: string | null;\n}): LocalWakeRouteReport {\n const lane = daemonServiceLaneSchema.safeParse(input.lane);\n if (!lane.success) {\n throw invalidV4Report(\"invalid OpenMeld Service lane for route report\");\n }\n const profileConfigurationRevisions = resolveProfileConfigurationRevisions(\n input.routeCatalog\n );\n const baseReport = {\n daemonSessionId: input.daemonSessionId,\n deviceId: input.deviceId,\n includedProfileIds: [...input.routeCatalog.profileIds],\n lane: lane.data,\n reportedAtMs: input.reportedAtMs,\n serviceVersion: input.serviceVersion,\n ...(profileConfigurationRevisions ? { profileConfigurationRevisions } : {}),\n skippedProfiles: [...input.routeCatalog.skippedProfiles],\n };\n\n if (input.routeCatalog.expectedRoutesContractVersion !== \"v4\") {\n return baseReport;\n }\n\n const expectedProfileIds = [\n ...(input.routeCatalog.workingFolderExpectedProfileIds ?? []),\n ].sort((left, right) => left.localeCompare(right));\n const observations = parseV4WorkingFolderObservations(\n input.routeCatalog.workingFolderObservations ?? []\n );\n const observedProfileIds = observations\n .map((observation) => observation.profileId)\n .sort((left, right) => left.localeCompare(right));\n if (\n new Set(expectedProfileIds).size !== expectedProfileIds.length ||\n new Set(observedProfileIds).size !== observedProfileIds.length ||\n expectedProfileIds.length !== observedProfileIds.length ||\n expectedProfileIds.some(\n (profileId, index) => profileId !== observedProfileIds[index]\n )\n ) {\n throw invalidV4Report(\n \"negotiated v4 working-folder observations do not exactly cover expected routes\"\n );\n }\n\n return {\n ...baseReport,\n expectedRoutesContractVersion: \"v4\",\n workingFolderObservations: observations,\n };\n}\n\nfunction parseV4WorkingFolderObservations(\n observations: NonNullable<RouteCatalog[\"workingFolderObservations\"]>\n): LocalWakeRouteWorkingFolderObservation[] {\n return observations.map((observation) => {\n const parsed =\n localWakeRouteWorkingFolderObservationSchema.safeParse(observation);\n if (!parsed.success) {\n throw invalidV4Report(\n `invalid negotiated v4 working-folder observation for ${observation.profileId}`\n );\n }\n return parsed.data;\n });\n}\n\nfunction resolveProfileConfigurationRevisions(routeCatalog: RouteCatalog) {\n if (routeCatalog.profileIds.length === 0) {\n return null;\n }\n const revisions = routeCatalog.profileIds.map((profileId) => {\n const configurationRevision =\n routeCatalog.routeByProfileId.get(profileId)?.configurationRevision ??\n null;\n const bindingId =\n routeCatalog.routeByProfileId.get(profileId)?.bindingId ?? null;\n return configurationRevision === null || bindingId === null\n ? null\n : { bindingId, configurationRevision, profileId };\n });\n return revisions.every(\n (\n revision\n ): revision is {\n bindingId: string;\n configurationRevision: number;\n profileId: string;\n } => revision !== null\n )\n ? revisions\n : null;\n}\n\nexport function hasCompleteProfileConfigurationRevisions(\n routeCatalog: RouteCatalog\n): boolean {\n return resolveProfileConfigurationRevisions(routeCatalog) !== null;\n}\n\nfunction invalidV4Report(message: string): DaemonServiceRunError {\n return new DaemonServiceRunError({\n code: \"daemon.run.register_payload_invalid\",\n message,\n });\n}\n","import {\n DAEMON_STREAM_KEEPALIVE_INTERVAL_MS,\n DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS,\n} from \"../core/constants\";\n\nexport type DaemonStreamKeepalive = {\n observePong(): void;\n start(): void;\n stop(): void;\n};\n\n// Daemon stream keepalive with a PONG watchdog. Every PING must be answered\n// by the hub's auto-responded PONG within the pong timeout; a missed PONG\n// means the socket is half-open (sends silently dropped), so the watchdog\n// reports the timeout and stops. The owner terminates the socket, which\n// hands control to the normal reconnect path — the hub redelivers in-flight\n// dispatch pushes on reconnect. A blind PING with no response check cannot\n// detect a half-open socket at all.\nexport function createDaemonStreamKeepalive(input: {\n intervalMs?: number;\n onPongTimeout: () => void;\n pongTimeoutMs?: number;\n // Returns true only when a PING was actually written to the socket; the\n // watchdog arms its PONG deadline only for pings that went out.\n sendPing: () => boolean;\n}): DaemonStreamKeepalive {\n const intervalMs = input.intervalMs ?? DAEMON_STREAM_KEEPALIVE_INTERVAL_MS;\n const pongTimeoutMs =\n input.pongTimeoutMs ?? DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS;\n let pingTimer: NodeJS.Timeout | null = null;\n let pongDeadlineTimer: NodeJS.Timeout | null = null;\n\n const clearPongDeadline = (): void => {\n if (!pongDeadlineTimer) {\n return;\n }\n clearTimeout(pongDeadlineTimer);\n pongDeadlineTimer = null;\n };\n\n const stop = (): void => {\n if (pingTimer) {\n clearInterval(pingTimer);\n pingTimer = null;\n }\n clearPongDeadline();\n };\n\n const armPongDeadline = (): void => {\n pongDeadlineTimer = setTimeout(() => {\n pongDeadlineTimer = null;\n // Stop before reporting so a dead socket is never pinged again while\n // the owner tears it down.\n stop();\n input.onPongTimeout();\n }, pongTimeoutMs);\n };\n\n return {\n observePong(): void {\n clearPongDeadline();\n },\n start(): void {\n stop();\n pingTimer = setInterval(() => {\n // One unanswered probe owns one finite deadline. A later interval can\n // become runnable alongside that deadline after a long scheduling gap;\n // sending another PING must not replace the original deadline and keep\n // a half-open socket alive indefinitely.\n if (pongDeadlineTimer) {\n return;\n }\n let sent = false;\n try {\n sent = input.sendPing();\n } catch {\n // Socket already closing; the close path stops this keepalive.\n sent = false;\n }\n if (sent) {\n armPongDeadline();\n }\n }, intervalMs);\n },\n stop,\n };\n}\n","import type { RuntimeTransportHeartbeatResponse } from \"@openmeld/schemas/types\";\nimport type { PendingFrameWaiters } from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\n\nexport function waitForHeartbeatResponse(input: {\n timeoutMs: number;\n waiters: PendingFrameWaiters;\n}): Promise<RuntimeTransportHeartbeatResponse> {\n // OPENMELD_SERVICE_THIN_CORE: heartbeat acknowledgement.\n // Heartbeat keeps the local carrier observable and lease-aware. It is local\n // liveness evidence, not a Space or AgentExecutionReadiness verdict.\n if (input.waiters.heartbeatResolver || input.waiters.heartbeatRejecter) {\n return Promise.reject(\n new DaemonServiceRunError({\n code: \"daemon.run.heartbeat_response_busy\",\n message: \"heartbeat response waiter is already pending\",\n })\n );\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n input.waiters.heartbeatResolver = null;\n input.waiters.heartbeatRejecter = null;\n reject(\n new DaemonServiceRunError({\n code: \"daemon.run.heartbeat_timeout\",\n message: \"heartbeat response timeout\",\n })\n );\n }, input.timeoutMs);\n\n input.waiters.heartbeatResolver = (payload) => {\n clearTimeout(timeout);\n input.waiters.heartbeatRejecter = null;\n resolve(payload);\n };\n input.waiters.heartbeatRejecter = (error) => {\n clearTimeout(timeout);\n input.waiters.heartbeatResolver = null;\n input.waiters.heartbeatRejecter = null;\n reject(error);\n };\n });\n}\n","import type { RuntimeTransportRegisterSessionResponse } from \"@openmeld/schemas/types\";\nimport type { PendingFrameWaiters } from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\n\nexport function waitForRegisterResponse(input: {\n timeoutMs: number;\n waiters: PendingFrameWaiters;\n}): Promise<RuntimeTransportRegisterSessionResponse> {\n // OPENMELD_SERVICE_THIN_CORE: registration acknowledgement.\n // Registration proves this daemon stream was accepted for its current\n // account/device/lane route catalog. It is not final Agent readiness.\n if (input.waiters.registerResolver || input.waiters.registerRejecter) {\n return Promise.reject(\n new DaemonServiceRunError({\n code: \"daemon.run.register_response_busy\",\n message: \"register response waiter is already pending\",\n })\n );\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n input.waiters.registerResolver = null;\n input.waiters.registerRejecter = null;\n reject(\n new DaemonServiceRunError({\n code: \"daemon.run.register_timeout\",\n message: \"register response timeout\",\n })\n );\n }, input.timeoutMs);\n\n input.waiters.registerResolver = (payload) => {\n clearTimeout(timeout);\n input.waiters.registerRejecter = null;\n resolve(payload);\n };\n input.waiters.registerRejecter = (error) => {\n clearTimeout(timeout);\n input.waiters.registerResolver = null;\n input.waiters.registerRejecter = null;\n reject(error);\n };\n });\n}\n","import { resolveCatalogSyncSkippedProfilesLogState } from \"@openmeld/local-service/catalog-sync-skipped-profiles\";\nimport {\n ADAPTIVE_HEARTBEAT_JITTER_RATIO,\n applyAcceptedLeases,\n applyIntervalJitterMs,\n MAX_HEARTBEAT_INTERVAL_MS,\n MIN_HEARTBEAT_INTERVAL_MS,\n pruneStaleLeases,\n resolveAdaptiveHeartbeatIntervalMs,\n resolveCatalogSyncIntervalMs,\n} from \"@openmeld/local-service/heartbeat-policy\";\nimport { resolveRouteRegistrationReconcileDecision } from \"@openmeld/local-service/service-reconcile-decision\";\nimport {\n DAEMON_STREAM_KEEPALIVE_PING,\n DAEMON_STREAM_KEEPALIVE_PONG,\n} from \"@openmeld/protocol\";\nimport type { ServiceExecutionHostOutput } from \"@openmeld/schemas\";\nimport {\n computerFileAccessDaemonFrameSchema,\n localFolderPickerDaemonFrameSchema,\n RUNTIME_TRANSPORT_SCHEMA_VERSION,\n runtimeTransportHeartbeatRequestSchema,\n runtimeTransportLocalAgentControlRefreshCatalogFramePayloadSchema,\n runtimeTransportLocalAgentControlSetProfileWorkspaceFramePayloadSchema,\n runtimeTransportOpenMeldToolsControlFramePayloadSchema,\n runtimeTransportOpenMeldToolsControlResultFramePayloadSchema,\n runtimeTransportRegisterSessionRequestSchema,\n runtimeTransportRouteCatalogChangedFramePayloadSchema,\n} from \"@openmeld/schemas\";\nimport type {\n LocalComponentsStatus,\n OpenMeldDaemonSetProfileWorkspacePayload,\n OpenMeldDaemonSyncRouteCatalogPayload,\n RuntimeTransportLease,\n RuntimeTransportRegisterSessionResponse,\n RuntimeTransportStopCause,\n} from \"@openmeld/schemas/types\";\nimport {\n ensureOpenMeldManagedProfileWorkspace,\n setCustomProfileWorkspace,\n} from \"../../profile-workspace/service\";\nimport type { Presenter } from \"../../runtime/presenter/types\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\nimport type { WsClient } from \"../../transport/ws\";\nimport { resolveDaemonCapabilitiesFromAdapterIds } from \"../adapters/resolve-daemon-capabilities\";\nimport {\n CATALOG_SYNC_RETRY_INTERVAL_MS,\n CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS,\n CONTROLLED_SHUTDOWN_SOCKET_CLOSE_TIMEOUT_MS,\n DAEMON_RUNTIME_CONTRACT_EPOCH,\n HEARTBEAT_CONSECUTIVE_FAILURES_BEFORE_CLOSE,\n HEARTBEAT_RESPONSE_TIMEOUT_MS,\n PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS,\n PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS,\n REGISTER_RESPONSE_TIMEOUT_MS,\n RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS,\n RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS,\n} from \"../core/constants\";\nimport {\n emitRunLine,\n normalizeHeartbeatIntervalMs,\n normalizeText,\n nowIsoString,\n toErrorMessage,\n} from \"../core/logger\";\nimport type {\n CurrentDaemonSocketRef,\n LedgerPaths,\n MutableRouteCatalogState,\n ParsedDaemonFrame,\n PendingFrameWaiters,\n RouteCatalog,\n RouteCatalogSyncResult,\n} from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\nimport { emitReconcileCompletedEvidence } from \"../diagnostics/service-evidence-trace\";\nimport { emitDaemonDispatchJournalEvent } from \"../dispatch/daemon-dispatch-journal\";\nimport {\n flushDispatchResultOutbox,\n listDispatchResultOutboxPendingAcknowledgementKeys,\n waitForDispatchResultOutboxAcknowledgement,\n} from \"../dispatch/dispatch-result-outbox\";\nimport type { ExecutionHostPort } from \"../execution-host/port\";\nimport { createExecutionHostSocketLink } from \"../execution-host/socket-link\";\nimport { handleComputerFileAccessFrame } from \"../file-access/computer-file-access-handler\";\nimport {\n handleLocalFolderPickerFrame,\n type SelectLocalFolders,\n} from \"../folder-picker/local-folder-picker-handler\";\nimport { resolveNextRuntimeAgentControllerReportSyncAtMs } from \"../inventory/agent-controller-interface-keeper\";\nimport { handleOpenMeldToolsControlRequest } from \"../maintenance/openmeld-tools-control-handler\";\nimport type { OpenMeldToolsUpdateCoordinator } from \"../maintenance/openmeld-tools-update-coordinator\";\nimport { didLocalProjectConnectionsChange } from \"../projects/local-project-activity-sync\";\nimport { handleLocalProjectControlFrame } from \"../projects/local-project-control-handler\";\nimport {\n createLocalWakeRouteReport,\n hasCompleteProfileConfigurationRevisions,\n} from \"../reporting/local-wake-route-report\";\n\ntype LocalServiceRuntimeAgentControllerReportSyncResult =\n ServiceExecutionHostOutput<\"reportControllers\">;\n\nimport type { RuntimeReportingAuthenticationFailure } from \"../reporting/runtime-reporting-auth-recovery\";\nimport {\n createRouteCatalogFromMutableState,\n summarizeSkippedDaemonProfiles,\n syncDaemonRouteCatalogState,\n} from \"../routing/route-catalog-state\";\nimport {\n type DaemonCatalogSyncSignal,\n readDaemonCatalogSyncSignal,\n} from \"../state/catalog-sync-signal\";\nimport {\n handleDaemonTransportFrame,\n parseDaemonFrame,\n sendDaemonFrame,\n} from \"./daemon-frame-transport\";\nimport { createDaemonStreamKeepalive } from \"./daemon-stream-keepalive\";\nimport { waitForHeartbeatResponse } from \"./heartbeat-loop\";\nimport { waitForRegisterResponse } from \"./register-session\";\nimport type { ServiceLocalComponentsObservation } from \"./service-local-components-observation\";\n\nfunction buildShutdownHeartbeatFacts(input: {\n acceptingDispatches: boolean;\n stopCause: RuntimeTransportStopCause | null;\n}): {\n acceptingDispatches?: false;\n stopCause?: RuntimeTransportStopCause;\n} {\n if (input.acceptingDispatches) {\n return {};\n }\n return {\n acceptingDispatches: false,\n ...(input.stopCause ? { stopCause: input.stopCause } : {}),\n };\n}\n\nfunction resolveHeartbeatIdleWaiters(waiters: Array<() => void>): void {\n while (waiters.length > 0) {\n waiters.shift()?.();\n }\n}\n\nfunction resolveCatalogSyncSignalMarker(\n signal: DaemonCatalogSyncSignal | null\n): string | null {\n if (!signal) {\n return null;\n }\n return signal.signalId ?? signal.updatedAt;\n}\n\ntype CatalogSyncForceReason =\n | \"local_state_changed\"\n | \"register_conflict\"\n | \"stale_leases\";\n\ntype CatalogSyncInput = {\n forceReason?: CatalogSyncForceReason;\n};\n\ntype RouteCatalogSyncInvoker = (\n reason: string\n) => Promise<RouteCatalogSyncResult>;\n\ntype PendingRouteCatalogSyncRequest = {\n reason: string;\n reject: (error: Error) => void;\n resolve: (result: RouteCatalogSyncResult) => void;\n};\n\nconst HEARTBEAT_RUNTIME_STATE_WRITE_TIMEOUT_MS = HEARTBEAT_RESPONSE_TIMEOUT_MS;\ntype DaemonSocketDisconnectClass =\n | \"abnormal_socket_close\"\n | \"normal_shutdown\"\n | \"possible_deploy_or_edge_restart\";\n\n// Post-register bootstrap policy for one socket session. With a resolved\n// catalog the session persists the accepted catalog to the recovery cache and\n// waits a normal sync interval. With an unresolved boot placeholder it must\n// never persist (an empty write clears the recovery cache) and resolves the\n// real catalog immediately instead of waiting a full interval.\nexport function resolveBootstrapCatalogSyncPlan(input: {\n isRouteCatalogResolved: boolean;\n syncIntervalMs: number;\n}): {\n nextSyncDelayMs: number;\n persistCache: boolean;\n} {\n if (input.isRouteCatalogResolved) {\n return {\n nextSyncDelayMs: input.syncIntervalMs,\n persistCache: true,\n };\n }\n return {\n nextSyncDelayMs: 0,\n persistCache: false,\n };\n}\n\nfunction projectRouteCatalogSyncPayload(input: {\n knownProfileIds: readonly string[];\n result: RouteCatalogSyncResult;\n}): OpenMeldDaemonSyncRouteCatalogPayload {\n const { result } = input;\n if (result.status === \"failed\") {\n return {\n accepted: false,\n errorMessage: result.errorMessage,\n profileIds: [...input.knownProfileIds],\n syncStatus: \"failed\",\n };\n }\n if (result.status === \"changed\") {\n return {\n accepted: true,\n addedProfileIds: result.diff.addedProfileIds,\n keptProfileIds: result.diff.keptProfileIds,\n profileIds: result.registerResponse.acceptedLeases.map(\n (lease) => lease.profileId\n ),\n removedProfileIds: result.diff.removedProfileIds,\n skippedProfiles: result.skippedProfiles,\n syncStatus: \"changed\",\n };\n }\n if (result.status === \"registered\") {\n return {\n accepted: true,\n profileIds: result.registerResponse.acceptedLeases.map(\n (lease) => lease.profileId\n ),\n skippedProfiles: result.skippedProfiles,\n syncStatus: \"registered\",\n };\n }\n return {\n accepted: true,\n profileIds: [...input.knownProfileIds],\n skippedProfiles: result.skippedProfiles,\n syncStatus: \"unchanged\",\n };\n}\n\nfunction classifyDaemonSocketDisconnect(input: {\n closeCode: number;\n closeReason: string;\n}): DaemonSocketDisconnectClass {\n if (input.closeCode === 1000 || input.closeCode === 1001) {\n return \"normal_shutdown\";\n }\n if (input.closeCode === 1006) {\n return \"possible_deploy_or_edge_restart\";\n }\n return \"abnormal_socket_close\";\n}\n\nfunction _replayStartupResultsBeforeDispatchAdmission(input: {\n currentSocketRef: CurrentDaemonSocketRef;\n ledgerPaths: LedgerPaths;\n onAdmissionOpen: (replayedResultCount: number) => void;\n presenter: Presenter;\n shouldOpenAdmission: () => boolean;\n waitForClose: Promise<void>;\n}): boolean {\n const recordKeys = listDispatchResultOutboxPendingAcknowledgementKeys({\n ledgerPaths: input.ledgerPaths,\n });\n const abortController = new AbortController();\n input.waitForClose.then(() => {\n abortController.abort();\n });\n const replayCompleted = waitForDispatchResultOutboxAcknowledgement({\n abortSignal: abortController.signal,\n ledgerPaths: input.ledgerPaths,\n recordKeys,\n });\n flushDispatchResultOutbox({\n currentSocketRef: input.currentSocketRef,\n ledgerPaths: input.ledgerPaths,\n presenter: input.presenter,\n });\n if (recordKeys.length === 0) {\n return true;\n }\n replayCompleted.then(() => {\n if (input.shouldOpenAdmission()) {\n input.onAdmissionOpen(recordKeys.length);\n }\n });\n return false;\n}\n\nfunction handleComputerFileAccessSocketFrame(input: {\n computerFileAccessStorePath: string;\n deviceId: string;\n frame: ParsedDaemonFrame;\n presenter: Presenter;\n socket: WsClient;\n}): boolean {\n if (!input.frame.code.startsWith(\"daemon.computer_file_access.\")) {\n return false;\n }\n const parsed = computerFileAccessDaemonFrameSchema.safeParse(input.frame);\n if (\n !parsed.success ||\n (parsed.data.code !== \"daemon.computer_file_access.read_policy\" &&\n parsed.data.code !== \"daemon.computer_file_access.update_policy\")\n ) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.computer_file_access_failed\",\n text: \"Computer file access request was invalid.\",\n });\n return true;\n }\n handleComputerFileAccessFrame({\n deviceId: input.deviceId,\n frame: parsed.data,\n storePath: input.computerFileAccessStorePath,\n })\n .then((resultFrame) => input.socket.send(JSON.stringify(resultFrame)))\n .catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.computer_file_access_failed\",\n text: `Computer file access failed: ${toErrorMessage(error)}`,\n });\n });\n return true;\n}\n\nfunction handleLocalProjectControlSocketFrame(input: {\n deviceId: string;\n frame: ParsedDaemonFrame;\n onLocalProjectConnectionsChanged?: () => void;\n presenter: Presenter;\n socket: WsClient;\n}): boolean {\n if (!input.frame.code.startsWith(\"daemon.local_project_control.\")) {\n return false;\n }\n handleLocalProjectControlFrame({\n deviceId: input.deviceId,\n frame: input.frame,\n })\n .then((resultFrame) => {\n input.socket.send(JSON.stringify(resultFrame));\n if (!didLocalProjectConnectionsChange(resultFrame)) {\n return;\n }\n try {\n input.onLocalProjectConnectionsChanged?.();\n } catch (error) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.agent_activity_connection_signal_failed\",\n text: `Agent Activity connection signal failed: ${toErrorMessage(error)}`,\n });\n }\n })\n .catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_project_control_failed\",\n text: `local Project control failed: ${toErrorMessage(error)}`,\n });\n });\n return true;\n}\n\nfunction handleLocalFolderPickerSocketFrame(input: {\n deviceId: string;\n frame: ParsedDaemonFrame;\n presenter: Presenter;\n selectLocalFolders?: SelectLocalFolders;\n socket: WsClient;\n}): boolean {\n if (!input.frame.code.startsWith(\"daemon.local_folder_picker.\")) {\n return false;\n }\n const parsed = localFolderPickerDaemonFrameSchema.safeParse(input.frame);\n if (\n !parsed.success ||\n parsed.data.code !== \"daemon.local_folder_picker.select_folders\"\n ) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_folder_picker_failed\",\n text: \"Local Folder Picker request was invalid.\",\n });\n return true;\n }\n const selectLocalFolders: SelectLocalFolders =\n input.selectLocalFolders ??\n (async () => ({\n code: \"local.folder_picker.helper_missing\",\n message:\n \"Update or repair OpenMeld Service to choose folders on this computer.\",\n status: \"unavailable\",\n }));\n handleLocalFolderPickerFrame({\n deviceId: input.deviceId,\n frame: parsed.data,\n selectFolders: selectLocalFolders,\n })\n .then((resultFrame) => input.socket.send(JSON.stringify(resultFrame)))\n .catch(() => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_folder_picker_failed\",\n text: \"Local Folder Picker failed.\",\n });\n });\n return true;\n}\n\nexport async function runDaemonSocketSession(input: {\n executionHost: ExecutionHostPort;\n computerFileAccessStorePath: string;\n daemonSessionId: string;\n deviceId: string;\n serviceContractGeneration?: number;\n foregroundActive: boolean;\n heartbeatIntervalMs: number;\n // Boot-time placeholder support: while the route catalog is unresolved the\n // session registers the placeholder (lease-neutral on a fresh session),\n // skips cache persistence, and schedules an immediate catalog sync instead\n // of waiting a full interval.\n isRouteCatalogResolved?: () => boolean;\n loadRouteCatalog: () => Promise<RouteCatalog>;\n localComponentsObservation: ServiceLocalComponentsObservation;\n lane: string;\n ownerUserId: string;\n onRuntimeReportingAuthenticationFailure?: (\n failure: RuntimeReportingAuthenticationFailure\n ) => Promise<void> | void;\n onAgentActivitySessionsChanged?: () => void;\n onLocalProjectConnectionsChanged?: () => void;\n openMeldToolsUpdateCoordinator?: OpenMeldToolsUpdateCoordinator;\n presenter: Presenter;\n persistRouteCatalogCache?: (catalog: RouteCatalog) => Promise<void>;\n reconnectAttempt: number;\n routeCatalogState: MutableRouteCatalogState;\n selectLocalFolders?: SelectLocalFolders;\n shutdownRequested?: Promise<RuntimeTransportStopCause>;\n socket: WsClient;\n attachRouteCatalogSyncInvoker?: (\n invoker: RouteCatalogSyncInvoker | null\n ) => void;\n touchRuntimeState: (\n state: Partial<{\n heartbeatAt: string | null;\n updatedAt: string;\n stopRequestedAt: string | null;\n }>\n ) => Promise<void>;\n}): Promise<void> {\n // OPENMELD_SERVICE_THIN_CORE: socket-session carrier.\n // The session registers this local runtime, sends heartbeat/capability\n // evidence, receives RuntimeCoordinator-backed deliveries, and reports local\n // execution evidence. Readiness and final outcome remain upstream-owned.\n const leasesByProfileId = new Map<string, number>();\n const waiters: PendingFrameWaiters = {\n heartbeatResolver: null,\n heartbeatRejecter: null,\n registerResolver: null,\n registerRejecter: null,\n };\n\n let closed = false;\n let closeCode = 1000;\n let closeReason = \"closed\";\n const socketConnectedAtMs = Date.now();\n let heartbeatInFlight = false;\n // Admission may change again before the current heartbeat is acknowledged.\n // Retain only the need to republish; the next send reads the current state.\n let admissionHeartbeatPending = false;\n const heartbeatIdleWaiters: Array<() => void> = [];\n // A replacement session must replay every durable result that survived the\n // previous process before it can accept new work. The existing heartbeat\n // admission bit doubles as that startup fence without adding a second source\n // of session readiness.\n let acceptingDispatches = false;\n let shutdownStopCause: RuntimeTransportStopCause | null = null;\n let controlledShutdownCompleted = false;\n let routeCatalogSyncInFlight = false;\n let heartbeatTimer: NodeJS.Timeout | null = null;\n let heartbeatTimerDueAtMs: number | null = null;\n const keepalive = createDaemonStreamKeepalive({\n onPongTimeout: () => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.keepalive_pong_timeout\",\n text: \"daemon stream keepalive PONG missing; terminating half-open socket for reconnect\",\n payload: {\n connectionGeneration: activeConnectionGeneration,\n daemonSessionId: input.daemonSessionId,\n },\n });\n input.socket.terminate();\n },\n sendPing: () => {\n if (closed) {\n return false;\n }\n input.socket.send(DAEMON_STREAM_KEEPALIVE_PING);\n return true;\n },\n });\n let lastDispatchActivityAtMs: number | null = null;\n let lastHeartbeatSentAtMs: number | null = null;\n let consecutiveHeartbeatFailures = 0;\n let catalogSyncSignalTimer: NodeJS.Timeout | null = null;\n let currentHeartbeatIntervalMs = normalizeHeartbeatIntervalMs(\n input.heartbeatIntervalMs\n );\n let activeConnectionGeneration = Math.max(1, input.reconnectAttempt + 1);\n let nextCatalogSyncAtMs = 0;\n let nextProviderConversationProofSyncAtMs = 0;\n let nextRuntimeAgentControllerReportSyncAtMs = 0;\n let forceFreshAgentControllerProbes = false;\n let providerConversationProofSyncInFlight = false;\n let runtimeAgentControllerReportSyncPromise: Promise<LocalServiceRuntimeAgentControllerReportSyncResult> | null =\n null;\n let pendingFreshAgentControllerReportSyncPromise: Promise<LocalServiceRuntimeAgentControllerReportSyncResult> | null =\n null;\n let latestCatalogSyncStatus:\n | RouteCatalogSyncResult[\"status\"]\n | \"skipped\"\n | null = null;\n let latestSkippedProfilesFingerprint: string | null = null;\n let latestCatalogSyncSignalMarker: string | null = null;\n let forceCatalogSyncReason: CatalogSyncForceReason | null = null;\n let pendingLocalExecutionEvidenceRefreshReason: CatalogSyncForceReason | null =\n null;\n const pendingRouteCatalogSyncRequests: PendingRouteCatalogSyncRequest[] = [];\n const reportHostFailure = (error: unknown) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.execution_host_unavailable\",\n text: `Execution host unavailable: ${toErrorMessage(error)}`,\n });\n };\n const hostLink = createExecutionHostSocketLink({\n host: input.executionHost,\n socket: input.socket,\n onAdmissionChanged: () => {\n acceptingDispatches = !shutdownStopCause && hostLink.canAccept();\n if (heartbeatInFlight || lastHeartbeatSentAtMs !== null) {\n scheduleHeartbeat({\n delayMs: 0,\n reason: \"execution_host_admission_changed\",\n });\n }\n },\n onInvalidation: (scope) => {\n if (scope === \"routes\") {\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"host_routes_changed\",\n });\n }\n if (scope === \"activity\") {\n input.onAgentActivitySessionsChanged?.();\n }\n },\n onAuthenticationFailure: (failure) => {\n Promise.resolve(\n input.onRuntimeReportingAuthenticationFailure?.(failure)\n ).catch(reportHostFailure);\n },\n onError: reportHostFailure,\n });\n const configureHostConnection = async () => {\n if (!executionAdmissionSupported) {\n reportHostFailure(\n new Error(\n \"The server does not support execution admission confirmation. New tasks remain unavailable.\"\n )\n );\n return;\n }\n await hostLink.configure({\n executionAdmissionConfirmation: executionAdmissionSupported,\n connectionGeneration: activeConnectionGeneration,\n catalogRevision:\n input.routeCatalogState.executionHostCatalogRevision ?? 0,\n leases: [...leasesByProfileId].map(([profileId, leaseEpoch]) => ({\n profileId,\n leaseEpoch,\n })),\n });\n };\n\n const waitForClose = new Promise<void>((resolve) => {\n input.socket.onClose((code, reason) => {\n closed = true;\n admissionHeartbeatPending = false;\n clearHeartbeatTimer();\n hostLink.detach().catch(reportHostFailure);\n closeCode = code;\n closeReason = normalizeText(reason) || \"closed\";\n const closedAtMs = Date.now();\n const durationMs = Math.max(0, closedAtMs - socketConnectedAtMs);\n const disconnectClass = classifyDaemonSocketDisconnect({\n closeCode,\n closeReason,\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.socket_closed\",\n text: `daemon stream socket closed (code=${String(closeCode)}, reason=${closeReason})`,\n payload: {\n abnormalClosure: closeCode !== 1000 && closeCode !== 1001,\n closeCode,\n closeReason,\n connectionGeneration: activeConnectionGeneration,\n daemonSessionId: input.daemonSessionId,\n deployAdjacentReason:\n disconnectClass === \"possible_deploy_or_edge_restart\"\n ? \"websocket_1006_abnormal_close\"\n : null,\n disconnectClass,\n durationMs,\n inflightDispatchCount:\n input.executionHost.snapshot()?.activeCount ?? 0,\n socketConnectedAtMs,\n socketDisconnectedAtMs: closedAtMs,\n },\n });\n const closeError = new DaemonServiceRunError({\n code: \"daemon.run.socket_closed\",\n message: `daemon stream closed (code=${String(closeCode)}, reason=${closeReason})`,\n });\n waiters.registerRejecter?.(closeError);\n waiters.heartbeatRejecter?.(closeError);\n failPendingRouteCatalogSyncRequests(closeError);\n resolve();\n });\n });\n\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.socket_connected\",\n text: `daemon stream connected (reconnectAttempt=${String(input.reconnectAttempt)})`,\n payload: {\n connectedAtMs: socketConnectedAtMs,\n daemonSessionId: input.daemonSessionId,\n reconnectAttempt: input.reconnectAttempt,\n },\n });\n\n const clearHeartbeatTimer = (): void => {\n if (!heartbeatTimer) {\n return;\n }\n clearTimeout(heartbeatTimer);\n heartbeatTimer = null;\n heartbeatTimerDueAtMs = null;\n };\n\n const resolvePendingRouteCatalogSyncRequests = (\n result: RouteCatalogSyncResult\n ): void => {\n const pending = pendingRouteCatalogSyncRequests.splice(\n 0,\n pendingRouteCatalogSyncRequests.length\n );\n for (const request of pending) {\n request.resolve(result);\n }\n };\n\n const failPendingRouteCatalogSyncRequests = (error: Error): void => {\n const pending = pendingRouteCatalogSyncRequests.splice(\n 0,\n pendingRouteCatalogSyncRequests.length\n );\n for (const request of pending) {\n request.reject(error);\n }\n };\n\n const requestLocalExecutionEvidenceRefresh = (inputRequest: {\n reason: CatalogSyncForceReason;\n scheduleReason: string;\n }): void => {\n forceCatalogSyncReason = inputRequest.reason;\n nextCatalogSyncAtMs = 0;\n nextProviderConversationProofSyncAtMs = 0;\n nextRuntimeAgentControllerReportSyncAtMs = 0;\n // Local state changed or the user asked for a check: the next controller\n // report sync must probe for real instead of reusing background snapshots.\n forceFreshAgentControllerProbes = true;\n if (routeCatalogSyncInFlight) {\n pendingLocalExecutionEvidenceRefreshReason = inputRequest.reason;\n }\n // A catalog change is independent of renewing the old leases. Waiting for\n // a heartbeat (including its local maintenance checks) strands new routes\n // while Core is already waiting to admit their first Wake.\n startRouteCatalogSyncIfDue();\n scheduleHeartbeat({\n delayMs: 0,\n reason: inputRequest.scheduleReason,\n });\n };\n\n const requestRouteCatalogSync: RouteCatalogSyncInvoker = async (reason) => {\n if (closed) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.socket_closed\",\n message: \"daemon stream is not connected\",\n });\n }\n return await new Promise<RouteCatalogSyncResult>((resolve, reject) => {\n pendingRouteCatalogSyncRequests.push({\n reason: normalizeText(reason) || \"local_state_changed\",\n reject,\n resolve,\n });\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"catalog_sync_signal\",\n });\n });\n };\n input.attachRouteCatalogSyncInvoker?.(requestRouteCatalogSync);\n\n function schedulePendingLocalExecutionEvidenceRefreshIfNeeded(): void {\n const pendingRefreshReason = pendingLocalExecutionEvidenceRefreshReason;\n if (closed || routeCatalogSyncInFlight || !pendingRefreshReason) {\n return;\n }\n\n pendingLocalExecutionEvidenceRefreshReason = null;\n forceCatalogSyncReason = pendingRefreshReason;\n nextCatalogSyncAtMs = 0;\n nextProviderConversationProofSyncAtMs = 0;\n nextRuntimeAgentControllerReportSyncAtMs = 0;\n forceFreshAgentControllerProbes = true;\n startRouteCatalogSyncIfDue();\n scheduleHeartbeat({\n delayMs: 0,\n reason: \"pending_local_execution_evidence_refresh\",\n });\n }\n\n function recordHeartbeatFailure(error: unknown): boolean {\n consecutiveHeartbeatFailures += 1;\n const shouldCloseSocket =\n consecutiveHeartbeatFailures >=\n HEARTBEAT_CONSECUTIVE_FAILURES_BEFORE_CLOSE;\n const errorMessage = toErrorMessage(error);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.heartbeat_failed\",\n text: `heartbeat failed (${String(consecutiveHeartbeatFailures)}/${String(HEARTBEAT_CONSECUTIVE_FAILURES_BEFORE_CLOSE)}): ${errorMessage}`,\n payload: {\n closeSocket: shouldCloseSocket,\n connectionGeneration: activeConnectionGeneration,\n daemonSessionId: input.daemonSessionId,\n error: errorMessage,\n errorCode: error instanceof DaemonServiceRunError ? error.code : null,\n failureCount: consecutiveHeartbeatFailures,\n failureLimit: HEARTBEAT_CONSECUTIVE_FAILURES_BEFORE_CLOSE,\n },\n });\n return shouldCloseSocket;\n }\n\n function resolveSuccessfulHeartbeatSchedule(): {\n hasDispatchActivity: boolean;\n reason: \"controlled_shutdown\" | \"dispatch_active\" | \"idle_growth\";\n } {\n if (!acceptingDispatches) {\n return {\n hasDispatchActivity: true,\n reason: \"controlled_shutdown\",\n };\n }\n const hadDispatchActivity =\n lastDispatchActivityAtMs !== null &&\n (lastHeartbeatSentAtMs === null ||\n lastDispatchActivityAtMs > lastHeartbeatSentAtMs);\n if (\n hadDispatchActivity ||\n (input.executionHost.snapshot()?.activeCount ?? 0) > 0\n ) {\n return {\n hasDispatchActivity: true,\n reason: \"dispatch_active\",\n };\n }\n return {\n hasDispatchActivity: false,\n reason: \"idle_growth\",\n };\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: One ordered transaction owns heartbeat response, cadence, retry, and pending admission publication.\n async function sendHeartbeat(\n options: {\n advanceIdleCadence?: boolean;\n publishAdmissionAfterInFlight?: boolean;\n } = {}\n ): Promise<void> {\n if (closed) {\n return;\n }\n if (heartbeatInFlight) {\n if (options.publishAdmissionAfterInFlight) {\n admissionHeartbeatPending = true;\n }\n return;\n }\n heartbeatInFlight = true;\n try {\n const leases: RuntimeTransportLease[] = Array.from(\n leasesByProfileId.entries()\n )\n .map(([profileId, leaseEpoch]) => ({\n profileId,\n leaseEpoch,\n }))\n .sort((left, right) => left.profileId.localeCompare(right.profileId));\n const localComponentsStatus = readSessionLocalComponentsStatus();\n const heartbeatRequest = runtimeTransportHeartbeatRequestSchema.safeParse(\n {\n v: RUNTIME_TRANSPORT_SCHEMA_VERSION,\n ownerUserId: input.ownerUserId,\n deviceId: input.deviceId,\n lane: input.lane,\n daemonSessionId: input.daemonSessionId,\n ...buildShutdownHeartbeatFacts({\n acceptingDispatches,\n stopCause: shutdownStopCause,\n }),\n serviceVersion,\n leases,\n runtimeContract: {\n epoch: DAEMON_RUNTIME_CONTRACT_EPOCH,\n },\n capabilities: {\n ...resolveDaemonCapabilitiesFromAdapterIds({\n adapterIds: input.executionHost.snapshot()?.adapterIds ?? [],\n localComponentsStatus,\n profileConfigurationRevision:\n hasCompleteProfileConfigurationRevisions(\n input.routeCatalogState\n ),\n }),\n ...(computerCareSupported && input.executionHost.observation\n ? { executionHost: input.executionHost.observation() }\n : {}),\n },\n sentAtMs: Date.now(),\n }\n );\n if (!heartbeatRequest.success) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.heartbeat_payload_invalid\",\n message: \"invalid heartbeat payload\",\n });\n }\n\n sendDaemonFrame(input.socket, {\n code: \"daemon.session.heartbeat\",\n payload: heartbeatRequest.data,\n });\n\n const heartbeatResponse = await waitForHeartbeatResponse({\n timeoutMs: HEARTBEAT_RESPONSE_TIMEOUT_MS,\n waiters,\n });\n pruneStaleLeases({\n leasesByProfileId,\n staleLeases: heartbeatResponse.staleLeases,\n });\n if (heartbeatResponse.staleLeases.length > 0) {\n forceCatalogSyncReason = \"stale_leases\";\n nextCatalogSyncAtMs = 0;\n }\n const heartbeatAt = nowIsoString();\n await withDaemonRunTimeout({\n code: \"daemon.run.heartbeat_runtime_state_timeout\",\n message: `heartbeat runtime state write timed out after ${String(\n HEARTBEAT_RUNTIME_STATE_WRITE_TIMEOUT_MS\n )}ms`,\n operation: input.touchRuntimeState({\n heartbeatAt,\n updatedAt: heartbeatAt,\n }),\n timeoutMs: HEARTBEAT_RUNTIME_STATE_WRITE_TIMEOUT_MS,\n });\n hostLink.heartbeat(\n heartbeatResponse.staleLeases.map((lease) => lease.profileId)\n );\n consecutiveHeartbeatFailures = 0;\n\n const heartbeatSchedule = resolveSuccessfulHeartbeatSchedule();\n // Host admission changes require immediate publication, but are not an\n // elapsed idle interval. Otherwise one extra readiness ACK can double\n // the cadence and starve a scheduled controller-report retry.\n const nextIntervalWithoutJitter =\n options.advanceIdleCadence === false &&\n !heartbeatSchedule.hasDispatchActivity\n ? currentHeartbeatIntervalMs\n : resolveAdaptiveHeartbeatIntervalMs({\n currentIntervalMs: currentHeartbeatIntervalMs,\n hasDispatchActivity: heartbeatSchedule.hasDispatchActivity,\n });\n updateHeartbeatInterval({\n nextIntervalMs: nextIntervalWithoutJitter,\n reason: heartbeatSchedule.reason,\n });\n const nextIntervalWithJitter = applyIntervalJitterMs({\n baseIntervalMs: currentHeartbeatIntervalMs,\n jitterRatio: ADAPTIVE_HEARTBEAT_JITTER_RATIO,\n maxIntervalMs: MAX_HEARTBEAT_INTERVAL_MS,\n minIntervalMs: MIN_HEARTBEAT_INTERVAL_MS,\n });\n scheduleHeartbeat({\n delayMs: nextIntervalWithJitter,\n reason: heartbeatSchedule.reason,\n });\n lastHeartbeatSentAtMs = Date.now();\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.heartbeat\",\n text: `heartbeat ok; active leases=${leasesByProfileId.size}, stale leases=${heartbeatResponse.staleLeases.length}, next=${String(currentHeartbeatIntervalMs)}ms`,\n });\n startRouteCatalogSyncIfDue();\n startSupplementalEvidenceSyncs();\n } catch (error) {\n if (recordHeartbeatFailure(error)) {\n admissionHeartbeatPending = false;\n input.socket.terminate();\n return;\n }\n updateHeartbeatInterval({\n nextIntervalMs: MIN_HEARTBEAT_INTERVAL_MS,\n reason: \"dispatch_activity\",\n });\n scheduleHeartbeat({\n delayMs: MIN_HEARTBEAT_INTERVAL_MS,\n reason: \"heartbeat_retry\",\n });\n } finally {\n heartbeatInFlight = false;\n const publishPendingAdmission = admissionHeartbeatPending;\n admissionHeartbeatPending = false;\n if (!closed && publishPendingAdmission) {\n scheduleHeartbeat({\n delayMs: 0,\n reason: \"execution_host_admission_changed\",\n });\n }\n resolveHeartbeatIdleWaiters(heartbeatIdleWaiters);\n schedulePendingLocalExecutionEvidenceRefreshIfNeeded();\n }\n }\n\n function waitForHeartbeatIdle(): Promise<void> {\n if (!heartbeatInFlight) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n heartbeatIdleWaiters.push(resolve);\n });\n }\n\n function scheduleHeartbeat(inputSchedule: {\n delayMs: number;\n reason: string;\n }): void {\n if (closed) {\n return;\n }\n const normalizedDelayMs = Math.max(0, Math.trunc(inputSchedule.delayMs));\n if (\n heartbeatInFlight &&\n inputSchedule.reason === \"execution_host_admission_changed\"\n ) {\n admissionHeartbeatPending = true;\n return;\n }\n const dueAtMs = Date.now() + normalizedDelayMs;\n if (\n heartbeatTimer &&\n heartbeatTimerDueAtMs !== null &&\n heartbeatTimerDueAtMs <= dueAtMs\n ) {\n return;\n }\n clearHeartbeatTimer();\n heartbeatTimerDueAtMs = dueAtMs;\n heartbeatTimer = setTimeout(() => {\n heartbeatTimer = null;\n heartbeatTimerDueAtMs = null;\n sendHeartbeat({\n advanceIdleCadence:\n inputSchedule.reason !== \"execution_host_admission_changed\",\n publishAdmissionAfterInFlight:\n inputSchedule.reason === \"execution_host_admission_changed\",\n }).catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.heartbeat_failed\",\n text: `heartbeat failed: ${toErrorMessage(error)}`,\n });\n });\n }, normalizedDelayMs);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.heartbeat_scheduled\",\n text: `heartbeat scheduled in ${String(normalizedDelayMs)}ms (${inputSchedule.reason})`,\n });\n }\n\n const updateHeartbeatInterval = (inputUpdate: {\n nextIntervalMs: number;\n reason:\n | \"controlled_shutdown\"\n | \"dispatch_activity\"\n | \"dispatch_active\"\n | \"idle_growth\";\n }): void => {\n const normalizedNextIntervalMs = normalizeHeartbeatIntervalMs(\n inputUpdate.nextIntervalMs\n );\n if (normalizedNextIntervalMs === currentHeartbeatIntervalMs) {\n return;\n }\n const previousIntervalMs = currentHeartbeatIntervalMs;\n currentHeartbeatIntervalMs = normalizedNextIntervalMs;\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.heartbeat_interval_changed\",\n text: `heartbeat interval changed: ${String(previousIntervalMs)}ms -> ${String(normalizedNextIntervalMs)}ms (${inputUpdate.reason})`,\n payload: {\n fromMs: previousIntervalMs,\n reason: inputUpdate.reason,\n toMs: normalizedNextIntervalMs,\n },\n });\n };\n\n const scheduleCatalogSyncNext = (delayMs: number): void => {\n nextCatalogSyncAtMs = Date.now() + Math.max(0, Math.trunc(delayMs));\n };\n\n const clearCatalogSyncSignalTimer = (): void => {\n if (!catalogSyncSignalTimer) {\n return;\n }\n clearTimeout(catalogSyncSignalTimer);\n catalogSyncSignalTimer = null;\n };\n\n const scheduleCatalogSyncSignalPoll = (): void => {\n if (closed || catalogSyncSignalTimer) {\n return;\n }\n catalogSyncSignalTimer = setTimeout(() => {\n catalogSyncSignalTimer = null;\n pollCatalogSyncSignal()\n .catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_signal_read_failed\",\n text: `catalog sync signal read failed: ${toErrorMessage(error)}`,\n });\n })\n .finally(() => {\n scheduleCatalogSyncSignalPoll();\n });\n }, CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS);\n };\n\n const pollCatalogSyncSignal = async (): Promise<void> => {\n const signal = await readDaemonCatalogSyncSignal();\n if (!signal) {\n return;\n }\n const signalMarker = resolveCatalogSyncSignalMarker(signal);\n if (signalMarker === latestCatalogSyncSignalMarker) {\n return;\n }\n latestCatalogSyncSignalMarker = signalMarker;\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"catalog_sync_signal\",\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_signal_detected\",\n text: `catalog sync signal detected (${signal.reason}); scheduling immediate heartbeat`,\n payload: {\n reason: signal.reason,\n updatedAt: signal.updatedAt,\n },\n });\n };\n\n let hasLoggedWaitingForProfiles =\n (input.isRouteCatalogResolved?.() ?? true) &&\n input.routeCatalogState.profileIds.length === 0;\n const serviceVersion = OPENMELD_VERSION;\n let computerCareSupported = false;\n let executionAdmissionSupported = false;\n\n const readSessionLocalComponentsStatus = (): LocalComponentsStatus | null =>\n input.localComponentsObservation.read(() => {\n if (lastHeartbeatSentAtMs !== null) {\n scheduleHeartbeat({ delayMs: 0, reason: \"local_components_refreshed\" });\n }\n });\n\n const registerDaemonSession = async (\n routeCatalog: RouteCatalog\n ): Promise<RuntimeTransportRegisterSessionResponse> => {\n const connectionGeneration = Math.max(1, input.reconnectAttempt + 1);\n const localComponentsStatus = readSessionLocalComponentsStatus();\n const registerPayload =\n runtimeTransportRegisterSessionRequestSchema.safeParse({\n v: RUNTIME_TRANSPORT_SCHEMA_VERSION,\n ownerUserId: input.ownerUserId,\n deviceId: input.deviceId,\n lane: input.lane,\n daemonSessionId: input.daemonSessionId,\n serviceVersion,\n connectionGeneration,\n profileIds: routeCatalog.profileIds,\n localWakeRouteReport: createLocalWakeRouteReport({\n daemonSessionId: input.daemonSessionId,\n deviceId: input.deviceId,\n lane: input.lane,\n reportedAtMs: Date.now(),\n routeCatalog,\n serviceVersion,\n }),\n capabilities: resolveDaemonCapabilitiesFromAdapterIds({\n adapterIds: input.executionHost.snapshot()?.adapterIds ?? [],\n localComponentsStatus,\n profileConfigurationRevision:\n hasCompleteProfileConfigurationRevisions(routeCatalog),\n }),\n runtimeContract: {\n epoch: DAEMON_RUNTIME_CONTRACT_EPOCH,\n },\n connectedAtMs: Date.now(),\n });\n if (!registerPayload.success) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.register_payload_invalid\",\n message: \"invalid register payload\",\n });\n }\n\n sendDaemonFrame(input.socket, {\n code: \"daemon.session.register\",\n payload: registerPayload.data,\n });\n\n const response = await waitForRegisterResponse({\n timeoutMs: REGISTER_RESPONSE_TIMEOUT_MS,\n waiters,\n });\n computerCareSupported = response.computerCare === true;\n executionAdmissionSupported =\n response.executionAdmissionConfirmation === true;\n return response;\n };\n\n const resolveCatalogSyncForcePayload = (\n inputSync?: CatalogSyncInput\n ): { forceReason: CatalogSyncForceReason } | undefined =>\n inputSync?.forceReason ? { forceReason: inputSync.forceReason } : undefined;\n\n const scheduleNextCatalogSync = (): void => {\n scheduleCatalogSyncNext(\n resolveCatalogSyncIntervalMs({\n heartbeatIntervalMs: currentHeartbeatIntervalMs,\n })\n );\n };\n\n const resetWaitingForProfilesTracking = (): void => {\n hasLoggedWaitingForProfiles = false;\n latestSkippedProfilesFingerprint = null;\n };\n\n const emitSkippedProfilesIfNeeded = (\n syncResult: Extract<\n RouteCatalogSyncResult,\n { status: \"changed\" | \"unchanged\" }\n >,\n inputSync?: CatalogSyncInput\n ): void => {\n const skippedProfilesLogState = resolveCatalogSyncSkippedProfilesLogState({\n hasProfiles: input.routeCatalogState.profileIds.length > 0,\n latestFingerprint: latestSkippedProfilesFingerprint,\n skippedProfiles: syncResult.skippedProfiles,\n });\n latestSkippedProfilesFingerprint = skippedProfilesLogState.fingerprint;\n if (!skippedProfilesLogState.shouldEmit) {\n return;\n }\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.waiting_for_profiles_reasons\",\n text: `eligible local profiles are still empty; skipped=${syncResult.skippedProfiles.length} (${summarizeSkippedDaemonProfiles(syncResult.skippedProfiles)})`,\n payload: {\n ...resolveCatalogSyncForcePayload(inputSync),\n skippedProfiles: syncResult.skippedProfiles,\n },\n });\n };\n\n const persistAcceptedRouteCatalogCache = async (): Promise<void> => {\n if (!input.persistRouteCatalogCache) {\n return;\n }\n await input.persistRouteCatalogCache(\n createRouteCatalogFromMutableState(input.routeCatalogState)\n );\n };\n\n const handleChangedCatalogSync = async (\n syncResult: Extract<RouteCatalogSyncResult, { status: \"changed\" }>,\n inputSync?: CatalogSyncInput\n ): Promise<void> => {\n latestCatalogSyncStatus = \"changed\";\n const rejectedProfileIds = syncResult.registerResponse.rejectedProfiles.map(\n (item) => item.profileId\n );\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_changed\",\n text: `catalog sync changed: +${syncResult.diff.addedProfileIds.length} / -${syncResult.diff.removedProfileIds.length} / =${syncResult.diff.keptProfileIds.length}, accepted=${syncResult.registerResponse.acceptedLeases.length}, rejected=${syncResult.registerResponse.rejectedProfiles.length}`,\n payload: {\n ...syncResult.diff,\n acceptedProfileIds: syncResult.registerResponse.acceptedLeases.map(\n (lease) => lease.profileId\n ),\n ...resolveCatalogSyncForcePayload(inputSync),\n rejectedProfileIds,\n },\n });\n\n if (rejectedProfileIds.length > 0) {\n requestLocalExecutionEvidenceRefresh({\n reason: \"register_conflict\",\n scheduleReason: \"register_conflict\",\n });\n } else {\n await persistAcceptedRouteCatalogCache();\n scheduleNextCatalogSync();\n }\n\n if (input.routeCatalogState.profileIds.length > 0) {\n resetWaitingForProfilesTracking();\n return;\n }\n\n emitSkippedProfilesIfNeeded(syncResult, inputSync);\n if (hasLoggedWaitingForProfiles) {\n return;\n }\n\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.waiting_for_profiles\",\n text: \"no eligible local profiles yet; daemon will keep running and auto-register when profiles become available\",\n });\n hasLoggedWaitingForProfiles = true;\n };\n\n const handleRegisteredCatalogSync = async (\n syncResult: Extract<RouteCatalogSyncResult, { status: \"registered\" }>,\n inputSync?: CatalogSyncInput\n ): Promise<void> => {\n latestCatalogSyncStatus = \"registered\";\n const rejectedProfileIds = syncResult.registerResponse.rejectedProfiles.map(\n (item) => item.profileId\n );\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_registered\",\n text: `catalog sync re-registered; accepted=${syncResult.registerResponse.acceptedLeases.length}, rejected=${syncResult.registerResponse.rejectedProfiles.length}`,\n payload: {\n acceptedProfileIds: syncResult.registerResponse.acceptedLeases.map(\n (lease) => lease.profileId\n ),\n ...resolveCatalogSyncForcePayload(inputSync),\n rejectedProfileIds,\n },\n });\n\n if (rejectedProfileIds.length > 0) {\n requestLocalExecutionEvidenceRefresh({\n reason: \"register_conflict\",\n scheduleReason: \"register_conflict\",\n });\n return;\n }\n\n if (input.routeCatalogState.profileIds.length > 0) {\n resetWaitingForProfilesTracking();\n }\n await persistAcceptedRouteCatalogCache();\n scheduleNextCatalogSync();\n };\n\n const handleUnchangedCatalogSync = (\n syncResult: Extract<RouteCatalogSyncResult, { status: \"unchanged\" }>,\n inputSync?: CatalogSyncInput\n ): void => {\n if (latestCatalogSyncStatus !== \"unchanged\") {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_unchanged\",\n text: `catalog sync unchanged; profiles=${input.routeCatalogState.profileIds.length}`,\n payload: resolveCatalogSyncForcePayload(inputSync),\n });\n }\n\n emitSkippedProfilesIfNeeded(syncResult, inputSync);\n latestCatalogSyncStatus = \"unchanged\";\n scheduleNextCatalogSync();\n };\n\n const handleFailedCatalogSync = (\n syncResult: Extract<RouteCatalogSyncResult, { status: \"failed\" }>\n ): void => {\n latestCatalogSyncStatus = \"failed\";\n latestSkippedProfilesFingerprint = null;\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_failed\",\n text: `catalog sync failed (${syncResult.reason}): ${syncResult.errorMessage}`,\n });\n scheduleCatalogSyncNext(CATALOG_SYNC_RETRY_INTERVAL_MS);\n };\n\n const runCatalogSync = async (\n inputSync?: CatalogSyncInput\n ): Promise<void> => {\n const syncResult = await syncDaemonRouteCatalogState({\n catalogState: input.routeCatalogState,\n forceRegister: Boolean(inputSync?.forceReason),\n leasesByProfileId,\n loadCatalog: input.loadRouteCatalog,\n registerCatalog: registerDaemonSession,\n });\n\n if (syncResult.status !== \"failed\") {\n await configureHostConnection();\n }\n\n if (syncResult.status === \"changed\") {\n await handleChangedCatalogSync(syncResult, inputSync);\n resolvePendingRouteCatalogSyncRequests(syncResult);\n return;\n }\n\n if (syncResult.status === \"registered\") {\n await handleRegisteredCatalogSync(syncResult, inputSync);\n resolvePendingRouteCatalogSyncRequests(syncResult);\n return;\n }\n\n if (syncResult.status === \"unchanged\") {\n handleUnchangedCatalogSync(syncResult, inputSync);\n resolvePendingRouteCatalogSyncRequests(syncResult);\n return;\n }\n\n handleFailedCatalogSync(syncResult);\n resolvePendingRouteCatalogSyncRequests(syncResult);\n };\n\n const shouldStartRouteCatalogSync = (): boolean =>\n Boolean(forceCatalogSyncReason) || Date.now() >= nextCatalogSyncAtMs;\n\n function startRouteCatalogSyncIfDue(): void {\n if (closed || routeCatalogSyncInFlight || !shouldStartRouteCatalogSync()) {\n return;\n }\n\n routeCatalogSyncInFlight = true;\n syncRouteCatalogIfDue()\n .catch((error) => {\n const syncError =\n error instanceof Error ? error : new Error(toErrorMessage(error));\n failPendingRouteCatalogSyncRequests(syncError);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_failed\",\n text: `catalog sync failed: ${toErrorMessage(error)}`,\n });\n })\n .finally(() => {\n routeCatalogSyncInFlight = false;\n schedulePendingLocalExecutionEvidenceRefreshIfNeeded();\n });\n }\n\n async function syncRouteCatalogIfDue(): Promise<void> {\n const forceReason = forceCatalogSyncReason;\n const nowMs = Date.now();\n if (!forceReason && nowMs < nextCatalogSyncAtMs) {\n if (latestCatalogSyncStatus !== \"skipped\") {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_skipped\",\n text: `catalog sync skipped; next sync in ${String(\n Math.max(0, nextCatalogSyncAtMs - nowMs)\n )}ms`,\n });\n }\n latestCatalogSyncStatus = \"skipped\";\n return;\n }\n\n forceCatalogSyncReason = null;\n await runCatalogSync(forceReason ? { forceReason } : undefined);\n }\n\n const runRuntimeAgentControllerReportSync = async (\n probePolicy: \"background\" | \"fresh\"\n ): Promise<LocalServiceRuntimeAgentControllerReportSyncResult> => {\n try {\n const result = await input.executionHost.call(\"reportControllers\", {\n probePolicy,\n });\n const retryInMs =\n result.failedCount > 0\n ? RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS\n : RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS;\n // A controller check that just failed must not wait for the normal report\n // cadence before trying again. Bring the next pass forward once to\n // re-probe it for real (serially, so simultaneous failures stagger their\n // cold starts) while healthy controllers reuse held snapshots. The arm is\n // consumed here so it fires at most once even if the controller later\n // leaves the ready state and is never re-probed. This only reschedules;\n // current Wake eligibility stays fail-closed until a check completes.\n nextRuntimeAgentControllerReportSyncAtMs =\n resolveNextRuntimeAgentControllerReportSyncAtMs({\n nowMs: Date.now(),\n baseRetryMs: retryInMs,\n hasArmedReprobe: result.hasArmedReprobe,\n });\n let reportSyncLineText: string;\n if (result.status === \"skipped\") {\n reportSyncLineText = `runtime agent controller report sync skipped; ${result.reasonCodes[0] ?? \"no reports\"}`;\n } else if (result.failedCount > 0) {\n reportSyncLineText = `runtime agent controller report sync incomplete; accepted=${result.submittedCount}, failed=${result.failedCount}, total=${result.reportCount}; retrying in ${String(retryInMs)}ms`;\n } else {\n reportSyncLineText = `runtime agent controller report sync submitted; accepted=${result.submittedCount}, failed=${result.failedCount}, total=${result.reportCount}`;\n }\n emitRunLine({\n presenter: input.presenter,\n code:\n result.failedCount > 0\n ? \"daemon.run.runtime_agent_controller_report_sync_failed\"\n : \"daemon.run.runtime_agent_controller_report_sync\",\n text: reportSyncLineText,\n payload: {\n failedCount: result.failedCount,\n reasonCodes: result.reasonCodes,\n reportCount: result.reportCount,\n retryInMs,\n status: result.status,\n submittedCount: result.submittedCount,\n },\n });\n return result;\n } catch (error) {\n nextRuntimeAgentControllerReportSyncAtMs =\n Date.now() + RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS;\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.runtime_agent_controller_report_sync_failed\",\n text: `runtime agent controller report sync failed: ${toErrorMessage(error)}`,\n });\n throw error;\n }\n };\n\n const startRuntimeAgentControllerReportSync = (\n probePolicy: \"background\" | \"fresh\"\n ): Promise<LocalServiceRuntimeAgentControllerReportSyncResult> => {\n const syncPromise = runRuntimeAgentControllerReportSync(probePolicy);\n runtimeAgentControllerReportSyncPromise = syncPromise;\n syncPromise\n .finally(() => {\n if (runtimeAgentControllerReportSyncPromise === syncPromise) {\n runtimeAgentControllerReportSyncPromise = null;\n }\n })\n .catch(() => undefined);\n return syncPromise;\n };\n\n const syncRuntimeAgentControllerReportsIfDue = async (): Promise<void> => {\n const nowMs = Date.now();\n if (\n runtimeAgentControllerReportSyncPromise ||\n nowMs < nextRuntimeAgentControllerReportSyncAtMs\n ) {\n return;\n }\n\n const probeFresh = forceFreshAgentControllerProbes;\n forceFreshAgentControllerProbes = false;\n try {\n await startRuntimeAgentControllerReportSync(\n probeFresh ? \"fresh\" : \"background\"\n );\n } catch {\n // The shared runner already emitted the failure with full context and\n // scheduled the bounded retry. Background heartbeats stay independent.\n }\n };\n\n const requestFreshRuntimeAgentControllerReportSync =\n async (): Promise<LocalServiceRuntimeAgentControllerReportSyncResult> => {\n if (pendingFreshAgentControllerReportSyncPromise) {\n return await pendingFreshAgentControllerReportSyncPromise;\n }\n\n const freshSyncPromise = (async () => {\n while (runtimeAgentControllerReportSyncPromise) {\n const activeSync = runtimeAgentControllerReportSyncPromise;\n try {\n await activeSync;\n } catch {\n // A manual check still gets its own fresh attempt after an earlier\n // background failure.\n }\n }\n forceFreshAgentControllerProbes = false;\n nextRuntimeAgentControllerReportSyncAtMs = 0;\n const result = await startRuntimeAgentControllerReportSync(\"fresh\");\n if (result.failedCount > 0) {\n throw new Error(\n `OpenMeld could not submit ${String(result.failedCount)} of ${String(result.reportCount)} local agent reports.`\n );\n }\n return result;\n })();\n pendingFreshAgentControllerReportSyncPromise = freshSyncPromise;\n try {\n return await freshSyncPromise;\n } finally {\n if (pendingFreshAgentControllerReportSyncPromise === freshSyncPromise) {\n pendingFreshAgentControllerReportSyncPromise = null;\n }\n }\n };\n\n const syncProviderConversationProofsIfDue = async (): Promise<void> => {\n const nowMs = Date.now();\n if (\n providerConversationProofSyncInFlight ||\n nowMs < nextProviderConversationProofSyncAtMs\n ) {\n return;\n }\n\n providerConversationProofSyncInFlight = true;\n try {\n const result = await input.executionHost.call(\"reportConversations\", {});\n const retryInMs =\n result.failedCount > 0\n ? PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS\n : PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS;\n nextProviderConversationProofSyncAtMs = Date.now() + retryInMs;\n let proofSyncLineText: string;\n if (result.status === \"skipped\") {\n proofSyncLineText = `provider conversation proof sync skipped; ${result.reasonCodes[0] ?? \"no applicable routes\"}`;\n } else if (result.failedCount > 0) {\n proofSyncLineText = `provider conversation proof sync incomplete; accepted=${result.submittedCount}, failed=${result.failedCount}, total=${result.proofCount}; retrying in ${String(retryInMs)}ms`;\n } else {\n proofSyncLineText = `provider conversation proof sync submitted; accepted=${result.submittedCount}, failed=${result.failedCount}, total=${result.proofCount}`;\n }\n emitRunLine({\n presenter: input.presenter,\n code:\n result.failedCount > 0\n ? \"daemon.run.provider_conversation_proof_sync_failed\"\n : \"daemon.run.provider_conversation_proof_sync\",\n text: proofSyncLineText,\n payload: {\n failedCount: result.failedCount,\n proofCount: result.proofCount,\n reasonCodes: result.reasonCodes,\n retryInMs,\n status: result.status,\n submittedCount: result.submittedCount,\n },\n });\n } catch (error) {\n nextProviderConversationProofSyncAtMs =\n Date.now() + PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS;\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.provider_conversation_proof_sync_failed\",\n text: `provider conversation proof sync failed: ${toErrorMessage(error)}`,\n });\n } finally {\n providerConversationProofSyncInFlight = false;\n }\n };\n\n const startSupplementalEvidenceSyncs = (): void => {\n syncRuntimeAgentControllerReportsIfDue().catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.runtime_agent_controller_report_sync_failed\",\n text: `runtime agent controller report sync failed: ${toErrorMessage(error)}`,\n });\n });\n syncProviderConversationProofsIfDue().catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.provider_conversation_proof_sync_failed\",\n text: `provider conversation proof sync failed: ${toErrorMessage(error)}`,\n });\n });\n };\n\n const handleLocalAgentControlRefreshCatalogFrame = async (\n payload: Record<string, unknown>\n ): Promise<void> => {\n const parsed =\n runtimeTransportLocalAgentControlRefreshCatalogFramePayloadSchema.safeParse(\n payload\n );\n if (!parsed.success) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_frame_invalid\",\n text: \"ignored invalid local agent catalog refresh frame\",\n });\n return;\n }\n\n const responsePayload = await applyLocalAgentControlRefreshCatalog(\n parsed.data.payload.reason\n );\n sendDaemonFrame(input.socket, {\n code: \"daemon.local_agent_control.result\",\n payload: {\n requestId: parsed.data.requestId,\n payload: responsePayload,\n },\n });\n };\n\n const handleLocalAgentControlSetProfileWorkspaceFrame = async (\n payload: Record<string, unknown>\n ): Promise<void> => {\n const parsed =\n runtimeTransportLocalAgentControlSetProfileWorkspaceFramePayloadSchema.safeParse(\n payload\n );\n if (!parsed.success) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_frame_invalid\",\n text: \"ignored invalid profile workspace control frame\",\n });\n return;\n }\n\n const responsePayload = await applyLocalAgentControlSetProfileWorkspace(\n parsed.data.payload\n );\n sendDaemonFrame(input.socket, {\n code: \"daemon.local_agent_control.result\",\n payload: {\n requestId: parsed.data.requestId,\n payload: responsePayload,\n },\n });\n };\n\n const applyLocalAgentControlSetProfileWorkspace = async (controlInput: {\n targetProfileId: string;\n workspaceMode: \"custom\" | \"openmeld_managed\";\n workspacePath?: string;\n }): Promise<OpenMeldDaemonSetProfileWorkspacePayload> => {\n try {\n const result =\n controlInput.workspaceMode === \"custom\"\n ? await setCustomProfileWorkspace({\n customWorkspacePath: controlInput.workspacePath ?? \"\",\n openMeldProfileId: controlInput.targetProfileId,\n })\n : await ensureOpenMeldManagedProfileWorkspace({\n openMeldProfileId: controlInput.targetProfileId,\n });\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"local_agent_control_set_profile_workspace\",\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_set_profile_workspace\",\n text: `profile workspace updated for ${controlInput.targetProfileId}.`,\n payload: {\n targetProfileId: controlInput.targetProfileId,\n workspaceMode: result.value.mode,\n workspacePath: result.workspacePath,\n },\n });\n return {\n accepted: true,\n targetProfileId: controlInput.targetProfileId,\n status: \"updated\",\n workspaceMode: result.value.mode,\n workspacePath: result.workspacePath,\n };\n } catch (error) {\n const message = toErrorMessage(error);\n const reasonCode = resolveProfileWorkspaceControlErrorCode(error);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_set_profile_workspace_rejected\",\n text: `profile workspace control rejected: ${message}`,\n payload: {\n reasonCode,\n targetProfileId: controlInput.targetProfileId,\n workspaceMode: controlInput.workspaceMode,\n },\n });\n return {\n accepted: false,\n message,\n reasonCode,\n targetProfileId: controlInput.targetProfileId,\n status: \"rejected\",\n };\n }\n };\n\n const applyLocalAgentControlRefreshCatalog = async (\n reason: string\n ): Promise<OpenMeldDaemonSyncRouteCatalogPayload> => {\n try {\n const [result] = await Promise.all([\n requestRouteCatalogSync(reason),\n requestFreshRuntimeAgentControllerReportSync(),\n ]);\n const payload = projectRouteCatalogSyncPayload({\n knownProfileIds: input.routeCatalogState.profileIds,\n result,\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_refresh_catalog\",\n text: `local agent catalog check completed (${payload.syncStatus}).`,\n payload: {\n profileCount: payload.profileIds.length,\n syncStatus: payload.syncStatus,\n },\n });\n return payload;\n } catch (error) {\n const errorMessage = toErrorMessage(error);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_refresh_catalog_failed\",\n text: `local agent catalog check failed: ${errorMessage}`,\n });\n return {\n accepted: false,\n errorMessage,\n profileIds: [...input.routeCatalogState.profileIds],\n syncStatus: \"failed\",\n };\n }\n };\n\n input.socket.onError((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.socket_error\",\n text: `daemon stream socket error: ${toErrorMessage(error)}`,\n });\n });\n\n const handleOpenMeldToolsControlFrame = (frame: {\n code: string;\n payload: Record<string, unknown>;\n }): boolean => {\n if (frame.code !== \"daemon.openmeld_tools_control.request\") {\n return false;\n }\n const parsed =\n runtimeTransportOpenMeldToolsControlFramePayloadSchema.safeParse(\n frame.payload\n );\n if (!parsed.success) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.openmeld_tools_control_invalid\",\n text: \"OpenMeld Tools control request was invalid.\",\n });\n return true;\n }\n handleOpenMeldToolsControlRequest({\n coordinator: input.openMeldToolsUpdateCoordinator,\n request: parsed.data.request,\n })\n .then((result) => {\n const payload =\n runtimeTransportOpenMeldToolsControlResultFramePayloadSchema.parse({\n requestId: parsed.data.requestId,\n result,\n });\n sendDaemonFrame(input.socket, {\n code: \"daemon.openmeld_tools_control.result\",\n payload,\n });\n scheduleHeartbeat({\n delayMs: 0,\n reason: \"openmeld_tools_control_changed\",\n });\n })\n .catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.openmeld_tools_control_failed\",\n text: `OpenMeld Tools control failed: ${toErrorMessage(error)}`,\n });\n });\n return true;\n };\n\n const handleServiceControlFrame = (frame: {\n code: string;\n payload: Record<string, unknown>;\n }): boolean => handleOpenMeldToolsControlFrame(frame);\n\n input.socket.onMessage((raw) => {\n // Keepalive PONG (bare \"pong\", auto-answered by the RuntimeTransportHub DO)\n // is not a daemon frame; feed the keepalive watchdog and swallow it before\n // frame parsing so it never logs as an invalid frame and never touches\n // lease / readiness.\n if (raw === DAEMON_STREAM_KEEPALIVE_PONG) {\n keepalive.observePong();\n return;\n }\n const parsedFrame = parseDaemonFrame(raw);\n if (!parsedFrame) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.frame_invalid\",\n text: \"ignored invalid daemon frame\",\n });\n return;\n }\n if (parsedFrame.code === \"daemon.route_catalog.changed\") {\n const payload =\n runtimeTransportRouteCatalogChangedFramePayloadSchema.safeParse(\n parsedFrame.payload\n );\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"daemon_route_catalog_changed\",\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.route_catalog_changed\",\n text: `route catalog changed; sync scheduled (${payload.success ? payload.data.reason : \"unknown\"})`,\n });\n return;\n }\n if (handleServiceControlFrame(parsedFrame)) {\n return;\n }\n if (parsedFrame.code === \"daemon.local_agent_control.refresh_catalog\") {\n handleLocalAgentControlRefreshCatalogFrame(parsedFrame.payload).catch(\n (error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_failed\",\n text: `local agent control failed: ${toErrorMessage(error)}`,\n });\n }\n );\n return;\n }\n if (\n parsedFrame.code === \"daemon.local_agent_control.set_profile_workspace\"\n ) {\n handleLocalAgentControlSetProfileWorkspaceFrame(\n parsedFrame.payload\n ).catch((error) => {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_agent_control_failed\",\n text: `local agent control failed: ${toErrorMessage(error)}`,\n });\n });\n return;\n }\n const handledCurrentComputerControl =\n handleLocalFolderPickerSocketFrame({\n deviceId: input.deviceId,\n frame: parsedFrame,\n presenter: input.presenter,\n selectLocalFolders: input.selectLocalFolders,\n socket: input.socket,\n }) ||\n handleLocalProjectControlSocketFrame({\n deviceId: input.deviceId,\n frame: parsedFrame,\n onLocalProjectConnectionsChanged: () => {\n requestLocalExecutionEvidenceRefresh({\n reason: \"local_state_changed\",\n scheduleReason: \"local_project_connection_changed\",\n });\n input.onLocalProjectConnectionsChanged?.();\n },\n presenter: input.presenter,\n socket: input.socket,\n }) ||\n handleComputerFileAccessSocketFrame({\n computerFileAccessStorePath: input.computerFileAccessStorePath,\n deviceId: input.deviceId,\n frame: parsedFrame,\n presenter: input.presenter,\n socket: input.socket,\n });\n if (handledCurrentComputerControl) {\n return;\n }\n observeDispatchFrame({\n onDispatchActivity: () => {\n lastDispatchActivityAtMs = Date.now();\n updateHeartbeatInterval({\n nextIntervalMs: MIN_HEARTBEAT_INTERVAL_MS,\n reason: \"dispatch_activity\",\n });\n scheduleHeartbeat({\n delayMs: MIN_HEARTBEAT_INTERVAL_MS,\n reason: \"dispatch_activity\",\n });\n },\n parsedFrame,\n presenter: input.presenter,\n });\n if (\n !handleDaemonTransportFrame({\n frame: parsedFrame,\n presenter: input.presenter,\n waiters,\n })\n ) {\n hostLink.forward(parsedFrame);\n }\n });\n\n const registerResponse = await registerDaemonSession(\n createRouteCatalogFromMutableState(input.routeCatalogState)\n );\n applyAcceptedLeases({\n acceptedLeases: registerResponse.acceptedLeases,\n leasesByProfileId,\n });\n activeConnectionGeneration = registerResponse.connectionGeneration;\n configureHostConnection().catch(reportHostFailure);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.registered\",\n text: `registered daemon session; accepted leases=${registerResponse.acceptedLeases.length}, rejected=${registerResponse.rejectedProfiles.length}`,\n payload: {\n ...registerResponse,\n daemonSessionId: input.daemonSessionId,\n reconnectAttempt: input.reconnectAttempt,\n },\n });\n if (input.reconnectAttempt > 0) {\n const reconcileDecision = resolveRouteRegistrationReconcileDecision({\n driftDetected: true,\n foregroundActive: input.foregroundActive,\n });\n emitReconcileCompletedEvidence({\n action: reconcileDecision.action,\n acceptedLeaseCount: registerResponse.acceptedLeases.length,\n daemonSessionId: input.daemonSessionId,\n driftClass: reconcileDecision.driftClass,\n foregroundActive: reconcileDecision.foregroundActive,\n lifecycleLocked: reconcileDecision.lifecycleLocked,\n owner: reconcileDecision.owner,\n reconnectAttempt: input.reconnectAttempt,\n rejectedProfileCount: registerResponse.rejectedProfiles.length,\n skipReason: reconcileDecision.skipReason,\n });\n }\n if (registerResponse.rejectedProfiles.length > 0) {\n requestLocalExecutionEvidenceRefresh({\n reason: \"register_conflict\",\n scheduleReason: \"register_conflict\",\n });\n }\n const bootstrap = await completeRegisteredSessionBootstrap({\n heartbeatIntervalMs: currentHeartbeatIntervalMs,\n isRouteCatalogResolved: input.isRouteCatalogResolved?.() ?? true,\n persistAcceptedRouteCatalogCache,\n registerRejected: registerResponse.rejectedProfiles.length > 0,\n scheduleCatalogSyncNext,\n shutdownRequested: input.shutdownRequested,\n });\n const bootstrapShutdownStopCause = bootstrap.shutdownStopCause;\n if (!bootstrapShutdownStopCause) {\n latestCatalogSyncSignalMarker = resolveCatalogSyncSignalMarker(\n bootstrap.initialCatalogSyncSignal\n );\n scheduleCatalogSyncSignalPoll();\n await sendHeartbeat();\n keepalive.start();\n }\n\n async function finishControlledShutdown(\n stopCause: RuntimeTransportStopCause\n ): Promise<boolean> {\n acceptingDispatches = false;\n shutdownStopCause = stopCause;\n await input.executionHost.call(\"beginDrain\", {});\n clearHeartbeatTimer();\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_started\",\n text: \"Controlled shutdown was admitted; waiting for the active heartbeat to settle.\",\n });\n await waitForHeartbeatIdle();\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_inflight_heartbeat_completed\",\n text: \"Controlled shutdown finished waiting for the active heartbeat.\",\n });\n await sendHeartbeat();\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_final_heartbeat_completed\",\n text: \"Controlled shutdown completed its final heartbeat.\",\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_draining\",\n text: \"Waiting for accepted local work to finish in the execution host.\",\n });\n await input.executionHost.call(\"drain\", {}, { timeoutMs: null });\n const result = await input.executionHost.call(\"settleResults\", {});\n if (result.status === \"connection_closed\") {\n return false;\n }\n if (result.status === \"timeout\") {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_result_ack_timeout\",\n text: \"Controlled shutdown preserved unacknowledged durable results for replay after the receipt deadline.\",\n });\n }\n if (!closed) {\n input.socket.close(1000, \"shutdown\");\n if (\n !(await waitForPromiseDeadline({\n operation: waitForClose,\n timeoutMs: CONTROLLED_SHUTDOWN_SOCKET_CLOSE_TIMEOUT_MS,\n }))\n ) {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.controlled_shutdown_socket_close_timeout\",\n text: \"Controlled shutdown terminated a half-open transport after the close deadline.\",\n payload: {\n reasonCode: \"socket_close_timeout\",\n timeoutMs: CONTROLLED_SHUTDOWN_SOCKET_CLOSE_TIMEOUT_MS,\n },\n });\n input.socket.terminate();\n }\n }\n return true;\n }\n\n const sessionExit = bootstrapShutdownStopCause\n ? ({\n kind: \"shutdown_requested\" as const,\n stopCause: bootstrapShutdownStopCause,\n } as const)\n : await Promise.race([\n waitForClose.then(() => ({ kind: \"socket_closed\" as const })),\n input.shutdownRequested?.then((stopCause) => ({\n kind: \"shutdown_requested\" as const,\n stopCause,\n })) ?? new Promise<never>(() => undefined),\n ]);\n if (sessionExit.kind === \"shutdown_requested\" && !closed) {\n controlledShutdownCompleted = await finishControlledShutdown(\n sessionExit.stopCause\n );\n }\n hostLink.detach().catch(reportHostFailure);\n input.attachRouteCatalogSyncInvoker?.(null);\n clearHeartbeatTimer();\n keepalive.stop();\n clearCatalogSyncSignalTimer();\n const shouldDrainBeforeExit =\n controlledShutdownCompleted ||\n (closeCode === 1000 && closeReason === \"shutdown\");\n if (shouldDrainBeforeExit) {\n return;\n }\n throw new DaemonServiceRunError({\n code: \"daemon.run.socket_closed\",\n message: `daemon stream closed (code=${String(closeCode)}, reason=${closeReason})`,\n });\n}\n\nasync function withDaemonRunTimeout<T>(input: {\n code: string;\n message: string;\n operation: Promise<T>;\n timeoutMs: number;\n}): Promise<T> {\n let timeout: NodeJS.Timeout | null = null;\n try {\n return await Promise.race([\n input.operation,\n new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n reject(\n new DaemonServiceRunError({\n code: input.code,\n message: input.message,\n })\n );\n }, input.timeoutMs);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\nasync function completeRegisteredSessionBootstrap(input: {\n heartbeatIntervalMs: number;\n isRouteCatalogResolved: boolean;\n persistAcceptedRouteCatalogCache: () => Promise<void>;\n registerRejected: boolean;\n scheduleCatalogSyncNext: (delayMs: number) => void;\n shutdownRequested?: Promise<RuntimeTransportStopCause>;\n}): Promise<{\n initialCatalogSyncSignal: DaemonCatalogSyncSignal | null;\n shutdownStopCause: RuntimeTransportStopCause | null;\n}> {\n if (!input.registerRejected) {\n const bootstrapPlan = resolveBootstrapCatalogSyncPlan({\n isRouteCatalogResolved: input.isRouteCatalogResolved,\n syncIntervalMs: resolveCatalogSyncIntervalMs({\n heartbeatIntervalMs: input.heartbeatIntervalMs,\n }),\n });\n if (bootstrapPlan.persistCache) {\n const persistence = await awaitOperationOrShutdown({\n operation: input.persistAcceptedRouteCatalogCache(),\n shutdownRequested: input.shutdownRequested,\n });\n if (persistence.kind === \"shutdown_requested\") {\n return {\n initialCatalogSyncSignal: null,\n shutdownStopCause: persistence.stopCause,\n };\n }\n }\n input.scheduleCatalogSyncNext(bootstrapPlan.nextSyncDelayMs);\n }\n\n const catalogSignal = await awaitOperationOrShutdown({\n operation: readDaemonCatalogSyncSignal().catch(() => null),\n shutdownRequested: input.shutdownRequested,\n });\n if (catalogSignal.kind === \"shutdown_requested\") {\n return {\n initialCatalogSyncSignal: null,\n shutdownStopCause: catalogSignal.stopCause,\n };\n }\n return {\n initialCatalogSyncSignal: catalogSignal.value,\n shutdownStopCause: null,\n };\n}\n\nasync function awaitOperationOrShutdown<T>(input: {\n operation: Promise<T>;\n shutdownRequested?: Promise<RuntimeTransportStopCause>;\n}): Promise<\n | { kind: \"completed\"; value: T }\n | { kind: \"shutdown_requested\"; stopCause: RuntimeTransportStopCause }\n> {\n if (!input.shutdownRequested) {\n return { kind: \"completed\", value: await input.operation };\n }\n return await Promise.race([\n input.operation.then((value) => ({ kind: \"completed\" as const, value })),\n input.shutdownRequested.then((stopCause) => ({\n kind: \"shutdown_requested\" as const,\n stopCause,\n })),\n ]);\n}\n\nasync function waitForPromiseDeadline(input: {\n operation: Promise<unknown>;\n timeoutMs: number;\n}): Promise<boolean> {\n let timeout: NodeJS.Timeout | null = null;\n try {\n return await Promise.race([\n input.operation.then(() => true),\n new Promise<false>((resolve) => {\n timeout = setTimeout(() => resolve(false), input.timeoutMs);\n timeout.unref?.();\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction observeDispatchFrame(input: {\n onDispatchActivity: () => void;\n parsedFrame: ParsedDaemonFrame;\n presenter: Presenter;\n}): void {\n switch (input.parsedFrame.code) {\n case \"daemon.dispatch.deliver\":\n observeDispatchDeliverFrame({\n onDispatchActivity: input.onDispatchActivity,\n parsedFrame: input.parsedFrame,\n presenter: input.presenter,\n });\n return;\n case \"daemon.dispatch.accepted\":\n observeDispatchAcceptedFrame(input.parsedFrame, input.presenter);\n return;\n default:\n return;\n }\n}\n\nfunction observeDispatchDeliverFrame(input: {\n onDispatchActivity: () => void;\n parsedFrame: ParsedDaemonFrame;\n presenter: Presenter;\n}): void {\n input.onDispatchActivity();\n const payload = input.parsedFrame.payload;\n const dispatchId = normalizeFrameString(payload.dispatchId) ?? \"unknown\";\n emitDaemonDispatchJournalEvent({\n attemptId: normalizeFrameString(payload.attemptId),\n connectionGeneration: normalizeFrameInteger(payload.connectionGeneration),\n daemonSessionId: normalizeFrameString(payload.daemonSessionId),\n dispatchId,\n leaseEpoch: normalizeFrameInteger(payload.leaseEpoch),\n metadata: {\n deliveryRecoveryReason: payload.deliveryRecoveryReason ?? null,\n },\n profileId: normalizeFrameString(payload.profileId),\n result: \"received\",\n taskId: resolveDeliveredTaskId(payload.payload),\n type: \"dispatch.deliver.received\",\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.deliver_frame_received\",\n text: `daemon deliver frame received for dispatch ${dispatchId}`,\n payload: {\n attemptId: payload.attemptId ?? null,\n connectionGeneration: payload.connectionGeneration ?? null,\n dispatchId: payload.dispatchId ?? null,\n leaseEpoch: payload.leaseEpoch ?? null,\n profileId: payload.profileId ?? null,\n },\n });\n}\n\nfunction observeDispatchAcceptedFrame(\n parsedFrame: ParsedDaemonFrame,\n presenter: Presenter\n): void {\n const dispatchId =\n normalizeFrameString(parsedFrame.payload.dispatchId) ?? \"unknown\";\n const accepted = parsedFrame.payload.ok === true;\n emitDaemonDispatchJournalEvent({\n attemptId: normalizeFrameString(parsedFrame.payload.attemptId),\n dispatchId,\n metadata: {\n ok: parsedFrame.payload.ok ?? null,\n reasonCode: parsedFrame.payload.reasonCode ?? null,\n status: parsedFrame.payload.status ?? null,\n },\n result: accepted ? \"accepted\" : \"rejected\",\n type: \"dispatch.result.accepted\",\n });\n emitRunLine({\n presenter,\n code: \"daemon.run.result_accepted\",\n text: `daemon result frame accepted for dispatch ${dispatchId}`,\n payload: {\n attemptId: parsedFrame.payload.attemptId ?? null,\n dispatchId: parsedFrame.payload.dispatchId ?? null,\n ok: parsedFrame.payload.ok ?? null,\n reasonCode: parsedFrame.payload.reasonCode ?? null,\n status: parsedFrame.payload.status ?? null,\n },\n });\n}\n\nfunction resolveDeliveredTaskId(payload: unknown): string | null {\n if (!(payload && typeof payload === \"object\" && \"taskId\" in payload)) {\n return null;\n }\n const taskId = payload.taskId;\n return typeof taskId === \"string\" && taskId.length > 0 ? taskId : null;\n}\n\nfunction normalizeFrameString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFrameInteger(value: unknown): number | null {\n if (!(typeof value === \"number\" && Number.isInteger(value))) {\n return null;\n }\n return value;\n}\n\nfunction _resolveLocalAgentEnabledErrorCode(error: unknown): string {\n if (!(error instanceof Error)) {\n return \"agents.unexpected_error\";\n }\n const [code] = error.message.split(\":\", 1);\n const normalized = code?.trim();\n return normalized?.includes(\".\") ? normalized : \"agents.unexpected_error\";\n}\n\nfunction resolveProfileWorkspaceControlErrorCode(error: unknown): string {\n if (error instanceof Error) {\n const codedError = error as Error & { code?: unknown };\n if (typeof codedError.code === \"string\") {\n return codedError.code;\n }\n }\n return \"profile.workspace.update_failed\";\n}\n","import type { DaemonServiceRuntimeStatus } from \"../../config/daemon-state\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../lifecycle/current-daemon-version\";\nimport {\n classifyDaemonServiceRunStartability,\n classifyDaemonServiceWakeability,\n} from \"../lifecycle/daemon-service-anomaly-groups\";\nimport {\n type DaemonServiceAnomalyCode,\n inspectDaemonServiceInventory,\n} from \"../lifecycle/daemon-service-inventory\";\n\nexport type DaemonServiceParticipationStatus =\n | {\n kind: \"ready\";\n expectedVersion: string;\n installedVersion: string | null;\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n advisoryAnomalyCodes?: DaemonServiceAnomalyCode[];\n }\n | {\n kind: \"missing\";\n expectedVersion: string;\n }\n | {\n kind: \"outdated\";\n expectedVersion: string;\n installedVersion: string;\n }\n | {\n kind: \"not_running\";\n expectedVersion: string;\n installedVersion: string | null;\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n }\n | {\n kind: \"needs_repair\";\n expectedVersion: string;\n installedVersion: string | null;\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null;\n detail: string;\n anomalyCodes: string[];\n };\n\nexport async function resolveDaemonServiceParticipationStatus(input?: {\n expectedVersion?: string;\n}): Promise<DaemonServiceParticipationStatus> {\n const expectedVersion =\n input?.expectedVersion ?? (await resolveCurrentDaemonExpectedVersion());\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion,\n });\n\n if (!(inventory.installStatus.installed && inventory.installStatus.state)) {\n return {\n kind: \"missing\",\n expectedVersion,\n };\n }\n\n const installedVersion = inventory.installStatus.state.daemonVersion;\n const wakeability = classifyDaemonServiceWakeability({\n inventory,\n });\n const blockingServiceDriftCodes = wakeability.blockingCodes;\n const runBlockingServiceDriftCodes = classifyDaemonServiceRunStartability({\n inventory,\n }).blockingCodes;\n const repairAnomalies = inventory.anomalies.filter((anomaly) =>\n [...blockingServiceDriftCodes, ...runBlockingServiceDriftCodes].includes(\n anomaly.code\n )\n );\n if (repairAnomalies.length > 0) {\n return {\n kind: \"needs_repair\",\n expectedVersion,\n installedVersion,\n runtimeStatus: inventory.runtimeStatus.status,\n detail:\n repairAnomalies[0]?.message ??\n \"OpenMeld found conflicting local service state on this device.\",\n anomalyCodes: inventory.anomalies.map((anomaly) => anomaly.code),\n };\n }\n\n if (inventory.runtimeStatus.status !== \"running\") {\n return {\n kind: \"not_running\",\n expectedVersion,\n installedVersion,\n runtimeStatus: inventory.runtimeStatus.status,\n };\n }\n\n return {\n kind: \"ready\",\n expectedVersion,\n installedVersion,\n runtimeStatus: inventory.runtimeStatus.status,\n advisoryAnomalyCodes: wakeability.advisoryCodes,\n };\n}\n","import {\n access,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH,\n formatLocalComponentsSummaryDescription,\n formatLocalComponentsSummaryLabel,\n formatLocalSetupActionDescription,\n formatLocalSetupActionLabel,\n installedLocalComponentsSnapshotSchema,\n LOCAL_COMPONENTS_SCHEMA_VERSION,\n type LocalComponentStatus,\n type LocalComponentsManifest,\n type LocalComponentsStatus,\n type LocalSetupAction,\n} from \"@openmeld/schemas\";\nimport type { InstalledLocalComponentsSnapshot } from \"@openmeld/schemas/types\";\nimport { openMeldRootDir } from \"../config/paths\";\nimport { compareSemver } from \"../config/version-state\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport { readDaemonActiveBundleState } from \"../local-service/lifecycle/daemon-service-bundle\";\nimport {\n type DaemonServiceAnomalyCode,\n inspectDaemonServiceInventory,\n} from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { resolveOpenMeldToolsMaintenanceProjection } from \"../local-service/maintenance/openmeld-tools-maintenance-policy\";\nimport { resolveOpenMeldToolsUpdateOperationProjection } from \"../local-service/maintenance/openmeld-tools-update-operation\";\nimport { resolveDaemonServiceParticipationStatus } from \"../local-service/status/service-participation-status\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\nimport { hashBundledSkillAssets } from \"../skills/bundled-assets\";\nimport { computeDirectoryContentHash } from \"../skills/content-hash\";\nimport { collectSkillsReadinessSnapshot } from \"../skills/installation-inventory\";\nimport { loadSelectedSkillAssets } from \"../skills/official-release\";\nimport { readManagedCliInstallation } from \"./managed-install\";\n\nexport const OPENMELD_CLI_COMMAND_CONTRACT_VERSION =\n \"openmeld-cli-command-contract-2026-09-image-geometry-v1\";\nexport const OPENMELD_SKILLS_CONTRACT_VERSION =\n \"openmeld-skills-contract-2026-09-explicit-space-recipients-v1\";\nexport const OPENMELD_SERVICE_CONTRACT_VERSION =\n \"openmeld-service-contract-2026-09-image-geometry-v1\";\n\nconst LOCAL_COMPONENTS_SNAPSHOT_FILE = \"local-components.json\";\nconst SERVICE_COMPONENT_UPDATE_CODES = new Set<DaemonServiceAnomalyCode>([\n \"version_outdated\",\n \"downgrade_blocked\",\n \"runtime_contract_missing\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_unavailable\",\n \"bundle_missing\",\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_version_drift\",\n \"bundle_lane_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_provenance_drift\",\n \"bundle_path_invalid\",\n]);\n\ntype CliUpdateInput = {\n latestPackageVersion?: string | null;\n requiredCommandContractVersion?: string | null;\n};\n\ntype ServiceComponentState = {\n installedBundleHash: string | null;\n installedBundleVersion: string | null;\n kind:\n | \"ok\"\n | \"missing\"\n | \"not_running\"\n | \"update_required\"\n | \"inspection_failed\";\n reasonCodes: string[];\n status: LocalComponentStatus;\n};\n\ntype SkillsComponentState = {\n installedBundleHash: string | null;\n reasonCodes: string[];\n status: LocalComponentStatus;\n targetCount: number;\n};\n\nexport function localComponentsSnapshotPath(): string {\n return join(openMeldRootDir(), LOCAL_COMPONENTS_SNAPSHOT_FILE);\n}\n\nexport async function buildExpectedLocalComponentsManifest(): Promise<LocalComponentsManifest> {\n const skills = await resolveExpectedSkillsManifest();\n return {\n schemaVersion: LOCAL_COMPONENTS_SCHEMA_VERSION,\n openMeldReleaseVersion: OPENMELD_VERSION,\n cli: {\n packageVersion: OPENMELD_VERSION,\n commandContractVersion: OPENMELD_CLI_COMMAND_CONTRACT_VERSION,\n },\n service: {\n // Expected manifests do not know which daemon bundle is active at runtime.\n // The installed service hash reported to Core comes from active-bundle.json.\n bundleHash: null,\n bundleVersion: await resolveCurrentDaemonExpectedVersion(),\n runtimeContractEpoch: CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH,\n serviceContractVersion: OPENMELD_SERVICE_CONTRACT_VERSION,\n },\n skills,\n };\n}\n\nexport async function readInstalledLocalComponentsSnapshot(): Promise<InstalledLocalComponentsSnapshot | null> {\n const raw = await readFile(localComponentsSnapshotPath(), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as unknown;\n const result = installedLocalComponentsSnapshotSchema.safeParse(parsed);\n return result.success ? result.data : null;\n}\n\nexport async function writeInstalledLocalComponentsSnapshot(input: {\n source: InstalledLocalComponentsSnapshot[\"source\"];\n}): Promise<InstalledLocalComponentsSnapshot> {\n const snapshot: InstalledLocalComponentsSnapshot = {\n schemaVersion: LOCAL_COMPONENTS_SCHEMA_VERSION,\n installedAt: new Date().toISOString(),\n source: input.source,\n manifest: await buildExpectedLocalComponentsManifest(),\n };\n const installed = isBinaryDistribution()\n ? await readManagedCliInstallation()\n : null;\n if (installed && installed.version !== OPENMELD_VERSION) {\n const previous = await readInstalledLocalComponentsSnapshot();\n if (previous?.manifest.cli.packageVersion === installed.version) {\n snapshot.manifest.cli = previous.manifest.cli;\n }\n }\n const snapshotPath = localComponentsSnapshotPath();\n await mkdir(dirname(snapshotPath), { recursive: true });\n const temporaryPath = `${snapshotPath}.${crypto.randomUUID()}.tmp`;\n try {\n await writeFile(temporaryPath, `${JSON.stringify(snapshot, null, 2)}\\n`);\n await rename(temporaryPath, snapshotPath);\n } finally {\n await rm(temporaryPath, { force: true });\n }\n return snapshot;\n}\n\nexport async function resolveLocalComponentsStatus(\n input: CliUpdateInput = {}\n): Promise<LocalComponentsStatus> {\n const [expectedManifest, service, skills, maintenance, updateProjection] =\n await Promise.all([\n buildExpectedLocalComponentsManifest(),\n resolveServiceComponentState(),\n resolveSkillsComponentState(),\n resolveOpenMeldToolsMaintenanceProjection(),\n resolveOpenMeldToolsUpdateOperationProjection(),\n ]);\n const resolvedCli = await resolveCliComponentStatus(input);\n const cli = updateProjection?.failureCode\n ? {\n ...resolvedCli,\n reasonCodes: Array.from(\n new Set([...resolvedCli.reasonCodes, updateProjection.failureCode])\n ),\n }\n : resolvedCli;\n const selectedSkill = await loadSelectedSkillAssets();\n const setupAction = resolveLocalComponentsSetupAction({\n cliStatus: cli.status,\n serviceKind: service.kind,\n serviceStatus: service.status,\n skillsStatus: skills.status,\n });\n\n return {\n schemaVersion: LOCAL_COMPONENTS_SCHEMA_VERSION,\n generatedAt: new Date().toISOString(),\n entrypoint: \"setup\",\n summaryLabel: formatLocalComponentsSummaryLabel({\n cliStatus: cli.status,\n setupAction,\n }),\n summaryDescription: formatLocalComponentsSummaryDescription({\n cliStatus: cli.status,\n setupAction,\n }),\n setupAction,\n setupActionLabel: formatLocalSetupActionLabel(setupAction),\n setupActionDescription: formatLocalSetupActionDescription(setupAction),\n maintenance,\n ...(updateProjection\n ? { updateOperation: updateProjection.operation }\n : {}),\n cli,\n service: {\n expectedBundleHash: expectedManifest.service.bundleHash,\n expectedBundleVersion: expectedManifest.service.bundleVersion,\n installedBundleHash: service.installedBundleHash,\n installedBundleVersion: service.installedBundleVersion,\n reasonCodes: service.reasonCodes,\n runtimeContractEpoch: expectedManifest.service.runtimeContractEpoch,\n serviceContractVersion: expectedManifest.service.serviceContractVersion,\n status: service.status,\n },\n skills: {\n ...(selectedSkill.contentRelease\n ? { contentRelease: selectedSkill.contentRelease }\n : {}),\n expectedBundleHash: expectedManifest.skills.bundleHash,\n installedBundleHash: skills.installedBundleHash,\n reasonCodes: skills.reasonCodes,\n skillContractVersion: expectedManifest.skills.skillContractVersion,\n status: skills.status,\n targetCount: skills.targetCount,\n },\n };\n}\n\nexport function resolveLocalComponentsSetupAction(input: {\n cliStatus: LocalComponentStatus;\n serviceKind: ServiceComponentState[\"kind\"];\n serviceStatus: LocalComponentStatus;\n skillsStatus: LocalComponentStatus;\n}): LocalSetupAction {\n if (input.cliStatus === \"update_required\") {\n return \"update_cli\";\n }\n if (input.serviceStatus === \"update_required\") {\n return \"update_service\";\n }\n if (input.skillsStatus === \"update_required\") {\n return \"update_skills\";\n }\n if (input.serviceKind === \"missing\") {\n return \"connect_service\";\n }\n if (\n input.serviceKind === \"not_running\" ||\n input.serviceKind === \"inspection_failed\"\n ) {\n return \"reconnect_service\";\n }\n return \"none\";\n}\n\nasync function resolveCliComponentStatus(\n input: CliUpdateInput\n): Promise<LocalComponentsStatus[\"cli\"]> {\n const installed = isBinaryDistribution()\n ? await readManagedCliInstallation()\n : null;\n const packageVersion = installed?.version ?? OPENMELD_VERSION;\n const snapshot =\n installed && installed.version !== OPENMELD_VERSION\n ? await readInstalledLocalComponentsSnapshot()\n : null;\n let commandContractVersion = OPENMELD_CLI_COMMAND_CONTRACT_VERSION;\n if (packageVersion !== OPENMELD_VERSION) {\n commandContractVersion =\n snapshot?.manifest.cli.packageVersion === packageVersion\n ? snapshot.manifest.cli.commandContractVersion\n : \"unknown\";\n }\n const latestPackageVersion = normalizeOptionalString(\n input.latestPackageVersion\n );\n const requiredCommandContractVersion = normalizeOptionalString(\n input.requiredCommandContractVersion\n );\n const reasonCodes: string[] = [];\n let status: LocalComponentStatus = \"ok\";\n if (\n commandContractVersion === \"unknown\" ||\n (requiredCommandContractVersion &&\n requiredCommandContractVersion !== commandContractVersion)\n ) {\n status = \"update_required\";\n reasonCodes.push(\"cli.command_contract_mismatch\");\n } else if (\n latestPackageVersion &&\n compareSemver(packageVersion, latestPackageVersion) < 0\n ) {\n status = \"update_available\";\n reasonCodes.push(\"cli.package_update_available\");\n }\n return {\n commandContractVersion,\n latestPackageVersion,\n packageVersion,\n reasonCodes,\n requiredCommandContractVersion,\n status,\n };\n}\n\nasync function resolveServiceComponentState(): Promise<ServiceComponentState> {\n const expectedVersion = await resolveCurrentDaemonExpectedVersion();\n try {\n const [participation, inventory, activeBundle] = await Promise.all([\n resolveDaemonServiceParticipationStatus({ expectedVersion }),\n inspectDaemonServiceInventory({ expectedVersion }),\n readDaemonActiveBundleState().catch(() => null),\n ]);\n const installedBundleVersion =\n resolveInstalledServiceVersion(participation);\n const serviceUpdateReasonCodes = collectServiceUpdateReasonCodes({\n anomalyCodes: inventory.anomalies.map((anomaly) => anomaly.code),\n participation,\n });\n if (serviceUpdateReasonCodes.length > 0) {\n return {\n installedBundleHash: resolveInstalledServiceBundleHash(activeBundle),\n installedBundleVersion,\n kind: \"update_required\",\n reasonCodes: serviceUpdateReasonCodes,\n status: \"update_required\",\n };\n }\n if (participation.kind === \"missing\") {\n return {\n installedBundleHash: null,\n installedBundleVersion: null,\n kind: \"missing\",\n reasonCodes: [\"service.not_installed\"],\n status: \"ok\",\n };\n }\n if (participation.kind === \"not_running\") {\n return {\n installedBundleHash: resolveInstalledServiceBundleHash(activeBundle),\n installedBundleVersion,\n kind: \"not_running\",\n reasonCodes: [\"service.not_running\"],\n status: \"ok\",\n };\n }\n return {\n installedBundleHash: resolveInstalledServiceBundleHash(activeBundle),\n installedBundleVersion,\n kind: \"ok\",\n reasonCodes: [],\n status: \"ok\",\n };\n } catch (error) {\n return {\n installedBundleHash: null,\n installedBundleVersion: null,\n kind: \"inspection_failed\",\n reasonCodes: [\n `service.inspection_failed:${error instanceof Error ? error.message : \"unknown\"}`,\n ],\n status: \"ok\",\n };\n }\n}\n\nfunction resolveInstalledServiceBundleHash(\n activeBundle: Awaited<ReturnType<typeof readDaemonActiveBundleState>>\n): string | null {\n if (activeBundle?.bundleFormat === \"binary_v1\") {\n return null;\n }\n return activeBundle?.sourceDistFingerprint ?? null;\n}\n\nasync function resolveSkillsComponentState(): Promise<SkillsComponentState> {\n const [installed, snapshot] = await Promise.all([\n resolveInstalledSkillsManifest(),\n collectSkillsReadinessSnapshot().catch(() => null),\n ]);\n if (!snapshot) {\n return {\n installedBundleHash: installed?.bundleHash ?? null,\n reasonCodes: [\"skills.status_unavailable\"],\n status: \"update_required\",\n targetCount: 0,\n };\n }\n if (!installed) {\n return {\n installedBundleHash: null,\n reasonCodes: [\"skills.bundle_hash_unavailable\"],\n status: \"update_required\",\n targetCount: snapshot.targetCount,\n };\n }\n if (snapshot.status === \"action_required\") {\n return {\n installedBundleHash: installed.bundleHash,\n reasonCodes: [\"skills.update_required\"],\n status: \"update_required\",\n targetCount: snapshot.targetCount,\n };\n }\n return {\n installedBundleHash: installed.bundleHash,\n reasonCodes: snapshot.status === \"no_targets\" ? [\"skills.no_targets\"] : [],\n status: \"ok\",\n targetCount: snapshot.targetCount,\n };\n}\n\nasync function resolveExpectedSkillsManifest(): Promise<\n LocalComponentsManifest[\"skills\"]\n> {\n return (\n (await resolveBundledSkillsManifest()) ?? buildUnavailableSkillsManifest()\n );\n}\n\nasync function resolveInstalledSkillsManifest(): Promise<\n LocalComponentsManifest[\"skills\"] | null\n> {\n const bundled = await resolveBundledSkillsManifest();\n if (bundled) {\n return bundled;\n }\n\n const activeBundleSource = await resolveActiveBundleSourceSkillsManifest();\n if (activeBundleSource) {\n return activeBundleSource;\n }\n\n const snapshot = await readInstalledLocalComponentsSnapshot();\n return snapshot?.manifest.skills ?? null;\n}\n\nasync function resolveBundledSkillsManifest(): Promise<\n LocalComponentsManifest[\"skills\"] | null\n> {\n const assets = await loadSelectedSkillAssets()\n .then((selected) => selected.assets)\n .catch(() => null);\n if (!assets || assets.length === 0) {\n return null;\n }\n return {\n bundleHash: hashBundledSkillAssets(assets),\n skillContractVersion: OPENMELD_SKILLS_CONTRACT_VERSION,\n skillIds: [\"openmeld-cli\"],\n };\n}\n\nasync function resolveActiveBundleSourceSkillsManifest(): Promise<\n LocalComponentsManifest[\"skills\"] | null\n> {\n const activeBundle = await readDaemonActiveBundleState().catch(() => null);\n const sourcePackageRootPath = normalizeOptionalString(\n activeBundle?.sourcePackageRootPath\n );\n if (!sourcePackageRootPath) {\n return null;\n }\n const skillsRootDir = join(sourcePackageRootPath, \"skills\");\n if (!(await pathExists(skillsRootDir))) {\n return null;\n }\n return await buildSkillsManifestFromRoot(skillsRootDir);\n}\n\nasync function buildSkillsManifestFromRoot(\n skillsRootDir: string\n): Promise<LocalComponentsManifest[\"skills\"]> {\n const bundleHash = await computeDirectoryContentHash({\n rootDir: skillsRootDir,\n ignoredNames: [\".openmeld-skill.json\"],\n }).catch(() => null);\n return {\n bundleHash,\n skillContractVersion: OPENMELD_SKILLS_CONTRACT_VERSION,\n skillIds: [\"openmeld-cli\"],\n };\n}\n\nfunction buildUnavailableSkillsManifest(): LocalComponentsManifest[\"skills\"] {\n return {\n bundleHash: null,\n skillContractVersion: OPENMELD_SKILLS_CONTRACT_VERSION,\n skillIds: [],\n };\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction collectServiceUpdateReasonCodes(input: {\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n participation: Awaited<\n ReturnType<typeof resolveDaemonServiceParticipationStatus>\n >;\n}): string[] {\n const reasonCodes: string[] = input.anomalyCodes.filter((code) =>\n SERVICE_COMPONENT_UPDATE_CODES.has(code)\n );\n if (input.participation.kind === \"outdated\") {\n reasonCodes.push(\"version_outdated\");\n }\n if (input.participation.kind === \"needs_repair\") {\n reasonCodes.push(\n ...input.participation.anomalyCodes.filter((code) =>\n SERVICE_COMPONENT_UPDATE_CODES.has(code as DaemonServiceAnomalyCode)\n )\n );\n }\n return [...new Set(reasonCodes.map((code) => `service.${code}`))];\n}\n\nfunction resolveInstalledServiceVersion(\n participation: Awaited<\n ReturnType<typeof resolveDaemonServiceParticipationStatus>\n >\n): string | null {\n switch (participation.kind) {\n case \"ready\":\n case \"not_running\":\n case \"needs_repair\":\n case \"outdated\":\n return participation.installedVersion;\n default:\n return null;\n }\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import type { LocalComponentsStatus } from \"@openmeld/schemas/types\";\nimport { resolveLocalComponentsStatus } from \"../../local-components/manifest\";\n\n// One observation and at most one inspection for the Service lifetime, including\n// reconnects. This carries no component readiness or maintenance authority.\nexport function createServiceLocalComponentsObservation(input: {\n inspect?: () => Promise<LocalComponentsStatus | null>;\n onError: (error: unknown) => void;\n}) {\n let observation: {\n value: LocalComponentsStatus | null;\n observedAtMs: number;\n } | null = null;\n let pending: Promise<void> | null = null;\n let onRefresh: (() => void) | undefined;\n let disposed = false;\n return {\n read(notify: () => void): LocalComponentsStatus | null {\n if (disposed) {\n return null;\n }\n onRefresh = notify;\n if (observation && Date.now() - observation.observedAtMs < 30_000) {\n return observation.value;\n }\n if (!pending) {\n pending = (input.inspect ?? resolveLocalComponentsStatus)()\n .then((value) => {\n observation = { value, observedAtMs: Date.now() };\n if (!disposed) {\n onRefresh?.();\n }\n })\n .catch((error) => {\n observation = { value: null, observedAtMs: Date.now() };\n if (!disposed) {\n input.onError(error);\n }\n })\n .finally(() => {\n pending = null;\n });\n }\n return null;\n },\n dispose() {\n disposed = true;\n onRefresh = undefined;\n },\n };\n}\n\nexport type ServiceLocalComponentsObservation = ReturnType<\n typeof createServiceLocalComponentsObservation\n>;\n","export type StopAwareDelayResult = \"elapsed\" | \"interrupted\";\n\nexport type StopAwareDelay = {\n interrupt: () => void;\n wake: () => void;\n wait: (delayMs: number) => Promise<StopAwareDelayResult>;\n};\n\n// The daemon run loop parks in reconnect backoff waits that can reach the\n// 15-minute auth_rejected tier. A stop request (SIGTERM / lifecycle repair)\n// only flips a flag, so the wait itself must wake immediately or the process\n// outlives every lifecycle stop window (2026-07-03 production incident: stale\n// tokens put every daemon into the 15-minute tier and setup repair could not\n// stop them). `interrupt()` resolves all pending and future waits right away;\n// without an interrupt each wait runs its full duration unchanged.\nexport function createStopAwareDelay(): StopAwareDelay {\n let interrupted = false;\n let wakePending = false;\n const pendingInterruptNotifiers = new Set<() => void>();\n return {\n wake: () => {\n wakePending = pendingInterruptNotifiers.size === 0;\n for (const notify of pendingInterruptNotifiers) {\n notify();\n }\n pendingInterruptNotifiers.clear();\n },\n interrupt: () => {\n if (interrupted) {\n return;\n }\n interrupted = true;\n for (const notifyInterrupted of pendingInterruptNotifiers) {\n notifyInterrupted();\n }\n pendingInterruptNotifiers.clear();\n },\n wait: (delayMs) => {\n if (interrupted) {\n return Promise.resolve(\"interrupted\");\n }\n if (wakePending) {\n wakePending = false;\n return Promise.resolve(\"interrupted\");\n }\n return new Promise((resolve) => {\n let timer: NodeJS.Timeout | null = null;\n const notifyInterrupted = () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve(\"interrupted\");\n };\n pendingInterruptNotifiers.add(notifyInterrupted);\n timer = setTimeout(() => {\n pendingInterruptNotifiers.delete(notifyInterrupted);\n resolve(\"elapsed\");\n }, delayMs);\n });\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { LocalDaemonAdapterContainer } from \"@openmeld/local-service\";\nimport {\n applyIntervalJitterMs as applyIntervalJitterMsInternal,\n resolveAdaptiveHeartbeatIntervalMs as resolveAdaptiveHeartbeatIntervalMsInternal,\n resolveCatalogSyncIntervalMs as resolveCatalogSyncIntervalMsInternal,\n} from \"@openmeld/local-service/heartbeat-policy\";\nimport { resolveRouteRegistrationReconcileDecision } from \"@openmeld/local-service/service-reconcile-decision\";\nimport {\n COMPUTER_FILE_ACCESS_RUNTIME_CAPABILITY,\n daemonServiceLaneSchema,\n LOCAL_FOLDER_PICKER_RUNTIME_CAPABILITY,\n OPENMELD_COMPUTER_CARE_HEADER,\n OPENMELD_EXECUTION_ADMISSION_HEADER,\n OPENMELD_LOCAL_FOLDER_PICKER_CAPABILITY_HEADER,\n OPENMELD_REASONING_STREAM_HEADER,\n OPENMELD_RUNTIME_CAPABILITIES_HEADER,\n SERVICE_CONNECTION_ID_QUERY_PARAMETER,\n SPACE_WORK_HANDOFF_CAPABILITY_HEADER,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldDaemonControlPlaneResponse,\n OpenMeldDaemonSyncRouteCatalogRequestPayload,\n RuntimeTransportStopCause,\n} from \"@openmeld/schemas/types\";\nimport {\n type AuthSessionState,\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n onAuthSessionCredentialAvailable,\n onAuthSessionCredentialObservation,\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../../config/auth-session\";\nimport { resolveBaseUrl } from \"../../config/base-url\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport {\n clearDaemonServiceRuntimeState,\n daemonRuntimeRootPath,\n ensureDaemonControlPlaneToken,\n resolveDaemonServiceRuntimeMetadata,\n} from \"../../config/daemon-state\";\nimport { resolveOpenMeldRootDir } from \"../../config/paths\";\nimport {\n AuthRequestCredentialError,\n type AuthRequestCredentialFailureReason,\n buildOpenMeldProfileRequestHeadersWithAuth,\n buildRequestAuthHeaders,\n fingerprintRequestAuthorization,\n} from \"../../config/request-headers\";\nimport {\n requireOpenMeldProfile,\n resolveOpenMeldProfileOrNull,\n} from \"../../config/resolve-openmeld-profile\";\nimport { getConfiguredDaemonDispatchLimits } from \"../../config/runtime-config\";\nimport { ServiceAccountAdmissionError } from \"../../config/service-account-admission\";\nimport type { Presenter } from \"../../runtime/presenter\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\nimport {\n CURRENT_PROCESS_START_IDENTITY,\n isPreciseProcessStartIdentity,\n readProcessStartIdentity,\n} from \"../../system/process-identity\";\nimport type { WsClient } from \"../../transport/ws\";\nimport { connectWebSocket, WebSocketConnectionError } from \"../../transport/ws\";\nimport { startLocalDaemonControlPlaneServer } from \"../control-plane/server\";\nimport {\n DAEMON_STREAM_CONNECT_TIMEOUT_MS,\n DEFAULT_RECONNECT_DELAY_MS,\n MAX_RECONNECT_DELAY_MS,\n} from \"../core/constants\";\nimport {\n emitRunLine,\n normalizeHeartbeatIntervalMs,\n normalizeOptionalText,\n normalizeText,\n nowIsoString,\n toErrorMessage,\n warnDaemonEvent,\n} from \"../core/logger\";\nimport type {\n DaemonServiceRunInput,\n MutableRouteCatalogState,\n RouteCatalog,\n RouteCatalogSyncResult,\n} from \"../core/types\";\nimport { DaemonServiceRunError } from \"../core/types\";\nimport {\n emitDriftDetectedEvidence,\n emitReconcileStartedEvidence,\n} from \"../diagnostics/service-evidence-trace\";\nimport {\n buildDispatchBootstrapTemplateFacts as buildDispatchBootstrapTemplateFactsInternal,\n buildDispatchPromptPlan as buildDispatchPromptPlanInternal,\n buildDispatchPromptWithBootstrap as buildDispatchPromptWithBootstrapInternal,\n} from \"../dispatch/parse-dispatch-task\";\nimport { createExecutionHostCatalogClient } from \"../execution-host/catalog-client\";\nimport { launchExecutionHost } from \"../execution-host/launch\";\nimport { resolveComputerFileAccessStorePath } from \"../file-access/computer-file-access-store\";\nimport { resolveSystemLocalFolderPickerHelper } from \"../folder-picker/local-folder-picker-helper-process\";\nimport { createLocalFolderPickerService } from \"../folder-picker/local-folder-picker-service\";\nimport {\n emitDaemonLifecycleEvent,\n resolveRecentDaemonSignalStopCause,\n} from \"../lifecycle/daemon-lifecycle-journal\";\nimport { assertDaemonServiceLaunchScope } from \"../lifecycle/daemon-service-launch-scope\";\nimport {\n journalDaemonStopSignalEvidence,\n startDaemonServiceRegistrationReconcileLoop,\n} from \"../lifecycle/daemon-service-registration-reconcile\";\nimport { admitServiceAccountStop } from \"../lifecycle/service-account-authorization\";\nimport { createServiceConnectionEvidenceObserver } from \"../lifecycle/service-connection-evidence-observer\";\nimport { createOpenMeldToolsUpdateCoordinator } from \"../maintenance/openmeld-tools-update-coordinator\";\nimport type { RuntimeReportingAuthenticationFailure } from \"../reporting/runtime-reporting-auth-recovery\";\nimport { createRuntimeReportingAuthenticationRecovery } from \"../reporting/runtime-reporting-auth-recovery\";\nimport {\n createMutableRouteCatalogState as createMutableRouteCatalogStateInternal,\n summarizeSkippedDaemonProfiles,\n syncDaemonRouteCatalogState as syncDaemonRouteCatalogStateInternal,\n} from \"../routing/route-catalog-state\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n} from \"../state/daemon-device-id\";\nimport {\n buildDaemonProcessCommand,\n createDaemonRuntimeState,\n resolveDaemonRunMode,\n resolveServiceConnectionReconnectBackoffMs,\n toDaemonStreamUrl,\n} from \"../state/daemon-runtime-state\";\nimport { ensureDaemonRuntimeContractState } from \"../state/runtime-contract-guard\";\nimport {\n createDaemonRuntimeStateTracker,\n resolveDaemonRuntimeLeaseDescriptor,\n} from \"../state/runtime-state-tracker\";\nimport {\n classifyConnectionFailureReason,\n createServiceConnectionStateTracker,\n type ServiceConnectionAuthState,\n type ServiceConnectionDegradedReason,\n toHealthProjection,\n} from \"../state/service-connection-state\";\nimport { runDaemonSocketSession } from \"./run-socket-session\";\nimport { createServiceLocalComponentsObservation } from \"./service-local-components-observation\";\nimport { createStopAwareDelay } from \"./stop-aware-delay\";\n\nexport function buildDispatchPromptWithBootstrap(\n input: Parameters<typeof buildDispatchPromptWithBootstrapInternal>[0]\n): string {\n return buildDispatchPromptWithBootstrapInternal(input);\n}\n\nexport function buildDispatchPromptPlan(\n input: Parameters<typeof buildDispatchPromptPlanInternal>[0]\n): ReturnType<typeof buildDispatchPromptPlanInternal> {\n return buildDispatchPromptPlanInternal(input);\n}\n\nexport function buildDispatchBootstrapTemplateFacts(\n input: Parameters<typeof buildDispatchBootstrapTemplateFactsInternal>[0]\n) {\n return buildDispatchBootstrapTemplateFactsInternal(input);\n}\n\nexport function createMutableRouteCatalogState(\n routeCatalog: RouteCatalog\n): MutableRouteCatalogState {\n return createMutableRouteCatalogStateInternal(routeCatalog);\n}\n\nfunction buildLocalServiceCapabilityHeaders(input: {\n localFolderPickerAvailable: boolean;\n}): Record<string, string> {\n return {\n ...(process.platform === \"darwin\"\n ? { [SPACE_WORK_HANDOFF_CAPABILITY_HEADER]: \"1\" }\n : {}),\n [OPENMELD_REASONING_STREAM_HEADER]: \"1\",\n [OPENMELD_COMPUTER_CARE_HEADER]: \"1\",\n [OPENMELD_EXECUTION_ADMISSION_HEADER]: \"1\",\n ...(input.localFolderPickerAvailable\n ? {\n [OPENMELD_LOCAL_FOLDER_PICKER_CAPABILITY_HEADER]:\n LOCAL_FOLDER_PICKER_RUNTIME_CAPABILITY,\n }\n : {}),\n [OPENMELD_RUNTIME_CAPABILITIES_HEADER]:\n COMPUTER_FILE_ACCESS_RUNTIME_CAPABILITY,\n };\n}\n\n// A stored session can be locally valid while its credentials are still not\n// attachable to the gateway stream URL (for example authBaseUrl written by a\n// different lane, so host compatibility fails). Dialing bare in that state is\n// what produced the production 401 relaunch storm, so the connect path treats\n// it as authentication_required and never sends the handshake.\ntype DaemonStreamCredentialFailure = {\n retryAfterMs?: number;\n authHost: string | null;\n expectedGatewayHost: string | null;\n reason: AuthRequestCredentialFailureReason;\n requestHost: string | null;\n status: \"dropped\";\n};\n\nclass DaemonStreamAuthenticationRequiredError extends Error {\n readonly authState: ServiceConnectionAuthState;\n readonly credentialFailure: DaemonStreamCredentialFailure | null;\n\n constructor(input: {\n authState: ServiceConnectionAuthState;\n credentialFailure?: DaemonStreamCredentialFailure;\n }) {\n super(\n input.credentialFailure\n ? `authentication required before connecting daemon stream (session=${input.authState}, credentials=${input.credentialFailure.reason}, requestHost=${input.credentialFailure.requestHost ?? \"unknown\"}, authHost=${input.credentialFailure.authHost ?? \"unknown\"}, expectedGatewayHost=${input.credentialFailure.expectedGatewayHost ?? \"unknown\"})`\n : `authentication required before connecting daemon stream (session=${input.authState})`\n );\n this.authState = input.authState;\n this.credentialFailure = input.credentialFailure ?? null;\n this.name = \"DaemonStreamAuthenticationRequiredError\";\n }\n}\n\nexport async function syncDaemonRouteCatalogState(input: {\n catalogState: MutableRouteCatalogState;\n forceRegister?: boolean;\n leasesByProfileId: Map<string, number>;\n loadCatalog: () => Promise<RouteCatalog>;\n registerCatalog: (\n routeCatalog: RouteCatalog\n ) => Promise<\n import(\"@openmeld/schemas/types\").RuntimeTransportRegisterSessionResponse\n >;\n}): Promise<RouteCatalogSyncResult> {\n return await syncDaemonRouteCatalogStateInternal(input);\n}\n\nexport function resolveAdaptiveHeartbeatIntervalMs(\n input: Parameters<typeof resolveAdaptiveHeartbeatIntervalMsInternal>[0]\n): number {\n return resolveAdaptiveHeartbeatIntervalMsInternal(input);\n}\n\nexport function applyIntervalJitterMs(\n input: Parameters<typeof applyIntervalJitterMsInternal>[0]\n): number {\n return applyIntervalJitterMsInternal(input);\n}\n\nexport function resolveCatalogSyncIntervalMs(\n input: Parameters<typeof resolveCatalogSyncIntervalMsInternal>[0]\n): number {\n return resolveCatalogSyncIntervalMsInternal(input);\n}\n\nexport async function resolveDaemonServiceOwnerContext(input: {\n openMeldProfileId?: string;\n}): Promise<{\n ownerUserId: string;\n ownerName: string | null;\n openMeldProfile: Awaited<ReturnType<typeof requireOpenMeldProfile>> | null;\n}> {\n const explicitOpenMeldProfileId = normalizeText(input.openMeldProfileId);\n if (explicitOpenMeldProfileId) {\n return resolveDaemonServiceOwnerContextFromProfile(\n await requireOpenMeldProfile({\n openMeldProfileId: explicitOpenMeldProfileId,\n persistSelection: false,\n authAction: \"starting OpenMeld Service\",\n }),\n \"selected profile is missing owner user id\"\n );\n }\n\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n const authSession = authState?.session ?? null;\n const authOwnerUserId = normalizeText(authSession?.user?.id);\n if (authOwnerUserId) {\n return {\n ownerUserId: authOwnerUserId,\n ownerName: normalizeOptionalText(authSession?.user?.name),\n openMeldProfile: null,\n };\n }\n\n const fallbackProfile = await resolveOpenMeldProfileOrNull({\n allowDefaultFallback: true,\n allowUnauthenticated: false,\n persistSelection: false,\n }).catch(() => null);\n if (fallbackProfile) {\n return resolveDaemonServiceOwnerContextFromProfile(\n fallbackProfile,\n \"resolved OpenMeld profile is missing owner user id\"\n );\n }\n\n if (authState?.state !== \"valid\" || authSession === null) {\n console.warn(\"[openmeld.daemon.owner_auth_not_ready]\", {\n error: authState?.errorMessage,\n reasonCode: authState?.reasonCode ?? \"session_state_unavailable\",\n state: authState?.state ?? \"unavailable\",\n });\n throw new DaemonServiceRunError({\n code: \"daemon.run.auth_required\",\n message: \"authentication required before starting OpenMeld Service\",\n });\n }\n\n throw new DaemonServiceRunError({\n code: \"daemon.run.owner_missing\",\n message:\n \"authenticated session is missing user id and no OpenMeld profile could be resolved\",\n });\n}\n\nexport async function resolveDaemonStreamAuthContext(input: {\n requestUrl: string;\n selectedOpenMeldProfile: Awaited<\n ReturnType<typeof requireOpenMeldProfile>\n > | null;\n}): Promise<\n | {\n authState: \"valid\";\n credentialFingerprint: string;\n headers: Record<string, string>;\n status: \"ready\";\n }\n | {\n authState: Exclude<AuthSessionState, \"valid\">;\n credentialFailure?: DaemonStreamCredentialFailure;\n status: \"authentication_required\";\n }\n> {\n let headers: Record<string, string>;\n try {\n headers = await buildDaemonStreamRequestHeaders({\n requestUrl: input.requestUrl,\n selectedOpenMeldProfile: input.selectedOpenMeldProfile,\n });\n } catch (error) {\n if (!(error instanceof AuthRequestCredentialError)) {\n throw error;\n }\n // Fail closed: a handshake that would go out without Authorization must\n // not be dialed at all. The session exists but is unusable for this\n // gateway, which the connection state machine models as \"invalid\".\n return {\n authState: resolveCredentialFailureAuthState(error.reason),\n credentialFailure: toDaemonStreamCredentialFailure(error),\n status: \"authentication_required\",\n };\n }\n if (!headers.Authorization) {\n return {\n authState: \"missing\",\n status: \"authentication_required\",\n };\n }\n\n return {\n authState: \"valid\",\n credentialFingerprint: fingerprintRequestAuthorization(\n headers.Authorization\n ),\n headers,\n status: \"ready\",\n };\n}\n\nfunction resolveCredentialFailureAuthState(\n reason: AuthRequestCredentialFailureReason\n): Exclude<AuthSessionState, \"valid\"> {\n if (reason === \"session_expired\") {\n return \"expired\";\n }\n if (reason === \"remote_session_revoked\" || reason === \"session_revoked\") {\n return \"revoked\";\n }\n return \"invalid\";\n}\n\nfunction toDaemonStreamCredentialFailure(\n error: AuthRequestCredentialError\n): DaemonStreamCredentialFailure {\n return {\n ...(error.retryAfterMs !== undefined\n ? { retryAfterMs: error.retryAfterMs }\n : {}),\n authHost: error.authHost,\n expectedGatewayHost: error.expectedGatewayHost,\n reason: error.reason,\n requestHost: error.requestHost,\n status: \"dropped\",\n };\n}\n\nasync function buildDaemonStreamRequestHeaders(input: {\n authSession?: StoredAuthSession;\n requestUrl: string;\n selectedOpenMeldProfile: Awaited<\n ReturnType<typeof requireOpenMeldProfile>\n > | null;\n}): Promise<Record<string, string>> {\n return input.selectedOpenMeldProfile\n ? await buildOpenMeldProfileRequestHeadersWithAuth({\n openMeldProfile: input.selectedOpenMeldProfile,\n ...(input.authSession ? { authSession: input.authSession } : {}),\n requestUrl: input.requestUrl,\n })\n : await buildRequestAuthHeaders({\n ...(input.authSession ? { authSession: input.authSession } : {}),\n requestUrl: input.requestUrl,\n });\n}\n\nexport function createControlledShutdownCoordinator(input: {\n hasUndrainedWork: () => boolean;\n isStopRequested: () => boolean;\n markStopping: () => void;\n}) {\n let activeSessionShutdownResolver:\n | ((stopCause: RuntimeTransportStopCause) => void)\n | null = null;\n let shutdownAttempt: PromiseWithResolvers<void> | null = null;\n\n const requestServiceStop = (\n stopCause: RuntimeTransportStopCause | Promise<RuntimeTransportStopCause>\n ): void => {\n if (input.isStopRequested()) {\n return;\n }\n input.markStopping();\n Promise.resolve(stopCause).then(\n (resolvedStopCause) => activeSessionShutdownResolver?.(resolvedStopCause),\n () => activeSessionShutdownResolver?.(\"unknown\")\n );\n };\n\n return {\n attachSession(\n shutdownResolver: (stopCause: RuntimeTransportStopCause) => void\n ): void {\n activeSessionShutdownResolver = shutdownResolver;\n },\n detachSession(\n shutdownResolver: (stopCause: RuntimeTransportStopCause) => void\n ): void {\n if (activeSessionShutdownResolver === shutdownResolver) {\n activeSessionShutdownResolver = null;\n }\n },\n failOutstanding(): void {\n shutdownAttempt?.reject(\n new DaemonServiceRunError({\n code: \"daemon.control.shutdown_drain_failed\",\n message:\n \"controlled shutdown ended before the runtime session drained\",\n })\n );\n },\n handleSessionCompleted(): void {\n if (!shutdownAttempt) {\n return;\n }\n requestServiceStop(\"controlled_service_update\");\n shutdownAttempt.resolve();\n },\n handleSessionFailure(error: unknown): void {\n shutdownAttempt?.reject(error);\n },\n requestServiceStop,\n async request(payload: {\n gracePeriodMs: number;\n mode: \"force\" | \"graceful\";\n onAdmission?: (commit: () => void) => Promise<void>;\n }): Promise<{\n accepted: true;\n gracePeriodMs: number;\n mode: \"force\" | \"graceful\";\n }> {\n return await withControlledStopRefusalProof({\n guarded: payload.onAdmission !== undefined,\n isStopping: () => shutdownAttempt !== null || input.isStopRequested(),\n run: async (markCommitted) => {\n const stopCause = await resolveRecentDaemonSignalStopCause();\n if (shutdownAttempt) {\n markCommitted();\n const existingAttempt = shutdownAttempt;\n await payload.onAdmission?.(() => undefined);\n await existingAttempt.promise;\n } else if (activeSessionShutdownResolver) {\n const currentAttempt = Promise.withResolvers<void>();\n const clearAttempt = () => {\n if (shutdownAttempt === currentAttempt) {\n shutdownAttempt = null;\n }\n };\n // Admission acknowledgement can fail after commit. The original\n // drain still owns completion and must retain its rejection handler.\n currentAttempt.promise.then(clearAttempt, clearAttempt);\n const resolver = activeSessionShutdownResolver;\n const commit = () => {\n if (\n shutdownAttempt ||\n activeSessionShutdownResolver !== resolver\n ) {\n throw new Error(\n \"Service session changed before Stop admission.\"\n );\n }\n markCommitted();\n shutdownAttempt = currentAttempt;\n resolver(stopCause);\n };\n await (payload.onAdmission ?? commitControlledStop)(commit);\n await currentAttempt.promise;\n } else {\n if (input.hasUndrainedWork()) {\n throw new DaemonServiceRunError({\n code: \"daemon.control.shutdown_drain_unavailable\",\n message:\n \"controlled shutdown cannot verify active local work without a connected runtime session\",\n });\n }\n const commit = () => {\n if (activeSessionShutdownResolver || input.hasUndrainedWork()) {\n throw new Error(\"Service work changed before Stop admission.\");\n }\n markCommitted();\n requestServiceStop(stopCause);\n };\n await (payload.onAdmission ?? commitControlledStop)(commit);\n }\n return {\n accepted: true as const,\n gracePeriodMs: payload.gracePeriodMs,\n mode: payload.mode,\n };\n },\n });\n },\n };\n}\n\nfunction commitControlledStop(commit: () => void): void {\n commit();\n}\n\nasync function withControlledStopRefusalProof<T>(input: {\n guarded: boolean;\n isStopping: () => boolean;\n run: (markCommitted: () => void) => Promise<T>;\n}): Promise<T> {\n let committed = input.isStopping();\n try {\n return await input.run(() => {\n committed = true;\n });\n } catch (error) {\n // Only the existing stop coordinator can prove that its commit never\n // happened. A missing acknowledgement or a pending disk record cannot.\n if (input.guarded && !committed && !input.isStopping()) {\n throw new ServiceAccountAdmissionError(\n \"stop_refused\",\n error instanceof Error ? error.message : String(error)\n );\n }\n throw error;\n }\n}\n\nasync function runSocketSessionWithControlledShutdown(input: {\n controlledShutdown: ReturnType<typeof createControlledShutdownCoordinator>;\n sessionInput: Parameters<typeof runDaemonSocketSession>[0];\n}): Promise<void> {\n const sessionShutdown = Promise.withResolvers<RuntimeTransportStopCause>();\n input.controlledShutdown.attachSession(sessionShutdown.resolve);\n try {\n await runDaemonSocketSession({\n ...input.sessionInput,\n shutdownRequested: sessionShutdown.promise,\n });\n } catch (error) {\n input.controlledShutdown.handleSessionFailure(error);\n throw error;\n } finally {\n input.controlledShutdown.detachSession(sessionShutdown.resolve);\n }\n input.controlledShutdown.handleSessionCompleted();\n}\n\nexport const runDaemonServiceLoop = async (\n input: DaemonServiceRunInput\n): Promise<void> => {\n const auth = await getAuthSessionState({ refreshExpired: true });\n if (auth.state !== \"valid\" || !auth.session?.user?.id) {\n throw new Error(\"A valid CLI account is required to start this Service.\");\n }\n return await withAdmittedServiceSession(\n auth.session,\n async () => await runAccountBoundDaemonServiceLoop(input)\n );\n};\n\nasync function launchAccountExecutionHost(input: {\n ownerUserId: string;\n deviceId: string;\n lane: string;\n daemonSessionId: string;\n contract: Awaited<ReturnType<typeof readDaemonServiceContract>>;\n baseUrl: string;\n presenter: Presenter;\n}) {\n const session = (await getAuthSessionState()).session;\n if (!(session && input.contract) || session.user?.id !== input.ownerUserId) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.host_identity_missing\",\n message:\n \"The Service account or installation cannot be verified for local execution.\",\n });\n }\n const parentProcessStartedAt =\n process.platform === \"win32\"\n ? CURRENT_PROCESS_START_IDENTITY\n : readProcessStartIdentity(process.pid);\n if (!parentProcessStartedAt) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.host_parent_unknown\",\n message: \"The Service process cannot be verified for local execution.\",\n });\n }\n return launchExecutionHost({\n identity: {\n ownerUserId: input.ownerUserId,\n deviceId: input.deviceId,\n lane: daemonServiceLaneSchema.parse(input.lane),\n daemonSessionId: input.daemonSessionId,\n serviceContractGeneration: input.contract.generation,\n sessionIdentity: buildStoredAuthSessionIdentity(session),\n stateRoot: resolveOpenMeldRootDir(),\n authBaseUrl: session.authBaseUrl,\n gatewayBaseUrl: input.baseUrl,\n parentPid: process.pid,\n parentProcessStartedAt,\n },\n onFailure: (error) =>\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.execution_host_unavailable\",\n text: `Local execution is unavailable: ${toErrorMessage(error)}`,\n }),\n });\n}\n\nconst runAccountBoundDaemonServiceLoop = async (\n input: DaemonServiceRunInput\n): Promise<void> => {\n await assertDaemonServiceLaunchScope();\n // OPENMELD_SERVICE_THIN_CORE: local-worker-carrier entrypoint.\n // This loop owns local service identity, adapter inventory, socket lifetime,\n // heartbeat, and delivery to local runtimes. It must not become a product\n // readiness, Space truth, Binding truth, or final Wake outcome owner.\n const baseUrl = await resolveBaseUrl(input.baseUrl);\n const ownerContext = await resolveDaemonServiceOwnerContext({\n openMeldProfileId: input.profile,\n });\n const selectedOpenMeldProfile = ownerContext.openMeldProfile;\n const ownerUserId = ownerContext.ownerUserId;\n\n const runtimePaths = await ensureDaemonRuntimePaths();\n const runtimeContractGuardResult = await ensureDaemonRuntimeContractState({\n runtimePaths,\n });\n if (runtimeContractGuardResult.action === \"repair_applied\") {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.runtime_state_repaired\",\n text:\n \"OpenMeld fixed a local runtime mismatch automatically.\\n\" +\n \"Your account, profiles, and spaces were not changed.\\n\" +\n \"No action needed.\",\n payload: {\n reason: runtimeContractGuardResult.reason,\n report: runtimeContractGuardResult.report,\n },\n });\n }\n const deviceId = await resolveDaemonDeviceId({\n deviceId: input.deviceId,\n deviceIdPath: runtimePaths.deviceIdPath,\n });\n const localFolderPicker = createLocalFolderPickerService({\n deviceId,\n runHelper: resolveSystemLocalFolderPickerHelper(),\n });\n const daemonServiceContract = await readDaemonServiceContract().catch(\n () => null\n );\n const lane = resolveDaemonServiceLane(daemonServiceContract);\n const daemonSessionId = randomUUID();\n const heartbeatIntervalMs = normalizeHeartbeatIntervalMs(\n input.heartbeatIntervalMs\n );\n const dispatchLimits = await getConfiguredDaemonDispatchLimits();\n const mode = resolveDaemonRunMode(input.mode);\n const now = nowIsoString();\n const runtimeMetadata = resolveDaemonServiceRuntimeMetadata();\n const daemonRuntimeState = createDaemonRuntimeState({\n heartbeatAt: null,\n mode,\n gatewayUrl: baseUrl,\n pid: process.pid,\n openMeldProfileId: normalizeText(\n selectedOpenMeldProfile?.openMeldProfileId\n ),\n workingDirectory: process.cwd(),\n startedAt: now,\n updatedAt: now,\n command: buildDaemonProcessCommand(),\n stopRequestedAt: null,\n runtimeMetadata,\n });\n const runtimeLeaseDescriptor = await resolveDaemonRuntimeLeaseDescriptor({\n command: daemonRuntimeState.command,\n });\n const runtimeStateTracker = createDaemonRuntimeStateTracker({\n initialState: daemonRuntimeState,\n leaseDescriptor: runtimeLeaseDescriptor,\n });\n // Correlation only: the existing connection tracker and retry counter still\n // own connection facts and policy. No recovery intent is persisted here.\n let recovery: { recoveryId: string; disconnectedAt: number } | null = null;\n const connectionEvidence = createServiceConnectionEvidenceObserver({\n ownerUserId: ownerContext.ownerUserId,\n gatewayUrl: baseUrl,\n identity: {\n deviceId,\n runtimeLane: daemonServiceLaneSchema.parse(lane),\n serviceSessionId: daemonSessionId,\n serviceVersion: OPENMELD_VERSION,\n },\n getRecovery: () => recovery,\n isStopping: () => stopRequested,\n });\n const recoveryMetadata = () => ({\n ...describeConnectionRecovery(recovery),\n connectionDiagnosticId: connectionEvidence.connectionDiagnosticId,\n attempt: reconnectAttempt,\n });\n const connectionState = createRunLoopConnectionStateTracker(\n input.presenter,\n recoveryMetadata\n );\n const localComponentsObservation = createServiceLocalComponentsObservation({\n onError: (error) =>\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.local_components_status_failed\",\n text: `local components status unavailable: ${toErrorMessage(error)}`,\n }),\n });\n\n const executionHost = await launchAccountExecutionHost({\n ownerUserId,\n deviceId,\n lane,\n daemonSessionId,\n contract: daemonServiceContract,\n baseUrl,\n presenter: input.presenter,\n });\n // Start transport with a lease-neutral placeholder; Host initialization and\n // provider discovery never block control or the first cloud registration.\n const routeCatalogState = createMutableRouteCatalogStateInternal({\n profileIds: [],\n routeByProfileId: new Map(),\n skippedProfiles: [],\n });\n const routeCatalogLoader = createExecutionHostCatalogClient(executionHost);\n\n let stopRequested = false;\n // Reconnect backoff waits must wake the moment a stop request arrives, or\n // the loop sleeps through the entire backoff tier (up to 15 minutes on the\n // auth_rejected ladder) before it can observe `stopRequested`.\n const reconnectBackoffDelay = createStopAwareDelay();\n let reconnectAttempt = 0;\n let activeSocket: WsClient | null = null;\n let activeCredentialFingerprint: string | null = null;\n const recoverRuntimeReportingAuthentication =\n createRuntimeReportingAuthenticationRecovery({\n requestCarrierHandshake: () => {\n activeSocket?.close(1012, \"runtime_reporting_auth_recovery\");\n },\n });\n const requestRuntimeReportingAuthenticationRecovery = async (input: {\n expectedSocket: WsClient | null;\n failure: RuntimeReportingAuthenticationFailure;\n }): Promise<void> => {\n if (!input.expectedSocket || activeSocket !== input.expectedSocket) {\n warnDaemonEvent(\"[openmeld.runtime_reporting.auth_recovery_ignored]\", {\n event: \"cli.runtime_reporting.auth_recovery_ignored\",\n reason: input.expectedSocket ? \"stale_socket\" : \"socket_unavailable\",\n reasonCode: input.failure.reasonCode,\n });\n return;\n }\n if (input.failure.credentialFingerprint !== activeCredentialFingerprint) {\n return;\n }\n const recovery = await recoverRuntimeReportingAuthentication(input.failure);\n warnDaemonEvent(\"[openmeld.runtime_reporting.auth_recovery]\", {\n event: \"cli.runtime_reporting.auth_recovery\",\n reasonCode: input.failure.reasonCode,\n ...(recovery.status === \"debounced\"\n ? { retryAfterMs: recovery.retryAfterMs }\n : {}),\n status: recovery.status,\n });\n };\n let requestActiveRouteCatalogSync:\n | ((reason: string) => Promise<RouteCatalogSyncResult>)\n | null = null;\n const controlledShutdown = createControlledShutdownCoordinator({\n hasUndrainedWork: () => {\n const observed = executionHost.snapshot();\n return (\n !(executionHost.available() && observed?.localQuiescent) ||\n observed.unacknowledgedResultCount > 0\n );\n },\n isStopRequested: () => stopRequested,\n markStopping: () => {\n stopRequested = true;\n connectionState.set(\"stopping\");\n reconnectBackoffDelay.interrupt();\n },\n });\n const controlPlaneDaemonVersion =\n daemonServiceContract?.daemonVersion ?? \"unknown\";\n const requestAgentActivitySync = (refreshIntegrations = false) => {\n executionHost\n .call(\n \"syncActivity\",\n refreshIntegrations ? { refreshIntegrations: true } : {}\n )\n .catch((error: unknown) =>\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.agent_activity_sync_failed\",\n text: `Agent Activity sync unavailable: ${toErrorMessage(error)}`,\n })\n );\n };\n const controlPlaneServer = await startLocalDaemonControlPlaneServer({\n // Resolve the current file-backed token per request. Older CLIs may rotate\n // that file before stopping this Service, so caching it here would make the\n // running Service reject every later control request until it restarts.\n resolveExpectedToken: async () => await ensureDaemonControlPlaneToken(),\n onRequestPhase: (event) => {\n emitRunLine({\n presenter: input.presenter,\n code: `daemon.control.request_${event.phase}`,\n text: `local Service control request ${event.phase.replaceAll(\"_\", \" \")}`,\n payload: {\n ...(event.command ? { command: event.command } : {}),\n ...(event.requestId ? { requestId: event.requestId } : {}),\n },\n });\n },\n getContext: async () => ({\n accountCheckedServiceControl: isPreciseProcessStartIdentity(\n CURRENT_PROCESS_START_IDENTITY\n ),\n healthPayload: {\n checkedAt: nowIsoString(),\n ...toHealthProjection(\n stopRequested\n ? { ...connectionState.get(), state: \"stopping\" }\n : connectionState.get()\n ),\n },\n historyEntries: [],\n interruptHandler: async (payload) =>\n await executionHost.call(\"interrupt\", payload),\n cancelHandler: async (payload) =>\n await executionHost.call(\"cancel\", payload),\n conversationExecutionStatusHandler: async (payload) =>\n await executionHost.call(\"conversationStatus\", payload),\n requestAgentActivitySyncHandler: async () => {\n await executionHost.call(\"syncActivity\", {});\n return { accepted: true };\n },\n syncRouteCatalogHandler: async (payload) =>\n await handleLocalControlPlaneRouteCatalogSync({\n payload,\n presenter: input.presenter,\n requestActiveRouteCatalogSync,\n routeCatalogState,\n }),\n setLocalAgentEnabledHandler: async (payload) =>\n await executionHost.call(\"setEnabled\", payload),\n shutdownHandler: async (payload, lifecycle) => {\n // Read local work through its owner, not a network session's registry.\n // This observation grants no admission; the existing account-checked\n // coordinator below still owns Stop and its pre-commit refusal proof.\n await executionHost.call(\"health\", {});\n const admissionId = payload.accountAdmissionId;\n return await controlledShutdown.request({\n ...payload,\n onAdmission: async (commit: () => void) => {\n const commitAndReportAdmission = () => {\n commit();\n lifecycle?.onAdmitted();\n };\n if (admissionId) {\n await admitServiceAccountStop({\n id: admissionId,\n ownerUserId,\n deviceId,\n contractGeneration: daemonServiceContract?.generation ?? 0,\n commit: commitAndReportAdmission,\n });\n return;\n }\n commitAndReportAdmission();\n },\n });\n },\n serviceUpdateReadinessHandler: async () => {\n const observed = await executionHost.call(\"health\", {});\n return {\n acceptedWakeCount: observed.activeCount + observed.pendingCount,\n safeToSwitch:\n observed.localQuiescent && observed.unacknowledgedResultCount === 0,\n unacknowledgedResultCount: observed.unacknowledgedResultCount,\n };\n },\n statusPayload: {\n checkedAt: nowIsoString(),\n daemonVersion: controlPlaneDaemonVersion,\n installed: true,\n running: !stopRequested,\n runtimeRoot: daemonRuntimeRootPath(),\n },\n }),\n }).catch(async (error: unknown) => {\n await executionHost.close();\n localComponentsObservation.dispose();\n await localFolderPicker.close();\n throw error;\n });\n try {\n await runtimeStateTracker.touchRuntimeState({}, { forcePersist: true });\n } catch (error) {\n await controlPlaneServer.close();\n await executionHost.close();\n throw error;\n }\n\n const journalStopSignalEvidence = (signal: \"SIGINT\" | \"SIGTERM\"): void => {\n journalDaemonStopSignalEvidence(signal, {\n onWarn: (message, payload) => {\n warnDaemonEvent(\"[openmeld.service_registration.stop_signal]\", {\n event: \"cli.service_registration.stop_signal_warning\",\n message,\n ...payload,\n });\n },\n });\n };\n const onSigint = () => {\n journalStopSignalEvidence(\"SIGINT\");\n controlledShutdown.requestServiceStop(\"user_stop\");\n };\n const onSigterm = () => {\n journalStopSignalEvidence(\"SIGTERM\");\n controlledShutdown.requestServiceStop(resolveRecentDaemonSignalStopCause());\n };\n process.on(\"SIGINT\", onSigint);\n process.on(\"SIGTERM\", onSigterm);\n\n const stopRegistrationReconcile = startDaemonServiceRegistrationReconcileLoop(\n {\n isStopRequested: () => stopRequested,\n onWarn: (message, payload) => {\n warnDaemonEvent(\"[openmeld.service_registration.reconcile]\", {\n event: \"cli.service_registration.reconcile_warning\",\n message,\n ...payload,\n });\n },\n }\n );\n const openMeldToolsUpdateCoordinator = createOpenMeldToolsUpdateCoordinator(\n {\n reportBackgroundError: (error) => {\n warnDaemonEvent(\"[openmeld.tools.update_failed]\", {\n event: \"cli.openmeld_tools.update_failed\",\n errorMessage: toErrorMessage(error),\n });\n },\n },\n { executeUpdates: false }\n );\n\n const refreshAgentActivityForProjectConnectionChange = () =>\n requestAgentActivitySync(true);\n\n const unsubscribeCredentialAvailability = onAuthSessionCredentialAvailable(\n () => {\n if (connectionState.get().reason === \"auth_unavailable\") {\n reconnectBackoffDelay.wake();\n }\n }\n );\n const unsubscribeCredentialObservation = onAuthSessionCredentialObservation(\n (reason) => connectionEvidence.credential(reason)\n );\n try {\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.start\",\n text: `starting local service loop (gateway=${baseUrl}, owner=${ownerUserId}, profiles=resolving)`,\n payload: {\n adapterId: null,\n baseUrl,\n daemonSessionId,\n deviceId,\n dispatchLimits,\n dispatchId: null,\n durationMs: null,\n errorCode: null,\n heartbeatIntervalMs,\n localAdapterIds: executionHost.snapshot()?.adapterIds ?? [],\n ownerUserId,\n profileId: null,\n profileIds: routeCatalogState.profileIds,\n result: \"started\",\n routeCatalogResolved: routeCatalogLoader.isResolved(),\n step: \"run.start\",\n taskId: null,\n transportMode: null,\n },\n });\n // Waiting-for-profiles messaging now belongs to the in-session catalog\n // sync handlers: at this point the catalog is an unresolved placeholder,\n // so an empty profile list here says nothing about eligibility yet.\n\n while (!stopRequested) {\n try {\n connectionEvidence.beginAttempt();\n connectionState.set(\"connecting\", {\n reason: resolveConnectingReason(reconnectAttempt),\n });\n const connectionUrl = new URL(toDaemonStreamUrl(baseUrl));\n connectionUrl.searchParams.set(\n SERVICE_CONNECTION_ID_QUERY_PARAMETER,\n connectionEvidence.connectionDiagnosticId\n );\n const wsUrl = connectionUrl.toString();\n const authContext = await resolveDaemonStreamAuthContext({\n requestUrl: wsUrl,\n selectedOpenMeldProfile,\n });\n if (authContext.status === \"authentication_required\") {\n throwDaemonStreamAuthenticationRequired({\n authState: authContext.authState,\n connectionState,\n credentialFailure: authContext.credentialFailure ?? null,\n });\n }\n connectionEvidence.opening();\n const ws = await connectWebSocket(wsUrl, {\n headers: {\n ...authContext.headers,\n ...buildLocalServiceCapabilityHeaders({\n localFolderPickerAvailable: localFolderPicker.available,\n }),\n },\n openTimeoutMs: DAEMON_STREAM_CONNECT_TIMEOUT_MS,\n });\n if (stopRequested) {\n // A stop that lands while the handshake is in flight cannot reach\n // this socket through the stop coordinator (activeSocket is still\n // null), so\n // close it here instead of starting a session that outlives the\n // stop request.\n ws.close(1000, \"shutdown\");\n break;\n }\n activeSocket = ws;\n activeCredentialFingerprint = authContext.credentialFingerprint;\n connectionEvidence.opened(ws);\n\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.connected\",\n text: `daemon stream connected (${wsUrl})`,\n });\n\n await runSocketSessionWithControlledShutdown({\n controlledShutdown,\n sessionInput: {\n attachRouteCatalogSyncInvoker: (invoker) => {\n requestActiveRouteCatalogSync = invoker;\n },\n executionHost,\n computerFileAccessStorePath: resolveComputerFileAccessStorePath(\n runtimePaths.dataRootPath\n ),\n daemonSessionId,\n deviceId,\n serviceContractGeneration: daemonServiceContract?.generation ?? 0,\n foregroundActive: mode === \"foreground\",\n heartbeatIntervalMs,\n isRouteCatalogResolved: routeCatalogLoader.isResolved,\n lane,\n loadRouteCatalog: routeCatalogLoader.load,\n localComponentsObservation,\n onRuntimeReportingAuthenticationFailure: async (failure) => {\n await requestRuntimeReportingAuthenticationRecovery({\n expectedSocket: ws,\n failure,\n });\n },\n onAgentActivitySessionsChanged: requestAgentActivitySync,\n onLocalProjectConnectionsChanged:\n refreshAgentActivityForProjectConnectionChange,\n openMeldToolsUpdateCoordinator,\n ownerUserId,\n presenter: input.presenter,\n persistRouteCatalogCache: routeCatalogLoader.persist,\n reconnectAttempt,\n routeCatalogState,\n selectLocalFolders: localFolderPicker.selectFolders,\n socket: ws,\n touchRuntimeState: async (updates) => {\n if (typeof updates.heartbeatAt === \"string\") {\n connectionEvidence.acknowledged(\n updates.heartbeatAt,\n connectionState.get().state !== \"online\"\n );\n connectionState.set(\"online\");\n reconnectAttempt = 0;\n recovery = null;\n }\n await runtimeStateTracker.touchRuntimeState(updates);\n },\n },\n });\n\n activeSocket = null;\n requestActiveRouteCatalogSync = null;\n } catch (error) {\n activeSocket = null;\n requestActiveRouteCatalogSync = null;\n if (stopRequested) {\n break;\n }\n recovery ??= { recoveryId: randomUUID(), disconnectedAt: Date.now() };\n reconnectAttempt += 1;\n const backoffMs = noteRunLoopReconnectScheduled({\n connectionState,\n error,\n foregroundActive: mode === \"foreground\",\n presenter: input.presenter,\n reconnectAttempt,\n });\n connectionEvidence.retry(\n error,\n connectionState.get().reason,\n backoffMs\n );\n await reconnectBackoffDelay.wait(backoffMs);\n }\n }\n } finally {\n connectionEvidence.dispose();\n localComponentsObservation.dispose();\n unsubscribeCredentialObservation();\n unsubscribeCredentialAvailability();\n controlledShutdown.failOutstanding();\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n try {\n // Do not clear the runtime or report stopped while its accepted work is\n // still draining. A lost Host fails explicitly instead of claiming exit.\n await executionHost.close();\n await clearDaemonServiceRuntimeState();\n } finally {\n await Promise.all([\n controlPlaneServer.close(),\n localFolderPicker.close(),\n stopRegistrationReconcile(),\n ]);\n }\n }\n\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.stopped\",\n text: \"local service loop stopped\",\n });\n};\n\n// Route refresh reads configured routes, never controller installation probes.\nexport async function loadFreshDaemonRouteCatalog(input: {\n localAdapterContainer: LocalDaemonAdapterContainer;\n ownerUserId: string;\n presenter: Presenter;\n}): Promise<RouteCatalog> {\n const { loadDaemonRouteCatalog } = await import(\"../routing/route-catalog\");\n return await loadDaemonRouteCatalog({\n ...input,\n allowEmpty: true,\n localReplyStateMode: \"check\",\n quiet: true,\n });\n}\n\n// The first successful load resolves the bootstrap placeholder. Only then may\n// a fresh empty catalog remove registered routes; load failures never do so.\nexport function createRouteCatalogSyncLoader(deps: {\n loadFresh: () => Promise<RouteCatalog>;\n loadInitial: () => Promise<RouteCatalog>;\n}): {\n isResolved: () => boolean;\n load: () => Promise<RouteCatalog>;\n} {\n let resolved = false;\n return {\n isResolved: () => resolved,\n load: async () => {\n if (resolved) {\n return await deps.loadFresh();\n }\n const catalog = await deps.loadInitial();\n resolved = true;\n return catalog;\n },\n };\n}\n\nfunction resolveDaemonServiceLane(\n contract: Awaited<ReturnType<typeof readDaemonServiceContract>> | null\n): string {\n if (contract?.lane) {\n return contract.lane;\n }\n throw new DaemonServiceRunError({\n code: \"daemon.run.service_contract_lane_missing\",\n message:\n \"OpenMeld Service cannot start because its service contract is missing the runtime lane. Run `openmeld service repair`, then `openmeld service start`.\",\n });\n}\n\nfunction resolveDaemonServiceOwnerContextFromProfile(\n openMeldProfile: Awaited<ReturnType<typeof requireOpenMeldProfile>>,\n ownerMissingMessage: string\n): {\n ownerUserId: string;\n ownerName: string | null;\n openMeldProfile: Awaited<ReturnType<typeof requireOpenMeldProfile>>;\n} {\n const ownerUserId = normalizeText(openMeldProfile.ownerUserId);\n if (!ownerUserId) {\n throw new DaemonServiceRunError({\n code: \"daemon.run.owner_missing\",\n message: ownerMissingMessage,\n });\n }\n return {\n ownerUserId,\n ownerName: normalizeOptionalText(openMeldProfile.ownerName),\n openMeldProfile,\n };\n}\n\ntype LocalControlSyncRouteCatalogPayload = Extract<\n OpenMeldDaemonControlPlaneResponse,\n { code: \"service.sync_route_catalog\" }\n>[\"payload\"];\n\nasync function handleLocalControlPlaneRouteCatalogSync(input: {\n payload: OpenMeldDaemonSyncRouteCatalogRequestPayload;\n presenter: Presenter;\n requestActiveRouteCatalogSync:\n | ((reason: string) => Promise<RouteCatalogSyncResult>)\n | null;\n routeCatalogState: MutableRouteCatalogState;\n}): Promise<LocalControlSyncRouteCatalogPayload> {\n if (!input.requestActiveRouteCatalogSync) {\n const payload: LocalControlSyncRouteCatalogPayload = {\n accepted: false,\n note: \"daemon_stream_not_connected\",\n profileIds: [...input.routeCatalogState.profileIds],\n syncStatus: \"deferred\",\n };\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_deferred\",\n text: \"local route catalog sync deferred because the daemon stream is not connected\",\n payload,\n });\n return payload;\n }\n\n const syncResult = await input.requestActiveRouteCatalogSync(\n input.payload.reason\n );\n const payload = toLocalControlSyncRouteCatalogPayload({\n routeCatalogState: input.routeCatalogState,\n syncResult,\n });\n const skippedProfilesSummary =\n summarizeLocalControlSyncSkippedProfiles(payload);\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.catalog_sync_requested\",\n text: `local route catalog sync ${payload.accepted ? \"completed\" : \"failed\"} (${payload.syncStatus})${skippedProfilesSummary}`,\n payload: {\n ...payload,\n reason: input.payload.reason,\n },\n });\n return payload;\n}\n\nfunction toLocalControlSyncRouteCatalogPayload(input: {\n routeCatalogState: MutableRouteCatalogState;\n syncResult: RouteCatalogSyncResult;\n}): LocalControlSyncRouteCatalogPayload {\n if (input.syncResult.status === \"changed\") {\n return {\n accepted: true,\n addedProfileIds: input.syncResult.diff.addedProfileIds,\n keptProfileIds: input.syncResult.diff.keptProfileIds,\n profileIds: [...input.routeCatalogState.profileIds],\n removedProfileIds: input.syncResult.diff.removedProfileIds,\n skippedProfiles: input.syncResult.skippedProfiles,\n syncStatus: \"changed\",\n };\n }\n if (input.syncResult.status === \"registered\") {\n return {\n accepted: true,\n keptProfileIds: [...input.routeCatalogState.profileIds],\n profileIds: [...input.routeCatalogState.profileIds],\n skippedProfiles: input.syncResult.skippedProfiles,\n syncStatus: \"registered\",\n };\n }\n if (input.syncResult.status === \"unchanged\") {\n return {\n accepted: true,\n profileIds: [...input.routeCatalogState.profileIds],\n skippedProfiles: input.syncResult.skippedProfiles,\n syncStatus: \"unchanged\",\n };\n }\n return {\n accepted: false,\n errorMessage: input.syncResult.errorMessage,\n note: input.syncResult.reason,\n profileIds: [...input.routeCatalogState.profileIds],\n syncStatus: \"failed\",\n };\n}\n\nfunction summarizeLocalControlSyncSkippedProfiles(\n payload: LocalControlSyncRouteCatalogPayload\n): string {\n if (!payload.skippedProfiles || payload.skippedProfiles.length === 0) {\n return \"\";\n }\n return `; skipped=${payload.skippedProfiles.length} (${summarizeSkippedDaemonProfiles(\n payload.skippedProfiles\n )})`;\n}\n\nfunction describeConnectionRecovery(\n recovery: { recoveryId: string; disconnectedAt: number } | null\n): Record<string, unknown> {\n return recovery\n ? {\n recoveryId: recovery.recoveryId,\n disconnectedAt: new Date(recovery.disconnectedAt).toISOString(),\n elapsedMs: Math.max(0, Date.now() - recovery.disconnectedAt),\n }\n : {};\n}\n\nfunction createRunLoopConnectionStateTracker(\n presenter: DaemonServiceRunInput[\"presenter\"],\n recoveryMetadata: () => Record<string, unknown>\n) {\n return createServiceConnectionStateTracker({\n onTransition: (next) => {\n emitRunLine({\n presenter,\n code: \"daemon.run.connection_state\",\n text: `connection state: ${next.state}${next.reason ? ` (${next.reason})` : \"\"}${next.detail ? ` - ${next.detail}` : \"\"}`,\n payload: {\n authState: next.authState,\n detail: next.detail,\n reason: next.reason,\n state: next.state,\n updatedAt: next.updatedAt,\n },\n });\n // The background presenter does not persist run lines, so transitions\n // also land in the lifecycle journal - the durable local record that\n // status surfaces and post-incident forensics read.\n emitDaemonLifecycleEvent({\n type: \"connection.state\",\n result: next.state,\n metadata: {\n ...recoveryMetadata(),\n authState: next.authState,\n detail: next.detail,\n reason: next.reason,\n },\n }).catch(() => undefined);\n },\n });\n}\n\n// Classifies a run-loop connection failure, records the degraded/auth state\n// and reconcile evidence, and returns the backoff to wait before the next\n// dial attempt.\nfunction noteRunLoopReconnectScheduled(input: {\n connectionState: ReturnType<typeof createServiceConnectionStateTracker>;\n error: unknown;\n foregroundActive: boolean;\n presenter: Presenter;\n reconnectAttempt: number;\n}): number {\n const errorMessage = toErrorMessage(input.error);\n const credentialFailure =\n input.error instanceof DaemonStreamAuthenticationRequiredError\n ? input.error.credentialFailure\n : null;\n let failureReason = classifyConnectionFailureReason(errorMessage);\n if (credentialFailure?.reason === \"session_token_unavailable\") {\n failureReason = \"auth_unavailable\";\n } else if (\n input.error instanceof DaemonStreamAuthenticationRequiredError ||\n (input.error instanceof WebSocketConnectionError &&\n input.error.status === 401)\n ) {\n failureReason = \"auth_rejected\";\n }\n let authState =\n input.error instanceof DaemonStreamAuthenticationRequiredError\n ? input.error.authState\n : null;\n if (failureReason === \"auth_unavailable\") {\n authState = null;\n }\n const policyBackoffMs = resolveServiceConnectionReconnectBackoffMs({\n attempt: input.reconnectAttempt,\n reason: failureReason,\n });\n const credentialRetryAfterMs = credentialFailure?.retryAfterMs ?? 0;\n let backoffMs = policyBackoffMs;\n if (failureReason === \"auth_unavailable\" && credentialRetryAfterMs > 0) {\n backoffMs = credentialRetryAfterMs;\n } else if (failureReason !== \"auth_rejected\") {\n backoffMs = applyIntervalJitterMs({\n baseIntervalMs: policyBackoffMs,\n minIntervalMs: DEFAULT_RECONNECT_DELAY_MS,\n maxIntervalMs: MAX_RECONNECT_DELAY_MS,\n jitterRatio: 0.2,\n });\n }\n noteReconnectFailureState({\n authState,\n connectionState: input.connectionState,\n errorMessage,\n failureReason,\n });\n const reconcileDecision = resolveRouteRegistrationReconcileDecision({\n driftDetected: true,\n foregroundActive: input.foregroundActive,\n });\n emitDriftDetectedEvidence({\n action: reconcileDecision.action,\n backoffMs,\n driftClass: reconcileDecision.driftClass,\n error: errorMessage,\n foregroundActive: reconcileDecision.foregroundActive,\n lifecycleLocked: reconcileDecision.lifecycleLocked,\n owner: reconcileDecision.owner,\n reconnectAttempt: input.reconnectAttempt,\n skipReason: reconcileDecision.skipReason,\n });\n emitReconcileStartedEvidence({\n action: reconcileDecision.action,\n backoffMs,\n driftClass: reconcileDecision.driftClass,\n error: errorMessage,\n foregroundActive: reconcileDecision.foregroundActive,\n lifecycleLocked: reconcileDecision.lifecycleLocked,\n owner: reconcileDecision.owner,\n reconnectAttempt: input.reconnectAttempt,\n skipReason: reconcileDecision.skipReason,\n });\n emitRunLine({\n presenter: input.presenter,\n code: \"daemon.run.reconnect\",\n text: `daemon stream reconnect scheduled in ${String(backoffMs)}ms (${errorMessage})`,\n payload: {\n attempt: input.reconnectAttempt,\n authState,\n backoffMs,\n error: errorMessage,\n reason: failureReason,\n reasonCode: input.reconnectAttempt >= 2 ? \"service_reconnecting\" : null,\n },\n });\n if (input.reconnectAttempt === 2) {\n warnDaemonEvent(\"[openmeld.daemon.stream_reconnecting]\", {\n automaticRetryContinues: true,\n error: errorMessage,\n reason: failureReason,\n reasonCode: \"service_reconnecting\",\n retryAfterMs: backoffMs,\n });\n }\n return backoffMs;\n}\n\nfunction noteReconnectFailureState(input: {\n authState: ServiceConnectionAuthState | null;\n connectionState: ReturnType<typeof createServiceConnectionStateTracker>;\n errorMessage: string;\n failureReason: ServiceConnectionDegradedReason;\n}): void {\n if (input.failureReason === \"auth_rejected\") {\n input.connectionState.set(\"authentication_required\", {\n authState: input.authState,\n detail: input.errorMessage,\n reason: \"auth_rejected\",\n });\n return;\n }\n input.connectionState.set(\"degraded\", {\n detail: input.errorMessage,\n reason: input.failureReason,\n });\n}\n\nfunction throwDaemonStreamAuthenticationRequired(input: {\n authState: Exclude<AuthSessionState, \"valid\">;\n connectionState: ReturnType<typeof createServiceConnectionStateTracker>;\n credentialFailure: DaemonStreamCredentialFailure | null;\n}): never {\n if (input.credentialFailure) {\n // stderr is wired to daemon-system-service.log by the service\n // controller, so the structured compatibility reason stays available\n // for diagnosis of \"why did the daemon stop dialing\".\n warnDaemonEvent(\"[openmeld.daemon.stream_credentials_not_attachable]\", {\n authHost: input.credentialFailure.authHost,\n event: \"cli.daemon.stream_credentials_not_attachable\",\n expectedGatewayHost: input.credentialFailure.expectedGatewayHost,\n reason: input.credentialFailure.reason,\n requestHost: input.credentialFailure.requestHost,\n });\n }\n noteAuthenticationRequiredState({\n authState: input.authState,\n connectionState: input.connectionState,\n credentialFailure: input.credentialFailure,\n });\n throw new DaemonStreamAuthenticationRequiredError({\n authState: input.authState,\n ...(input.credentialFailure\n ? { credentialFailure: input.credentialFailure }\n : {}),\n });\n}\n\nfunction noteAuthenticationRequiredState(input: {\n authState: Exclude<AuthSessionState, \"valid\">;\n connectionState: ReturnType<typeof createServiceConnectionStateTracker>;\n credentialFailure?: DaemonStreamCredentialFailure | null;\n}): void {\n const detail = input.credentialFailure\n ? `stored credentials are not attachable to the daemon stream (${input.credentialFailure.reason}: requestHost=${input.credentialFailure.requestHost ?? \"unknown\"}, authHost=${input.credentialFailure.authHost ?? \"unknown\"}, expectedGatewayHost=${input.credentialFailure.expectedGatewayHost ?? \"unknown\"})`\n : `connecting without credentials, session=${input.authState}`;\n if (input.credentialFailure?.reason === \"session_token_unavailable\") {\n input.connectionState.set(\"degraded\", {\n detail,\n reason: \"auth_unavailable\",\n });\n return;\n }\n input.connectionState.set(\"authentication_required\", {\n authState: input.authState,\n detail,\n reason: \"auth_rejected\",\n });\n}\n\nfunction resolveConnectingReason(\n reconnectAttempt: number\n): \"reconnecting\" | null {\n return reconnectAttempt > 0 ? \"reconnecting\" : null;\n}\n","import process from \"node:process\";\nimport { clearDaemonServiceRuntimeState } from \"../../config/daemon-state\";\nimport { emitDaemonLifecycleEvent } from \"./daemon-lifecycle-journal\";\n\ntype ProcessCrashEvent = \"uncaughtException\" | \"unhandledRejection\";\n\ntype ProcessCrashHandlerInput = {\n event: ProcessCrashEvent;\n reason: unknown;\n};\n\ntype ProcessLike = {\n off: (\n eventName: ProcessCrashEvent,\n listener: (...args: unknown[]) => void\n ) => unknown;\n on: (\n eventName: ProcessCrashEvent,\n listener: (...args: unknown[]) => void\n ) => unknown;\n};\n\ntype CrashGuardOptions = {\n clearRuntimeState?: () => Promise<void>;\n emitLifecycleEvent?: typeof emitDaemonLifecycleEvent;\n exit?: (code: number) => void;\n process?: ProcessLike;\n};\n\nexport type DaemonProcessCrashGuard = {\n dispose: () => void;\n};\n\nexport function installDaemonProcessCrashGuard(\n options: CrashGuardOptions = {}\n): DaemonProcessCrashGuard {\n const targetProcess = options.process ?? process;\n const exit = options.exit ?? ((code) => process.exit(code));\n let handlingCrash = false;\n\n const handleCrash = (input: ProcessCrashHandlerInput): void => {\n if (handlingCrash) {\n return;\n }\n handlingCrash = true;\n recordDaemonProcessCrash({\n clearRuntimeState:\n options.clearRuntimeState ?? clearDaemonServiceRuntimeState,\n emitLifecycleEvent:\n options.emitLifecycleEvent ?? emitDaemonLifecycleEvent,\n event: input.event,\n reason: input.reason,\n }).finally(() => {\n exit(1);\n });\n };\n\n const onUncaughtException = (error: unknown): void => {\n handleCrash({ event: \"uncaughtException\", reason: error });\n };\n const onUnhandledRejection = (reason: unknown): void => {\n handleCrash({ event: \"unhandledRejection\", reason });\n };\n\n targetProcess.on(\"uncaughtException\", onUncaughtException);\n targetProcess.on(\"unhandledRejection\", onUnhandledRejection);\n\n return {\n dispose: () => {\n targetProcess.off(\"uncaughtException\", onUncaughtException);\n targetProcess.off(\"unhandledRejection\", onUnhandledRejection);\n },\n };\n}\n\nexport async function recordDaemonProcessCrash(input: {\n clearRuntimeState: () => Promise<void>;\n emitLifecycleEvent: typeof emitDaemonLifecycleEvent;\n event: ProcessCrashEvent;\n reason: unknown;\n}): Promise<void> {\n const normalized = normalizeCrashReason(input.reason);\n await input\n .emitLifecycleEvent({\n type: \"daemon.crash\",\n result: \"failed\",\n metadata: {\n errorMessage: normalized.message,\n errorName: normalized.name,\n errorStack: normalized.stack,\n event: input.event,\n },\n command: \"openmeld service run\",\n intent: \"run_background\",\n })\n .catch(() => undefined);\n await input.clearRuntimeState().catch(() => undefined);\n}\n\nfunction normalizeCrashReason(reason: unknown): {\n message: string;\n name: string;\n stack?: string;\n} {\n if (reason instanceof Error) {\n return {\n message: normalizeErrorMessage(reason.message),\n name: normalizeErrorMessage(reason.name) || \"Error\",\n ...(typeof reason.stack === \"string\" && reason.stack.trim().length > 0\n ? { stack: reason.stack }\n : {}),\n };\n }\n return {\n message: normalizeErrorMessage(String(reason ?? \"\")) || \"unknown error\",\n name: \"NonErrorCrashReason\",\n };\n}\n\nfunction normalizeErrorMessage(value: string): string {\n return value.trim();\n}\n","import type {\n DaemonLifecycleIntent,\n DaemonRunMode,\n} from \"../../config/daemon-state\";\nimport { DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES } from \"./daemon-service-anomaly-groups\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n} from \"./daemon-service-inventory\";\n\nexport type DaemonServiceDesiredState =\n | \"not_installed\"\n | \"stopped\"\n | \"running_background\"\n | \"running_foreground\";\n\nexport type DaemonServiceCleanupAction =\n | \"clear_stale_runtime_state\"\n | \"stop_owned_processes\"\n | \"remove_system_service_registration\"\n | \"remove_runtime_artifacts\"\n | \"prepare_latest_bundle\"\n | \"repair_service_manager_registration\"\n | \"remove_inactive_bundles\";\n\nexport type DaemonServiceCleanupPlan = {\n intent: DaemonLifecycleIntent;\n desiredState: DaemonServiceDesiredState;\n anomalies: DaemonServiceInventory[\"anomalies\"];\n actions: DaemonServiceCleanupAction[];\n requiresConfirmation: boolean;\n autoApply: boolean;\n primaryFinding: string;\n summary: string;\n};\n\nexport type DaemonServiceCleanupResult = {\n appliedActions: DaemonServiceCleanupAction[];\n forceUsed: boolean;\n};\n\nconst PREPARE_LATEST_BUNDLE_ANOMALIES = new Set<DaemonServiceAnomalyCode>(\n [...DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES].filter(\n (code) =>\n code !== \"legacy_shared_service_present\" &&\n code !== \"legacy_detached_runtime\" &&\n code !== \"runtime_bundle_mismatch\" &&\n code !== \"duplicate_owned_processes\"\n )\n);\n\nconst SERVICE_FILE_REPAIR_PRIMARY_FINDING_PRIORITY: DaemonServiceAnomalyCode[] =\n [\n \"service_manager_path_drift\",\n \"runtime_bundle_mismatch\",\n ...[...PREPARE_LATEST_BUNDLE_ANOMALIES].filter(\n (code) => code !== \"version_outdated\"\n ),\n \"version_outdated\",\n ];\n\nconst SERVICE_FILE_REPAIR_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"service_manager_path_drift\",\n \"runtime_bundle_mismatch\",\n ...SERVICE_FILE_REPAIR_PRIMARY_FINDING_PRIORITY.filter(\n (code) =>\n code !== \"service_manager_path_drift\" &&\n code !== \"runtime_bundle_mismatch\"\n ),\n]);\n\nexport function buildDaemonServiceCleanupPlan(input: {\n intent: DaemonLifecycleIntent;\n inventory: DaemonServiceInventory;\n requestedMode?: DaemonRunMode;\n}): DaemonServiceCleanupPlan {\n const anomalies = input.inventory.anomalies;\n const anomalyCodes = new Set(anomalies.map((anomaly) => anomaly.code));\n const desiredState = resolveDesiredState({\n intent: input.intent,\n requestedMode: input.requestedMode,\n });\n const actions = new Set<DaemonServiceCleanupAction>();\n\n if (hasAnomaly(anomalyCodes, \"runtime_stale\")) {\n actions.add(\"clear_stale_runtime_state\");\n }\n if (\n hasAnyAnomaly(anomalyCodes, [\n \"duplicate_owned_processes\",\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"legacy_detached_runtime\",\n ])\n ) {\n actions.add(\"stop_owned_processes\");\n }\n if (\n hasAnyAnomaly(anomalyCodes, [\n \"service_manager_path_drift\",\n \"manager_running_without_runtime\",\n \"runtime_bundle_mismatch\",\n ])\n ) {\n actions.add(\"remove_system_service_registration\");\n actions.add(\"repair_service_manager_registration\");\n }\n if (hasAnyAnomalyFromSet(anomalyCodes, PREPARE_LATEST_BUNDLE_ANOMALIES)) {\n actions.add(\"prepare_latest_bundle\");\n }\n if (input.intent === \"uninstall\") {\n actions.add(\"stop_owned_processes\");\n actions.add(\"remove_system_service_registration\");\n actions.add(\"remove_runtime_artifacts\");\n }\n if (input.intent === \"reinstall\" || input.intent === \"upgrade_reconcile\") {\n actions.add(\"stop_owned_processes\");\n actions.add(\"remove_system_service_registration\");\n actions.add(\"prepare_latest_bundle\");\n actions.add(\"remove_inactive_bundles\");\n }\n\n const requiresConfirmation =\n input.intent === \"uninstall\" ||\n ((input.intent === \"status_cleanup\" ||\n input.intent === \"start\" ||\n input.intent === \"startup_check\") &&\n actions.size > 0);\n const autoApply =\n input.intent === \"reinstall\" || input.intent === \"upgrade_reconcile\";\n\n return {\n intent: input.intent,\n desiredState,\n anomalies,\n actions: [...actions],\n requiresConfirmation,\n autoApply,\n primaryFinding: buildCleanupPlanPrimaryFinding({\n anomalies,\n anomalyCodes,\n desiredState,\n }),\n summary: buildCleanupPlanSummary({\n anomalyCodes,\n desiredState,\n }),\n };\n}\n\nfunction resolveDesiredState(input: {\n intent: DaemonLifecycleIntent;\n requestedMode?: DaemonRunMode;\n}): DaemonServiceDesiredState {\n if (input.intent === \"uninstall\") {\n return \"not_installed\";\n }\n if (input.intent === \"run_foreground\") {\n return \"running_foreground\";\n }\n if (input.intent === \"run_background\" || input.intent === \"start\") {\n return \"running_background\";\n }\n if (input.requestedMode === \"foreground\") {\n return \"running_foreground\";\n }\n return \"stopped\";\n}\n\nfunction hasAnyAnomaly(\n anomalyCodes: Set<DaemonServiceAnomalyCode>,\n codes: DaemonServiceAnomalyCode[]\n): boolean {\n return codes.some((code) => anomalyCodes.has(code));\n}\n\nfunction hasAnomaly(\n anomalyCodes: Set<DaemonServiceAnomalyCode>,\n code: DaemonServiceAnomalyCode\n): boolean {\n return anomalyCodes.has(code);\n}\n\nfunction hasAnyAnomalyFromSet(\n anomalyCodes: Set<DaemonServiceAnomalyCode>,\n allowedCodes: ReadonlySet<DaemonServiceAnomalyCode>\n): boolean {\n for (const code of allowedCodes) {\n if (anomalyCodes.has(code)) {\n return true;\n }\n }\n return false;\n}\n\nfunction buildCleanupPlanSummary(input: {\n anomalyCodes: Set<DaemonServiceAnomalyCode>;\n desiredState: DaemonServiceDesiredState;\n}): string {\n if (input.desiredState === \"not_installed\") {\n return \"OpenMeld will cleanly remove the background service from this device.\";\n }\n if (hasAnomaly(input.anomalyCodes, \"duplicate_owned_processes\")) {\n return \"OpenMeld found multiple local service processes and will clean them up before continuing.\";\n }\n if (hasAnyAnomalyFromSet(input.anomalyCodes, SERVICE_FILE_REPAIR_ANOMALIES)) {\n return \"OpenMeld needs to repair local service files before the background service can be trusted again.\";\n }\n return \"OpenMeld will bring the background service back to one healthy managed instance.\";\n}\n\nfunction buildCleanupPlanPrimaryFinding(input: {\n anomalies: DaemonServiceInventory[\"anomalies\"];\n anomalyCodes: Set<DaemonServiceAnomalyCode>;\n desiredState: DaemonServiceDesiredState;\n}): string {\n const preferredCodes = resolvePrimaryFindingCodes(input);\n for (const code of preferredCodes) {\n const match = input.anomalies.find((anomaly) => anomaly.code === code);\n if (match) {\n return match.message;\n }\n }\n return (\n input.anomalies[0]?.message ??\n buildCleanupPlanSummary({\n anomalyCodes: input.anomalyCodes,\n desiredState: input.desiredState,\n })\n );\n}\n\nfunction resolvePrimaryFindingCodes(input: {\n anomalyCodes: Set<DaemonServiceAnomalyCode>;\n desiredState: DaemonServiceDesiredState;\n}): DaemonServiceAnomalyCode[] {\n if (input.desiredState === \"not_installed\") {\n return [\"not_installed\"];\n }\n if (hasAnomaly(input.anomalyCodes, \"duplicate_owned_processes\")) {\n return [\"duplicate_owned_processes\"];\n }\n if (hasAnyAnomalyFromSet(input.anomalyCodes, SERVICE_FILE_REPAIR_ANOMALIES)) {\n return SERVICE_FILE_REPAIR_PRIMARY_FINDING_PRIORITY;\n }\n return [\n \"runtime_stale\",\n \"manager_running_without_runtime\",\n \"legacy_detached_runtime\",\n \"foreground_background_conflict\",\n \"background_foreground_conflict\",\n \"lifecycle_locked\",\n \"downgrade_blocked\",\n ];\n}\n","import type { DaemonServiceAnomalyCode } from \"./daemon-service-inventory\";\n\nconst STARTUP_RECOVERY_ANOMALIES = new Set<DaemonServiceAnomalyCode>([\n \"bundle_content_drift\",\n \"bundle_id_drift\",\n \"bundle_lane_drift\",\n \"bundle_missing\",\n \"bundle_path_invalid\",\n \"bundle_provenance_drift\",\n \"bundle_strategy_legacy\",\n \"bundle_version_drift\",\n \"manager_running_without_runtime\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_mismatch\",\n \"runtime_contract_missing\",\n \"runtime_contract_unavailable\",\n \"runtime_stale\",\n \"service_manager_path_drift\",\n \"version_outdated\",\n]);\n\nexport type DaemonServiceStartupRecoveryDecision =\n | {\n shouldAttempt: true;\n reasonCodes: DaemonServiceAnomalyCode[];\n }\n | {\n shouldAttempt: false;\n reason: \"already_attempted\" | \"no_recoverable_anomalies\";\n reasonCodes: DaemonServiceAnomalyCode[];\n };\n\nexport function resolveDaemonServiceStartupRecoveryDecision(input: {\n alreadyAttempted?: boolean;\n anomalyCodes: readonly DaemonServiceAnomalyCode[];\n}): DaemonServiceStartupRecoveryDecision {\n const reasonCodes = uniqueCodes(\n input.anomalyCodes.filter((code) => STARTUP_RECOVERY_ANOMALIES.has(code))\n );\n\n if (input.alreadyAttempted) {\n return {\n shouldAttempt: false,\n reason: \"already_attempted\",\n reasonCodes,\n };\n }\n\n if (reasonCodes.length === 0) {\n return {\n shouldAttempt: false,\n reason: \"no_recoverable_anomalies\",\n reasonCodes,\n };\n }\n\n return {\n shouldAttempt: true,\n reasonCodes,\n };\n}\n\nfunction uniqueCodes(\n codes: readonly DaemonServiceAnomalyCode[]\n): DaemonServiceAnomalyCode[] {\n return [...new Set(codes)];\n}\n","import { open, readFile, stat } from \"node:fs/promises\";\nimport { getDaemonSystemServiceLogPath } from \"./daemon-service-manager\";\n\nconst LOG_NOISE_PATTERNS = [\n /^starting local service loop/i,\n /^daemon stream connected/i,\n /^registered daemon session/i,\n /^catalog sync/i,\n /^heartbeat /i,\n /^profile initialized/i,\n];\n\nconst LOG_ERROR_HINT_PATTERN =\n /error:|failed|exception|cannot find module|module_not_found|permission denied|operation not permitted|not authorized|no openmeld profile is selected|econnrefused|fetch failed|connection refused|etimedout|timed out|enotfound|eai_again|dns/i;\nconst LOG_STACK_TRACE_PATTERN = /^\\s*at\\s+/i;\nconst LOG_WHITESPACE_PATTERN = /\\s+/g;\nconst LOG_ERROR_PREFIX_PATTERN = /^error:\\s*/i;\nconst LOG_LINE_SPLIT_PATTERN = /\\r?\\n/;\nconst LOG_TIMESTAMP_PATTERN =\n /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\s/u;\nconst DIAGNOSTIC_LOG_MAX_BYTES = 256 * 1024;\n\n// Only timestamped lines can be attributed to an incident. Undated output is\n// counted explicitly instead of being presented as current failure evidence.\nexport async function readDaemonIncidentLogTail(input: {\n startedAt: string;\n endedAt: string;\n maxLines: number;\n logPath?: string;\n}): Promise<{\n lines: string[];\n note: \"file_missing\" | \"file_empty\" | null;\n window: {\n excludedUndatedLines: number;\n excludedOutsideWindowLines: number;\n sourceTruncated: boolean;\n };\n}> {\n const window = {\n excludedUndatedLines: 0,\n excludedOutsideWindowLines: 0,\n sourceTruncated: false,\n };\n const file = await open(\n input.logPath ?? getDaemonSystemServiceLogPath(),\n \"r\"\n ).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (!file) {\n return { lines: [], note: \"file_missing\", window };\n }\n try {\n const stats = await file.stat();\n if (!stats.isFile()) {\n throw new Error(\"Service log is not a file\");\n }\n if (!stats.size) {\n return { lines: [], note: \"file_empty\", window };\n }\n const offset = Math.max(0, stats.size - DIAGNOSTIC_LOG_MAX_BYTES);\n const buffer = Buffer.alloc(Math.min(stats.size, DIAGNOSTIC_LOG_MAX_BYTES));\n const { bytesRead } = await file.read(buffer, 0, buffer.length, offset);\n const raw = buffer.subarray(0, bytesRead).toString(\"utf8\");\n const prefixEnd = offset > 0 ? raw.indexOf(\"\\n\") + 1 : 0;\n const completeEnd = raw.lastIndexOf(\"\\n\") + 1;\n const complete = raw.slice(prefixEnd, completeEnd);\n window.sourceTruncated = offset > 0 || completeEnd < raw.length;\n const start = Date.parse(input.startedAt);\n const end = Date.parse(input.endedAt);\n const lines: string[] = [];\n for (const rawLine of complete.split(LOG_LINE_SPLIT_PATTERN)) {\n const line = normalizeLogLine(rawLine);\n if (!line) {\n continue;\n }\n const timestamp = LOG_TIMESTAMP_PATTERN.exec(line)?.[1];\n if (!(timestamp && Number.isFinite(Date.parse(timestamp)))) {\n window.excludedUndatedLines += 1;\n continue;\n }\n const at = Date.parse(timestamp);\n if (at < start || at > end) {\n window.excludedOutsideWindowLines += 1;\n continue;\n }\n if (!isLogNoise(line.slice(timestamp.length).trim())) {\n lines.push(line);\n }\n }\n if (lines.length > input.maxLines) {\n window.sourceTruncated = true;\n }\n return {\n lines: input.maxLines > 0 ? lines.slice(-input.maxLines) : [],\n note: null,\n window,\n };\n } finally {\n await file.close();\n }\n}\nconst LOG_DETAIL_MAX_LENGTH = 160;\nconst PRESENTATION_BORDER_ONLY_PATTERN =\n /^[\\s│┆┃┊┌┐└┘├┤╭╮╰╯─━═╴╵╶╷╸╹╺╻╼╽╾╿█▁▂▃▄▅▆▇▀■□◆◇●○◌◦•·…]+$/u;\nconst PRESENTATION_PREFIX_PATTERN =\n /^(OPENMELD CLI|People and agents, working as one\\.|Setup Check|Welcome|Your current OpenMeld Identity|OpenMeld Service Needs Attention|OpenMeld Service Needs Refresh|OpenMeld Service Needs Repair|OpenMeld Service Update Required|OpenMeld Service Started|Which profile do you want to use\\?|Continue as\\b|Use another profile\\b|Create a new profile\\b|Exit\\b|Status:|Automatic Repair:|Found:|Last local detail:|What this means:|OpenMeld Service:|OpenMeld Connection:|Runtime:|Device Reply Readiness:|Device Reply Setup:|Local Service Link:|Current Agent Reply Readiness:|Current Local Service Link:|Next:|Signed In:|Gateway:|Profile Name:|Type:|Start OpenMeld Service now\\b)/i;\nconst PRESENTATION_LEADING_CHROME_PATTERN = /^[\\s│┆┃┊┌┐└┘├┤╭╮╰╯◆◇■●○]+/u;\nconst PRESENTATION_LEADING_DECORATION_PATTERN = /^[^\\p{L}\\p{N}`]+/u;\n\nexport type DaemonStartFailureLogDiagnostic = {\n detail: string;\n rawLine: string;\n};\n\nexport type DaemonStartFailureLogCursor = {\n size: number;\n};\n\nexport async function captureDaemonStartFailureLogCursor(): Promise<DaemonStartFailureLogCursor | null> {\n const stats = await stat(getDaemonSystemServiceLogPath()).catch(() => null);\n if (!stats?.isFile()) {\n return null;\n }\n return {\n size: stats.size,\n };\n}\n\nexport async function readDaemonStartFailureLogDiagnostic(\n input: { cursor?: DaemonStartFailureLogCursor | null } = {}\n): Promise<DaemonStartFailureLogDiagnostic | null> {\n const rawBuffer = await readFile(getDaemonSystemServiceLogPath()).catch(\n () => null\n );\n const relevantBuffer = sliceDaemonStartFailureLogBuffer({\n rawBuffer,\n cursor: input.cursor ?? null,\n });\n if (!relevantBuffer) {\n return null;\n }\n const raw = relevantBuffer.toString(\"utf8\");\n\n const rawLine = selectRelevantDaemonStartFailureLogLine(raw);\n if (!rawLine) {\n return null;\n }\n\n return {\n detail: summarizeDaemonStartFailureLogLine(rawLine),\n rawLine,\n };\n}\n\nfunction sliceDaemonStartFailureLogBuffer(input: {\n rawBuffer: Buffer | null;\n cursor: DaemonStartFailureLogCursor | null;\n}): Buffer | null {\n if (!input.rawBuffer || input.rawBuffer.length === 0) {\n return null;\n }\n if (!input.cursor) {\n return input.rawBuffer;\n }\n if (input.rawBuffer.length === input.cursor.size) {\n return null;\n }\n if (input.rawBuffer.length < input.cursor.size) {\n return input.rawBuffer;\n }\n return input.rawBuffer.subarray(input.cursor.size);\n}\n\nexport function selectRelevantDaemonStartFailureLogLine(\n rawLog: string\n): string | null {\n const lines = rawLog\n .split(LOG_LINE_SPLIT_PATTERN)\n .map((line) => normalizeLogLine(line))\n .filter((line) => line.length > 0)\n .filter((line) => !LOG_STACK_TRACE_PATTERN.test(line));\n\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line || isLogNoise(line)) {\n continue;\n }\n if (LOG_ERROR_HINT_PATTERN.test(line)) {\n return line;\n }\n }\n\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line || isLogNoise(line)) {\n continue;\n }\n return line;\n }\n\n return null;\n}\n\nexport function summarizeDaemonStartFailureLogLine(rawLine: string): string {\n const line = stripLogErrorPrefix(normalizeLogLine(rawLine));\n if (line.length === 0) {\n return \"OpenMeld wrote a local service error, but it could not be summarized yet.\";\n }\n\n const normalized = line.toLowerCase();\n if (normalized.includes(\"no openmeld profile is selected\")) {\n return \"OpenMeld Service could not find a usable OpenMeld identity for this device.\";\n }\n if (normalized.includes(\"cannot find package\")) {\n return \"OpenMeld Service is missing a local dependency it needs to start.\";\n }\n if (\n normalized.includes(\"cannot find module\") ||\n normalized.includes(\"module_not_found\")\n ) {\n return \"OpenMeld Service is still pointing at a local CLI file that no longer exists.\";\n }\n if (\n normalized.includes(\"permission denied\") ||\n normalized.includes(\"operation not permitted\") ||\n normalized.includes(\"not authorized\")\n ) {\n return \"OpenMeld Service is missing a local macOS permission it needs to start.\";\n }\n if (isDaemonStartFailureLikelyDependencyRequestFailure(rawLine)) {\n return \"OpenMeld Service started locally, but an OpenMeld dependency request failed before startup completed.\";\n }\n\n return trimLogDetail(line, LOG_DETAIL_MAX_LENGTH);\n}\n\nexport function isDaemonStartFailureLikelyDependencyRequestFailure(\n rawLine: string\n): boolean {\n const normalized = stripLogErrorPrefix(\n normalizeLogLine(rawLine)\n ).toLowerCase();\n return (\n normalized.includes(\"econnrefused\") ||\n normalized.includes(\"connection refused\") ||\n normalized.includes(\"fetch failed\") ||\n normalized.includes(\"etimedout\") ||\n normalized.includes(\"timed out\") ||\n normalized.includes(\"enotfound\") ||\n normalized.includes(\"eai_again\") ||\n normalized.includes(\"dns\")\n );\n}\n\nfunction normalizeLogLine(value: string): string {\n return stripAnsiEscapeSequences(value)\n .trim()\n .replace(LOG_WHITESPACE_PATTERN, \" \");\n}\n\nfunction stripLogErrorPrefix(value: string): string {\n return value.replace(LOG_ERROR_PREFIX_PATTERN, \"\");\n}\n\nfunction isLogNoise(line: string): boolean {\n return (\n LOG_NOISE_PATTERNS.some((pattern) => pattern.test(line)) ||\n isPresentationNoise(line)\n );\n}\n\nfunction trimLogDetail(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, maxLength - 1).trimEnd()}…`;\n}\n\nfunction stripAnsiEscapeSequences(value: string): string {\n let sanitized = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const current = value[index];\n if (current !== \"\\u001B\") {\n sanitized += current;\n continue;\n }\n\n const next = value[index + 1];\n if (next === \"[\") {\n index = consumeAnsiControlSequence(value, index + 2);\n continue;\n }\n if (next === \"]\") {\n index = consumeAnsiOperatingSystemCommand(value, index + 2);\n }\n }\n\n return sanitized;\n}\n\nfunction isPresentationNoise(line: string): boolean {\n if (PRESENTATION_BORDER_ONLY_PATTERN.test(line)) {\n return true;\n }\n\n const presenterText = line\n .replace(PRESENTATION_LEADING_CHROME_PATTERN, \"\")\n .replace(PRESENTATION_LEADING_DECORATION_PATTERN, \"\");\n return PRESENTATION_PREFIX_PATTERN.test(presenterText);\n}\n\nfunction consumeAnsiControlSequence(value: string, startIndex: number): number {\n for (let index = startIndex; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n }\n return value.length;\n}\n\nfunction consumeAnsiOperatingSystemCommand(\n value: string,\n startIndex: number\n): number {\n for (let index = startIndex; index < value.length; index += 1) {\n const current = value[index];\n if (current === \"\\u0007\") {\n return index;\n }\n if (current === \"\\u001B\" && value[index + 1] === \"\\\\\") {\n return index + 1;\n }\n }\n return value.length;\n}\n","import { isDaemonReconcileInProgressError } from \"@openmeld/local-service\";\nimport { formatLocalMachineIssueMessage } from \"@openmeld/schemas\";\nimport {\n type DaemonLifecycleIntent,\n withDaemonServiceReconcileLock,\n} from \"../../config/daemon-state\";\nimport {\n isOpenMeldLockError,\n resolveOpenMeldOrphanedLockIssue,\n} from \"../../config/lock\";\nimport {\n type DaemonServiceLifecycleOutcome,\n type DaemonServiceLifecyclePhase,\n runDaemonServiceLifecycle,\n} from \"./daemon-service-lifecycle\";\n\nexport type DaemonServiceAlignmentProgressStep =\n | \"inspecting_local_service\"\n | \"backing_up_runtime_data\"\n | \"stopping_old_service_processes\"\n | \"removing_system_service_registration\"\n | \"cleaning_old_service_files\"\n | \"preparing_latest_service_bundle\"\n | \"installing_latest_service_bundle\"\n | \"installing_system_service_registration\"\n | \"restoring_runtime_data\"\n | \"starting_background_service\"\n | \"verifying_service_health\"\n | \"cleaning_stale_backups\";\n\nexport type DaemonServiceAlignmentBlockReasonCode = Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"blocked\" }\n>[\"reasonCodes\"][number];\n\nexport type DaemonServiceAlignmentResult =\n | {\n status: \"already_aligned\";\n targetVersion: string;\n inventoryBefore: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"already_aligned\" }\n >[\"inventoryBefore\"];\n inventoryAfter: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"already_aligned\" }\n >[\"inventoryAfter\"];\n reasonCodes: [];\n completedSteps: DaemonServiceAlignmentProgressStep[];\n restoredBackground: false;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"aligned\";\n targetVersion: string;\n inventoryBefore: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"aligned\" }\n >[\"inventoryBefore\"];\n inventoryAfter: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"aligned\" }\n >[\"inventoryAfter\"];\n reasonCodes: [];\n completedSteps: DaemonServiceAlignmentProgressStep[];\n restoredBackground: boolean;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"stopped_safe\";\n targetVersion: string;\n inventoryBefore: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"stopped_safe\" }\n >[\"inventoryBefore\"];\n inventoryAfter: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"stopped_safe\" }\n >[\"inventoryAfter\"];\n reasonCodes: [];\n completedSteps: DaemonServiceAlignmentProgressStep[];\n restoredBackground: false;\n backupDataPath: null;\n failureStage: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"stopped_safe\" }\n >[\"failureStage\"];\n evidencePath: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"stopped_safe\" }\n >[\"evidencePath\"];\n errorMessage: string;\n }\n | {\n status: \"blocked\";\n targetVersion: string;\n inventoryBefore: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"blocked\" }\n >[\"inventoryBefore\"];\n inventoryAfter: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"blocked\" }\n >[\"inventoryAfter\"];\n reasonCodes: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"blocked\" }\n >[\"reasonCodes\"];\n completedSteps: DaemonServiceAlignmentProgressStep[];\n restoredBackground: false;\n backupDataPath: null;\n errorMessage: null;\n }\n | {\n status: \"failed\";\n targetVersion: string;\n inventoryBefore: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"inventoryBefore\"];\n inventoryAfter: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"inventoryAfter\"];\n reasonCodes: [];\n completedSteps: DaemonServiceAlignmentProgressStep[];\n restoredBackground: boolean;\n backupDataPath: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"backupDataPath\"];\n failureStage: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"failureStage\"];\n evidencePath: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"evidencePath\"];\n errorCode: Extract<\n DaemonServiceLifecycleOutcome,\n { status: \"failed\" }\n >[\"errorCode\"];\n errorMessage: string;\n };\n\nexport async function runDaemonServiceFullAlignment(input: {\n expectedVersion: string;\n intent: Extract<DaemonLifecycleIntent, \"startup_check\" | \"upgrade_reconcile\">;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n onProgress?: (\n step: DaemonServiceAlignmentProgressStep\n ) => Promise<void> | void;\n}): Promise<DaemonServiceAlignmentResult> {\n const completedSteps: DaemonServiceAlignmentProgressStep[] = [];\n const emitProgress = async (phase: DaemonServiceLifecyclePhase) => {\n const step = mapLifecyclePhaseToAlignmentStep(phase);\n if (!step || completedSteps.includes(step)) {\n return;\n }\n completedSteps.push(step);\n await input.onProgress?.(step);\n };\n\n try {\n const lifecycleResult = await withDaemonServiceReconcileLock(\n async () =>\n await runDaemonServiceLifecycle({\n expectedVersion: input.expectedVersion,\n operation:\n input.intent === \"upgrade_reconcile\"\n ? \"upgrade_reconcile\"\n : \"startup_repair\",\n installSource: \"cli.auto_check\",\n ...(input.cliScriptPath\n ? { cliScriptPath: input.cliScriptPath }\n : {}),\n ...(input.gatewayUrl ? { gatewayUrl: input.gatewayUrl } : {}),\n ...(input.profile ? { profile: input.profile } : {}),\n ...(input.deviceId ? { deviceId: input.deviceId } : {}),\n ...(typeof input.heartbeatMs === \"number\"\n ? { heartbeatMs: input.heartbeatMs }\n : {}),\n onPhase: emitProgress,\n }),\n {\n intent: input.intent,\n command:\n input.intent === \"upgrade_reconcile\"\n ? \"openmeld upgrade\"\n : \"openmeld startup-check\",\n }\n );\n return mapLifecycleResultToAlignmentResult({\n completedSteps,\n lifecycleResult,\n });\n } catch (error) {\n return {\n status: \"failed\",\n targetVersion: input.expectedVersion,\n inventoryBefore: null,\n inventoryAfter: null,\n reasonCodes: [],\n completedSteps,\n restoredBackground: false,\n backupDataPath: null,\n failureStage: null,\n evidencePath: null,\n errorCode: null,\n errorMessage: buildDaemonServiceAlignmentFailureMessage(error),\n };\n }\n}\n\nfunction mapLifecyclePhaseToAlignmentStep(\n phase: DaemonServiceLifecyclePhase\n): DaemonServiceAlignmentProgressStep | null {\n switch (phase) {\n case \"inspect\":\n return \"inspecting_local_service\";\n case \"backup\":\n return \"backing_up_runtime_data\";\n case \"stop_or_drain\":\n case \"wait_stopped\":\n return \"stopping_old_service_processes\";\n case \"unregister\":\n return \"removing_system_service_registration\";\n case \"wait_absent\":\n return \"cleaning_old_service_files\";\n case \"prepare_bundle\":\n return \"preparing_latest_service_bundle\";\n case \"install_bundle\":\n return \"installing_latest_service_bundle\";\n case \"write_contract\":\n case \"register_service\":\n return \"installing_system_service_registration\";\n case \"restore_runtime_data\":\n return \"restoring_runtime_data\";\n case \"start_if_desired\":\n case \"wait_running\":\n return \"starting_background_service\";\n case \"verify_final_inventory\":\n return \"verifying_service_health\";\n default:\n return null;\n }\n}\n\nfunction mapLifecycleResultToAlignmentResult(input: {\n completedSteps: DaemonServiceAlignmentProgressStep[];\n lifecycleResult: DaemonServiceLifecycleOutcome;\n}): DaemonServiceAlignmentResult {\n switch (input.lifecycleResult.status) {\n case \"already_aligned\":\n return {\n status: \"already_aligned\",\n targetVersion: input.lifecycleResult.targetVersion,\n inventoryBefore: input.lifecycleResult.inventoryBefore,\n inventoryAfter: input.lifecycleResult.inventoryAfter,\n reasonCodes: [],\n completedSteps: input.completedSteps,\n restoredBackground: false,\n backupDataPath: null,\n errorMessage: null,\n };\n case \"aligned\":\n return {\n status: \"aligned\",\n targetVersion: input.lifecycleResult.targetVersion,\n inventoryBefore: input.lifecycleResult.inventoryBefore,\n inventoryAfter: input.lifecycleResult.inventoryAfter,\n reasonCodes: [],\n completedSteps: input.completedSteps,\n restoredBackground:\n input.lifecycleResult.shouldStartAfterLifecycle === true &&\n input.lifecycleResult.inventoryAfter.runtimeStatus.status ===\n \"running\",\n backupDataPath: null,\n errorMessage: null,\n };\n case \"stopped_safe\":\n return {\n status: \"stopped_safe\",\n targetVersion: input.lifecycleResult.targetVersion,\n inventoryBefore: input.lifecycleResult.inventoryBefore,\n inventoryAfter: input.lifecycleResult.inventoryAfter,\n reasonCodes: [],\n completedSteps: input.completedSteps,\n restoredBackground: false,\n backupDataPath: null,\n failureStage: input.lifecycleResult.failureStage,\n evidencePath: input.lifecycleResult.evidencePath,\n errorMessage: input.lifecycleResult.errorMessage,\n };\n case \"blocked\":\n return {\n status: \"blocked\",\n targetVersion: input.lifecycleResult.targetVersion,\n inventoryBefore: input.lifecycleResult.inventoryBefore,\n inventoryAfter: input.lifecycleResult.inventoryAfter,\n reasonCodes: input.lifecycleResult.reasonCodes,\n completedSteps: input.completedSteps,\n restoredBackground: false,\n backupDataPath: null,\n errorMessage: null,\n };\n case \"failed\":\n return {\n status: \"failed\",\n targetVersion: input.lifecycleResult.targetVersion,\n inventoryBefore: input.lifecycleResult.inventoryBefore,\n inventoryAfter: input.lifecycleResult.inventoryAfter,\n reasonCodes: [],\n completedSteps: input.completedSteps,\n restoredBackground:\n input.lifecycleResult.shouldStartAfterLifecycle === true &&\n input.lifecycleResult.inventoryAfter?.runtimeStatus.status ===\n \"running\",\n backupDataPath: input.lifecycleResult.backupDataPath,\n failureStage: input.lifecycleResult.failureStage,\n evidencePath: input.lifecycleResult.evidencePath,\n errorCode: input.lifecycleResult.errorCode,\n errorMessage: input.lifecycleResult.errorMessage,\n };\n default: {\n const unexpectedResult: never = input.lifecycleResult;\n throw new Error(\n `Unsupported lifecycle alignment result: ${JSON.stringify(\n unexpectedResult\n )}`\n );\n }\n }\n}\n\nexport function buildDaemonServiceAlignmentFailureMessage(\n error: unknown\n): string {\n const orphanedIssue = resolveOpenMeldOrphanedLockIssue(error);\n if (orphanedIssue) {\n return formatLocalMachineIssueMessage(orphanedIssue);\n }\n if (isOpenMeldLockError(error) || isDaemonReconcileInProgressError(error)) {\n return \"OpenMeld service alignment is already running in another local process.\";\n }\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return String(error);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport {\n daemonRuntimeStateRootPath,\n daemonServiceRepairJournalPath,\n} from \"../../config/daemon-state\";\nimport type { DaemonServiceCleanupAction } from \"./daemon-service-hygiene\";\n\nconst DAEMON_SERVICE_REPAIR_JOURNAL_SCHEMA =\n \"openmeld-daemon-repair-journal-v1\";\nconst DAEMON_SERVICE_REPAIR_MAX_FAILURES = 3;\nconst DAEMON_SERVICE_REPAIR_COOLDOWN_MS = 5 * 60 * 1000;\n\ntype DaemonServiceRepairJournalRecord = {\n actionKey: string;\n consecutiveFailures: number;\n lastAttemptAt: string;\n lastFailureAt: string | null;\n lastSuccessAt: string | null;\n cooldownUntil: string | null;\n lastErrorMessage: string | null;\n};\n\ntype DaemonServiceRepairJournalState = {\n v: 1;\n schema: typeof DAEMON_SERVICE_REPAIR_JOURNAL_SCHEMA;\n records: Record<string, DaemonServiceRepairJournalRecord>;\n};\n\nexport type DaemonServiceRepairBudgetState = {\n actionKey: string;\n consecutiveFailures: number;\n cooldownUntil: string | null;\n lastErrorMessage: string | null;\n status: \"ready\" | \"cooldown\";\n};\n\nexport function buildDaemonServiceRepairActionKey(\n actions: readonly DaemonServiceCleanupAction[]\n): string {\n const normalized = [...new Set(actions)].sort((left, right) =>\n left.localeCompare(right)\n );\n return normalized.join(\"+\");\n}\n\nexport async function getDaemonServiceRepairBudgetState(input: {\n actions: readonly DaemonServiceCleanupAction[];\n now?: Date;\n}): Promise<DaemonServiceRepairBudgetState | null> {\n const actionKey = buildDaemonServiceRepairActionKey(input.actions);\n if (actionKey.length === 0) {\n return null;\n }\n const state = await readDaemonServiceRepairJournal();\n const record = state.records[actionKey];\n if (!record) {\n return {\n actionKey,\n consecutiveFailures: 0,\n cooldownUntil: null,\n lastErrorMessage: null,\n status: \"ready\",\n };\n }\n const nowMs = (input.now ?? new Date()).getTime();\n const cooldownUntilMs = record.cooldownUntil\n ? Date.parse(record.cooldownUntil)\n : Number.NaN;\n return {\n actionKey,\n consecutiveFailures: record.consecutiveFailures,\n cooldownUntil: record.cooldownUntil,\n lastErrorMessage: record.lastErrorMessage,\n status:\n Number.isFinite(cooldownUntilMs) && cooldownUntilMs > nowMs\n ? \"cooldown\"\n : \"ready\",\n };\n}\n\nexport async function recordDaemonServiceRepairSuccess(input: {\n actions: readonly DaemonServiceCleanupAction[];\n now?: Date;\n}): Promise<void> {\n const actionKey = buildDaemonServiceRepairActionKey(input.actions);\n if (actionKey.length === 0) {\n return;\n }\n const nowIso = (input.now ?? new Date()).toISOString();\n await updateDaemonServiceRepairJournal((state) => {\n state.records[actionKey] = {\n actionKey,\n consecutiveFailures: 0,\n lastAttemptAt: nowIso,\n lastFailureAt: null,\n lastSuccessAt: nowIso,\n cooldownUntil: null,\n lastErrorMessage: null,\n };\n return state;\n });\n}\n\nexport async function recordDaemonServiceRepairFailure(input: {\n actions: readonly DaemonServiceCleanupAction[];\n errorMessage: string;\n now?: Date;\n}): Promise<void> {\n const actionKey = buildDaemonServiceRepairActionKey(input.actions);\n if (actionKey.length === 0) {\n return;\n }\n const now = input.now ?? new Date();\n const nowIso = now.toISOString();\n await updateDaemonServiceRepairJournal((state) => {\n const previousRecord = state.records[actionKey];\n const nextFailures = (previousRecord?.consecutiveFailures ?? 0) + 1;\n const cooldownUntil =\n nextFailures >= DAEMON_SERVICE_REPAIR_MAX_FAILURES\n ? new Date(\n now.getTime() + DAEMON_SERVICE_REPAIR_COOLDOWN_MS\n ).toISOString()\n : null;\n state.records[actionKey] = {\n actionKey,\n consecutiveFailures: nextFailures,\n lastAttemptAt: nowIso,\n lastFailureAt: nowIso,\n lastSuccessAt: previousRecord?.lastSuccessAt ?? null,\n cooldownUntil,\n lastErrorMessage: input.errorMessage,\n };\n return state;\n });\n}\n\nasync function readDaemonServiceRepairJournal(): Promise<DaemonServiceRepairJournalState> {\n const raw = await readFile(daemonServiceRepairJournalPath(), \"utf8\").catch(\n (error: unknown) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n if (raw === null) {\n return createEmptyDaemonServiceRepairJournalState();\n }\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonServiceRepairJournalState>;\n if (\n parsed.v !== 1 ||\n parsed.schema !== DAEMON_SERVICE_REPAIR_JOURNAL_SCHEMA ||\n !parsed.records ||\n typeof parsed.records !== \"object\"\n ) {\n return createEmptyDaemonServiceRepairJournalState();\n }\n const normalizedRecords = Object.fromEntries(\n Object.entries(parsed.records).flatMap(([key, value]) => {\n if (!isDaemonServiceRepairJournalRecord(value)) {\n return [];\n }\n return [[key, value]];\n })\n );\n return {\n v: 1,\n schema: DAEMON_SERVICE_REPAIR_JOURNAL_SCHEMA,\n records: normalizedRecords,\n };\n } catch {\n return createEmptyDaemonServiceRepairJournalState();\n }\n}\n\nasync function updateDaemonServiceRepairJournal(\n updater: (\n state: DaemonServiceRepairJournalState\n ) => DaemonServiceRepairJournalState\n): Promise<void> {\n const state = updater(await readDaemonServiceRepairJournal());\n await mkdir(daemonRuntimeStateRootPath(), { recursive: true });\n await writeFile(\n daemonServiceRepairJournalPath(),\n `${JSON.stringify(state, null, 2)}\\n`,\n {\n encoding: \"utf8\",\n mode: 0o600,\n }\n );\n}\n\nfunction createEmptyDaemonServiceRepairJournalState(): DaemonServiceRepairJournalState {\n return {\n v: 1,\n schema: DAEMON_SERVICE_REPAIR_JOURNAL_SCHEMA,\n records: {},\n };\n}\n\nfunction isDaemonServiceRepairJournalRecord(\n value: unknown\n): value is DaemonServiceRepairJournalRecord {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"actionKey\" in value &&\n typeof value.actionKey === \"string\" &&\n \"consecutiveFailures\" in value &&\n typeof value.consecutiveFailures === \"number\" &&\n \"lastAttemptAt\" in value &&\n typeof value.lastAttemptAt === \"string\" &&\n \"lastFailureAt\" in value &&\n (typeof value.lastFailureAt === \"string\" || value.lastFailureAt === null) &&\n \"lastSuccessAt\" in value &&\n (typeof value.lastSuccessAt === \"string\" || value.lastSuccessAt === null) &&\n \"cooldownUntil\" in value &&\n (typeof value.cooldownUntil === \"string\" || value.cooldownUntil === null) &&\n \"lastErrorMessage\" in value &&\n (typeof value.lastErrorMessage === \"string\" ||\n value.lastErrorMessage === null)\n );\n}\n\nfunction getErrorCode(error: unknown): string | null {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return typeof error.code === \"string\" ? error.code : null;\n }\n return null;\n}\n","import process from \"node:process\";\nimport { sleep } from \"@openmeld/utils\";\nimport {\n clearDaemonServiceRuntimeState,\n type DaemonLifecycleIntent,\n type DaemonRunMode,\n withDaemonServiceRegistrationMutationLock,\n} from \"../../config/daemon-state\";\nimport { resolveOpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport { DAEMON_SERVICE_AUTO_HEAL_ANOMALIES } from \"./daemon-service-anomaly-groups\";\nimport {\n buildDaemonSystemServiceCommandSpec,\n ensureDaemonSystemServiceCommandFiles,\n} from \"./daemon-service-command-spec\";\nimport {\n buildDaemonServiceCleanupPlan,\n type DaemonServiceCleanupAction,\n} from \"./daemon-service-hygiene\";\nimport {\n type DaemonServiceAnomalyCode,\n type DaemonServiceInventory,\n inspectDaemonServiceInventory,\n} from \"./daemon-service-inventory\";\nimport { cleanupLegacySharedDaemonServiceState } from \"./daemon-service-legacy-shared\";\nimport {\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"./daemon-service-manager\";\nimport {\n getDaemonServiceRepairBudgetState,\n recordDaemonServiceRepairFailure,\n recordDaemonServiceRepairSuccess,\n} from \"./daemon-service-repair-journal\";\nimport { waitForDaemonSystemServiceToStop } from \"./daemon-service-runtime\";\n\nconst AUTO_HEAL_SAFE_ACTIONS = new Set<DaemonServiceCleanupAction>([\n \"clear_stale_runtime_state\",\n \"stop_owned_processes\",\n \"remove_system_service_registration\",\n \"repair_service_manager_registration\",\n]);\nconst AUTO_HEAL_DUPLICATE_POLL_MS = 120;\nconst AUTO_HEAL_DUPLICATE_WAIT_MS = 2000;\n\nexport type DaemonServiceAutoHealReport = {\n status: \"noop\" | \"repaired\" | \"blocked\" | \"cooldown\" | \"failed\";\n inventoryBefore: DaemonServiceInventory;\n inventoryAfter: DaemonServiceInventory | null;\n appliedActions: DaemonServiceCleanupAction[];\n blockedAnomalyCodes: DaemonServiceAnomalyCode[];\n errorMessage: string | null;\n cooldownUntil: string | null;\n};\n\nexport async function runDaemonServiceAutoHeal(input: {\n expectedVersion: string;\n intent: DaemonLifecycleIntent;\n requestedMode?: DaemonRunMode;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<DaemonServiceAutoHealReport> {\n return await withDaemonServiceRegistrationMutationLock(\n async () => await runDaemonServiceAutoHealWithLock(input),\n {\n intent: input.intent,\n command: \"OpenMeld Service automatic registration repair\",\n }\n );\n}\n\nasync function runDaemonServiceAutoHealWithLock(input: {\n expectedVersion: string;\n intent: DaemonLifecycleIntent;\n requestedMode?: DaemonRunMode;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<DaemonServiceAutoHealReport> {\n const inventoryBefore = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: input.requestedMode,\n intent: input.intent,\n });\n const duplicateCleanup =\n resolveLegacyDetachedDuplicateCleanup(inventoryBefore);\n const cleanupPlan = buildDaemonServiceCleanupPlan({\n intent: input.intent,\n inventory: inventoryBefore,\n requestedMode: input.requestedMode,\n });\n const safeActions = cleanupPlan.actions.filter((action) =>\n AUTO_HEAL_SAFE_ACTIONS.has(action)\n );\n const blockedAnomalyCodes = resolveBlockedAutoHealAnomalyCodes({\n inventory: inventoryBefore,\n duplicateCleanup,\n });\n\n if (duplicateCleanup && !safeActions.includes(\"stop_owned_processes\")) {\n safeActions.push(\"stop_owned_processes\");\n }\n if (safeActions.length === 0 || blockedAnomalyCodes.length > 0) {\n return {\n status: safeActions.length === 0 ? \"noop\" : \"blocked\",\n inventoryBefore,\n inventoryAfter: inventoryBefore,\n appliedActions: [],\n blockedAnomalyCodes,\n errorMessage: null,\n cooldownUntil: null,\n };\n }\n\n const budget = await getDaemonServiceRepairBudgetState({\n actions: safeActions,\n });\n if (budget?.status === \"cooldown\") {\n return {\n status: \"cooldown\",\n inventoryBefore,\n inventoryAfter: inventoryBefore,\n appliedActions: [],\n blockedAnomalyCodes,\n errorMessage: budget.lastErrorMessage,\n cooldownUntil: budget.cooldownUntil,\n };\n }\n\n try {\n await applyDaemonServiceAutoHealActions({\n actions: safeActions,\n cliScriptPath: input.cliScriptPath,\n daemonVersion: input.expectedVersion,\n deviceId: input.deviceId,\n duplicateCleanup,\n gatewayUrl: input.gatewayUrl,\n heartbeatMs: input.heartbeatMs,\n inventory: inventoryBefore,\n profile: input.profile,\n });\n const inventoryAfter = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: input.requestedMode,\n intent: input.intent,\n }).catch(() => null);\n const remainingAutoHealAnomalies = inventoryAfter\n ? resolveAutoHealAnomalyCodes({\n inventory: inventoryAfter,\n duplicateCleanup:\n resolveLegacyDetachedDuplicateCleanup(inventoryAfter),\n })\n : [];\n if (remainingAutoHealAnomalies.length > 0) {\n throw new Error(\n `Automatic repair left recoverable anomalies behind: ${remainingAutoHealAnomalies.join(\n \", \"\n )}`\n );\n }\n await recordDaemonServiceRepairSuccess({\n actions: safeActions,\n });\n return {\n status: \"repaired\",\n inventoryBefore,\n inventoryAfter,\n appliedActions: safeActions,\n blockedAnomalyCodes,\n errorMessage: null,\n cooldownUntil: null,\n };\n } catch (error) {\n const errorMessage = toErrorMessage(error);\n await recordDaemonServiceRepairFailure({\n actions: safeActions,\n errorMessage,\n });\n return {\n status: \"failed\",\n inventoryBefore,\n inventoryAfter: null,\n appliedActions: safeActions,\n blockedAnomalyCodes,\n errorMessage,\n cooldownUntil: null,\n };\n }\n}\n\nasync function applyDaemonServiceAutoHealActions(input: {\n actions: DaemonServiceCleanupAction[];\n daemonVersion: string;\n inventory: DaemonServiceInventory;\n duplicateCleanup: LegacyDetachedDuplicateCleanup | null;\n cliScriptPath?: string;\n gatewayUrl?: string;\n profile?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<void> {\n const actionSet = new Set(input.actions);\n const systemManager = await resolveAutoHealServiceManager(input.inventory);\n\n if (actionSet.has(\"clear_stale_runtime_state\")) {\n await clearDaemonServiceRuntimeState();\n }\n\n if (actionSet.has(\"stop_owned_processes\")) {\n await stopDuplicateOwnedProcesses(input.duplicateCleanup);\n }\n\n if (actionSet.has(\"remove_system_service_registration\")) {\n await removeSystemServiceRegistration(systemManager);\n if (input.inventory.legacySharedService?.present) {\n await cleanupLegacySharedDaemonServiceState();\n }\n }\n\n if (actionSet.has(\"repair_service_manager_registration\")) {\n await repairSystemServiceRegistration({\n gatewayUrl: input.gatewayUrl,\n systemManager,\n });\n }\n}\n\nasync function resolveAutoHealServiceManager(\n inventory: DaemonServiceInventory\n): Promise<DaemonServiceManager | null> {\n if (inventory.serviceManager) {\n return inventory.serviceManager;\n }\n if (inventory.legacySharedService?.serviceManager) {\n return inventory.legacySharedService.serviceManager;\n }\n if (\n inventory.runtimeStatus.serviceController !== \"unknown\" &&\n inventory.runtimeStatus.serviceController !== \"legacy-detached\"\n ) {\n return await resolveDaemonServiceManager(\n inventory.runtimeStatus.serviceController\n ).catch(() => null);\n }\n if (\n inventory.serviceContract?.serviceController &&\n inventory.serviceContract.serviceController !== \"unknown\" &&\n inventory.serviceContract.serviceController !== \"legacy-detached\"\n ) {\n return await resolveDaemonServiceManager(\n inventory.serviceContract.serviceController\n ).catch(() => null);\n }\n return await resolveDaemonServiceManager().catch(() => null);\n}\n\nasync function removeSystemServiceRegistration(\n systemManager: DaemonServiceManager | null\n): Promise<void> {\n if (!systemManager) {\n return;\n }\n await systemManager.stop().catch(() => undefined);\n await waitForDaemonSystemServiceToStop({\n manager: systemManager,\n }).catch(() => false);\n await systemManager.uninstall().catch(() => undefined);\n}\n\nasync function repairSystemServiceRegistration(input: {\n systemManager: DaemonServiceManager | null;\n gatewayUrl?: string;\n}): Promise<void> {\n if (!input.systemManager) {\n return;\n }\n const serviceCommandSpec = buildDaemonSystemServiceCommandSpec({\n controller: input.systemManager.controller,\n environmentTarget: await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n }),\n });\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.systemManager.controller,\n });\n await input.systemManager.install(serviceCommandSpec);\n}\n\ntype LegacyDetachedDuplicateCleanup = {\n managedRuntimePid: number;\n legacyDetachedPids: number[];\n};\n\nfunction resolveLegacyDetachedDuplicateCleanup(\n inventory: DaemonServiceInventory\n): LegacyDetachedDuplicateCleanup | null {\n if (\n !inventory.anomalies.some(\n (anomaly) => anomaly.code === \"duplicate_owned_processes\"\n )\n ) {\n return null;\n }\n if (\n inventory.runtimeStatus.status !== \"running\" ||\n inventory.runtimeStatus.mode !== \"background\" ||\n !inventory.runtimeStatus.managedBySystemService ||\n !Number.isInteger(inventory.runtimeStatus.pid)\n ) {\n return null;\n }\n const managedRuntimePid = inventory.runtimeStatus.pid;\n if (typeof managedRuntimePid !== \"number\") {\n return null;\n }\n const managedRuntimeProcess = inventory.ownedProcesses.find(\n (processInfo) => processInfo.pid === managedRuntimePid\n );\n if (!managedRuntimeProcess) {\n return null;\n }\n const legacyDetachedProcesses = inventory.ownedProcesses.filter(\n (processInfo) => processInfo.ownership === \"legacy_detached\"\n );\n if (legacyDetachedProcesses.length === 0) {\n return null;\n }\n const remainingOtherProcesses = inventory.ownedProcesses.filter(\n (processInfo) =>\n processInfo.pid !== managedRuntimePid &&\n processInfo.ownership !== \"legacy_detached\"\n );\n if (remainingOtherProcesses.length > 0) {\n return null;\n }\n return {\n managedRuntimePid,\n legacyDetachedPids: legacyDetachedProcesses.map(\n (processInfo) => processInfo.pid\n ),\n };\n}\n\nasync function stopDuplicateOwnedProcesses(\n duplicateCleanup: LegacyDetachedDuplicateCleanup | null\n): Promise<void> {\n if (!duplicateCleanup) {\n return;\n }\n for (const pid of duplicateCleanup.legacyDetachedPids) {\n if (pid === duplicateCleanup.managedRuntimePid) {\n continue;\n }\n await terminateDaemonOwnedProcess(pid);\n }\n}\n\nasync function terminateDaemonOwnedProcess(pid: number): Promise<void> {\n if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid) {\n return;\n }\n if (!isPidAlive(pid)) {\n return;\n }\n process.kill(pid, \"SIGTERM\");\n const deadline = Date.now() + AUTO_HEAL_DUPLICATE_WAIT_MS;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) {\n return;\n }\n await sleep(AUTO_HEAL_DUPLICATE_POLL_MS);\n }\n if (isPidAlive(pid)) {\n process.kill(pid, \"SIGKILL\");\n }\n}\n\nfunction resolveBlockedAutoHealAnomalyCodes(input: {\n inventory: DaemonServiceInventory;\n duplicateCleanup: LegacyDetachedDuplicateCleanup | null;\n}): DaemonServiceAnomalyCode[] {\n return input.inventory.anomalies\n .map((anomaly) => anomaly.code)\n .filter((code) => {\n if (DAEMON_SERVICE_AUTO_HEAL_ANOMALIES.has(code)) {\n return false;\n }\n if (code === \"duplicate_owned_processes\") {\n return input.duplicateCleanup === null;\n }\n return (\n code === \"foreground_background_conflict\" ||\n code === \"background_foreground_conflict\" ||\n code === \"downgrade_blocked\" ||\n code === \"lifecycle_locked\"\n );\n });\n}\n\nfunction resolveAutoHealAnomalyCodes(input: {\n inventory: DaemonServiceInventory;\n duplicateCleanup: LegacyDetachedDuplicateCleanup | null;\n}): DaemonServiceAnomalyCode[] {\n return input.inventory.anomalies\n .map((anomaly) => anomaly.code)\n .filter((code) => {\n if (DAEMON_SERVICE_AUTO_HEAL_ANOMALIES.has(code)) {\n return true;\n }\n return (\n code === \"duplicate_owned_processes\" && input.duplicateCleanup !== null\n );\n });\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return String(error);\n}\n","import { sleep } from \"@openmeld/utils\";\nimport {\n type DaemonServiceAlignmentBlockReasonCode,\n type DaemonServiceAlignmentProgressStep,\n runDaemonServiceFullAlignment,\n} from \"./daemon-service-alignment-executor\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"./daemon-service-alignment-target\";\nimport {\n type DaemonServiceAutoHealReport,\n runDaemonServiceAutoHeal,\n} from \"./daemon-service-auto-heal\";\nimport {\n type DaemonServiceFailureStage,\n formatDaemonFailureContextText,\n} from \"./daemon-service-evidence\";\nimport type { DaemonServiceAnomalyCode } from \"./daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"./daemon-service-inventory\";\n\nconst STARTUP_ALIGNMENT_SETTLE_TIMEOUT_MS = 3000;\nconst STARTUP_ALIGNMENT_SETTLE_POLL_MS = 150;\nconst ALIGNMENT_LOCK_CONFLICT_MESSAGE =\n \"OpenMeld service alignment is already running in another local process.\";\n\nexport type DaemonStartupPreflightProgress = {\n onProgress: (\n step: DaemonServiceAlignmentProgressStep\n ) => Promise<void> | void;\n complete: (message?: string) => void;\n fail: () => void;\n};\n\nconst noopStartupPreflightProgress: DaemonStartupPreflightProgress = {\n onProgress: () => undefined,\n complete: () => undefined,\n fail: () => undefined,\n};\n\nexport type DaemonStartupPreflightResult =\n | {\n status: \"already_aligned\" | \"not_installed\";\n reasonCodes: DaemonServiceAnomalyCode[];\n errorMessage: null;\n cooldownUntil: null;\n backupDataPath: null;\n }\n | {\n status: \"auto_healed\" | \"aligned\";\n reasonCodes: [];\n errorMessage: null;\n cooldownUntil: null;\n backupDataPath: null;\n }\n | {\n status: \"blocked\";\n reasonCodes: (\n | DaemonServiceAnomalyCode\n | DaemonServiceAlignmentBlockReasonCode\n )[];\n errorMessage: string | null;\n cooldownUntil: string | null;\n backupDataPath: null;\n }\n | {\n status: \"failed\";\n reasonCodes: [];\n errorMessage: string;\n cooldownUntil: null;\n backupDataPath: string | null;\n failureStage?: string | null;\n evidencePath?: string | null;\n };\n\nexport async function runDaemonStartupPreflight(input: {\n expectedVersion: string;\n cliScriptPath?: string;\n view?: \"human\" | \"agent\";\n progress?: DaemonStartupPreflightProgress;\n}): Promise<DaemonStartupPreflightResult> {\n const target = buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n });\n const initialInventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: \"startup_check\",\n });\n const initialDecision = resolveDaemonServiceAlignmentDecision({\n inventory: initialInventory,\n target,\n });\n\n if (\n initialDecision.status === \"already_aligned\" ||\n initialDecision.status === \"not_installed\" ||\n initialDecision.status === \"blocked\"\n ) {\n return {\n status: initialDecision.status,\n reasonCodes: initialDecision.reasonCodes,\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (initialDecision.status === \"needs_auto_heal\") {\n return await runDaemonStartupAutoHeal({\n expectedVersion: input.expectedVersion,\n cliScriptPath: input.cliScriptPath,\n decisionReasonCodes: initialDecision.reasonCodes,\n });\n }\n\n const alignmentProgressUi = input.progress ?? noopStartupPreflightProgress;\n const alignmentResult = await runDaemonServiceFullAlignment({\n expectedVersion: input.expectedVersion,\n intent: \"startup_check\",\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n onProgress: alignmentProgressUi.onProgress,\n });\n return await mapAlignmentResultToStartupPreflightResult({\n alignmentProgressUi,\n alignmentResult,\n cliScriptPath: input.cliScriptPath,\n expectedVersion: input.expectedVersion,\n });\n}\n\nasync function mapAlignmentResultToStartupPreflightResult(input: {\n alignmentProgressUi: DaemonStartupPreflightProgress;\n alignmentResult: Awaited<ReturnType<typeof runDaemonServiceFullAlignment>>;\n cliScriptPath?: string;\n expectedVersion: string;\n}): Promise<DaemonStartupPreflightResult> {\n const { alignmentProgressUi, alignmentResult } = input;\n if (alignmentResult.status === \"already_aligned\") {\n alignmentProgressUi.complete(\n \"OpenMeld aligned the local background service.\"\n );\n return {\n status: \"already_aligned\",\n reasonCodes: [],\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (alignmentResult.status === \"aligned\") {\n alignmentProgressUi.complete(\n \"OpenMeld repaired and aligned the local background service.\"\n );\n return {\n status: \"aligned\",\n reasonCodes: [],\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (alignmentResult.status === \"stopped_safe\") {\n alignmentProgressUi.fail();\n return {\n status: \"failed\",\n reasonCodes: [],\n errorMessage: formatStartupPreflightFailureMessage({\n backupDataPath: null,\n errorMessage: `${alignmentResult.errorMessage}. OpenMeld left the current service version safely stopped instead of restoring an older background state. Run \\`openmeld service start\\` to start it again.`,\n failureStage: alignmentResult.failureStage ?? null,\n evidencePath: alignmentResult.evidencePath ?? null,\n }),\n cooldownUntil: null,\n backupDataPath: null,\n ...(alignmentResult.failureStage\n ? { failureStage: alignmentResult.failureStage }\n : {}),\n ...(alignmentResult.evidencePath\n ? { evidencePath: alignmentResult.evidencePath }\n : {}),\n };\n }\n\n alignmentProgressUi.fail();\n\n if (alignmentResult.status === \"blocked\") {\n return {\n status: \"blocked\",\n reasonCodes: alignmentResult.reasonCodes,\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (alignmentResult.errorMessage === ALIGNMENT_LOCK_CONFLICT_MESSAGE) {\n const settledResult = await waitForDaemonStartupAlignmentSettlement({\n expectedVersion: input.expectedVersion,\n cliScriptPath: input.cliScriptPath,\n timeoutMs: STARTUP_ALIGNMENT_SETTLE_TIMEOUT_MS,\n pollMs: STARTUP_ALIGNMENT_SETTLE_POLL_MS,\n });\n if (settledResult) {\n return settledResult;\n }\n }\n\n return {\n status: \"failed\",\n reasonCodes: [],\n errorMessage: formatStartupPreflightFailureMessage({\n backupDataPath: alignmentResult.backupDataPath,\n errorMessage: alignmentResult.errorMessage,\n failureStage: alignmentResult.failureStage ?? null,\n evidencePath: alignmentResult.evidencePath ?? null,\n }),\n cooldownUntil: null,\n backupDataPath: alignmentResult.backupDataPath,\n ...(alignmentResult.failureStage\n ? { failureStage: alignmentResult.failureStage }\n : {}),\n ...(alignmentResult.evidencePath\n ? { evidencePath: alignmentResult.evidencePath }\n : {}),\n };\n}\n\nasync function runDaemonStartupAutoHeal(input: {\n expectedVersion: string;\n cliScriptPath?: string;\n decisionReasonCodes: DaemonServiceAnomalyCode[];\n}): Promise<DaemonStartupPreflightResult> {\n const autoHealReport = await runDaemonServiceAutoHeal({\n expectedVersion: input.expectedVersion,\n intent: \"startup_check\",\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n\n return mapAutoHealReportToStartupPreflightResult({\n autoHealReport,\n fallbackReasonCodes: input.decisionReasonCodes,\n });\n}\n\nfunction formatStartupPreflightFailureMessage(input: {\n backupDataPath: string | null;\n errorMessage: string;\n failureStage: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n}): string {\n const failureContext = formatDaemonFailureContextText({\n backupDataPath: input.backupDataPath,\n evidencePath: input.evidencePath,\n failureStage: input.failureStage,\n });\n return failureContext.length > 0\n ? `${input.errorMessage}. ${failureContext}`\n : input.errorMessage;\n}\n\nfunction mapAutoHealReportToStartupPreflightResult(input: {\n autoHealReport: DaemonServiceAutoHealReport;\n fallbackReasonCodes: DaemonServiceAnomalyCode[];\n}): DaemonStartupPreflightResult {\n if (input.autoHealReport.status === \"repaired\") {\n return {\n status: \"auto_healed\",\n reasonCodes: [],\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (input.autoHealReport.status === \"noop\") {\n return {\n status: \"already_aligned\",\n reasonCodes: [],\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n if (input.autoHealReport.status === \"cooldown\") {\n return {\n status: \"blocked\",\n reasonCodes: input.fallbackReasonCodes,\n errorMessage:\n input.autoHealReport.errorMessage ??\n \"OpenMeld background service automatic repair is cooling down after repeated failures.\",\n cooldownUntil: input.autoHealReport.cooldownUntil,\n backupDataPath: null,\n };\n }\n\n if (input.autoHealReport.status === \"blocked\") {\n return {\n status: \"blocked\",\n reasonCodes:\n input.autoHealReport.blockedAnomalyCodes.length > 0\n ? input.autoHealReport.blockedAnomalyCodes\n : input.fallbackReasonCodes,\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n\n return {\n status: \"failed\",\n reasonCodes: [],\n errorMessage:\n input.autoHealReport.errorMessage ??\n \"OpenMeld background service automatic repair failed.\",\n cooldownUntil: null,\n backupDataPath: null,\n };\n}\n\nasync function waitForDaemonStartupAlignmentSettlement(input: {\n expectedVersion: string;\n cliScriptPath?: string;\n timeoutMs: number;\n pollMs: number;\n}): Promise<DaemonStartupPreflightResult | null> {\n const target = buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n });\n const deadline = Date.now() + input.timeoutMs;\n\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: \"startup_check\",\n }).catch(() => null);\n if (!inventory) {\n await sleep(input.pollMs);\n continue;\n }\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target,\n });\n if (decision.status === \"already_aligned\") {\n return {\n status: \"already_aligned\",\n reasonCodes: [],\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n if (decision.status === \"not_installed\" || decision.status === \"blocked\") {\n return {\n status: decision.status,\n reasonCodes: decision.reasonCodes,\n errorMessage: null,\n cooldownUntil: null,\n backupDataPath: null,\n };\n }\n await sleep(input.pollMs);\n }\n\n return null;\n}\n","import {\n type DaemonServiceRuntimeStatus,\n type DaemonStatus,\n getDaemonStatus,\n} from \"../../config/daemon-state\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../lifecycle/current-daemon-version\";\nimport {\n type DaemonLifecycleEvent,\n readLatestDaemonLifecycleConnectionStateEvent,\n readLatestDaemonLifecycleOriginEvent,\n} from \"../lifecycle/daemon-lifecycle-journal\";\nimport type { DaemonServiceInventory } from \"../lifecycle/daemon-service-inventory\";\nimport { inspectDaemonServiceInventory } from \"../lifecycle/daemon-service-inventory\";\nimport type { DaemonServiceManagerRuntimeStatus } from \"../lifecycle/daemon-service-manager\";\nimport {\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n} from \"../lifecycle/daemon-service-runtime\";\nimport { readDaemonRuntimeContractRepairReport } from \"../state/runtime-contract-guard\";\nimport {\n type DaemonStatusAttention,\n resolveDaemonStatusAttention,\n resolveDaemonStatusAuthenticationAttention,\n} from \"./daemon-status-attention\";\n\nexport type DaemonLocalStatusSnapshot = {\n attention: DaemonStatusAttention | null;\n daemonStatus: DaemonStatus;\n inventory: DaemonServiceInventory | null;\n latestConnectionStateEvent: DaemonLifecycleEvent | null;\n latestLifecycleEvent: DaemonLifecycleEvent | null;\n runtimeContractRepairReport: Awaited<\n ReturnType<typeof readDaemonRuntimeContractRepairReport>\n > | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n};\n\nexport async function resolveDaemonLocalStatusSnapshot(): Promise<DaemonLocalStatusSnapshot> {\n const daemonStatus = await getDaemonStatus();\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intent: \"status_cleanup\",\n }).catch(() => null);\n const runtimeStatus =\n inventory?.runtimeStatus ??\n (await resolveDaemonRuntimeState(daemonStatus).catch(() => null));\n const serviceManagerStatus =\n inventory?.serviceManagerStatus ??\n (\n await resolveDaemonServiceManagerForRuntimeState({\n runtimeState: runtimeStatus,\n status: daemonStatus,\n }).catch(() => ({\n serviceManagerStatus: null,\n }))\n ).serviceManagerStatus;\n const runtimeContractRepairReport = daemonStatus.installed\n ? await readDaemonRuntimeContractRepairReport().catch(() => null)\n : null;\n const latestLifecycleEvent =\n await readLatestDaemonLifecycleOriginEvent().catch(() => null);\n const latestConnectionStateEvent =\n await readLatestDaemonLifecycleConnectionStateEvent().catch(() => null);\n const attention =\n resolveDaemonStatusAuthenticationAttention({\n latestConnectionStateEvent,\n }) ??\n resolveDaemonStatusAttention({\n inventory,\n runtimeState: runtimeStatus,\n });\n\n return {\n attention,\n daemonStatus,\n inventory,\n latestConnectionStateEvent,\n latestLifecycleEvent,\n runtimeContractRepairReport,\n runtimeStatus,\n serviceManagerStatus,\n };\n}\n","import {\n type CliJsonOutputEnvelope,\n cliJsonOutputEnvelopeSchema,\n} from \"@openmeld/schemas\";\nimport { outJsonLine } from \"../ui/io\";\n\n/**\n * Single emit point for the CLI `--json` machine-readable output envelope.\n *\n * The envelope contract is owned by\n * `@openmeld/schemas` (`cliJsonOutputEnvelopeSchema`); the\n * `CliJsonOutputEnvelope` parameter type derives from it, so every call site is\n * compile-time checked against the shared contract instead of hand-writing a\n * shape that can drift (`developing/architecture/shared-contracts.md`: CLI JSON\n * is a shared boundary).\n *\n * The wire bytes are always the original object (key order and domain-owned\n * flattened fields preserved). `safeParse` runs as a fail-open drift guard: a\n * contract gap must never alter or suppress already-published `--json` output,\n * so a validation miss only surfaces as an opt-in diagnostic on stderr under\n * `OPENMELD_DEBUG_CLI_JSON=1` and never touches stdout.\n */\nexport function emitCliJsonEnvelope(envelope: CliJsonOutputEnvelope): void {\n const validation = cliJsonOutputEnvelopeSchema.safeParse(envelope);\n if (!validation.success && process.env.OPENMELD_DEBUG_CLI_JSON === \"1\") {\n process.stderr.write(\n `openmeld: --json envelope failed shared contract validation: ${validation.error.message}\\n`\n );\n }\n outJsonLine(envelope);\n}\n","import type { Presenter } from \"../runtime/presenter\";\nimport { renderInfoCard, renderTextInfoCard } from \"./info-card\";\n\nexport type HumanErrorCopy = {\n summary: string;\n nextStep: string | null;\n};\n\nconst TECHNICAL_DETAIL_MARKERS = [\n /\\s+Detail:/iu,\n /\\s+Details:/iu,\n /\\s+For diagnostics[,.:]?/iu,\n /\\s+Diagnostic evidence:/iu,\n /\\s+Last network error:/iu,\n /\\s+Support code:/iu,\n];\nconst ACTION_SENTENCE_RE =\n /^(?:After\\b|Check\\b|Choose\\b|Close\\b|Connect\\b|Contact\\b|Continue\\b|Copy\\b|Finish\\b|Free\\b|Go\\b|Make sure\\b|Open\\b|Reconnect\\b|Remove\\b|Restart\\b|Return\\b|Run\\b|Select\\b|Sign in\\b|Start\\b|Stop\\b|Try\\b|Turn off\\b|Turn on\\b|Update\\b|Use\\b|Wait\\b)/iu;\nconst SENTENCE_BOUNDARY_RE = /(?<=[.!?])\\s+(?=[A-Z`])/u;\n\nexport function buildHumanErrorCopy(message: string): HumanErrorCopy {\n const publicMessage = stripTechnicalErrorDetail(message);\n const sentences = splitSentences(publicMessage);\n const summary = sentences[0] ?? \"OpenMeld couldn't finish that.\";\n const nextStep =\n sentences.slice(1).find((sentence) => ACTION_SENTENCE_RE.test(sentence)) ??\n null;\n return { summary, nextStep };\n}\n\nexport function renderHumanErrorCard(input: {\n codePrefix: string;\n message: string;\n nextStep?: string | null;\n presenter: Presenter;\n title?: string;\n}): void {\n const copy = buildHumanErrorCopy(input.message);\n const explicitNextStep = input.nextStep\n ? buildHumanErrorCopy(input.nextStep)\n : null;\n renderInfoCard({\n codePrefix: input.codePrefix,\n compact: true,\n minContentWidth: 48,\n presenter: input.presenter,\n rows: buildHumanErrorRows({\n ...copy,\n nextStep: explicitNextStep\n ? (explicitNextStep.nextStep ?? explicitNextStep.summary)\n : copy.nextStep,\n }),\n sanitize: true,\n title: input.title ?? \"OpenMeld couldn't finish\",\n });\n}\n\nexport function renderHumanTextErrorCard(input: {\n emitLine: (line: string) => void;\n message: string;\n title?: string;\n}): void {\n const copy = buildHumanErrorCopy(input.message);\n renderTextInfoCard({\n compact: true,\n emitLine: input.emitLine,\n minContentWidth: 48,\n rows: buildHumanErrorRows(copy),\n sanitize: true,\n title: input.title ?? \"OpenMeld couldn't finish\",\n });\n}\n\nfunction buildHumanErrorRows(copy: HumanErrorCopy) {\n return [\n { label: \"What happened\", value: copy.summary },\n ...(copy.nextStep ? [{ label: \"Next\", value: copy.nextStep }] : []),\n ];\n}\n\nfunction stripTechnicalErrorDetail(message: string): string {\n let end = message.length;\n for (const marker of TECHNICAL_DETAIL_MARKERS) {\n const index = message.search(marker);\n if (index >= 0) {\n end = Math.min(end, index);\n }\n }\n return message.slice(0, end).replaceAll(/\\s+/gu, \" \").trim();\n}\n\nfunction splitSentences(message: string): string[] {\n return message\n .split(SENTENCE_BOUNDARY_RE)\n .map((sentence) => sentence.trim())\n .filter(Boolean);\n}\n","import { isCancel, select } from \"@clack/prompts\";\nimport type { DaemonBackgroundStartFailure } from \"../commands/service-start-failure\";\nimport type { DaemonServiceRuntimeStatus } from \"../config/daemon-state\";\nimport {\n buildDaemonServiceRefreshNextStep,\n buildDaemonServiceRefreshPromptMessage,\n} from \"../local-service/lifecycle/daemon-service-repair-guidance\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport { buildHumanErrorCopy } from \"../ui/human-error-card\";\n\nexport const DAEMON_START_DECISION_CHOICE = {\n start: \"start\",\n notNow: \"not_now\",\n} as const;\n\nexport type DaemonStartDecisionChoice =\n | (typeof DAEMON_START_DECISION_CHOICE)[keyof typeof DAEMON_START_DECISION_CHOICE]\n | \"cancelled\";\n\nexport type DaemonStartServiceDecisionOutcome =\n | \"started\"\n | \"failed\"\n | DaemonBackgroundStartFailure\n | \"deferred_with_card\"\n | \"cancelled\";\n\nexport type DaemonStartDecisionPromptConfig = {\n message: string;\n initialValue: (typeof DAEMON_START_DECISION_CHOICE)[\"start\"];\n options: Array<{\n value:\n | (typeof DAEMON_START_DECISION_CHOICE)[\"start\"]\n | (typeof DAEMON_START_DECISION_CHOICE)[\"notNow\"];\n label: string;\n hint?: string;\n }>;\n};\n\nexport const DAEMON_REPAIR_DECISION_CHOICE = {\n repair: \"repair\",\n notNow: \"not_now\",\n} as const;\n\nexport type DaemonRepairDecisionChoice =\n | (typeof DAEMON_REPAIR_DECISION_CHOICE)[keyof typeof DAEMON_REPAIR_DECISION_CHOICE]\n | \"cancelled\";\n\nexport type DaemonRepairDecisionPromptConfig = {\n message: string;\n initialValue: (typeof DAEMON_REPAIR_DECISION_CHOICE)[\"repair\"];\n options: Array<{\n value:\n | (typeof DAEMON_REPAIR_DECISION_CHOICE)[\"repair\"]\n | (typeof DAEMON_REPAIR_DECISION_CHOICE)[\"notNow\"];\n label: string;\n hint?: string;\n }>;\n};\n\nexport type DaemonStartDecisionCard = {\n title: string;\n rows: Array<{\n label: string;\n value: string;\n }>;\n};\n\nconst DAEMON_START_DECISION_QUESTION =\n \"OpenMeld Service is not running. Start it now?\";\nconst DAEMON_START_DECISION_EXPLANATION =\n \"Without it, this computer can't receive local Wake work.\";\nconst DAEMON_START_DECISION_START_LABEL = \"Yes, start it for me\";\nconst DAEMON_START_DECISION_NOT_NOW_LABEL = \"Not now\";\nconst DAEMON_START_DECISION_RECOMMENDED_HINT = \"Recommended\";\nconst DAEMON_REPAIR_DECISION_REPAIR_LABEL = \"Yes, reconnect it for me\";\nconst DAEMON_START_RUN_COMMAND = \"openmeld service start\";\nconst DAEMON_START_STATUS_COMMAND = \"openmeld service status\";\nconst DAEMON_START_STOP_COMMAND = \"openmeld service stop\";\n\nexport function buildDaemonStartDecisionPromptConfig(): DaemonStartDecisionPromptConfig {\n return {\n message: `${DAEMON_START_DECISION_QUESTION}\\n${DAEMON_START_DECISION_EXPLANATION}`,\n initialValue: DAEMON_START_DECISION_CHOICE.start,\n options: [\n {\n value: DAEMON_START_DECISION_CHOICE.start,\n label: DAEMON_START_DECISION_START_LABEL,\n hint: DAEMON_START_DECISION_RECOMMENDED_HINT,\n },\n {\n value: DAEMON_START_DECISION_CHOICE.notNow,\n label: DAEMON_START_DECISION_NOT_NOW_LABEL,\n },\n ],\n };\n}\n\nexport async function promptForDaemonStartDecision(): Promise<DaemonStartDecisionChoice> {\n const choice = await select(buildDaemonStartDecisionPromptConfig());\n if (isCancel(choice)) {\n return \"cancelled\";\n }\n return choice === DAEMON_START_DECISION_CHOICE.start\n ? DAEMON_START_DECISION_CHOICE.start\n : DAEMON_START_DECISION_CHOICE.notNow;\n}\n\nexport function buildDaemonRepairDecisionPromptConfig(): DaemonRepairDecisionPromptConfig {\n return {\n message: `${buildDaemonServiceRefreshPromptMessage()}\\nReconnect it now?`,\n initialValue: DAEMON_REPAIR_DECISION_CHOICE.repair,\n options: [\n {\n value: DAEMON_REPAIR_DECISION_CHOICE.repair,\n label: DAEMON_REPAIR_DECISION_REPAIR_LABEL,\n hint: DAEMON_START_DECISION_RECOMMENDED_HINT,\n },\n {\n value: DAEMON_REPAIR_DECISION_CHOICE.notNow,\n label: DAEMON_START_DECISION_NOT_NOW_LABEL,\n },\n ],\n };\n}\n\nexport async function promptForDaemonRepairDecision(): Promise<DaemonRepairDecisionChoice> {\n const choice = await select(buildDaemonRepairDecisionPromptConfig());\n if (isCancel(choice)) {\n return \"cancelled\";\n }\n return choice === DAEMON_REPAIR_DECISION_CHOICE.repair\n ? DAEMON_REPAIR_DECISION_CHOICE.repair\n : DAEMON_REPAIR_DECISION_CHOICE.notNow;\n}\n\nexport async function runDaemonStartDecisionPrompt(input: {\n startService: () => Promise<\n undefined | boolean | DaemonStartServiceDecisionOutcome\n >;\n}): Promise<\n | \"started\"\n | \"not_now\"\n | \"cancelled\"\n | \"failed\"\n | DaemonBackgroundStartFailure\n | \"deferred_with_card\"\n> {\n const decision = await promptForDaemonStartDecision();\n if (decision === DAEMON_START_DECISION_CHOICE.start) {\n try {\n const result = await input.startService();\n if (result === false || result === \"failed\") {\n return \"failed\";\n }\n if (typeof result === \"object\") {\n return result;\n }\n if (result === \"deferred_with_card\") {\n return \"deferred_with_card\";\n }\n if (result === \"cancelled\") {\n return \"cancelled\";\n }\n return \"started\";\n } catch {\n return \"failed\";\n }\n }\n\n if (decision === \"cancelled\") {\n return \"cancelled\";\n }\n\n return decision;\n}\n\nexport function shouldOfferDaemonStartDecision(\n runtimeStatus: DaemonServiceRuntimeStatus[\"status\"] | null | undefined\n): boolean {\n return runtimeStatus === \"not_running\" || runtimeStatus === \"stale\";\n}\n\nexport function buildDaemonStartDeferredCard(): DaemonStartDecisionCard {\n return {\n title: \"OpenMeld Service is off\",\n rows: [\n {\n label: \"What happened\",\n value: \"OpenMeld Service isn't running.\",\n },\n {\n label: \"Next\",\n value: `Start later with \\`${formatOpenMeldCliCommand(\n DAEMON_START_RUN_COMMAND\n )}\\`.`,\n },\n ],\n };\n}\n\nexport function buildDaemonStartNeedsAttentionCard(input: {\n summary: string;\n nextStep?: string;\n autoRepairAttempted?: boolean;\n detail?: string;\n}): DaemonStartDecisionCard {\n const summaryCopy = buildHumanErrorCopy(input.summary);\n const explicitNextStep = input.nextStep\n ? buildHumanErrorCopy(input.nextStep).summary\n : null;\n return {\n title: \"OpenMeld Service couldn't start\",\n rows: [\n {\n label: \"What happened\",\n value: summaryCopy.summary,\n },\n {\n label: \"Next\",\n value:\n explicitNextStep ??\n summaryCopy.nextStep ??\n buildDaemonServiceRefreshNextStep(),\n },\n ],\n };\n}\n\nexport function getDaemonStartStartedTitle(): string {\n return \"✅ OpenMeld Service Started\";\n}\n\nexport function formatDaemonStartStartedStatus(): string {\n return \"running\";\n}\n\nexport function formatDaemonStartAutoRepairResolvedMessage(): string {\n return \"OpenMeld fixed one local startup issue automatically. No action needed.\";\n}\n\nexport function formatDaemonStartStartedMeaning(): string {\n return \"OpenMeld Service is running on this device. Cloud connection may still be reconnecting.\";\n}\n\nexport function formatDaemonStartStartedManage(): string {\n return `Check it any time with \\`${formatOpenMeldCliCommand(\n DAEMON_START_STATUS_COMMAND\n )}\\` without stopping it. Stop it any time with \\`${formatOpenMeldCliCommand(\n DAEMON_START_STOP_COMMAND\n )}\\`.`;\n}\n\nexport function formatDaemonStartStartedNextStep(): string {\n return \"Use `openmeld service status` if you want to check the local service link and cloud connection.\";\n}\n","export function shouldEmitAgentOverview(input: {\n argv?: readonly string[];\n handled?: boolean;\n resolvedView: \"human\" | \"agent\";\n}): boolean {\n if (input.resolvedView !== \"agent\" || input.handled) {\n return false;\n }\n\n return (input.argv ?? process.argv).includes(\"--details\");\n}\n","import pc from \"picocolors\";\nimport stringWidth from \"string-width\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\n\nconst DEFAULT_SPINNER_DELAY_MS = 250;\nconst SPINNER_FRAME_INTERVAL_MS = 80;\nconst SPINNER_DECORATION_VISIBLE_WIDTH = 3;\nconst SPINNER_FRAMES = [\"◒\", \"◐\", \"◓\", \"◑\"] as const;\nconst CLEAR_CURRENT_TERMINAL_LINE = \"\\r\\x1B[2K\";\nconst TRUNCATED_SPINNER_MESSAGE_MARKER = \"…\";\n\nexport type DelayedSpinner = {\n start: () => void;\n complete: () => void;\n fail: () => void;\n message: (message: string) => void;\n};\n\ntype DelayedSpinnerOutput = {\n columns?: number;\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n};\n\nexport function createDelayedSpinner(input: {\n enabled: boolean;\n message: string;\n delayMs?: number;\n isTTY?: boolean;\n columns?: number;\n output?: DelayedSpinnerOutput;\n}): DelayedSpinner {\n const output = input.output ?? {\n columns: process.stdout.columns,\n isTTY: process.stdout.isTTY,\n write: (chunk: string) => process.stdout.write(chunk),\n };\n const terminalColumns = resolveSpinnerTerminalColumns(\n input.columns ?? output.columns\n );\n const shouldRender =\n input.enabled === true &&\n (input.isTTY ?? output.isTTY) === true &&\n terminalColumns !== null &&\n terminalColumns >= SPINNER_DECORATION_VISIBLE_WIDTH;\n if (!shouldRender) {\n return {\n start: () => undefined,\n complete: () => undefined,\n fail: () => undefined,\n message: () => undefined,\n };\n }\n\n const delayMs = input.delayMs ?? DEFAULT_SPINNER_DELAY_MS;\n let pendingTimer: NodeJS.Timeout | null = null;\n let frameTimer: NodeJS.Timeout | null = null;\n let frameIndex = 0;\n let spinnerVisible = false;\n let latestMessage = toSingleLineSpinnerMessage({\n message: input.message,\n terminalColumns,\n });\n\n const clearPendingTimer = (): void => {\n if (!pendingTimer) {\n return;\n }\n clearTimeout(pendingTimer);\n pendingTimer = null;\n };\n\n const clearFrameTimer = (): void => {\n if (!frameTimer) {\n return;\n }\n clearInterval(frameTimer);\n frameTimer = null;\n };\n\n const writeSpinnerLine = (line: string): void => {\n output.write(`${CLEAR_CURRENT_TERMINAL_LINE}${line}`);\n };\n\n const clearSpinnerLine = (): void => {\n output.write(CLEAR_CURRENT_TERMINAL_LINE);\n };\n\n const renderFrame = (): void => {\n const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];\n frameIndex += 1;\n writeSpinnerLine(`${pc.magenta(frame)} ${latestMessage}`);\n };\n\n const ensureSpinnerStarted = (): void => {\n if (spinnerVisible || pendingTimer) {\n return;\n }\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n spinnerVisible = true;\n renderFrame();\n frameTimer = setInterval(renderFrame, SPINNER_FRAME_INTERVAL_MS);\n }, delayMs);\n };\n\n const stopSpinner = (): void => {\n clearPendingTimer();\n if (!spinnerVisible) {\n return;\n }\n spinnerVisible = false;\n clearFrameTimer();\n clearSpinnerLine();\n };\n\n return {\n start: () => {\n ensureSpinnerStarted();\n },\n complete: () => {\n stopSpinner();\n },\n fail: () => {\n stopSpinner();\n },\n message: (message) => {\n latestMessage = toSingleLineSpinnerMessage({\n message,\n terminalColumns,\n });\n if (spinnerVisible) {\n renderFrame();\n }\n },\n };\n}\n\nfunction resolveSpinnerTerminalColumns(\n columns: number | undefined\n): number | null {\n if (\n typeof columns !== \"number\" ||\n !Number.isInteger(columns) ||\n columns < 1\n ) {\n return null;\n }\n return columns;\n}\n\nfunction toSingleLineSpinnerMessage(input: {\n message: string;\n terminalColumns: number;\n}): string {\n const maxMessageWidth =\n input.terminalColumns - SPINNER_DECORATION_VISIBLE_WIDTH;\n if (maxMessageWidth < 1) {\n return \"\";\n }\n\n const message = sanitizeTerminalDisplayText(\n input.message,\n \"single-line\"\n ).trim();\n return truncateVisibleText(message, maxMessageWidth);\n}\n\nfunction truncateVisibleText(value: string, maxWidth: number): string {\n if (stringWidth(value) <= maxWidth) {\n return value;\n }\n\n const markerWidth = stringWidth(TRUNCATED_SPINNER_MESSAGE_MARKER);\n if (maxWidth <= markerWidth) {\n return TRUNCATED_SPINNER_MESSAGE_MARKER;\n }\n\n const targetWidth = maxWidth - markerWidth;\n let result = \"\";\n let resultWidth = 0;\n for (const char of value) {\n const charWidth = stringWidth(char);\n if (resultWidth + charWidth > targetWidth) {\n break;\n }\n result += char;\n resultWidth += charWidth;\n }\n\n return `${result.trimEnd()}${TRUNCATED_SPINNER_MESSAGE_MARKER}`;\n}\n","import { buildAgentOverviewFromContract } from \"../command-contracts/helpers\";\nimport { getCommandEntryContract } from \"../command-contracts/registry\";\nimport type { CommandEntryName } from \"../command-entry-checks/types\";\nimport type { Presenter } from \"../runtime/presenter\";\n\nexport type DaemonAgentOverviewCommand =\n | \"menu\"\n | \"run\"\n | \"status\"\n | \"snapshot\"\n | \"interrupt\"\n | \"cancel\"\n | \"install\"\n | \"reinstall\"\n | \"uninstall\"\n | \"stop\";\n\ntype DaemonAgentOverviewInput = {\n presenter: Presenter;\n command: DaemonAgentOverviewCommand;\n};\n\nexport function emitDaemonAgentOverview(input: DaemonAgentOverviewInput): void {\n input.presenter.data({\n code: `daemon.${input.command}.agent_overview`,\n payload: buildDaemonAgentOverviewPayload(input.command),\n });\n}\n\nfunction buildDaemonAgentOverviewPayload(\n command: DaemonAgentOverviewCommand\n): Record<string, unknown> {\n const entryName = `service.${command}` as CommandEntryName;\n const contract = getCommandEntryContract(entryName);\n if (!contract?.agentOverview) {\n throw new Error(`missing ${entryName} command contract`);\n }\n return buildAgentOverviewFromContract({\n context: {\n includeViewFlag: true,\n },\n overview: contract.agentOverview,\n });\n}\n","import { shouldEmitAgentOverview } from \"../runtime/agent-overview-output\";\nimport { formatOpenMeldCliTextBlock } from \"../runtime/cli-entry-command\";\nimport type { RuntimeContext } from \"../runtime/context\";\nimport type { createPresenter, Presenter } from \"../runtime/presenter/index\";\nimport {\n buildDaemonStartDeferredCard,\n buildDaemonStartNeedsAttentionCard,\n} from \"../system/local-service-start-decision\";\nimport {\n createDelayedSpinner,\n type DelayedSpinner,\n} from \"../ui/delayed-spinner\";\nimport { renderInfoCard } from \"../ui/info-card\";\nimport { emitDaemonAgentOverview } from \"./service-agent-overview\";\n\ntype DaemonStartSpinner = {\n clear: () => void;\n message: (message: string) => void;\n start: (message: string) => void;\n};\n\nexport const NOOP_PRESENTER_METHOD = (): void => {\n // Intentionally silent for internal command orchestration.\n};\n\nexport function createSilentPresenter(\n view: RuntimeContext[\"resolvedView\"]\n): Presenter {\n return {\n view,\n data: NOOP_PRESENTER_METHOD,\n event: NOOP_PRESENTER_METHOD,\n line: NOOP_PRESENTER_METHOD,\n };\n}\n\nexport function renderServiceActionCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n codePrefix: string;\n title: string;\n rows: Array<{ label: string; value: string }>;\n}): void {\n renderInfoCard({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n title: input.title,\n rows: formatDaemonDisplayRows(input.rows),\n });\n}\n\nexport function formatDaemonDisplayRows(\n rows: Array<{ label: string; value: string }>\n): Array<{ label: string; value: string }> {\n return rows.map((row) => ({\n ...row,\n value: formatOpenMeldCliTextBlock(row.value),\n }));\n}\n\nexport function emitDaemonOverviewIfAgent(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: RuntimeContext[\"resolvedView\"];\n command:\n | \"menu\"\n | \"run\"\n | \"status\"\n | \"snapshot\"\n | \"install\"\n | \"reinstall\"\n | \"uninstall\"\n | \"stop\"\n | \"interrupt\"\n | \"cancel\";\n handled?: boolean;\n}): void {\n if (\n !shouldEmitAgentOverview({\n resolvedView: input.resolvedView,\n handled: input.handled,\n })\n ) {\n return;\n }\n emitDaemonAgentOverview({\n presenter: input.presenter,\n command: input.command,\n });\n}\n\nexport function renderDaemonStartDeferredCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n codePrefix: string;\n}): void {\n const card = buildDaemonStartDeferredCard();\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n title: card.title,\n rows: card.rows,\n });\n}\n\nexport function renderDaemonStartNeedsAttentionCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n codePrefix: string;\n summary: string;\n nextStep?: string;\n autoRepairAttempted?: boolean;\n detail?: string;\n}): void {\n const card = buildDaemonStartNeedsAttentionCard({\n summary: input.summary,\n nextStep: input.nextStep,\n autoRepairAttempted: input.autoRepairAttempted,\n detail: input.detail,\n });\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n title: card.title,\n rows: card.rows,\n });\n}\n\nexport function createDaemonStartSpinner(input: {\n runtime: RuntimeContext;\n suppress?: boolean;\n}): DaemonStartSpinner | null {\n if (input.suppress === true) {\n return null;\n }\n if (input.runtime.resolvedView !== \"human\") {\n return null;\n }\n if (process.stdout.isTTY !== true) {\n return null;\n }\n let spinner: DelayedSpinner | null = null;\n return {\n clear: () => {\n spinner?.complete();\n spinner = null;\n },\n message: (message) => {\n spinner?.message(message);\n },\n start: (message) => {\n spinner = createDelayedSpinner({\n enabled: true,\n message,\n });\n spinner.start();\n },\n };\n}\n\nexport function createQuietPresenter(\n runtime: RuntimeContext\n): ReturnType<typeof createPresenter> {\n return {\n view: runtime.resolvedView,\n event: () => undefined,\n line: () => undefined,\n data: () => undefined,\n };\n}\n\nexport function normalizeText(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n return value.trim().toLowerCase();\n}\n","import type {\n CliVersionVerdict,\n ServiceVersionVerdict,\n} from \"@openmeld/schemas\";\nimport { compareSemver } from \"../config/version-state\";\nimport type { CliUpdateAssessment } from \"./cli-update-assessment\";\nimport {\n describeServerRequiredVersionUnavailableReason,\n type ServerRequiredVersionAssessment,\n} from \"./server-required-version-assessment\";\n\n/**\n * The two accounts of \"what CLI version should this computer be running\" can\n * disagree (W-REL-DOCTOR): the release channel (npm registry / R2\n * `cli/manifest.json`) and Core's compiled release manifest are published\n * independently. `kind` names which side of that disagreement (if any) is\n * true right now; `message` is the one-line, human-readable verdict.\n */\n/**\n * Reconciles the release-channel view of the CLI version\n * (`assessCliUpdate`) against the server-required view\n * (`assessServerRequiredVersion`) into a single verdict.\n *\n * This is the merge step that the incident this ticket fixes was missing:\n * before it, the CLI only ever printed the channel view, so a stuck release\n * channel looked identical to \"everything is fine\" even while Core's own\n * release manifest already required a newer version.\n */\nexport function reconcileCliVersionView(input: {\n channel: CliUpdateAssessment;\n server: ServerRequiredVersionAssessment;\n}): CliVersionVerdict {\n const { channel, server } = input;\n\n if (!server.available) {\n return {\n kind: \"server_unavailable\",\n message: `Server-required version check is unavailable (${describeServerRequiredVersionUnavailableReason(server)}); showing the release channel view only.`,\n };\n }\n\n const channelLatest = channel.checked ? channel.latestVersion : null;\n if (!channelLatest) {\n return {\n kind: \"channel_unavailable\",\n message: `Release-channel version check did not run in this environment; the server currently reports ${server.cli.latestPackageVersion ?? \"no\"} version as latest for the CLI.`,\n };\n }\n\n const serverLatest = server.cli.latestPackageVersion;\n if (!serverLatest) {\n return {\n kind: \"server_unavailable\",\n message:\n \"Server-required version check returned no CLI version data; showing the release channel view only.\",\n };\n }\n\n // \"Required\" only has teeth when the server projection actually marks the\n // CLI as requiring an update; short of that, `latestPackageVersion` is\n // merely what the server currently publishes as latest, not a mandate.\n const serverRequired =\n server.cli.status === \"update_required\" ? serverLatest : null;\n\n if (serverRequired && compareSemver(serverRequired, channelLatest) > 0) {\n return {\n kind: \"channel_behind\",\n message: `Server requires ${serverRequired} but the release channel only has ${channelLatest} — the release channel is behind. Wait for OpenMeld to publish ${serverRequired}; re-running setup will not help.`,\n };\n }\n\n if (compareSemver(channelLatest, serverLatest) > 0) {\n return {\n kind: \"channel_ahead\",\n message: `The release channel already publishes ${channelLatest}, ahead of what the server currently expects (${serverLatest}) — the server-side release manifest may not be stamped yet.`,\n };\n }\n\n if (compareSemver(serverLatest, channelLatest) > 0) {\n return {\n kind: \"channel_behind\",\n message: `Server expects ${serverLatest}; the release channel has ${channelLatest} — the server-side manifest may be ahead.`,\n };\n }\n\n return {\n kind: \"aligned\",\n message: `Release channel and server agree: OpenMeld CLI ${channelLatest} is current.`,\n };\n}\n\n/**\n * The server visor's opinion on the installed OpenMeld Service (daemon)\n * version, alongside the locally observed installed version. Service has no\n * independent \"release channel\" the way the CLI package does (its bundle\n * ships inside each CLI release), so this is a simpler installed-vs-server\n * comparison rather than a three-way channel reconciliation.\n */\nexport function reconcileServiceVersionView(input: {\n installedVersion: string | null;\n server: ServerRequiredVersionAssessment;\n}): ServiceVersionVerdict {\n if (!input.server.available) {\n return {\n kind: \"server_unavailable\",\n message: `Server-required version check is unavailable (${describeServerRequiredVersionUnavailableReason(input.server)}); showing the installed version only.`,\n };\n }\n\n const { service } = input.server;\n const installed = input.installedVersion ?? service.installedVersion;\n switch (service.status) {\n case \"update_required\": {\n const target = service.requiredVersion ?? service.latestVersion;\n return {\n kind: \"update_required\",\n message: `Server requires OpenMeld Service ${target ?? \"a newer version\"} (installed: ${installed ?? \"unknown\"}). Run \\`openmeld service update\\`.`,\n };\n }\n case \"update_available\":\n return {\n kind: \"update_available\",\n message: `OpenMeld Service ${service.latestVersion ?? \"a newer version\"} is available (installed: ${installed ?? \"unknown\"}).`,\n };\n case \"current\":\n return {\n kind: \"aligned\",\n message: `OpenMeld Service ${installed ?? \"installed version\"} matches what the server expects.`,\n };\n default:\n return {\n kind: \"unknown\",\n message: \"Server-reported OpenMeld Service update status is unknown.\",\n };\n }\n}\n","import type { EffectiveProfileWorkingFolderRuntimeResolution } from \"./effective-runtime-resolution\";\n\nexport type ProfileWorkspacePresentation =\n | {\n configuredWorkspace: string;\n configuredWorkspaceDisplay: string;\n effectiveRuntimeWorkingDirectory: string;\n effectiveRuntimeWorkingDirectoryDisplay: string;\n reasonCode: null;\n reasonText: null;\n status: \"openmeld_managed\" | \"custom\" | \"default_project\";\n workspace: \"OpenMeld-managed\" | \"Custom\" | \"Default Project\";\n workspaceSource: \"OpenMeld-managed\" | \"Custom\" | \"Default Project\";\n }\n | {\n configuredWorkspace: string | null;\n configuredWorkspaceDisplay: string;\n effectiveRuntimeWorkingDirectory: string | null;\n effectiveRuntimeWorkingDirectoryDisplay: string;\n reasonCode: \"workspace.missing\" | \"workspace.invalid\";\n reasonText: string;\n status: \"invalid\" | \"missing\";\n workspace: \"Invalid\" | \"Missing\";\n workspaceSource: \"OpenMeld-managed\" | \"Custom\" | \"Invalid\" | \"Missing\";\n };\n\ntype WorkspaceRow = {\n label: string;\n value: string;\n};\n\nexport function buildProfileWorkspacePresentation(\n resolution: EffectiveProfileWorkingFolderRuntimeResolution | null\n): ProfileWorkspacePresentation | null {\n if (!resolution) {\n return null;\n }\n if (resolution.status === \"ready\") {\n if (\n \"workingFolderSource\" in resolution &&\n resolution.workingFolderSource === \"default_project\"\n ) {\n return {\n configuredWorkspace: resolution.configuredWorkspacePath,\n configuredWorkspaceDisplay: resolution.configuredWorkspacePath,\n effectiveRuntimeWorkingDirectory:\n resolution.effectiveRuntimeWorkingDirectory,\n effectiveRuntimeWorkingDirectoryDisplay:\n resolution.effectiveRuntimeWorkingDirectory,\n reasonCode: null,\n reasonText: null,\n status: \"default_project\",\n workspace: \"Default Project\",\n workspaceSource: \"Default Project\",\n };\n }\n if (resolution.workspaceMode === null) {\n throw new Error(\"Default Project working folder source is missing.\");\n }\n const label =\n resolution.workspaceMode === \"openmeld_managed\"\n ? \"OpenMeld-managed\"\n : \"Custom\";\n return {\n configuredWorkspace: resolution.configuredWorkspacePath,\n configuredWorkspaceDisplay: resolution.configuredWorkspacePath,\n effectiveRuntimeWorkingDirectory:\n resolution.effectiveRuntimeWorkingDirectory,\n effectiveRuntimeWorkingDirectoryDisplay:\n resolution.effectiveRuntimeWorkingDirectory,\n reasonCode: null,\n reasonText: null,\n status: resolution.workspaceMode,\n workspace: label,\n workspaceSource: label,\n };\n }\n if (resolution.status === \"missing\") {\n return {\n configuredWorkspace: null,\n configuredWorkspaceDisplay: \"Missing\",\n effectiveRuntimeWorkingDirectory: null,\n effectiveRuntimeWorkingDirectoryDisplay: \"Missing\",\n reasonCode: resolution.reasonCode,\n reasonText: resolution.reasonText,\n status: \"missing\",\n workspace: \"Missing\",\n workspaceSource: \"Missing\",\n };\n }\n const workspaceSource = resolveInvalidWorkspaceSourceLabel(\n resolution.workspaceMode\n );\n return {\n configuredWorkspace: resolution.configuredWorkspacePath ?? null,\n configuredWorkspaceDisplay: resolution.configuredWorkspacePath ?? \"Invalid\",\n effectiveRuntimeWorkingDirectory: null,\n effectiveRuntimeWorkingDirectoryDisplay: \"Invalid\",\n reasonCode: resolution.reasonCode,\n reasonText: resolution.reasonText,\n status: \"invalid\",\n workspace: \"Invalid\",\n workspaceSource,\n };\n}\n\nexport function buildProfileWorkspaceRows(\n presentation: ProfileWorkspacePresentation | null\n): WorkspaceRow[] {\n if (!presentation) {\n return [];\n }\n return [\n { label: \"Workspace\", value: presentation.workspace },\n { label: \"Workspace Type\", value: presentation.workspaceSource },\n {\n label: \"Workspace Folder\",\n value: presentation.configuredWorkspaceDisplay,\n },\n {\n label: \"Current Working Folder\",\n value: presentation.effectiveRuntimeWorkingDirectoryDisplay,\n },\n ];\n}\n\nfunction resolveInvalidWorkspaceSourceLabel(\n workspaceMode: \"openmeld_managed\" | \"custom\" | null | undefined\n): \"OpenMeld-managed\" | \"Custom\" | \"Invalid\" {\n if (workspaceMode === \"openmeld_managed\") {\n return \"OpenMeld-managed\";\n }\n if (workspaceMode === \"custom\") {\n return \"Custom\";\n }\n return \"Invalid\";\n}\n","import type { DaemonServiceRuntimeStatus } from \"../config/daemon-state\";\nimport type { DaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type { DeviceReplyReadinessStatus } from \"./reply-readiness\";\nimport {\n resolveServiceReadiness,\n type ServiceReadinessState,\n type ServiceRuntimeHeadline,\n} from \"./service-readiness-resolver\";\n\nexport type ServiceParticipationReadiness =\n | \"ready\"\n | \"needs_repair\"\n | \"not_running\"\n | \"not_installed\"\n | \"unknown\";\n\nexport type ServiceParticipationReadinessSummary = {\n serviceReadiness: ServiceParticipationReadiness;\n serviceReadinessState: ServiceReadinessState;\n summaryText: string;\n detailText: string;\n nextStepSummary: string | null;\n nextSteps: string[];\n runtimeHeadline: ServiceRuntimeHeadline;\n};\n\nexport function resolveServiceParticipationReadiness(input: {\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n inventory?: DaemonServiceInventory | null;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n}): ServiceParticipationReadinessSummary {\n const readiness = resolveServiceReadiness(input);\n return {\n serviceReadiness: toParticipationReadiness(readiness.state),\n serviceReadinessState: readiness.state,\n summaryText: readiness.summaryText,\n detailText: readiness.detailText,\n nextStepSummary: readiness.nextStepSummary,\n nextSteps: readiness.nextSteps,\n runtimeHeadline: readiness.runtimeHeadline,\n };\n}\n\nexport function formatServiceParticipationReadinessLabel(\n input: ServiceParticipationReadinessSummary\n): string {\n if (input.serviceReadinessState === \"update_available\") {\n return `ℹ️ ${input.summaryText} — ${input.detailText}`;\n }\n switch (input.serviceReadiness) {\n case \"ready\":\n return `✅ ${input.summaryText} — ${input.detailText}`;\n case \"needs_repair\":\n return `⚠️ ${input.summaryText} — ${input.detailText}`;\n case \"not_running\":\n case \"not_installed\":\n return `⛔ ${input.summaryText} — ${input.detailText}`;\n default:\n return `ℹ️ ${input.summaryText} — ${input.detailText}`;\n }\n}\n\nexport function formatServiceRuntimeHeadline(\n runtimeHeadline: ServiceRuntimeHeadline\n): string {\n switch (runtimeHeadline) {\n case \"running\":\n return \"🟢 Running\";\n case \"stale\":\n return \"🟠 Reconnecting\";\n case \"not running\":\n return \"🔴 Stopped\";\n default:\n return \"⚪ Unknown\";\n }\n}\n\nfunction toParticipationReadiness(\n state: ReturnType<typeof resolveServiceReadiness>[\"state\"]\n): ServiceParticipationReadiness {\n switch (state) {\n case \"ready\":\n case \"update_available\":\n return \"ready\";\n case \"not_installed\":\n return \"not_installed\";\n case \"not_running\":\n return \"not_running\";\n case \"refresh_needed\":\n case \"refresh_blocked\":\n case \"local_repair_needed\":\n return \"needs_repair\";\n default:\n return \"unknown\";\n }\n}\n","import { buildLocalServiceDiagnosticsPayload } from \"@openmeld/local-service\";\nimport type {\n CliJsonOutputEnvelope,\n CliVersionVerdict,\n DaemonStatusServerRequirement,\n ServiceVersionVerdict,\n} from \"@openmeld/schemas\";\nimport { listAgentTargetStates } from \"../agents/registry\";\nimport type { CliUpdateAssessment } from \"../command-entry-checks/cli-update-assessment\";\nimport {\n describeServerRequiredVersionUnavailableReason,\n type ServerRequiredVersionAssessment,\n} from \"../command-entry-checks/server-required-version-assessment\";\nimport {\n reconcileCliVersionView,\n reconcileServiceVersionView,\n} from \"../command-entry-checks/version-reconciliation\";\nimport type {\n DaemonServiceRuntimeStatus,\n getDaemonStatus,\n} from \"../config/daemon-state\";\nimport type { resolveOpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport {\n type OpenMeldLaneDescriptor,\n resolveOpenMeldLaneDescriptor,\n} from \"../config/openmeld-lane-descriptor\";\nimport { formatDaemonLifecycleOriginSummary } from \"../local-service/lifecycle/daemon-lifecycle-journal\";\nimport { DAEMON_SERVICE_REPAIR_ANOMALIES } from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport { buildDaemonServiceCleanupPlan } from \"../local-service/lifecycle/daemon-service-hygiene\";\nimport type { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type { DaemonServiceManagerRuntimeStatus } from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n buildDaemonOwnerSnapshotFromObservedState,\n formatDaemonOwnerSummaryLabel,\n} from \"../local-service/lifecycle/daemon-service-owner-snapshot\";\nimport {\n buildDaemonServiceRefreshNextStep,\n buildDaemonServiceStatusReadOnlyDetail,\n} from \"../local-service/lifecycle/daemon-service-repair-guidance\";\nimport { getEffectiveDaemonRuntimeStatus } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport {\n NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON,\n type syncDeviceRuntimeStateProjection,\n} from \"../local-service/reporting/device-runtime-state-sync\";\nimport type { readDaemonRuntimeContractRepairReport } from \"../local-service/state/runtime-contract-guard\";\nimport type { DaemonLocalStatusSnapshot } from \"../local-service/status/daemon-local-status-snapshot\";\nimport type { DaemonStatusAttention } from \"../local-service/status/daemon-status-attention\";\nimport type { DaemonStatusSnapshot } from \"../local-service/status/daemon-status-snapshot\";\nimport { buildProfileWorkspacePresentation } from \"../profile-workspace/presentation\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommand,\n formatOpenMeldCliTextBlock,\n} from \"../runtime/cli-entry-command\";\nimport type { RuntimeContext } from \"../runtime/context\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport type { DaemonRouteObservation } from \"../system/current-reply-readiness-snapshot\";\nimport { formatDaemonServiceMissingAction } from \"../system/local-service-install-attention\";\nimport type { DeviceReplyReadinessStatus } from \"../system/reply-readiness\";\nimport {\n formatServiceRuntimeHeadline,\n resolveServiceParticipationReadiness,\n type ServiceParticipationReadinessSummary,\n} from \"../system/service-participation-readiness\";\nimport { renderInfoCard } from \"../ui/info-card\";\nimport {\n formatDaemonDisplayRows,\n renderServiceActionCard,\n} from \"./service-output\";\n\nexport const STATUS_CLEANUP_SIGNIFICANT_ANOMALIES =\n DAEMON_SERVICE_REPAIR_ANOMALIES;\n\nexport const AGENT_READINESS_DETAIL_PATTERN =\n /\\b(agents?|profiles?|workspaces?|controllers?)\\b|reply route|reply from space|space replies/i;\n\n// Installed OpenMeld Service (daemon) version, read off the same\n// `daemonStatus` shape the human status card already renders\n// (\"🏷️ Version\" in `renderDaemonStatusCard`). Duck-typed on purpose so this\n// helper does not need its own import of the `DaemonStatus` type.\nfunction resolveInstalledServiceVersionForStatus(daemonStatus: {\n installed: boolean;\n state: { daemonVersion: string } | null;\n}): string | null {\n return daemonStatus.installed && daemonStatus.state\n ? daemonStatus.state.daemonVersion\n : null;\n}\n\n/**\n * Builds the additive `serverRequirement` block: the server-required version\n * visor (Core's compiled release manifest, read live via\n * `getCurrentLocalRuntimeReplyReadiness`) plus the one-line verdict\n * reconciling it against the release-channel view already carried in\n * `cliVersion`. This is new, nullable, and does not rename or remove any\n * existing `--json` field (`developing/clients/web.md` /\n * W-REL-DOCTOR: two channels, shown side by side, merged verdict when they\n * disagree).\n */\nexport function buildServerRequirementJsonPayload(input: {\n channel: CliUpdateAssessment;\n server: ServerRequiredVersionAssessment;\n installedServiceVersion: string | null;\n}): DaemonStatusServerRequirement {\n if (!input.server.available) {\n return {\n available: false,\n reason: input.server.reason,\n detail: input.server.detail,\n };\n }\n\n return {\n available: true,\n generatedAt: input.server.generatedAt,\n cli: input.server.cli,\n service: input.server.service,\n verdict: {\n cli: reconcileCliVersionView({\n channel: input.channel,\n server: input.server,\n }),\n service: reconcileServiceVersionView({\n installedVersion: input.installedServiceVersion,\n server: input.server,\n }),\n },\n };\n}\n\nexport function buildDaemonStatusJsonPayload(input: {\n cliVersion: {\n checked: boolean;\n currentVersion: string;\n latestVersion: string | null;\n requiredVersion: string | null;\n updateAvailable: boolean;\n };\n environmentTarget: Awaited<\n ReturnType<typeof resolveOpenMeldEnvironmentTarget>\n >;\n localSnapshot: DaemonLocalStatusSnapshot;\n serverRequirementChannelAssessment: CliUpdateAssessment;\n serverRequirementAssessment: ServerRequiredVersionAssessment;\n snapshot: DaemonStatusSnapshot;\n}): CliJsonOutputEnvelope {\n return {\n schemaVersion: 1,\n type: \"daemon.status\",\n runtimeFlavor: isBinaryDistribution() ? \"binary\" : \"node-bundle\",\n cliVersion: input.cliVersion,\n localResult: buildDaemonAgentLocalStatusPayload({\n environmentTarget: input.environmentTarget,\n snapshot: input.localSnapshot,\n }),\n result: buildDaemonAgentStatusPayload({\n environmentTarget: input.environmentTarget,\n snapshot: input.snapshot,\n }),\n runtimeProjection:\n input.snapshot.currentReplyReadiness.runtimeProjection ?? null,\n serverRequirement: buildServerRequirementJsonPayload({\n channel: input.serverRequirementChannelAssessment,\n installedServiceVersion: resolveInstalledServiceVersionForStatus(\n input.snapshot.currentReplyReadiness.daemonStatus\n ),\n server: input.serverRequirementAssessment,\n }),\n };\n}\n\n/**\n * Human-readable dual-channel version card for `openmeld service status`:\n * the release-channel view (unchanged) shown next to the server-required\n * view (new), plus the one-line merged verdict for each component. Rendered\n * as its own card, appended after the main status card, so it never disturbs\n * existing row-order assertions on the primary status card.\n */\nexport function renderVersionReconciliationCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n channel: CliUpdateAssessment;\n server: ServerRequiredVersionAssessment;\n installedServiceVersion: string | null;\n}): void {\n const cliVerdict = reconcileCliVersionView({\n channel: input.channel,\n server: input.server,\n });\n const serviceVerdict = reconcileServiceVersionView({\n installedVersion: input.installedServiceVersion,\n server: input.server,\n });\n\n const rows = [\n { label: \"🖥️ CLI Current\", value: input.channel.currentVersion },\n {\n label: \"📡 CLI Channel Latest\",\n value: input.channel.checked\n ? (input.channel.latestVersion ?? \"unavailable\")\n : \"not checked in this environment\",\n },\n ...(input.channel.requiredFloor\n ? [{ label: \"🚧 CLI Channel Floor\", value: input.channel.requiredFloor }]\n : []),\n {\n label: \"🛰️ CLI Server Required\",\n value: formatServerCliVisorCell(input.server),\n },\n { label: \"🧭 CLI Verdict\", value: formatVersionVerdictCell(cliVerdict) },\n { label: \"\", value: \"\" },\n {\n label: \"🧩 Service Installed\",\n value: input.installedServiceVersion ?? \"unknown\",\n },\n {\n label: \"🛰️ Service Server Required\",\n value: formatServerServiceVisorCell(input.server),\n },\n {\n label: \"🧭 Service Verdict\",\n value: formatVersionVerdictCell(serviceVerdict),\n },\n ];\n\n renderInfoCard({\n presenter: input.presenter,\n title: \"🏷️ OpenMeld Version Check\",\n codePrefix: \"daemon.status.version_check\",\n sanitize: true,\n rows: formatDaemonDisplayRows(rows),\n });\n}\n\nfunction formatServerCliVisorCell(\n server: ServerRequiredVersionAssessment\n): string {\n if (!server.available) {\n return `unavailable (${describeServerRequiredVersionUnavailableReason(server)})`;\n }\n return `${server.cli.latestPackageVersion ?? \"unknown\"} (status: ${server.cli.status})`;\n}\n\nfunction formatServerServiceVisorCell(\n server: ServerRequiredVersionAssessment\n): string {\n if (!server.available) {\n return `unavailable (${describeServerRequiredVersionUnavailableReason(server)})`;\n }\n const version =\n server.service.requiredVersion ?? server.service.latestVersion ?? \"unknown\";\n return `${version} (status: ${server.service.status})`;\n}\n\nfunction formatVersionVerdictCell(\n verdict: CliVersionVerdict | ServiceVersionVerdict\n): string {\n return `${resolveVersionVerdictIcon(verdict.kind)} ${verdict.message}`;\n}\n\nfunction resolveVersionVerdictIcon(\n kind: CliVersionVerdict[\"kind\"] | ServiceVersionVerdict[\"kind\"]\n): string {\n if (kind === \"aligned\") {\n return \"✅\";\n }\n if (\n kind === \"channel_behind\" ||\n kind === \"channel_ahead\" ||\n kind === \"update_required\"\n ) {\n return \"⚠️\";\n }\n return \"ℹ️\";\n}\n\nexport function buildDaemonAgentStatusPayload(input: {\n environmentTarget: Awaited<\n ReturnType<typeof resolveOpenMeldEnvironmentTarget>\n >;\n snapshot: DaemonStatusSnapshot;\n}) {\n const { environmentTarget, snapshot } = input;\n const currentProfileWorkspace = buildProfileWorkspacePresentation(\n snapshot.currentReplyReadiness.profileWorkspaceRuntimeResolution\n );\n return {\n ...snapshot.currentReplyReadiness.daemonStatus,\n environmentTarget,\n ...(snapshot.currentReplyReadiness.runtimeStatus\n ? { runtime: snapshot.currentReplyReadiness.runtimeStatus }\n : {}),\n ...(snapshot.runtimeContractRepairReport\n ? { runtimeContractRepair: snapshot.runtimeContractRepairReport }\n : {}),\n ...(snapshot.currentReplyReadiness.inventory\n ? {\n inventory: {\n anomalies: snapshot.currentReplyReadiness.inventory.anomalies,\n ...(snapshot.currentReplyReadiness.inventory\n .runtimeContractCompatibility\n ? {\n runtimeContractCompatibility:\n snapshot.currentReplyReadiness.inventory\n .runtimeContractCompatibility,\n }\n : {}),\n cleanupPlan: buildDaemonServiceCleanupPlan({\n intent: \"status_cleanup\",\n inventory: snapshot.currentReplyReadiness.inventory,\n }),\n },\n }\n : {}),\n daemonRouteObservation:\n snapshot.currentReplyReadiness.daemonRouteObservation,\n diagnostics: buildDaemonLocalReplyReadinessEvidenceDiagnostics({\n deviceReplyReadiness: snapshot.currentReplyReadiness.deviceReplyReadiness,\n legacyAgentReplyReadiness:\n snapshot.currentReplyReadiness.agentReplyReadiness,\n }),\n currentProfileWorkspace,\n ...(snapshot.attention ? { attention: snapshot.attention } : {}),\n ...(snapshot.latestConnectionStateEvent\n ? { latestConnectionStateEvent: snapshot.latestConnectionStateEvent }\n : {}),\n ...(snapshot.latestLifecycleEvent\n ? { latestLifecycleEvent: snapshot.latestLifecycleEvent }\n : {}),\n };\n}\n\nexport function emitDaemonAgentStatus(input: {\n environmentTarget: Awaited<\n ReturnType<typeof resolveOpenMeldEnvironmentTarget>\n >;\n presenter: ReturnType<typeof createPresenter>;\n snapshot: DaemonStatusSnapshot;\n}): void {\n const { environmentTarget, presenter, snapshot } = input;\n presenter.data({\n code: \"daemon.status.result\",\n payload: buildDaemonAgentStatusPayload({\n environmentTarget,\n snapshot,\n }),\n });\n if (!snapshot.currentReplyReadiness.runtimeProjection) {\n return;\n }\n presenter.data({\n code: \"daemon.runtime_projection.result\",\n payload: snapshot.currentReplyReadiness.runtimeProjection,\n });\n}\n\nexport function buildDaemonLocalReplyReadinessEvidenceDiagnostics(input: {\n deviceReplyReadiness: unknown;\n legacyAgentReplyReadiness: unknown;\n}) {\n return buildLocalServiceDiagnosticsPayload({\n deviceEvidence: input.deviceReplyReadiness,\n agentEvidence: input.legacyAgentReplyReadiness,\n });\n}\n\nexport function buildDaemonAgentLocalStatusPayload(input: {\n environmentTarget: Awaited<\n ReturnType<typeof resolveOpenMeldEnvironmentTarget>\n >;\n snapshot: DaemonLocalStatusSnapshot;\n}) {\n const { environmentTarget, snapshot } = input;\n return {\n ...snapshot.daemonStatus,\n environmentTarget,\n statusScope: \"local_service\",\n ...(snapshot.runtimeStatus ? { runtime: snapshot.runtimeStatus } : {}),\n ...(snapshot.serviceManagerStatus\n ? { serviceManagerStatus: snapshot.serviceManagerStatus }\n : {}),\n ...(snapshot.runtimeContractRepairReport\n ? { runtimeContractRepair: snapshot.runtimeContractRepairReport }\n : {}),\n ...(snapshot.inventory\n ? {\n inventory: {\n anomalies: snapshot.inventory.anomalies,\n ...(snapshot.inventory.runtimeContractCompatibility\n ? {\n runtimeContractCompatibility:\n snapshot.inventory.runtimeContractCompatibility,\n }\n : {}),\n cleanupPlan: buildDaemonServiceCleanupPlan({\n intent: \"status_cleanup\",\n inventory: snapshot.inventory,\n }),\n },\n }\n : {}),\n ...(snapshot.attention ? { attention: snapshot.attention } : {}),\n ...(snapshot.latestConnectionStateEvent\n ? { latestConnectionStateEvent: snapshot.latestConnectionStateEvent }\n : {}),\n ...(snapshot.latestLifecycleEvent\n ? { latestLifecycleEvent: snapshot.latestLifecycleEvent }\n : {}),\n };\n}\n\nexport function emitDaemonAgentLocalStatus(input: {\n environmentTarget: Awaited<\n ReturnType<typeof resolveOpenMeldEnvironmentTarget>\n >;\n presenter: ReturnType<typeof createPresenter>;\n snapshot: DaemonLocalStatusSnapshot;\n}): void {\n const { environmentTarget, presenter, snapshot } = input;\n presenter.data({\n code: \"daemon.status.local_result\",\n payload: buildDaemonAgentLocalStatusPayload({\n environmentTarget,\n snapshot,\n }),\n });\n}\n\nexport async function emitDaemonStatusForView(input: {\n presenter: ReturnType<typeof createPresenter>;\n snapshot: DaemonStatusSnapshot;\n view: RuntimeContext[\"resolvedView\"];\n}): Promise<void> {\n if (!input.snapshot.currentReplyReadiness.daemonStatus.installed) {\n emitDaemonNotInstalledStatus({\n attention: input.snapshot.attention,\n daemonRouteObservation:\n input.snapshot.currentReplyReadiness.daemonRouteObservation,\n presenter: input.presenter,\n view: input.view,\n });\n return;\n }\n\n if (input.view === \"human\") {\n renderDaemonStatusCard({\n attention: input.snapshot.attention,\n daemonRouteObservation:\n input.snapshot.currentReplyReadiness.daemonRouteObservation,\n deviceReplyReadiness:\n input.snapshot.currentReplyReadiness.deviceReplyReadiness,\n inventory: input.snapshot.currentReplyReadiness.inventory,\n presenter: input.presenter,\n status: input.snapshot.currentReplyReadiness.daemonStatus,\n runtimeState:\n input.snapshot.currentReplyReadiness.displayRuntimeStatus ??\n input.snapshot.currentReplyReadiness.runtimeStatus,\n serviceManagerStatus:\n input.snapshot.currentReplyReadiness.serviceManagerStatus,\n latestLifecycleEvent: input.snapshot.latestLifecycleEvent,\n runtimeContractRepairReport: input.snapshot.runtimeContractRepairReport,\n });\n if (input.snapshot.currentReplyReadiness.inventory) {\n renderDaemonStatusCleanupRecommendation({\n attention: input.snapshot.attention,\n presenter: input.presenter,\n inventory: input.snapshot.currentReplyReadiness.inventory,\n });\n }\n return;\n }\n\n await emitDaemonInstalledTextStatus({\n presenter: input.presenter,\n runtimeProjection: input.snapshot.currentReplyReadiness.runtimeProjection,\n runtimeState: input.snapshot.currentReplyReadiness.runtimeStatus,\n status: input.snapshot.currentReplyReadiness.daemonStatus,\n });\n}\n\nexport function emitDaemonNotInstalledStatus(input: {\n attention: DaemonStatusAttention | null;\n daemonRouteObservation: DaemonRouteObservation;\n presenter: ReturnType<typeof createPresenter>;\n view: RuntimeContext[\"resolvedView\"];\n}): void {\n if (input.view === \"human\") {\n renderDaemonNotInstalledCard({\n attention: input.attention,\n daemonRouteObservation: input.daemonRouteObservation,\n presenter: input.presenter,\n });\n return;\n }\n\n input.presenter.line({\n code: \"daemon.status.not_installed\",\n text: \"OpenMeld Service is not installed.\",\n });\n}\n\nexport async function emitDaemonInstalledTextStatus(input: {\n presenter: ReturnType<typeof createPresenter>;\n runtimeProjection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null;\n runtimeState: DaemonServiceRuntimeStatus | null;\n status: Awaited<ReturnType<typeof getDaemonStatus>>;\n}): Promise<void> {\n const daemonVersion = input.status.state?.daemonVersion ?? \"unknown\";\n input.presenter.line({\n code: \"daemon.status.installed\",\n text: `OpenMeld Service is installed (version ${daemonVersion}).`,\n });\n input.presenter.line({\n code: \"daemon.status.runtime\",\n text: describeDaemonRuntimeStatus(input.runtimeState),\n });\n await emitRuntimeProjectionLine({\n presenter: input.presenter,\n runtimeProjection: input.runtimeProjection,\n });\n}\n\nexport function formatDaemonStatusNotInstalledHint(): string {\n return formatDaemonServiceMissingAction();\n}\n\nexport function renderDaemonNotInstalledCard(input: {\n attention: DaemonStatusAttention | null;\n daemonRouteObservation: DaemonRouteObservation;\n presenter: ReturnType<typeof createPresenter>;\n}): void {\n const rows = formatDaemonDisplayRows([\n {\n label: \"🧩 OpenMeld Service\",\n value:\n \"⛔ Not installed — install OpenMeld Service so this computer can receive local Wake work\",\n },\n {\n label: \"⚙️ Runtime\",\n value: \"⚪ Unknown\",\n },\n {\n label: \"🌐 OpenMeld Connection\",\n value: formatDaemonStatusConnectionLabel(input.daemonRouteObservation),\n },\n ...buildDaemonLaneScopeRows(),\n {\n label: \"ℹ️ Status\",\n value: buildDaemonServiceStatusReadOnlyDetail(),\n },\n ...(input.attention\n ? [\n { label: \"\", value: \"\" },\n {\n label:\n input.attention.level === \"warning\"\n ? \"⚠️ Attention\"\n : \"ℹ️ Attention\",\n value: input.attention.message,\n },\n ...(input.attention.nextStep\n ? [{ label: \"🔧 Next\", value: input.attention.nextStep }]\n : []),\n {\n label: \"🚀 After That\",\n value: formatDaemonStatusNotInstalledHint(),\n },\n ]\n : [{ label: \"🔧 Next\", value: formatDaemonStatusNotInstalledHint() }]),\n ]);\n\n renderInfoCard({\n presenter: input.presenter,\n title: \"🧩 OpenMeld Service\",\n codePrefix: \"daemon.status.card\",\n sanitize: true,\n rows,\n });\n}\n\nexport function renderDaemonStatusCard(input: {\n attention: DaemonStatusAttention | null;\n daemonRouteObservation: DaemonRouteObservation;\n deviceReplyReadiness: DeviceReplyReadinessStatus;\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>> | null;\n presenter: ReturnType<typeof createPresenter>;\n status: {\n installed: true;\n state: {\n daemonVersion: string;\n };\n };\n latestLifecycleEvent: DaemonStatusSnapshot[\"latestLifecycleEvent\"];\n runtimeState: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n runtimeContractRepairReport: Awaited<\n ReturnType<typeof readDaemonRuntimeContractRepairReport>\n > | null;\n}): void {\n const effectiveRuntimeState = input.runtimeState\n ? {\n ...input.runtimeState,\n status: resolveDaemonStatusEffectiveRuntimeStatus({\n inventory: input.inventory,\n runtimeState: input.runtimeState,\n serviceManagerStatus: input.serviceManagerStatus,\n }),\n }\n : null;\n const serviceParticipationReadiness = resolveServiceParticipationReadiness({\n deviceReplyReadiness: input.deviceReplyReadiness,\n inventory: input.inventory,\n runtimeStatus: effectiveRuntimeState,\n });\n const statusSummaryRows = buildDaemonStatusSummaryRows({\n daemonRouteObservation: input.daemonRouteObservation,\n serviceParticipationReadiness,\n inventory: input.inventory,\n runtimeState: effectiveRuntimeState ?? input.runtimeState,\n });\n const nextStep =\n input.attention?.nextStep ??\n resolveDaemonStatusNextStep({\n serviceParticipationReadiness,\n });\n const rows: Array<{ label: string; value: string }> = [\n ...statusSummaryRows,\n {\n label: \"ℹ️ Status\",\n value: buildDaemonServiceStatusReadOnlyDetail(),\n },\n ...buildDaemonStatusAttentionRows({\n attention: input.attention,\n latestLifecycleEvent: input.latestLifecycleEvent,\n nextStep,\n }),\n { label: \"\", value: \"\" },\n { label: \"📦 Installed\", value: \"yes\" },\n { label: \"🏷️ Version\", value: input.status.state.daemonVersion },\n ...buildRuntimeDetailRows({\n runtimeState: input.runtimeState,\n serviceManagerStatus: input.serviceManagerStatus,\n }),\n ...buildRuntimeContractRepairRows(input.runtimeContractRepairReport),\n ];\n\n renderInfoCard({\n presenter: input.presenter,\n title: \"🧩 OpenMeld Service Status\",\n codePrefix: \"daemon.status.card\",\n sanitize: true,\n rows: formatDaemonDisplayRows(rows),\n });\n}\n\nexport function buildDaemonStatusAttentionRows(input: {\n attention: DaemonStatusAttention | null;\n latestLifecycleEvent: DaemonStatusSnapshot[\"latestLifecycleEvent\"];\n nextStep: string | null;\n}): Array<{ label: string; value: string }> {\n const lifecycleRow = input.latestLifecycleEvent\n ? [\n {\n label: \"🧾 Last Service Change\",\n value: formatDaemonLifecycleOriginSummary(input.latestLifecycleEvent),\n },\n ]\n : [];\n if (input.attention) {\n return [\n { label: \"\", value: \"\" },\n {\n label:\n input.attention.level === \"warning\" ? \"⚠️ Attention\" : \"ℹ️ Attention\",\n value: input.attention.message,\n },\n ...(input.nextStep ? [{ label: \"🔧 Next\", value: input.nextStep }] : []),\n ...lifecycleRow,\n ];\n }\n\n if (!input.nextStep) {\n return lifecycleRow.length > 0\n ? [{ label: \"\", value: \"\" }, ...lifecycleRow]\n : [];\n }\n\n return [\n { label: \"\", value: \"\" },\n { label: \"🔧 Next\", value: input.nextStep },\n ...lifecycleRow,\n ];\n}\n\nexport function resolveDaemonStatusNextStep(input: {\n serviceParticipationReadiness: ServiceParticipationReadinessSummary;\n}): string | null {\n if (input.serviceParticipationReadiness.serviceReadiness === \"not_running\") {\n return `Run \\`${formatOpenMeldCliCommand(\n \"openmeld service start\"\n )}\\` to start OpenMeld Service.`;\n }\n\n if (\n input.serviceParticipationReadiness.serviceReadiness === \"not_installed\"\n ) {\n return `Run \\`${formatOpenMeldCliCommand(\n \"openmeld service install\"\n )}\\`, then \\`${formatOpenMeldCliCommand(\n \"openmeld service start\"\n )}\\` before using OpenMeld Service on this computer.`;\n }\n\n return input.serviceParticipationReadiness.nextStepSummary;\n}\n\nexport function renderDaemonStatusCleanupRecommendation(input: {\n attention: DaemonStatusAttention | null;\n presenter: ReturnType<typeof createPresenter>;\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>;\n}): void {\n if (input.attention?.code !== \"service_repair_recommended\") {\n return;\n }\n const cleanupPlan = buildDaemonServiceCleanupPlan({\n intent: \"status_cleanup\",\n inventory: input.inventory,\n });\n if (cleanupPlan.actions.length === 0) {\n return;\n }\n const significantAnomalies = input.inventory.anomalies.filter((anomaly) =>\n STATUS_CLEANUP_SIGNIFICANT_ANOMALIES.has(anomaly.code)\n );\n if (significantAnomalies.length === 0) {\n return;\n }\n\n renderInfoCard({\n presenter: input.presenter,\n title: \"🧹 OpenMeld Service Repair Recommended\",\n codePrefix: \"daemon.status.cleanup_recommended\",\n rows: formatDaemonDisplayRows([\n {\n label: \"📝 Found\",\n value: input.attention.message,\n },\n {\n label: \"💡 What OpenMeld can do\",\n value:\n \"OpenMeld will repair OpenMeld Service so this computer can connect for local Wake work reliably.\",\n },\n {\n label: \"🔧 Next\",\n value: input.attention.nextStep ?? buildDaemonServiceRefreshNextStep(),\n },\n ]),\n });\n}\n\nexport function buildDaemonStatusSummaryRows(input: {\n daemonRouteObservation: DaemonRouteObservation;\n serviceParticipationReadiness: ServiceParticipationReadinessSummary;\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>> | null;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): Array<{ label: string; value: string }> {\n return [\n {\n label: \"🧩 OpenMeld Service\",\n value: formatDaemonStatusServiceReadinessLabel(\n input.serviceParticipationReadiness\n ),\n },\n {\n label: \"⚙️ Runtime\",\n value: formatServiceRuntimeHeadline(\n input.serviceParticipationReadiness.runtimeHeadline\n ),\n },\n {\n label: \"🌐 OpenMeld Connection\",\n value: formatDaemonStatusConnectionLabel(input.daemonRouteObservation, {\n runtimeState: input.runtimeState,\n serviceParticipationReadiness: input.serviceParticipationReadiness,\n }),\n },\n ...buildDaemonLaneScopeRows(),\n ...buildDaemonOwnerSummaryRows({\n inventory: input.inventory,\n runtimeState: input.runtimeState,\n }),\n ];\n}\n\nexport function buildDaemonLaneScopeRows(\n lane: Pick<\n OpenMeldLaneDescriptor,\n \"command\" | \"preset\" | \"openMeldHome\"\n > = resolveOpenMeldLaneDescriptor()\n): Array<{ label: string; value: string }> {\n return [\n {\n label: \"🛤️ Current Lane\",\n value: formatDaemonLaneLabel(lane),\n },\n {\n label: \"📁 Local Data\",\n value: lane.openMeldHome,\n },\n ];\n}\n\nfunction formatDaemonLaneLabel(\n lane: Pick<OpenMeldLaneDescriptor, \"command\" | \"preset\">\n): string {\n switch (lane.preset) {\n case \"dev-local\":\n return `${lane.command} — repo-local development`;\n case \"canary\":\n return `${lane.command} — packaged candidate`;\n default:\n return `${lane.command} — published production`;\n }\n}\n\nexport function formatDaemonStatusServiceReadinessLabel(\n input: ServiceParticipationReadinessSummary\n): string {\n const detail = resolveDaemonStatusServiceDetail(input);\n switch (input.serviceReadiness) {\n case \"ready\":\n return `✅ ${input.summaryText} — ${detail}`;\n case \"needs_repair\":\n return `⚠️ ${input.summaryText} — ${detail}`;\n case \"not_running\":\n case \"not_installed\":\n return `⛔ ${input.summaryText} — ${detail}`;\n default:\n return `ℹ️ ${input.summaryText} — ${detail}`;\n }\n}\n\nexport function resolveDaemonStatusServiceDetail(\n input: ServiceParticipationReadinessSummary\n): string {\n const detail = input.detailText.trim();\n if (detail && !isAgentReadinessDetail(detail)) {\n return detail;\n }\n\n switch (input.serviceReadiness) {\n case \"ready\":\n return \"OpenMeld Service is running on this device.\";\n case \"needs_repair\":\n return \"OpenMeld Service needs attention on this device.\";\n case \"not_installed\":\n return \"OpenMeld Service is not installed on this device.\";\n case \"not_running\":\n return \"OpenMeld Service is installed but not running on this device.\";\n default:\n return \"OpenMeld Service status is checking on this device.\";\n }\n}\n\nexport function isAgentReadinessDetail(detail: string): boolean {\n return AGENT_READINESS_DETAIL_PATTERN.test(detail);\n}\n\nexport function formatDaemonStatusConnectionLabel(\n observation: DaemonRouteObservation,\n input: {\n runtimeState?: DaemonServiceRuntimeStatus | null;\n serviceParticipationReadiness?: ServiceParticipationReadinessSummary | null;\n } = {}\n): string {\n if (\n input.serviceParticipationReadiness?.serviceReadiness === \"needs_repair\"\n ) {\n if (observation.status === \"online\") {\n return \"🟡 Route online; local participation needs repair\";\n }\n if (observation.status === \"offline\") {\n return \"🔴 Route offline; local participation needs repair\";\n }\n return \"🟡 Route not checked; local participation needs repair\";\n }\n if (\n input.serviceParticipationReadiness?.serviceReadiness === \"not_running\" ||\n input.serviceParticipationReadiness?.serviceReadiness === \"not_installed\"\n ) {\n return \"🔴 Offline\";\n }\n if (observation.status === \"online\") {\n return \"🟢 Connected\";\n }\n if (observation.status === \"offline\") {\n return \"🔴 Offline\";\n }\n if (isServiceLevelConnectionObservation(observation)) {\n if (input.serviceParticipationReadiness?.serviceReadiness === \"ready\") {\n return \"🟢 Connected\";\n }\n if (input.runtimeState?.status === \"running\") {\n return \"🟢 Connected\";\n }\n }\n return \"⚪ Checking\";\n}\n\nexport function isServiceLevelConnectionObservation(\n observation: DaemonRouteObservation\n): boolean {\n return (\n observation.status === \"unavailable\" &&\n (observation.reasonCode === \"not_requested\" ||\n observation.reasonCode === \"profile_not_agent\" ||\n observation.reasonCode === \"profile_not_selected\")\n );\n}\n\nexport function buildDaemonOwnerSummaryRows(input: {\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>> | null;\n runtimeState: DaemonServiceRuntimeStatus | null;\n}): Array<{ label: string; value: string }> {\n if (!input.inventory) {\n return [];\n }\n\n const effectiveRuntimeStatus =\n input.runtimeState?.status ?? input.inventory.runtimeStatus.status;\n const ownerSnapshot = buildDaemonOwnerSnapshotFromObservedState({\n runtimeStatus: input.inventory.runtimeStatus,\n serviceManager: input.inventory.serviceManager,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n effectiveRuntimeStatus,\n ownedProcesses: input.inventory.ownedProcesses,\n });\n\n return [\n {\n label: \"🧭 Owner Path\",\n value: formatDaemonOwnerSummaryLabel(ownerSnapshot),\n },\n ];\n}\n\nexport function resolveDaemonStatusEffectiveRuntimeStatus(input: {\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>> | null;\n runtimeState: DaemonServiceRuntimeStatus;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): DaemonServiceRuntimeStatus[\"status\"] {\n if (\n input.inventory?.anomalies.some(\n (anomaly) => anomaly.code === \"manager_running_without_runtime\"\n )\n ) {\n return input.runtimeState.status;\n }\n return getEffectiveDaemonRuntimeStatus({\n runtimeState: input.runtimeState,\n serviceManagerStatus: input.serviceManagerStatus,\n });\n}\n\nexport function buildRuntimeContractRepairRows(\n runtimeContractRepairReport: Awaited<\n ReturnType<typeof readDaemonRuntimeContractRepairReport>\n > | null\n): Array<{ label: string; value: string }> {\n if (!runtimeContractRepairReport) {\n return [];\n }\n\n if (runtimeContractRepairReport.status === \"applied\") {\n return [\n {\n label: \"🩹 Automatic Repair\",\n value: `✅ OpenMeld fixed a local service issue automatically at ${runtimeContractRepairReport.appliedAt}. No action needed.`,\n },\n ];\n }\n\n return [\n {\n label: \"🩹 Automatic Repair\",\n value: formatInlineOpenMeldCliCommands(\n `⚠️ OpenMeld could not finish repairing a local service issue at ${runtimeContractRepairReport.appliedAt}. Run \\`openmeld service repair\\`.`\n ),\n },\n ];\n}\n\nexport function buildRuntimeDetailRows(input: {\n runtimeState: DaemonServiceRuntimeStatus | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): Array<{ label: string; value: string }> {\n if (input.runtimeState === null) {\n return [{ label: \"⚙️ Runtime Details\", value: \"status unavailable\" }];\n }\n\n const runtimeState = input.runtimeState;\n const effectiveStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState,\n serviceManagerStatus: input.serviceManagerStatus,\n });\n return filterRuntimeSummaryRows([\n ...buildCoreRuntimeStateRows({\n runtimeState,\n effectiveStatus,\n serviceManagerStatus: input.serviceManagerStatus,\n }),\n ]);\n}\n\n// Plain-language run-mode label so status honestly tells the user a foreground\n// service stops when the terminal closes, versus a persistent background one.\nexport function formatDaemonRunModeLabel(\n mode: DaemonServiceRuntimeStatus[\"mode\"]\n): string {\n if (mode === \"foreground\") {\n return \"foreground — stops when the terminal closes\";\n }\n if (mode === \"background\") {\n return \"background service\";\n }\n return \"unknown\";\n}\n\nexport function buildCoreRuntimeStateRows(input: {\n runtimeState: DaemonServiceRuntimeStatus;\n effectiveStatus: DaemonServiceRuntimeStatus[\"status\"];\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n}): Array<{ label: string; value: string }> {\n const rows: Array<{ label: string; value: string }> = [\n { label: \"⚙️ Runtime\", value: normalizeRuntimeState(input.effectiveStatus) },\n ];\n if (input.runtimeState.status === \"running\") {\n rows.push(\n {\n label: \"🎚️ Mode\",\n value: formatDaemonRunModeLabel(input.runtimeState.mode),\n },\n {\n label: \"🧬 PID\",\n value:\n input.runtimeState.pid === null\n ? \"not available\"\n : String(input.runtimeState.pid),\n },\n { label: \"🚀 Started\", value: input.runtimeState.startedAt ?? \"unknown\" },\n { label: \"🕒 Updated\", value: input.runtimeState.updatedAt ?? \"unknown\" }\n );\n return rows;\n }\n\n if (input.effectiveStatus === \"running\") {\n rows.push(\n {\n label: \"🎚️ Mode\",\n value: formatDaemonRunModeLabel(input.runtimeState.mode),\n },\n {\n label: \"🧬 PID\",\n value:\n input.runtimeState.pid === null\n ? \"being managed by OS service manager\"\n : String(input.runtimeState.pid),\n }\n );\n return rows;\n }\n\n if (input.runtimeState.status === \"not_running\") {\n rows.push({ label: \"💤 Runtime\", value: \"not running\" });\n }\n\n return rows;\n}\n\nexport function filterRuntimeSummaryRows(\n rows: Array<{ label: string; value: string }>\n): Array<{ label: string; value: string }> {\n const filteredRows = rows.filter(\n (row) => row.label !== \"⚙️ Runtime\" && row.label !== \"💤 Runtime\"\n );\n return filteredRows;\n}\n\nexport function normalizeRuntimeState(\n status: DaemonServiceRuntimeStatus[\"status\"]\n): string {\n if (status === \"running\") {\n return \"🟢 running\";\n }\n if (status === \"stale\") {\n return \"🟠 stale\";\n }\n if (status === \"not_running\") {\n return \"🔴 not running\";\n }\n return \"⚪ unknown\";\n}\n\nexport function formatDaemonSignInRequiredInstruction(): string {\n return `Run \\`${formatOpenMeldCliCommand(\"openmeld login\")}\\` first.`;\n}\n\nexport function formatDaemonInstallNextStep(\n runtimeProjection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null\n): string {\n if (requiresDaemonSignIn(runtimeProjection)) {\n return `Run \\`${formatOpenMeldCliCommand(\"openmeld login\")}\\` first, then \\`${formatOpenMeldCliCommand(\"openmeld service start\")}\\` to start OpenMeld Service in the background.`;\n }\n return formatInlineOpenMeldCliCommands(\n \"Run `openmeld service start` now to keep OpenMeld Service running in the background.\"\n );\n}\n\nexport function requiresDaemonSignIn(\n runtimeProjection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null\n): boolean {\n if (runtimeProjection?.status !== \"skipped\") {\n return false;\n }\n return isLocalControllerSignInRequiredReason(\n mapLocalControllerStatusReason(runtimeProjection.reason)\n );\n}\n\nexport function isLocalControllerSignInRequiredReason(reason: string): boolean {\n return reason === \"sign in required\";\n}\n\nexport async function emitRuntimeProjectionLine(input: {\n presenter: ReturnType<typeof createPresenter>;\n runtimeProjection: Awaited<\n ReturnType<typeof syncDeviceRuntimeStateProjection>\n > | null;\n}): Promise<void> {\n if (!input.runtimeProjection) {\n return;\n }\n const projection = input.runtimeProjection;\n if (projection.status === \"ok\") {\n if (input.presenter.view === \"human\") {\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: \"daemon.runtime_projection.ok\",\n title: \"Local Service Link Connected\",\n rows: [\n {\n label: \"🧩 Status\",\n value: \"connected\",\n },\n {\n label: \"💡 Note\",\n value:\n \"This means OpenMeld finished the local service setup. Agent Profile Wake availability is checked separately.\",\n },\n ],\n });\n return;\n }\n input.presenter.line({\n code: \"daemon.runtime_projection.ok\",\n text: \"Local service setup is connected. Agent Profile Wake availability is checked separately.\",\n });\n return;\n }\n if (projection.status === \"degraded\") {\n const repairSuggestion =\n projection.missingControllerIds.length > 0 ||\n (projection.repairRequiredControllerIds?.length ?? 0) > 0\n ? \"`openmeld doctor --repair`\"\n : \"\";\n const enableSuggestion = await resolveLocalEnableSuggestion({\n projectedControllerIds: projection.projectedControllerIds,\n disabledControllerIds: projection.disabledControllerIds,\n });\n const suggestionParts = [repairSuggestion]\n .concat(enableSuggestion ? [`\\`${enableSuggestion}\\``] : [])\n .filter((part) => part.length > 0);\n input.presenter.line({\n code: \"daemon.runtime_projection.degraded\",\n text: formatOpenMeldCliTextBlock(\n `Local agents on this device need a fix: ${mapLocalControllerStatusReason(\n projection.reason\n )}.${suggestionParts.length > 0 ? ` Run ${suggestionParts.join(\" then \")}.` : \"\"}`\n ),\n });\n return;\n }\n if (\n isLocalControllerSignInRequiredReason(\n mapLocalControllerStatusReason(projection.reason)\n )\n ) {\n input.presenter.line({\n code: \"daemon.runtime_projection.skipped\",\n text: formatOpenMeldCliTextBlock(\n `Local agent setup is waiting for you to sign in. ${formatDaemonSignInRequiredInstruction()}`\n ),\n });\n return;\n }\n input.presenter.line({\n code: \"daemon.runtime_projection.skipped\",\n text: formatOpenMeldCliTextBlock(\n `Local agent setup was not checked: ${mapLocalControllerStatusReason(\n projection.reason\n )}.`\n ),\n });\n}\n\nexport async function resolveLocalEnableSuggestion(input: {\n projectedControllerIds: string[];\n disabledControllerIds: string[];\n}): Promise<string | null> {\n const states = await listAgentTargetStates().catch(() => []);\n const selectableBuiltinIds = new Set(\n states\n .filter(\n (state) =>\n state.targetKind === \"builtin\" &&\n state.lifecycleStatus !== \"suspended\" &&\n state.selectable\n )\n .map((state) => state.agentId)\n );\n if (selectableBuiltinIds.size === 0) {\n return null;\n }\n const preferredIds = [\n ...new Set([\n ...input.disabledControllerIds,\n ...input.projectedControllerIds,\n ]),\n ].filter((controllerId) => selectableBuiltinIds.has(controllerId));\n const selectedIds =\n preferredIds.length > 0\n ? preferredIds.slice(0, 3)\n : [...selectableBuiltinIds]\n .sort((left, right) => left.localeCompare(right))\n .slice(0, 3);\n if (selectedIds.length === 0) {\n return null;\n }\n return `openmeld agents enable --agent ${selectedIds.join(\" \")}`;\n}\n\nexport function mapLocalControllerStatusReason(reason: string): string {\n const missingOrDisabledReason =\n \"is missing or disabled for one or more bound controllers\";\n const projectedControllersDisabledReason =\n \"one or more projected controllers are disabled locally\";\n\n if (reason.includes(\"already exists\")) {\n return \"setup is already prepared\";\n }\n if (reason.includes(\"authentication is not valid\")) {\n return \"sign in required\";\n }\n if (reason.includes(NO_LOCAL_AGENTS_NEED_OPENMELD_SERVICE_REASON)) {\n return \"no local agent is configured for this device\";\n }\n if (reason.includes(missingOrDisabledReason)) {\n return \"some local agents are missing or turned off\";\n }\n if (reason.includes(\"is missing for one or more bound controllers\")) {\n return \"some local agents are missing\";\n }\n if (reason.includes(projectedControllersDisabledReason)) {\n return \"some local agent entries are disabled\";\n }\n if (reason.includes(\"is healthy\")) {\n return \"status is healthy\";\n }\n return reason;\n}\n\nexport function describeDaemonRuntimeStatus(\n status: DaemonServiceRuntimeStatus | null\n): string {\n if (!status) {\n return \"No runtime status available.\";\n }\n if (status.status === \"running\") {\n return `Service is running (${formatDaemonRunModeLabel(\n status.mode\n )}, pid=${String(status.pid)}, started=${status.startedAt || \"unknown\"}).`;\n }\n if (status.status === \"stale\") {\n return `Service status is stale (${formatDaemonRunModeLabel(\n status.mode\n )}, pid=${String(status.pid)}, reason=${status.reason || \"unknown\"}).`;\n }\n if (status.status === \"not_running\") {\n return \"Service is not running.\";\n }\n return \"Service runtime status is unknown.\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport { OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION } from \"@openmeld/schemas\";\nimport { validateDaemonControlTargetInput } from \"../command-contracts/service-control-target\";\nimport type { DaemonServiceRuntimeStatus } from \"../config/daemon-state\";\nimport {\n LocalDaemonControlPlaneClientError,\n sendLocalDaemonControlPlaneRequest,\n} from \"../local-service/control-plane/client\";\nimport { normalizeOptionalText } from \"../local-service/core/logger\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { type RuntimeContext, resolveRuntimeContext } from \"../runtime/context\";\nimport { createPresenter } from \"../runtime/presenter/index\";\nimport type { DaemonControlInput } from \"./service-inputs\";\nimport { emitDaemonOverviewIfAgent } from \"./service-output\";\nimport { describeDaemonRuntimeStatus } from \"./service-status-view\";\n\nexport async function runDaemonControlCommand(\n input: DaemonControlInput & {\n command: \"cancel\" | \"interrupt\";\n }\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: input.command,\n handled: input.agentOverviewHandled,\n });\n\n let target:\n | import(\"@openmeld/schemas/types\").OpenMeldDaemonControlTargetSelector\n | null = null;\n try {\n target = resolveDaemonControlTargetSelector({\n dispatch: input.dispatch,\n task: input.task,\n });\n } catch (error) {\n failDaemonControlCommand({\n command: input.command,\n error,\n errorCode: \"daemon.control.invalid_target_selector\",\n presenter,\n runtime,\n target: null,\n });\n }\n const runtimeStatus = await resolveDaemonControlRuntimeStatus().catch(\n (error) => {\n failDaemonControlCommand({\n command: input.command,\n error,\n presenter,\n runtime,\n target,\n });\n }\n );\n if (!runtimeStatus.controlReachable) {\n emitDaemonControlNotRunning({\n command: input.command,\n presenter,\n runtime,\n runtimeStatus: runtimeStatus.runtimeStatus,\n target,\n });\n throw new Error(\"daemon.control.not_running\");\n }\n\n const response = await sendLocalDaemonControlPlaneRequest({\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: input.command,\n requestId: randomUUID(),\n payload: {\n ...(input.reason ? { reason: input.reason } : {}),\n target,\n },\n },\n }).catch((error) => {\n failDaemonControlCommand({\n command: input.command,\n error,\n presenter,\n runtime,\n target,\n });\n });\n\n if (input.command === \"interrupt\") {\n if (response.code !== \"service.interrupt\") {\n failDaemonControlCommand({\n command: input.command,\n error: new Error(\n `daemon.control.invalid_response: expected service.interrupt, received ${response.code}`\n ),\n errorCode: \"daemon.control.invalid_response\",\n presenter,\n runtime,\n target,\n });\n }\n const payload = response.payload;\n emitDaemonControlResult({\n command: input.command,\n payload,\n presenter,\n runtime,\n });\n if (!payload.accepted) {\n throw buildDaemonControlRejectedError({\n command: input.command,\n payload,\n });\n }\n return;\n }\n\n if (response.code !== \"service.cancel\") {\n failDaemonControlCommand({\n command: input.command,\n error: new Error(\n `daemon.control.invalid_response: expected service.cancel, received ${response.code}`\n ),\n errorCode: \"daemon.control.invalid_response\",\n presenter,\n runtime,\n target,\n });\n }\n const payload = response.payload;\n emitDaemonControlResult({\n command: input.command,\n payload,\n presenter,\n runtime,\n });\n if (!payload.accepted) {\n throw buildDaemonControlRejectedError({\n command: input.command,\n payload,\n });\n }\n}\n\nexport async function resolveDaemonControlRuntimeStatus(): Promise<{\n controlReachable: boolean;\n runtimeStatus: DaemonServiceRuntimeStatus;\n}> {\n const runtimeContext = await readCurrentDaemonRuntimeContext();\n if (runtimeContext.effectiveRuntimeStatus === \"running\") {\n return {\n controlReachable: true,\n runtimeStatus: runtimeContext.runtimeStatus,\n };\n }\n if (\n runtimeContext.effectiveRuntimeStatus === \"not_running\" ||\n runtimeContext.status.installed !== true\n ) {\n return {\n controlReachable: false,\n runtimeStatus: runtimeContext.runtimeStatus,\n };\n }\n\n const controlReachable = await probeLocalDaemonControlPlaneReachability();\n return {\n controlReachable,\n runtimeStatus: runtimeContext.runtimeStatus,\n };\n}\n\nexport async function probeLocalDaemonControlPlaneReachability(): Promise<boolean> {\n try {\n const response = await sendLocalDaemonControlPlaneRequest({\n request: {\n v: OPENMELD_DAEMON_CONTROL_PLANE_SCHEMA_VERSION,\n command: \"health\",\n requestId: randomUUID(),\n },\n });\n return response.code === \"service.health\";\n } catch (error) {\n if (\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.endpoint_missing\"\n ) {\n return false;\n }\n throw error;\n }\n}\n\nexport function buildDaemonControlRejectedError(input: {\n command: \"cancel\" | \"interrupt\";\n payload:\n | Extract<\n import(\"@openmeld/schemas/types\").OpenMeldDaemonControlPlaneResponse,\n { code: \"service.cancel\" }\n >[\"payload\"]\n | Extract<\n import(\"@openmeld/schemas/types\").OpenMeldDaemonControlPlaneResponse,\n { code: \"service.interrupt\" }\n >[\"payload\"];\n}): Error {\n const targetLabel =\n input.payload.target.by === \"dispatch\"\n ? `dispatch ${input.payload.target.dispatchId}`\n : `task ${input.payload.target.taskId}`;\n const note = normalizeOptionalText(input.payload.note);\n const detail = note ? ` (${note})` : \"\";\n return new Error(\n `daemon.control.rejected: ${input.command} request was not accepted for ${targetLabel}${detail}`\n );\n}\n\nexport function resolveDaemonControlTargetSelector(input: {\n dispatch?: string;\n task?: string;\n}): import(\"@openmeld/schemas/types\").OpenMeldDaemonControlTargetSelector {\n const selection = validateDaemonControlTargetInput({\n dispatch: input.dispatch,\n task: input.task,\n });\n if (selection.dispatch) {\n return {\n by: \"dispatch\",\n dispatchId: selection.dispatch,\n };\n }\n return {\n by: \"task\",\n taskId: selection.task ?? \"\",\n };\n}\n\nexport function emitDaemonControlNotRunning(input: {\n command: \"cancel\" | \"interrupt\";\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n runtimeStatus: DaemonServiceRuntimeStatus;\n target: import(\"@openmeld/schemas/types\").OpenMeldDaemonControlTargetSelector;\n}) {\n const payload = {\n accepted: false,\n reason: \"service_not_running\",\n status: input.runtimeStatus,\n target: input.target,\n } as const;\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: `daemon.${input.command}.not_running`,\n payload,\n });\n return;\n }\n input.presenter.line({\n code: `daemon.${input.command}.not_running`,\n text: describeDaemonRuntimeStatus(input.runtimeStatus),\n });\n}\n\nexport function emitDaemonControlFailure(input: {\n command: \"cancel\" | \"interrupt\";\n error: unknown;\n errorCode?: string;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n target:\n | import(\"@openmeld/schemas/types\").OpenMeldDaemonControlTargetSelector\n | null;\n}) {\n const errorCode =\n input.errorCode ??\n (input.error instanceof LocalDaemonControlPlaneClientError\n ? input.error.code\n : \"daemon.control.request_failed\");\n const errorMessage =\n input.error instanceof Error\n ? input.error.message\n : \"failed to send daemon control request\";\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: `daemon.${input.command}.failed`,\n payload: {\n accepted: false,\n errorCode,\n errorMessage,\n target: input.target,\n },\n });\n return;\n }\n input.presenter.line({\n code: `daemon.${input.command}.failed`,\n text: `${capitalizeDaemonControlCommand(input.command)} request failed: ${errorMessage}`,\n });\n}\n\nexport function failDaemonControlCommand(input: {\n command: \"cancel\" | \"interrupt\";\n error: unknown;\n errorCode?: string;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n target:\n | import(\"@openmeld/schemas/types\").OpenMeldDaemonControlTargetSelector\n | null;\n}): never {\n emitDaemonControlFailure(input);\n throw input.error instanceof Error\n ? input.error\n : new Error(\"daemon.control.request_failed\");\n}\n\nexport function emitDaemonControlResult(input: {\n command: \"cancel\" | \"interrupt\";\n payload:\n | Extract<\n import(\"@openmeld/schemas/types\").OpenMeldDaemonControlPlaneResponse,\n { code: \"service.cancel\" }\n >[\"payload\"]\n | Extract<\n import(\"@openmeld/schemas/types\").OpenMeldDaemonControlPlaneResponse,\n { code: \"service.interrupt\" }\n >[\"payload\"];\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}) {\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: `daemon.${input.command}.result`,\n payload: input.payload,\n });\n return;\n }\n\n const targetLabel =\n input.payload.target.by === \"dispatch\"\n ? `dispatch ${input.payload.target.dispatchId}`\n : `task ${input.payload.target.taskId}`;\n const resolvedDispatchId = normalizeOptionalText(\n input.payload.resolvedDispatchId\n );\n const resolvedTaskId = normalizeOptionalText(input.payload.resolvedTaskId);\n const acceptedVerb = capitalizeDaemonControlCommand(input.command);\n const acceptedText = [\n `${acceptedVerb} request accepted for ${targetLabel}.`,\n resolvedDispatchId ? `Dispatch: ${resolvedDispatchId}.` : null,\n resolvedTaskId ? `Task: ${resolvedTaskId}.` : null,\n input.payload.note ? `Note: ${input.payload.note}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n const rejectedText = [\n `${acceptedVerb} request was not accepted for ${targetLabel}.`,\n input.payload.note ? `Reason: ${input.payload.note}.` : null,\n resolvedDispatchId ? `Dispatch: ${resolvedDispatchId}.` : null,\n resolvedTaskId ? `Task: ${resolvedTaskId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n input.presenter.line({\n code: `daemon.${input.command}.${input.payload.accepted ? \"accepted\" : \"rejected\"}`,\n text: input.payload.accepted ? acceptedText : rejectedText,\n });\n}\n\nexport function capitalizeDaemonControlCommand(\n command: \"cancel\" | \"interrupt\"\n): string {\n return command === \"cancel\" ? \"Cancel\" : \"Interrupt\";\n}\n","import { toErrorMessage } from \"@openmeld/utils\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport type { OpenMeldLockMeta } from \"../config/lock\";\nimport {\n captureDaemonServiceEvidenceBestEffort,\n type DaemonServiceFailureStage,\n formatDaemonFailureContextText,\n} from \"../local-service/lifecycle/daemon-service-evidence\";\nimport { getDaemonSystemServiceLogPath } from \"../local-service/lifecycle/daemon-service-manager\";\nimport { isVersionDowngrade } from \"../local-service/lifecycle/version-change-direction\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommand,\n formatOpenMeldCliCommands,\n} from \"../runtime/cli-entry-command\";\nimport { emitCliJsonEnvelope } from \"../runtime/cli-json-output\";\nimport type { RuntimeContext } from \"../runtime/context\";\nimport type { createPresenter, Presenter } from \"../runtime/presenter/index\";\nimport {\n formatDaemonDowngradeBlockedNextStep,\n formatDaemonServiceDowngradeBlockedRecommendation,\n getDaemonDowngradeBlockedTitle,\n} from \"../system/local-service-install-attention\";\nimport { renderServiceActionCard } from \"./service-output\";\nimport type {\n DaemonRunFailureReason,\n DaemonRunReason,\n} from \"./service-run-result\";\nimport type { SystemServiceStartupFailureVerdict } from \"./service-start-failure\";\n\nexport type DaemonServiceMaintenanceAction = \"repair\" | \"update\";\n\nexport type DaemonReinstallStartBlockedReason = Extract<\n DaemonRunFailureReason,\n | \"cleanup_required\"\n | \"authentication_required\"\n | \"authentication_environment_mismatch\"\n | \"service_dependencies_unavailable\"\n>;\n\nexport class DaemonReinstallUnexpectedStartError extends Error {\n override readonly cause: unknown;\n readonly diagnosticDetail: string | null;\n readonly outcome: Extract<DaemonReinstallOutcome, { result: \"start_failed\" }>;\n\n constructor(input: {\n cause: unknown;\n desiredState: \"background\" | \"stopped\";\n diagnosticDetail: string | null;\n forceUsed: boolean;\n }) {\n super(toErrorMessage(input.cause));\n this.name = \"DaemonReinstallUnexpectedStartError\";\n this.cause = input.cause;\n this.diagnosticDetail = input.diagnosticDetail;\n this.outcome = createDaemonReinstallStartFailedOutcome({\n backupDataPath: null,\n desiredState: input.desiredState,\n failureStage: \"reinstall-install\",\n forceUsed: input.forceUsed,\n });\n }\n}\n\nexport class DaemonReinstallFailureError extends Error {\n override readonly cause: unknown;\n readonly backupDataPath: string | null;\n readonly errorCode: string | null;\n readonly evidencePath: string | null;\n readonly failureStage: DaemonServiceFailureStage | null;\n\n constructor(input: {\n backupDataPath: string | null;\n cause: unknown;\n errorCode: string | null;\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n }) {\n super(toErrorMessage(input.cause));\n this.name = \"DaemonReinstallFailureError\";\n this.backupDataPath = input.backupDataPath;\n this.cause = input.cause;\n this.errorCode = input.errorCode;\n this.evidencePath = input.evidencePath ?? null;\n this.failureStage = input.failureStage ?? null;\n }\n}\n\nexport type DaemonReinstallTimeoutPolicy = \"abort\" | \"prompt_force\" | \"force\";\n\nexport type DaemonReinstallDrainTimeoutResult = {\n ok: false;\n result: \"drain_timeout\";\n forceRequired: true;\n waitMs: number;\n};\n\nexport type DaemonReinstallServiceState = \"running\" | \"stopped\";\n\nexport type DaemonReinstallCompletedOutcome = {\n ok: true;\n result: \"completed\";\n backupDataPath: string | null;\n desiredState: \"background\" | \"stopped\";\n evidencePath?: string | null;\n forceUsed: boolean;\n serviceState: DaemonReinstallServiceState;\n};\n\nexport type DaemonReinstallAlreadyHealthyOutcome = {\n ok: true;\n result: \"already_healthy\";\n desiredState: \"background\" | \"stopped\";\n serviceState: DaemonReinstallServiceState;\n};\n\nexport type DaemonReinstallScheduledOutcome = {\n ok: true;\n result: \"scheduled\";\n jobId: string;\n targetVersion: string;\n};\n\nexport type DaemonReinstallStoppedSafeOutcome = {\n ok: true;\n result: \"stopped_safe\";\n desiredState: \"background\" | \"stopped\";\n backupDataPath: null;\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n forceUsed: boolean;\n reasonCodes: string[];\n serviceState: \"stopped\";\n errorMessage: string;\n};\n\nexport type DaemonReinstallOutcome =\n | {\n ok: false;\n result: \"cancelled\";\n }\n | {\n ok: false;\n result: \"in_progress\";\n heldBy: string | null;\n retryCommand: string;\n startedAt: string | null;\n }\n | DaemonReinstallDrainTimeoutResult\n | {\n ok: false;\n result: \"start_blocked\";\n blockReason: DaemonReinstallStartBlockedReason;\n desiredState: \"background\" | \"stopped\";\n forceUsed: boolean;\n backupDataPath: string | null;\n startFailureVerdict?: SystemServiceStartupFailureVerdict | null;\n }\n | {\n ok: false;\n result: \"start_failed\";\n desiredState: \"background\" | \"stopped\";\n forceUsed: boolean;\n backupDataPath: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n evidencePath?: string | null;\n startFailureVerdict?: SystemServiceStartupFailureVerdict | null;\n }\n | {\n ok: false;\n result: \"downgrade_blocked\";\n installedVersion: string;\n requestedVersion: string;\n upgradeCommand: string;\n }\n | DaemonReinstallStoppedSafeOutcome\n | DaemonReinstallScheduledOutcome\n | DaemonReinstallAlreadyHealthyOutcome\n | DaemonReinstallCompletedOutcome;\n\nexport function formatDaemonReinstallLockHolder(\n lockMeta: OpenMeldLockMeta | null | undefined\n): string | null {\n if (!lockMeta) {\n return null;\n }\n\n const pid = typeof lockMeta.pid === \"number\" ? lockMeta.pid : null;\n const sessionId =\n typeof lockMeta.sessionId === \"string\" ? lockMeta.sessionId.trim() : null;\n\n if (pid !== null && sessionId) {\n return `OpenMeld process pid ${String(pid)} (${sessionId})`;\n }\n if (pid !== null) {\n return `OpenMeld process pid ${String(pid)}`;\n }\n if (sessionId) {\n return `OpenMeld session ${sessionId}`;\n }\n return null;\n}\n\nexport function formatDaemonReinstallLockStartedAt(\n lockMeta: OpenMeldLockMeta | null | undefined\n): string | null {\n if (!lockMeta) {\n return null;\n }\n const startedAt =\n typeof lockMeta.at === \"string\" ? lockMeta.at.trim() : undefined;\n return startedAt && startedAt.length > 0 ? startedAt : null;\n}\n\nexport function createDaemonReinstallInProgressOutcome(\n lockMeta?: OpenMeldLockMeta | null,\n action: DaemonServiceMaintenanceAction = \"repair\"\n): Extract<DaemonReinstallOutcome, { result: \"in_progress\" }> {\n return {\n ok: false,\n result: \"in_progress\",\n heldBy: formatDaemonReinstallLockHolder(lockMeta),\n retryCommand: formatDaemonServiceMaintenanceCommand(action),\n startedAt: formatDaemonReinstallLockStartedAt(lockMeta),\n };\n}\n\nexport function createDaemonReinstallDowngradeBlockedOutcome(input: {\n installedVersion: string;\n requestedVersion: string;\n}): Extract<DaemonReinstallOutcome, { result: \"downgrade_blocked\" }> {\n return {\n ok: false,\n result: \"downgrade_blocked\",\n installedVersion: input.installedVersion,\n requestedVersion: input.requestedVersion,\n upgradeCommand: \"openmeld upgrade\",\n };\n}\n\nexport function normalizeDaemonServiceMaintenanceAction(\n action: DaemonServiceMaintenanceAction | undefined\n): DaemonServiceMaintenanceAction {\n return action === \"update\" ? \"update\" : \"repair\";\n}\n\nexport function formatDaemonServiceMaintenanceCommand(\n action: DaemonServiceMaintenanceAction,\n suffix = \"\"\n): string {\n return `openmeld service ${action}${suffix}`;\n}\n\nexport function formatDaemonServiceMaintenanceActionLabel(\n action: DaemonServiceMaintenanceAction\n): \"repair\" | \"update\" {\n return action;\n}\n\nexport function formatDaemonServiceMaintenanceActionTitle(\n action: DaemonServiceMaintenanceAction\n): \"Repair\" | \"Update\" {\n return action === \"update\" ? \"Update\" : \"Repair\";\n}\n\nexport function formatDaemonServiceMaintenanceActionPast(\n action: DaemonServiceMaintenanceAction\n): \"repaired\" | \"updated\" {\n return action === \"update\" ? \"updated\" : \"repaired\";\n}\n\nexport function formatDaemonServiceMaintenanceActionPastTitle(\n action: DaemonServiceMaintenanceAction\n): \"Repaired\" | \"Updated\" {\n return action === \"update\" ? \"Updated\" : \"Repaired\";\n}\n\nexport function formatDaemonServiceMaintenanceActionGerund(\n action: DaemonServiceMaintenanceAction\n): \"repairing\" | \"updating\" {\n return action === \"update\" ? \"updating\" : \"repairing\";\n}\n\nexport function createDaemonReinstallCompletedOutcome(input: {\n backupDataPath: string | null;\n desiredState: \"background\" | \"stopped\";\n evidencePath?: string | null;\n forceUsed: boolean;\n serviceState: DaemonReinstallServiceState;\n}): DaemonReinstallCompletedOutcome {\n return {\n ok: true,\n result: \"completed\",\n backupDataPath: input.backupDataPath,\n desiredState: input.desiredState,\n ...(input.evidencePath ? { evidencePath: input.evidencePath } : {}),\n forceUsed: input.forceUsed,\n serviceState: input.serviceState,\n };\n}\n\nexport function createDaemonReinstallAlreadyHealthyOutcome(input: {\n desiredState: \"background\" | \"stopped\";\n serviceState: DaemonReinstallServiceState;\n}): DaemonReinstallAlreadyHealthyOutcome {\n return {\n ok: true,\n result: \"already_healthy\",\n desiredState: input.desiredState,\n serviceState: input.serviceState,\n };\n}\n\nexport function createDaemonReinstallStoppedSafeOutcome(input: {\n desiredState: \"background\" | \"stopped\";\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n forceUsed: boolean;\n errorMessage: string;\n reasonCodes: string[];\n}): DaemonReinstallStoppedSafeOutcome {\n return {\n ok: true,\n result: \"stopped_safe\",\n desiredState: input.desiredState,\n backupDataPath: null,\n ...(input.evidencePath ? { evidencePath: input.evidencePath } : {}),\n ...(input.failureStage ? { failureStage: input.failureStage } : {}),\n forceUsed: input.forceUsed,\n reasonCodes: input.reasonCodes,\n serviceState: \"stopped\",\n errorMessage: input.errorMessage,\n };\n}\n\nexport function createDaemonReinstallStartFailedOutcome(input: {\n backupDataPath: string | null;\n desiredState: \"background\" | \"stopped\";\n evidencePath?: string | null;\n failureStage?: DaemonServiceFailureStage | null;\n forceUsed: boolean;\n startFailureVerdict?: SystemServiceStartupFailureVerdict | null;\n}): Extract<DaemonReinstallOutcome, { result: \"start_failed\" }> {\n return {\n ok: false,\n result: \"start_failed\",\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n backupDataPath: input.backupDataPath,\n ...(input.failureStage ? { failureStage: input.failureStage } : {}),\n ...(input.evidencePath ? { evidencePath: input.evidencePath } : {}),\n ...(input.startFailureVerdict\n ? { startFailureVerdict: input.startFailureVerdict }\n : {}),\n };\n}\n\nexport function createDaemonReinstallStartBlockedOutcome(input: {\n backupDataPath: string | null;\n blockReason: DaemonReinstallStartBlockedReason;\n desiredState: \"background\" | \"stopped\";\n forceUsed: boolean;\n startFailureVerdict?: SystemServiceStartupFailureVerdict | null;\n}): Extract<DaemonReinstallOutcome, { result: \"start_blocked\" }> {\n return {\n ok: false,\n result: \"start_blocked\",\n blockReason: input.blockReason,\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n backupDataPath: input.backupDataPath,\n ...(input.startFailureVerdict\n ? { startFailureVerdict: input.startFailureVerdict }\n : {}),\n };\n}\n\nexport async function attachDaemonReinstallEvidence(input: {\n outcome: DaemonReinstallOutcome;\n runtime: RuntimeContext;\n}): Promise<DaemonReinstallOutcome> {\n if (input.outcome.result !== \"start_failed\" || input.outcome.evidencePath) {\n return input.outcome;\n }\n const evidencePath = await captureDaemonServiceEvidenceBestEffort({\n runtime: input.runtime,\n });\n if (!evidencePath) {\n return input.outcome;\n }\n return {\n ...input.outcome,\n evidencePath,\n };\n}\n\nexport function buildDaemonReinstallFailureMessage(input: {\n action: DaemonServiceMaintenanceAction;\n backupDataPath: string | null;\n errorCode: string | null;\n errorMessage: string;\n failureStage?: DaemonServiceFailureStage | null;\n evidencePath: string | null;\n includeDiagnosticDetails?: boolean;\n resolvedView: RuntimeContext[\"resolvedView\"];\n}): string {\n const actionLabel = formatDaemonServiceMaintenanceActionLabel(input.action);\n const actionCommand = formatDaemonServiceMaintenanceCommand(input.action);\n const controlEndpointMissing =\n input.failureStage === \"stop_or_drain\" &&\n input.errorCode === \"daemon.control.endpoint_missing\";\n if (\n input.resolvedView === \"human\" &&\n input.includeDiagnosticDetails !== true\n ) {\n if (controlEndpointMissing) {\n return formatInlineOpenMeldCliCommands(\n `OpenMeld couldn't safely stop the running Service. After local Agent work finishes, run \\`${actionCommand} --force\\`.`\n );\n }\n if (input.errorMessage.includes(\"test fixture identity\")) {\n return formatInlineOpenMeldCliCommands(\n \"OpenMeld couldn't use old setup data on this computer. Copy a new setup command from OpenMeld Web and run it.\"\n );\n }\n return formatInlineOpenMeldCliCommands(\n `OpenMeld couldn't ${actionLabel} OpenMeld Service. Run \\`${actionCommand}\\` again.`\n );\n }\n\n const failureContext = formatDaemonFailureContextText({\n backupDataPath: input.backupDataPath,\n evidencePath: input.evidencePath,\n failureStage: input.failureStage ?? null,\n });\n const diagnosticDetails = [\n `OpenMeld Service ${actionLabel} failed: ${input.errorMessage}.`,\n ...(input.errorCode ? [`Error code: ${input.errorCode}.`] : []),\n ...(controlEndpointMissing\n ? [\n \"Recovery: run `openmeld service status --view agent`.\",\n `Only if no local Agent work is running, run \\`${actionCommand} --force --view agent\\`.`,\n \"The force option stops the old Service process.\",\n ]\n : []),\n ...(failureContext.length > 0 ? [failureContext] : []),\n ];\n return diagnosticDetails.join(\" \");\n}\n\nexport function isDaemonReinstallHealthyAndRunning(\n outcome: DaemonReinstallOutcome\n): outcome is (\n | DaemonReinstallCompletedOutcome\n | DaemonReinstallAlreadyHealthyOutcome\n) & { serviceState: \"running\" } {\n return (\n outcome.ok &&\n (outcome.result === \"completed\" || outcome.result === \"already_healthy\") &&\n outcome.serviceState === \"running\"\n );\n}\n\nexport function isDaemonReinstallCompletedAndStopped(\n outcome: DaemonReinstallOutcome\n): outcome is DaemonReinstallCompletedOutcome & { serviceState: \"stopped\" } {\n return (\n outcome.ok &&\n outcome.result === \"completed\" &&\n outcome.serviceState === \"stopped\"\n );\n}\n\nexport function resolveDaemonReinstallStartBlockedReason(\n reason: DaemonRunReason\n): DaemonReinstallStartBlockedReason | null {\n switch (reason) {\n case \"cleanup_required\":\n case \"authentication_required\":\n case \"authentication_environment_mismatch\":\n case \"service_dependencies_unavailable\":\n return reason;\n default:\n return null;\n }\n}\n\nexport function buildDaemonReinstallResultTitle(\n outcome: DaemonReinstallOutcome,\n action: DaemonServiceMaintenanceAction\n): string {\n const actionTitle = formatDaemonServiceMaintenanceActionTitle(action);\n const actionPastTitle = formatDaemonServiceMaintenanceActionPastTitle(action);\n switch (outcome.result) {\n case \"already_healthy\":\n return \"✅ OpenMeld Service Is Already Healthy\";\n case \"scheduled\":\n return \"⏳ OpenMeld Service Update Started\";\n case \"completed\":\n return outcome.serviceState === \"running\"\n ? `✅ OpenMeld Service ${actionPastTitle}`\n : `⚠️ OpenMeld Service ${actionPastTitle} But Not Running`;\n case \"stopped_safe\":\n return \"✅ OpenMeld Service Safely Stopped\";\n case \"in_progress\":\n return `⏳ OpenMeld Service ${actionTitle} In Progress`;\n case \"downgrade_blocked\":\n return `⛔ OpenMeld Service ${actionTitle} Blocked`;\n case \"drain_timeout\":\n return `⏸️ OpenMeld Service ${actionTitle} Paused`;\n case \"start_blocked\":\n return `⚠️ OpenMeld Service ${actionPastTitle} But Start Is Blocked`;\n case \"start_failed\":\n return `⚠️ OpenMeld Service ${actionPastTitle} But Not Running`;\n case \"cancelled\":\n return `OpenMeld Service ${actionTitle} Cancelled`;\n default: {\n const unexpectedOutcome: never = outcome;\n throw new Error(\n `Unexpected daemon reinstall outcome: ${String(unexpectedOutcome)}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallWhyText(\n outcome: Exclude<DaemonReinstallOutcome, { result: \"cancelled\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n const forcedSuffix =\n \"forceUsed\" in outcome && outcome.forceUsed\n ? \" Force continue was used after graceful drain timed out.\"\n : \"\";\n const actionPast = formatDaemonServiceMaintenanceActionPast(action);\n const actionGerund = formatDaemonServiceMaintenanceActionGerund(action);\n switch (outcome.result) {\n case \"already_healthy\":\n return \"OpenMeld checked the installed bundle, service registration, runtime contract, and running state. They already match, so nothing was stopped, reinstalled, or restarted.\";\n case \"scheduled\":\n return \"OpenMeld saved this update on the computer and handed it to the background service. Running Agent work will finish before OpenMeld switches versions.\";\n case \"completed\":\n return outcome.serviceState === \"running\"\n ? `OpenMeld ${actionPast} OpenMeld Service and restored background service for this lane.${forcedSuffix}`\n : `${buildDaemonReinstallStoppedServiceMessage(action)}${forcedSuffix}`;\n case \"stopped_safe\":\n return `OpenMeld ${actionPast} OpenMeld Service, but it could not safely restore the previous running state. OpenMeld kept the current version installed and stopped instead of rolling back to older local service state.${forcedSuffix}`;\n case \"in_progress\":\n return `Another OpenMeld process is already ${actionGerund} OpenMeld Service on this device.`;\n case \"downgrade_blocked\":\n return \"The installed OpenMeld Service version is newer than this CLI version.\";\n case \"drain_timeout\":\n return `Graceful drain did not finish within ${String(outcome.waitMs)}ms, so OpenMeld did not force the existing service to stop.`;\n case \"start_blocked\":\n return buildDaemonReinstallStartBlockedWhyText(outcome, action);\n case \"start_failed\":\n return `OpenMeld ${actionPast} OpenMeld Service, but background startup did not reach a healthy running state for this lane.${forcedSuffix}`;\n default: {\n const unexpectedOutcome: never = outcome;\n throw new Error(\n `Unexpected daemon reinstall outcome while building why text: ${String(\n unexpectedOutcome\n )}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallCurrentStateText(\n outcome: Exclude<DaemonReinstallOutcome, { result: \"cancelled\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n const actionGerund = formatDaemonServiceMaintenanceActionGerund(action);\n switch (outcome.result) {\n case \"already_healthy\":\n return outcome.serviceState === \"running\"\n ? \"OpenMeld Service is running in the background for this lane.\"\n : \"OpenMeld Service is healthy and remains stopped because that is the saved state for this lane.\";\n case \"scheduled\":\n return `OpenMeld will update to v${outcome.targetVersion} in the background.`;\n case \"completed\":\n return outcome.serviceState === \"running\"\n ? \"OpenMeld Service is running in the background for this lane.\"\n : \"OpenMeld Service is installed, but it is not running on this computer.\";\n case \"stopped_safe\":\n return \"OpenMeld Service is installed and stopped.\";\n case \"in_progress\": {\n const details = [outcome.heldBy, outcome.startedAt].filter(Boolean);\n return details.length > 0\n ? details.join(\" • \")\n : `Another OpenMeld process is currently ${actionGerund} OpenMeld Service on this device.`;\n }\n case \"downgrade_blocked\":\n return `Installed OpenMeld Service: v${outcome.installedVersion}. This CLI requested: v${outcome.requestedVersion}.`;\n case \"drain_timeout\":\n return `The existing OpenMeld Service was left in place, and ${formatDaemonServiceMaintenanceActionLabel(\n action\n )} did not continue.`;\n case \"start_blocked\":\n return buildDaemonReinstallStartBlockedCurrentStateText(outcome);\n case \"start_failed\":\n return \"OpenMeld Service is installed, but it isn't running.\";\n default: {\n const unexpectedOutcome: never = outcome;\n throw new Error(\n `Unexpected daemon reinstall outcome while building current state: ${String(\n unexpectedOutcome\n )}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallNextStepText(\n outcome: Exclude<DaemonReinstallOutcome, { result: \"cancelled\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n switch (outcome.result) {\n case \"already_healthy\":\n return \"No action is required.\";\n case \"scheduled\":\n return \"You can close this window. No action is required.\";\n case \"completed\":\n return outcome.serviceState === \"running\"\n ? \"No action is required.\"\n : formatInlineOpenMeldCliCommands(\n `Run \\`${formatOpenMeldCliCommand(\n \"openmeld service start\"\n )}\\` to keep OpenMeld Service running in the background.`\n );\n case \"stopped_safe\":\n return formatInlineOpenMeldCliCommands(\n `Run \\`${formatOpenMeldCliCommand(\"openmeld service repair\")}\\` once. OpenMeld preserved the failed update evidence and kept the current version stopped safely.`\n );\n case \"in_progress\":\n return formatInlineOpenMeldCliCommands(\n `Wait a moment. If OpenMeld Service is still not connected, run \\`${formatOpenMeldCliCommand(\n outcome.retryCommand\n )}\\` again.`\n );\n case \"downgrade_blocked\":\n return `${formatDaemonServiceDowngradeBlockedRecommendation({\n installedVersion: outcome.installedVersion,\n expectedVersion: outcome.requestedVersion,\n })} ${formatDaemonDowngradeBlockedNextStep()}`;\n case \"drain_timeout\":\n return formatInlineOpenMeldCliCommands(\n `Re-run \\`${formatOpenMeldCliCommand(\n formatDaemonServiceMaintenanceCommand(action, \" --force\")\n )}\\` to continue.`\n );\n case \"start_blocked\":\n return buildDaemonReinstallStartBlockedNextStep(outcome, action);\n case \"start_failed\":\n return buildDaemonReinstallStartFailureNextStep(action);\n default: {\n const unexpectedOutcome: never = outcome;\n throw new Error(\n `Unexpected daemon reinstall outcome while building next step: ${String(\n unexpectedOutcome\n )}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallHeadlineText(\n outcome: Exclude<DaemonReinstallOutcome, { result: \"cancelled\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n const actionPast = formatDaemonServiceMaintenanceActionPast(action);\n const actionLabel = formatDaemonServiceMaintenanceActionLabel(action);\n switch (outcome.result) {\n case \"already_healthy\":\n return \"OpenMeld Service is already healthy. Nothing was changed.\";\n case \"scheduled\":\n return \"OpenMeld will finish this update in the background. You can close this window.\";\n case \"completed\":\n return outcome.serviceState === \"running\"\n ? `OpenMeld Service was ${actionPast} and is now running.`\n : buildDaemonReinstallStoppedServiceMessage(action);\n case \"stopped_safe\":\n return `OpenMeld Service was ${actionPast} and left safely stopped on the current version.`;\n case \"in_progress\":\n return `OpenMeld Service ${actionLabel} is already running.`;\n case \"downgrade_blocked\":\n return `OpenMeld Service ${actionLabel} is blocked.`;\n case \"drain_timeout\":\n return `OpenMeld Service ${actionLabel} paused before it could continue.`;\n case \"start_blocked\":\n return `OpenMeld Service was ${actionPast}, but OpenMeld blocked background startup before it could begin.`;\n case \"start_failed\":\n return `OpenMeld Service was ${actionPast}, but OpenMeld could not finish starting it.`;\n default: {\n const unexpectedOutcome: never = outcome;\n throw new Error(\n `Unexpected daemon reinstall outcome while building headline text: ${String(\n unexpectedOutcome\n )}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallStoppedServiceMessage(\n action: DaemonServiceMaintenanceAction\n): string {\n return `Service files were ${formatDaemonServiceMaintenanceActionPast(\n action\n )}, but OpenMeld Service is still stopped. Local Wake work will keep waiting until OpenMeld Service starts.`;\n}\n\nexport function emitDaemonReinstallResult(input: {\n outcome: DaemonReinstallOutcome;\n presenter: Presenter;\n resolvedView: RuntimeContext[\"resolvedView\"];\n action: DaemonServiceMaintenanceAction;\n}): void {\n if (input.resolvedView !== \"agent\") {\n return;\n }\n input.presenter.data({\n code: \"daemon.reinstall.result\",\n payload: buildDaemonReinstallAgentPayload({\n action: input.action,\n outcome: input.outcome,\n }),\n });\n}\n\nexport function buildDaemonReinstallAgentPayload(input: {\n action: DaemonServiceMaintenanceAction;\n outcome: DaemonReinstallOutcome;\n}):\n | DaemonReinstallOutcome\n | (DaemonReinstallOutcome & Record<string, unknown>) {\n if (\n input.outcome.ok &&\n input.outcome.result === \"completed\" &&\n input.outcome.serviceState === \"stopped\"\n ) {\n return {\n ...input.outcome,\n message: buildDaemonReinstallStoppedServiceMessage(input.action),\n nextSteps: formatOpenMeldCliCommands([\n \"openmeld service start --view agent\",\n ]),\n operationalState: \"not_running\",\n requiresStart: true,\n };\n }\n return input.outcome;\n}\n\nexport function renderDaemonReinstallCard(input: {\n action: DaemonServiceMaintenanceAction;\n outcome: DaemonReinstallOutcome;\n presenter: Presenter;\n resolvedView: RuntimeContext[\"resolvedView\"];\n}): void {\n if (input.resolvedView === \"agent\") {\n return;\n }\n if (input.outcome.result === \"cancelled\") {\n return;\n }\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: `daemon.reinstall.${input.outcome.result}`,\n title: buildDaemonReinstallResultTitle(input.outcome, input.action),\n rows: [\n {\n label: \"✅ Result\",\n value: buildDaemonReinstallHeadlineText(input.outcome, input.action),\n },\n {\n label: \"ℹ️ Why\",\n value: buildDaemonReinstallWhyText(input.outcome, input.action),\n },\n {\n label: \"🧩 Current State\",\n value: buildDaemonReinstallCurrentStateText(\n input.outcome,\n input.action\n ),\n },\n {\n label: \"🔧 Next\",\n value: buildDaemonReinstallNextStepText(input.outcome, input.action),\n },\n ],\n });\n}\n\nexport function renderDaemonReinstallOutcome(input: {\n action: DaemonServiceMaintenanceAction;\n outcome: DaemonReinstallOutcome;\n presenter: Presenter;\n resolvedView: RuntimeContext[\"resolvedView\"];\n suppressHumanResultCard?: boolean;\n json?: boolean;\n}): void {\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.reinstall\",\n ...buildDaemonReinstallAgentPayload({\n action: input.action,\n outcome: input.outcome,\n }),\n });\n return;\n }\n emitDaemonReinstallResult(input);\n if (input.suppressHumanResultCard === true) {\n return;\n }\n renderDaemonReinstallCard(input);\n}\n\nexport type DaemonDowngradeBlock = {\n installedVersion: string;\n requestedVersion: string;\n};\n\nexport async function resolveDaemonDowngradeBlock(input: {\n requestedVersion: string;\n readDaemonStatus?: typeof getDaemonStatus;\n}): Promise<DaemonDowngradeBlock | null> {\n const readDaemonStatus = input.readDaemonStatus ?? getDaemonStatus;\n const daemonStatus = await readDaemonStatus();\n if (!daemonStatus.installed) {\n return null;\n }\n\n if (\n !isVersionDowngrade({\n fromVersion: daemonStatus.state.daemonVersion,\n toVersion: input.requestedVersion,\n })\n ) {\n return null;\n }\n\n return {\n installedVersion: daemonStatus.state.daemonVersion,\n requestedVersion: input.requestedVersion,\n };\n}\n\nexport function emitDaemonDowngradeBlocked(input: {\n presenter: ReturnType<typeof createPresenter>;\n installedVersion: string;\n requestedVersion: string;\n codePrefix: \"daemon.install.blocked\" | \"daemon.reinstall.blocked\";\n}): void {\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n title: getDaemonDowngradeBlockedTitle(),\n rows: [\n {\n label: \"🏷️ Installed\",\n value: `v${input.installedVersion}`,\n },\n {\n label: \"💻 This CLI\",\n value: `v${input.requestedVersion}`,\n },\n {\n label: \"💡 What to do\",\n value: formatDaemonServiceDowngradeBlockedRecommendation({\n installedVersion: input.installedVersion,\n expectedVersion: input.requestedVersion,\n }),\n },\n {\n label: \"🔍 Next\",\n value: formatDaemonDowngradeBlockedNextStep(),\n },\n ],\n });\n}\n\nexport function emitDaemonInstallDowngradeBlocked(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: string;\n json: boolean;\n downgradeBlock: { installedVersion: string; requestedVersion: string };\n}): void {\n const { downgradeBlock } = input;\n if (input.json) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.install\",\n status: \"downgrade_blocked\",\n installedVersion: downgradeBlock.installedVersion,\n requestedVersion: downgradeBlock.requestedVersion,\n upgradeCommand: \"openmeld upgrade\",\n });\n return;\n }\n if (input.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"daemon.install.result\",\n payload: {\n status: \"downgrade_blocked\",\n installedVersion: downgradeBlock.installedVersion,\n requestedVersion: downgradeBlock.requestedVersion,\n upgradeCommand: \"openmeld upgrade\",\n },\n });\n return;\n }\n emitDaemonDowngradeBlocked({\n presenter: input.presenter,\n installedVersion: downgradeBlock.installedVersion,\n requestedVersion: downgradeBlock.requestedVersion,\n codePrefix: \"daemon.install.blocked\",\n });\n}\n\nexport function summarizeDaemonReinstallJournalResult(\n outcome: DaemonReinstallOutcome\n): {\n metadata?: Record<string, unknown>;\n result: string;\n} {\n return {\n result: outcome.ok ? outcome.result : outcome.result,\n metadata: {\n ok: outcome.ok,\n ...(\"failureStage\" in outcome && outcome.failureStage\n ? { failureStage: outcome.failureStage }\n : {}),\n ...(\"errorMessage\" in outcome\n ? { errorMessage: outcome.errorMessage }\n : {}),\n ...(\"reasonCodes\" in outcome && outcome.reasonCodes.length > 0\n ? { reasonCodes: outcome.reasonCodes }\n : {}),\n },\n };\n}\n\nexport function buildDaemonReinstallUnexpectedStartSummary(\n _error: unknown,\n action: DaemonServiceMaintenanceAction = \"repair\"\n): string {\n const actionLabel = formatDaemonServiceMaintenanceActionLabel(action);\n return `OpenMeld Service couldn't start after the ${actionLabel}.`;\n}\n\nexport function buildDaemonReinstallUnexpectedStartNextStep(\n action: DaemonServiceMaintenanceAction = \"repair\"\n): string {\n return formatInlineOpenMeldCliCommands(\n `Run \\`${formatDaemonServiceMaintenanceCommand(\n action\n )}\\` once. OpenMeld saved the latest local service log at \\`${getDaemonSystemServiceLogPath()}\\` for diagnostics.`\n );\n}\n\nexport function buildDaemonReinstallStartBlockedWhyText(\n outcome: Extract<DaemonReinstallOutcome, { result: \"start_blocked\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n const forcedSuffix = outcome.forceUsed\n ? \" Force continue was used after graceful drain timed out.\"\n : \"\";\n const actionPast = formatDaemonServiceMaintenanceActionPast(action);\n switch (outcome.blockReason) {\n case \"authentication_required\":\n return `OpenMeld ${actionPast} OpenMeld Service, but background startup is blocked until this lane signs in to OpenMeld.${forcedSuffix}`;\n case \"authentication_environment_mismatch\":\n return `OpenMeld ${actionPast} OpenMeld Service, but background startup is blocked because this lane is signed in to a different OpenMeld environment.${forcedSuffix}`;\n case \"service_dependencies_unavailable\":\n return `OpenMeld ${actionPast} OpenMeld Service, but background startup is blocked because required OpenMeld dependencies are unavailable.${forcedSuffix}`;\n case \"cleanup_required\":\n return `OpenMeld ${actionPast} OpenMeld Service, but background startup is blocked because OpenMeld still detected conflicting local service state.${forcedSuffix}`;\n default: {\n const unexpectedBlockReason: never = outcome.blockReason;\n throw new Error(\n `Unexpected daemon reinstall start block reason: ${String(unexpectedBlockReason)}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallStartBlockedCurrentStateText(\n outcome: Extract<DaemonReinstallOutcome, { result: \"start_blocked\" }>\n): string {\n switch (outcome.blockReason) {\n case \"authentication_required\":\n return \"OpenMeld Service is installed, but it is not running because this lane is not signed in.\";\n case \"authentication_environment_mismatch\":\n return \"OpenMeld Service is installed, but it is not running because this lane is signed in to a different OpenMeld environment.\";\n case \"service_dependencies_unavailable\":\n return \"OpenMeld Service is installed, but it is not running because required OpenMeld dependencies are unavailable.\";\n case \"cleanup_required\":\n return \"OpenMeld Service is installed, but it is not running because OpenMeld still detected conflicting local service state.\";\n default: {\n const unexpectedBlockReason: never = outcome.blockReason;\n throw new Error(\n `Unexpected daemon reinstall start block current-state reason: ${String(unexpectedBlockReason)}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallStartBlockedNextStep(\n outcome: Extract<DaemonReinstallOutcome, { result: \"start_blocked\" }>,\n action: DaemonServiceMaintenanceAction\n): string {\n switch (outcome.blockReason) {\n case \"authentication_required\":\n return formatInlineOpenMeldCliCommands(\n `Run \\`${formatOpenMeldCliCommand(\"openmeld login\")}\\` first, then \\`${formatOpenMeldCliCommand(\"openmeld service start\")}\\` to start OpenMeld Service in the background.`\n );\n case \"authentication_environment_mismatch\":\n return formatInlineOpenMeldCliCommands(\n `Run \\`${formatOpenMeldCliCommand(\"openmeld login\")}\\` for the correct OpenMeld environment, then \\`${formatOpenMeldCliCommand(\"openmeld service start\")}\\` again.`\n );\n case \"service_dependencies_unavailable\":\n return formatInlineOpenMeldCliCommands(\n `Start the required OpenMeld dependencies, then run \\`${formatOpenMeldCliCommand(\"openmeld service start\")}\\` again.`\n );\n case \"cleanup_required\":\n return formatInlineOpenMeldCliCommands(\n `Run \\`${formatOpenMeldCliCommand(\"openmeld service status\")}\\` to inspect the current cleanup guidance. If OpenMeld still reports a conflict, run \\`${formatOpenMeldCliCommand(formatDaemonServiceMaintenanceCommand(action))}\\` again.`\n );\n default: {\n const unexpectedBlockReason: never = outcome.blockReason;\n throw new Error(\n `Unexpected daemon reinstall start block next-step reason: ${String(unexpectedBlockReason)}`\n );\n }\n }\n}\n\nexport function buildDaemonReinstallStartFailureNextStep(\n action: DaemonServiceMaintenanceAction\n): string {\n return buildDaemonReinstallUnexpectedStartNextStep(action);\n}\n\nexport function createDaemonReinstallDrainTimeoutResult(\n waitMs: number\n): DaemonReinstallDrainTimeoutResult {\n return {\n ok: false,\n result: \"drain_timeout\",\n forceRequired: true,\n waitMs,\n };\n}\n","import type { SystemServiceStartupFailureVerdict } from \"./service-start-failure\";\n\nexport const DAEMON_RUN_ALREADY_RUNNING_REASON = \"already_running\";\n\nexport const LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON =\n \"service_already_running\";\n\nexport type DaemonRunAlreadyRunningReason =\n | typeof DAEMON_RUN_ALREADY_RUNNING_REASON\n | typeof LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON;\n\nexport type DaemonRunFailureReason =\n | DaemonRunAlreadyRunningReason\n | \"cancelled\"\n | \"cleanup_required\"\n | \"authentication_required\"\n | \"authentication_environment_mismatch\"\n | \"service_dependencies_unavailable\"\n | \"start_failed\";\n\nexport type DaemonRunReason = \"started\" | DaemonRunFailureReason;\n\nexport type NormalizedDaemonRunReason = Exclude<\n DaemonRunReason,\n typeof LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON\n>;\n\nexport type DaemonRunResult =\n | {\n ok: true;\n reason: \"started\" | DaemonRunAlreadyRunningReason;\n }\n | {\n ok: false;\n reason: Exclude<DaemonRunFailureReason, DaemonRunAlreadyRunningReason>;\n // Presentation-only startup-failure verdict captured before a silent\n // reinstall start discards the underlying SystemServiceStartupTimeoutError.\n // Lets callers preserve startup evidence and rebuild the failure card.\n startFailureVerdict?: SystemServiceStartupFailureVerdict | null;\n };\n\nexport function normalizeDaemonRunReason(\n reason: DaemonRunReason\n): NormalizedDaemonRunReason {\n return reason === LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON\n ? DAEMON_RUN_ALREADY_RUNNING_REASON\n : reason;\n}\n\nexport function isDaemonRunAlreadyRunningReason(\n reason: DaemonRunReason\n): boolean {\n return normalizeDaemonRunReason(reason) === DAEMON_RUN_ALREADY_RUNNING_REASON;\n}\n\nexport function createDaemonAlreadyRunningResult(): Extract<\n DaemonRunResult,\n { ok: true }\n> {\n return {\n ok: true,\n reason: LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON,\n };\n}\n","export const ROOT_ERROR_PATTERN =\n /\\s*Try re-running the command as root for richer errors\\.?/i;\n\nexport function sanitizeSystemServiceErrorMessage(message: string): string {\n return message.replace(ROOT_ERROR_PATTERN, \"\");\n}\n","import type { LocalMachineIssue } from \"@openmeld/schemas\";\nimport { toErrorMessage } from \"@openmeld/utils\";\nimport {\n type DaemonServiceRuntimeStatus,\n daemonLifecycleJournalPath,\n} from \"../config/daemon-state\";\nimport type {\n DaemonServiceAnomalyCode,\n DaemonServiceInventory,\n inspectDaemonServiceInventory,\n} from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n type DaemonServiceJobDiagnostics,\n type DaemonServiceManager,\n type DaemonServiceManagerRuntimeStatus,\n formatDaemonServiceJobDiagnosticsEvidence,\n getDaemonServiceLaunchdLabel,\n getDaemonSystemServiceLogPath,\n isDaemonServiceJobSpawnPending,\n readDaemonServiceJobCrashExitCode,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n isDaemonInventoryRunningAndStartReady as isDaemonInventoryRunningAndStartReadyWithBlockers,\n isSystemServiceStartupTimeoutError as isStartupTimeoutError,\n waitForSystemServiceStartup as waitForSystemServiceStartupWithPredicate,\n} from \"../local-service/lifecycle/daemon-service-startup-wait\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommand,\n formatOpenMeldCliTextBlock,\n} from \"../runtime/cli-entry-command\";\nimport {\n assessLocalMachineFailure,\n createServiceSpawnPendingIssue,\n} from \"../system/local-machine-recovery\";\nimport { buildDaemonStartNeedsAttentionCard } from \"../system/local-service-start-decision\";\nimport { sanitizeSystemServiceErrorMessage } from \"./service-error-text\";\n\nexport const DAEMON_STARTUP_BLOCKING_ANOMALIES =\n new Set<DaemonServiceAnomalyCode>([\n \"duplicate_owned_processes\",\n \"multiple_active_owners\",\n \"runtime_bundle_mismatch\",\n \"runtime_contract_mismatch\",\n ]);\n\nexport type SystemServiceStartupFailureReport = {\n title: string;\n summary: string;\n rows: Array<{ label: string; value: string }>;\n};\n\nexport type SystemServiceStartupRecoveryReport = {\n attempted: boolean;\n reasonCodes: DaemonServiceAnomalyCode[];\n preflightStatus?: string;\n retryStarted?: boolean;\n failureMessage?: string;\n};\n\nexport type SystemServiceStartupRecoveryOutcome =\n | {\n recovered: true;\n autoRepairAttempted: boolean;\n recovery: SystemServiceStartupRecoveryReport;\n startupStatus: Awaited<ReturnType<typeof waitForSystemServiceStartup>>;\n }\n | {\n recovered: false;\n error: unknown;\n recovery: SystemServiceStartupRecoveryReport | null;\n };\n\n// Presentation-only verdict distilled from a failed service startup. It carries\n// exactly what the failure card needs (controller, launchd job diagnostics, the\n// sanitized error message, and any explicit detail) so the card can be rebuilt\n// far from the original error object — e.g. after a silent reinstall start has\n// already discarded the SystemServiceStartupTimeoutError. Diagnostic evidence\n// only: it must never gate readiness, availability, or lifecycle decisions.\nexport type SystemServiceStartupFailureVerdict = {\n controller: DaemonServiceManager[\"controller\"];\n jobDiagnostics: DaemonServiceJobDiagnostics | null;\n localMachineIssue: LocalMachineIssue | null;\n message: string;\n detail: string | null;\n};\n\nexport type DaemonBackgroundStartFailure = {\n outcome: \"failed_with_card\";\n errorMessage: string;\n localMachineIssue?: LocalMachineIssue;\n};\n\n// Keep evidence in the returned value even when a caller suppresses output.\n// Account recovery persists this message; printing a card is not propagation.\nexport function buildDaemonBackgroundStartFailure(\n verdict: SystemServiceStartupFailureVerdict | null\n): DaemonBackgroundStartFailure {\n const report = verdict\n ? buildSystemServiceStartupFailureReportFromVerdict(verdict)\n : null;\n const evidence = verdict?.jobDiagnostics\n ? formatDaemonServiceJobDiagnosticsEvidence(verdict.jobDiagnostics)\n : null;\n return {\n outcome: \"failed_with_card\",\n errorMessage: [\n report?.summary ?? \"OpenMeld could not finish starting OpenMeld Service.\",\n verdict?.message,\n evidence && !verdict?.message.includes(evidence) ? evidence : null,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n ...(verdict?.localMachineIssue\n ? { localMachineIssue: verdict.localMachineIssue }\n : {}),\n };\n}\n\nfunction resolveStartupLocalMachineIssue(input: {\n assessedIssue: LocalMachineIssue;\n jobDiagnostics: DaemonServiceJobDiagnostics | null;\n}): LocalMachineIssue | null {\n if (\n input.jobDiagnostics &&\n isDaemonServiceJobSpawnPending(input.jobDiagnostics)\n ) {\n return createServiceSpawnPendingIssue({\n detail: formatDaemonServiceJobDiagnosticsEvidence(input.jobDiagnostics),\n });\n }\n if (input.assessedIssue.code === \"local_machine.failure.unknown\") {\n return null;\n }\n return input.assessedIssue;\n}\n\nexport function resolveSystemServiceStartupFailureVerdict(input: {\n controller: DaemonServiceManager[\"controller\"];\n error: unknown;\n detail?: string | null;\n}): SystemServiceStartupFailureVerdict {\n const jobDiagnostics = isStartupTimeoutError(input.error)\n ? (input.error.jobDiagnostics ?? null)\n : null;\n const assessedIssue = assessLocalMachineFailure({\n operation: \"start_background_service\",\n error: input.error,\n });\n const localMachineIssue = resolveStartupLocalMachineIssue({\n assessedIssue,\n jobDiagnostics,\n });\n return {\n controller: input.controller,\n jobDiagnostics,\n localMachineIssue,\n message: sanitizeSystemServiceErrorMessage(toErrorMessage(input.error)),\n detail: input.detail ?? null,\n };\n}\n\nexport function buildSystemServiceStartupFailureReport(input: {\n controller: DaemonServiceManager[\"controller\"];\n error: unknown;\n autoRepairAttempted?: boolean;\n detail?: string | null;\n}): SystemServiceStartupFailureReport {\n return buildSystemServiceStartupFailureReportFromVerdict(\n resolveSystemServiceStartupFailureVerdict({\n controller: input.controller,\n error: input.error,\n detail: input.detail,\n }),\n { autoRepairAttempted: input.autoRepairAttempted }\n );\n}\n\nexport function buildSystemServiceStartupFailureReportFromVerdict(\n verdict: SystemServiceStartupFailureVerdict,\n options?: { autoRepairAttempted?: boolean }\n): SystemServiceStartupFailureReport {\n const autoRepairAttempted = options?.autoRepairAttempted;\n const { message, jobDiagnostics, localMachineIssue } = verdict;\n if (localMachineIssue) {\n const card = buildDaemonStartNeedsAttentionCard({\n summary: localMachineIssue.summary,\n nextStep: localMachineIssue.primaryAction ?? \"Open diagnostics.\",\n autoRepairAttempted,\n });\n return {\n title: card.title,\n summary: localMachineIssue.summary,\n rows: card.rows,\n };\n }\n const crashExitCode = jobDiagnostics\n ? readDaemonServiceJobCrashExitCode(jobDiagnostics)\n : null;\n if (jobDiagnostics && crashExitCode !== null) {\n const summary = \"OpenMeld Service keeps stopping after it starts.\";\n const card = buildDaemonStartNeedsAttentionCard({\n summary,\n nextStep: formatInlineOpenMeldCliCommands(\n \"Run `openmeld service repair` once. OpenMeld saved the startup evidence for diagnostics.\"\n ),\n autoRepairAttempted,\n });\n return {\n title: card.title,\n summary,\n rows: card.rows,\n };\n }\n if (isLaunchdBootstrapIosError(message)) {\n const launchdLabel = getDaemonServiceLaunchdLabel();\n const card = buildDaemonStartNeedsAttentionCard({\n summary:\n \"OpenMeld could not finish starting OpenMeld Service on this Mac.\",\n nextStep: formatInlineOpenMeldCliCommands(\n `Run \\`launchctl enable gui/$(id -u)/${launchdLabel}\\`, then run \\`openmeld service start\\` again.`\n ),\n autoRepairAttempted,\n });\n return {\n title: card.title,\n summary:\n \"OpenMeld could not finish starting OpenMeld Service on this Mac.\",\n rows: card.rows,\n };\n }\n if (isPermissionOrAuthorizationError(message)) {\n const card = buildDaemonStartNeedsAttentionCard({\n summary:\n \"OpenMeld needs local OS permission before it can start OpenMeld Service.\",\n nextStep: formatInlineOpenMeldCliCommands(\n \"Approve the local permission prompt, then run `openmeld service start` again.\"\n ),\n autoRepairAttempted,\n });\n return {\n title: card.title,\n summary:\n \"OpenMeld needs local OS permission before it can start OpenMeld Service.\",\n rows: card.rows,\n };\n }\n const card = buildDaemonStartNeedsAttentionCard({\n summary: \"OpenMeld could not finish starting OpenMeld Service.\",\n nextStep: formatInlineOpenMeldCliCommands(\n \"Run `openmeld service repair` once. OpenMeld saved the startup evidence for diagnostics.\"\n ),\n autoRepairAttempted,\n });\n return {\n title: card.title,\n summary: `OpenMeld could not finish starting OpenMeld Service (${verdict.controller}).`,\n rows: card.rows,\n };\n}\n\nexport function buildSystemServiceStartupFailureMessage(input: {\n controller: DaemonServiceManager[\"controller\"];\n error: unknown;\n autoRepairAttempted?: boolean;\n detail?: string | null;\n}): string {\n const report = buildSystemServiceStartupFailureReport(input);\n const rowLines = report.rows\n .map((row) => formatSystemServiceFailureRow(row))\n .filter((line) => line.length > 0);\n return [report.summary, ...rowLines].join(\"\\n\");\n}\n\nexport function buildSystemServiceStartupFailureDiagnostics(input: {\n autoRepairAttempted?: boolean;\n controller?: DaemonServiceManager[\"controller\"];\n error: unknown;\n recovery: SystemServiceStartupRecoveryReport | null;\n}): {\n anomalies: DaemonServiceInventory[\"anomalies\"];\n autoRepairAttempted: boolean;\n controller: DaemonServiceManager[\"controller\"] | null;\n jobDiagnostics: DaemonServiceJobDiagnostics | null;\n localMachineIssue: LocalMachineIssue | null;\n launchdLabel: string | null;\n lifecycleJournalPath: string;\n managerStatus: DaemonServiceManagerRuntimeStatus | null;\n nextSteps: string[];\n recovery: SystemServiceStartupRecoveryReport | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n serviceLogPath: string;\n} {\n const timeoutError = isStartupTimeoutError(input.error) ? input.error : null;\n const localMachineIssue = input.controller\n ? resolveSystemServiceStartupFailureVerdict({\n controller: input.controller,\n error: input.error,\n }).localMachineIssue\n : null;\n return {\n anomalies: timeoutError?.inventory?.anomalies ?? [],\n autoRepairAttempted: input.autoRepairAttempted === true,\n controller: input.controller ?? null,\n jobDiagnostics: timeoutError?.jobDiagnostics ?? null,\n localMachineIssue,\n launchdLabel:\n (input.controller ?? null) === \"launchd\"\n ? getDaemonServiceLaunchdLabel()\n : null,\n lifecycleJournalPath: daemonLifecycleJournalPath(),\n managerStatus: timeoutError?.managerStatus ?? null,\n nextSteps: localMachineIssue?.primaryAction\n ? [localMachineIssue.primaryAction]\n : [formatOpenMeldCliCommand(\"openmeld service repair\")],\n recovery: input.recovery,\n runtimeStatus: timeoutError?.runtimeStatus ?? null,\n serviceLogPath: getDaemonSystemServiceLogPath(),\n };\n}\n\nexport function formatSystemServiceFailureRow(row: {\n label: string;\n value: string;\n}): string {\n const label = row.label.trim();\n const value = formatOpenMeldCliTextBlock(row.value).trim();\n if (label.length === 0 && value.length === 0) {\n return \"\";\n }\n if (value.length === 0) {\n return `${row.label}:`;\n }\n if (label.length === 0) {\n return row.value;\n }\n return `${row.label}: ${row.value}`;\n}\n\nexport function isLaunchdBootstrapIosError(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"bootstrap failed\") &&\n normalized.includes(\"input/output error\")\n );\n}\n\nexport function isPermissionOrAuthorizationError(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"permission\") ||\n normalized.includes(\"operation not permitted\") ||\n normalized.includes(\"access is denied\") ||\n normalized.includes(\"requires admin\") ||\n normalized.includes(\"elevation\") ||\n normalized.includes(\"access denied\") ||\n normalized.includes(\"not authorized\")\n );\n}\n\nexport function isDaemonInventoryRunningAndStartReady(\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>\n): boolean {\n return isDaemonInventoryRunningAndStartReadyWithBlockers(\n inventory,\n DAEMON_STARTUP_BLOCKING_ANOMALIES\n );\n}\n\nexport async function waitForSystemServiceStartup(input: {\n expectedVersion: string;\n manager: DaemonServiceManager;\n waitMs: number;\n pollMs: number;\n}): Promise<{\n state: \"running\";\n runtimeStatus: DaemonServiceRuntimeStatus;\n}> {\n return await waitForSystemServiceStartupWithPredicate({\n ...input,\n isReady: isDaemonInventoryRunningAndStartReady,\n });\n}\n","import { confirm } from \"@clack/prompts\";\nimport { toErrorMessage } from \"@openmeld/utils\";\nimport {\n clearDaemonServiceRuntimeState,\n type DaemonServiceRuntimeStatus,\n} from \"../config/daemon-state\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../local-service/control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../local-service/core/constants\";\nimport {\n emitDaemonLifecycleEvent,\n runDaemonServiceManagerAction,\n} from \"../local-service/lifecycle/daemon-lifecycle-journal\";\nimport { disableDaemonServiceAutostartIfConfigured } from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n type DaemonOwnerSnapshot,\n hasActiveDaemonOwners,\n readCurrentDaemonOwnerSnapshot,\n resolveDaemonStopStrategy,\n summarizeDaemonOwnerSnapshot,\n} from \"../local-service/lifecycle/daemon-service-owner-snapshot\";\nimport { waitForDaemonSystemServiceToStop as waitForSystemServiceToStop } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { formatInlineOpenMeldCliCommands } from \"../runtime/cli-entry-command\";\nimport type { RuntimeContext, resolveRuntimeContext } from \"../runtime/context\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { describeDaemonRuntimeStatus } from \"./service-status-view\";\n\nexport const STOP_WAIT_MS = 2000;\n\nexport const STOP_POLL_INTERVAL_MS = 200;\n\nexport const SERVICE_STOP_CHECK_MS = 3000;\n\nexport const SERVICE_STOP_POLL_MS = 200;\n\nexport type SharedDaemonStopMode = \"interactive\" | \"best_effort\";\n\nexport type SharedDaemonStopResult =\n | {\n status: \"stopped\";\n pid: number | null;\n signal: NodeJS.Signals | \"system\";\n forcedAfterTimeout?: boolean;\n }\n | {\n status: \"not_running\";\n runtimeStatus: DaemonServiceRuntimeStatus;\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"warning\";\n pid: number | null;\n reason:\n | \"invalid_state\"\n | \"process_timeout\"\n | \"stop_failed\"\n | \"system_timeout\";\n runtimeStatus: DaemonServiceRuntimeStatus;\n errorMessage?: string;\n };\n\nexport function summarizeDaemonStopJournalResult(\n stopResult: SharedDaemonStopResult\n): {\n metadata?: Record<string, unknown>;\n result: string;\n} {\n switch (stopResult.status) {\n case \"stopped\":\n return {\n result: \"stopped\",\n metadata: {\n forcedAfterTimeout: stopResult.forcedAfterTimeout ?? false,\n pid: stopResult.pid,\n signal: stopResult.signal,\n },\n };\n case \"not_running\":\n return {\n result: \"not_running\",\n metadata: {\n runtimeStatus: stopResult.runtimeStatus.status,\n },\n };\n case \"cancelled\":\n return {\n result: \"cancelled\",\n };\n case \"warning\":\n return {\n result: \"warning\",\n metadata: {\n errorMessage: stopResult.errorMessage ?? null,\n pid: stopResult.pid,\n reason: stopResult.reason,\n runtimeStatus: stopResult.runtimeStatus.status,\n },\n };\n default:\n return {\n result: \"unknown\",\n };\n }\n}\n\nexport async function stopCurrentLaneDaemonService(input: {\n /** Internal completion evidence from the account-admitted drain, under the lifecycle lock. */\n completedControlledShutdownOwnerPid?: number;\n force?: boolean;\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n}): Promise<SharedDaemonStopResult> {\n const context = await loadCurrentLaneDaemonStopContext();\n if (\n input.completedControlledShutdownOwnerPid !== undefined &&\n ((context.ownerSnapshot.runtimeStatus.pid !== null &&\n context.ownerSnapshot.runtimeStatus.pid !==\n input.completedControlledShutdownOwnerPid) ||\n context.ownerSnapshot.ownedProcesses.some(\n (process) => process.pid !== input.completedControlledShutdownOwnerPid\n ))\n ) {\n throw new Error(\n \"The Service owner changed after controlled shutdown. Check its status before trying again.\"\n );\n }\n await emitDaemonLifecycleEvent({\n type: \"owner.snapshot\",\n result: \"observed\",\n metadata: summarizeDaemonOwnerSnapshot(context.ownerSnapshot),\n command: \"openmeld service stop\",\n intent: \"stop\",\n });\n await emitDaemonLifecycleEvent({\n type: \"stop.strategy.selected\",\n result: context.stopStrategy.kind,\n metadata: {\n reason: context.stopStrategy.reason,\n requiresResidualProcessCleanup:\n context.stopStrategy.requiresResidualProcessCleanup,\n },\n command: \"openmeld service stop\",\n intent: \"stop\",\n });\n\n if (context.stopStrategy.kind === \"not_running\") {\n return await buildDaemonStopNotRunningResult(\n context.ownerSnapshot.runtimeStatus\n );\n }\n if (context.stopStrategy.kind === \"manager_first\") {\n return await stopManagedCurrentLaneDaemonService({\n controlledShutdownComplete:\n input.completedControlledShutdownOwnerPid !== undefined,\n force: input.force,\n mode: input.mode,\n ownerSnapshot: context.ownerSnapshot,\n runtime: input.runtime,\n });\n }\n if (context.stopStrategy.kind === \"process_then_manager_cleanup\") {\n return await stopCurrentLaneDaemonProcessThenManagerCleanup({\n force: input.force,\n mode: input.mode,\n ownerSnapshot: context.ownerSnapshot,\n runtime: input.runtime,\n });\n }\n return await stopCurrentLaneDaemonProcess({\n force: input.force,\n mode: input.mode,\n runtime: input.runtime,\n runtimeStatus: context.ownerSnapshot.runtimeStatus,\n });\n}\n\nexport const handleDaemonNotRunningStopStatus = async (\n runtime: RuntimeContext,\n presenter: ReturnType<typeof createPresenter>,\n runtimeStatus: DaemonServiceRuntimeStatus\n): Promise<void> => {\n if (runtimeStatus.status === \"stale\") {\n await clearDaemonServiceRuntimeState();\n }\n const payload = {\n ok: false,\n reason: \"service_not_running\",\n status: runtimeStatus,\n } as const;\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.stop.not_running\",\n payload,\n });\n return;\n }\n\n presenter.line({\n code: \"daemon.stop.not_running\",\n text: describeDaemonRuntimeStatus(runtimeStatus),\n });\n};\n\nexport const emitDaemonStopCancelled = (\n runtime: RuntimeContext,\n presenter: ReturnType<typeof createPresenter>\n): void => {\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.stop.cancelled\",\n payload: {\n ok: false,\n reason: \"user_cancelled\",\n },\n });\n return;\n }\n\n presenter.line({\n code: \"daemon.stop.cancelled\",\n text: \"Service stop was cancelled.\",\n });\n};\n\nexport async function loadCurrentLaneDaemonStopContext(): Promise<{\n ownerSnapshot: DaemonOwnerSnapshot;\n stopStrategy: ReturnType<typeof resolveDaemonStopStrategy>;\n}> {\n const ownerSnapshot = await readCurrentDaemonOwnerSnapshot();\n return {\n ownerSnapshot,\n stopStrategy: resolveDaemonStopStrategy(ownerSnapshot),\n };\n}\n\nexport async function buildDaemonStopNotRunningResult(\n runtimeStatus: DaemonServiceRuntimeStatus\n): Promise<SharedDaemonStopResult> {\n if (runtimeStatus.status === \"stale\") {\n await clearDaemonServiceRuntimeState();\n }\n return {\n status: \"not_running\",\n runtimeStatus,\n };\n}\n\nexport async function stopManagedCurrentLaneDaemonService(input: {\n controlledShutdownComplete?: boolean;\n force?: boolean;\n mode: SharedDaemonStopMode;\n ownerSnapshot: DaemonOwnerSnapshot;\n runtime: RuntimeContext;\n}): Promise<SharedDaemonStopResult> {\n if (!input.ownerSnapshot.serviceManager) {\n const invalidManagerResult = await stopRegisteredDaemonServiceManager({\n force: input.force,\n mode: input.mode,\n ownerSnapshot: input.ownerSnapshot,\n runtime: input.runtime,\n });\n if (invalidManagerResult) {\n return invalidManagerResult;\n }\n }\n\n if (input.mode === \"interactive\") {\n const shouldStop = await confirmStopServiceManager(\n input.runtime,\n input.ownerSnapshot.runtimeStatus\n );\n if (!shouldStop) {\n return {\n status: \"cancelled\",\n };\n }\n }\n\n const drainPreparationResult = input.controlledShutdownComplete\n ? null\n : await prepareManagedDaemonServiceForStop({\n force: input.force,\n mode: input.mode,\n ownerSnapshot: input.ownerSnapshot,\n });\n if (drainPreparationResult) {\n return drainPreparationResult;\n }\n\n const managerCleanupResult = await stopRegisteredDaemonServiceManager({\n force: input.force,\n mode: input.mode,\n ownerSnapshot: input.ownerSnapshot,\n runtime: input.runtime,\n skipConfirmation: true,\n });\n if (managerCleanupResult) {\n return managerCleanupResult;\n }\n\n await clearDaemonServiceRuntimeState();\n return {\n status: \"stopped\",\n pid: input.ownerSnapshot.runtimeStatus.pid,\n signal: \"system\",\n };\n}\n\nasync function prepareManagedDaemonServiceForStop(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n ownerSnapshot: DaemonOwnerSnapshot;\n}): Promise<Extract<SharedDaemonStopResult, { status: \"warning\" }> | null> {\n const serviceManager = input.ownerSnapshot.serviceManager;\n if (!serviceManager) {\n return null;\n }\n\n const shouldRestoreAutostart =\n await disableDaemonServiceAutostartIfConfigured({\n manager: serviceManager,\n status: input.ownerSnapshot.serviceManagerStatus,\n });\n if (input.force === true) {\n return null;\n }\n\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n gracePeriodMs: STOP_WAIT_MS,\n mode: \"graceful\",\n },\n // Bound the control request so a half-open legacy socket cannot park the\n // command forever. This command still never force-kills without an\n // explicit --force request.\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n await emitDaemonLifecycleEvent({\n command: \"openmeld service stop\",\n intent: \"stop\",\n metadata: {\n accepted: shutdown.accepted,\n gracePeriodMs: shutdown.gracePeriodMs,\n mode: shutdown.mode,\n },\n result: shutdown.accepted ? \"completed\" : \"unsupported\",\n stopCause: \"user_stop\",\n type: \"stop.controlled_drain\",\n });\n return null;\n } catch (error) {\n const isLegacyShutdownContract =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.contract_mismatch\";\n const isManagerRunningWithoutRuntime =\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === \"daemon.control.endpoint_missing\" &&\n input.ownerSnapshot.runtimeStatus.status !== \"running\" &&\n input.ownerSnapshot.ownedProcesses.length === 0;\n const isCompatibilityFallback =\n isLegacyShutdownContract || isManagerRunningWithoutRuntime;\n await emitDaemonLifecycleEvent({\n command: \"openmeld service stop\",\n intent: \"stop\",\n metadata: {\n compatibilityFallback: isCompatibilityFallback,\n ...(isManagerRunningWithoutRuntime\n ? { compatibilityReason: \"manager_running_without_runtime\" }\n : {}),\n errorMessage: toErrorMessage(error),\n },\n result: isCompatibilityFallback ? \"fallback\" : \"failed\",\n stopCause: \"user_stop\",\n type: \"stop.controlled_drain\",\n });\n if (isCompatibilityFallback) {\n return null;\n }\n\n let errorMessage = toErrorMessage(error);\n if (shouldRestoreAutostart) {\n try {\n await serviceManager.enableAutostart();\n } catch (restoreError) {\n errorMessage = `${errorMessage}; failed to restore service autostart: ${toErrorMessage(restoreError)}`;\n }\n }\n if (input.mode !== \"best_effort\") {\n throw new Error(\n `OpenMeld Service stayed running because its final offline status could not be delivered: ${errorMessage}`\n );\n }\n return buildDaemonStopWarningResult({\n reason: \"stop_failed\",\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n errorMessage,\n });\n }\n}\n\nexport async function stopCurrentLaneDaemonProcessThenManagerCleanup(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n ownerSnapshot: DaemonOwnerSnapshot;\n runtime: RuntimeContext;\n}): Promise<SharedDaemonStopResult> {\n const processStopResult = await stopCurrentLaneDaemonProcess({\n force: input.force,\n mode: input.mode,\n runtime: input.runtime,\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n });\n if (processStopResult.status !== \"stopped\") {\n return processStopResult;\n }\n\n const managerCleanupResult = await stopRegisteredDaemonServiceManager({\n force: input.force,\n mode: input.mode,\n ownerSnapshot: input.ownerSnapshot,\n runtime: input.runtime,\n skipConfirmation: true,\n });\n if (managerCleanupResult) {\n return managerCleanupResult;\n }\n\n return processStopResult;\n}\n\nexport async function stopRegisteredDaemonServiceManager(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n ownerSnapshot: DaemonOwnerSnapshot;\n runtime: RuntimeContext;\n skipConfirmation?: boolean;\n}): Promise<Extract<\n SharedDaemonStopResult,\n { status: \"warning\" | \"cancelled\" }\n> | null> {\n if (!input.ownerSnapshot.serviceManager) {\n if (input.mode !== \"best_effort\") {\n throw new Error(\n \"OpenMeld found system service registration, but the local service manager is unavailable.\"\n );\n }\n return buildDaemonStopWarningResult({\n reason: \"invalid_state\",\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n errorMessage:\n \"system service registration is present, but the local service manager could not be resolved\",\n });\n }\n if (input.mode === \"interactive\" && input.skipConfirmation !== true) {\n const shouldStop = await confirmStopServiceManager(\n input.runtime,\n input.ownerSnapshot.runtimeStatus\n );\n if (!shouldStop) {\n return {\n status: \"cancelled\",\n };\n }\n }\n\n try {\n await runDaemonServiceManagerAction({\n action: \"stop\",\n command: \"openmeld service stop\",\n controller: input.ownerSnapshot.serviceManager.controller,\n intent: \"stop\",\n metadata: {\n ownerSetSummary: input.ownerSnapshot.ownerSetSummary,\n },\n run: async () => await input.ownerSnapshot.serviceManager?.stop(),\n });\n } catch (error) {\n if (input.mode !== \"best_effort\") {\n throw new Error(\n `Failed to stop system service (${input.ownerSnapshot.runtimeStatus.serviceController}): ${toErrorMessage(error)}`\n );\n }\n return buildDaemonStopWarningResult({\n reason: \"stop_failed\",\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n errorMessage: toErrorMessage(error),\n });\n }\n\n const stopped = await waitForSystemServiceToStop({\n manager: input.ownerSnapshot.serviceManager,\n waitMs: SERVICE_STOP_CHECK_MS,\n pollMs: SERVICE_STOP_POLL_MS,\n });\n if (!stopped) {\n const finalOwnerSnapshot = await readCurrentDaemonOwnerSnapshot();\n if (\n hasDifferentActiveDaemonOwnerAfterSystemStop(\n input.ownerSnapshot,\n finalOwnerSnapshot\n )\n ) {\n return buildDaemonStopWarningResult({\n reason: \"stop_failed\",\n runtimeStatus: finalOwnerSnapshot.runtimeStatus,\n errorMessage:\n \"local service owners are still active after stopping the system service\",\n });\n }\n return buildDaemonStopWarningResult({\n reason: \"system_timeout\",\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n });\n }\n\n let residualCleanupResult: Awaited<\n ReturnType<typeof stopResidualDaemonProcessesAfterManagerStop>\n >;\n try {\n residualCleanupResult = await stopResidualDaemonProcessesAfterManagerStop({\n force: input.force,\n mode: input.mode,\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n });\n } catch (error) {\n if (input.mode !== \"best_effort\") {\n throw error;\n }\n return buildDaemonStopWarningResult({\n reason: \"stop_failed\",\n runtimeStatus: input.ownerSnapshot.runtimeStatus,\n errorMessage: toErrorMessage(error),\n });\n }\n\n const finalOwnerSnapshot = residualCleanupResult.shouldRefresh\n ? await readCurrentDaemonOwnerSnapshot()\n : residualCleanupResult.ownerSnapshot;\n if (\n hasActiveDaemonOwners(finalOwnerSnapshot) ||\n finalOwnerSnapshot.serviceManagerStatus?.enabled === true\n ) {\n return buildDaemonStopWarningResult({\n reason: \"stop_failed\",\n runtimeStatus: finalOwnerSnapshot.runtimeStatus,\n errorMessage:\n \"local service owners are still active after stopping the system service\",\n });\n }\n\n return null;\n}\n\nexport function hasDifferentActiveDaemonOwnerAfterSystemStop(\n initialOwnerSnapshot: DaemonOwnerSnapshot,\n finalOwnerSnapshot: DaemonOwnerSnapshot\n): boolean {\n if (!hasActiveDaemonOwners(finalOwnerSnapshot)) {\n return false;\n }\n if (\n finalOwnerSnapshot.activeOwnerKinds.some(\n (ownerKind) => ownerKind !== \"system_service\"\n )\n ) {\n return true;\n }\n const initialPid = initialOwnerSnapshot.runtimeStatus.pid;\n const finalPid = finalOwnerSnapshot.runtimeStatus.pid;\n return (\n finalOwnerSnapshot.runtimeStatus.status === \"running\" &&\n finalPid !== null &&\n initialPid !== null &&\n finalPid !== initialPid\n );\n}\n\nexport function buildDaemonStopWarningResult(input: {\n reason: Extract<SharedDaemonStopResult, { status: \"warning\" }>[\"reason\"];\n runtimeStatus: DaemonServiceRuntimeStatus;\n errorMessage?: string;\n}): Extract<SharedDaemonStopResult, { status: \"warning\" }> {\n return {\n status: \"warning\",\n pid: input.runtimeStatus.pid,\n reason: input.reason,\n runtimeStatus: input.runtimeStatus,\n ...(input.errorMessage ? { errorMessage: input.errorMessage } : {}),\n };\n}\n\nexport async function stopResidualDaemonProcessesAfterManagerStop(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): Promise<{\n ownerSnapshot: DaemonOwnerSnapshot;\n shouldRefresh: boolean;\n}> {\n const residualOwnerSnapshot = await readCurrentDaemonOwnerSnapshot();\n for (const processInfo of residualOwnerSnapshot.ownedProcesses) {\n const signal = input.force ? \"SIGKILL\" : \"SIGTERM\";\n const terminated = await stopTrackedDaemonProcess({\n pid: processInfo.pid,\n reason: \"residual_cleanup_after_manager_stop\",\n signal,\n });\n if (!terminated) {\n if (input.force) {\n continue;\n }\n throw new Error(\n `Residual OpenMeld-owned process pid=${String(processInfo.pid)} did not exit after ${signal}.`\n );\n }\n }\n return {\n ownerSnapshot: residualOwnerSnapshot,\n shouldRefresh: residualOwnerSnapshot.ownedProcesses.length > 0,\n };\n}\n\nexport async function stopCurrentLaneDaemonProcess(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): Promise<SharedDaemonStopResult> {\n const daemonPid = input.runtimeStatus.pid;\n if (daemonPid === null) {\n await clearDaemonServiceRuntimeState();\n return {\n status: \"warning\",\n pid: null,\n reason: \"invalid_state\",\n runtimeStatus: input.runtimeStatus,\n };\n }\n\n const stopSignal = await resolveDaemonStopSignal(input);\n if (!stopSignal) {\n return {\n status: \"cancelled\",\n };\n }\n\n try {\n return await requestDaemonProcessStop({\n daemonPid,\n runtime: input.runtime,\n runtimeStatus: input.runtimeStatus,\n stopSignal,\n mode: input.mode,\n });\n } catch (error) {\n if (input.mode !== \"best_effort\") {\n throw error;\n }\n return {\n status: \"warning\",\n pid: daemonPid,\n reason: \"stop_failed\",\n runtimeStatus: input.runtimeStatus,\n errorMessage: toErrorMessage(error),\n };\n }\n}\n\nexport async function resolveDaemonStopSignal(input: {\n force?: boolean;\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): Promise<NodeJS.Signals | null> {\n if (input.mode === \"interactive\") {\n return await confirmDaemonStopWithMode(\n input.runtime,\n input.runtimeStatus,\n input.force\n );\n }\n if (input.force) {\n return \"SIGKILL\";\n }\n return \"SIGTERM\";\n}\n\nexport async function requestDaemonProcessStop(input: {\n daemonPid: number;\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n runtimeStatus: DaemonServiceRuntimeStatus;\n stopSignal: NodeJS.Signals;\n}): Promise<SharedDaemonStopResult> {\n const terminated = await stopTrackedDaemonProcess({\n pid: input.daemonPid,\n reason: \"interactive_stop\",\n signal: input.stopSignal,\n });\n if (input.stopSignal === \"SIGTERM\" && !terminated) {\n return await handleDaemonProcessStopTimeout(input);\n }\n await clearDaemonServiceRuntimeState();\n return {\n status: \"stopped\",\n pid: input.daemonPid,\n signal: input.stopSignal,\n };\n}\n\nexport async function handleDaemonProcessStopTimeout(input: {\n daemonPid: number;\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): Promise<SharedDaemonStopResult> {\n if (shouldOfferForceKillAfterStopTimeout(input)) {\n const forceKill = await confirm({\n message: \"Service did not stop within timeout, force kill now?\",\n initialValue: true,\n });\n if (forceKill) {\n await stopTrackedDaemonProcess({\n pid: input.daemonPid,\n reason: \"interactive_force_kill_after_timeout\",\n signal: \"SIGKILL\",\n });\n await clearDaemonServiceRuntimeState();\n return {\n status: \"stopped\",\n pid: input.daemonPid,\n signal: \"SIGKILL\",\n forcedAfterTimeout: true,\n };\n }\n }\n return {\n status: \"warning\",\n pid: input.daemonPid,\n reason: \"process_timeout\",\n runtimeStatus: input.runtimeStatus,\n };\n}\n\nexport function shouldOfferForceKillAfterStopTimeout(input: {\n mode: SharedDaemonStopMode;\n runtime: RuntimeContext;\n}): boolean {\n return (\n input.mode === \"interactive\" &&\n input.runtime.resolvedView === \"human\" &&\n canUseInteractivePrompts(input.runtime)\n );\n}\n\nexport function buildDaemonStopSuccessText(\n input: Extract<SharedDaemonStopResult, { status: \"stopped\" }>\n): string {\n if (input.forcedAfterTimeout) {\n return `Service process (pid=${String(input.pid)}) was force killed.`;\n }\n if (input.signal === \"system\") {\n return \"System service has been stopped.\";\n }\n return `Service process (pid=${String(input.pid)}) stop request sent (${input.signal}).`;\n}\n\nexport function buildDaemonStopWarningText(\n input: Extract<SharedDaemonStopResult, { status: \"warning\" }>\n): string {\n if (input.reason === \"invalid_state\") {\n return \"Service runtime state is invalid. Please retry with service status and run stop again.\";\n }\n if (input.reason === \"system_timeout\") {\n return formatInlineOpenMeldCliCommands(\n \"System service is still stopping. Check again with `openmeld service status`.\"\n );\n }\n if (input.reason === \"process_timeout\") {\n return formatInlineOpenMeldCliCommands(\n `Service process (pid=${String(input.pid)}) did not exit after ${String(STOP_WAIT_MS)}ms. Run \\`openmeld service stop --force\\` to kill.`\n );\n }\n const detail = input.errorMessage ? ` ${input.errorMessage}` : \"\";\n return formatInlineOpenMeldCliCommands(\n `OpenMeld could not stop the local service cleanly.${detail} Run \\`openmeld service stop --force\\` and retry.`\n );\n}\n\nexport async function stopTrackedDaemonProcess(input: {\n pid: number;\n reason: string;\n signal: NodeJS.Signals;\n}): Promise<boolean> {\n try {\n const terminated = await stopDaemonProcess(input.pid, input.signal);\n await emitDaemonLifecycleEvent({\n type: \"process_stop.action\",\n result:\n input.signal === \"SIGTERM\" && !terminated ? \"timeout\" : \"completed\",\n metadata: {\n pid: input.pid,\n reason: input.reason,\n signal: input.signal,\n },\n command: \"openmeld service stop\",\n intent: \"stop\",\n });\n return terminated;\n } catch (error) {\n await emitDaemonLifecycleEvent({\n type: \"process_stop.action\",\n result: \"failed\",\n metadata: {\n errorMessage: toErrorMessage(error),\n pid: input.pid,\n reason: input.reason,\n signal: input.signal,\n },\n command: \"openmeld service stop\",\n intent: \"stop\",\n });\n throw error;\n }\n}\n\nexport async function confirmStopServiceManager(\n runtime: RuntimeContext,\n runtimeStatus: DaemonServiceRuntimeStatus\n): Promise<boolean> {\n if (!canUseInteractivePrompts(runtime)) {\n return true;\n }\n\n const confirmed = await confirm({\n message: `Service is running in ${runtimeStatus.mode ?? \"unknown\"} system mode. Stop service now?`,\n initialValue: true,\n });\n\n return confirmed === true;\n}\n\nexport async function confirmDaemonStopWithMode(\n runtimeContext: Awaited<ReturnType<typeof resolveRuntimeContext>>,\n runtimeStatus: DaemonServiceRuntimeStatus,\n force: boolean | undefined\n): Promise<NodeJS.Signals | null> {\n if (!canUseInteractivePrompts(runtimeContext)) {\n return force ? \"SIGKILL\" : \"SIGTERM\";\n }\n\n const doStop = await confirm({\n message: `Service is running in ${runtimeStatus.mode ?? \"unknown\"} mode (pid=${String(runtimeStatus.pid)}). Stop it now?`,\n initialValue: true,\n });\n if (doStop !== true) {\n return null;\n }\n\n if (force) {\n return \"SIGKILL\";\n }\n\n const shouldForceKill = await confirm({\n message:\n \"Force kill immediately? (recommended only if service does not stop cleanly)\",\n initialValue: false,\n });\n return shouldForceKill ? \"SIGKILL\" : \"SIGTERM\";\n}\n\nexport async function stopDaemonProcess(\n pid: number,\n signal: NodeJS.Signals\n): Promise<boolean> {\n try {\n process.kill(pid, signal);\n } catch (error) {\n if (isNodeErrorCode(error, \"ESRCH\")) {\n return true;\n }\n throw new Error(\n `Failed to send ${signal} to pid ${String(pid)}: ${toErrorMessage(error)}`\n );\n }\n\n if (signal === \"SIGKILL\") {\n return true;\n }\n\n return await waitForProcessToExit(pid);\n}\n\nexport async function waitForProcessToExit(pid: number): Promise<boolean> {\n const expiresAt = Date.now() + STOP_WAIT_MS;\n while (Date.now() < expiresAt) {\n if (!isPidAlive(pid)) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, STOP_POLL_INTERVAL_MS));\n }\n return !isPidAlive(pid);\n}\n\nexport function isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (isNodeErrorCode(error, \"ESRCH\")) {\n return false;\n }\n if (isNodeErrorCode(error, \"EPERM\")) {\n return true;\n }\n return false;\n }\n}\n\nexport function isNodeErrorCode(error: unknown, expectedCode: string): boolean {\n return (\n error instanceof Error &&\n typeof (error as NodeJS.ErrnoException).code === \"string\" &&\n (error as NodeJS.ErrnoException).code === expectedCode\n );\n}\n","import { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport type {\n clearDaemonServiceRuntimeState,\n DaemonServiceRuntimeStatus,\n getDaemonStatus,\n uninstallDaemon,\n withDaemonServiceRegistrationMutationLock,\n} from \"../config/daemon-state\";\nimport type { DaemonServiceFailureStage } from \"../local-service/lifecycle/daemon-service-evidence\";\nimport type {\n cleanupLegacySharedDaemonServiceState,\n LegacySharedDaemonServiceInspection,\n} from \"../local-service/lifecycle/daemon-service-legacy-shared\";\nimport type {\n DaemonServiceManager,\n DaemonServiceManagerRuntimeStatus,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport type { listDaemonOwnedProcesses } from \"../local-service/lifecycle/daemon-service-process-inventory\";\nimport {\n getEffectiveDaemonRuntimeStatus,\n type readCurrentObservedDaemonRuntimeStatus,\n type resolveDaemonServiceManagerForRuntimeState,\n type waitForDaemonSystemServiceToStop as waitForSystemServiceToStop,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport type { uninstallDaemonServiceUpdateWorker } from \"../local-service/lifecycle/daemon-service-update-worker-manager\";\nimport { formatInlineOpenMeldCliCommands } from \"../runtime/cli-entry-command\";\nimport {\n SERVICE_STOP_CHECK_MS,\n SERVICE_STOP_POLL_MS,\n type stopDaemonProcess,\n} from \"./service-stop-command\";\n\nconst STRICT_TEARDOWN_VERIFY_WAIT_MS = 15_000;\nconst STRICT_TEARDOWN_VERIFY_POLL_MS = 200;\n\nexport type DaemonTeardownReason = \"reset\" | \"service_uninstall\";\n\nexport type DaemonTeardownStrictInput = {\n removeInstallFiles?: boolean;\n reason: DaemonTeardownReason;\n};\n\nexport type DaemonTeardownStrictResult = {\n removed: boolean;\n stopSignal: NodeJS.Signals | \"system\" | null;\n systemServiceController: DaemonServiceManager[\"controller\"] | null;\n systemServiceUninstalled: boolean;\n};\n\nexport type DaemonTeardownStrictDependencies = {\n readCurrentObservedDaemonRuntimeStatus: typeof readCurrentObservedDaemonRuntimeStatus;\n getDaemonStatus: typeof getDaemonStatus;\n resolveDaemonServiceManagerForRuntimeState: typeof resolveDaemonServiceManagerForRuntimeState;\n clearDaemonServiceRuntimeState: typeof clearDaemonServiceRuntimeState;\n cleanupLegacySharedDaemonServiceState: typeof cleanupLegacySharedDaemonServiceState;\n listDaemonOwnedProcesses: typeof listDaemonOwnedProcesses;\n stopDaemonProcess: typeof stopDaemonProcess;\n waitForSystemServiceToStop: typeof waitForSystemServiceToStop;\n uninstallDaemon: typeof uninstallDaemon;\n uninstallServiceUpdateWorker: typeof uninstallDaemonServiceUpdateWorker;\n withRegistrationMutationLock: typeof withDaemonServiceRegistrationMutationLock;\n};\n\nexport type DaemonStrictTeardownContext = {\n runtimeStatus: DaemonServiceRuntimeStatus;\n serviceManager: DaemonServiceManager | null;\n serviceManagerStatus: DaemonServiceManagerRuntimeStatus | null;\n legacySharedService: LegacySharedDaemonServiceInspection | null;\n usesSystemService: boolean;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n};\n\nclass DaemonStrictTeardownError extends Error {\n readonly hint: string;\n readonly reason: DaemonTeardownReason;\n readonly stage: DaemonServiceFailureStage;\n\n constructor(input: {\n hint: string;\n message: string;\n reason: DaemonTeardownReason;\n stage: DaemonServiceFailureStage;\n }) {\n super(input.message);\n this.hint = input.hint;\n this.name = \"DaemonStrictTeardownError\";\n this.reason = input.reason;\n this.stage = input.stage;\n }\n}\n\nexport async function resolveDaemonStrictTeardownContext(input: {\n deps: DaemonTeardownStrictDependencies;\n reason: DaemonTeardownReason;\n}): Promise<DaemonStrictTeardownContext> {\n const status = await input.deps.getDaemonStatus();\n const runtimeStatus =\n await input.deps.readCurrentObservedDaemonRuntimeStatus();\n const { serviceManager, serviceManagerStatus, legacySharedService } =\n await input.deps.resolveDaemonServiceManagerForRuntimeState({\n runtimeState: runtimeStatus,\n status,\n });\n const usesSystemService =\n runtimeStatus.managedBySystemService ||\n serviceManagerStatus?.installed === true;\n if (runtimeStatus.managedBySystemService && !serviceManager) {\n throw createStrictTeardownError({\n reason: input.reason,\n message:\n \"runtime is marked as system-managed but service manager is unavailable\",\n hint: \"run `openmeld service status` and retry\",\n stage: \"pre-stop\",\n });\n }\n\n const effectiveRuntimeStatus = serviceManager\n ? getEffectiveDaemonRuntimeStatus({\n runtimeState: runtimeStatus,\n serviceManagerStatus,\n })\n : runtimeStatus.status;\n\n return {\n runtimeStatus,\n serviceManager,\n serviceManagerStatus,\n legacySharedService,\n usesSystemService,\n effectiveRuntimeStatus,\n };\n}\n\nexport async function stopDaemonForStrictTeardown(input: {\n context: DaemonStrictTeardownContext;\n deps: DaemonTeardownStrictDependencies;\n reason: DaemonTeardownReason;\n}): Promise<NodeJS.Signals | \"system\" | null> {\n if (!(input.context.usesSystemService && input.context.serviceManager)) {\n return await stopNonSystemDaemonForStrictTeardown(input);\n }\n\n if (\n input.context.effectiveRuntimeStatus !== \"running\" &&\n input.context.serviceManagerStatus?.running !== true\n ) {\n return null;\n }\n\n await input.context.serviceManager.stop().catch((error) => {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `failed to stop system service (${input.context.serviceManager?.controller}): ${toErrorMessage(error)}`,\n hint: \"run `openmeld service stop --force` and retry\",\n stage: \"stop-wait\",\n });\n });\n\n const stopped = await input.deps.waitForSystemServiceToStop({\n manager: input.context.serviceManager,\n waitMs: SERVICE_STOP_CHECK_MS,\n pollMs: SERVICE_STOP_POLL_MS,\n });\n if (!stopped) {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `system service (${input.context.serviceManager.controller}) is still running`,\n hint: \"run `openmeld service stop --force` and retry\",\n stage: \"stop-wait\",\n });\n }\n\n return \"system\";\n}\n\nexport async function stopNonSystemDaemonForStrictTeardown(input: {\n context: DaemonStrictTeardownContext;\n deps: DaemonTeardownStrictDependencies;\n reason: DaemonTeardownReason;\n}): Promise<NodeJS.Signals | null> {\n if (input.context.effectiveRuntimeStatus !== \"running\") {\n return null;\n }\n const daemonPid = input.context.runtimeStatus.pid;\n if (daemonPid === null) {\n throw createStrictTeardownError({\n reason: input.reason,\n message: \"runtime state is running but pid is missing\",\n hint: \"run `openmeld service status` and retry\",\n stage: \"pre-stop\",\n });\n }\n\n const terminated = await input.deps.stopDaemonProcess(daemonPid, \"SIGTERM\");\n if (terminated) {\n return \"SIGTERM\";\n }\n await input.deps.stopDaemonProcess(daemonPid, \"SIGKILL\");\n return \"SIGKILL\";\n}\n\nexport async function ensureRuntimeStoppedAfterStrictTeardownStop(input: {\n deps: DaemonTeardownStrictDependencies;\n reason: DaemonTeardownReason;\n}): Promise<void> {\n const runtimeAfterStop =\n await input.deps.readCurrentObservedDaemonRuntimeStatus();\n if (runtimeAfterStop.status === \"running\") {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `service is still running after stop phase (pid=${String(runtimeAfterStop.pid)})`,\n hint: \"run `openmeld service stop --force` and retry\",\n stage: \"stop-wait\",\n });\n }\n}\n\nexport async function uninstallSystemServiceForStrictTeardown(input: {\n context: DaemonStrictTeardownContext;\n reason: DaemonTeardownReason;\n}): Promise<boolean> {\n const managers = resolveStrictTeardownServiceManagers(input.context);\n if (managers.length === 0) {\n return false;\n }\n\n for (const manager of managers) {\n await manager.uninstall().catch((error) => {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `failed to uninstall system service (${manager.controller}): ${toErrorMessage(error)}`,\n hint: \"fix OS service permissions and retry\",\n stage: \"uninstall-verify\",\n });\n });\n }\n return true;\n}\n\nexport async function verifySystemServiceRemovedAfterStrictTeardown(input: {\n context: DaemonStrictTeardownContext;\n reason: DaemonTeardownReason;\n}): Promise<void> {\n const managers = resolveStrictTeardownServiceManagers(input.context);\n if (managers.length === 0) {\n return;\n }\n\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n while (Date.now() < deadline) {\n let allRemoved = true;\n for (const manager of managers) {\n const finalManagerStatus = await manager.status().catch((error) => {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `failed to verify system service status (${manager.controller}): ${toErrorMessage(error)}`,\n hint: \"run `openmeld service status` and confirm service manager state\",\n stage: \"uninstall-verify\",\n });\n });\n if (\n finalManagerStatus.installed ||\n finalManagerStatus.running ||\n finalManagerStatus.enabled\n ) {\n allRemoved = false;\n break;\n }\n }\n if (allRemoved) {\n return;\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n\n for (const manager of managers) {\n const finalManagerStatus = await manager.status().catch((error) => {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `failed to verify system service status (${manager.controller}): ${toErrorMessage(error)}`,\n hint: \"run `openmeld service status` and confirm service manager state\",\n stage: \"uninstall-verify\",\n });\n });\n if (\n finalManagerStatus.installed ||\n finalManagerStatus.running ||\n finalManagerStatus.enabled\n ) {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `system service still present after uninstall (controller=${manager.controller}, installed=${String(finalManagerStatus.installed)}, running=${String(finalManagerStatus.running)}, enabled=${String(finalManagerStatus.enabled)})`,\n hint: \"remove service from OS manager manually and retry\",\n stage: \"uninstall-verify\",\n });\n }\n }\n}\n\nexport function resolveStrictTeardownServiceManagers(\n context: DaemonStrictTeardownContext\n): DaemonServiceManager[] {\n const managers: DaemonServiceManager[] = [];\n if (context.usesSystemService && context.serviceManager) {\n managers.push(context.serviceManager);\n }\n const legacyManager = context.legacySharedService?.serviceManager;\n if (legacyManager && !managers.includes(legacyManager)) {\n managers.push(legacyManager);\n }\n return managers;\n}\n\nexport async function ensureRuntimeCleanAfterStrictTeardown(input: {\n deps: DaemonTeardownStrictDependencies;\n reason: DaemonTeardownReason;\n}): Promise<void> {\n const deadline = Date.now() + STRICT_TEARDOWN_VERIFY_WAIT_MS;\n while (Date.now() < deadline) {\n const [ownedProcesses, finalRuntime] = await Promise.all([\n input.deps.listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid],\n }),\n input.deps.readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (ownedProcesses.length === 0) {\n if (finalRuntime.status === \"not_running\") {\n return;\n }\n if (finalRuntime.status === \"stale\") {\n await input.deps.clearDaemonServiceRuntimeState();\n const cleanedRuntime =\n await input.deps.readCurrentObservedDaemonRuntimeStatus();\n if (cleanedRuntime.status === \"not_running\") {\n return;\n }\n }\n }\n await sleep(STRICT_TEARDOWN_VERIFY_POLL_MS);\n }\n\n const [ownedProcesses, finalRuntime] = await Promise.all([\n input.deps.listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid],\n }),\n input.deps.readCurrentObservedDaemonRuntimeStatus(),\n ]);\n if (finalRuntime.status === \"running\") {\n throw createStrictTeardownError({\n reason: input.reason,\n message: `service still running after teardown (pid=${String(finalRuntime.pid)})`,\n hint: \"run `openmeld service stop --force` and retry\",\n stage: \"uninstall-verify\",\n });\n }\n if (ownedProcesses.length > 0) {\n const ownedProcessSummary = ownedProcesses\n .map(\n (processInfo) => `${processInfo.ownership}:${String(processInfo.pid)}`\n )\n .join(\", \");\n throw createStrictTeardownError({\n reason: input.reason,\n message: `OpenMeld-owned service processes are still present after teardown (${ownedProcessSummary})`,\n hint: \"wait for OpenMeld-owned child processes to exit and retry\",\n stage: \"uninstall-verify\",\n });\n }\n throw createStrictTeardownError({\n reason: input.reason,\n message: `runtime state is still ${finalRuntime.status} after cleanup`,\n hint: \"remove stale runtime state and retry\",\n stage: \"uninstall-verify\",\n });\n}\n\nfunction createStrictTeardownError(input: {\n stage?: DaemonServiceFailureStage;\n reason: DaemonTeardownReason;\n message: string;\n hint: string;\n}): Error {\n const formattedHint = formatInlineOpenMeldCliCommands(input.hint);\n return new DaemonStrictTeardownError({\n reason: input.reason,\n message: `OpenMeld strict service teardown failed (${input.reason}): ${input.message}. Next step: ${formattedHint}.`,\n hint: formattedHint,\n stage: input.stage ?? \"uninstall-verify\",\n });\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { cancel, confirm, isCancel, select } from \"@clack/prompts\";\nimport { sleep, toErrorMessage } from \"@openmeld/utils\";\nimport {\n type AuthenticationGuidance,\n buildHumanAuthenticationCard,\n resolveAuthenticationGuidance,\n} from \"../auth/auth-guidance\";\nimport { ensureCommandAuthenticationOrCancel } from \"../auth/command-auth\";\nimport {\n assessCliUpdate,\n type CliUpdateAssessment,\n} from \"../command-entry-checks/cli-update-assessment\";\nimport { getCurrentCommandCheckState } from \"../command-entry-checks/current-command-check-state\";\nimport { assessServerRequiredVersion } from \"../command-entry-checks/server-required-version-assessment\";\nimport { resolveServiceUpdateUrgency } from \"../command-entry-checks/service-update-urgency\";\nimport { getAuthSessionState } from \"../config/auth-session\";\nimport {\n normalizeGatewayBaseUrl,\n normalizeGatewayBaseUrlOrNull,\n resolveBaseUrlOrNull,\n resolveExplicitGatewayUrlOrThrow,\n} from \"../config/base-url\";\nimport {\n clearDaemonServiceContract,\n isDaemonServiceContractIdentityReusable,\n readDaemonServiceContract,\n upsertDaemonServiceContract,\n} from \"../config/daemon-service-contract\";\nimport {\n acquireDaemonServiceLifecycleLock,\n clearDaemonServiceRuntimeState,\n DAEMON_SERVICE_RUNTIME_DETACHED_ENV,\n DAEMON_SERVICE_RUNTIME_MODE_ENV,\n DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV,\n type DaemonRunMode,\n type DaemonServiceRuntimeState,\n type DaemonServiceRuntimeStatus,\n getDaemonStatus,\n installDaemon,\n isDaemonServiceRuntimeHeartbeatStale,\n readDaemonServiceRuntimeSnapshot,\n releaseDaemonServiceLifecycleLock,\n uninstallDaemon,\n withDaemonServiceReconcileLock,\n withDaemonServiceRegistrationMutationLock,\n withDaemonServiceRunLock,\n withDaemonServiceStopLock,\n} from \"../config/daemon-state\";\nimport { isOpenMeldLockError } from \"../config/lock\";\nimport { resolveOpenMeldEnvironmentTarget } from \"../config/openmeld-environment-target\";\nimport { resolveOpenMeldEnvPreset } from \"../config/paths\";\nimport { canAttachAuthTokenToRequest } from \"../config/request-headers\";\nimport { resolveOpenMeldProfileOrNull } from \"../config/resolve-openmeld-profile\";\nimport { runDaemonServiceLoop } from \"../local-service/carrier/service-runner\";\nimport {\n normalizeOptionalText,\n warnDaemonEvent,\n} from \"../local-service/core/logger\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport {\n emitDaemonLifecycleEvent,\n runDaemonServiceManagerAction,\n runWithDaemonLifecycleCommandJournal,\n} from \"../local-service/lifecycle/daemon-lifecycle-journal\";\nimport { installDaemonProcessCrashGuard } from \"../local-service/lifecycle/daemon-process-crash-guard\";\nimport {\n buildDaemonServiceTargetSpec,\n resolveDaemonServiceAlignmentDecision,\n} from \"../local-service/lifecycle/daemon-service-alignment-target\";\nimport { classifyDaemonServiceRunStartability } from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport {\n cleanupInactiveDaemonServiceBundles,\n prepareDaemonServiceBundle,\n readDaemonActiveBundleState,\n resolveAlignedDaemonActiveBundleEntryPath,\n} from \"../local-service/lifecycle/daemon-service-bundle\";\nimport {\n extractDaemonCommandEntryPath,\n resolveDaemonBundleIdFromEntryPath,\n} from \"../local-service/lifecycle/daemon-service-command-path\";\nimport {\n buildDaemonSystemServiceCommandSpec,\n ensureDaemonSystemServiceCommandFiles,\n} from \"../local-service/lifecycle/daemon-service-command-spec\";\nimport { writeDaemonServiceContract } from \"../local-service/lifecycle/daemon-service-contract-writer\";\nimport {\n buildDaemonServiceDependencyDetails,\n buildDaemonServiceDependencyMeaning,\n buildDaemonServiceDependencyNextStep,\n buildDaemonServiceDependencySummary,\n buildDaemonServiceDependencyTitle,\n type DaemonServiceDependencyIssue,\n resolveDaemonServiceDependencyDiagnostics,\n} from \"../local-service/lifecycle/daemon-service-dependency-diagnostics\";\nimport {\n captureDaemonServiceEvidence,\n captureDaemonServiceEvidenceBestEffort,\n} from \"../local-service/lifecycle/daemon-service-evidence\";\nimport { buildDaemonServiceCleanupPlan } from \"../local-service/lifecycle/daemon-service-hygiene\";\nimport {\n type DaemonServiceInventory,\n inspectDaemonServiceInventory,\n} from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { assertDaemonServiceLaunchScope } from \"../local-service/lifecycle/daemon-service-launch-scope\";\nimport { cleanupLegacySharedDaemonServiceState } from \"../local-service/lifecycle/daemon-service-legacy-shared\";\nimport {\n DaemonServiceLifecycleDrainTimeoutError,\n runDaemonServiceLifecycle,\n} from \"../local-service/lifecycle/daemon-service-lifecycle\";\nimport {\n type DaemonServiceManager,\n isDaemonServiceJobSpawnPending,\n resolveDaemonServiceManager,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport {\n type DaemonOwnerSnapshot,\n readCurrentDaemonOwnerSnapshot,\n resolveStoppedContractWriteBlockedReason,\n summarizeDaemonOwnerSnapshot,\n} from \"../local-service/lifecycle/daemon-service-owner-snapshot\";\nimport { listDaemonOwnedProcesses } from \"../local-service/lifecycle/daemon-service-process-inventory\";\nimport { clearDaemonServiceRegistrationRepairPending } from \"../local-service/lifecycle/daemon-service-registration-repair-state\";\nimport {\n buildDaemonServiceRefreshNextStep,\n buildDaemonServiceUpdateRequiredNextStep,\n formatDaemonServiceRefreshReliabilityMessage,\n formatDaemonServiceUpdateRequiredMessage,\n} from \"../local-service/lifecycle/daemon-service-repair-guidance\";\nimport {\n clearDaemonRuntimeStateIfDefinitelyStopped,\n getEffectiveDaemonRuntimeStatus,\n readCurrentDaemonRuntimeContext,\n readCurrentObservedDaemonRuntimeStatus,\n resolveDaemonRuntimeState,\n resolveDaemonServiceManagerForRuntimeState,\n waitForDaemonSystemServiceToStop as waitForSystemServiceToStop,\n} from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { startDaemonSystemServiceWithAutoRepair } from \"../local-service/lifecycle/daemon-service-start-recovery\";\nimport { resolveDaemonServiceStartupRecoveryDecision } from \"../local-service/lifecycle/daemon-service-startup-recovery\";\nimport {\n isSystemServiceStartupTimeoutError,\n resolveSystemServiceStartupWaitMs,\n} from \"../local-service/lifecycle/daemon-service-startup-wait\";\nimport { scheduleDaemonServiceUpdate } from \"../local-service/lifecycle/daemon-service-update-coordinator\";\nimport {\n ensureDaemonServiceMaintenanceInstalled,\n uninstallDaemonServiceUpdateWorker,\n} from \"../local-service/lifecycle/daemon-service-update-worker-manager\";\nimport {\n captureDaemonStartFailureLogCursor,\n isDaemonStartFailureLikelyDependencyRequestFailure,\n readDaemonStartFailureLogDiagnostic,\n selectRelevantDaemonStartFailureLogLine,\n summarizeDaemonStartFailureLogLine,\n} from \"../local-service/lifecycle/daemon-start-failure-log\";\nimport { runDaemonStartupPreflight } from \"../local-service/lifecycle/daemon-startup-preflight\";\nimport {\n type LocalServiceDemand,\n resolveLocalServiceDemand,\n} from \"../local-service/lifecycle/local-service-demand\";\nimport {\n ensureDaemonRuntimePaths,\n resolveDaemonDeviceId,\n resolvePreferredDaemonDeviceId,\n} from \"../local-service/state/daemon-device-id\";\nimport {\n clearDaemonStartFailureState,\n type DaemonStartFailureState,\n writeDaemonStartFailureState,\n} from \"../local-service/state/daemon-start-failure-state\";\nimport { resolveDaemonLocalStatusSnapshot } from \"../local-service/status/daemon-local-status-snapshot\";\nimport { resolveDaemonStatusSnapshot } from \"../local-service/status/daemon-status-snapshot\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommand,\n formatOpenMeldCliCommands,\n formatOpenMeldCliTextBlock,\n} from \"../runtime/cli-entry-command\";\nimport { emitCliJsonEnvelope } from \"../runtime/cli-json-output\";\nimport { type RuntimeContext, resolveRuntimeContext } from \"../runtime/context\";\nimport { isBinaryDistribution } from \"../runtime/distribution\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport { createPresenter } from \"../runtime/presenter/index\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\nimport {\n formatDaemonServiceMissingMeaning,\n formatDaemonServiceMissingRunStepOne,\n formatDaemonServiceMissingRunStepTwo,\n formatDaemonServiceMissingStatus,\n} from \"../system/local-service-install-attention\";\nimport {\n buildDaemonStartNeedsAttentionCard,\n formatDaemonStartAutoRepairResolvedMessage,\n formatDaemonStartStartedManage,\n formatDaemonStartStartedMeaning,\n formatDaemonStartStartedNextStep,\n formatDaemonStartStartedStatus,\n getDaemonStartStartedTitle,\n promptForDaemonRepairDecision,\n runDaemonStartDecisionPrompt,\n shouldOfferDaemonStartDecision,\n} from \"../system/local-service-start-decision\";\nimport { runDaemonControlCommand } from \"./service-control-command\";\nimport type { DaemonBaseInput, DaemonControlInput } from \"./service-inputs\";\nimport {\n createDaemonStartSpinner,\n createQuietPresenter,\n createSilentPresenter,\n emitDaemonOverviewIfAgent,\n formatDaemonDisplayRows,\n normalizeText,\n renderDaemonStartDeferredCard,\n renderDaemonStartNeedsAttentionCard,\n renderServiceActionCard,\n} from \"./service-output\";\nimport {\n attachDaemonReinstallEvidence,\n buildDaemonReinstallAgentPayload,\n buildDaemonReinstallFailureMessage,\n buildDaemonReinstallUnexpectedStartNextStep,\n buildDaemonReinstallUnexpectedStartSummary,\n createDaemonReinstallAlreadyHealthyOutcome,\n createDaemonReinstallCompletedOutcome,\n createDaemonReinstallDowngradeBlockedOutcome,\n createDaemonReinstallDrainTimeoutResult,\n createDaemonReinstallInProgressOutcome,\n createDaemonReinstallStartBlockedOutcome,\n createDaemonReinstallStartFailedOutcome,\n createDaemonReinstallStoppedSafeOutcome,\n DaemonReinstallFailureError,\n type DaemonReinstallOutcome,\n type DaemonReinstallServiceState,\n type DaemonReinstallTimeoutPolicy,\n DaemonReinstallUnexpectedStartError,\n type DaemonServiceMaintenanceAction,\n emitDaemonInstallDowngradeBlocked,\n emitDaemonReinstallResult,\n formatDaemonServiceMaintenanceActionLabel,\n formatDaemonServiceMaintenanceActionTitle,\n formatDaemonServiceMaintenanceCommand,\n isDaemonReinstallCompletedAndStopped,\n isDaemonReinstallHealthyAndRunning,\n normalizeDaemonServiceMaintenanceAction,\n renderDaemonReinstallOutcome,\n resolveDaemonDowngradeBlock,\n resolveDaemonReinstallStartBlockedReason,\n summarizeDaemonReinstallJournalResult,\n} from \"./service-reinstall-view\";\nimport {\n createDaemonAlreadyRunningResult,\n type DaemonRunResult,\n isDaemonRunAlreadyRunningReason,\n LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON,\n normalizeDaemonRunReason,\n} from \"./service-run-result\";\nimport {\n buildDaemonBackgroundStartFailure,\n buildSystemServiceStartupFailureDiagnostics,\n buildSystemServiceStartupFailureMessage,\n buildSystemServiceStartupFailureReport,\n type DaemonBackgroundStartFailure,\n resolveSystemServiceStartupFailureVerdict,\n type SystemServiceStartupFailureVerdict,\n type SystemServiceStartupRecoveryOutcome,\n type SystemServiceStartupRecoveryReport,\n waitForSystemServiceStartup,\n} from \"./service-start-failure\";\nimport {\n buildDaemonStatusJsonPayload,\n describeDaemonRuntimeStatus,\n emitDaemonAgentLocalStatus,\n emitDaemonAgentStatus,\n emitDaemonStatusForView,\n emitRuntimeProjectionLine,\n formatDaemonInstallNextStep,\n normalizeRuntimeState,\n renderVersionReconciliationCard,\n} from \"./service-status-view\";\nimport {\n buildDaemonStopSuccessText,\n buildDaemonStopWarningText,\n emitDaemonStopCancelled,\n handleDaemonNotRunningStopStatus,\n isPidAlive,\n type SharedDaemonStopResult,\n stopCurrentLaneDaemonService,\n stopDaemonProcess,\n summarizeDaemonStopJournalResult,\n} from \"./service-stop-command\";\nimport {\n type DaemonTeardownStrictDependencies,\n type DaemonTeardownStrictInput,\n type DaemonTeardownStrictResult,\n ensureRuntimeCleanAfterStrictTeardown,\n ensureRuntimeStoppedAfterStrictTeardownStop,\n resolveDaemonStrictTeardownContext,\n stopDaemonForStrictTeardown,\n uninstallSystemServiceForStrictTeardown,\n verifySystemServiceRemovedAfterStrictTeardown,\n} from \"./service-teardown\";\n\nexport type {\n DaemonRunFailureReason,\n DaemonRunResult,\n} from \"./service-run-result\";\n\nimport { syncDeviceRuntimeStateProjection } from \"../local-service/reporting/device-runtime-state-sync\";\nimport { formatElapsedTime, resolveElapsedTimeMs } from \"../ui/elapsed-time\";\nimport { renderInfoCard } from \"../ui/info-card\";\n\ntype DaemonStatusInput = DaemonBaseInput & {\n json?: boolean;\n};\n\nconst DAEMON_RUN_MODE_CHOICES = {\n background: \"background\",\n foreground: \"foreground\",\n back: \"back\",\n} as const;\n\nconst DEFAULT_DAEMON_RUN_MODE = DAEMON_RUN_MODE_CHOICES.background;\nconst SERVICE_STARTUP_CHECK_MS = 5000;\nconst SERVICE_STARTUP_POLL_MS = 120;\nconst REINSTALL_DRAIN_WAIT_MS = 20_000;\nconst REINSTALL_VERIFY_WAIT_MS = 20_000;\nconst REINSTALL_VERIFY_POLL_MS = 200;\nconst REINSTALL_START_RETRY_ATTEMPTS = 2;\nconst REINSTALL_START_RETRY_DELAY_MS = 600;\nconst DAEMON_STARTUP_POLL_INTERVAL_MS = 80;\nconst DAEMON_DETACHED_STARTUP_OUTPUT_LIMIT = 4096;\n\nconst DAEMON_MENU_CHOICE = {\n run: \"run\",\n autostartEnable: \"autostart_enable\",\n autostartDisable: \"autostart_disable\",\n status: \"status\",\n stop: \"stop\",\n install: \"install\",\n reinstall: \"reinstall\",\n update: \"update\",\n uninstall: \"uninstall\",\n exit: \"exit\",\n} as const;\n\nconst DAEMON_MENU_COMMANDS = [\n \"openmeld service start\",\n \"openmeld service stop\",\n \"openmeld service autostart enable\",\n \"openmeld service autostart disable\",\n \"openmeld service status\",\n \"openmeld service snapshot\",\n \"openmeld service install\",\n \"openmeld service repair\",\n \"openmeld service update\",\n \"openmeld service uninstall\",\n] as const;\n\ntype DaemonRunInput = DaemonBaseInput & {\n accountAdmissionId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n profile?: string;\n gatewayUrl?: string;\n mode?: string;\n entryChecksHandled?: boolean;\n allowModeBack?: boolean;\n outputMode?: \"normal\" | \"silent\";\n suppressModeCancelOutput?: boolean;\n suppressStartSpinner?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n};\n\nexport type DaemonRunAfterEntryChecksInput = Omit<\n DaemonRunInput,\n \"entryChecksHandled\"\n>;\n\nexport type DaemonServiceProgressReporter = {\n detail: (input: { code: string; text: string }) => void;\n};\n\nfunction emitDaemonServiceProgress(input: {\n code: string;\n progress: DaemonServiceProgressReporter | undefined;\n progressText?: string;\n spinner: ReturnType<typeof createDaemonStartSpinner>;\n text: string;\n}): void {\n input.progress?.detail({\n code: input.code,\n text: input.progressText ?? input.text,\n });\n input.spinner?.message(input.text);\n}\n\ntype DaemonRunInternalOptions = {\n systemServiceStartupWaitMs?: number;\n systemServiceStartupPollMs?: number;\n};\n\ntype DaemonStopInput = DaemonBaseInput & {\n force?: boolean;\n profile?: string;\n};\n\ntype DaemonAutostartInput = DaemonBaseInput & {\n action: \"enable\" | \"disable\";\n json?: boolean;\n};\n\ntype DaemonAutostartInternalOptions = {\n clearRegistrationRepairPending?: typeof clearDaemonServiceRegistrationRepairPending;\n resolveServiceManager?: typeof resolveDaemonServiceManager;\n withRegistrationMutationLock?: typeof withDaemonServiceRegistrationMutationLock;\n};\n\ntype PersistedDaemonServiceContract = NonNullable<\n Awaited<ReturnType<typeof readDaemonServiceContract>>\n>;\n\ntype DaemonReinstallInput = DaemonBaseInput & {\n displayAction?: DaemonServiceMaintenanceAction;\n force?: boolean;\n};\n\ntype DaemonInstallInternalOptions = {\n daemonVersion?: string;\n cliScriptPath?: string;\n suppressAgentOverview?: boolean;\n suppressHumanOutput?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n};\n\ntype DaemonUninstallInternalOptions = {\n suppressAgentOverview?: boolean;\n teardown?: (\n input: DaemonTeardownStrictInput\n ) => Promise<DaemonTeardownStrictResult>;\n};\n\nexport type DaemonReinstallInternalOptions = {\n teardown?: typeof runDaemonTeardownStrict;\n runInstall?: typeof runDaemonInstall;\n runRun?: typeof runDaemonRun;\n readDaemonStatus?: typeof getDaemonStatus;\n withReconcileLock?: typeof withDaemonServiceReconcileLock;\n timeoutPolicy?: DaemonReinstallTimeoutPolicy;\n skipConfirm?: boolean;\n verifyWaitMs?: number;\n drainWaitMs?: number;\n startRetryDelayMs?: number;\n daemonVersion?: string;\n cliScriptPath?: string;\n startAfterInstallMode?: \"default\" | \"always\" | \"never\";\n forceReinstall?: boolean;\n suppressAgentOverview?: boolean;\n suppressHumanResultCard?: boolean;\n suppressInstallOutput?: boolean;\n resolveUpdateUrgency?: typeof resolveServiceUpdateUrgency;\n scheduleServiceUpdate?: typeof scheduleDaemonServiceUpdate;\n};\n\ntype DaemonInteractiveCommandResult = \"completed\" | \"cancelled\";\n\nconst isDetachedDaemonServiceRun = (): boolean =>\n process.env[DAEMON_SERVICE_RUNTIME_DETACHED_ENV] === \"1\";\n\nexport const isManagedSystemServiceBootstrapRun = (): boolean =>\n isDetachedDaemonServiceRun() &&\n process.env[DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV] === \"1\";\n\ntype DaemonRunAuthReadiness =\n | {\n ready: true;\n }\n | {\n ready: false;\n reason: \"authentication_required\" | \"authentication_environment_mismatch\";\n guidance: AuthenticationGuidance;\n nextSteps: string[];\n };\n\ntype DaemonRunServiceDependencyDiagnostics = Extract<\n Awaited<ReturnType<typeof resolveDaemonServiceDependencyDiagnostics>>,\n { applicable: true; ready: false }\n>;\n\nexport async function runDaemon(input: DaemonBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const payload = buildDaemonMenuPayload();\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"menu\",\n handled: input.agentOverviewHandled,\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.menu.result\",\n payload,\n });\n return;\n }\n\n if (canUseInteractivePrompts(runtime)) {\n await runInteractiveDaemonMenu({\n gatewayUrl: input.gatewayUrl,\n view: runtime.resolvedView,\n });\n return;\n }\n\n presenter.line({\n code: \"daemon.menu.header\",\n text: \"OpenMeld Service commands:\",\n });\n for (const command of payload.commands) {\n presenter.line({\n code: \"daemon.menu.command\",\n text: `- ${formatOpenMeldCliCommand(command)}`,\n });\n }\n for (const note of payload.notes) {\n presenter.line({\n code: \"daemon.menu.note\",\n text: `- ${formatOpenMeldCliTextBlock(note)}`,\n });\n }\n}\n\nexport async function runDaemonInstall(\n input: DaemonBaseInput,\n options: DaemonInstallInternalOptions = {}\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"install\",\n handled: input.agentOverviewHandled || options.suppressAgentOverview,\n });\n options.serviceProgress?.detail({\n code: \"daemon.install.installing\",\n text: \"Installing OpenMeld Service...\",\n });\n const requestedVersion =\n options.daemonVersion ?? (await resolveCurrentDaemonExpectedVersion());\n const downgradeBlock = await resolveDaemonDowngradeBlock({\n requestedVersion,\n });\n if (downgradeBlock) {\n emitDaemonInstallDowngradeBlocked({\n presenter,\n resolvedView: runtime.resolvedView,\n json: input.json === true,\n downgradeBlock,\n });\n return;\n }\n\n const preparedBundle = await prepareDaemonServiceBundle({\n daemonVersion: requestedVersion,\n ...(options.cliScriptPath ? { cliScriptPath: options.cliScriptPath } : {}),\n });\n const result = await installDaemon({\n daemonVersion: requestedVersion,\n source: \"daemon.command.install\",\n });\n await clearDaemonStartFailureStateSafely();\n const serviceManager = await resolveDaemonServiceManager().catch(() => null);\n const existingContract = await readDaemonServiceContract().catch(() => null);\n await alignStoppedDaemonInstallContract({\n existingContract,\n bundleId: preparedBundle.bundleId,\n daemonVersion: result.state.daemonVersion,\n });\n if (!(result.status === \"already_installed\" && existingContract)) {\n const runtimeStatus =\n result.status === \"already_installed\"\n ? await readCurrentObservedDaemonRuntimeStatus().catch(() => null)\n : null;\n const desiredState =\n runtimeStatus?.status === \"running\" && runtimeStatus.mode === \"background\"\n ? \"background\"\n : \"stopped\";\n await maybeWriteDaemonServiceContract({\n runtime,\n daemonVersion: result.state.daemonVersion,\n bundleId: preparedBundle.bundleId,\n desiredState,\n serviceController: serviceManager?.controller,\n runtimeStatus,\n autoStart: desiredState === \"background\" && runtimeStatus !== null,\n openMeldProfileId: input.profile,\n contractProfileId: input.profile,\n allowDetachedFallback: serviceManager === null,\n });\n }\n const runtimeProjection = await syncDeviceRuntimeStateProjection({\n mode: \"repair\",\n }).catch(() => null);\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.install\",\n status: result.status,\n state: result.state,\n ...(runtimeProjection ? { runtimeProjection } : {}),\n });\n return;\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.install.result\",\n payload: {\n status: result.status,\n state: result.state,\n ...(runtimeProjection ? { runtimeProjection } : {}),\n },\n });\n return;\n }\n\n if (options.suppressHumanOutput) {\n return;\n }\n\n if (result.status === \"already_installed\") {\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.install.already\",\n title: \"✅ OpenMeld Service Already Installed\",\n rows: [\n {\n label: \"🧩 Status\",\n value: \"already installed\",\n },\n {\n label: \"🏷️ Version\",\n value: result.state.daemonVersion,\n },\n {\n label: \"🚀 Next Step\",\n value: formatDaemonInstallNextStep(runtimeProjection),\n },\n ],\n });\n return;\n }\n\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.install.completed\",\n title: \"🎉 OpenMeld Service Installed\",\n rows: [\n {\n label: \"🧩 Status\",\n value: \"installed\",\n },\n {\n label: \"🏷️ Version\",\n value: result.state.daemonVersion,\n },\n {\n label: \"🚀 Action\",\n value: formatDaemonInstallNextStep(runtimeProjection),\n },\n ],\n });\n await emitRuntimeProjectionLine({\n presenter,\n runtimeProjection,\n });\n}\n\nasync function alignStoppedDaemonInstallContract(input: {\n existingContract: PersistedDaemonServiceContract | null;\n bundleId: string;\n daemonVersion: string;\n}): Promise<void> {\n const contract = input.existingContract;\n if (\n contract?.desiredState !== \"stopped\" ||\n contract.autoStart ||\n contract.bundleId === input.bundleId\n ) {\n return;\n }\n const observed = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (observed?.status !== \"not_running\") {\n return;\n }\n // Install has already activated these files. Keep a stopped contract\n // aligned without changing its account, device, or service registration.\n await upsertDaemonServiceContract({\n ...contract,\n bundleId: input.bundleId,\n daemonVersion: input.daemonVersion,\n });\n}\n\nexport async function runDaemonUninstall(\n input: DaemonBaseInput,\n options: DaemonUninstallInternalOptions = {}\n): Promise<DaemonInteractiveCommandResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"uninstall\",\n handled: input.agentOverviewHandled || options.suppressAgentOverview,\n });\n const teardown =\n options.teardown ??\n (async (teardownInput: DaemonTeardownStrictInput) =>\n await runDaemonTeardownStrict(teardownInput));\n if (\n input.json !== true &&\n runtime.resolvedView === \"human\" &&\n canUseInteractivePrompts(runtime) &&\n !(await confirmCleanDaemonUninstall())\n ) {\n return \"cancelled\";\n }\n const result = await withDaemonServiceReconcileLock(\n async () =>\n await teardown({\n reason: \"service_uninstall\",\n }),\n {\n intent: \"uninstall\",\n command: \"openmeld service uninstall\",\n }\n );\n await clearDaemonServiceContract();\n await clearDaemonStartFailureStateSafely();\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.uninstall\",\n status: result.removed ? \"removed\" : \"not_installed\",\n });\n return \"completed\";\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.uninstall.result\",\n payload: {\n status: result.removed ? \"removed\" : \"not_installed\",\n nextStartup: {\n daemonCheck: \"will_run\",\n recommendation: \"install_strongly_recommended\",\n installCommand: \"openmeld service install\",\n displayInstallCommand: formatOpenMeldCliCommand(\n \"openmeld service install\"\n ),\n },\n },\n });\n return \"completed\";\n }\n\n if (!result.removed) {\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.uninstall.not_installed\",\n title: \"ℹ️ OpenMeld Service Not Installed\",\n rows: [\n {\n label: \"🧩 Status\",\n value: \"no service installation found\",\n },\n {\n label: \"🚀 Action\",\n value: formatInlineOpenMeldCliCommands(\n \"Run `openmeld service install` to set up OpenMeld Service.\"\n ),\n },\n ],\n });\n return \"completed\";\n }\n\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.uninstall.completed\",\n title: \"🧹 OpenMeld Service Removed\",\n rows: [\n {\n label: \"🧩 Status\",\n value: \"service removed cleanly\",\n },\n {\n label: \"🧹 Result\",\n value:\n \"OpenMeld stopped local service processes, removed service files, and cleaned background runtime state.\",\n },\n {\n label: \"🔁 Action\",\n value: formatInlineOpenMeldCliCommands(\n \"Run `openmeld service install` when you want it back.\"\n ),\n },\n ],\n });\n return \"completed\";\n}\n\nasync function confirmCleanDaemonUninstall(): Promise<boolean> {\n const confirmed = await confirm({\n message:\n \"Do a clea OpenMeld Service uninstall now? OpenMeld will stop local service processes and remove OpenMeld service files from this device.\",\n initialValue: true,\n });\n if (isCancel(confirmed) || !confirmed) {\n cancel(\"Cancelled.\");\n return false;\n }\n return true;\n}\n\nexport async function runDaemonReinstall(\n input: DaemonReinstallInput,\n options: DaemonReinstallInternalOptions = {}\n): Promise<DaemonReinstallOutcome> {\n const displayAction = normalizeDaemonServiceMaintenanceAction(\n input.displayAction\n );\n const runtime = await resolveRuntimeContext({\n profile: input.profile,\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"reinstall\",\n handled:\n input.agentOverviewHandled ||\n options.suppressAgentOverview ||\n input.json === true,\n });\n return await runWithDaemonLifecycleCommandJournal({\n command: formatDaemonServiceMaintenanceCommand(displayAction),\n intent: \"reinstall\",\n metadata: {\n displayAction,\n force: input.force ?? false,\n },\n resolveResult: summarizeDaemonReinstallJournalResult,\n run: async () => {\n try {\n let outcome = await performDaemonReinstall({\n force: input.force,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n runtime,\n displayAction,\n resolved: resolveDaemonReinstallOptions({\n ...options,\n daemonVersion:\n options.daemonVersion ??\n (await resolveCurrentDaemonExpectedVersion()),\n }),\n });\n outcome = await attachDaemonReinstallEvidence({\n outcome,\n runtime,\n });\n renderDaemonReinstallOutcome({\n action: displayAction,\n outcome,\n presenter,\n resolvedView: runtime.resolvedView,\n suppressHumanResultCard: options.suppressHumanResultCard,\n json: input.json,\n });\n return outcome;\n } catch (error) {\n if (error instanceof DaemonReinstallUnexpectedStartError) {\n const outcome = await attachDaemonReinstallEvidence({\n outcome: error.outcome,\n runtime,\n });\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.reinstall\",\n ...buildDaemonReinstallAgentPayload({\n action: displayAction,\n outcome,\n }),\n });\n return outcome;\n }\n emitDaemonReinstallResult({\n action: displayAction,\n outcome,\n presenter,\n resolvedView: runtime.resolvedView,\n });\n renderDaemonStartNeedsAttentionCard({\n presenter,\n codePrefix: \"daemon.reinstall.start_failed\",\n summary: buildDaemonReinstallUnexpectedStartSummary(\n error.cause,\n displayAction\n ),\n nextStep:\n buildDaemonReinstallUnexpectedStartNextStep(displayAction),\n detail: error.diagnosticDetail ?? undefined,\n });\n return outcome;\n }\n if (error instanceof DaemonReinstallFailureError) {\n throw new Error(\n buildDaemonReinstallFailureMessage({\n action: displayAction,\n backupDataPath: error.backupDataPath,\n errorCode: error.errorCode,\n errorMessage: toErrorMessage(error.cause),\n failureStage: error.failureStage,\n evidencePath:\n error.evidencePath ??\n (await captureDaemonServiceEvidenceBestEffort({\n runtime,\n phase: \"after_failure\",\n })),\n includeDiagnosticDetails:\n input.json === true || runtime.resolvedView === \"agent\",\n resolvedView: runtime.resolvedView,\n }),\n {\n cause: error.cause,\n }\n );\n }\n throw error;\n }\n },\n });\n}\n\nasync function performDaemonReinstall(input: {\n displayAction: DaemonServiceMaintenanceAction;\n force?: boolean;\n gatewayUrl?: string;\n profile?: string;\n runtime: RuntimeContext;\n resolved: ReturnType<typeof resolveDaemonReinstallOptions>;\n}): Promise<DaemonReinstallOutcome> {\n const downgradeBlock = await resolveDaemonDowngradeBlock({\n requestedVersion: input.resolved.daemonVersion,\n readDaemonStatus: input.resolved.readDaemonStatus,\n });\n if (downgradeBlock) {\n return createDaemonReinstallDowngradeBlockedOutcome({\n installedVersion: downgradeBlock.installedVersion,\n requestedVersion: downgradeBlock.requestedVersion,\n });\n }\n\n let forceUsed = Boolean(input.force);\n let reinstallTargetDesiredState: \"stopped\" | \"background\" = \"stopped\";\n\n try {\n if (!input.resolved.forceReinstall) {\n const alreadyHealthy = await input.resolved.withReconcileLock(\n async () =>\n await resolveAlreadyHealthyDaemonRepair({\n expectedVersion: input.resolved.daemonVersion,\n cliScriptPath: input.resolved.cliScriptPath,\n gatewayUrl: input.gatewayUrl,\n })\n );\n if (alreadyHealthy) {\n return alreadyHealthy;\n }\n }\n\n const confirmed = input.resolved.skipConfirm\n ? true\n : await confirmDaemonReinstall(\n input.runtime,\n input.force,\n input.displayAction\n );\n if (!confirmed) {\n return {\n ok: false,\n result: \"cancelled\",\n };\n }\n\n if (input.displayAction === \"update\") {\n const urgency = await input.resolved.resolveUpdateUrgency({\n ...(input.gatewayUrl ? { gatewayUrl: input.gatewayUrl } : {}),\n });\n const scheduled = await input.resolved.scheduleServiceUpdate({\n targetVersion: input.resolved.daemonVersion,\n urgency,\n ...(input.resolved.cliScriptPath\n ? { cliScriptPath: input.resolved.cliScriptPath }\n : {}),\n });\n return {\n ok: true,\n result: \"scheduled\",\n jobId: scheduled.job.jobId,\n targetVersion: scheduled.job.targetVersion,\n };\n }\n\n const lifecycleResult = await input.resolved.withReconcileLock(async () => {\n reinstallTargetDesiredState =\n await resolveDaemonReinstallTargetDesiredState();\n const runLifecycle = async (forceKillAfterDrainTimeout: boolean) =>\n await runDaemonServiceLifecycle({\n expectedVersion: input.resolved.daemonVersion,\n operation: \"reinstall\",\n installSource: \"daemon.command.install\",\n desiredState: \"stopped\",\n shouldStartAfterLifecycle: false,\n forceReinstall: input.resolved.forceReinstall,\n drainWaitMs: input.resolved.drainWaitMs,\n forceKillAfterDrainTimeout,\n ...(input.gatewayUrl ? { gatewayUrl: input.gatewayUrl } : {}),\n ...(input.profile ? { profile: input.profile } : {}),\n ...(input.resolved.cliScriptPath\n ? { cliScriptPath: input.resolved.cliScriptPath }\n : {}),\n });\n\n try {\n return await runLifecycle(forceUsed);\n } catch (error) {\n if (\n error instanceof DaemonServiceLifecycleDrainTimeoutError &&\n !forceUsed\n ) {\n const shouldForceContinue =\n await resolveReinstallForceDecisionOnTimeout({\n action: input.displayAction,\n runtime: input.runtime,\n timeoutPolicy: input.resolved.timeoutPolicy,\n drainWaitMs: error.waitMs,\n });\n if (!shouldForceContinue) {\n return createDaemonReinstallDrainTimeoutResult(error.waitMs);\n }\n forceUsed = true;\n return await runLifecycle(true);\n }\n throw error;\n }\n });\n if (\"result\" in lifecycleResult) {\n return lifecycleResult;\n }\n\n if (lifecycleResult.status === \"failed\") {\n throw new DaemonReinstallFailureError({\n backupDataPath: lifecycleResult.backupDataPath,\n cause: new Error(lifecycleResult.errorMessage),\n errorCode: lifecycleResult.errorCode,\n evidencePath: lifecycleResult.evidencePath,\n failureStage: lifecycleResult.failureStage,\n });\n }\n\n if (lifecycleResult.status === \"stopped_safe\") {\n return createDaemonReinstallStoppedSafeOutcome({\n desiredState: reinstallTargetDesiredState,\n evidencePath: lifecycleResult.evidencePath,\n failureStage: lifecycleResult.failureStage,\n forceUsed,\n errorMessage: lifecycleResult.errorMessage,\n reasonCodes: lifecycleResult.reasonCodes,\n });\n }\n\n await applyDaemonReinstallTargetDesiredState({\n runtime: input.runtime,\n desiredState: reinstallTargetDesiredState,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n });\n return await completeDaemonReinstallStart({\n runtime: input.runtime,\n resolved: input.resolved,\n forceUsed,\n targetDesiredState: reinstallTargetDesiredState,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n });\n } catch (error) {\n if (isOpenMeldLockError(error)) {\n if (error.contentionState === \"orphaned\") {\n throw error;\n }\n return createDaemonReinstallInProgressOutcome(\n error.meta,\n input.displayAction\n );\n }\n throw error;\n }\n}\n\nasync function completeDaemonReinstallStart(input: {\n runtime: RuntimeContext;\n resolved: ReturnType<typeof resolveDaemonReinstallOptions>;\n forceUsed: boolean;\n targetDesiredState: \"stopped\" | \"background\";\n gatewayUrl?: string;\n profile?: string;\n}): Promise<DaemonReinstallOutcome> {\n const startAfterInstallMode = resolveDaemonReinstallStartMode({\n targetDesiredState: input.targetDesiredState,\n startAfterInstallMode: input.resolved.startAfterInstallMode,\n });\n\n if (startAfterInstallMode === \"never\") {\n const shouldRunNow = await maybePromptToRunDaemonAfterStoppedReinstall({\n runtime: input.runtime,\n });\n if (shouldRunNow) {\n return await autoStartDaemonAfterReinstall({\n ...input,\n desiredState: \"background\",\n });\n }\n\n await clearDaemonStartFailureStateSafely();\n return createDaemonReinstallCompletedOutcome({\n backupDataPath: null,\n desiredState: \"stopped\",\n forceUsed: input.forceUsed,\n serviceState: \"stopped\",\n });\n }\n\n return await autoStartDaemonAfterReinstall({\n ...input,\n desiredState: \"background\",\n });\n}\n\nasync function maybePromptToRunDaemonAfterStoppedReinstall(input: {\n runtime: RuntimeContext;\n}): Promise<boolean> {\n if (\n input.runtime.resolvedView !== \"human\" ||\n !canUseInteractivePrompts(input.runtime)\n ) {\n return false;\n }\n\n const selected = await confirm({\n message: \"OpenMeld Service is repaired but not running yet. Start it now?\",\n initialValue: true,\n });\n return !(isCancel(selected) || !selected);\n}\n\nasync function autoStartDaemonAfterReinstall(input: {\n runtime: RuntimeContext;\n resolved: ReturnType<typeof resolveDaemonReinstallOptions>;\n desiredState: \"background\" | \"stopped\";\n forceUsed: boolean;\n gatewayUrl?: string;\n profile?: string;\n}): Promise<DaemonReinstallOutcome> {\n const startOutcome = await runDaemonAfterReinstallStartWithRetry({\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n gatewayUrl: input.gatewayUrl,\n profile: input.profile,\n resolved: input.resolved,\n startRetryDelayMs: input.resolved.startRetryDelayMs,\n view: input.runtime.resolvedView,\n });\n\n if (startOutcome.reason === \"cancelled\") {\n await clearDaemonStartFailureStateSafely();\n return { ok: false, result: \"cancelled\" };\n }\n\n const blockReason = resolveDaemonReinstallStartBlockedReason(\n startOutcome.reason\n );\n if (blockReason) {\n // The blocked verdict can be computed while the freshly installed bundle\n // is still starting (it has not written its runtime lease yet). Re-check\n // the live inventory once before telling the user the start was blocked;\n // a healthy running service means the update actually completed.\n const recheckedInventory = await inspectDaemonServiceInventory({\n expectedVersion: input.resolved.daemonVersion,\n intendedMode: \"background\",\n intent: \"reinstall\",\n }).catch(() => null);\n if (\n recheckedInventory &&\n isDaemonInventoryRunningAndAligned(recheckedInventory)\n ) {\n await clearDaemonStartFailureStateSafely();\n return createDaemonReinstallCompletedOutcome({\n backupDataPath: null,\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n serviceState: \"running\",\n });\n }\n return createDaemonReinstallStartBlockedOutcome({\n backupDataPath: null,\n blockReason,\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n startFailureVerdict: startOutcome.startFailureVerdict,\n });\n }\n\n if (startOutcome.reason === \"start_failed\") {\n return createDaemonReinstallStartFailedOutcome({\n backupDataPath: null,\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n startFailureVerdict: startOutcome.startFailureVerdict,\n });\n }\n\n await waitForDaemonHealthyAfterReinstall({\n expectedVersion: input.resolved.daemonVersion,\n readDaemonStatus: input.resolved.readDaemonStatus,\n verifyWaitMs: input.resolved.verifyWaitMs,\n });\n\n await clearDaemonStartFailureStateSafely();\n return createDaemonReinstallCompletedOutcome({\n backupDataPath: null,\n desiredState: input.desiredState,\n forceUsed: input.forceUsed,\n serviceState: \"running\",\n });\n}\n\nasync function runDaemonAfterReinstallStartWithRetry(input: {\n desiredState: \"background\" | \"stopped\";\n forceUsed: boolean;\n gatewayUrl?: string;\n profile?: string;\n resolved: ReturnType<typeof resolveDaemonReinstallOptions>;\n startRetryDelayMs: number;\n view: RuntimeContext[\"resolvedView\"];\n}): Promise<{\n reason: DaemonRunResult[\"reason\"];\n startFailureVerdict: SystemServiceStartupFailureVerdict | null;\n}> {\n const startFailureLogCursor = await captureDaemonStartFailureLogCursor();\n for (\n let attempt = 1;\n attempt <= REINSTALL_START_RETRY_ATTEMPTS;\n attempt += 1\n ) {\n const previousExitCode = process.exitCode;\n try {\n const result = await runDaemonRunAfterEntryChecks(\n {\n agentOverviewHandled: true,\n gatewayUrl: input.gatewayUrl,\n mode: \"background\",\n outputMode: \"silent\",\n profile: input.profile,\n suppressStartSpinner: true,\n view: input.view,\n },\n input.resolved.runRun\n );\n if (\n result.ok ||\n isDaemonRunAlreadyRunningReason(result.reason) ||\n normalizeDaemonRunReason(result.reason) === \"cancelled\"\n ) {\n process.exitCode = previousExitCode;\n }\n if (\n normalizeDaemonRunReason(result.reason) === \"start_failed\" &&\n attempt < REINSTALL_START_RETRY_ATTEMPTS &&\n !(\n result.ok === false &&\n (result.startFailureVerdict?.localMachineIssue?.recoveryPolicy ===\n \"user_action\" ||\n (result.startFailureVerdict?.jobDiagnostics &&\n isDaemonServiceJobSpawnPending(\n result.startFailureVerdict.jobDiagnostics\n )))\n )\n ) {\n process.exitCode = previousExitCode;\n await sleep(input.startRetryDelayMs);\n continue;\n }\n return {\n reason: result.reason,\n startFailureVerdict:\n result.ok === false ? (result.startFailureVerdict ?? null) : null,\n };\n } catch (error) {\n const shouldRetry = attempt < REINSTALL_START_RETRY_ATTEMPTS;\n if (shouldRetry) {\n process.exitCode = previousExitCode;\n await sleep(input.startRetryDelayMs);\n continue;\n }\n\n const startupDiagnostic = await readDaemonStartFailureLogDiagnostic({\n cursor: startFailureLogCursor,\n });\n throw new DaemonReinstallUnexpectedStartError({\n cause: error,\n desiredState: input.desiredState,\n diagnosticDetail: startupDiagnostic?.detail ?? null,\n forceUsed: input.forceUsed,\n });\n }\n }\n\n return { reason: \"start_failed\", startFailureVerdict: null };\n}\n\nasync function resolveDaemonReinstallTargetDesiredState(): Promise<\n \"stopped\" | \"background\"\n> {\n const currentContract = await readDaemonServiceContract().catch(() => null);\n if (currentContract) {\n return currentContract.desiredState;\n }\n\n const runtimeContext = await readCurrentDaemonRuntimeContext().catch(\n () => null\n );\n if (\n runtimeContext?.effectiveRuntimeStatus === \"running\" &&\n runtimeContext.runtimeStatus.mode === \"background\"\n ) {\n return \"background\";\n }\n\n return \"stopped\";\n}\n\nasync function applyDaemonReinstallTargetDesiredState(input: {\n runtime: RuntimeContext;\n desiredState: \"stopped\" | \"background\";\n gatewayUrl?: string;\n profile?: string;\n}): Promise<void> {\n if (input.desiredState === \"stopped\") {\n await maybeWriteDaemonStoppedContract({\n runtime: input.runtime,\n });\n return;\n }\n\n const serviceManager = await resolveDaemonServiceManager().catch(() => null);\n await maybeWriteDaemonServiceContract({\n runtime: input.runtime,\n desiredState: \"background\",\n serviceController: serviceManager?.controller,\n autoStart: true,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.profile,\n contractProfileId: input.profile,\n allowDetachedFallback: serviceManager === null,\n });\n}\n\nfunction isDaemonInventoryRunningAndAligned(\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>\n): boolean {\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: inventory.expectedVersion,\n }),\n });\n if (decision.status !== \"already_aligned\") {\n return false;\n }\n return (\n getEffectiveDaemonRuntimeStatus({\n runtimeState: inventory.runtimeStatus,\n serviceManagerStatus: inventory.serviceManagerStatus,\n }) === \"running\" &&\n inventory.runtimeStatus.mode === \"background\" &&\n inventory.serviceManagerStatus?.running === true\n );\n}\n\nfunction resolveDaemonReinstallOptions(\n options: DaemonReinstallInternalOptions & { daemonVersion: string }\n): {\n drainWaitMs: number;\n daemonVersion: string;\n cliScriptPath?: string;\n runRun: typeof runDaemonRun;\n readDaemonStatus: typeof getDaemonStatus;\n withReconcileLock: typeof withDaemonServiceReconcileLock;\n timeoutPolicy: DaemonReinstallTimeoutPolicy;\n skipConfirm: boolean;\n verifyWaitMs: number;\n startRetryDelayMs: number;\n startAfterInstallMode: \"default\" | \"always\" | \"never\";\n forceReinstall: boolean;\n resolveUpdateUrgency: typeof resolveServiceUpdateUrgency;\n scheduleServiceUpdate: typeof scheduleDaemonServiceUpdate;\n} {\n const daemonVersion = options.daemonVersion;\n return {\n drainWaitMs: options.drainWaitMs ?? REINSTALL_DRAIN_WAIT_MS,\n daemonVersion,\n runRun: options.runRun ?? runDaemonRun,\n readDaemonStatus: options.readDaemonStatus ?? getDaemonStatus,\n withReconcileLock:\n options.withReconcileLock ??\n (async <T>(callback: () => Promise<T>) =>\n await withDaemonServiceReconcileLock(callback, {\n intent: \"reinstall\",\n command: \"openmeld service repair\",\n })),\n timeoutPolicy: options.timeoutPolicy ?? \"abort\",\n skipConfirm: options.skipConfirm ?? false,\n verifyWaitMs: options.verifyWaitMs ?? REINSTALL_VERIFY_WAIT_MS,\n startRetryDelayMs:\n options.startRetryDelayMs ?? REINSTALL_START_RETRY_DELAY_MS,\n startAfterInstallMode: options.startAfterInstallMode ?? \"default\",\n forceReinstall: options.forceReinstall ?? false,\n resolveUpdateUrgency:\n options.resolveUpdateUrgency ?? resolveServiceUpdateUrgency,\n scheduleServiceUpdate:\n options.scheduleServiceUpdate ?? scheduleDaemonServiceUpdate,\n };\n}\n\nasync function resolveAlreadyHealthyDaemonRepair(input: {\n expectedVersion: string;\n cliScriptPath?: string;\n gatewayUrl?: string;\n}): Promise<Extract<\n DaemonReinstallOutcome,\n { result: \"already_healthy\" }\n> | null> {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intent: \"reinstall\",\n ...(input.cliScriptPath ? { cliScriptPath: input.cliScriptPath } : {}),\n });\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory,\n target: buildDaemonServiceTargetSpec({\n daemonVersion: input.expectedVersion,\n gatewayUrl: input.gatewayUrl,\n }),\n });\n if (decision.status !== \"already_aligned\") {\n return null;\n }\n if (!inventory.serviceContract) {\n return null;\n }\n const desiredState = inventory.serviceContract.desiredState;\n const effectiveRuntimeStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState: inventory.runtimeStatus,\n serviceManagerStatus: inventory.serviceManagerStatus,\n });\n let serviceState: DaemonReinstallServiceState | null = null;\n if (effectiveRuntimeStatus === \"running\") {\n serviceState = \"running\";\n } else if (effectiveRuntimeStatus === \"not_running\") {\n serviceState = \"stopped\";\n }\n if (\n !serviceState ||\n (desiredState === \"background\" && serviceState !== \"running\") ||\n (desiredState === \"stopped\" && serviceState !== \"stopped\")\n ) {\n return null;\n }\n return createDaemonReinstallAlreadyHealthyOutcome({\n desiredState,\n serviceState,\n });\n}\n\nfunction resolveDaemonReinstallStartMode(input: {\n targetDesiredState: \"stopped\" | \"background\";\n startAfterInstallMode: \"default\" | \"always\" | \"never\";\n}): \"always\" | \"never\" {\n if (input.startAfterInstallMode !== \"default\") {\n return input.startAfterInstallMode;\n }\n return input.targetDesiredState === \"background\" ? \"always\" : \"never\";\n}\n\nasync function resolveReinstallForceDecisionOnTimeout(input: {\n action: DaemonServiceMaintenanceAction;\n runtime: RuntimeContext;\n timeoutPolicy: DaemonReinstallTimeoutPolicy;\n drainWaitMs: number;\n}): Promise<boolean> {\n if (input.timeoutPolicy === \"force\") {\n return true;\n }\n if (input.timeoutPolicy === \"abort\") {\n return false;\n }\n if (!canUseInteractivePrompts(input.runtime)) {\n return false;\n }\n const actionLabel = formatDaemonServiceMaintenanceActionLabel(input.action);\n const selected = await confirm({\n message: `Graceful shutdown timed out after ${String(\n input.drainWaitMs\n )}ms. Force continue ${actionLabel} now? (may terminate in-flight tasks)`,\n initialValue: false,\n });\n return !(isCancel(selected) || !selected);\n}\n\nasync function waitForDaemonHealthyAfterReinstall(input: {\n expectedVersion: string;\n readDaemonStatus: typeof getDaemonStatus;\n verifyWaitMs: number;\n}): Promise<DaemonServiceRuntimeStatus> {\n const deadline = Date.now() + input.verifyWaitMs;\n let lastRuntime: DaemonServiceRuntimeStatus | null = null;\n while (Date.now() < deadline) {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.expectedVersion,\n intendedMode: \"background\",\n intent: \"reinstall\",\n readDaemonStatus: input.readDaemonStatus,\n }).catch(() => null);\n if (inventory && isDaemonInventoryRunningAndAligned(inventory)) {\n return inventory.runtimeStatus;\n }\n lastRuntime =\n inventory?.runtimeStatus ??\n (await readCurrentObservedDaemonRuntimeStatus());\n await sleep(REINSTALL_VERIFY_POLL_MS);\n }\n\n const statusText = lastRuntime\n ? describeDaemonRuntimeStatus(lastRuntime)\n : \"No runtime status available.\";\n throw new Error(\n `OpenMeld Service repair verification timed out after ${String(\n input.verifyWaitMs\n )}ms. ${statusText}`\n );\n}\n\nasync function confirmDaemonReinstall(\n runtime: RuntimeContext,\n force: boolean | undefined,\n action: DaemonServiceMaintenanceAction = \"repair\"\n): Promise<boolean> {\n if (!canUseInteractivePrompts(runtime)) {\n return true;\n }\n\n const actionTitle = formatDaemonServiceMaintenanceActionTitle(action);\n let message = `${actionTitle} OpenMeld Service now? (graceful drain first; timeout will abort)`;\n if (action === \"update\") {\n message =\n \"Update OpenMeld Service? OpenMeld will finish the update in the background when running work is safe.\";\n } else if (force) {\n message = `Force ${formatDaemonServiceMaintenanceActionLabel(\n action\n )} OpenMeld Service now? (may terminate in-flight tasks)`;\n }\n const confirmed = await confirm({\n message,\n initialValue: true,\n });\n if (isCancel(confirmed) || !confirmed) {\n cancel(\"Cancelled.\");\n return false;\n }\n return true;\n}\n\nconst DAEMON_TEARDOWN_STRICT_DEPS: DaemonTeardownStrictDependencies = {\n readCurrentObservedDaemonRuntimeStatus,\n getDaemonStatus,\n resolveDaemonServiceManagerForRuntimeState,\n clearDaemonServiceRuntimeState,\n cleanupLegacySharedDaemonServiceState,\n listDaemonOwnedProcesses,\n stopDaemonProcess,\n waitForSystemServiceToStop,\n uninstallDaemon,\n uninstallServiceUpdateWorker: uninstallDaemonServiceUpdateWorker,\n withRegistrationMutationLock: withDaemonServiceRegistrationMutationLock,\n};\n\nexport async function runDaemonTeardownStrict(\n input: DaemonTeardownStrictInput,\n overrides: Partial<DaemonTeardownStrictDependencies> = {}\n): Promise<DaemonTeardownStrictResult> {\n const deps: DaemonTeardownStrictDependencies = {\n ...DAEMON_TEARDOWN_STRICT_DEPS,\n ...overrides,\n };\n return await deps.withRegistrationMutationLock(\n async () => await runDaemonTeardownStrictWithLock(input, deps),\n {\n intent: \"uninstall\",\n command:\n input.reason === \"reset\"\n ? \"openmeld reset\"\n : \"openmeld service uninstall\",\n }\n );\n}\n\nasync function runDaemonTeardownStrictWithLock(\n input: DaemonTeardownStrictInput,\n deps: DaemonTeardownStrictDependencies\n): Promise<DaemonTeardownStrictResult> {\n const context = await resolveDaemonStrictTeardownContext({\n deps,\n reason: input.reason,\n });\n const stopSignal = await stopDaemonForStrictTeardown({\n context,\n deps,\n reason: input.reason,\n });\n await ensureRuntimeStoppedAfterStrictTeardownStop({\n deps,\n reason: input.reason,\n });\n const systemServiceUninstalled =\n await uninstallSystemServiceForStrictTeardown({\n context,\n reason: input.reason,\n });\n await verifySystemServiceRemovedAfterStrictTeardown({\n context,\n reason: input.reason,\n });\n await ensureRuntimeCleanAfterStrictTeardown({\n deps,\n reason: input.reason,\n });\n await deps.uninstallServiceUpdateWorker();\n const legacySharedCleanup = context.legacySharedService?.present\n ? await deps.cleanupLegacySharedDaemonServiceState()\n : { removed: false };\n const uninstallResult =\n input.removeInstallFiles === false\n ? { removed: false }\n : await deps.uninstallDaemon();\n\n return {\n removed:\n uninstallResult.removed ||\n legacySharedCleanup.removed ||\n systemServiceUninstalled,\n stopSignal,\n systemServiceController: context.serviceManager?.controller ?? null,\n systemServiceUninstalled,\n };\n}\n\nexport async function runDaemonStatus(input: DaemonStatusInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n profile: input.profile,\n view: input.view,\n });\n if (input.json === true) {\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const localSnapshot = await resolveDaemonLocalStatusSnapshot();\n const snapshot = await resolveDaemonStatusSnapshot({\n localSnapshot,\n runtime,\n });\n const channelAssessment = await assessCliUpdate({ environmentTarget });\n const cliVersion = toDaemonStatusCliVersionPayload(channelAssessment);\n const serverAssessment = await assessServerRequiredVersion({\n gatewayUrl: environmentTarget.gatewayUrl,\n });\n emitCliJsonEnvelope(\n buildDaemonStatusJsonPayload({\n cliVersion,\n environmentTarget,\n localSnapshot,\n serverRequirementAssessment: serverAssessment,\n serverRequirementChannelAssessment: channelAssessment,\n snapshot,\n })\n );\n return;\n }\n\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"status\",\n handled: input.agentOverviewHandled,\n });\n if (runtime.resolvedView === \"agent\") {\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const localSnapshot = await resolveDaemonLocalStatusSnapshot();\n emitDaemonAgentLocalStatus({\n environmentTarget,\n presenter,\n snapshot: localSnapshot,\n });\n const snapshot = await resolveDaemonStatusSnapshot({\n localSnapshot,\n runtime,\n });\n emitDaemonAgentStatus({\n environmentTarget,\n presenter,\n snapshot,\n });\n return;\n }\n\n const snapshot = await resolveDaemonStatusSnapshot({\n runtime,\n });\n\n await emitDaemonStatusForView({\n presenter,\n snapshot,\n view: runtime.resolvedView,\n });\n\n if (runtime.resolvedView === \"human\") {\n await emitVersionReconciliationForHumanStatus({\n gatewayUrl: input.gatewayUrl,\n presenter,\n snapshot,\n });\n }\n}\n\n// Dual-channel version card for the plain human `openmeld service status`\n// view: the release channel (already checked elsewhere) alongside the\n// server-required visor (new — W-REL-DOCTOR), with a one-line verdict when\n// they disagree. Kept out of the main status card so it never disturbs that\n// card's existing row-order assertions.\nasync function emitVersionReconciliationForHumanStatus(input: {\n gatewayUrl?: string;\n presenter: ReturnType<typeof createPresenter>;\n snapshot: Awaited<ReturnType<typeof resolveDaemonStatusSnapshot>>;\n}): Promise<void> {\n const environmentTarget = await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n });\n const channelAssessment = await assessCliUpdate({ environmentTarget });\n const serverAssessment = await assessServerRequiredVersion({\n gatewayUrl: environmentTarget.gatewayUrl,\n });\n const daemonStatus = input.snapshot.currentReplyReadiness.daemonStatus;\n renderVersionReconciliationCard({\n channel: channelAssessment,\n installedServiceVersion:\n daemonStatus.installed && daemonStatus.state\n ? daemonStatus.state.daemonVersion\n : null,\n presenter: input.presenter,\n server: serverAssessment,\n });\n}\n\nexport async function runDaemonSnapshot(input: DaemonBaseInput): Promise<{\n evidencePath: string;\n manifestPath: string;\n}> {\n const runtime = await resolveRuntimeContext({\n profile: input.profile,\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"snapshot\",\n handled: input.agentOverviewHandled,\n });\n const result = await captureDaemonServiceEvidence({\n runtime,\n });\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.snapshot.result\",\n payload: result,\n });\n } else {\n presenter.line({\n code: \"daemon.snapshot.saved\",\n text: `OpenMeld service evidence snapshot saved at ${result.evidencePath}.`,\n });\n }\n return result;\n}\n\nexport async function runDaemonInterrupt(\n input: DaemonControlInput\n): Promise<void> {\n await runDaemonControlCommand({\n ...input,\n command: \"interrupt\",\n });\n}\n\nexport async function runDaemonCancel(\n input: DaemonControlInput\n): Promise<void> {\n await runDaemonControlCommand({\n ...input,\n command: \"cancel\",\n });\n}\n\nfunction toDaemonStatusCliVersionPayload(assessment: CliUpdateAssessment): {\n checked: boolean;\n currentVersion: string;\n latestVersion: string | null;\n requiredVersion: string | null;\n updateAvailable: boolean;\n} {\n return {\n checked: assessment.checked,\n currentVersion: assessment.currentVersion,\n latestVersion: assessment.latestVersion,\n requiredVersion: assessment.requiredFloor,\n updateAvailable: assessment.updateAvailable,\n };\n}\n\nexport async function runDaemonStatusFlow(\n input: DaemonStatusInput\n): Promise<DaemonInteractiveCommandResult> {\n await runDaemonStatus(input);\n return \"completed\";\n}\n\nasync function resolveDaemonRunAuthReadiness(input: {\n gatewayUrl?: string;\n}): Promise<DaemonRunAuthReadiness> {\n const authState = await Promise.resolve(\n getAuthSessionState({\n validateRemote: false,\n })\n ).catch((error: unknown) => {\n console.warn(\"[openmeld.service.auth_session_read_failed]\", {\n error: toErrorMessage(error),\n });\n return null;\n });\n const session = authState?.session ?? null;\n if (authState?.state !== \"valid\" || !session) {\n console.warn(\"[openmeld.service.auth_session_not_ready]\", {\n error: authState?.errorMessage,\n reasonCode: authState?.reasonCode ?? \"session_state_unavailable\",\n state: authState?.state ?? \"unavailable\",\n });\n const guidance = resolveAuthenticationGuidance({\n reason: \"required\",\n action: \"starting OpenMeld Service\",\n });\n return {\n ready: false,\n reason: \"authentication_required\",\n guidance,\n nextSteps: [\n formatInlineOpenMeldCliCommands(\n \"Run `openmeld login` in an interactive terminal.\"\n ),\n formatInlineOpenMeldCliCommands(\n \"After sign-in succeeds, run `openmeld service start` again.\"\n ),\n ],\n };\n }\n\n const resolvedGatewayUrl = await resolveBaseUrlOrNull(input.gatewayUrl);\n if (\n resolvedGatewayUrl &&\n !canAttachAuthTokenToRequest(session, resolvedGatewayUrl)\n ) {\n const authBaseUrl = String(session.authBaseUrl ?? \"\").trim();\n const guidance = resolveAuthenticationGuidance({\n reason: \"mismatch\",\n action: \"starting OpenMeld Service\",\n authBaseUrl,\n gatewayUrl: resolvedGatewayUrl,\n });\n return {\n ready: false,\n reason: \"authentication_environment_mismatch\",\n guidance,\n nextSteps: [\n formatInlineOpenMeldCliCommands(\n \"Run `openmeld login` in an interactive terminal for this OpenMeld environment.\"\n ),\n `Gateway: ${resolvedGatewayUrl}`,\n ...(authBaseUrl ? [`Signed in to: ${authBaseUrl}`] : []),\n formatInlineOpenMeldCliCommands(\n \"After sign-in succeeds, run `openmeld service start` again.\"\n ),\n ],\n };\n }\n\n return {\n ready: true,\n };\n}\n\nfunction emitDaemonRunAuthRequired(input: {\n readiness: Exclude<DaemonRunAuthReadiness, { ready: true }>;\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n}): void {\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"daemon.run.auth_required\",\n payload: {\n ok: false,\n reason: input.readiness.reason,\n message: input.readiness.guidance.agentErrorMessage,\n nextSteps: input.readiness.nextSteps,\n guidanceReason: input.readiness.guidance.reason,\n ...(input.readiness.guidance.authBaseUrl\n ? { authBaseUrl: input.readiness.guidance.authBaseUrl }\n : {}),\n ...(input.readiness.guidance.gatewayUrl\n ? { gatewayUrl: input.readiness.guidance.gatewayUrl }\n : {}),\n },\n });\n return;\n }\n\n const card = buildHumanAuthenticationCard({\n guidance: input.readiness.guidance,\n mode: \"error\",\n });\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: \"daemon.run.auth_required\",\n title: card.title,\n rows: card.rows,\n });\n}\n\nfunction emitDaemonRunServiceDependenciesUnavailable(input: {\n presenter: ReturnType<typeof createPresenter>;\n diagnostics: DaemonRunServiceDependencyDiagnostics;\n runtime: RuntimeContext;\n}): void {\n const summary = buildDaemonServiceDependencySummary({\n issues: input.diagnostics.issues,\n lane: input.diagnostics.lane,\n });\n const meaning = buildDaemonServiceDependencyMeaning({\n issues: input.diagnostics.issues,\n lane: input.diagnostics.lane,\n });\n const nextStep = buildDaemonServiceDependencyNextStep({\n command: \"start\",\n issues: input.diagnostics.issues,\n lane: input.diagnostics.lane,\n });\n\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"daemon.run.service_dependencies_unavailable\",\n payload: {\n ok: false,\n reason: \"service_dependencies_unavailable\",\n message: `${summary} ${meaning}`,\n nextSteps: [\n buildDaemonServiceDependencyDetails({\n issues: input.diagnostics.issues,\n }),\n nextStep,\n ],\n },\n });\n return;\n }\n\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: \"daemon.run.service_dependencies_unavailable\",\n title: buildDaemonServiceDependencyTitle({\n issues: input.diagnostics.issues,\n lane: input.diagnostics.lane,\n }),\n rows: [\n {\n label: \"❌ Status\",\n value: \"service dependencies unavailable\",\n },\n {\n label: \"📝 Found\",\n value: `${summary}\\n${buildDaemonServiceDependencyDetails({\n issues: input.diagnostics.issues,\n })}`,\n },\n {\n label: \"📡 Local Service Link\",\n value: meaning,\n },\n {\n label: \"🔧 Next\",\n value: nextStep,\n },\n ],\n });\n}\n\ntype ResolvedDaemonStartFailure = {\n reason: DaemonStartFailureState[\"reason\"];\n detail: string;\n rawLogLine: string | null;\n dependencyIssues: DaemonServiceDependencyIssue[];\n dependencyDiagnostics: DaemonRunServiceDependencyDiagnostics | null;\n};\n\nasync function resolveDaemonStartFailure(input: {\n cursor?: Awaited<\n ReturnType<typeof captureDaemonStartFailureLogCursor>\n > | null;\n fallbackRawLine?: string | null;\n gatewayUrl?: string;\n}): Promise<ResolvedDaemonStartFailure | null> {\n const startupDiagnostic = input.cursor\n ? await readDaemonStartFailureLogDiagnostic({\n cursor: input.cursor,\n }).catch(() => null)\n : null;\n const rawLogLine =\n normalizeOptionalText(startupDiagnostic?.rawLine) ??\n normalizeOptionalText(input.fallbackRawLine) ??\n null;\n if (\n rawLogLine &&\n isDaemonStartFailureLikelyDependencyRequestFailure(rawLogLine)\n ) {\n const dependencyDiagnostics =\n await resolveDaemonServiceDependencyDiagnostics({\n gatewayUrl: input.gatewayUrl,\n scopePolicy: \"all\",\n }).catch(() => null);\n if (dependencyDiagnostics?.applicable && !dependencyDiagnostics.ready) {\n return {\n reason: \"service_dependencies_unavailable\",\n detail: `${buildDaemonServiceDependencySummary({\n issues: dependencyDiagnostics.issues,\n lane: dependencyDiagnostics.lane,\n })} ${buildDaemonServiceDependencyMeaning({\n issues: dependencyDiagnostics.issues,\n lane: dependencyDiagnostics.lane,\n })}`,\n rawLogLine,\n dependencyIssues: dependencyDiagnostics.issues,\n dependencyDiagnostics,\n };\n }\n }\n\n const detail =\n normalizeOptionalText(startupDiagnostic?.detail) ??\n (rawLogLine ? summarizeDaemonStartFailureLogLine(rawLogLine) : null);\n if (!detail) {\n return null;\n }\n\n return {\n reason: \"startup_failed\",\n detail,\n rawLogLine,\n dependencyIssues: [],\n dependencyDiagnostics: null,\n };\n}\n\nasync function writeDaemonStartFailureStateSafely(\n failure: ResolvedDaemonStartFailure\n): Promise<void> {\n await Promise.resolve(\n writeDaemonStartFailureState({\n detail: failure.detail,\n rawLogLine: failure.rawLogLine,\n reason: failure.reason,\n dependencyIssues: failure.dependencyIssues,\n })\n ).catch(() => undefined);\n}\n\nasync function clearDaemonStartFailureStateSafely(): Promise<void> {\n await Promise.resolve(clearDaemonStartFailureState()).catch(() => undefined);\n}\n\ntype DaemonRunStartFailurePayload = {\n codePrefix: string;\n controller?: DaemonServiceManager[\"controller\"];\n error: unknown;\n autoRepairAttempted?: boolean;\n recovery?: SystemServiceStartupRecoveryReport | null;\n};\n\nfunction resolveDaemonRunStartFailureVerdict(input: {\n detail: string | null;\n payload: DaemonRunStartFailurePayload;\n}): SystemServiceStartupFailureVerdict | null {\n if (!input.payload.controller) {\n return null;\n }\n return resolveSystemServiceStartupFailureVerdict({\n controller: input.payload.controller,\n error: input.payload.error,\n detail: input.detail,\n });\n}\n\nfunction buildLocalMachineIssuePayload(\n verdict: SystemServiceStartupFailureVerdict | null\n):\n | {\n localMachineIssue: NonNullable<\n SystemServiceStartupFailureVerdict[\"localMachineIssue\"]\n >;\n }\n | Record<string, never> {\n if (!verdict?.localMachineIssue) {\n return {};\n }\n return { localMachineIssue: verdict.localMachineIssue };\n}\n\nfunction buildDaemonRunStartFailureResult(\n verdict: SystemServiceStartupFailureVerdict | null\n): DaemonRunResult {\n if (!verdict) {\n return { ok: false, reason: \"start_failed\" };\n }\n return {\n ok: false,\n reason: \"start_failed\",\n startFailureVerdict: verdict,\n };\n}\n\nasync function handleDaemonRunStartFailure(input: {\n cursor?: Awaited<\n ReturnType<typeof captureDaemonStartFailureLogCursor>\n > | null;\n fallbackRawLine?: string | null;\n gatewayUrl?: string;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n genericErrorPayload: DaemonRunStartFailurePayload;\n}): Promise<DaemonRunResult> {\n const failure = await resolveDaemonStartFailure({\n cursor: input.cursor ?? null,\n fallbackRawLine: input.fallbackRawLine,\n gatewayUrl: input.gatewayUrl,\n });\n if (failure) {\n await writeDaemonStartFailureStateSafely(failure);\n }\n\n if (\n failure?.reason === \"service_dependencies_unavailable\" &&\n failure.dependencyDiagnostics\n ) {\n emitDaemonRunServiceDependenciesUnavailable({\n presenter: input.presenter,\n diagnostics: failure.dependencyDiagnostics,\n runtime: input.runtime,\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: \"start_failed\",\n };\n }\n\n const startFailureVerdict = resolveDaemonRunStartFailureVerdict({\n detail: failure?.detail ?? null,\n payload: input.genericErrorPayload,\n });\n\n if (input.runtime.resolvedView === \"agent\") {\n const message = input.genericErrorPayload.controller\n ? buildSystemServiceStartupFailureMessage({\n controller: input.genericErrorPayload.controller,\n error: input.genericErrorPayload.error,\n autoRepairAttempted: input.genericErrorPayload.autoRepairAttempted,\n detail: failure?.detail ?? null,\n })\n : [\n \"OpenMeld could not finish starting OpenMeld Service.\",\n ...(failure?.detail ? [`Last local detail: ${failure.detail}`] : []),\n `Next: ${formatInlineOpenMeldCliCommands(\n \"Run `openmeld service repair` once. OpenMeld saved the startup evidence for diagnostics.\"\n )}`,\n ].join(\"\\n\");\n input.presenter.data({\n code: \"daemon.run.start_failed\",\n payload: {\n ok: false,\n reason: \"system_service_start_failed\",\n message,\n ...buildLocalMachineIssuePayload(startFailureVerdict),\n diagnostics: buildSystemServiceStartupFailureDiagnostics({\n autoRepairAttempted: input.genericErrorPayload.autoRepairAttempted,\n controller: input.genericErrorPayload.controller,\n error: input.genericErrorPayload.error,\n recovery: input.genericErrorPayload.recovery ?? null,\n }),\n },\n });\n } else if (input.genericErrorPayload.controller) {\n const failureReport = buildSystemServiceStartupFailureReport({\n controller: input.genericErrorPayload.controller,\n error: input.genericErrorPayload.error,\n autoRepairAttempted: input.genericErrorPayload.autoRepairAttempted,\n detail: failure?.detail ?? null,\n });\n renderServiceActionCard({\n presenter: input.presenter,\n title: failureReport.title,\n codePrefix: input.genericErrorPayload.codePrefix,\n rows: failureReport.rows,\n });\n } else {\n const card = buildDaemonStartNeedsAttentionCard({\n summary: \"OpenMeld could not finish starting OpenMeld Service.\",\n detail: failure?.detail ?? undefined,\n nextStep: formatInlineOpenMeldCliCommands(\n \"Run `openmeld service repair` once. OpenMeld saved the startup evidence for diagnostics.\"\n ),\n });\n renderServiceActionCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: input.genericErrorPayload.codePrefix,\n rows: card.rows,\n });\n }\n process.exitCode = 1;\n // Carry the presentation-only verdict so a suppressed (silent) reinstall start\n // can still surface the detailed BTM/crash card upstream. Omit it entirely\n // when there is no controller context, keeping the bare start_failed result\n // shape unchanged for callers that assert on it exactly.\n return buildDaemonRunStartFailureResult(startFailureVerdict);\n}\n\nasync function runDirectDaemonServiceLoop(input: {\n gatewayUrl?: string;\n deviceId?: string;\n heartbeatMs?: number;\n mode: DaemonRunMode;\n presenter: ReturnType<typeof createPresenter>;\n openMeldProfileId?: string;\n runtime: RuntimeContext;\n}): Promise<DaemonRunResult> {\n await clearDaemonStartFailureStateSafely();\n const crashGuard = installDaemonProcessCrashGuard();\n try {\n await runDaemonServiceLoop({\n baseUrl: input.gatewayUrl,\n deviceId: input.deviceId,\n mode: input.mode,\n heartbeatIntervalMs: input.heartbeatMs,\n presenter: input.presenter,\n profile: input.openMeldProfileId,\n });\n return {\n ok: true,\n reason: \"started\",\n };\n } catch (error) {\n return await handleDaemonRunStartFailure({\n fallbackRawLine: toErrorMessage(error),\n gatewayUrl: input.gatewayUrl,\n presenter: input.presenter,\n runtime: input.runtime,\n genericErrorPayload: {\n codePrefix: \"daemon.run.start_failed\",\n error,\n },\n });\n } finally {\n crashGuard.dispose();\n }\n}\n\nasync function ensureInteractiveDaemonRunAuthenticationOrCancel(input: {\n gatewayUrl?: string;\n runtime: RuntimeContext;\n}): Promise<boolean> {\n if (\n input.runtime.resolvedView !== \"human\" ||\n !canUseInteractivePrompts(input.runtime)\n ) {\n return true;\n }\n\n const resolvedGatewayUrl = await resolveBaseUrlOrNull(input.gatewayUrl);\n return await ensureCommandAuthenticationOrCancel({\n runtime: input.runtime,\n ...(resolvedGatewayUrl ? { gatewayUrl: resolvedGatewayUrl } : {}),\n promptMessage:\n \"Sign in is required before OpenMeld Service can start. What do you want to do?\",\n allowPrompt: true,\n });\n}\n\nasync function runDaemonRunInteractivePreflightBeforeModePrompt(input: {\n daemonVersion: string;\n input: DaemonRunInput;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}): Promise<DaemonRunResult | null> {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.daemonVersion,\n }).catch(() => null);\n if (inventory && shouldBlockDaemonRunFromInventory(inventory)) {\n emitDaemonRunBlockedByInventory({\n inventory,\n presenter: input.presenter,\n runtime: input.runtime,\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: \"cleanup_required\",\n };\n }\n\n const { runtimeStatus, effectiveRuntimeStatus } =\n await readCurrentDaemonRuntimeContext();\n if (effectiveRuntimeStatus === \"running\") {\n emitDaemonAlreadyRunningState(\n input.runtime,\n input.presenter,\n runtimeStatus\n );\n return createDaemonAlreadyRunningResult();\n }\n\n const authReadiness = await resolveDaemonRunAuthReadiness({\n gatewayUrl: input.input.gatewayUrl,\n });\n if (!authReadiness.ready) {\n emitDaemonRunAuthRequired({\n readiness: authReadiness,\n presenter: input.presenter,\n runtime: input.runtime,\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: authReadiness.reason,\n };\n }\n\n return null;\n}\n\nexport async function runDaemonStop(\n input: DaemonStopInput,\n internal: { completedControlledShutdownOwnerPid?: number } = {}\n): Promise<SharedDaemonStopResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter =\n input.json === true\n ? createQuietPresenter(runtime)\n : createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"stop\",\n handled: input.agentOverviewHandled || input.json === true,\n });\n const result = await withDaemonServiceStopLock(\n async () =>\n await runWithDaemonLifecycleCommandJournal({\n command: \"openmeld service stop\",\n intent: \"stop\",\n metadata: {\n force: input.force ?? false,\n mode: \"interactive\",\n },\n resolveResult: (stopResult) =>\n summarizeDaemonStopJournalResult(stopResult),\n run: async () => {\n if (resolveOpenMeldEnvPreset() === \"dev-local\") {\n await uninstallDaemonServiceUpdateWorker();\n }\n const stopped = await executeDaemonStopCommand({\n completedControlledShutdownOwnerPid:\n internal.completedControlledShutdownOwnerPid,\n force: input.force,\n presenter,\n profile: input.profile,\n runtime,\n });\n if (\n resolveOpenMeldEnvPreset() === \"dev-local\" &&\n (stopped.status === \"stopped\" || stopped.status === \"not_running\")\n ) {\n const manager = await resolveDaemonServiceManager();\n if (manager) {\n await manager.stop();\n await manager.waitUntilStopped();\n }\n }\n return stopped;\n },\n }),\n {\n intent: \"stop\",\n command: \"openmeld service stop\",\n }\n );\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.stop\",\n ...result,\n });\n }\n return result;\n}\n\nexport async function runDaemonAutostart(\n input: DaemonAutostartInput,\n options: DaemonAutostartInternalOptions = {}\n): Promise<{\n action: \"enable\" | \"disable\";\n controller: DaemonServiceManager[\"controller\"];\n enabled: boolean;\n serviceManagerStatus: Awaited<ReturnType<DaemonServiceManager[\"status\"]>>;\n}> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter =\n input.json === true\n ? createQuietPresenter(runtime)\n : createPresenter(runtime);\n\n const resolveServiceManager =\n options.resolveServiceManager ?? resolveDaemonServiceManager;\n const clearRegistrationRepairPending =\n options.clearRegistrationRepairPending ??\n clearDaemonServiceRegistrationRepairPending;\n const withRegistrationMutationLock =\n options.withRegistrationMutationLock ??\n withDaemonServiceRegistrationMutationLock;\n const result = await withRegistrationMutationLock(\n async () => {\n const serviceManager = await resolveServiceManager();\n if (!serviceManager) {\n throw new Error(\n \"OpenMeld Service autostart is unavailable because this device has no supported service manager.\"\n );\n }\n\n const before = await serviceManager.status();\n if (!before.installed) {\n throw new Error(\n \"OpenMeld Service is not installed. Run `openmeld service install` before changing service autostart.\"\n );\n }\n\n if (input.action === \"enable\") {\n await serviceManager.enableAutostart();\n } else {\n await serviceManager.disableAutostart();\n }\n\n const serviceManagerStatus = await serviceManager.status();\n const desiredEnabled = input.action === \"enable\";\n if (serviceManagerStatus.enabled !== desiredEnabled) {\n throw new Error(\n `OpenMeld Service autostart ${input.action} was not confirmed by ${serviceManager.controller}.`\n );\n }\n await clearRegistrationRepairPending();\n return {\n action: input.action,\n controller: serviceManager.controller,\n enabled: serviceManagerStatus.enabled,\n serviceManagerStatus,\n };\n },\n {\n intent: \"autostart\",\n command: `openmeld service autostart ${input.action}`,\n }\n );\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"daemon.autostart\",\n ...result,\n });\n return result;\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.autostart.result\",\n payload: result,\n });\n return result;\n }\n\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.autostart.completed\",\n title:\n result.enabled === true\n ? \"OpenMeld Service Autostart Enabled\"\n : \"OpenMeld Service Autostart Disabled\",\n rows: [\n {\n label: \"Status\",\n value:\n result.enabled === true\n ? \"OpenMeld Service is allowed to start automatically when you sign in.\"\n : \"OpenMeld Service will not start automatically when you sign in.\",\n },\n {\n label: \"Current process\",\n value:\n \"Current running or stopped state was left unchanged. Use `openmeld service status` to inspect it.\",\n },\n ],\n });\n\n return result;\n}\n\nasync function executeDaemonStopCommand(input: {\n completedControlledShutdownOwnerPid?: number;\n force?: boolean;\n presenter: ReturnType<typeof createPresenter>;\n profile?: string;\n runtime: RuntimeContext;\n}): Promise<SharedDaemonStopResult> {\n const stopResult = await stopCurrentLaneDaemonService({\n completedControlledShutdownOwnerPid:\n input.completedControlledShutdownOwnerPid,\n force: input.force,\n mode: \"interactive\",\n runtime: input.runtime,\n });\n\n if (stopResult.status === \"not_running\") {\n await maybeWriteDaemonStoppedContract({\n runtime: input.runtime,\n runtimeStatus: stopResult.runtimeStatus,\n });\n await handleDaemonNotRunningStopStatus(\n input.runtime,\n input.presenter,\n stopResult.runtimeStatus\n );\n return stopResult;\n }\n\n if (stopResult.status === \"cancelled\") {\n emitDaemonStopCancelled(input.runtime, input.presenter);\n return stopResult;\n }\n\n if (stopResult.status === \"warning\") {\n input.presenter.line({\n code:\n stopResult.reason === \"invalid_state\"\n ? \"daemon.stop.invalid_state\"\n : \"daemon.stop.timeout\",\n text: buildDaemonStopWarningText(stopResult),\n });\n return stopResult;\n }\n\n await maybeWriteDaemonStoppedContract({\n runtime: input.runtime,\n });\n await clearDaemonStartFailureStateSafely();\n input.presenter.line({\n code: stopResult.forcedAfterTimeout\n ? \"daemon.stop.killed\"\n : \"daemon.stop.success\",\n text: buildDaemonStopSuccessText(stopResult),\n });\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"daemon.stop.result\",\n payload: {\n ok: true,\n signal: stopResult.signal,\n pid: stopResult.pid,\n ...(stopResult.signal === \"system\" ? { status: \"stopped\" } : {}),\n },\n });\n }\n return stopResult;\n}\n\nexport async function bestEffortStopCurrentLaneDaemonService(input: {\n force?: boolean;\n runtime: RuntimeContext;\n}): Promise<SharedDaemonStopResult> {\n try {\n return await withDaemonServiceStopLock(\n async () =>\n await stopCurrentLaneDaemonService({\n force: input.force,\n mode: \"best_effort\",\n runtime: input.runtime,\n }),\n {\n intent: \"stop\",\n command: \"openmeld auth logout\",\n }\n );\n } catch (error) {\n if (!isOpenMeldLockError(error)) {\n throw error;\n }\n let errorMessage = error.message;\n const runtimeStatus = await readCurrentObservedDaemonRuntimeStatus().catch(\n (statusError: unknown) => {\n errorMessage = `${errorMessage}; service status could not be read: ${toErrorMessage(statusError)}`;\n return {\n status: \"unknown\" as const,\n mode: null,\n pid: null,\n startedAt: null,\n updatedAt: null,\n managedBySystemService: false,\n serviceController: \"unknown\" as const,\n autoStart: false,\n reason: \"status_unavailable\",\n };\n }\n );\n return {\n status: \"warning\",\n pid: runtimeStatus.pid,\n reason: \"stop_failed\",\n runtimeStatus,\n errorMessage,\n };\n }\n}\n\nexport async function runDaemonRun(\n input: DaemonRunInput,\n options: DaemonRunInternalOptions = {}\n): Promise<DaemonRunResult> {\n await assertDaemonServiceLaunchScope();\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter =\n input.outputMode === \"silent\" || isDetachedDaemonServiceRun()\n ? createSilentPresenter(runtime.resolvedView)\n : createPresenter(runtime);\n emitDaemonOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"run\",\n handled: input.agentOverviewHandled,\n });\n const status = await getDaemonStatus();\n if (!status.installed) {\n const message = formatInlineOpenMeldCliCommands(\n \"OpenMeld service is not installed yet. Run `openmeld service install` first.\"\n );\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.run.not_installed\",\n payload: {\n ok: false,\n reason: \"service_not_installed\",\n message,\n nextSteps: formatOpenMeldCliCommands([\n \"openmeld service install\",\n \"openmeld service start\",\n ]),\n },\n });\n } else {\n renderServiceActionCard({\n presenter,\n codePrefix: \"daemon.run.not_installed\",\n title: \"⚠️ OpenMeld Service Not Installed\",\n rows: [\n {\n label: \"🧩 Status\",\n value: formatDaemonServiceMissingStatus(),\n },\n {\n label: \"📡 Local Service Link\",\n value: formatDaemonServiceMissingMeaning(),\n },\n {\n label: \"🚀 Step 1\",\n value: formatDaemonServiceMissingRunStepOne(),\n },\n {\n label: \"▶️ Step 2\",\n value: formatDaemonServiceMissingRunStepTwo(),\n },\n ],\n });\n }\n throw new Error(message);\n }\n\n if (!input.entryChecksHandled) {\n const authReady = await ensureInteractiveDaemonRunAuthenticationOrCancel({\n runtime,\n gatewayUrl: input.gatewayUrl,\n });\n if (!authReady) {\n return {\n ok: false,\n reason: \"cancelled\",\n };\n }\n }\n\n if (!input.mode && canUseInteractivePrompts(runtime)) {\n const preflightResult =\n await runDaemonRunInteractivePreflightBeforeModePrompt({\n daemonVersion: await resolveCurrentDaemonExpectedVersion(),\n input,\n presenter,\n runtime,\n });\n if (preflightResult) {\n return preflightResult;\n }\n }\n\n const mode = await resolveDaemonRunMode({\n rawMode: input.mode,\n canPrompt: canUseInteractivePrompts(runtime),\n allowBack: input.allowModeBack,\n });\n if (mode === DAEMON_RUN_MODE_CHOICES.back) {\n return {\n ok: false,\n reason: \"cancelled\",\n };\n }\n if (mode === null) {\n if (!input.suppressModeCancelOutput) {\n cancel(\"Cancelled.\");\n }\n return {\n ok: false,\n reason: \"cancelled\",\n };\n }\n\n return await executeResolvedDaemonRun({\n daemonVersion:\n mode === \"foreground\"\n ? OPENMELD_VERSION\n : await resolveCurrentDaemonExpectedVersion(),\n input,\n mode,\n options,\n presenter,\n runtime,\n });\n}\n\nexport async function runDaemonRunAfterEntryChecks(\n input: DaemonRunAfterEntryChecksInput,\n runRun: typeof runDaemonRun = runDaemonRun\n): Promise<DaemonRunResult> {\n return await runRun({\n ...input,\n entryChecksHandled: true,\n });\n}\n\nasync function executeResolvedDaemonRun(input: {\n daemonVersion: string;\n input: DaemonRunInput;\n mode: DaemonRunMode;\n options: DaemonRunInternalOptions;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}): Promise<DaemonRunResult> {\n if (isDetachedDaemonServiceRun()) {\n return await executeDaemonRunWithJournal({\n daemonVersion: input.daemonVersion,\n detached: true,\n input: input.input,\n mode: input.mode,\n presenter: input.presenter,\n runtime: input.runtime,\n systemServiceStartupPollMs: input.options.systemServiceStartupPollMs,\n systemServiceStartupWaitMs: input.options.systemServiceStartupWaitMs,\n });\n }\n\n if (input.mode === \"foreground\") {\n return await executeForegroundDaemonRunWithStartupLock({\n daemonVersion: input.daemonVersion,\n input: input.input,\n mode: input.mode,\n presenter: input.presenter,\n runtime: input.runtime,\n systemServiceStartupPollMs: input.options.systemServiceStartupPollMs,\n systemServiceStartupWaitMs: input.options.systemServiceStartupWaitMs,\n });\n }\n\n return await withDaemonServiceRunLock(\n async () =>\n await executeDaemonRunWithJournal({\n daemonVersion: input.daemonVersion,\n detached: false,\n input: input.input,\n mode: input.mode,\n presenter: input.presenter,\n runtime: input.runtime,\n systemServiceStartupPollMs: input.options.systemServiceStartupPollMs,\n systemServiceStartupWaitMs: input.options.systemServiceStartupWaitMs,\n }),\n {\n intent: \"run_background\",\n command: \"openmeld service run\",\n }\n );\n}\n\nasync function executeForegroundDaemonRunWithStartupLock(input: {\n daemonVersion: string;\n input: DaemonRunInput;\n mode: DaemonRunMode;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n systemServiceStartupPollMs?: number;\n systemServiceStartupWaitMs?: number;\n}): Promise<DaemonRunResult> {\n const lifecycleLock = await acquireDaemonServiceLifecycleLock({\n intent: \"run_foreground\",\n command: \"openmeld service run\",\n });\n let lifecycleLockReleased = false;\n\n const releaseLifecycleLock = async (): Promise<void> => {\n if (lifecycleLockReleased) {\n return;\n }\n lifecycleLockReleased = true;\n await releaseDaemonServiceLifecycleLock(lifecycleLock);\n };\n\n try {\n return await executeDaemonRunWithJournal({\n daemonVersion: input.daemonVersion,\n detached: false,\n input: input.input,\n mode: input.mode,\n onBeforeForegroundLoop: releaseLifecycleLock,\n presenter: input.presenter,\n runtime: input.runtime,\n systemServiceStartupPollMs: input.systemServiceStartupPollMs,\n systemServiceStartupWaitMs: input.systemServiceStartupWaitMs,\n });\n } finally {\n await releaseLifecycleLock();\n }\n}\n\nasync function executeDaemonRunWithJournal(input: {\n daemonVersion: string;\n detached: boolean;\n input: DaemonRunInput;\n mode: DaemonRunMode;\n onBeforeForegroundLoop?: (() => Promise<void>) | undefined;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n systemServiceStartupPollMs?: number;\n systemServiceStartupWaitMs?: number;\n}): Promise<DaemonRunResult> {\n return await runWithDaemonLifecycleCommandJournal({\n command: \"openmeld service run\",\n intent: input.mode === \"foreground\" ? \"run_foreground\" : \"run_background\",\n // Stamp the daemon-process begin event with its uptime so the ~45s gap\n // between the supervisor's start action and this begin can be split into\n // launchd/BTM spawn-decision latency versus daemon early init.\n includeProcessUptime: true,\n metadata: {\n detached: input.detached,\n mode: input.mode,\n },\n resolveResult: summarizeDaemonRunJournalResult,\n run: async () =>\n await runSystemDaemonCore({\n input: input.input,\n systemServiceStartupPollMs: input.systemServiceStartupPollMs,\n systemServiceStartupWaitMs: input.systemServiceStartupWaitMs,\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n daemonVersion: input.daemonVersion,\n onBeforeForegroundLoop: input.onBeforeForegroundLoop,\n }),\n });\n}\n\nfunction summarizeDaemonRunJournalResult(result: DaemonRunResult): {\n metadata?: Record<string, unknown>;\n result: string;\n} {\n return {\n result: result.reason,\n metadata: {\n ok: result.ok,\n },\n };\n}\n\nexport async function runDaemonBackgroundStartForDecision(input: {\n view?: string;\n gatewayUrl?: string;\n profile?: string;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressStartSpinner?: boolean;\n}): Promise<\n \"started\" | DaemonBackgroundStartFailure | \"deferred_with_card\" | \"cancelled\"\n> {\n const repairResult =\n await maybeRunDaemonRepairBeforeBackgroundStartDecision(input);\n if (repairResult) {\n return repairResult;\n }\n\n const previousExitCode = process.exitCode;\n const result = await runDaemonRunAfterEntryChecks({\n agentOverviewHandled: true,\n gatewayUrl: input.gatewayUrl,\n mode: \"background\",\n profile: input.profile,\n ...(input.serviceProgress\n ? { serviceProgress: input.serviceProgress }\n : {}),\n ...(input.suppressStartSpinner === true\n ? { suppressStartSpinner: true }\n : {}),\n view: input.view,\n });\n if (result.ok || isDaemonRunAlreadyRunningReason(result.reason)) {\n process.exitCode = previousExitCode;\n return \"started\";\n }\n if (normalizeDaemonRunReason(result.reason) === \"cancelled\") {\n process.exitCode = previousExitCode;\n return \"cancelled\";\n }\n return buildDaemonBackgroundStartFailure(\n result.ok ? null : (result.startFailureVerdict ?? null)\n );\n}\n\nasync function maybeRunDaemonRepairBeforeBackgroundStartDecision(input: {\n view?: string;\n}): Promise<\n | \"started\"\n | DaemonBackgroundStartFailure\n | \"deferred_with_card\"\n | \"cancelled\"\n | null\n> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n if (runtime.resolvedView !== \"human\" || !canUseInteractivePrompts(runtime)) {\n return null;\n }\n\n const status = await getDaemonStatus().catch(() => null);\n if (!status?.installed) {\n return null;\n }\n\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n intendedMode: \"background\",\n }).catch(() => null);\n if (!(inventory && shouldBlockDaemonRunFromInventory(inventory))) {\n return null;\n }\n\n const decision = await promptForDaemonRepairDecision();\n if (decision === \"cancelled\") {\n return \"cancelled\";\n }\n if (decision === \"not_now\") {\n emitDaemonRunBlockedByInventory({\n inventory,\n presenter,\n runtime,\n });\n return \"deferred_with_card\";\n }\n\n try {\n const reinstallResult = await runDaemonReinstall(\n {\n agentOverviewHandled: true,\n view: runtime.resolvedView,\n },\n {\n skipConfirm: true,\n startAfterInstallMode: \"always\",\n suppressInstallOutput: true,\n }\n );\n if (isDaemonReinstallHealthyAndRunning(reinstallResult)) {\n return \"started\";\n }\n if (reinstallResult.result === \"cancelled\") {\n return \"cancelled\";\n }\n return buildDaemonBackgroundStartFailure(\n \"startFailureVerdict\" in reinstallResult\n ? (reinstallResult.startFailureVerdict ?? null)\n : null\n );\n } catch (error) {\n renderDaemonStartNeedsAttentionCard({\n presenter,\n codePrefix: \"daemon.reinstall.start_failed\",\n summary: buildDaemonReinstallUnexpectedStartSummary(error),\n nextStep: buildDaemonReinstallUnexpectedStartNextStep(),\n });\n return {\n outcome: \"failed_with_card\",\n errorMessage: buildDaemonReinstallUnexpectedStartSummary(error),\n };\n }\n}\n\nfunction emitDaemonRuntimeCleanupSkipped(input: {\n cleanupDecision: Awaited<\n ReturnType<typeof clearDaemonRuntimeStateIfDefinitelyStopped>\n >;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}): void {\n const { cleanupDecision, presenter, runtime } = input;\n if (cleanupDecision.cleared) {\n return;\n }\n if (cleanupDecision.context.runtimeStatus.status !== \"stale\") {\n return;\n }\n if (cleanupDecision.context.effectiveRuntimeStatus !== \"running\") {\n return;\n }\n\n const payload = {\n cleanupSkipped: true,\n effectiveStatus: cleanupDecision.context.effectiveRuntimeStatus,\n observedStatus: cleanupDecision.context.runtimeStatus.status,\n reason: \"service_manager_reports_running\",\n } as const;\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.run.runtime_cleanup_skipped\",\n payload,\n });\n return;\n }\n\n presenter.line({\n code: \"daemon.run.runtime_cleanup_skipped\",\n text: \"OpenMeld kept the local runtime state because the system service still reports the daemon as running.\",\n });\n}\n\ntype DaemonRuntimeTakeoverDecision =\n | {\n takeover: false;\n }\n | {\n takeover: true;\n metadata: Record<string, unknown>;\n reason: string;\n };\n\nfunction isRecordedDaemonRuntimePidAlive(pid: number | null): boolean {\n if (!Number.isInteger(pid) || pid === null || pid <= 0) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction buildDaemonRuntimeTakeoverMetadata(input: {\n activeBundleEntryPath: string | null;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n observedBundleId?: string | null;\n observedCommand?: string | null;\n reason: string;\n runtimeStatus: DaemonServiceRuntimeStatus;\n snapshot: DaemonServiceRuntimeState | null;\n}): Record<string, unknown> {\n const expectedBundleId = input.activeBundleEntryPath\n ? resolveDaemonBundleIdFromEntryPath(input.activeBundleEntryPath)\n : null;\n return {\n activeBundleEntryPath: input.activeBundleEntryPath,\n autoStart: input.runtimeStatus.autoStart,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n expectedBundleId,\n heartbeatAt: input.snapshot?.heartbeatAt ?? null,\n managedBySystemService: input.runtimeStatus.managedBySystemService,\n observedBundleId: input.observedBundleId ?? null,\n observedCommand: input.observedCommand ?? null,\n pid: input.snapshot?.pid ?? input.runtimeStatus.pid,\n reason: input.reason,\n runtimeReason: input.runtimeStatus.reason ?? null,\n runtimeStatus: input.runtimeStatus.status,\n serviceController: input.runtimeStatus.serviceController,\n stateCommand: input.snapshot?.command ?? null,\n stateUpdatedAt: input.snapshot?.updatedAt ?? input.runtimeStatus.updatedAt,\n };\n}\n\nasync function resolveDaemonRuntimeCommandTakeover(input: {\n activeBundleEntryPath: string | null;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n runtimeStatus: DaemonServiceRuntimeStatus;\n snapshot: DaemonServiceRuntimeState;\n}): Promise<DaemonRuntimeTakeoverDecision> {\n const ownedProcesses = await listDaemonOwnedProcesses({\n ignoreProcessIds: [process.pid, process.ppid].filter(\n (pid): pid is number => Number.isInteger(pid) && pid > 0\n ),\n }).catch(() => null);\n if (!ownedProcesses) {\n return { takeover: false };\n }\n const observedProcess = ownedProcesses.find(\n (processInfo) => processInfo.pid === input.snapshot.pid\n );\n const observedCommand = observedProcess?.command ?? null;\n if (!observedProcess) {\n return {\n takeover: true,\n reason: \"process_command_mismatch\",\n metadata: buildDaemonRuntimeTakeoverMetadata({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n observedCommand,\n reason: \"process_command_mismatch\",\n runtimeStatus: input.runtimeStatus,\n snapshot: input.snapshot,\n }),\n };\n }\n\n const expectedBundleId = input.activeBundleEntryPath\n ? resolveDaemonBundleIdFromEntryPath(input.activeBundleEntryPath)\n : null;\n const observedEntryPath = extractDaemonCommandEntryPath(\n observedProcess.command\n );\n const observedBundleId = observedEntryPath\n ? resolveDaemonBundleIdFromEntryPath(observedEntryPath)\n : null;\n if (\n expectedBundleId &&\n observedBundleId &&\n observedBundleId !== expectedBundleId\n ) {\n return {\n takeover: true,\n reason: \"process_command_mismatch\",\n metadata: buildDaemonRuntimeTakeoverMetadata({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n observedBundleId,\n observedCommand,\n reason: \"process_command_mismatch\",\n runtimeStatus: input.runtimeStatus,\n snapshot: input.snapshot,\n }),\n };\n }\n\n return { takeover: false };\n}\n\nasync function resolveDaemonRuntimeTakeoverBeforeStart(input: {\n activeBundleEntryPath: string | null;\n effectiveRuntimeStatus: DaemonServiceRuntimeStatus[\"status\"];\n runtimeStatus: DaemonServiceRuntimeStatus;\n}): Promise<DaemonRuntimeTakeoverDecision> {\n const snapshot = await readDaemonServiceRuntimeSnapshot().catch(() => null);\n if (input.runtimeStatus.status === \"stale\") {\n const reason = input.runtimeStatus.reason ?? \"runtime_state_stale\";\n return {\n takeover: true,\n reason,\n metadata: buildDaemonRuntimeTakeoverMetadata({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n reason,\n runtimeStatus: input.runtimeStatus,\n snapshot,\n }),\n };\n }\n\n if (input.effectiveRuntimeStatus !== \"running\" || !snapshot) {\n return { takeover: false };\n }\n\n if (!isRecordedDaemonRuntimePidAlive(snapshot.pid)) {\n return {\n takeover: true,\n reason: \"process_not_alive\",\n metadata: buildDaemonRuntimeTakeoverMetadata({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n reason: \"process_not_alive\",\n runtimeStatus: input.runtimeStatus,\n snapshot,\n }),\n };\n }\n\n if (isDaemonServiceRuntimeHeartbeatStale(snapshot)) {\n return {\n takeover: true,\n reason: \"heartbeat_stale\",\n metadata: buildDaemonRuntimeTakeoverMetadata({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n reason: \"heartbeat_stale\",\n runtimeStatus: input.runtimeStatus,\n snapshot,\n }),\n };\n }\n\n return await resolveDaemonRuntimeCommandTakeover({\n activeBundleEntryPath: input.activeBundleEntryPath,\n effectiveRuntimeStatus: input.effectiveRuntimeStatus,\n runtimeStatus: input.runtimeStatus,\n snapshot,\n });\n}\n\nasync function recordDaemonRuntimeTakeover(input: {\n decision: Extract<DaemonRuntimeTakeoverDecision, { takeover: true }>;\n}): Promise<void> {\n await emitDaemonLifecycleEvent({\n type: \"runtime_state.takeover\",\n result: \"cleared\",\n metadata: input.decision.metadata,\n });\n await clearDaemonServiceRuntimeState();\n}\n\nasync function runSystemDaemonCore(context: {\n input: DaemonRunInput;\n systemServiceStartupPollMs?: number;\n systemServiceStartupWaitMs?: number;\n onBeforeForegroundLoop?: (() => Promise<void>) | undefined;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n mode: DaemonRunMode;\n daemonVersion: string;\n}): Promise<DaemonRunResult> {\n const {\n input,\n presenter,\n runtime,\n mode,\n daemonVersion,\n onBeforeForegroundLoop,\n systemServiceStartupPollMs,\n systemServiceStartupWaitMs,\n } = context;\n const isSystemServiceBootstrap = isManagedSystemServiceBootstrapRun();\n if (isSystemServiceBootstrap) {\n warnDaemonEvent(\"[openmeld.daemon.lifecycle_started]\", {\n cliVersion: OPENMELD_VERSION,\n event: \"cli.daemon.lifecycle_started\",\n pid: process.pid,\n });\n }\n const runtimeCleanupDecision =\n await clearDaemonRuntimeStateIfDefinitelyStopped();\n emitDaemonRuntimeCleanupSkipped({\n cleanupDecision: runtimeCleanupDecision,\n presenter,\n runtime,\n });\n let runConfig: Awaited<\n ReturnType<typeof resolveContractFirstDaemonRunConfig>\n >;\n try {\n runConfig = await resolveContractFirstDaemonRunConfig({\n daemonVersion,\n input,\n isSystemServiceBootstrap,\n mode,\n runtime,\n });\n } catch (error) {\n if (!isSystemServiceBootstrap) {\n throw error;\n }\n return await handleDaemonRunStartFailure({\n fallbackRawLine: toErrorMessage(error),\n gatewayUrl: input.gatewayUrl,\n presenter,\n runtime,\n genericErrorPayload: {\n codePrefix: \"daemon.run.start_failed\",\n error,\n },\n });\n }\n if (isSystemServiceBootstrap && !runConfig.bootstrapContract) {\n presenter.line({\n code: \"daemon.run.contract_missing\",\n text: \"OpenMeld Service bootstrap could not resolve a valid local service contract.\",\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: \"start_failed\",\n };\n }\n const preflight: Awaited<\n ReturnType<typeof runDaemonStartupPreflight>\n > | null = null;\n const daemonOpenMeldProfileId = runConfig.openMeldProfileId;\n const contractOpenMeldProfileId = runConfig.contractOpenMeldProfileId;\n const inventoryRunResult = await maybeResolveRunResultFromDaemonInventory({\n daemonVersion,\n preflight,\n mode,\n presenter,\n runtime,\n gatewayUrl: runConfig.gatewayUrl,\n openMeldProfileId: daemonOpenMeldProfileId,\n contractOpenMeldProfileId,\n deviceId: runConfig.deviceId,\n heartbeatMs: runConfig.heartbeatMs,\n isSystemServiceBootstrap,\n });\n if (inventoryRunResult) {\n return inventoryRunResult;\n }\n let activeBundleEntryPath = await resolveAlignedDaemonActiveBundleEntryPath({\n expectedVersion: daemonVersion,\n }).catch(() => null);\n if (!activeBundleEntryPath) {\n await prepareDaemonServiceBundle({\n daemonVersion,\n });\n activeBundleEntryPath = await resolveAlignedDaemonActiveBundleEntryPath({\n expectedVersion: daemonVersion,\n }).catch(() => null);\n }\n\n const { runtimeStatus, effectiveRuntimeStatus } =\n await readCurrentDaemonRuntimeContext();\n\n const runtimeTakeoverDecision = await resolveDaemonRuntimeTakeoverBeforeStart(\n {\n activeBundleEntryPath,\n effectiveRuntimeStatus,\n runtimeStatus,\n }\n );\n if (runtimeTakeoverDecision.takeover) {\n await recordDaemonRuntimeTakeover({\n decision: runtimeTakeoverDecision,\n });\n } else if (effectiveRuntimeStatus === \"running\") {\n emitDaemonAlreadyRunningState(runtime, presenter, runtimeStatus);\n return createDaemonAlreadyRunningResult();\n } else if (runtimeStatus.status === \"stale\") {\n await clearDaemonServiceRuntimeState();\n }\n\n const authReadiness = await resolveDaemonRunAuthReadiness({\n gatewayUrl: runConfig.gatewayUrl,\n });\n if (!authReadiness.ready) {\n emitDaemonRunAuthRequired({\n readiness: authReadiness,\n presenter,\n runtime,\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: authReadiness.reason,\n };\n }\n\n if (isSystemServiceBootstrap) {\n return await runDirectDaemonServiceLoop({\n gatewayUrl: runConfig.gatewayUrl,\n deviceId: runConfig.deviceId,\n heartbeatMs: runConfig.heartbeatMs,\n mode,\n presenter,\n openMeldProfileId: daemonOpenMeldProfileId,\n runtime,\n });\n }\n\n if (mode === \"foreground\" || isDetachedDaemonServiceRun()) {\n if (mode === \"foreground\") {\n await onBeforeForegroundLoop?.();\n }\n return await runDirectDaemonServiceLoop({\n gatewayUrl: runConfig.gatewayUrl,\n deviceId: runConfig.deviceId,\n heartbeatMs: runConfig.heartbeatMs,\n mode,\n presenter,\n openMeldProfileId: daemonOpenMeldProfileId,\n runtime,\n });\n }\n\n return await runDaemonBackgroundStart({\n daemonVersion,\n systemServiceStartupPollMs,\n systemServiceStartupWaitMs,\n runtime,\n presenter,\n mode,\n gatewayUrl: runConfig.gatewayUrl,\n openMeldProfileId: daemonOpenMeldProfileId,\n contractOpenMeldProfileId,\n deviceId: runConfig.deviceId,\n heartbeatMs: runConfig.heartbeatMs,\n ...(input.serviceProgress\n ? { serviceProgress: input.serviceProgress }\n : {}),\n suppressStartSpinner:\n input.suppressStartSpinner === true || input.outputMode === \"silent\",\n });\n}\n\nasync function maybeResolveRunResultFromDaemonInventory(input: {\n daemonVersion: string;\n preflight: Awaited<ReturnType<typeof runDaemonStartupPreflight>> | null;\n mode: DaemonRunMode;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n gatewayUrl?: string;\n openMeldProfileId?: string;\n contractOpenMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n isSystemServiceBootstrap: boolean;\n}): Promise<DaemonRunResult | null> {\n if (input.isSystemServiceBootstrap) {\n return null;\n }\n\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: input.daemonVersion,\n intendedMode: input.mode,\n intent: input.mode === \"foreground\" ? \"run_foreground\" : \"run_background\",\n }).catch(() => null);\n if (!inventory) {\n return null;\n }\n\n if (\n shouldTreatDaemonRunAsRecoveredStart({\n daemonVersion: input.daemonVersion,\n inventory,\n preflight: input.preflight,\n })\n ) {\n await maybeWriteDaemonServiceContract({\n runtime: input.runtime,\n daemonVersion: input.daemonVersion,\n desiredState: \"background\",\n serviceController: inventory.serviceManager?.controller,\n runtimeStatus: inventory.runtimeStatus,\n autoStart: inventory.serviceManager !== null,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n contractProfileId: input.contractOpenMeldProfileId,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n });\n emitDaemonRecoveredStartedState({\n inventory,\n mode: input.mode,\n presenter: input.presenter,\n runtime: input.runtime,\n });\n await clearDaemonStartFailureStateSafely();\n return {\n ok: true,\n reason: \"started\",\n };\n }\n\n if (!shouldBlockDaemonRunFromInventory(inventory)) {\n return null;\n }\n\n emitDaemonRunBlockedByInventory({\n inventory,\n presenter: input.presenter,\n runtime: input.runtime,\n });\n process.exitCode = 1;\n return {\n ok: false,\n reason: \"cleanup_required\",\n };\n}\n\nasync function runDaemonBackgroundStart(input: {\n daemonVersion: string;\n systemServiceStartupPollMs?: number;\n systemServiceStartupWaitMs?: number;\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n mode: DaemonRunMode;\n gatewayUrl?: string;\n openMeldProfileId?: string;\n contractOpenMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressStartSpinner?: boolean;\n}): Promise<DaemonRunResult> {\n const systemManager = await resolveDaemonServiceManager();\n if (!systemManager) {\n const detachedContractSnapshot = await stageDaemonBackgroundServiceContract(\n {\n runtime: input.runtime,\n daemonVersion: input.daemonVersion,\n desiredState: \"background\",\n serviceController: \"legacy-detached\",\n autoStart: false,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n contractProfileId: input.contractOpenMeldProfileId,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n }\n );\n input.presenter.line({\n code: \"daemon.run.fallback\",\n text: \"System service manager is not available on this device; fallback to detached background process.\",\n });\n const runResult = await runDaemonServiceDetached({\n gatewayUrl: input.gatewayUrl,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n openMeldProfileId: input.openMeldProfileId,\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n });\n if (!runResult.ok) {\n await detachedContractSnapshot.rollback();\n }\n return runResult;\n }\n\n await ensureDaemonServiceMaintenanceInstalled();\n const systemContractSnapshot = await stageDaemonBackgroundServiceContract({\n runtime: input.runtime,\n daemonVersion: input.daemonVersion,\n desiredState: \"background\",\n serviceController: systemManager.controller,\n autoStart: true,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n contractProfileId: input.contractOpenMeldProfileId,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n });\n const runResult = await runSystemServiceManager({\n daemonVersion: input.daemonVersion,\n startupPollMs: input.systemServiceStartupPollMs,\n startupWaitMs: input.systemServiceStartupWaitMs,\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n gatewayUrl: input.gatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n ...(input.serviceProgress\n ? { serviceProgress: input.serviceProgress }\n : {}),\n systemManager,\n suppressStartSpinner: input.suppressStartSpinner,\n });\n if (!runResult.ok) {\n await systemContractSnapshot.rollback();\n }\n return runResult;\n}\n\nfunction shouldBlockDaemonRunFromInventory(\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>\n): boolean {\n return classifyDaemonServiceRunStartability({ inventory }).blocksStart;\n}\n\nfunction shouldTreatDaemonRunAsRecoveredStart(input: {\n daemonVersion: string;\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>;\n preflight: Awaited<ReturnType<typeof runDaemonStartupPreflight>> | null;\n}): boolean {\n if (!input.preflight) {\n return false;\n }\n if (\n input.preflight.status !== \"aligned\" &&\n input.preflight.status !== \"auto_healed\"\n ) {\n return false;\n }\n const target = buildDaemonServiceTargetSpec({\n daemonVersion: input.daemonVersion,\n });\n const decision = resolveDaemonServiceAlignmentDecision({\n inventory: input.inventory,\n target,\n });\n if (decision.status !== \"already_aligned\") {\n return false;\n }\n return (\n getEffectiveDaemonRuntimeStatus({\n runtimeState: input.inventory.runtimeStatus,\n serviceManagerStatus: input.inventory.serviceManagerStatus,\n }) === \"running\" && input.inventory.runtimeStatus.mode === \"background\"\n );\n}\n\nfunction emitDaemonRunBlockedByInventory(input: {\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}): void {\n const runBlockingCodes = classifyDaemonServiceRunStartability({\n inventory: input.inventory,\n }).blockingCodes;\n const primaryAnomaly =\n input.inventory.anomalies.find((anomaly) =>\n runBlockingCodes.includes(anomaly.code)\n ) ?? input.inventory.anomalies[0];\n if (!primaryAnomaly) {\n return;\n }\n\n if (input.runtime.resolvedView === \"agent\") {\n const recoveryGuidance = buildDaemonRunCleanupRequiredAgentGuidance({\n primaryAnomaly,\n });\n input.presenter.data({\n code: \"daemon.run.cleanup_required\",\n payload: {\n ok: false,\n reason: \"cleanup_required\",\n ...recoveryGuidance,\n inventory: {\n anomalies: input.inventory.anomalies,\n cleanupPlan: buildDaemonServiceCleanupPlan({\n intent: \"status_cleanup\",\n inventory: input.inventory,\n }),\n },\n },\n });\n return;\n }\n\n const serviceIsRunning = input.inventory.runtimeStatus.status === \"running\";\n if (primaryAnomaly.code === \"runtime_contract_mismatch\") {\n renderServiceActionCard({\n presenter: input.presenter,\n title: \"⚠️ OpenMeld Service Update Required\",\n codePrefix: \"daemon.run.cleanup_required\",\n rows: [\n {\n label: \"📝 Found\",\n value: formatDaemonServiceUpdateRequiredMessage({\n serviceIsRunning,\n }),\n },\n {\n label: \"📡 Local Service Link\",\n value: serviceIsRunning\n ? \"Unavailable for new Wake work - update OpenMeld Service before this computer receives new local Wake work.\"\n : \"Unavailable - update OpenMeld Service before this computer receives local Wake work.\",\n },\n {\n label: \"🔧 Next\",\n value: buildDaemonServiceUpdateRequiredNextStep({\n serviceIsRunning,\n }),\n },\n ],\n });\n return;\n }\n\n renderServiceActionCard({\n presenter: input.presenter,\n title: \"⚠️ OpenMeld Service Needs Repair\",\n codePrefix: \"daemon.run.cleanup_required\",\n rows: [\n {\n label: \"📝 Found\",\n value: formatDaemonServiceRefreshReliabilityMessage(),\n },\n {\n label: \"📡 Local Service Link\",\n value:\n \"Needs repair — OpenMeld Service must be repaired before this computer can connect for local Wake work.\",\n },\n {\n label: \"🔧 Next\",\n value: buildDaemonServiceRefreshNextStep(),\n },\n ],\n });\n}\n\nfunction buildDaemonRunCleanupRequiredAgentGuidance(input: {\n primaryAnomaly: DaemonServiceInventory[\"anomalies\"][number] | undefined;\n}): {\n message: string;\n nextSteps: string[];\n requiresRepair: boolean;\n requiresStartAfterMaintenance: true;\n requiresStartAfterRepair: boolean;\n requiresUpdate: boolean;\n} {\n const needsUpdate =\n input.primaryAnomaly?.code === \"runtime_contract_mismatch\";\n const maintenanceCommand = needsUpdate\n ? \"openmeld service update --view agent\"\n : \"openmeld service repair --view agent\";\n const maintenanceAction = needsUpdate ? \"updated\" : \"repaired\";\n const followUpPhase =\n maintenanceAction === \"updated\" ? \"the update\" : \"repair\";\n return {\n message:\n `OpenMeld Service must be ${maintenanceAction} before it can start. ` +\n formatOpenMeldCliTextBlock(\n `If OpenMeld Service is still stopped after ${followUpPhase}, run openmeld service start.`\n ),\n nextSteps: formatOpenMeldCliCommands([\n maintenanceCommand,\n \"openmeld service start --view agent\",\n ]),\n requiresRepair: !needsUpdate,\n requiresStartAfterMaintenance: true,\n requiresStartAfterRepair: !needsUpdate,\n requiresUpdate: needsUpdate,\n };\n}\n\nfunction emitDaemonRecoveredStartedState(input: {\n inventory: Awaited<ReturnType<typeof inspectDaemonServiceInventory>>;\n mode: DaemonRunMode;\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n}): void {\n const controller =\n input.inventory.serviceManager?.controller ??\n (input.inventory.runtimeStatus.serviceController === \"unknown\"\n ? \"launchd\"\n : input.inventory.runtimeStatus.serviceController);\n emitSystemServiceBackgroundStarted({\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n controller,\n runtimeStatus: input.inventory.runtimeStatus,\n autoRepairAttempted: true,\n });\n}\n\nfunction resolveDaemonServiceOpenMeldProfileId(input: {\n explicitOpenMeldProfileId?: string;\n runtime: RuntimeContext;\n}): string | undefined {\n const explicitOpenMeldProfileId = normalizeOptionalText(\n input.explicitOpenMeldProfileId\n );\n if (explicitOpenMeldProfileId) {\n return explicitOpenMeldProfileId;\n }\n\n const sessionOpenMeldProfileId = normalizeOptionalText(\n input.runtime.openMeldProfileId\n );\n if (sessionOpenMeldProfileId) {\n return sessionOpenMeldProfileId;\n }\n\n const selectedOpenMeldProfileId = normalizeOptionalText(\n getCurrentCommandCheckState().selectedProfile?.openMeldProfileId\n );\n if (selectedOpenMeldProfileId) {\n return selectedOpenMeldProfileId;\n }\n\n return undefined;\n}\n\nasync function resolveDaemonServiceContractGatewayUrl(input: {\n explicitGatewayUrl?: string;\n contractGatewayUrl?: string | null;\n}): Promise<string | null> {\n const explicitGatewayUrl = await resolveExplicitGatewayUrlOrThrow(\n input.explicitGatewayUrl\n );\n if (explicitGatewayUrl) {\n return explicitGatewayUrl;\n }\n\n const contractGatewayUrl = normalizeGatewayBaseUrlOrNull(\n input.contractGatewayUrl\n );\n if (contractGatewayUrl) {\n return contractGatewayUrl;\n }\n\n return await resolveBaseUrlOrNull(undefined);\n}\n\nasync function maybeWriteDaemonServiceContract(input: {\n runtime: RuntimeContext;\n daemonVersion?: string;\n bundleId?: string | null;\n desiredState: \"stopped\" | \"background\";\n serviceController?: DaemonServiceRuntimeStatus[\"serviceController\"];\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n autoStart: boolean;\n gatewayUrl?: string;\n openMeldProfileId?: string;\n contractProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n allowDetachedFallback?: boolean;\n}): Promise<PersistedDaemonServiceContract | null> {\n const targetDaemonVersion = input.daemonVersion ?? null;\n const [currentContract, activeBundle, activeBundleEntryPath] =\n await Promise.all([\n readDaemonServiceContract().catch(() => null),\n readDaemonActiveBundleState().catch(() => null),\n Promise.resolve(\n resolveAlignedDaemonActiveBundleEntryPath({\n ...(targetDaemonVersion\n ? { expectedVersion: targetDaemonVersion }\n : {}),\n })\n ).catch(() => null),\n ]);\n const bundleIdFromEntryPath = activeBundleEntryPath\n ? resolveDaemonBundleIdFromEntryPath(activeBundleEntryPath)\n : null;\n const matchingActiveBundle =\n targetDaemonVersion && activeBundle?.daemonVersion !== targetDaemonVersion\n ? null\n : activeBundle;\n const bundleId =\n input.bundleId ??\n bundleIdFromEntryPath ??\n matchingActiveBundle?.bundleId ??\n currentContract?.bundleId ??\n null;\n const serviceController = resolveDaemonContractServiceController({\n preferredController: input.serviceController,\n currentContract,\n runtimeStatus: input.runtimeStatus ?? null,\n allowDetachedFallback: input.allowDetachedFallback ?? false,\n });\n const installedStatus = await getDaemonStatus().catch(() => null);\n const daemonVersion =\n input.daemonVersion ??\n matchingActiveBundle?.daemonVersion ??\n installedStatus?.state?.daemonVersion ??\n currentContract?.daemonVersion ??\n null;\n if (!(bundleId && daemonVersion && serviceController)) {\n return null;\n }\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n currentContract\n )\n ? currentContract\n : null;\n\n const [resolvedGatewayUrl, runtimePaths] = await Promise.all([\n resolveDaemonServiceContractGatewayUrl({\n explicitGatewayUrl: input.gatewayUrl,\n contractGatewayUrl: currentContract?.gatewayUrl ?? null,\n }),\n ensureDaemonRuntimePaths().catch(() => null),\n ]);\n const resolvedDeviceId = runtimePaths\n ? await resolveDaemonDeviceId({\n deviceId: resolvePreferredDaemonDeviceId({\n explicitDeviceId: input.deviceId,\n contractDeviceId: reusableCurrentContract?.deviceId,\n }),\n deviceIdPath: runtimePaths.deviceIdPath,\n }).catch(() => reusableCurrentContract?.deviceId ?? null)\n : (normalizeOptionalText(input.deviceId) ??\n reusableCurrentContract?.deviceId ??\n null);\n const resolvedProfileId = normalizeOptionalText(input.contractProfileId);\n const resolvedOwnerUserId = await resolveDaemonServiceContractOwnerUserId({\n currentContract,\n openMeldProfileId: resolvedProfileId,\n });\n const writeResult = await writeDaemonServiceContract({\n daemonVersion,\n bundleId,\n desiredState: input.desiredState,\n serviceController,\n autoStart: input.autoStart,\n gatewayUrl: resolvedGatewayUrl,\n ...(resolvedOwnerUserId ? { ownerUserId: resolvedOwnerUserId } : {}),\n ...(resolvedProfileId ? { profileId: resolvedProfileId } : {}),\n deviceId: resolvedDeviceId,\n heartbeatMs: input.heartbeatMs ?? currentContract?.heartbeatMs ?? null,\n ...(reusableCurrentContract ? { lane: reusableCurrentContract.lane } : {}),\n });\n if (writeResult.status === \"skipped_missing_fields\") {\n return null;\n }\n return writeResult.contract;\n}\n\nasync function resolveDaemonServiceContractOwnerUserId(input: {\n openMeldProfileId?: string | null;\n currentContract: PersistedDaemonServiceContract | null;\n}): Promise<string | undefined> {\n const profileId = normalizeOptionalText(input.openMeldProfileId);\n if (profileId) {\n const selectedProfile = getCurrentCommandCheckState().selectedProfile;\n if (selectedProfile?.openMeldProfileId === profileId) {\n return (\n normalizeOptionalText(selectedProfile.profile.ownerUserId) ?? undefined\n );\n }\n\n const resolvedProfile = await resolveOpenMeldProfileOrNull({\n openMeldProfileId: profileId,\n allowDefaultFallback: false,\n allowUnauthenticated: true,\n persistSelection: false,\n }).catch(() => null);\n return normalizeOptionalText(resolvedProfile?.ownerUserId) ?? undefined;\n }\n\n const authState = await Promise.resolve(\n getAuthSessionState({\n validateRemote: false,\n })\n ).catch(() => null);\n const authOwnerUserId = normalizeOptionalText(authState?.session?.user?.id);\n if (authOwnerUserId) {\n return authOwnerUserId;\n }\n\n return normalizeOptionalText(input.currentContract?.ownerUserId) ?? undefined;\n}\n\nasync function stageDaemonBackgroundServiceContract(input: {\n runtime: RuntimeContext;\n daemonVersion: string;\n desiredState: \"background\";\n serviceController: DaemonServiceRuntimeStatus[\"serviceController\"];\n autoStart: boolean;\n gatewayUrl?: string;\n openMeldProfileId?: string;\n contractProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n}): Promise<{\n rollback: () => Promise<void>;\n}> {\n const previousContract = await readDaemonServiceContract().catch(() => null);\n const stagedContract = await maybeWriteDaemonServiceContract(input);\n if (!stagedContract) {\n return {\n rollback: async () => undefined,\n };\n }\n return {\n rollback: async () => {\n await restoreDaemonServiceContractSnapshot(previousContract);\n },\n };\n}\n\nasync function maybeWriteDaemonStoppedContract(input: {\n runtime: RuntimeContext;\n runtimeStatus?: DaemonServiceRuntimeStatus | null;\n ownerSnapshot?: DaemonOwnerSnapshot | null;\n}): Promise<void> {\n const ownerSnapshot =\n input.ownerSnapshot ??\n (await readCurrentDaemonOwnerSnapshot().catch(() => null));\n const stoppedContractWriteBlockedReason = ownerSnapshot\n ? resolveStoppedContractWriteBlockedReason(ownerSnapshot)\n : null;\n if (ownerSnapshot && stoppedContractWriteBlockedReason) {\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"skipped\",\n metadata: {\n autoStart: false,\n desiredState: \"stopped\",\n ownerSnapshot: summarizeDaemonOwnerSnapshot(ownerSnapshot),\n reason: stoppedContractWriteBlockedReason,\n },\n });\n return;\n }\n\n const serviceManager =\n (await Promise.resolve(resolveDaemonServiceManager()).catch(() => null)) ??\n null;\n const refreshedContract = await maybeWriteDaemonServiceContract({\n runtime: input.runtime,\n desiredState: \"stopped\",\n serviceController:\n input.runtimeStatus?.serviceController ?? serviceManager?.controller,\n runtimeStatus: input.runtimeStatus ?? null,\n autoStart: false,\n allowDetachedFallback: serviceManager === null,\n });\n if (refreshedContract) {\n return;\n }\n\n const currentContract = await readDaemonServiceContract().catch(() => null);\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n currentContract\n )\n ? currentContract\n : null;\n if (!reusableCurrentContract) {\n return;\n }\n await upsertDaemonServiceContract({\n daemonVersion: reusableCurrentContract.daemonVersion,\n bundleId: reusableCurrentContract.bundleId,\n desiredState: \"stopped\",\n serviceController: reusableCurrentContract.serviceController,\n autoStart: false,\n gatewayUrl: reusableCurrentContract.gatewayUrl,\n ...(reusableCurrentContract.ownerUserId\n ? { ownerUserId: reusableCurrentContract.ownerUserId }\n : {}),\n ...(reusableCurrentContract.profileId\n ? { profileId: reusableCurrentContract.profileId }\n : {}),\n deviceId: reusableCurrentContract.deviceId,\n ...(reusableCurrentContract.connectedComputerId\n ? { connectedComputerId: reusableCurrentContract.connectedComputerId }\n : {}),\n heartbeatMs: reusableCurrentContract.heartbeatMs,\n lane: reusableCurrentContract.lane,\n });\n await emitDaemonLifecycleEvent({\n type: \"service_contract.write\",\n result: \"completed\",\n metadata: {\n autoStart: false,\n desiredState: \"stopped\",\n serviceController: reusableCurrentContract.serviceController,\n },\n });\n}\n\nasync function restoreDaemonServiceContractSnapshot(\n snapshot: PersistedDaemonServiceContract | null\n): Promise<void> {\n if (!snapshot) {\n await clearDaemonServiceContract();\n return;\n }\n await upsertDaemonServiceContract({\n daemonVersion: snapshot.daemonVersion,\n bundleId: snapshot.bundleId,\n desiredState: snapshot.desiredState,\n serviceController: snapshot.serviceController,\n autoStart: snapshot.autoStart,\n gatewayUrl: snapshot.gatewayUrl,\n ...(snapshot.ownerUserId ? { ownerUserId: snapshot.ownerUserId } : {}),\n ...(snapshot.profileId ? { profileId: snapshot.profileId } : {}),\n deviceId: snapshot.deviceId,\n ...(snapshot.connectedComputerId\n ? { connectedComputerId: snapshot.connectedComputerId }\n : {}),\n heartbeatMs: snapshot.heartbeatMs,\n lane: snapshot.lane,\n });\n}\n\nfunction resolveDaemonContractServiceController(input: {\n preferredController?: DaemonServiceRuntimeStatus[\"serviceController\"];\n currentContract: PersistedDaemonServiceContract | null;\n runtimeStatus: DaemonServiceRuntimeStatus | null;\n allowDetachedFallback: boolean;\n}): DaemonServiceRuntimeStatus[\"serviceController\"] | null {\n const preferredController =\n input.preferredController && input.preferredController !== \"unknown\"\n ? input.preferredController\n : null;\n if (preferredController) {\n return preferredController;\n }\n\n const persistedController =\n input.currentContract?.serviceController &&\n input.currentContract.serviceController !== \"unknown\"\n ? input.currentContract.serviceController\n : null;\n if (persistedController) {\n return persistedController;\n }\n\n if (input.runtimeStatus?.serviceController === \"legacy-detached\") {\n return \"legacy-detached\";\n }\n\n if (\n input.runtimeStatus?.managedBySystemService &&\n input.runtimeStatus.serviceController !== \"unknown\"\n ) {\n return input.runtimeStatus.serviceController;\n }\n\n if (input.allowDetachedFallback) {\n return \"legacy-detached\";\n }\n\n return null;\n}\n\nfunction emitDaemonAlreadyRunningState(\n runtime: RuntimeContext,\n presenter: ReturnType<typeof createPresenter>,\n runtimeStatus: DaemonServiceRuntimeStatus\n): void {\n const statusCommand = formatOpenMeldCliCommand(\"openmeld service status\");\n const repairCommand = formatOpenMeldCliCommand(\"openmeld service repair\");\n const guidance =\n \"OpenMeld Service is already running. If Wake or local setup still looks wrong, `openmeld service start` is not the repair step. \" +\n `Run \\`${statusCommand}\\`; if local participation is unhealthy, run \\`${repairCommand}\\` or use Reconnect Computer in OpenMeld Web.`;\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"daemon.run.already_running\",\n payload: {\n ok: true,\n guidance,\n lifecycleState: \"running\",\n nextSteps: [statusCommand],\n reason: LEGACY_DAEMON_RUN_ALREADY_RUNNING_REASON,\n status: runtimeStatus,\n },\n });\n return;\n }\n\n renderInfoCard({\n presenter,\n title: \"⚠️ Service Already Running\",\n codePrefix: \"daemon.run.already_running\",\n rows: formatDaemonDisplayRows([\n {\n label: \"🧩 Current Mode\",\n value: runtimeStatus.mode ?? \"unknown\",\n },\n {\n label: \"🧬 PID\",\n value:\n runtimeStatus.pid === null\n ? \"not available\"\n : String(runtimeStatus.pid),\n },\n {\n label: \"💡 What this means\",\n value: \"OpenMeld Service is already running.\",\n },\n {\n label: \"🔧 Next\",\n value: guidance,\n },\n ]),\n });\n}\n\nasync function recoverSystemServiceStartupAfterTimeout(input: {\n daemonVersion: string;\n error: unknown;\n serviceCommandSpec: ReturnType<typeof buildDaemonSystemServiceCommandSpec>;\n startSpinner: ReturnType<typeof createDaemonStartSpinner>;\n startupPollMs?: number;\n systemManager: DaemonServiceManager;\n runtime: RuntimeContext;\n}): Promise<SystemServiceStartupRecoveryOutcome> {\n let recovery: SystemServiceStartupRecoveryReport | null = null;\n const recoveryDecision = resolveDaemonServiceStartupRecoveryDecision({\n alreadyAttempted: false,\n anomalyCodes: isSystemServiceStartupTimeoutError(input.error)\n ? (input.error.inventory?.anomalies.map((anomaly) => anomaly.code) ?? [])\n : [],\n });\n if (!recoveryDecision.shouldAttempt) {\n return {\n recovered: false,\n error: input.error,\n recovery,\n };\n }\n\n recovery = {\n attempted: true,\n reasonCodes: recoveryDecision.reasonCodes,\n };\n\n try {\n input.startSpinner?.message(\n \"OpenMeld is repairing a local service startup issue...\"\n );\n const preflight = await runDaemonStartupPreflight({\n expectedVersion: input.daemonVersion,\n ...(process.argv[1] ? { cliScriptPath: process.argv[1] } : {}),\n view: input.runtime.resolvedView,\n });\n recovery = {\n ...recovery,\n preflightStatus: preflight.status,\n ...(preflight.errorMessage\n ? { failureMessage: preflight.errorMessage }\n : {}),\n };\n if (\n preflight.status !== \"aligned\" &&\n preflight.status !== \"auto_healed\" &&\n preflight.status !== \"already_aligned\"\n ) {\n return {\n recovered: false,\n error: input.error,\n recovery,\n };\n }\n\n input.startSpinner?.message(\n \"Restarting OpenMeld Service after local repair...\"\n );\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.systemManager.controller,\n });\n await input.systemManager.install(input.serviceCommandSpec);\n const retryStartResult = await startDaemonSystemServiceWithAutoRepair({\n serviceCommandSpec: input.serviceCommandSpec,\n systemManager: input.systemManager,\n onAutoRepairAttempt: () => {\n input.startSpinner?.message(\n \"OpenMeld is repairing a local service issue...\"\n );\n },\n onAutoRepairRecovered: () => {\n input.startSpinner?.message(\"Starting OpenMeld Service...\");\n },\n });\n recovery = {\n ...recovery,\n retryStarted: true,\n };\n return {\n recovered: true,\n autoRepairAttempted: retryStartResult.autoRepairAttempted,\n recovery,\n startupStatus: await waitForSystemServiceStartup({\n expectedVersion: input.daemonVersion,\n manager: input.systemManager,\n waitMs: SERVICE_STARTUP_CHECK_MS,\n pollMs: input.startupPollMs ?? SERVICE_STARTUP_POLL_MS,\n }),\n };\n } catch (error) {\n return {\n recovered: false,\n error,\n recovery: {\n ...recovery,\n failureMessage: toErrorMessage(error),\n },\n };\n }\n}\n\nasync function runSystemServiceManager(input: {\n daemonVersion: string;\n startupPollMs?: number;\n startupWaitMs?: number;\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n mode: DaemonRunMode;\n gatewayUrl?: string;\n deviceId?: string;\n openMeldProfileId?: string;\n heartbeatMs?: number;\n systemManager: DaemonServiceManager;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressStartSpinner?: boolean;\n}): Promise<DaemonRunResult> {\n const startedAtMs = Date.now();\n const serviceCommandSpec = buildDaemonSystemServiceCommandSpec({\n controller: input.systemManager.controller,\n environmentTarget: await resolveOpenMeldEnvironmentTarget({\n gatewayUrl: input.gatewayUrl,\n }),\n });\n\n let startupError: unknown = null;\n let autoRepairAttempted = false;\n const startFailureLogCursor = await captureDaemonStartFailureLogCursor();\n const startSpinner = createDaemonStartSpinner({\n runtime: input.runtime,\n suppress: input.suppressStartSpinner === true,\n });\n startSpinner?.start(\"Starting OpenMeld Service...\");\n\n try {\n emitDaemonServiceProgress({\n code: \"daemon.service.install\",\n progress: input.serviceProgress,\n spinner: startSpinner,\n text: \"Installing OpenMeld Service launcher...\",\n });\n await ensureDaemonSystemServiceCommandFiles({\n controller: input.systemManager.controller,\n });\n await runDaemonServiceManagerAction({\n action: \"install\",\n command: \"openmeld service run\",\n controller: input.systemManager.controller,\n intent: \"run_background\",\n run: async () => await input.systemManager.install(serviceCommandSpec),\n });\n emitDaemonServiceProgress({\n code: \"daemon.service.start\",\n progress: input.serviceProgress,\n spinner: startSpinner,\n text: \"Starting OpenMeld Service with macOS...\",\n });\n const startResult = await runDaemonServiceManagerAction({\n action: \"start\",\n command: \"openmeld service run\",\n controller: input.systemManager.controller,\n intent: \"run_background\",\n run: async () =>\n await startDaemonSystemServiceWithAutoRepair({\n serviceCommandSpec,\n systemManager: input.systemManager,\n onAutoRepairAttempt: () => {\n emitDaemonServiceProgress({\n code: \"daemon.service.repair\",\n progress: input.serviceProgress,\n spinner: startSpinner,\n text: \"Repairing OpenMeld Service registration...\",\n });\n },\n onAutoRepairRecovered: () => {\n emitDaemonServiceProgress({\n code: \"daemon.service.start\",\n progress: input.serviceProgress,\n spinner: startSpinner,\n text: \"Starting OpenMeld Service with macOS...\",\n });\n },\n }),\n });\n autoRepairAttempted = startResult.autoRepairAttempted;\n } catch (error) {\n startupError = error;\n }\n\n if (startupError) {\n startSpinner?.clear();\n return await handleDaemonRunStartFailure({\n cursor: startFailureLogCursor,\n gatewayUrl: input.gatewayUrl,\n presenter: input.presenter,\n runtime: input.runtime,\n genericErrorPayload: {\n codePrefix: \"daemon.run.start_failed\",\n controller: input.systemManager.controller,\n error: startupError,\n autoRepairAttempted,\n },\n });\n }\n\n try {\n const startupWaitMs =\n input.startupWaitMs ??\n resolveSystemServiceStartupWaitMs(input.systemManager.controller);\n emitDaemonServiceProgress({\n code: \"daemon.service.wait_running\",\n progress: input.serviceProgress,\n progressText: `Waiting for OpenMeld Service to become ready (up to ${Math.ceil(startupWaitMs / 1000)}s)...`,\n spinner: startSpinner,\n text: \"Waiting for OpenMeld Service to report ready...\",\n });\n const startupStatus = await runDaemonServiceManagerAction({\n action: \"wait_running\",\n command: \"openmeld service run\",\n controller: input.systemManager.controller,\n intent: \"run_background\",\n resolveErrorMetadata: (error) =>\n isSystemServiceStartupTimeoutError(error) && error.jobDiagnostics\n ? { jobDiagnostics: error.jobDiagnostics }\n : null,\n run: async () =>\n await waitForSystemServiceStartup({\n expectedVersion: input.daemonVersion,\n manager: input.systemManager,\n waitMs: startupWaitMs,\n pollMs: input.startupPollMs ?? SERVICE_STARTUP_POLL_MS,\n }),\n });\n await cleanupInactiveDaemonServiceBundles();\n await clearDaemonStartFailureStateSafely();\n startSpinner?.clear();\n emitSystemServiceBackgroundStarted({\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n controller: input.systemManager.controller,\n runtimeStatus: startupStatus.runtimeStatus,\n autoRepairAttempted,\n durationMs: resolveElapsedTimeMs(startedAtMs),\n });\n return {\n ok: true,\n reason: \"started\",\n };\n } catch (error) {\n const recoveryOutcome = await recoverSystemServiceStartupAfterTimeout({\n daemonVersion: input.daemonVersion,\n error,\n serviceCommandSpec,\n startSpinner,\n startupPollMs: input.startupPollMs,\n systemManager: input.systemManager,\n runtime: input.runtime,\n });\n if (recoveryOutcome.recovered) {\n autoRepairAttempted =\n autoRepairAttempted || recoveryOutcome.autoRepairAttempted;\n await cleanupInactiveDaemonServiceBundles();\n await clearDaemonStartFailureStateSafely();\n startSpinner?.clear();\n emitSystemServiceBackgroundStarted({\n runtime: input.runtime,\n presenter: input.presenter,\n mode: input.mode,\n controller: input.systemManager.controller,\n runtimeStatus: recoveryOutcome.startupStatus.runtimeStatus,\n autoRepairAttempted: true,\n durationMs: resolveElapsedTimeMs(startedAtMs),\n });\n return {\n ok: true,\n reason: \"started\",\n };\n }\n startSpinner?.clear();\n return await handleDaemonRunStartFailure({\n cursor: startFailureLogCursor,\n gatewayUrl: input.gatewayUrl,\n presenter: input.presenter,\n runtime: input.runtime,\n genericErrorPayload: {\n codePrefix: \"daemon.run.start_failed\",\n controller: input.systemManager.controller,\n error: recoveryOutcome.error,\n autoRepairAttempted,\n recovery: recoveryOutcome.recovery,\n },\n });\n }\n}\n\nasync function resolveContractFirstDaemonRunConfig(input: {\n daemonVersion: string;\n input: DaemonRunInput;\n isSystemServiceBootstrap: boolean;\n mode: DaemonRunMode;\n runtime: RuntimeContext;\n}): Promise<{\n gatewayUrl?: string;\n openMeldProfileId?: string;\n contractOpenMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n bootstrapContract: PersistedDaemonServiceContract | null;\n}> {\n if (!input.isSystemServiceBootstrap) {\n const currentContract = await readDaemonServiceContract().catch(() => null);\n const reusableCurrentContract = isDaemonServiceContractIdentityReusable(\n currentContract\n )\n ? currentContract\n : null;\n return {\n gatewayUrl: await resolveExplicitGatewayUrlOrThrow(\n input.input.gatewayUrl\n ),\n openMeldProfileId: await resolveDaemonServiceOpenMeldProfileId({\n explicitOpenMeldProfileId: input.input.profile,\n runtime: input.runtime,\n }),\n deviceId: resolvePreferredDaemonDeviceId({\n explicitDeviceId: input.input.deviceId,\n contractDeviceId: reusableCurrentContract?.deviceId,\n }),\n heartbeatMs: input.input.heartbeatMs,\n bootstrapContract: null,\n };\n }\n\n const bootstrapContract = await resolveSystemBootstrapDaemonContract({\n daemonVersion: input.daemonVersion,\n gatewayUrl: input.input.gatewayUrl,\n openMeldProfileId: input.input.profile,\n deviceId: input.input.deviceId,\n heartbeatMs: input.input.heartbeatMs,\n runtime: input.runtime,\n });\n\n return {\n gatewayUrl: bootstrapContract?.gatewayUrl,\n openMeldProfileId: bootstrapContract?.profileId,\n ...(bootstrapContract?.profileId\n ? { contractOpenMeldProfileId: bootstrapContract.profileId }\n : {}),\n deviceId: bootstrapContract?.deviceId,\n heartbeatMs: bootstrapContract?.heartbeatMs,\n bootstrapContract,\n };\n}\n\nasync function resolveSystemBootstrapDaemonContract(input: {\n daemonVersion: string;\n gatewayUrl?: string;\n openMeldProfileId?: string;\n deviceId?: string;\n heartbeatMs?: number;\n runtime: RuntimeContext;\n}): Promise<PersistedDaemonServiceContract | null> {\n const currentContract = await readDaemonServiceContract().catch(() => null);\n const explicitGatewayUrl = await resolveExplicitGatewayUrlOrThrow(\n input.gatewayUrl\n );\n const currentContractGatewayUrl =\n currentContract && !explicitGatewayUrl\n ? resolvePersistedDaemonServiceContractGatewayUrl(\n currentContract.gatewayUrl\n )\n : null;\n if (\n currentContract &&\n isDaemonServiceContractIdentityReusable(currentContract) &&\n currentContractGatewayUrl\n ) {\n return currentContract;\n }\n\n const systemManager = await resolveDaemonServiceManager().catch(() => null);\n return await maybeWriteDaemonServiceContract({\n runtime: input.runtime,\n daemonVersion: input.daemonVersion,\n desiredState: \"background\",\n serviceController: systemManager?.controller,\n autoStart: systemManager !== null,\n gatewayUrl: explicitGatewayUrl,\n openMeldProfileId: input.openMeldProfileId,\n contractProfileId: input.openMeldProfileId,\n deviceId: input.deviceId,\n heartbeatMs: input.heartbeatMs,\n allowDetachedFallback: systemManager === null,\n });\n}\n\nfunction resolvePersistedDaemonServiceContractGatewayUrl(\n gatewayUrl: string\n): string {\n try {\n return normalizeGatewayBaseUrl(gatewayUrl);\n } catch (error) {\n throw new Error(\n `Invalid persisted OpenMeld Service contract gateway URL \"${gatewayUrl}\": ${toErrorMessage(\n error\n )}`\n );\n }\n}\n\nfunction emitSystemServiceBackgroundStarted(input: {\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n mode: DaemonRunMode;\n controller: DaemonServiceManager[\"controller\"];\n runtimeStatus: DaemonServiceRuntimeStatus;\n autoRepairAttempted?: boolean;\n durationMs?: number;\n}): void {\n if (input.runtime.resolvedView === \"human\") {\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: \"daemon.run.background_started\",\n title: getDaemonStartStartedTitle(),\n rows: [\n {\n label: \"✅ Status\",\n value: formatDaemonStartStartedStatus(),\n },\n ...(input.durationMs === undefined\n ? []\n : [\n {\n label: \"⏱️ Ready in\",\n value: formatElapsedTime(input.durationMs),\n },\n ]),\n ...(input.autoRepairAttempted\n ? [\n {\n label: \"🩹 Automatic Repair\",\n value: formatDaemonStartAutoRepairResolvedMessage(),\n },\n ]\n : []),\n {\n label: \"📡 Local Service Link\",\n value: formatDaemonStartStartedMeaning(),\n },\n {\n label: \"🛠️ Manage\",\n value: formatDaemonStartStartedManage(),\n },\n {\n label: \"🔍 Next\",\n value: formatDaemonStartStartedNextStep(),\n },\n ],\n });\n return;\n }\n\n input.presenter.line({\n code: \"daemon.run.background_started\",\n text: `OpenMeld Service started as a system service (${input.controller}). ${normalizeRuntimeState(\n input.runtimeStatus.status\n )}; it stays alive even after this terminal closes.`,\n });\n if (input.runtime.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"daemon.run.background_started\",\n payload: {\n ok: true,\n mode: input.mode,\n pid: input.runtimeStatus.pid,\n status: input.runtimeStatus.status,\n serviceController: input.controller,\n ...(input.durationMs === undefined\n ? {}\n : { durationMs: input.durationMs }),\n },\n });\n }\n}\n\nasync function resolveDaemonRunMode(input: {\n rawMode: string | undefined;\n canPrompt: boolean;\n allowBack?: boolean;\n}): Promise<DaemonRunMode | typeof DAEMON_RUN_MODE_CHOICES.back | null> {\n if (input.rawMode) {\n return parseDaemonRunMode(input.rawMode);\n }\n\n if (!input.canPrompt) {\n return DEFAULT_DAEMON_RUN_MODE;\n }\n\n const choice = await select({\n message: \"Start OpenMeld Service in which mode?\",\n initialValue: DAEMON_RUN_MODE_CHOICES.background,\n options: [\n {\n value: DAEMON_RUN_MODE_CHOICES.background,\n label: \"Background (Recommended)\",\n hint: \"Keep the service running after you close the current terminal.\",\n },\n {\n value: DAEMON_RUN_MODE_CHOICES.foreground,\n label: \"Foreground\",\n hint: \"Run in current terminal and keep it attached to the session.\",\n },\n ...(input.allowBack\n ? [\n {\n value: DAEMON_RUN_MODE_CHOICES.back,\n label: \"Back\",\n hint: \"Return to OpenMeld Service menu.\",\n },\n ]\n : []),\n ],\n });\n\n if (isCancel(choice)) {\n return null;\n }\n\n const normalized = normalizeText(choice);\n if (normalized === DAEMON_RUN_MODE_CHOICES.back) {\n return DAEMON_RUN_MODE_CHOICES.back;\n }\n return parseDaemonRunMode(normalized);\n}\n\ntype DaemonDetachedLaunchInput = Omit<DaemonRunInput, \"profile\"> & {\n openMeldProfileId?: string;\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n mode: DaemonRunMode;\n};\n\nexport async function runDaemonServiceDetached(\n input: DaemonDetachedLaunchInput\n): Promise<DaemonRunResult> {\n const startFailureLogCursor = await captureDaemonStartFailureLogCursor();\n const launchTarget = await resolveDetachedDaemonServiceLaunchTarget();\n const launch = buildDetachedDaemonLaunchSpec(input);\n const child = spawn(\n launchTarget.command,\n [...launchTarget.args, ...launch.args],\n {\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n [DAEMON_SERVICE_RUNTIME_MODE_ENV]: input.mode,\n [DAEMON_SERVICE_RUNTIME_DETACHED_ENV]: \"1\",\n },\n windowsHide: true,\n }\n );\n const startupOutput = createLimitedStartupOutput({\n maxBytes: DAEMON_DETACHED_STARTUP_OUTPUT_LIMIT,\n });\n const startupLifecycle = observeDetachedProcessLifecycle(child);\n const cleanupStartupCapture = attachDetachedProcessStartupOutputCapture(\n child,\n startupOutput\n );\n\n try {\n if (typeof child.pid !== \"number\" || child.pid <= 0) {\n throw new Error(\"Background service process did not expose a pid.\");\n }\n\n await waitForDetachedChildProcessSpawn(child);\n await waitForDetachedBackgroundProcessStartup(\n child,\n SERVICE_STARTUP_CHECK_MS,\n DAEMON_STARTUP_POLL_INTERVAL_MS,\n startupLifecycle,\n startupOutput\n );\n await cleanupInactiveDaemonServiceBundles();\n await clearDaemonStartFailureStateSafely();\n child.unref();\n emitDetachedDaemonStartSuccess({\n commandText: launch.commandText,\n pid: child.pid,\n presenter: input.presenter,\n runtime: input.runtime,\n });\n return {\n ok: true,\n reason: \"started\",\n };\n } catch (error) {\n if (typeof child.pid === \"number\" && child.pid > 0) {\n await cleanupDetachedRuntimeStateIfOwnedByPid(child.pid).catch(() => {\n return;\n });\n }\n const startupOutputLine = selectRelevantDaemonStartFailureLogLine(\n startupOutput.summary()\n );\n return await handleDaemonRunStartFailure({\n cursor: startFailureLogCursor,\n fallbackRawLine: startupOutputLine ?? toErrorMessage(error),\n gatewayUrl: input.gatewayUrl,\n presenter: input.presenter,\n runtime: input.runtime,\n genericErrorPayload: {\n codePrefix: \"daemon.run.start_failed\",\n error: new Error(\n `Failed to start OpenMeld Service process: ${toErrorMessage(error)}`\n ),\n },\n });\n } finally {\n cleanupStartupCapture();\n startupLifecycle.clear();\n }\n}\n\ntype DetachedDaemonServiceLaunchTarget = {\n command: string;\n args: string[];\n};\n\nasync function resolveDetachedDaemonServiceLaunchTarget(): Promise<DetachedDaemonServiceLaunchTarget> {\n const entryPath = await resolveAlignedDaemonActiveBundleEntryPath({\n expectedVersion: await resolveCurrentDaemonExpectedVersion(),\n });\n if (entryPath) {\n if (isBinaryDistribution()) {\n return { command: entryPath, args: [] };\n }\n return { command: process.execPath, args: [entryPath] };\n }\n throw new Error(\n \"Cannot determine the active OpenMeld Service entry file for startup.\"\n );\n}\n\nfunction buildDetachedDaemonLaunchSpec(input: DaemonDetachedLaunchInput): {\n args: string[];\n commandText: string;\n} {\n const detachedMode = input.mode === \"background\" ? \"foreground\" : input.mode;\n const sharedArgs = [\n ...(input.accountAdmissionId\n ? [\"--account-admission-id\", input.accountAdmissionId]\n : []),\n ...(input.openMeldProfileId ? [\"--profile\", input.openMeldProfileId] : []),\n ...(input.deviceId ? [\"--device-id\", input.deviceId] : []),\n ...(typeof input.heartbeatMs === \"number\"\n ? [\"--heartbeat-ms\", String(input.heartbeatMs)]\n : []),\n ...(input.gatewayUrl ? [\"--gateway-url\", input.gatewayUrl] : []),\n ];\n return {\n args: [\"service\", \"run\", \"--mode\", detachedMode, ...sharedArgs],\n commandText: `openmeld ${[\"service\", \"run\", \"--mode\", input.mode, ...sharedArgs].join(\" \")}`,\n };\n}\n\nfunction emitDetachedDaemonStartSuccess(input: {\n presenter: ReturnType<typeof createPresenter>;\n runtime: RuntimeContext;\n pid: number;\n commandText: string;\n}): void {\n if (input.runtime.resolvedView === \"human\") {\n renderServiceActionCard({\n presenter: input.presenter,\n codePrefix: \"daemon.run.background_started\",\n title: getDaemonStartStartedTitle(),\n rows: [\n {\n label: \"✅ Status\",\n value: formatDaemonStartStartedStatus(),\n },\n {\n label: \"📡 Local Service Link\",\n value: formatDaemonStartStartedMeaning(),\n },\n {\n label: \"🛠️ Manage\",\n value: formatDaemonStartStartedManage(),\n },\n {\n label: \"🔍 Next\",\n value: formatDaemonStartStartedNextStep(),\n },\n ],\n });\n return;\n }\n\n input.presenter.line({\n code: \"daemon.run.background_started\",\n text: `OpenMeld Service started in the background with pid ${String(input.pid)}. Command: ${formatOpenMeldCliCommand(\n input.commandText\n )}`,\n });\n if (input.runtime.resolvedView !== \"agent\") {\n return;\n }\n input.presenter.data({\n code: \"daemon.run.background_started\",\n payload: {\n ok: true,\n status: \"running\",\n pid: input.pid,\n mode: \"background\",\n command: input.commandText,\n },\n });\n}\n\nfunction waitForDetachedChildProcessSpawn(child: ChildProcess): Promise<void> {\n return new Promise((resolve, reject) => {\n const onSpawn = (): void => {\n cleanup();\n resolve();\n };\n const onError = (error: unknown): void => {\n cleanup();\n reject(error);\n };\n\n const cleanup = (): void => {\n child.off(\"spawn\", onSpawn);\n child.off(\"error\", onError);\n };\n\n child.once(\"spawn\", onSpawn);\n child.once(\"error\", onError);\n });\n}\n\nasync function waitForDetachedBackgroundProcessStartup(\n child: ChildProcess,\n startupDelayMs: number,\n startupPollMs: number,\n startupLifecycle: DetachedProcessLifecycle,\n startupOutput: StartupOutputCollector\n): Promise<void> {\n if (typeof child.pid !== \"number\" || child.pid <= 0) {\n throw new Error(\"Background service process did not expose a pid.\");\n }\n\n const startupDeadlineMs = Date.now() + startupDelayMs;\n while (Date.now() < startupDeadlineMs) {\n if (startupLifecycle.hasExited) {\n throw new Error(\n describeDetachedProcessStartupFailure({\n pid: child.pid,\n reason: startupLifecycle,\n startupOutput: startupOutput.summary(),\n })\n );\n }\n\n const runtimeStatus = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (\n runtimeStatus?.status === \"running\" &&\n runtimeStatus.pid === child.pid\n ) {\n return;\n }\n\n if (!isPidAlive(child.pid)) {\n throw new Error(\n describeDetachedProcessStartupFailure({\n pid: child.pid,\n reason: startupLifecycle,\n startupOutput: startupOutput.summary(),\n })\n );\n }\n\n await sleep(startupPollMs);\n }\n\n const finalStatus = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (finalStatus?.status === \"running\" && finalStatus.pid === child.pid) {\n return;\n }\n\n if (!isPidAlive(child.pid)) {\n throw new Error(\n describeDetachedProcessStartupFailure({\n pid: child.pid,\n reason: startupLifecycle,\n startupOutput: startupOutput.summary(),\n })\n );\n }\n throw new Error(\n `Background service did not report running state within startup timeout. ${startupOutput.summary()}`\n );\n}\n\ntype DetachedProcessLifecycle = {\n hasExited: boolean;\n exitCode: number | null;\n exitSignal: NodeJS.Signals | null;\n};\n\nfunction observeDetachedProcessLifecycle(child: ChildProcess): {\n hasExited: boolean;\n exitCode: number | null;\n exitSignal: NodeJS.Signals | null;\n clear: () => void;\n} {\n const state: DetachedProcessLifecycle = {\n hasExited: false,\n exitCode: null,\n exitSignal: null,\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null): void => {\n state.hasExited = true;\n state.exitCode = typeof code === \"number\" ? code : null;\n state.exitSignal = signal;\n };\n child.once(\"exit\", onExit);\n return {\n get hasExited(): boolean {\n return state.hasExited;\n },\n get exitCode(): number | null {\n return state.exitCode;\n },\n get exitSignal(): NodeJS.Signals | null {\n return state.exitSignal;\n },\n clear: () => {\n child.off(\"exit\", onExit);\n },\n };\n}\n\ntype StartupOutputCollector = {\n append: (stream: \"stdout\" | \"stderr\", value: string) => void;\n summary: () => string;\n};\n\nfunction createLimitedStartupOutput(input: {\n maxBytes: number;\n}): StartupOutputCollector {\n let output = \"\";\n let truncated = false;\n return {\n append: (stream, value) => {\n const chunk = value.trim();\n if (!chunk) {\n return;\n }\n const normalized = `[${stream}] ${chunk}`;\n output += `${output.length > 0 ? \"\\n\" : \"\"}${normalized}`;\n if (output.length > input.maxBytes) {\n output = output.slice(output.length - input.maxBytes);\n truncated = true;\n }\n },\n summary: () => {\n const normalized = output.trim();\n if (!normalized) {\n return \"No startup output captured.\";\n }\n return truncated ? `...${normalized}` : normalized;\n },\n };\n}\n\nfunction attachDetachedProcessStartupOutputCapture(\n child: ChildProcess,\n output: StartupOutputCollector\n): () => void {\n const onStdout = (chunk: Buffer | string): void => {\n output.append(\"stdout\", chunk.toString());\n };\n const onStderr = (chunk: Buffer | string): void => {\n output.append(\"stderr\", chunk.toString());\n };\n child.stdout?.on(\"data\", onStdout);\n child.stderr?.on(\"data\", onStderr);\n return () => {\n child.stdout?.off(\"data\", onStdout);\n child.stderr?.off(\"data\", onStderr);\n };\n}\n\nfunction describeDetachedProcessStartupFailure(input: {\n pid: number;\n reason: DetachedProcessLifecycle;\n startupOutput: string;\n}): string {\n const details: string[] = [];\n if (typeof input.reason.exitCode === \"number\") {\n details.push(`exit code ${String(input.reason.exitCode)}`);\n }\n if (input.reason.exitSignal) {\n details.push(`signal ${input.reason.exitSignal}`);\n }\n const reasonText = details.length > 0 ? ` (${details.join(\", \")})` : \"\";\n return `Background service process exited during startup (pid=${String(\n input.pid\n )})${reasonText}. ${input.startupOutput}`;\n}\n\nasync function cleanupDetachedRuntimeStateIfOwnedByPid(\n pid: number\n): Promise<void> {\n const runtimeStatus = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n if (runtimeStatus?.status !== \"running\" && runtimeStatus?.pid === pid) {\n await clearDaemonServiceRuntimeState();\n }\n}\n\nfunction buildDaemonMenuPayload(): {\n commands: string[];\n notes: string[];\n actions: Array<{ command: string; description: string }>;\n} {\n return {\n commands: [...DAEMON_MENU_COMMANDS],\n notes: [\n \"start defaults to background mode; use --mode foreground for local foreground loop\",\n \"start starts OpenMeld Service in the background and keeps registration, heartbeat, and dispatch results flowing\",\n \"status reports install state and current runtime status\",\n \"stop terminates current daemon process (SIGTERM by default)\",\n \"install writes OpenMeld Service runtime files for this OpenMeld installation\",\n \"repair safely repairs OpenMeld Service and restarts it when needed (use --force to bypass drain timeout)\",\n \"update safely updates OpenMeld Service and restarts it when needed\",\n \"uninstall removes OpenMeld Service runtime files and install metadata\",\n \"future CLI startup checks service state again and recommends repair when needed\",\n \"daemon remains available as a legacy alias\",\n ],\n actions: [\n {\n command: \"openmeld service start\",\n description:\n \"Start OpenMeld Service in the recommended background mode.\",\n },\n {\n command: \"openmeld service stop\",\n description: \"Stop current daemon process.\",\n },\n {\n command: \"openmeld service autostart enable\",\n description:\n \"Allow OpenMeld Service to start automatically at sign-in without starting it now.\",\n },\n {\n command: \"openmeld service autostart disable\",\n description:\n \"Prevent OpenMeld Service from starting automatically at sign-in without stopping it now.\",\n },\n {\n command: \"openmeld service status\",\n description: \"Show install and runtime service status.\",\n },\n {\n command: \"openmeld service install\",\n description: \"Install OpenMeld Service runtime files.\",\n },\n {\n command: \"openmeld service repair\",\n description: \"Repair and restart OpenMeld Service with graceful drain.\",\n },\n {\n command: \"openmeld service update\",\n description:\n \"Update OpenMeld Service when the local service is outdated.\",\n },\n {\n command: \"openmeld service uninstall\",\n description: \"Remove OpenMeld Service runtime files.\",\n },\n ],\n };\n}\n\nasync function runInteractiveDaemonMenu(input: {\n gatewayUrl?: string;\n view: \"human\";\n}): Promise<void> {\n for (;;) {\n const choice = await promptInteractiveDaemonMenuChoice();\n if (!choice) {\n cancel(\"Cancelled.\");\n return;\n }\n\n const shouldContinue = await handleInteractiveDaemonMenuChoice(\n input,\n choice\n );\n if (shouldContinue) {\n continue;\n }\n return;\n }\n}\n\nasync function promptInteractiveDaemonMenuChoice(): Promise<Exclude<\n (typeof DAEMON_MENU_CHOICE)[keyof typeof DAEMON_MENU_CHOICE],\n typeof DAEMON_MENU_CHOICE.exit\n> | null> {\n const choice = await select({\n message: \"OpenMeld Service:\",\n options: [\n {\n value: DAEMON_MENU_CHOICE.run,\n label: \"Start\",\n hint: \"Start service (background)\",\n },\n {\n value: DAEMON_MENU_CHOICE.stop,\n label: \"Stop\",\n hint: \"Stop running service\",\n },\n {\n value: DAEMON_MENU_CHOICE.autostartEnable,\n label: \"Enable autostart\",\n hint: \"Allow service launch at sign-in\",\n },\n {\n value: DAEMON_MENU_CHOICE.autostartDisable,\n label: \"Disable autostart\",\n hint: \"Keep current process state unchanged\",\n },\n {\n value: DAEMON_MENU_CHOICE.status,\n label: \"Status\",\n hint: \"Show install + runtime status\",\n },\n {\n value: DAEMON_MENU_CHOICE.install,\n label: \"Install\",\n hint: \"Install runtime assets\",\n },\n {\n value: DAEMON_MENU_CHOICE.reinstall,\n label: \"Repair\",\n hint: \"Safe repair + restart\",\n },\n {\n value: DAEMON_MENU_CHOICE.update,\n label: \"Update\",\n hint: \"Update service build when needed\",\n },\n {\n value: DAEMON_MENU_CHOICE.uninstall,\n label: \"Uninstall\",\n hint: \"Remove runtime assets\",\n },\n {\n value: DAEMON_MENU_CHOICE.exit,\n label: \"Exit\",\n },\n ],\n });\n if (isCancel(choice) || choice === DAEMON_MENU_CHOICE.exit) {\n return null;\n }\n return choice as Exclude<\n (typeof DAEMON_MENU_CHOICE)[keyof typeof DAEMON_MENU_CHOICE],\n typeof DAEMON_MENU_CHOICE.exit\n >;\n}\n\nasync function handleInteractiveDaemonMenuChoice(\n input: {\n gatewayUrl?: string;\n view: \"human\";\n },\n choice: Exclude<\n (typeof DAEMON_MENU_CHOICE)[keyof typeof DAEMON_MENU_CHOICE],\n typeof DAEMON_MENU_CHOICE.exit\n >\n): Promise<boolean> {\n if (choice === DAEMON_MENU_CHOICE.status) {\n await runDaemonStatusFlow(input);\n return true;\n }\n if (choice === DAEMON_MENU_CHOICE.run) {\n const result = await runDaemonRunAfterEntryChecks({\n ...input,\n allowModeBack: true,\n suppressModeCancelOutput: true,\n });\n return !result.ok && result.reason === \"cancelled\";\n }\n if (choice === DAEMON_MENU_CHOICE.stop) {\n const result = await runDaemonStop(input);\n return result.status === \"cancelled\";\n }\n if (\n choice === DAEMON_MENU_CHOICE.autostartEnable ||\n choice === DAEMON_MENU_CHOICE.autostartDisable\n ) {\n await runDaemonAutostart({\n ...input,\n action:\n choice === DAEMON_MENU_CHOICE.autostartEnable ? \"enable\" : \"disable\",\n });\n return true;\n }\n if (choice === DAEMON_MENU_CHOICE.install) {\n await runDaemonInstall(input);\n return false;\n }\n if (\n choice === DAEMON_MENU_CHOICE.reinstall ||\n choice === DAEMON_MENU_CHOICE.update\n ) {\n const result = await runDaemonReinstall(\n {\n ...input,\n displayAction:\n choice === DAEMON_MENU_CHOICE.update ? \"update\" : \"repair\",\n },\n {\n suppressInstallOutput: true,\n }\n );\n if (isDaemonReinstallCompletedAndStopped(result)) {\n const followUp = await maybeOfferDaemonStartAfterReinstall({\n gatewayUrl: input.gatewayUrl,\n view: input.view,\n });\n return followUp === \"cancelled\";\n }\n return result.result === \"cancelled\";\n }\n const result = await runDaemonUninstall(input);\n return result === \"cancelled\";\n}\n\nasync function maybeOfferDaemonStartAfterReinstall(input: {\n gatewayUrl?: string;\n view: \"human\";\n ownerUserId?: string | null;\n localDemand?: LocalServiceDemand | null;\n}): Promise<DaemonInteractiveCommandResult> {\n const readiness = await resolveDaemonStartAfterReinstallReadiness({\n ownerUserId: input.ownerUserId,\n localDemand: input.localDemand,\n });\n if (!readiness.offerStartPrompt) {\n return \"completed\";\n }\n\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const decision = await runDaemonStartDecisionPrompt({\n startService: async () =>\n await runDaemonBackgroundStartForDecision({\n gatewayUrl: input.gatewayUrl,\n view: input.view,\n }),\n });\n\n if (decision === \"cancelled\") {\n return \"cancelled\";\n }\n if (decision === \"deferred_with_card\") {\n return \"completed\";\n }\n if (decision === \"not_now\") {\n renderDaemonStartDeferredCard({\n presenter,\n codePrefix: \"daemon.status.start_deferred\",\n });\n return \"completed\";\n }\n\n if (decision === \"failed\") {\n renderDaemonStartNeedsAttentionCard({\n presenter,\n codePrefix: \"daemon.status.start_failed\",\n summary: \"OpenMeld could not finish starting OpenMeld Service.\",\n });\n }\n return \"completed\";\n}\n\nasync function resolveDaemonStartAfterReinstallReadiness(input: {\n ownerUserId?: string | null;\n localDemand?: LocalServiceDemand | null;\n}): Promise<{\n offerStartPrompt: boolean;\n}> {\n const localDemand =\n input.localDemand ??\n (await resolveLocalServiceDemand({\n ownerUserId: input.ownerUserId,\n }).catch(() => null));\n if (localDemand?.decision !== \"keep_running\") {\n return {\n offerStartPrompt: false,\n };\n }\n\n const status = await getDaemonStatus();\n if (!status.installed) {\n return {\n offerStartPrompt: false,\n };\n }\n\n const runtimeState = await resolveDaemonRuntimeState(status);\n if (!runtimeState) {\n return {\n offerStartPrompt: false,\n };\n }\n\n const { serviceManagerStatus } =\n await resolveDaemonServiceManagerForRuntimeState({\n status,\n runtimeState,\n });\n const effectiveStatus = getEffectiveDaemonRuntimeStatus({\n runtimeState,\n serviceManagerStatus,\n });\n\n return {\n offerStartPrompt: shouldOfferDaemonStartDecision(effectiveStatus),\n };\n}\n\nfunction parseDaemonRunMode(rawMode: string | undefined): DaemonRunMode {\n const normalized = normalizeText(rawMode);\n if (normalized === \"foreground\") {\n return \"foreground\";\n }\n if (normalized === \"background\") {\n return \"background\";\n }\n return DEFAULT_DAEMON_RUN_MODE;\n}\n"],"mappings":"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"}