openmeld 0.3.176 → 0.3.177

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 (50) hide show
  1. package/dist/{add-me-membership--X5XEr6r.js → add-me-membership-DFH1QLtM.js} +2 -2
  2. package/dist/{add-me-membership--X5XEr6r.js.map → add-me-membership-DFH1QLtM.js.map} +1 -1
  3. package/dist/{api-client-foundation-B8thJP_k.js → api-client-foundation-BDTfl-VB.js} +3 -3
  4. package/dist/{api-client-foundation-B8thJP_k.js.map → api-client-foundation-BDTfl-VB.js.map} +1 -1
  5. package/dist/{api-client-foundation-Dmi47RGZ.js → api-client-foundation-IETYgAuy.js} +1 -1
  6. package/dist/auth-session-BmIJPnt8.js +4 -0
  7. package/dist/{auth-session-CeNOjuFD.js → auth-session-Pd_vOGrj.js} +3 -3
  8. package/dist/{auth-session-CeNOjuFD.js.map → auth-session-Pd_vOGrj.js.map} +1 -1
  9. package/dist/{base-url-8Q6W3z6w.js → base-url-B8pusunL.js} +1 -1
  10. package/dist/{base-url-DvSrOI4A.js → base-url-CcjogygH.js} +3 -3
  11. package/dist/{base-url-DvSrOI4A.js.map → base-url-CcjogygH.js.map} +1 -1
  12. package/dist/{command-BN4Hm0uI.js → command-Bs-x7Bvh.js} +53 -36
  13. package/dist/command-Bs-x7Bvh.js.map +1 -0
  14. package/dist/{daemon-runtime-lease-D_CULMR8.js → daemon-runtime-lease-D9-PBwDj.js} +2 -2
  15. package/dist/{daemon-runtime-lease-D_CULMR8.js.map → daemon-runtime-lease-D9-PBwDj.js.map} +1 -1
  16. package/dist/{daemon-runtime-lease-7GduSgO4.js → daemon-runtime-lease-plOWttUD.js} +1 -1
  17. package/dist/{daemon-service-manager-DRzfyljb.js → daemon-service-manager-9K3dv9dX.js} +50 -14
  18. package/dist/daemon-service-manager-9K3dv9dX.js.map +1 -0
  19. package/dist/{daemon-service-manager-CDRnQgpJ.js → daemon-service-manager-CJK8FDmz.js} +1 -1
  20. package/dist/{daemon-state-C_KmI_0F.js → daemon-state-DRo7-Vjz.js} +8 -8
  21. package/dist/daemon-state-DRo7-Vjz.js.map +1 -0
  22. package/dist/{dist-DOZDLj9p.js → dist-DKKWWjdX.js} +7 -1
  23. package/dist/{dist-DOZDLj9p.js.map → dist-DKKWWjdX.js.map} +1 -1
  24. package/dist/{dist-BzPL6dpG.js → dist-uAOeTpmd.js} +1 -1
  25. package/dist/{elapsed-time-BV7gVBHz.js → elapsed-time-CNAhCNac.js} +17 -3
  26. package/dist/elapsed-time-CNAhCNac.js.map +1 -0
  27. package/dist/{installer-B85sRHHm.js → installer-BPLxISl7.js} +6 -6
  28. package/dist/{installer-B85sRHHm.js.map → installer-BPLxISl7.js.map} +1 -1
  29. package/dist/{lock-VfUd0-tH.js → lock-Dv-vQTmI.js} +16 -9
  30. package/dist/lock-Dv-vQTmI.js.map +1 -0
  31. package/dist/{openmeld-BRFj6l2E.js → openmeld-B512HpHX.js} +15 -15
  32. package/dist/{openmeld-BRFj6l2E.js.map → openmeld-B512HpHX.js.map} +1 -1
  33. package/dist/openmeld-dev.js +1 -1
  34. package/dist/{openmeld-maintenance-worker-CZk1eTEs.js → openmeld-maintenance-worker-C6PjCVRX.js} +5 -5
  35. package/dist/{openmeld-maintenance-worker-CZk1eTEs.js.map → openmeld-maintenance-worker-C6PjCVRX.js.map} +1 -1
  36. package/dist/{openmeld-tools-update-coordinator-BJIyiguj.js → openmeld-tools-update-coordinator-oWejNVOi.js} +27 -19
  37. package/dist/openmeld-tools-update-coordinator-oWejNVOi.js.map +1 -0
  38. package/dist/openmeld.js +3 -3
  39. package/dist/{upgrade-Csvribot.js → upgrade-B3IqxVhB.js} +5 -5
  40. package/dist/{upgrade-Csvribot.js.map → upgrade-B3IqxVhB.js.map} +1 -1
  41. package/dist/upgrade-CGJz_t-V.js +4 -0
  42. package/package.json +1 -1
  43. package/dist/auth-session-5hLJ39_I.js +0 -4
  44. package/dist/command-BN4Hm0uI.js.map +0 -1
  45. package/dist/daemon-service-manager-DRzfyljb.js.map +0 -1
  46. package/dist/daemon-state-C_KmI_0F.js.map +0 -1
  47. package/dist/elapsed-time-BV7gVBHz.js.map +0 -1
  48. package/dist/lock-VfUd0-tH.js.map +0 -1
  49. package/dist/openmeld-tools-update-coordinator-BJIyiguj.js.map +0 -1
  50. package/dist/upgrade-C7uz_g4C.js +0 -4
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { n as daemonServiceControllerSchema } from "./service-contract-CRyDcIIf.js";
4
- import { g as daemonRuntimeStateRootPath } from "./daemon-state-C_KmI_0F.js";
4
+ import { g as daemonRuntimeStateRootPath } from "./daemon-state-DRo7-Vjz.js";
5
5
  import { dirname, join } from "node:path";
6
6
  import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
7
7
  import * as z$1 from "zod/v4";
@@ -84,4 +84,4 @@ async function clearDaemonRuntimeLease(pathInput = {}) {
84
84
  //#endregion
85
85
  export { readDaemonLocalStateFile as a, writeDaemonRuntimeLease as i, daemonRuntimeLeasePath as n, writeDaemonLocalStateFile as o, readDaemonRuntimeLease as r, clearDaemonRuntimeLease as t };
86
86
 
87
- //# sourceMappingURL=daemon-runtime-lease-D_CULMR8.js.map
87
+ //# sourceMappingURL=daemon-runtime-lease-D9-PBwDj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-runtime-lease-D_CULMR8.js","names":[],"sources":["../../../packages/schemas/dist/schemas/daemon/runtime-lease.js","../src/config/daemon-local-state-file.ts","../src/config/daemon-runtime-lease.ts"],"sourcesContent":["import { daemonServiceControllerSchema } from \"./service-contract.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/runtime-lease.ts\nconst DAEMON_RUNTIME_LEASE_SCHEMA_VERSION = 1;\nconst daemonRuntimeLeaseModeSchema = z$1.enum([\"foreground\", \"background\"]);\nconst daemonRuntimeLeaseSchema = z$1.strictObject({\n\tschema: z$1.literal(\"openmeld-daemon-runtime-lease-v1\"),\n\tv: z$1.literal(1),\n\tgeneration: z$1.int().nonnegative(),\n\tbundleId: z$1.string().min(1),\n\tpid: z$1.int().positive(),\n\tmode: daemonRuntimeLeaseModeSchema,\n\tstartedAt: z$1.string().min(1),\n\tupdatedAt: z$1.string().min(1),\n\theartbeatAt: z$1.string().nullable(),\n\tserviceController: daemonServiceControllerSchema,\n\tmanagedBySystemService: z$1.boolean()\n});\n//#endregion\nexport { DAEMON_RUNTIME_LEASE_SCHEMA_VERSION, daemonRuntimeLeaseModeSchema, daemonRuntimeLeaseSchema };\n\n//# sourceMappingURL=runtime-lease.js.map","import {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\ntype SafeParseResult<T> = { success: true; data: T } | { success: false };\n\ntype DaemonLocalStateSchema<T> = {\n safeParse: (value: unknown) => SafeParseResult<T>;\n};\n\nexport async function readDaemonLocalStateFile<T>(input: {\n path: string;\n schema: DaemonLocalStateSchema<T>;\n}): Promise<T | null> {\n const raw = await readFile(input.path, \"utf8\").catch((error) => {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n\n const parsedJson = safeParseJson(raw);\n if (parsedJson === null) {\n return null;\n }\n const parsed = input.schema.safeParse(parsedJson);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function writeDaemonLocalStateFile<T>(input: {\n path: string;\n schema: DaemonLocalStateSchema<T>;\n value: T;\n mode?: number;\n}): Promise<void> {\n const parsed = input.schema.safeParse(input.value);\n if (!parsed.success) {\n throw new Error(`invalid daemon local state for ${input.path}`);\n }\n\n await mkdir(dirname(input.path), { recursive: true });\n const tempPath = `${input.path}.tmp-${process.pid}-${Date.now()}`;\n let shouldCleanupTemp = true;\n\n try {\n await writeFile(tempPath, `${JSON.stringify(parsed.data, null, 2)}\\n`, {\n encoding: \"utf8\",\n ...(typeof input.mode === \"number\" ? { mode: input.mode } : {}),\n });\n await rename(tempPath, input.path);\n if (typeof input.mode === \"number\") {\n await chmod(input.path, input.mode);\n }\n shouldCleanupTemp = false;\n } finally {\n if (shouldCleanupTemp) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nfunction safeParseJson(raw: string): unknown | null {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeLeaseSchema } from \"@openmeld/schemas\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport {\n readDaemonLocalStateFile,\n writeDaemonLocalStateFile,\n} from \"./daemon-local-state-file\";\nimport { daemonRuntimeStateRootPath } from \"./daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"./paths\";\n\nconst DAEMON_RUNTIME_LEASE_FILENAME = \"runtime-lease.json\";\n\nexport function daemonRuntimeLeasePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_RUNTIME_LEASE_FILENAME\n );\n}\n\nexport async function readDaemonRuntimeLease(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonRuntimeLease | null> {\n return await readDaemonLocalStateFile({\n path: daemonRuntimeLeasePath(pathInput),\n schema: daemonRuntimeLeaseSchema,\n });\n}\n\nexport async function writeDaemonRuntimeLease(\n lease: DaemonRuntimeLease,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeDaemonLocalStateFile({\n path: daemonRuntimeLeasePath(pathInput),\n schema: daemonRuntimeLeaseSchema,\n value: lease,\n mode: 0o600,\n });\n}\n\nexport async function clearDaemonRuntimeLease(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(daemonRuntimeLeasePath(pathInput), { force: true });\n}\n"],"mappings":";;;;;;;;AAIA,MAAM,+BAA+B,IAAI,KAAK,CAAC,cAAc,YAAY,CAAC;AAC1E,MAAM,2BAA2B,IAAI,aAAa;CACjD,QAAQ,IAAI,QAAQ,kCAAkC;CACtD,GAAG,IAAI,QAAQ,CAAC;CAChB,YAAY,IAAI,IAAI,CAAC,CAAC,YAAY;CAClC,UAAU,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC5B,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS;CACxB,MAAM;CACN,WAAW,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC7B,WAAW,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC7B,aAAa,IAAI,OAAO,CAAC,CAAC,SAAS;CACnC,mBAAmB;CACnB,wBAAwB,IAAI,QAAQ;AACrC,CAAC;;;ACDD,eAAsB,yBAA4B,OAG5B;CACpB,MAAM,MAAM,MAAM,SAAS,MAAM,MAAM,MAAM,CAAC,CAAC,OAAO,UAAU;EAC9D,IACE,SACA,OAAO,UAAU,YACjB,UAAU,SACV,MAAM,SAAS,UAEf,OAAO;EAET,MAAM;CACR,CAAC;CACD,IAAI,QAAQ,MACV,OAAO;CAGT,MAAM,aAAa,cAAc,GAAG;CACpC,IAAI,eAAe,MACjB,OAAO;CAET,MAAM,SAAS,MAAM,OAAO,UAAU,UAAU;CAChD,OAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAEA,eAAsB,0BAA6B,OAKjC;CAChB,MAAM,SAAS,MAAM,OAAO,UAAU,MAAM,KAAK;CACjD,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,MAAM,kCAAkC,MAAM,MAAM;CAGhE,MAAM,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;CACpD,MAAM,WAAW,GAAG,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG,KAAK,IAAI;CAC9D,IAAI,oBAAoB;CAExB,IAAI;EACF,MAAM,UAAU,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK;GACrE,UAAU;GACV,GAAI,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;EAC/D,CAAC;EACD,MAAM,OAAO,UAAU,MAAM,IAAI;EACjC,IAAI,OAAO,MAAM,SAAS,UACxB,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;EAEpC,oBAAoB;CACtB,UAAU;EACR,IAAI,mBACF,MAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;CAE7D;AACF;AAEA,SAAS,cAAc,KAA6B;CAClD,IAAI;EACF,OAAO,KAAK,MAAM,GAAG;CACvB,QAAQ;EACN,OAAO;CACT;AACF;;;ACtEA,MAAM,gCAAgC;AAEtC,SAAgB,uBACd,YAAyC,CAAC,GAClC;CACR,OAAO,KACL,2BAA2B,SAAS,GACpC,6BACF;AACF;AAEA,eAAsB,uBACpB,YAAyC,CAAC,GACN;CACpC,OAAO,MAAM,yBAAyB;EACpC,MAAM,uBAAuB,SAAS;EACtC,QAAQ;CACV,CAAC;AACH;AAEA,eAAsB,wBACpB,OACA,YAAyC,CAAC,GAC3B;CACf,MAAM,0BAA0B;EAC9B,MAAM,uBAAuB,SAAS;EACtC,QAAQ;EACR,OAAO;EACP,MAAM;CACR,CAAC;AACH;AAEA,eAAsB,wBACpB,YAAyC,CAAC,GAC3B;CACf,MAAM,GAAG,uBAAuB,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC7D"}
1
+ {"version":3,"file":"daemon-runtime-lease-D9-PBwDj.js","names":[],"sources":["../../../packages/schemas/dist/schemas/daemon/runtime-lease.js","../src/config/daemon-local-state-file.ts","../src/config/daemon-runtime-lease.ts"],"sourcesContent":["import { daemonServiceControllerSchema } from \"./service-contract.js\";\nimport * as z$1 from \"zod/v4\";\n//#region src/schemas/daemon/runtime-lease.ts\nconst DAEMON_RUNTIME_LEASE_SCHEMA_VERSION = 1;\nconst daemonRuntimeLeaseModeSchema = z$1.enum([\"foreground\", \"background\"]);\nconst daemonRuntimeLeaseSchema = z$1.strictObject({\n\tschema: z$1.literal(\"openmeld-daemon-runtime-lease-v1\"),\n\tv: z$1.literal(1),\n\tgeneration: z$1.int().nonnegative(),\n\tbundleId: z$1.string().min(1),\n\tpid: z$1.int().positive(),\n\tmode: daemonRuntimeLeaseModeSchema,\n\tstartedAt: z$1.string().min(1),\n\tupdatedAt: z$1.string().min(1),\n\theartbeatAt: z$1.string().nullable(),\n\tserviceController: daemonServiceControllerSchema,\n\tmanagedBySystemService: z$1.boolean()\n});\n//#endregion\nexport { DAEMON_RUNTIME_LEASE_SCHEMA_VERSION, daemonRuntimeLeaseModeSchema, daemonRuntimeLeaseSchema };\n\n//# sourceMappingURL=runtime-lease.js.map","import {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\ntype SafeParseResult<T> = { success: true; data: T } | { success: false };\n\ntype DaemonLocalStateSchema<T> = {\n safeParse: (value: unknown) => SafeParseResult<T>;\n};\n\nexport async function readDaemonLocalStateFile<T>(input: {\n path: string;\n schema: DaemonLocalStateSchema<T>;\n}): Promise<T | null> {\n const raw = await readFile(input.path, \"utf8\").catch((error) => {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n\n const parsedJson = safeParseJson(raw);\n if (parsedJson === null) {\n return null;\n }\n const parsed = input.schema.safeParse(parsedJson);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function writeDaemonLocalStateFile<T>(input: {\n path: string;\n schema: DaemonLocalStateSchema<T>;\n value: T;\n mode?: number;\n}): Promise<void> {\n const parsed = input.schema.safeParse(input.value);\n if (!parsed.success) {\n throw new Error(`invalid daemon local state for ${input.path}`);\n }\n\n await mkdir(dirname(input.path), { recursive: true });\n const tempPath = `${input.path}.tmp-${process.pid}-${Date.now()}`;\n let shouldCleanupTemp = true;\n\n try {\n await writeFile(tempPath, `${JSON.stringify(parsed.data, null, 2)}\\n`, {\n encoding: \"utf8\",\n ...(typeof input.mode === \"number\" ? { mode: input.mode } : {}),\n });\n await rename(tempPath, input.path);\n if (typeof input.mode === \"number\") {\n await chmod(input.path, input.mode);\n }\n shouldCleanupTemp = false;\n } finally {\n if (shouldCleanupTemp) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nfunction safeParseJson(raw: string): unknown | null {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { daemonRuntimeLeaseSchema } from \"@openmeld/schemas\";\nimport type { DaemonRuntimeLease } from \"@openmeld/schemas/types\";\nimport {\n readDaemonLocalStateFile,\n writeDaemonLocalStateFile,\n} from \"./daemon-local-state-file\";\nimport { daemonRuntimeStateRootPath } from \"./daemon-state\";\nimport type { OpenMeldPathResolutionInput } from \"./paths\";\n\nconst DAEMON_RUNTIME_LEASE_FILENAME = \"runtime-lease.json\";\n\nexport function daemonRuntimeLeasePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_RUNTIME_LEASE_FILENAME\n );\n}\n\nexport async function readDaemonRuntimeLease(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonRuntimeLease | null> {\n return await readDaemonLocalStateFile({\n path: daemonRuntimeLeasePath(pathInput),\n schema: daemonRuntimeLeaseSchema,\n });\n}\n\nexport async function writeDaemonRuntimeLease(\n lease: DaemonRuntimeLease,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeDaemonLocalStateFile({\n path: daemonRuntimeLeasePath(pathInput),\n schema: daemonRuntimeLeaseSchema,\n value: lease,\n mode: 0o600,\n });\n}\n\nexport async function clearDaemonRuntimeLease(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await rm(daemonRuntimeLeasePath(pathInput), { force: true });\n}\n"],"mappings":";;;;;;;;AAIA,MAAM,+BAA+B,IAAI,KAAK,CAAC,cAAc,YAAY,CAAC;AAC1E,MAAM,2BAA2B,IAAI,aAAa;CACjD,QAAQ,IAAI,QAAQ,kCAAkC;CACtD,GAAG,IAAI,QAAQ,CAAC;CAChB,YAAY,IAAI,IAAI,CAAC,CAAC,YAAY;CAClC,UAAU,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC5B,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS;CACxB,MAAM;CACN,WAAW,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC7B,WAAW,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC;CAC7B,aAAa,IAAI,OAAO,CAAC,CAAC,SAAS;CACnC,mBAAmB;CACnB,wBAAwB,IAAI,QAAQ;AACrC,CAAC;;;ACDD,eAAsB,yBAA4B,OAG5B;CACpB,MAAM,MAAM,MAAM,SAAS,MAAM,MAAM,MAAM,CAAC,CAAC,OAAO,UAAU;EAC9D,IACE,SACA,OAAO,UAAU,YACjB,UAAU,SACV,MAAM,SAAS,UAEf,OAAO;EAET,MAAM;CACR,CAAC;CACD,IAAI,QAAQ,MACV,OAAO;CAGT,MAAM,aAAa,cAAc,GAAG;CACpC,IAAI,eAAe,MACjB,OAAO;CAET,MAAM,SAAS,MAAM,OAAO,UAAU,UAAU;CAChD,OAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAEA,eAAsB,0BAA6B,OAKjC;CAChB,MAAM,SAAS,MAAM,OAAO,UAAU,MAAM,KAAK;CACjD,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,MAAM,kCAAkC,MAAM,MAAM;CAGhE,MAAM,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;CACpD,MAAM,WAAW,GAAG,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG,KAAK,IAAI;CAC9D,IAAI,oBAAoB;CAExB,IAAI;EACF,MAAM,UAAU,UAAU,GAAG,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK;GACrE,UAAU;GACV,GAAI,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;EAC/D,CAAC;EACD,MAAM,OAAO,UAAU,MAAM,IAAI;EACjC,IAAI,OAAO,MAAM,SAAS,UACxB,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;EAEpC,oBAAoB;CACtB,UAAU;EACR,IAAI,mBACF,MAAM,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;CAE7D;AACF;AAEA,SAAS,cAAc,KAA6B;CAClD,IAAI;EACF,OAAO,KAAK,MAAM,GAAG;CACvB,QAAQ;EACN,OAAO;CACT;AACF;;;ACtEA,MAAM,gCAAgC;AAEtC,SAAgB,uBACd,YAAyC,CAAC,GAClC;CACR,OAAO,KACL,2BAA2B,SAAS,GACpC,6BACF;AACF;AAEA,eAAsB,uBACpB,YAAyC,CAAC,GACN;CACpC,OAAO,MAAM,yBAAyB;EACpC,MAAM,uBAAuB,SAAS;EACtC,QAAQ;CACV,CAAC;AACH;AAEA,eAAsB,wBACpB,OACA,YAAyC,CAAC,GAC3B;CACf,MAAM,0BAA0B;EAC9B,MAAM,uBAAuB,SAAS;EACtC,QAAQ;EACR,OAAO;EACP,MAAM;CACR,CAAC;AACH;AAEA,eAAsB,wBACpB,YAAyC,CAAC,GAC3B;CACf,MAAM,GAAG,uBAAuB,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC7D"}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { t as clearDaemonRuntimeLease } from "./daemon-runtime-lease-D_CULMR8.js";
3
+ import { t as clearDaemonRuntimeLease } from "./daemon-runtime-lease-D9-PBwDj.js";
4
4
  export { clearDaemonRuntimeLease };
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { dt as resolveOpenMeldRootDir, lt as resolveOpenMeldEnvPreset, ot as resolveDefaultOpenMeldHomeDirname, st as resolveExplicitOpenMeldEnvPreset } from "./lock-VfUd0-tH.js";
3
+ import { ft as resolveOpenMeldServiceScope, lt as resolveOpenMeldEnvPreset, ot as resolveDefaultOpenMeldHomeDirname, st as resolveExplicitOpenMeldEnvPreset, ut as resolveOpenMeldRootDir } from "./lock-Dv-vQTmI.js";
4
4
  import { i as windowsTaskActionArguments, n as runWindowsUserTask, r as windowsPowerShellPath, t as readWindowsTaskAction } from "./windows-user-task-DqJWtlAm.js";
5
5
  import { t as sleep } from "./dist-o3UL1EGQ.js";
6
- import { m as daemonRuntimeRootPath } from "./daemon-state-C_KmI_0F.js";
6
+ import { m as daemonRuntimeRootPath } from "./daemon-state-DRo7-Vjz.js";
7
7
  import { homedir, userInfo } from "node:os";
8
8
  import { dirname, join, resolve } from "node:path";
9
9
  import { access, chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
@@ -83,7 +83,15 @@ const DAEMON_SERVICE_IDENTITY_BY_PRESET = {
83
83
  };
84
84
  function resolveDaemonServiceIdentity(input = {}) {
85
85
  const preset = resolveOpenMeldEnvPreset(input);
86
- return DAEMON_SERVICE_IDENTITY_BY_PRESET[preset];
86
+ const identity = DAEMON_SERVICE_IDENTITY_BY_PRESET[preset];
87
+ const scope = resolveOpenMeldServiceScope(input);
88
+ return scope ? {
89
+ ...identity,
90
+ serviceName: `${identity.serviceName}-${scope}`,
91
+ launchdLabel: `${identity.launchdLabel}.${scope}`,
92
+ windowsServiceName: `${identity.windowsServiceName}-${scope}`,
93
+ windowsDisplayName: `${identity.windowsDisplayName} (${scope})`
94
+ } : identity;
87
95
  }
88
96
  //#endregion
89
97
  //#region src/local-service/lifecycle/daemon-service-manager.ts
@@ -257,6 +265,20 @@ function isLaunchdServiceMissing(result) {
257
265
  const output = `${result.stdout}\n${result.stderr}`;
258
266
  return LAUNCHD_SERVICE_NOT_FOUND_PATTERNS.some((pattern) => pattern.test(output));
259
267
  }
268
+ async function waitForLaunchdJobUnloaded(serviceKey) {
269
+ await waitForCondition({
270
+ until: async () => {
271
+ const result = await runCommand({
272
+ command: "launchctl",
273
+ args: ["print", serviceKey],
274
+ throwOnError: false
275
+ });
276
+ if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) throw buildServiceManagerProbeError("launchctl print", result);
277
+ return isLaunchdServiceMissing(result);
278
+ },
279
+ onTimeout: () => /* @__PURE__ */ new Error(`Timed out waiting for launchd job ${serviceKey} to unload.`)
280
+ });
281
+ }
260
282
  function formatManagerStatusDetails(status) {
261
283
  return `installed=${String(status.installed)} running=${String(status.running)} enabled=${String(status.enabled)}`;
262
284
  }
@@ -862,7 +884,13 @@ function buildLaunchdManager(pathInput = {}) {
862
884
  waitUntilStopped: async () => {
863
885
  await waitForCondition({
864
886
  until: async () => {
865
- return !(await buildLaunchdManager(pathInput).status()).running;
887
+ const result = await runCommand({
888
+ command: "launchctl",
889
+ args: ["print", launchdServiceKey],
890
+ throwOnError: false
891
+ });
892
+ if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) throw buildServiceManagerProbeError("launchctl print", result);
893
+ return isLaunchdServiceMissing(result);
866
894
  },
867
895
  onTimeout: async () => {
868
896
  const status = await buildLaunchdManager(pathInput).status();
@@ -1115,37 +1143,45 @@ async function ensureServiceLogDirectory(pathInput = {}) {
1115
1143
  await mkdir(dirname(getDaemonSystemServiceLogPath(pathInput)), { recursive: true });
1116
1144
  }
1117
1145
  function guardDaemonServiceManagerMutations(manager, pathInput = {}) {
1118
- const assertMutationAllowed = (operation) => {
1146
+ const assertMutationAllowed = async (operation) => {
1119
1147
  assertSafePublishedProductionServiceRegistrationMutation(operation, pathInput);
1148
+ if (resolveOpenMeldEnvPreset(pathInput) !== "dev-local") return;
1149
+ const status = await manager.status();
1150
+ if (!status.installed) return;
1151
+ const env = status.commandSpec?.env ?? (status.definitionPath ? parseDaemonServiceEnvironmentFromDefinition({
1152
+ controller: manager.controller,
1153
+ definition: await readFile(status.definitionPath, "utf8")
1154
+ }) : {});
1155
+ if (env.OPENMELD_ENV_PRESET !== "dev-local" || !env.OPENMELD_HOME || resolve(env.OPENMELD_HOME) !== resolve(resolveOpenMeldRootDir(pathInput))) throw new Error(`Cannot ${operation} OpenMeld Service: its registered development home does not match this environment.`);
1120
1156
  };
1121
1157
  return {
1122
1158
  ...manager,
1123
1159
  install: async (spec) => {
1124
- assertMutationAllowed("install");
1160
+ await assertMutationAllowed("install");
1125
1161
  await manager.install(spec);
1126
1162
  },
1127
1163
  uninstall: async () => {
1128
- assertMutationAllowed("uninstall");
1164
+ await assertMutationAllowed("uninstall");
1129
1165
  await manager.uninstall();
1130
1166
  },
1131
1167
  enableAutostart: async () => {
1132
- assertMutationAllowed("enable autostart for");
1168
+ await assertMutationAllowed("enable autostart for");
1133
1169
  await manager.enableAutostart();
1134
1170
  },
1135
1171
  disableAutostart: async () => {
1136
- assertMutationAllowed("disable autostart for");
1172
+ await assertMutationAllowed("disable autostart for");
1137
1173
  await manager.disableAutostart();
1138
1174
  },
1139
1175
  start: async () => {
1140
- assertMutationAllowed("start");
1176
+ await assertMutationAllowed("start");
1141
1177
  await manager.start();
1142
1178
  },
1143
1179
  stop: async () => {
1144
- assertMutationAllowed("stop");
1180
+ await assertMutationAllowed("stop");
1145
1181
  await manager.stop();
1146
1182
  },
1147
1183
  deactivate: async () => {
1148
- assertMutationAllowed("deactivate");
1184
+ await assertMutationAllowed("deactivate");
1149
1185
  await manager.deactivate();
1150
1186
  }
1151
1187
  };
@@ -1182,6 +1218,6 @@ async function resolveUnguardedDaemonServiceManager(controller, pathInput = {})
1182
1218
  return null;
1183
1219
  }
1184
1220
  //#endregion
1185
- export { assertNoPublishedProductionMutationDuringTests as C, isTestProcess as E, resolveDaemonServiceIdentity as S, isPublishedProductionOpenMeldRoot as T, readSystemdServiceActiveProbe as _, disableDaemonServiceAutostartIfConfigured as a, resolveDaemonServiceManager as b, getDaemonSystemServiceLogPath as c, isDaemonServiceBackgroundExecutionBlocked as d, isDaemonServiceJobNeverSpawned as f, readDaemonServiceJobCrashExitCode as g, parseLaunchdServiceJobDiagnostics as h, buildSystemdUnitFile as i, guardDaemonServiceManagerMutations as l, parseDaemonServiceEnvironmentTargetFromDefinition as m, assertServiceManagerProbeSucceeded as n, formatDaemonServiceJobDiagnosticsEvidence as o, parseDaemonServiceEnvironmentFromDefinition as p, buildLaunchdPlist as r, getDaemonServiceLaunchdLabel as s, DaemonServiceWaitTimeoutError as t, installMissingServiceDefinitionFailAtomically as u, readSystemdServiceEnabledProbe as v, assertSafePublishedProductionServiceRegistrationMutation as w, runServiceDefinitionRollbackSteps as x, readWindowsRunnerCommandSummary as y };
1221
+ export { resolveDaemonServiceIdentity as C, isTestProcess as D, isPublishedProductionOpenMeldRoot as E, waitForLaunchdJobUnloaded as S, assertSafePublishedProductionServiceRegistrationMutation as T, readSystemdServiceActiveProbe as _, disableDaemonServiceAutostartIfConfigured as a, resolveDaemonServiceManager as b, getDaemonSystemServiceLogPath as c, isDaemonServiceBackgroundExecutionBlocked as d, isDaemonServiceJobNeverSpawned as f, readDaemonServiceJobCrashExitCode as g, parseLaunchdServiceJobDiagnostics as h, buildSystemdUnitFile as i, guardDaemonServiceManagerMutations as l, parseDaemonServiceEnvironmentTargetFromDefinition as m, assertServiceManagerProbeSucceeded as n, formatDaemonServiceJobDiagnosticsEvidence as o, parseDaemonServiceEnvironmentFromDefinition as p, buildLaunchdPlist as r, getDaemonServiceLaunchdLabel as s, DaemonServiceWaitTimeoutError as t, installMissingServiceDefinitionFailAtomically as u, readSystemdServiceEnabledProbe as v, assertNoPublishedProductionMutationDuringTests as w, runServiceDefinitionRollbackSteps as x, readWindowsRunnerCommandSummary as y };
1186
1222
 
1187
- //# sourceMappingURL=daemon-service-manager-DRzfyljb.js.map
1223
+ //# sourceMappingURL=daemon-service-manager-9K3dv9dX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-service-manager-9K3dv9dX.js","names":[],"sources":["../src/config/published-production-safety.ts","../src/local-service/lifecycle/daemon-service-identity.ts","../src/local-service/lifecycle/daemon-service-manager.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { OpenMeldPathResolutionInput } from \"./paths\";\nimport {\n resolveDefaultOpenMeldHomeDirname,\n resolveExplicitOpenMeldEnvPreset,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"./paths\";\n\nconst PUBLISHED_PRODUCTION_OPENMELD_ROOT = normalizeComparablePath(\n join(homedir(), resolveDefaultOpenMeldHomeDirname(\"prod\"))\n);\n\nexport function assertNoPublishedProductionMutationDuringTests(\n pathInput: OpenMeldPathResolutionInput,\n targetName: string\n): void {\n if (!isTestProcess(pathInput)) {\n return;\n }\n if (!isPublishedProductionOpenMeldRoot(pathInput)) {\n return;\n }\n throw new Error(\n [\n `Refusing to mutate ${targetName} in the published production lane during tests.`,\n \"Set OPENMELD_HOME to a fresh temporary directory, or run the validation through openmeld-dev or openmeld-canary.\",\n ].join(\" \")\n );\n}\n\n/**\n * The OS service manager registration (launchd label / systemd unit / Windows\n * service name) is a per-user global resource keyed only by the env preset.\n * OPENMELD_HOME isolates lane files but does NOT isolate this registration, so\n * a process with an isolated root can still stop, boot out, or uninstall the\n * real published production service. Fail closed before any such mutation:\n * - test processes must never mutate the production registration, and\n * - a non-test process whose effective root left the published production\n * lane must state its intent with an explicit OPENMELD_ENV_PRESET.\n */\nexport function assertSafePublishedProductionServiceRegistrationMutation(\n operation: string,\n pathInput: OpenMeldPathResolutionInput = {}\n): void {\n if (resolveOpenMeldEnvPreset(pathInput) !== \"prod\") {\n return;\n }\n if (isTestProcess(pathInput)) {\n throw new Error(\n [\n `Refusing to ${operation} the published production OpenMeld Service registration during tests.`,\n \"OPENMELD_HOME does not isolate the OS service manager registration.\",\n \"Target an isolated lane with OPENMELD_ENV_PRESET=dev-local or OPENMELD_ENV_PRESET=canary, or stub the service manager.\",\n ].join(\" \")\n );\n }\n if (resolveExplicitOpenMeldEnvPreset(pathInput) === \"prod\") {\n return;\n }\n if (isPublishedProductionOpenMeldRoot(pathInput)) {\n return;\n }\n throw new Error(\n [\n `Refusing to ${operation} the published production OpenMeld Service registration:`,\n \"the effective OpenMeld root is outside the published production lane, but the service identity resolved to the production label.\",\n \"Set OPENMELD_ENV_PRESET explicitly to state which service registration this command must mutate.\",\n ].join(\" \")\n );\n}\n\nexport function isPublishedProductionOpenMeldRoot(\n pathInput: OpenMeldPathResolutionInput\n): boolean {\n return (\n normalizeComparablePath(resolveOpenMeldRootDir(pathInput)) ===\n PUBLISHED_PRODUCTION_OPENMELD_ROOT\n );\n}\n\nexport function isTestProcess(\n pathInput: OpenMeldPathResolutionInput = {}\n): boolean {\n const env = pathInput.env ?? process.env;\n const argv = pathInput.argv ?? process.argv;\n return (\n env.NODE_ENV === \"test\" ||\n env.VITEST === \"true\" ||\n typeof env.VITEST_WORKER_ID === \"string\" ||\n typeof env.JEST_WORKER_ID === \"string\" ||\n argv.some((arg) => arg.includes(\"vitest\"))\n );\n}\n\nfunction normalizeComparablePath(path: string): string {\n const normalized = resolve(path);\n return process.platform === \"win32\" ? normalized.toLowerCase() : normalized;\n}\n","import type {\n OpenMeldEnvPreset,\n OpenMeldPathResolutionInput,\n} from \"../../config/paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldServiceScope,\n} from \"../../config/paths\";\n\nexport type DaemonServiceIdentity = {\n envPreset: OpenMeldEnvPreset;\n serviceName: string;\n launchdLabel: string;\n windowsServiceName: string;\n windowsDisplayName: string;\n cliEntryAliases: readonly string[];\n};\n\nconst DAEMON_SERVICE_IDENTITY_BY_PRESET = {\n prod: {\n envPreset: \"prod\",\n serviceName: \"openmeld-daemon\",\n launchdLabel: \"com.openmeld.openmeld-background-service\",\n windowsServiceName: \"OpenMeld-Daemon\",\n windowsDisplayName: \"OpenMeld Daemon Service\",\n cliEntryAliases: [\"openmeld\"],\n },\n \"dev-local\": {\n envPreset: \"dev-local\",\n serviceName: \"openmeld-daemon-dev-local\",\n launchdLabel: \"com.openmeld.openmeld-background-service.dev-local\",\n windowsServiceName: \"OpenMeld-Daemon-DevLocal\",\n windowsDisplayName: \"OpenMeld Daemon Service (Dev Local)\",\n cliEntryAliases: [\"openmeld-dev\"],\n },\n canary: {\n envPreset: \"canary\",\n serviceName: \"openmeld-daemon-canary\",\n launchdLabel: \"com.openmeld.openmeld-background-service.canary\",\n windowsServiceName: \"OpenMeld-Daemon-Canary\",\n windowsDisplayName: \"OpenMeld Daemon Service (Canary)\",\n cliEntryAliases: [\"openmeld-canary\"],\n },\n} as const satisfies Record<OpenMeldEnvPreset, DaemonServiceIdentity>;\n\nexport function resolveDaemonServiceIdentity(\n input: OpenMeldPathResolutionInput = {}\n): DaemonServiceIdentity {\n const preset = resolveOpenMeldEnvPreset(input);\n const identity = DAEMON_SERVICE_IDENTITY_BY_PRESET[preset];\n const scope = resolveOpenMeldServiceScope(input);\n return scope\n ? {\n ...identity,\n serviceName: `${identity.serviceName}-${scope}`,\n launchdLabel: `${identity.launchdLabel}.${scope}`,\n windowsServiceName: `${identity.windowsServiceName}-${scope}`,\n windowsDisplayName: `${identity.windowsDisplayName} (${scope})`,\n }\n : identity;\n}\n","import { spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n mkdir,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { WindowsUserTaskRequest } from \"@openmeld/schemas\";\nimport { sleep } from \"@openmeld/utils\";\nimport type { DaemonServiceController } from \"../../config/daemon-state\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport { assertSafePublishedProductionServiceRegistrationMutation } from \"../../config/published-production-safety\";\nimport { resolveDaemonServiceIdentity } from \"./daemon-service-identity\";\nimport {\n readWindowsTaskAction,\n runWindowsUserTask,\n windowsPowerShellPath,\n windowsTaskActionArguments,\n} from \"./windows-user-task\";\n\nexport type RunCommandResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\ntype RunCommandOptions = {\n args: string[];\n command: string;\n env?: NodeJS.ProcessEnv;\n throwOnError?: boolean;\n};\n\nexport type DaemonServiceCommandSpec = {\n executable: string;\n args: string[];\n env: Record<string, string>;\n workingDirectory?: string;\n};\n\nexport type DaemonServiceManagerRuntimeStatus = {\n installed: boolean;\n running: boolean;\n enabled: boolean;\n definitionPath?: string | null;\n commandSummary?: string | null;\n /** Native launch action when the supervisor does not use a definition file. */\n commandSpec?: DaemonServiceCommandSpec;\n /**\n * The OpenMeld backend target persisted in the OS service definition.\n * `undefined` is reserved for older/custom manager implementations that do\n * not expose this observation; `null` means the definition was readable but\n * did not contain one complete, valid target.\n */\n environmentTarget?: OpenMeldEnvironmentTarget | null;\n};\n\nexport type DaemonServiceJobDiagnostics = {\n controller: DaemonServiceController;\n /** The service definition is loaded in the OS service manager domain. */\n loaded: boolean;\n /** How many times the OS service manager spawned the process since load. */\n runs: number | null;\n state: string | null;\n /** Raw last-exit text as reported, e.g. \"(never exited)\" or \"78\". */\n lastExitCodeText: string | null;\n /** Numeric last exit code when the raw text is a plain integer. */\n lastExitCode: number | null;\n /** launchd marker for a spawn held back by the OS (Background Task Management). */\n pendedNondemandSpawn: string | null;\n /** Job is configured to auto-start and stay alive (keepalive + runatload). */\n keepaliveRunAtLoad: boolean;\n};\n\nexport type DaemonServiceManager = {\n controller: DaemonServiceController;\n /**\n * Installs or refreshes the supervisor definition without starting another\n * process. When the definition was absent, success means a fresh status\n * probe confirmed that it is installed and enabled. A failed install or\n * verification removes that newly created definition before rejecting.\n */\n install: (spec: DaemonServiceCommandSpec) => Promise<void>;\n uninstall: () => Promise<void>;\n enableAutostart: () => Promise<void>;\n disableAutostart: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n deactivate: () => Promise<void>;\n status: () => Promise<DaemonServiceManagerRuntimeStatus>;\n waitUntilAbsent: () => Promise<void>;\n waitUntilStopped: () => Promise<void>;\n waitUntilRunning: () => Promise<void>;\n /**\n * Controller-reported job-state evidence for startup failure diagnosis\n * (for launchd: `launchctl print` runs/state/last exit code/pended spawn).\n * Diagnostic evidence only; it must never feed availability, readiness,\n * or lifecycle decisions. Resolves null when the controller offers no\n * job-state evidence or the probe fails.\n */\n readJobDiagnostics?: () => Promise<DaemonServiceJobDiagnostics | null>;\n};\n\n/**\n * Disables autostart only when the OS definition is already committed.\n * Setup can run a candidate Service from its stable carrier before that\n * definition exists; the process can still be stopped without toggling it.\n */\nexport async function disableDaemonServiceAutostartIfConfigured(input: {\n manager: DaemonServiceManager;\n status: DaemonServiceManagerRuntimeStatus | null;\n}): Promise<boolean> {\n if (!(input.status?.installed === true && input.status.enabled === true)) {\n return false;\n }\n await input.manager.disableAutostart();\n return true;\n}\n\nconst SHELL_QUOTING_PATTERN = /[\\s\"\\\\]/g;\nconst SHELL_BACKSLASH_PATTERN = /\\\\/g;\nconst SHELL_DOUBLE_QUOTE_PATTERN = /\"/g;\nconst WINDOWS_QUOTE_PATTERN = /\"/g;\nconst XML_AMPERSAND_PATTERN = /&/g;\nconst XML_LESS_THAN_PATTERN = /</g;\nconst XML_GREATER_THAN_PATTERN = />/g;\nconst XML_DOUBLE_QUOTE_ESCAPE_PATTERN = /\"/g;\nconst XML_SINGLE_QUOTE_PATTERN = /'/g;\nconst LAUNCHD_ENABLED_PATTERN = /enabled\\s*=\\s*(true|false)/i;\nconst LAUNCHD_STATE_PATTERN = /state\\s*=\\s*running/i;\nconst LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN =\n /\"([^\"]+)\"\\s*=>\\s*(enabled|disabled)/i;\nconst LAUNCHD_STRING_PATTERN = /<string>([^<]+)<\\/string>/g;\nconst LAUNCHD_ENVIRONMENT_BLOCK_PATTERN =\n /<key>EnvironmentVariables<\\/key>\\s*<dict>([\\s\\S]*?)<\\/dict>/;\nconst WINDOWS_LINE_SEPARATOR_PATTERN = /\\r?\\n/;\nconst WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN = /^set \"([^=]+)=(.*)\"$/i;\nconst SYSTEMD_ACTIVE_STATES = new Set([\n \"active\",\n \"reloading\",\n \"inactive\",\n \"failed\",\n \"activating\",\n \"deactivating\",\n \"maintenance\",\n \"unknown\",\n]);\nconst SYSTEMD_ENABLED_STATES = new Set([\n \"enabled\",\n \"enabled-runtime\",\n \"linked\",\n \"linked-runtime\",\n \"alias\",\n \"masked\",\n \"masked-runtime\",\n \"static\",\n \"indirect\",\n \"generated\",\n \"transient\",\n \"disabled\",\n \"bad\",\n \"not-found\",\n]);\nconst LAUNCHD_ALREADY_PATTERN = /already/i;\nconst WINDOWS_SCRIPT_LINE_SPLIT_PATTERN = /\\r?\\n/u;\nconst LAUNCHD_SERVICE_NOT_FOUND_PATTERNS = [\n /could not find service/i,\n /service could not be found/i,\n /could not find domain/i,\n] as const;\nconst LAUNCHD_PRINT_RUNS_PATTERN = /^\\s*runs\\s*=\\s*(\\d+)\\s*$/m;\nconst LAUNCHD_PRINT_STATE_PATTERN = /^\\s*state\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN =\n /^\\s*last exit code\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN =\n /^\\s*pended nondemand spawn\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PROPERTIES_PATTERN = /^\\s*properties\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN = /\\bkeepalive\\b/i;\nconst LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN = /\\brunatload\\b/i;\nconst INTEGER_TEXT_PATTERN = /^-?\\d+$/;\nconst SYSTEM_SERVICE_WAIT_MS = 15_000;\nconst SYSTEM_SERVICE_POLL_MS = 200;\n\nconst QUOTED_XML_REPLACEMENT = \"&quot;\";\nconst APOSTROPHE_XML_REPLACEMENT = \"&apos;\";\nconst GREATER_XML_REPLACEMENT = \"&gt;\";\nconst LESS_XML_REPLACEMENT = \"&lt;\";\nconst AMPERSAND_XML_REPLACEMENT = \"&amp;\";\n\nexport function getDaemonSystemServiceLogPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n \"daemon-system-service.log\"\n );\n}\n\nexport function getDaemonServiceLaunchdLabel(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return resolveDaemonServiceIdentity(pathInput).launchdLabel;\n}\n\nconst SYSTEMD_CONTROLLER: DaemonServiceController = \"systemd\";\nconst LAUNCHD_CONTROLLER: DaemonServiceController = \"launchd\";\nconst WINDOWS_CONTROLLER: DaemonServiceController = \"windows-service\";\nconst DAEMON_SERVICE_RESTART_BACKOFF_SECONDS = 60;\n\nasync function runCommand(input: RunCommandOptions): Promise<RunCommandResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(input.command, input.args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: input.env ?? process.env,\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n\n child.once(\"error\", (error) => {\n if (input.throwOnError) {\n reject(error);\n return;\n }\n resolve({\n exitCode: 1,\n stdout,\n stderr: `${stderr}${String(error)}`,\n });\n });\n\n child.once(\"close\", (code) => {\n const exitCode = typeof code === \"number\" ? code : 1;\n if (input.throwOnError && exitCode !== 0) {\n reject(\n new Error(\n [\n `command failed: ${input.command} ${input.args.join(\" \")}`,\n stdout.trim(),\n stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n )\n );\n return;\n }\n resolve({\n exitCode,\n stdout,\n stderr,\n });\n });\n });\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n}\n\n// Thrown when a service-manager wait (running/stopped/absent) times out. On the\n// launchd running path it carries the structured launchd job-state verdict so\n// upstream lifecycle journaling can distinguish a never-spawned (Login Items\n// blocked) job from a crash loop — matching the `openmeld service run` startup path.\n// Diagnostic evidence only: jobDiagnostics must never gate lifecycle decisions.\nexport class DaemonServiceWaitTimeoutError extends Error {\n readonly jobDiagnostics: DaemonServiceJobDiagnostics | null;\n\n constructor(input: {\n message: string;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n }) {\n super(input.message);\n this.name = \"DaemonServiceWaitTimeoutError\";\n this.jobDiagnostics = input.jobDiagnostics ?? null;\n }\n}\n\nexport function isDaemonServiceWaitTimeoutError(\n error: unknown\n): error is DaemonServiceWaitTimeoutError {\n return error instanceof DaemonServiceWaitTimeoutError;\n}\n\nfunction buildSystemServiceWaitTimeoutError(input: {\n action: \"absent\" | \"running\" | \"stopped\";\n controller: DaemonServiceController;\n details?: string | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n}): DaemonServiceWaitTimeoutError {\n const detailSuffix =\n input.details && input.details.trim().length > 0\n ? ` Last observed state: ${input.details.trim()}`\n : \"\";\n return new DaemonServiceWaitTimeoutError({\n message: `timed out waiting for ${input.controller} service to become ${input.action}.${detailSuffix}`,\n jobDiagnostics: input.jobDiagnostics ?? null,\n });\n}\n\nasync function waitForCondition(input: {\n waitMs?: number;\n pollMs?: number;\n until: () => Promise<boolean>;\n onTimeout: () => Promise<Error> | Error;\n}): Promise<void> {\n const deadline = Date.now() + (input.waitMs ?? SYSTEM_SERVICE_WAIT_MS);\n const pollMs = input.pollMs ?? SYSTEM_SERVICE_POLL_MS;\n while (Date.now() < deadline) {\n if (await input.until()) {\n return;\n }\n await sleep(pollMs);\n }\n throw await input.onTimeout();\n}\n\nfunction isLaunchdServiceMissing(result: RunCommandResult): boolean {\n if (result.exitCode === 0) {\n return false;\n }\n const output = `${result.stdout}\\n${result.stderr}`;\n return LAUNCHD_SERVICE_NOT_FOUND_PATTERNS.some((pattern) =>\n pattern.test(output)\n );\n}\n\nexport async function waitForLaunchdJobUnloaded(\n serviceKey: string\n): Promise<void> {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", serviceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: () =>\n new Error(`Timed out waiting for launchd job ${serviceKey} to unload.`),\n });\n}\n\nfunction formatManagerStatusDetails(\n status: DaemonServiceManagerRuntimeStatus\n): string {\n return `installed=${String(status.installed)} running=${String(status.running)} enabled=${String(status.enabled)}`;\n}\n\nfunction quoteShellValue(input: string): string {\n if (input === \"\") {\n return '\"\"';\n }\n if (SHELL_QUOTING_PATTERN.test(input)) {\n return `\"${input\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n }\n return input;\n}\n\nfunction quoteWindowsArg(input: string): string {\n return `\"${input.replace(WINDOWS_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction escapeXmlText(input: string): string {\n return input\n .replace(XML_AMPERSAND_PATTERN, AMPERSAND_XML_REPLACEMENT)\n .replace(XML_LESS_THAN_PATTERN, LESS_XML_REPLACEMENT)\n .replace(XML_GREATER_THAN_PATTERN, GREATER_XML_REPLACEMENT)\n .replace(XML_DOUBLE_QUOTE_ESCAPE_PATTERN, QUOTED_XML_REPLACEMENT)\n .replace(XML_SINGLE_QUOTE_PATTERN, APOSTROPHE_XML_REPLACEMENT);\n}\n\nexport function buildSystemdUnitFile(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const command = [\n quoteShellValue(spec.executable),\n ...spec.args.map(quoteShellValue),\n ].join(\" \");\n const workingDirectory = quoteShellValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n );\n const envRows = Object.entries(spec.env).map(\n ([key, value]) =>\n `Environment=${key}=${quoteSystemdEnvironmentValue(value)}`\n );\n return `# Managed by OpenMeld CLI\n[Unit]\nDescription=OpenMeld Daemon Service\nAfter=network-online.target\n\n[Service]\nType=simple\nWorkingDirectory=${workingDirectory}\nExecStart=${command}\nRestart=always\nRestartSec=${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}\n${envRows.join(\"\\n\")}\nStandardOutput=append:${serviceLogPath}\nStandardError=append:${serviceLogPath}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nfunction quoteSystemdEnvironmentValue(value: string): string {\n return `\"${value\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction sanitizeLaunchdEnvironmentValue(value: string): string {\n return sanitizeControlCharacters(value);\n}\n\nfunction sanitizeControlCharacters(value: string): string {\n let sanitized = \"\";\n for (const char of value) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n continue;\n }\n if (code >= 0x00 && code <= 0x1f) {\n continue;\n }\n if (code === 0x7f) {\n continue;\n }\n sanitized += char;\n }\n return sanitized;\n}\n\nexport function buildLaunchdPlist(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const args = [spec.executable, ...spec.args]\n .map((value) => ` <string>${escapeXmlText(value)}</string>`)\n .join(\"\\n\");\n const workingDirectory = escapeXmlText(\n sanitizeLaunchdEnvironmentValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n )\n );\n const envRows = Object.entries(spec.env)\n .filter(([key, value]) => key.trim() !== \"\" && value !== \"\")\n .map(\n ([key, value]) =>\n ` <key>${escapeXmlText(key)}</key>\\n <string>${escapeXmlText(\n sanitizeLaunchdEnvironmentValue(value)\n )}</string>`\n )\n .join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${serviceIdentity.launchdLabel}</string>\n <key>ProgramArguments</key>\n <array>\n${args}\n </array>\n <key>WorkingDirectory</key>\n <string>${workingDirectory}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>ThrottleInterval</key>\n <integer>${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}</integer>\n <key>EnvironmentVariables</key>\n <dict>\n${envRows}\n </dict>\n <key>StandardOutPath</key>\n <string>${serviceLogPath}</string>\n <key>StandardErrorPath</key>\n <string>${serviceLogPath}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction resolveSystemdUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \".config\",\n \"systemd\",\n \"user\",\n `${serviceIdentity.serviceName}.service`\n );\n}\n\nfunction resolveLaunchdPlistPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \"Library\",\n \"LaunchAgents\",\n `${serviceIdentity.launchdLabel}.plist`\n );\n}\n\nfunction resolveWindowsServiceScriptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n daemonRuntimeRootPath(pathInput),\n `${serviceIdentity.serviceName}-runner.bat`\n );\n}\n\nfunction parseRegexGroup(input: string, pattern: RegExp): string | null {\n const match = input.match(pattern);\n return match?.[1] ?? null;\n}\n\nfunction parseLaunchdEnabled(output: string): boolean {\n const value = parseRegexGroup(output, LAUNCHD_ENABLED_PATTERN);\n return value !== null && value.toLowerCase() === \"true\";\n}\n\nexport function parseLaunchdServiceJobDiagnostics(\n printOutput: string\n): DaemonServiceJobDiagnostics {\n const runsText = parseRegexGroup(printOutput, LAUNCHD_PRINT_RUNS_PATTERN);\n const lastExitCodeText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN\n );\n const propertiesText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PROPERTIES_PATTERN\n );\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: true,\n runs: runsText === null ? null : Number.parseInt(runsText, 10),\n state: parseRegexGroup(printOutput, LAUNCHD_PRINT_STATE_PATTERN),\n lastExitCodeText,\n lastExitCode:\n lastExitCodeText !== null && INTEGER_TEXT_PATTERN.test(lastExitCodeText)\n ? Number.parseInt(lastExitCodeText, 10)\n : null,\n pendedNondemandSpawn: parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN\n ),\n keepaliveRunAtLoad:\n propertiesText !== null &&\n LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN.test(propertiesText) &&\n LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN.test(propertiesText),\n };\n}\n\nexport function isDaemonServiceJobNeverSpawned(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.loaded &&\n diagnostics.runs === 0 &&\n diagnostics.keepaliveRunAtLoad\n );\n}\n\nexport function isDaemonServiceBackgroundExecutionBlocked(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.controller === LAUNCHD_CONTROLLER &&\n isDaemonServiceJobNeverSpawned(diagnostics) &&\n diagnostics.pendedNondemandSpawn !== null\n );\n}\n\nexport function readDaemonServiceJobCrashExitCode(\n diagnostics: DaemonServiceJobDiagnostics\n): number | null {\n if (!diagnostics.loaded) {\n return null;\n }\n if (diagnostics.runs === null || diagnostics.runs <= 0) {\n return null;\n }\n if (diagnostics.lastExitCode === null || diagnostics.lastExitCode === 0) {\n return null;\n }\n return diagnostics.lastExitCode;\n}\n\nexport function formatDaemonServiceJobDiagnosticsEvidence(\n diagnostics: DaemonServiceJobDiagnostics\n): string {\n if (!diagnostics.loaded) {\n return `${diagnostics.controller} job: not loaded`;\n }\n const parts = [\n `state=${diagnostics.state ?? \"unknown\"}`,\n `runs=${diagnostics.runs ?? \"unknown\"}`,\n `last exit code=${diagnostics.lastExitCodeText ?? \"unknown\"}`,\n ...(diagnostics.pendedNondemandSpawn\n ? [`pended nondemand spawn=${diagnostics.pendedNondemandSpawn}`]\n : []),\n ...(diagnostics.keepaliveRunAtLoad\n ? [\"properties=keepalive|runatload\"]\n : []),\n ];\n return `${diagnostics.controller} job: ${parts.join(\", \")}`;\n}\n\nfunction parseLaunchdEnabledFromDisabledServices(\n output: string,\n label: string\n): boolean | null {\n const lines = output.split(\"\\n\");\n for (const line of lines) {\n const match = line.match(LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN);\n if (!match) {\n continue;\n }\n const serviceLabel = match[1];\n const state = match[2];\n if (!(serviceLabel && state) || serviceLabel !== label) {\n continue;\n }\n return state.toLowerCase() === \"enabled\";\n }\n return null;\n}\n\nexport async function installMissingServiceDefinitionFailAtomically(input: {\n definitionWasPresent: boolean;\n install: () => Promise<void>;\n rollbackNewDefinition: () => Promise<void>;\n verifyNewDefinition: () => Promise<void>;\n}): Promise<void> {\n try {\n await input.install();\n await input.verifyNewDefinition();\n } catch (installError) {\n if (input.definitionWasPresent) {\n throw installError;\n }\n try {\n await input.rollbackNewDefinition();\n } catch (rollbackError) {\n throw new AggregateError(\n [installError, rollbackError],\n \"service registration install failed and its new definition could not be rolled back\"\n );\n }\n throw installError;\n }\n}\n\nexport function readSystemdServiceActiveProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ACTIVE_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-active\", result);\n }\n return state === \"active\" || state === \"reloading\";\n}\n\nexport function readSystemdServiceEnabledProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ENABLED_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-enabled\", result);\n }\n return state === \"enabled\" || state === \"enabled-runtime\";\n}\n\nexport function assertServiceManagerProbeSucceeded(\n probe: string,\n result: RunCommandResult\n): void {\n if (result.exitCode !== 0) {\n throw buildServiceManagerProbeError(probe, result);\n }\n}\n\nfunction buildServiceManagerProbeError(\n probe: string,\n result: RunCommandResult\n): Error {\n return new Error(\n [\n `${probe} probe failed`,\n `exitCode=${result.exitCode}`,\n result.stdout.trim(),\n result.stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n );\n}\n\nexport async function runServiceDefinitionRollbackSteps(\n steps: ReadonlyArray<() => Promise<unknown>>\n): Promise<void> {\n const errors: unknown[] = [];\n for (const step of steps) {\n try {\n await step();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n \"one or more service registration rollback steps failed\"\n );\n }\n}\n\nfunction assertServiceRegistrationInstalledAndEnabled(\n controller: DaemonServiceController,\n status: DaemonServiceManagerRuntimeStatus\n): void {\n if (status.installed && status.enabled) {\n return;\n }\n throw new Error(\n `${controller} service registration install did not restore an installed, enabled registration`\n );\n}\n\nfunction buildSystemdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const unitPath = resolveSystemdUnitPath(pathInput);\n const unitName = `${serviceIdentity.serviceName}.service`;\n\n return {\n controller: SYSTEMD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(unitPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(unitPath), { recursive: true });\n await writeFile(unitPath, buildSystemdUnitFile(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n const user = process.env.USER || userInfo().username;\n await runCommand({\n command: \"loginctl\",\n args: [\"enable-linger\", user],\n throwOnError: false,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n }),\n async () => await rm(unitPath, { force: true }),\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildSystemdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n SYSTEMD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: false,\n });\n await rm(unitPath, { force: true });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: false,\n });\n },\n enableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n });\n },\n start: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"stop\", unitName],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(unitPath);\n const activeResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-active\", unitName],\n throwOnError: false,\n });\n const enabledResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-enabled\", unitName],\n throwOnError: false,\n });\n return {\n installed,\n running: readSystemdServiceActiveProbe(activeResult),\n enabled: readSystemdServiceEnabledProbe(enabledResult),\n definitionPath: installed ? unitPath : null,\n commandSummary: installed\n ? await readSystemServiceCommandSummary(unitPath, \"ExecStart=\")\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: SYSTEMD_CONTROLLER,\n path: unitPath,\n })\n : null,\n };\n },\n // systemd does not expose the launchd-style job spawn evidence yet.\n readJobDiagnostics: async () => null,\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return !(status.installed || status.running || status.enabled);\n },\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () =>\n !(await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n };\n}\n\nfunction buildLaunchdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const plistPath = resolveLaunchdPlistPath(pathInput);\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const launchdServiceKey = `${guiDomain}/${serviceIdentity.launchdLabel}`;\n\n return {\n controller: LAUNCHD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(plistPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(plistPath), { recursive: true });\n await writeFile(plistPath, buildLaunchdPlist(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o644,\n });\n await chmod(plistPath, 0o644);\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n }),\n async () => await rm(plistPath, { force: true }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n LAUNCHD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"remove\", serviceIdentity.launchdLabel],\n throwOnError: false,\n });\n await rm(plistPath, { force: true });\n },\n enableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n start: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: false,\n });\n const bootstrap = await runCommand({\n command: \"launchctl\",\n args: [\"bootstrap\", guiDomain, plistPath],\n throwOnError: false,\n });\n if (\n bootstrap.exitCode !== 0 &&\n !LAUNCHD_ALREADY_PATTERN.test(bootstrap.stderr)\n ) {\n throw new Error(\n `failed to start launchd service: ${bootstrap.stderr.trim() || bootstrap.stdout.trim()}`\n );\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: false,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(plistPath);\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n const disabledResult = await runCommand({\n command: \"launchctl\",\n args: [\"print-disabled\", guiDomain],\n throwOnError: false,\n });\n if (printResult.exitCode !== 0 && !isLaunchdServiceMissing(printResult)) {\n throw buildServiceManagerProbeError(\"launchctl print\", printResult);\n }\n assertServiceManagerProbeSucceeded(\n \"launchctl print-disabled\",\n disabledResult\n );\n const output = `${printResult.stdout}\\n${printResult.stderr}`;\n const disabledOutput = `${disabledResult.stdout}\\n${disabledResult.stderr}`;\n const enabledFromDisabledServices =\n parseLaunchdEnabledFromDisabledServices(\n disabledOutput,\n serviceIdentity.launchdLabel\n );\n return {\n installed,\n running: LAUNCHD_STATE_PATTERN.test(output),\n enabled: enabledFromDisabledServices ?? parseLaunchdEnabled(output),\n definitionPath: installed ? plistPath : null,\n commandSummary: installed\n ? await readLaunchdProgramArguments(plistPath)\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: LAUNCHD_CONTROLLER,\n path: plistPath,\n })\n : null,\n };\n },\n readJobDiagnostics: async () => {\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (printResult.exitCode === 0) {\n return parseLaunchdServiceJobDiagnostics(\n `${printResult.stdout}\\n${printResult.stderr}`\n );\n }\n if (isLaunchdServiceMissing(printResult)) {\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: false,\n runs: null,\n state: null,\n lastExitCodeText: null,\n lastExitCode: null,\n pendedNondemandSpawn: null,\n keepaliveRunAtLoad: false,\n };\n }\n return null;\n },\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const [installed, printResult] = await Promise.all([\n pathExists(plistPath),\n runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n }),\n ]);\n return !installed && isLaunchdServiceMissing(printResult);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildLaunchdManager(pathInput).status()).running,\n onTimeout: async () => {\n const manager = buildLaunchdManager(pathInput);\n const status = await manager.status();\n // Diagnostic-only launchd job-state probe on timeout, mirroring the\n // `openmeld service run` startup path so the lifecycle journal can record a\n // never-spawned vs crash-loop verdict. Best-effort; never gates state.\n const jobDiagnostics = manager.readJobDiagnostics\n ? await manager.readJobDiagnostics().catch(() => null)\n : null;\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n jobDiagnostics,\n });\n },\n });\n },\n };\n}\n\nfunction buildWindowsManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const identity = resolveDaemonServiceIdentity(pathInput);\n const scriptPath = resolveWindowsServiceScriptPath(pathInput);\n const task = (operation: WindowsUserTaskRequest[\"operation\"]) =>\n runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation,\n });\n const status = async (): Promise<DaemonServiceManagerRuntimeStatus> => {\n const observed = await task(\"status\");\n if (observed.actionArguments !== null) {\n const action = readWindowsTaskAction(observed.actionArguments);\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: `Task Scheduler: ${identity.windowsServiceName} (current user)`,\n commandSummary: [\n quoteWindowsArg(action.executable),\n ...action.args.map(quoteWindowsArg),\n ].join(\" \"),\n commandSpec: action,\n environmentTarget: serviceEnvironmentTarget(action.env),\n };\n }\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: observed.installed ? scriptPath : null,\n commandSummary: observed.installed\n ? await readWindowsRunnerCommandSummary(scriptPath)\n : null,\n environmentTarget: observed.installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: WINDOWS_CONTROLLER,\n path: scriptPath,\n })\n : null,\n };\n };\n const wait = async (action: \"absent\" | \"stopped\" | \"running\") => {\n await waitForCondition({\n until: async () => {\n const current = await status();\n if (action === \"running\") {\n return current.running;\n }\n return action === \"stopped\" ? !current.running : !current.installed;\n },\n onTimeout: async () =>\n buildSystemServiceWaitTimeoutError({\n action,\n controller: WINDOWS_CONTROLLER,\n details: formatManagerStatusDetails(await status()),\n }),\n });\n };\n return {\n controller: WINDOWS_CONTROLLER,\n install: async (spec) => {\n await ensureServiceLogDirectory(pathInput);\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation: \"install\",\n executable: windowsPowerShellPath(),\n arguments: windowsTaskActionArguments({\n ...spec,\n logPath: getDaemonSystemServiceLogPath(pathInput),\n }),\n workingDirectory:\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput),\n });\n assertServiceRegistrationInstalledAndEnabled(\n WINDOWS_CONTROLLER,\n await status()\n );\n await rm(scriptPath, { force: true });\n },\n uninstall: async () => {\n await task(\"uninstall\");\n await rm(scriptPath, { force: true });\n },\n enableAutostart: async () => {\n await task(\"enable\");\n },\n disableAutostart: async () => {\n await task(\"disable\");\n },\n start: async () => {\n await task(\"enable\");\n await task(\"start\");\n },\n stop: async () => {\n await task(\"disable\");\n await task(\"stop\");\n },\n deactivate: async () => {\n await task(\"stop\");\n },\n status,\n readJobDiagnostics: async () => null,\n waitUntilAbsent: () => wait(\"absent\"),\n waitUntilStopped: () => wait(\"stopped\"),\n waitUntilRunning: () => wait(\"running\"),\n };\n}\n\nexport async function readWindowsRunnerCommandSummary(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const lines = file\n .split(WINDOWS_SCRIPT_LINE_SPLIT_PATTERN)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n const normalizedLine = line.toLowerCase();\n if (\n !(\n normalizedLine === \"@echo off\" ||\n normalizedLine === \"setlocal\" ||\n normalizedLine.startsWith(\"set \")\n )\n ) {\n return line;\n }\n }\n return null;\n}\n\nasync function readSystemServiceCommandSummary(\n path: string,\n prefix: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const line = file\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .find((entry) => entry.startsWith(prefix));\n if (!line) {\n return null;\n }\n return line.slice(prefix.length).trim() || null;\n}\n\nasync function readLaunchdProgramArguments(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const matches = [...file.matchAll(LAUNCHD_STRING_PATTERN)].map(\n (match) => match[1]\n );\n if (matches.length === 0) {\n return null;\n }\n return matches.join(\" \");\n}\n\nconst SERVICE_ENVIRONMENT_TARGET_KEYS = {\n preset: \"OPENMELD_ENV_PRESET\",\n gatewayUrl: \"OPENMELD_GATEWAY_URL\",\n authBaseUrl: \"OPENMELD_AUTH_URL\",\n userFacingCommand: \"OPENMELD_USER_FACING_CLI_COMMAND\",\n} as const;\n\nexport function parseDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): OpenMeldEnvironmentTarget | null {\n return serviceEnvironmentTarget(\n parseDaemonServiceEnvironmentFromDefinition(input)\n );\n}\n\nexport function parseDaemonServiceEnvironmentFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): Record<string, string> {\n if (input.controller === SYSTEMD_CONTROLLER) {\n return parseSystemdEnvironment(input.definition);\n }\n if (input.controller === LAUNCHD_CONTROLLER) {\n return parseLaunchdEnvironment(input.definition);\n }\n return parseWindowsEnvironment(input.definition);\n}\n\nfunction serviceEnvironmentTarget(\n environment: Record<string, string>\n): OpenMeldEnvironmentTarget | null {\n const preset = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.preset];\n const gatewayUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.gatewayUrl];\n const authBaseUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.authBaseUrl];\n const userFacingCommand =\n environment[SERVICE_ENVIRONMENT_TARGET_KEYS.userFacingCommand];\n if (\n !(\n (preset === \"prod\" || preset === \"canary\" || preset === \"dev-local\") &&\n gatewayUrl &&\n authBaseUrl &&\n userFacingCommand\n )\n ) {\n return null;\n }\n return {\n preset,\n gatewayUrl,\n authBaseUrl,\n userFacingCommand,\n };\n}\n\nasync function readDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n path: string;\n}): Promise<OpenMeldEnvironmentTarget | null> {\n const definition = await readFile(input.path, \"utf8\").catch(() => null);\n if (!definition) {\n return null;\n }\n return parseDaemonServiceEnvironmentTargetFromDefinition({\n controller: input.controller,\n definition,\n });\n}\n\nfunction parseSystemdEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line.startsWith(\"Environment=\")) {\n continue;\n }\n const assignment = line.slice(\"Environment=\".length);\n const separatorIndex = assignment.indexOf(\"=\");\n if (separatorIndex <= 0) {\n continue;\n }\n const key = assignment.slice(0, separatorIndex);\n let value = assignment.slice(separatorIndex + 1);\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n }\n environment[key] = value;\n }\n return environment;\n}\n\nfunction parseLaunchdEnvironment(definition: string): Record<string, string> {\n const environmentBlock = definition.match(\n LAUNCHD_ENVIRONMENT_BLOCK_PATTERN\n )?.[1];\n if (!environmentBlock) {\n return {};\n }\n const environment: Record<string, string> = {};\n for (const match of environmentBlock.matchAll(\n /<key>([^<]+)<\\/key>\\s*<string>([^<]*)<\\/string>/g\n )) {\n const key = decodeXmlText(match[1] ?? \"\");\n if (!key) {\n continue;\n }\n environment[key] = decodeXmlText(match[2] ?? \"\");\n }\n return environment;\n}\n\nfunction parseWindowsEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(WINDOWS_LINE_SEPARATOR_PATTERN)) {\n const match = rawLine.trim().match(WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN);\n if (!(match?.[1] && match[2] !== undefined)) {\n continue;\n }\n environment[match[1]] = match[2].replace(/\\\\\"/g, '\"');\n }\n return environment;\n}\n\nfunction decodeXmlText(value: string): string {\n return value\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, \">\")\n .replace(/&lt;/g, \"<\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction isSystemdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"--version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isLaunchdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"launchctl\",\n args: [\"version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isWindowsTaskSchedulerAvailable(): Promise<boolean> {\n return runCommand({\n command: windowsPowerShellPath(),\n args: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"$ErrorActionPreference='Stop'; $s=New-Object -ComObject Schedule.Service; $s.Connect()\",\n ],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nasync function ensureServiceLogDirectory(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(dirname(getDaemonSystemServiceLogPath(pathInput)), {\n recursive: true,\n });\n}\n\nexport function guardDaemonServiceManagerMutations(\n manager: DaemonServiceManager,\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const assertMutationAllowed = async (operation: string): Promise<void> => {\n assertSafePublishedProductionServiceRegistrationMutation(\n operation,\n pathInput\n );\n if (resolveOpenMeldEnvPreset(pathInput) !== \"dev-local\") {\n return;\n }\n const status = await manager.status();\n if (!status.installed) {\n return;\n }\n const env =\n status.commandSpec?.env ??\n (status.definitionPath\n ? parseDaemonServiceEnvironmentFromDefinition({\n controller: manager.controller,\n definition: await readFile(status.definitionPath, \"utf8\"),\n })\n : {});\n if (\n env.OPENMELD_ENV_PRESET !== \"dev-local\" ||\n !env.OPENMELD_HOME ||\n resolve(env.OPENMELD_HOME) !== resolve(resolveOpenMeldRootDir(pathInput))\n ) {\n throw new Error(\n `Cannot ${operation} OpenMeld Service: its registered development home does not match this environment.`\n );\n }\n };\n return {\n ...manager,\n install: async (spec) => {\n await assertMutationAllowed(\"install\");\n await manager.install(spec);\n },\n uninstall: async () => {\n await assertMutationAllowed(\"uninstall\");\n await manager.uninstall();\n },\n enableAutostart: async () => {\n await assertMutationAllowed(\"enable autostart for\");\n await manager.enableAutostart();\n },\n disableAutostart: async () => {\n await assertMutationAllowed(\"disable autostart for\");\n await manager.disableAutostart();\n },\n start: async () => {\n await assertMutationAllowed(\"start\");\n await manager.start();\n },\n stop: async () => {\n await assertMutationAllowed(\"stop\");\n await manager.stop();\n },\n deactivate: async () => {\n await assertMutationAllowed(\"deactivate\");\n await manager.deactivate();\n },\n };\n}\n\nexport async function resolveDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n const manager = await resolveUnguardedDaemonServiceManager(\n controller,\n pathInput\n );\n return manager\n ? guardDaemonServiceManagerMutations(manager, pathInput)\n : null;\n}\n\nasync function resolveUnguardedDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n if (controller === SYSTEMD_CONTROLLER) {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (controller === LAUNCHD_CONTROLLER) {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (controller === WINDOWS_CONTROLLER) {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n if (process.platform === \"darwin\") {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (process.platform === \"linux\") {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (process.platform === \"win32\") {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { p as parseDaemonServiceEnvironmentFromDefinition } from "./daemon-service-manager-DRzfyljb.js";
3
+ import { p as parseDaemonServiceEnvironmentFromDefinition } from "./daemon-service-manager-9K3dv9dX.js";
4
4
  export { parseDaemonServiceEnvironmentFromDefinition };
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { a as readLockMeta, d as tryCleanupStaleLock, dt as resolveOpenMeldRootDir, ft as runtimeDir, gt as systemDir, lt as resolveOpenMeldEnvPreset, o as releaseLock, t as acquireLock, u as runWithHeldLock, ut as resolveOpenMeldPresetOwnedPathInput } from "./lock-VfUd0-tH.js";
3
+ import { _t as systemDir, a as readLockMeta, d as tryCleanupStaleLock, dt as resolveOpenMeldServiceOwnedPathInput, lt as resolveOpenMeldEnvPreset, o as releaseLock, pt as runtimeDir, t as acquireLock, u as runWithHeldLock, ut as resolveOpenMeldRootDir } from "./lock-Dv-vQTmI.js";
4
+ import { createHash, randomBytes } from "node:crypto";
4
5
  import { tmpdir } from "node:os";
5
6
  import { join } from "node:path";
6
- import { createHash, randomBytes } from "node:crypto";
7
7
  import { chmod, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
8
8
  import { AsyncLocalStorage } from "node:async_hooks";
9
9
  //#region src/config/daemon-state.ts
@@ -132,7 +132,7 @@ async function setDaemonServiceRuntimeState(state, pathInput = {}) {
132
132
  await writeDaemonServiceRuntimeState(state, pathInput);
133
133
  }
134
134
  async function clearDaemonServiceRuntimeState(pathInput = {}) {
135
- const { clearDaemonRuntimeLease } = await import("./daemon-runtime-lease-7GduSgO4.js");
135
+ const { clearDaemonRuntimeLease } = await import("./daemon-runtime-lease-plOWttUD.js");
136
136
  await Promise.all([rm(daemonServiceRuntimeStatePath(pathInput), { force: true }), clearDaemonRuntimeLease(pathInput)]);
137
137
  }
138
138
  function withDaemonServiceRunLock(callback, meta = {
@@ -144,7 +144,7 @@ function withDaemonServiceRunLock(callback, meta = {
144
144
  async function acquireDaemonServiceLifecycleLock(meta = {
145
145
  intent: "run_background",
146
146
  command: "openmeld service start"
147
- }, pathResolution = resolveOpenMeldPresetOwnedPathInput()) {
147
+ }, pathResolution = resolveOpenMeldServiceOwnedPathInput()) {
148
148
  return await acquireLock({
149
149
  openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,
150
150
  key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,
@@ -171,7 +171,7 @@ function withDaemonServiceRegistrationMutationLock(callback, meta) {
171
171
  return withDaemonServiceLifecycleLock(meta, callback);
172
172
  }
173
173
  function withDaemonServiceLifecycleLock(meta, callback) {
174
- const pathResolution = resolveOpenMeldPresetOwnedPathInput();
174
+ const pathResolution = resolveOpenMeldServiceOwnedPathInput();
175
175
  const ownerRoot = resolveOpenMeldRootDir(pathResolution);
176
176
  const currentContext = daemonServiceLifecycleLockContext.getStore();
177
177
  if (currentContext?.active && currentContext.ownerRoot === ownerRoot) {
@@ -241,7 +241,7 @@ async function readDaemonServiceLifecycleLockMeta() {
241
241
  const meta = await readLockMeta({
242
242
  openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,
243
243
  key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,
244
- pathResolution: resolveOpenMeldPresetOwnedPathInput()
244
+ pathResolution: resolveOpenMeldServiceOwnedPathInput()
245
245
  });
246
246
  if (!meta) return null;
247
247
  const intent = typeof meta.intent === "string" ? normalizeDaemonLifecycleIntent(meta.intent) : null;
@@ -262,7 +262,7 @@ async function readDaemonServiceLifecycleLockMetaWithCleanup() {
262
262
  await tryCleanupStaleLock({
263
263
  openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,
264
264
  key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,
265
- pathResolution: resolveOpenMeldPresetOwnedPathInput()
265
+ pathResolution: resolveOpenMeldServiceOwnedPathInput()
266
266
  });
267
267
  return await readDaemonServiceLifecycleLockMeta();
268
268
  }
@@ -646,4 +646,4 @@ async function pathExists(path) {
646
646
  //#endregion
647
647
  export { installDaemon as A, rotateDaemonControlPlaneTokenIfExpired as B, daemonServiceStableExecutableWrapperPath as C, ensureDaemonControlPlaneToken as D, daemonStatePath as E, readDaemonServiceRuntimeSnapshot as F, withDaemonServiceRunLock as G, uninstallDaemon as H, releaseDaemonServiceLifecycleLock as I, withDaemonServiceStopLock as K, resolveDaemonControlPlaneEndpoint as L, readDaemonControlPlaneToken as M, readDaemonServiceLifecycleLockMeta as N, getDaemonRuntimeStatus as O, readDaemonServiceLifecycleLockMetaWithCleanup as P, resolveDaemonServiceRuntimeMetadata as R, daemonServiceStableBinaryExecutablePath as S, daemonServiceUpdateWorkerBinaryExecutablePath as T, withDaemonServiceReconcileLock as U, setDaemonServiceRuntimeState as V, withDaemonServiceRegistrationMutationLock as W, daemonServiceActiveBundleStatePath as _, DAEMON_SERVICE_RUNTIME_MODE_ENV as a, daemonServiceRecognizedExecutablePaths as b, acquireDaemonServiceLifecycleLock as c, daemonLifecycleJournalPath as d, daemonRuntimeBundlesPath as f, daemonRuntimeStateRootPath as g, daemonRuntimeServiceManagerPath as h, DAEMON_SERVICE_RUNTIME_DETACHED_ENV as i, isDaemonServiceRuntimeHeartbeatStale as j, getDaemonStatus as k, clearDaemonServiceRuntimeState as l, daemonRuntimeRootPath as m, DAEMON_SERVICE_RUNTIME_AUTO_START_ENV as n, DAEMON_SERVICE_RUNTIME_STATE_SCHEMA as o, daemonRuntimeDataPath as p, DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV as r, DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV as s, DAEMON_HEARTBEAT_STALE_MS as t, daemonDispatchJournalPath as u, daemonServiceExecutableWrapperPaths as v, daemonServiceStableLauncherPath as w, daemonServiceRepairJournalPath as x, daemonServiceLegacyExecutableWrapperPath as y, restoreDaemonInstallStateSnapshot as z };
648
648
 
649
- //# sourceMappingURL=daemon-state-C_KmI_0F.js.map
649
+ //# sourceMappingURL=daemon-state-DRo7-Vjz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-state-DRo7-Vjz.js","names":[],"sources":["../src/config/daemon-state.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n acquireLock,\n type OpenMeldLock,\n readLockMeta,\n releaseLock,\n runWithHeldLock,\n tryCleanupStaleLock,\n} from \"./lock\";\nimport type { OpenMeldEnvPreset, OpenMeldPathResolutionInput } from \"./paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n resolveOpenMeldServiceOwnedPathInput,\n runtimeDir,\n systemDir,\n} from \"./paths\";\n\nconst DAEMON_STATE_SCHEMA = \"openmeld-daemon-install-v1\";\nexport const DAEMON_SERVICE_RUNTIME_STATE_SCHEMA =\n \"openmeld-daemon-service-state-v1\";\nexport const DAEMON_SERVICE_RUNTIME_MODE_ENV = \"OPENMELD_DAEMON_RUNTIME_MODE\";\nexport const DAEMON_SERVICE_RUNTIME_DETACHED_ENV =\n \"OPENMELD_DAEMON_RUNTIME_DETACHED\";\nexport const DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV =\n \"OPENMELD_DAEMON_SERVICE_CONTROLLER\";\nexport const DAEMON_SERVICE_RUNTIME_AUTO_START_ENV =\n \"OPENMELD_DAEMON_SERVICE_AUTO_START\";\nexport const DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV =\n \"OPENMELD_DAEMON_RUNTIME_SYSTEM_SERVICE\";\nconst DAEMON_TOKEN_SCHEMA = \"openmeld-daemon-token-v1\";\nconst DAEMON_TOKEN_ROTATE_MAX_AGE_MS = 24 * 60 * 60 * 1000;\nexport const DAEMON_HEARTBEAT_STALE_MS = 3 * 60 * 1000;\nconst DAEMON_ACTIVE_BUNDLE_STATE_FILENAME = \"active-bundle.json\";\nconst DAEMON_DISPATCH_JOURNAL_FILENAME = \"daemon-dispatch-journal.jsonl\";\nconst DAEMON_LIFECYCLE_JOURNAL_FILENAME = \"daemon-lifecycle-journal.jsonl\";\nconst DAEMON_REPAIR_JOURNAL_FILENAME = \"repair-journal.json\";\nconst DAEMON_SERVICE_LOCK_PROFILE = \"daemon-service\";\nconst DAEMON_SERVICE_LOCK_KEY = \"daemon-service-run\";\ntype DaemonServiceLifecycleLockContext = {\n active: boolean;\n failures: unknown[];\n ownerRoot: string;\n pendingOperations: Set<Promise<void>>;\n};\nconst daemonServiceLifecycleLockContext =\n new AsyncLocalStorage<DaemonServiceLifecycleLockContext>();\nconst DAEMON_STABLE_LAUNCHER_FILENAME = \"daemon-service-launcher.mjs\";\nconst DAEMON_SERVICE_EXECUTABLE_WRAPPER_FILENAME_BY_PRESET = {\n prod: \"OpenMeld Service\",\n \"dev-local\": \"OpenMeld Service Dev\",\n canary: \"OpenMeld Service Canary\",\n} as const satisfies Record<OpenMeldEnvPreset, string>;\nconst DAEMON_SERVICE_BINARY_EXECUTABLE_FILENAME_BY_PRESET = {\n prod: \"OpenMeld Service Binary\",\n \"dev-local\": \"OpenMeld Service Binary Dev\",\n canary: \"OpenMeld Service Binary Canary\",\n} as const satisfies Record<OpenMeldEnvPreset, string>;\nconst DAEMON_SERVICE_UPDATE_WORKER_BINARY_FILENAME_BY_PRESET = {\n prod: \"OpenMeld Update Worker Binary\",\n \"dev-local\": \"OpenMeld Update Worker Binary Dev\",\n canary: \"OpenMeld Update Worker Binary Canary\",\n} as const satisfies Record<OpenMeldEnvPreset, string>;\nconst DAEMON_SERVICE_LEGACY_EXECUTABLE_WRAPPER_FILENAME_BY_PRESET = {\n prod: \"openmeld-service\",\n \"dev-local\": \"openmeld-dev-service\",\n canary: \"openmeld-canary-service\",\n} as const satisfies Record<OpenMeldEnvPreset, string>;\nexport const DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE =\n DAEMON_SERVICE_LOCK_PROFILE;\nexport const DAEMON_SERVICE_LIFECYCLE_LOCK_KEY = DAEMON_SERVICE_LOCK_KEY;\nexport type DaemonServiceLifecycleLock = OpenMeldLock;\n\nexport type DaemonLifecycleIntent =\n | \"run_background\"\n | \"run_foreground\"\n | \"stop\"\n | \"autostart\"\n | \"status_cleanup\"\n | \"startup_check\"\n | \"start\"\n | \"reinstall\"\n | \"uninstall\"\n | \"upgrade_reconcile\";\n\nexport type DaemonLifecycleLockMeta = {\n intent: DaemonLifecycleIntent;\n command: string;\n pid?: number;\n sessionId?: string;\n at?: string;\n};\n\nexport type DaemonInstallSource = \"cli.auto_check\" | \"daemon.command.install\";\nexport type DaemonRunMode = \"foreground\" | \"background\";\nexport type DaemonServiceController =\n | \"launchd\"\n | \"systemd\"\n | \"windows-service\"\n | \"legacy-detached\"\n | \"unknown\";\n\ntype BaseDaemonServiceRuntimeState = {\n mode: DaemonRunMode;\n command: string;\n gatewayUrl: string | null;\n openMeldProfileId: string | null;\n stopRequestedAt: string | null;\n startedAt: string;\n updatedAt: string;\n heartbeatAt: string | null;\n managedBySystemService: boolean;\n serviceController: DaemonServiceController;\n autoStart: boolean;\n};\n\nexport type DaemonServiceRuntimeState = BaseDaemonServiceRuntimeState & {\n v: 1;\n schema: typeof DAEMON_SERVICE_RUNTIME_STATE_SCHEMA;\n status: \"running\";\n pid: number;\n};\n\nexport type DaemonServiceRuntimeStatus = {\n status: \"running\" | \"stale\" | \"not_running\" | \"unknown\";\n mode: DaemonRunMode | null;\n pid: number | null;\n startedAt: string | null;\n updatedAt: string | null;\n managedBySystemService: boolean;\n serviceController: DaemonServiceRuntimeState[\"serviceController\"];\n autoStart: boolean;\n reason?: string;\n};\n\nexport type DaemonServiceRuntimeMetadataInput = {\n managedBySystemService?: boolean;\n serviceController?: string;\n autoStart?: boolean;\n env?: NodeJS.ProcessEnv;\n};\n\nexport type DaemonServiceRuntimeMetadata = {\n managedBySystemService: boolean;\n serviceController: DaemonServiceController;\n autoStart: boolean;\n};\n\nexport type DaemonInstallState = {\n v: 1;\n schema: typeof DAEMON_STATE_SCHEMA;\n daemonVersion: string;\n installSource: DaemonInstallSource;\n installedAt: string;\n updatedAt: string;\n};\n\nexport type DaemonTokenState = {\n v: 1;\n schema: typeof DAEMON_TOKEN_SCHEMA;\n token: string;\n issuedAt: string;\n updatedAt: string;\n};\n\nexport type DaemonInstallResult = {\n status: \"installed\" | \"already_installed\";\n state: DaemonInstallState;\n};\n\nexport type DaemonUninstallResult = {\n removed: boolean;\n};\n\nexport type DaemonStatus =\n | {\n installed: true;\n state: DaemonInstallState;\n }\n | {\n installed: false;\n state: null;\n };\n\nexport async function getDaemonStatus(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonStatus> {\n const [state, runtimeExists] = await Promise.all([\n readDaemonInstallState(pathInput),\n pathExists(daemonRuntimeRootPath(pathInput)),\n ]);\n if (state && runtimeExists) {\n return {\n installed: true,\n state,\n };\n }\n return {\n installed: false,\n state: null,\n };\n}\n\nexport async function getDaemonRuntimeStatus(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceRuntimeStatus> {\n const state = await readDaemonServiceRuntimeState(pathInput);\n if (!state) {\n return {\n status: \"not_running\",\n mode: null,\n pid: null,\n startedAt: null,\n updatedAt: null,\n managedBySystemService: false,\n serviceController: \"unknown\",\n autoStart: false,\n };\n }\n if (!Number.isInteger(state.pid) || state.pid <= 0) {\n return {\n status: \"stale\",\n mode: state.mode,\n pid: state.pid,\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n managedBySystemService: state.managedBySystemService,\n serviceController: state.serviceController,\n autoStart: state.autoStart,\n reason: \"invalid_pid\",\n };\n }\n if (!isPidAlive(state.pid)) {\n return {\n status: \"stale\",\n mode: state.mode,\n pid: state.pid,\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n managedBySystemService: state.managedBySystemService,\n serviceController: state.serviceController,\n autoStart: state.autoStart,\n reason: \"process_not_alive\",\n };\n }\n if (isDaemonServiceRuntimeHeartbeatStale(state)) {\n return {\n status: \"stale\",\n mode: state.mode,\n pid: state.pid,\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n managedBySystemService: state.managedBySystemService,\n serviceController: state.serviceController,\n autoStart: state.autoStart,\n reason: \"heartbeat_stale\",\n };\n }\n return {\n status: \"running\",\n mode: state.mode,\n pid: state.pid,\n startedAt: state.startedAt,\n updatedAt: state.updatedAt,\n managedBySystemService: state.managedBySystemService,\n serviceController: state.serviceController,\n autoStart: state.autoStart,\n };\n}\n\nexport async function readDaemonServiceRuntimeSnapshot(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceRuntimeState | null> {\n return await readDaemonServiceRuntimeState(pathInput);\n}\n\nexport function resolveDaemonServiceRuntimeMetadata(\n input: DaemonServiceRuntimeMetadataInput = {}\n): DaemonServiceRuntimeMetadata {\n const env = input.env ?? process.env;\n const managedBySystemService =\n input.managedBySystemService === true ||\n env[DAEMON_SERVICE_RUNTIME_SYSTEM_SERVICE_ENV] === \"1\";\n const serviceControllerInput =\n typeof input.serviceController === \"string\" &&\n input.serviceController.length > 0\n ? input.serviceController\n : env[DAEMON_SERVICE_RUNTIME_CONTROLLER_ENV];\n const autoStart =\n input.autoStart === true ||\n env[DAEMON_SERVICE_RUNTIME_AUTO_START_ENV] === \"1\";\n\n return {\n managedBySystemService,\n serviceController: parseDaemonServiceController(serviceControllerInput),\n autoStart,\n };\n}\n\nexport async function setDaemonServiceRuntimeState(\n state: DaemonServiceRuntimeState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await writeDaemonServiceRuntimeState(state, pathInput);\n}\n\nexport async function clearDaemonServiceRuntimeState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const { clearDaemonRuntimeLease } = await import(\"./daemon-runtime-lease\");\n await Promise.all([\n rm(daemonServiceRuntimeStatePath(pathInput), { force: true }),\n clearDaemonRuntimeLease(pathInput),\n ]);\n}\n\nexport function withDaemonServiceRunLock<T>(\n callback: () => Promise<T>,\n meta: DaemonLifecycleLockMeta = {\n intent: \"run_background\",\n command: \"openmeld service start\",\n }\n): Promise<T> {\n return withDaemonServiceLifecycleLock(meta, callback);\n}\n\nexport async function acquireDaemonServiceLifecycleLock(\n meta: DaemonLifecycleLockMeta = {\n intent: \"run_background\",\n command: \"openmeld service start\",\n },\n pathResolution: OpenMeldPathResolutionInput = resolveOpenMeldServiceOwnedPathInput()\n): Promise<DaemonServiceLifecycleLock> {\n return await acquireLock({\n openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,\n key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,\n meta,\n pathResolution,\n });\n}\n\nexport async function releaseDaemonServiceLifecycleLock(\n lock: DaemonServiceLifecycleLock\n): Promise<void> {\n await releaseLock(lock);\n}\n\nexport function withDaemonServiceStopLock<T>(\n callback: () => Promise<T>,\n meta: DaemonLifecycleLockMeta = {\n intent: \"stop\",\n command: \"openmeld service stop\",\n }\n): Promise<T> {\n return withDaemonServiceLifecycleLock(meta, callback);\n}\n\nexport function withDaemonServiceReconcileLock<T>(\n callback: () => Promise<T>,\n meta: DaemonLifecycleLockMeta = {\n intent: \"upgrade_reconcile\",\n command: \"openmeld service update\",\n }\n): Promise<T> {\n return withDaemonServiceLifecycleLock(meta, callback);\n}\n\nexport function withDaemonServiceRegistrationMutationLock<T>(\n callback: () => Promise<T>,\n meta: DaemonLifecycleLockMeta\n): Promise<T> {\n return withDaemonServiceLifecycleLock(meta, callback);\n}\n\nexport function withDaemonServiceLifecycleLock<T>(\n meta: DaemonLifecycleLockMeta,\n callback: () => Promise<T>\n): Promise<T> {\n const pathResolution = resolveOpenMeldServiceOwnedPathInput();\n const ownerRoot = resolveOpenMeldRootDir(pathResolution);\n const currentContext = daemonServiceLifecycleLockContext.getStore();\n if (currentContext?.active && currentContext.ownerRoot === ownerRoot) {\n let operation: Promise<T>;\n try {\n operation = callback();\n } catch (error) {\n operation = Promise.reject(error);\n }\n let trackedOperation: Promise<void>;\n trackedOperation = operation\n .then(\n () => undefined,\n (error: unknown) => {\n currentContext.failures.push(error);\n }\n )\n .finally(() => {\n currentContext.pendingOperations.delete(trackedOperation);\n });\n currentContext.pendingOperations.add(trackedOperation);\n return operation;\n }\n return withDaemonServiceLifecycleOwnerLock({\n callback,\n meta,\n ownerRoot,\n pathResolution,\n });\n}\n\nasync function withDaemonServiceLifecycleOwnerLock<T>(input: {\n callback: () => Promise<T>;\n meta: DaemonLifecycleLockMeta;\n ownerRoot: string;\n pathResolution: OpenMeldPathResolutionInput;\n}): Promise<T> {\n const lock = await acquireDaemonServiceLifecycleLock(\n input.meta,\n input.pathResolution\n );\n return await runWithHeldLock({\n lock,\n run: async () => {\n const context: DaemonServiceLifecycleLockContext = {\n active: true,\n failures: [],\n ownerRoot: input.ownerRoot,\n pendingOperations: new Set(),\n };\n let outcome: { ok: true; value: T } | { ok: false; error: unknown };\n try {\n outcome = {\n ok: true,\n value: await daemonServiceLifecycleLockContext.run(\n context,\n input.callback\n ),\n };\n } catch (error) {\n outcome = { ok: false, error };\n } finally {\n while (context.pendingOperations.size > 0) {\n await Promise.all([...context.pendingOperations]);\n }\n context.active = false;\n }\n const failures = [\n ...(outcome.ok ? [] : [outcome.error]),\n ...context.failures,\n ].filter(\n (failure, index, allFailures) => allFailures.indexOf(failure) === index\n );\n if (failures.length === 1) {\n throw failures[0];\n }\n if (failures.length > 1) {\n throw new AggregateError(\n failures,\n \"daemon service lifecycle mutation failed in more than one operation\"\n );\n }\n if (!outcome.ok) {\n throw outcome.error;\n }\n return outcome.value;\n },\n releaseContext: {\n command: input.meta.command,\n component: \"daemon_service_lifecycle\",\n intent: input.meta.intent,\n lockKey: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,\n openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,\n },\n });\n}\n\nexport async function readDaemonServiceLifecycleLockMeta(): Promise<DaemonLifecycleLockMeta | null> {\n const meta = await readLockMeta({\n openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,\n key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,\n pathResolution: resolveOpenMeldServiceOwnedPathInput(),\n });\n if (!meta) {\n return null;\n }\n const intent =\n typeof meta.intent === \"string\"\n ? normalizeDaemonLifecycleIntent(meta.intent)\n : null;\n const command = typeof meta.command === \"string\" ? meta.command.trim() : \"\";\n if (!intent || command.length === 0) {\n return null;\n }\n const pid = typeof meta.pid === \"number\" ? meta.pid : undefined;\n const sessionId =\n typeof meta.sessionId === \"string\" && meta.sessionId.trim().length > 0\n ? meta.sessionId.trim()\n : undefined;\n const at =\n typeof meta.at === \"string\" && meta.at.trim().length > 0\n ? meta.at.trim()\n : undefined;\n return {\n intent,\n command,\n ...(typeof pid === \"number\" ? { pid } : {}),\n ...(sessionId ? { sessionId } : {}),\n ...(at ? { at } : {}),\n };\n}\n\nexport async function readDaemonServiceLifecycleLockMetaWithCleanup(): Promise<DaemonLifecycleLockMeta | null> {\n await tryCleanupStaleLock({\n openMeldProfileId: DAEMON_SERVICE_LIFECYCLE_LOCK_PROFILE,\n key: DAEMON_SERVICE_LIFECYCLE_LOCK_KEY,\n pathResolution: resolveOpenMeldServiceOwnedPathInput(),\n });\n return await readDaemonServiceLifecycleLockMeta();\n}\n\nexport async function installDaemon(input: {\n daemonVersion: string;\n source: DaemonInstallSource;\n}): Promise<DaemonInstallResult> {\n const existingState = await readDaemonInstallState();\n const runtimeExists = await pathExists(daemonRuntimeRootPath());\n if (\n existingState &&\n runtimeExists &&\n existingState.daemonVersion === input.daemonVersion\n ) {\n await ensureDaemonTokenState();\n return {\n status: \"already_installed\",\n state: existingState,\n };\n }\n\n await ensureDaemonRuntimeLayout();\n const now = new Date().toISOString();\n const nextState: DaemonInstallState = {\n v: 1,\n schema: DAEMON_STATE_SCHEMA,\n daemonVersion: input.daemonVersion,\n installSource: input.source,\n installedAt: existingState?.installedAt ?? now,\n updatedAt: now,\n };\n await writeDaemonInstallState(nextState);\n await ensureDaemonTokenState();\n\n return {\n status: \"installed\",\n state: nextState,\n };\n}\n\nexport async function uninstallDaemon(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonUninstallResult> {\n const [hasState, hasRuntimeDir, hasToken] = await Promise.all([\n pathExists(daemonStatePath(pathInput)),\n pathExists(daemonRuntimeRootPath(pathInput)),\n pathExists(daemonTokenPath(pathInput)),\n ]);\n\n await Promise.all([\n rm(daemonStatePath(pathInput), { force: true }),\n rm(daemonTokenPath(pathInput), { force: true }),\n rm(daemonServiceRuntimeStatePath(pathInput), { force: true }),\n rm(daemonRuntimeRootPath(pathInput), { recursive: true, force: true }),\n ]);\n\n return {\n removed: hasState || hasRuntimeDir || hasToken,\n };\n}\n\nexport function daemonStatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(systemDir(pathInput), \"daemon-install.json\");\n}\n\nexport function daemonRuntimeRootPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(runtimeDir(pathInput), \"daemon\");\n}\n\nexport function daemonServiceRuntimeStatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-runtime.json\");\n}\n\nexport function daemonRuntimeDataPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"data\");\n}\n\nexport function daemonRuntimeBundlesPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"bundles\");\n}\n\nexport function daemonRuntimeStateRootPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"state\");\n}\n\nexport function daemonLifecycleJournalPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n DAEMON_LIFECYCLE_JOURNAL_FILENAME\n );\n}\n\nexport function daemonDispatchJournalPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n DAEMON_DISPATCH_JOURNAL_FILENAME\n );\n}\n\nexport function daemonServiceActiveBundleStatePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_ACTIVE_BUNDLE_STATE_FILENAME\n );\n}\n\nexport function daemonServiceRepairJournalPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeStateRootPath(pathInput),\n DAEMON_REPAIR_JOURNAL_FILENAME\n );\n}\n\nexport function daemonRuntimeServiceManagerPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(daemonRuntimeRootPath(pathInput), \"service-manager\");\n}\n\nexport function daemonServiceStableLauncherPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeServiceManagerPath(pathInput),\n DAEMON_STABLE_LAUNCHER_FILENAME\n );\n}\n\nexport function daemonServiceStableExecutableWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n return join(\n daemonRuntimeServiceManagerPath(pathInput),\n DAEMON_SERVICE_EXECUTABLE_WRAPPER_FILENAME_BY_PRESET[preset]\n );\n}\n\nexport function daemonServiceStableBinaryExecutablePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n return join(\n daemonRuntimeServiceManagerPath(pathInput),\n DAEMON_SERVICE_BINARY_EXECUTABLE_FILENAME_BY_PRESET[preset]\n );\n}\n\nexport function daemonServiceUpdateWorkerBinaryExecutablePath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n return join(\n daemonRuntimeServiceManagerPath(pathInput),\n DAEMON_SERVICE_UPDATE_WORKER_BINARY_FILENAME_BY_PRESET[preset]\n );\n}\n\nexport function daemonServiceLegacyExecutableWrapperPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const preset = resolveOpenMeldEnvPreset(pathInput);\n return join(\n daemonRuntimeServiceManagerPath(pathInput),\n DAEMON_SERVICE_LEGACY_EXECUTABLE_WRAPPER_FILENAME_BY_PRESET[preset]\n );\n}\n\nexport function daemonServiceExecutableWrapperPaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return [\n daemonServiceStableExecutableWrapperPath(pathInput),\n daemonServiceLegacyExecutableWrapperPath(pathInput),\n ];\n}\n\nexport function daemonServiceRecognizedExecutablePaths(\n pathInput: OpenMeldPathResolutionInput = {}\n): string[] {\n return [\n daemonServiceStableBinaryExecutablePath(pathInput),\n ...daemonServiceExecutableWrapperPaths(pathInput),\n ];\n}\n\nexport function daemonTokenPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(systemDir(pathInput), \"daemon-token.json\");\n}\n\nexport async function restoreDaemonInstallStateSnapshot(\n snapshot: DaemonInstallState | null,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n if (!snapshot) {\n await rm(daemonStatePath(pathInput), { force: true });\n return;\n }\n await writeDaemonInstallState(snapshot, pathInput);\n}\n\nexport function resolveDaemonControlPlaneEndpoint(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const runtimeRoot = daemonRuntimeRootPath(pathInput);\n const suffix = createHash(\"sha256\")\n .update(runtimeRoot)\n .digest(\"hex\")\n .slice(0, 24);\n if (process.platform === \"win32\") {\n return `\\\\\\\\.\\\\pipe\\\\openmeld-daemon-control-${suffix}`;\n }\n return join(tmpdir(), `openmeld-daemon-control-${suffix}.sock`);\n}\n\nexport async function ensureDaemonControlPlaneToken(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string> {\n const state = await ensureDaemonTokenState(pathInput);\n return state.token;\n}\n\nexport async function rotateDaemonControlPlaneTokenIfExpired(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonTokenState> {\n const current = await readDaemonTokenState(pathInput);\n if (current && !isDaemonTokenExpired(current)) {\n await chmod(daemonTokenPath(pathInput), 0o600).catch(() => undefined);\n return current;\n }\n\n return await writeNewDaemonTokenState(pathInput);\n}\n\nexport async function readDaemonControlPlaneToken(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<string | null> {\n const state = await readDaemonTokenState(pathInput);\n return state?.token ?? null;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !(\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ESRCH\"\n );\n }\n}\n\nasync function readDaemonServiceRuntimeState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceRuntimeState | null> {\n const raw = await readFile(\n daemonServiceRuntimeStatePath(pathInput),\n \"utf8\"\n ).catch((error) => {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return null;\n }\n return parseDaemonServiceRuntimeState(raw);\n}\n\nfunction parseDaemonServiceRuntimeState(\n raw: string\n): DaemonServiceRuntimeState | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isDaemonServiceRuntimeStateObject(parsed)) {\n return null;\n }\n\n return {\n v: 1,\n schema: DAEMON_SERVICE_RUNTIME_STATE_SCHEMA,\n status: \"running\",\n pid: parsed.pid,\n mode: parsed.mode,\n command: parsed.command,\n gatewayUrl: parseNullableString(parsed.gatewayUrl),\n openMeldProfileId: resolveStoredDaemonServiceOpenMeldProfileId(parsed),\n stopRequestedAt: parseNullableString(parsed.stopRequestedAt),\n heartbeatAt: parseNullableString(parsed.heartbeatAt),\n startedAt: parsed.startedAt,\n updatedAt: parsed.updatedAt,\n managedBySystemService: parsed.managedBySystemService === true,\n serviceController: parseDaemonServiceController(parsed.serviceController),\n autoStart: parsed.autoStart === true,\n };\n } catch {\n return null;\n }\n}\n\nfunction isDaemonServiceRuntimeStateObject(value: unknown): value is {\n v: 1;\n schema: string;\n status: \"running\";\n pid: number;\n mode: DaemonRunMode;\n command: string;\n gatewayUrl: string | null;\n openMeldProfileId?: string | null;\n profile?: string | null;\n stopRequestedAt: string | null;\n heartbeatAt: string | null;\n startedAt: string;\n updatedAt: string;\n managedBySystemService?: boolean;\n serviceController?: string;\n autoStart?: boolean;\n} {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n candidate.v === 1 &&\n candidate.schema === DAEMON_SERVICE_RUNTIME_STATE_SCHEMA &&\n candidate.status === \"running\" &&\n typeof candidate.pid === \"number\" &&\n candidate.pid > 0 &&\n (candidate.mode === \"foreground\" || candidate.mode === \"background\") &&\n typeof candidate.command === \"string\" &&\n candidate.command.length > 0 &&\n isValidNullableString(candidate.gatewayUrl) &&\n isValidOptionalNullableString(candidate.openMeldProfileId) &&\n isValidOptionalNullableString(candidate.profile) &&\n isValidNullableString(candidate.stopRequestedAt) &&\n isValidNullableString(candidate.heartbeatAt) &&\n typeof candidate.startedAt === \"string\" &&\n candidate.startedAt.length > 0 &&\n typeof candidate.updatedAt === \"string\" &&\n candidate.updatedAt.length > 0\n );\n}\n\nexport function parseDaemonServiceController(\n value: unknown\n): DaemonServiceController {\n if (\n value === \"launchd\" ||\n value === \"systemd\" ||\n value === \"windows-service\" ||\n value === \"legacy-detached\" ||\n value === \"unknown\"\n ) {\n return value;\n }\n return \"unknown\";\n}\n\nfunction isValidNullableString(value: unknown): value is string | null {\n return value === null || typeof value === \"string\";\n}\n\nfunction isValidOptionalNullableString(\n value: unknown\n): value is string | null | undefined {\n return value === undefined || value === null || typeof value === \"string\";\n}\n\nfunction parseNullableString(value: unknown): string | null {\n if (value === null) {\n return null;\n }\n if (typeof value !== \"string\") {\n return null;\n }\n return value;\n}\n\nfunction resolveStoredDaemonServiceOpenMeldProfileId(input: {\n openMeldProfileId?: unknown;\n profile?: unknown;\n}): string | null {\n const openMeldProfileId = parseNullableString(input.openMeldProfileId);\n const legacyProfile = parseNullableString(input.profile);\n if (\n openMeldProfileId &&\n legacyProfile &&\n openMeldProfileId !== legacyProfile\n ) {\n throw new Error(\"conflicting openMeldProfileId values\");\n }\n return openMeldProfileId ?? legacyProfile;\n}\n\nexport function isDaemonServiceRuntimeHeartbeatStale(\n state: DaemonServiceRuntimeState\n): boolean {\n const latestSignalAt = Math.max(\n parseIsoTimestampOrZero(state.heartbeatAt),\n parseIsoTimestampOrZero(state.updatedAt)\n );\n if (latestSignalAt <= 0) {\n return false;\n }\n return Date.now() - latestSignalAt > DAEMON_HEARTBEAT_STALE_MS;\n}\n\nfunction parseIsoTimestampOrZero(value: string | null): number {\n if (!value) {\n return 0;\n }\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nasync function writeDaemonServiceRuntimeState(\n state: DaemonServiceRuntimeState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const path = daemonServiceRuntimeStatePath(pathInput);\n const runtimeRootPath = daemonRuntimeRootPath(pathInput);\n await mkdir(runtimeRootPath, { recursive: true });\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n let shouldCleanupTemp = true;\n\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 await chmod(path, 0o600);\n shouldCleanupTemp = false;\n } finally {\n if (shouldCleanupTemp) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nasync function ensureDaemonRuntimeLayout(): Promise<void> {\n await Promise.all([\n mkdir(systemDir(), { recursive: true }),\n mkdir(join(daemonRuntimeRootPath(), \"bin\"), { recursive: true }),\n mkdir(daemonRuntimeBundlesPath(), { recursive: true }),\n mkdir(join(daemonRuntimeRootPath(), \"data\"), { recursive: true }),\n mkdir(join(daemonRuntimeRootPath(), \"logs\"), { recursive: true }),\n mkdir(daemonRuntimeStateRootPath(), { recursive: true }),\n mkdir(daemonRuntimeServiceManagerPath(), { recursive: true }),\n ]);\n}\n\nfunction normalizeDaemonLifecycleIntent(\n value: string\n): DaemonLifecycleIntent | null {\n switch (value) {\n case \"run_background\":\n case \"run_foreground\":\n case \"stop\":\n case \"autostart\":\n case \"status_cleanup\":\n case \"startup_check\":\n case \"start\":\n case \"reinstall\":\n case \"uninstall\":\n case \"upgrade_reconcile\":\n return value;\n default:\n return null;\n }\n}\n\nasync function ensureDaemonTokenState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonTokenState> {\n const current = await readDaemonTokenState(pathInput);\n if (current) {\n await chmod(daemonTokenPath(pathInput), 0o600).catch(() => undefined);\n return current;\n }\n\n return await writeNewDaemonTokenState(pathInput);\n}\n\nasync function writeNewDaemonTokenState(\n pathInput: OpenMeldPathResolutionInput\n): Promise<DaemonTokenState> {\n const nowIso = new Date().toISOString();\n const next: DaemonTokenState = {\n v: 1,\n schema: DAEMON_TOKEN_SCHEMA,\n token: createDaemonTokenValue(),\n issuedAt: nowIso,\n updatedAt: nowIso,\n };\n await writeDaemonTokenState(next, pathInput);\n return next;\n}\n\nasync function readDaemonInstallState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonInstallState | null> {\n const raw = await readFile(daemonStatePath(pathInput), \"utf8\").catch(\n (error) => {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return null;\n }\n throw error;\n }\n );\n if (raw === null) {\n return null;\n }\n return parseDaemonInstallState(raw);\n}\n\nfunction parseDaemonInstallState(raw: string): DaemonInstallState | null {\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonInstallState>;\n if (parsed.v !== 1) {\n return null;\n }\n if (parsed.schema !== DAEMON_STATE_SCHEMA) {\n return null;\n }\n if (typeof parsed.daemonVersion !== \"string\" || !parsed.daemonVersion) {\n return null;\n }\n if (!isDaemonInstallSource(parsed.installSource)) {\n return null;\n }\n if (typeof parsed.installedAt !== \"string\" || !parsed.installedAt) {\n return null;\n }\n if (typeof parsed.updatedAt !== \"string\" || !parsed.updatedAt) {\n return null;\n }\n return {\n v: 1,\n schema: DAEMON_STATE_SCHEMA,\n daemonVersion: parsed.daemonVersion,\n installSource: parsed.installSource,\n installedAt: parsed.installedAt,\n updatedAt: parsed.updatedAt,\n };\n } catch {\n return null;\n }\n}\n\nfunction isDaemonInstallSource(value: unknown): value is DaemonInstallSource {\n return value === \"cli.auto_check\" || value === \"daemon.command.install\";\n}\n\nasync function writeDaemonInstallState(\n state: DaemonInstallState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const path = daemonStatePath(pathInput);\n await mkdir(systemDir(pathInput), { recursive: true });\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n let shouldCleanupTemp = true;\n\n try {\n await writeFile(tempPath, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\n await rename(tempPath, path);\n shouldCleanupTemp = false;\n } finally {\n if (shouldCleanupTemp) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nasync function readDaemonTokenState(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonTokenState | null> {\n const raw = await readFile(daemonTokenPath(pathInput), \"utf8\").catch(\n (error) => {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return null;\n }\n throw error;\n }\n );\n if (raw === null) {\n return null;\n }\n return parseDaemonTokenState(raw);\n}\n\nfunction parseDaemonTokenState(raw: string): DaemonTokenState | null {\n try {\n const parsed = JSON.parse(raw) as Partial<DaemonTokenState>;\n if (parsed.v !== 1 || parsed.schema !== DAEMON_TOKEN_SCHEMA) {\n return null;\n }\n if (typeof parsed.token !== \"string\" || parsed.token.length < 16) {\n return null;\n }\n if (typeof parsed.issuedAt !== \"string\" || !parsed.issuedAt) {\n return null;\n }\n if (typeof parsed.updatedAt !== \"string\" || !parsed.updatedAt) {\n return null;\n }\n return {\n v: 1,\n schema: DAEMON_TOKEN_SCHEMA,\n token: parsed.token,\n issuedAt: parsed.issuedAt,\n updatedAt: parsed.updatedAt,\n };\n } catch {\n return null;\n }\n}\n\nasync function writeDaemonTokenState(\n state: DaemonTokenState,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n const path = daemonTokenPath(pathInput);\n await mkdir(systemDir(pathInput), { recursive: true });\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n let shouldCleanupTemp = true;\n\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 await chmod(path, 0o600);\n shouldCleanupTemp = false;\n } finally {\n if (shouldCleanupTemp) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nfunction isDaemonTokenExpired(state: DaemonTokenState): boolean {\n const updatedAtMs = Date.parse(state.updatedAt);\n if (!Number.isFinite(updatedAtMs)) {\n return true;\n }\n return Date.now() - updatedAtMs >= DAEMON_TOKEN_ROTATE_MAX_AGE_MS;\n}\n\nfunction createDaemonTokenValue(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n}\n"],"mappings":"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"}