openmeld 0.3.206 → 0.3.207

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 (86) hide show
  1. package/dist/{add-me-membership-BkHWMxE4.js → add-me-membership-1JHMjZoR.js} +2 -2
  2. package/dist/{add-me-membership-BkHWMxE4.js.map → add-me-membership-1JHMjZoR.js.map} +1 -1
  3. package/dist/{agents-BOTlKiwS.js → agents-CIDsThyG.js} +150 -108
  4. package/dist/agents-CIDsThyG.js.map +1 -0
  5. package/dist/{api-client-foundation-6ms5gSu8.js → api-client-foundation-D6_NXHPV.js} +1 -1
  6. package/dist/{api-client-foundation-DpgDs0rw.js → api-client-foundation-DSurenul.js} +3 -3
  7. package/dist/{api-client-foundation-DpgDs0rw.js.map → api-client-foundation-DSurenul.js.map} +1 -1
  8. package/dist/auth-session-B7QMhHwh.js +4 -0
  9. package/dist/{auth-session-BjSqMLTz.js → auth-session-CO5XtFaq.js} +266 -75
  10. package/dist/auth-session-CO5XtFaq.js.map +1 -0
  11. package/dist/{base-url-CRAYNW-4.js → base-url-BE3pFiOZ.js} +1 -1
  12. package/dist/{base-url-9A557X2K.js → base-url-C6sHRNGu.js} +2 -2
  13. package/dist/{base-url-9A557X2K.js.map → base-url-C6sHRNGu.js.map} +1 -1
  14. package/dist/cli-binary-manifest-DiUulkp0.js +117 -0
  15. package/dist/cli-binary-manifest-DiUulkp0.js.map +1 -0
  16. package/dist/{command-CkbzbvXy.js → command-Bzt9zgnI.js} +13 -11
  17. package/dist/{command-CkbzbvXy.js.map → command-Bzt9zgnI.js.map} +1 -1
  18. package/dist/computer-connection-BOl79Ftf.js +54 -0
  19. package/dist/computer-connection-BOl79Ftf.js.map +1 -0
  20. package/dist/computer-connection-review-BTOvbJYL.js +39 -0
  21. package/dist/computer-connection-review-BTOvbJYL.js.map +1 -0
  22. package/dist/{computer-setup-continuation-Cd9nhLQ-.js → computer-setup-continuation-DmKdhR5u.js} +4 -4
  23. package/dist/{computer-setup-continuation-Cd9nhLQ-.js.map → computer-setup-continuation-DmKdhR5u.js.map} +1 -1
  24. package/dist/control-plane-D9jDcbMZ.js +1211 -0
  25. package/dist/control-plane-D9jDcbMZ.js.map +1 -0
  26. package/dist/daemon-local-state-file-jOXuXrky.js +45 -0
  27. package/dist/daemon-local-state-file-jOXuXrky.js.map +1 -0
  28. package/dist/daemon-runtime-lease-Dd4hdHNo.js +50 -0
  29. package/dist/daemon-runtime-lease-Dd4hdHNo.js.map +1 -0
  30. package/dist/{daemon-runtime-lease-BG9g0a6Z.js → daemon-runtime-lease-y3n1K0-C.js} +1 -1
  31. package/dist/{daemon-service-manager-DqVtRLBY.js → daemon-service-manager-Bh0LoLed.js} +1 -1
  32. package/dist/{daemon-service-manager-BVipiZwK.js → daemon-service-manager-GiMCiTmu.js} +99 -85
  33. package/dist/daemon-service-manager-GiMCiTmu.js.map +1 -0
  34. package/dist/daemon-service-runtime-DQW9gSLT.js +3642 -0
  35. package/dist/daemon-service-runtime-DQW9gSLT.js.map +1 -0
  36. package/dist/{daemon-state-BwIoDq7_.js → daemon-state-C37ZtIZK.js} +11 -5
  37. package/dist/daemon-state-C37ZtIZK.js.map +1 -0
  38. package/dist/{dist-CxadJClH.js → dist-D-kJdWZE.js} +726 -579
  39. package/dist/dist-D-kJdWZE.js.map +1 -0
  40. package/dist/dist-DTG_Vqc7.js +4 -0
  41. package/dist/distribution-DY2fBeSW.js +72 -0
  42. package/dist/distribution-DY2fBeSW.js.map +1 -0
  43. package/dist/{elapsed-time-C7P-nWIO.js → elapsed-time-CcoM2R3N.js} +7 -4
  44. package/dist/{elapsed-time-C7P-nWIO.js.map → elapsed-time-CcoM2R3N.js.map} +1 -1
  45. package/dist/{installation-inventory-P49sTjhe.js → installation-inventory-DJlwXa1q.js} +7 -6
  46. package/dist/{installation-inventory-P49sTjhe.js.map → installation-inventory-DJlwXa1q.js.map} +1 -1
  47. package/dist/{lock-CvBnBcFK.js → lock-Dxp6o_t_.js} +56 -7
  48. package/dist/lock-Dxp6o_t_.js.map +1 -0
  49. package/dist/{openmeld-ChOHuaqH.js → openmeld-CiL4AiB0.js} +226 -21
  50. package/dist/openmeld-CiL4AiB0.js.map +1 -0
  51. package/dist/openmeld-dev.js +1 -1
  52. package/dist/openmeld-environment-target-NtJYJe1D.js +256 -0
  53. package/dist/openmeld-environment-target-NtJYJe1D.js.map +1 -0
  54. package/dist/{openmeld-maintenance-worker-C7WykyDt.js → openmeld-maintenance-worker-DjdmRASI.js} +9 -8
  55. package/dist/{openmeld-maintenance-worker-C7WykyDt.js.map → openmeld-maintenance-worker-DjdmRASI.js.map} +1 -1
  56. package/dist/{openmeld-tools-update-coordinator-BBZhGo1A.js → openmeld-tools-update-coordinator-D9Skj8IE.js} +52 -4013
  57. package/dist/openmeld-tools-update-coordinator-D9Skj8IE.js.map +1 -0
  58. package/dist/openmeld.js +3 -3
  59. package/dist/{prepare-session-executor-CLmDoHom.js → prepare-session-executor-B0NtjHEL.js} +15 -13
  60. package/dist/{prepare-session-executor-CLmDoHom.js.map → prepare-session-executor-B0NtjHEL.js.map} +1 -1
  61. package/dist/{profiles-BCecj4Pj.js → runtime-transport-QIZmAo4-.js} +936 -2127
  62. package/dist/runtime-transport-QIZmAo4-.js.map +1 -0
  63. package/dist/service-account-authorization-Dt8kGvq8.js +56 -0
  64. package/dist/service-account-authorization-Dt8kGvq8.js.map +1 -0
  65. package/dist/service-control-capabilities-BU5F75zi.js +54 -0
  66. package/dist/service-control-capabilities-BU5F75zi.js.map +1 -0
  67. package/dist/service-control-capabilities-CzUB1ovW.js +4 -0
  68. package/dist/upgrade-DLECkjMt.js +4 -0
  69. package/dist/{upgrade-l_5Tge_z.js → upgrade-NxpTydHp.js} +6 -4
  70. package/dist/upgrade-NxpTydHp.js.map +1 -0
  71. package/package.json +2 -2
  72. package/dist/agents-BOTlKiwS.js.map +0 -1
  73. package/dist/auth-session-BjSqMLTz.js.map +0 -1
  74. package/dist/auth-session-ahQ5VXiF.js +0 -4
  75. package/dist/daemon-runtime-lease-CXlGR-iA.js +0 -87
  76. package/dist/daemon-runtime-lease-CXlGR-iA.js.map +0 -1
  77. package/dist/daemon-service-manager-BVipiZwK.js.map +0 -1
  78. package/dist/daemon-state-BwIoDq7_.js.map +0 -1
  79. package/dist/dist-0boZRalP.js +0 -4
  80. package/dist/dist-CxadJClH.js.map +0 -1
  81. package/dist/lock-CvBnBcFK.js.map +0 -1
  82. package/dist/openmeld-ChOHuaqH.js.map +0 -1
  83. package/dist/openmeld-tools-update-coordinator-BBZhGo1A.js.map +0 -1
  84. package/dist/profiles-BCecj4Pj.js.map +0 -1
  85. package/dist/upgrade-BKEAZKre.js +0 -4
  86. package/dist/upgrade-l_5Tge_z.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { ft as resolveOpenMeldServiceScope, lt as resolveOpenMeldEnvPreset, ot as resolveDefaultOpenMeldHomeDirname, st as resolveExplicitOpenMeldEnvPreset, ut as resolveOpenMeldRootDir } from "./lock-CvBnBcFK.js";
3
+ import { ct as resolveDefaultOpenMeldHomeDirname, dt as resolveOpenMeldEnvPreset, ft as resolveOpenMeldRootDir, lt as resolveExplicitOpenMeldEnvPreset, mt as resolveOpenMeldServiceScope, n as attachLockProcess, s as releaseLock } from "./lock-Dxp6o_t_.js";
4
4
  import { i as windowsTaskActionArguments, n as runWindowsUserTask, r as windowsPowerShellPath, t as readWindowsTaskAction } from "./windows-user-task-DqJWtlAm.js";
5
+ import { h as daemonRuntimeRootPath, u as currentDaemonServiceLifecycleLock } from "./daemon-state-C37ZtIZK.js";
5
6
  import { t as sleep } from "./dist-o3UL1EGQ.js";
6
- import { m as daemonRuntimeRootPath } from "./daemon-state-BwIoDq7_.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";
@@ -94,6 +94,68 @@ function resolveDaemonServiceIdentity(input = {}) {
94
94
  } : identity;
95
95
  }
96
96
  //#endregion
97
+ //#region src/local-service/lifecycle/native-command.ts
98
+ const EXEC_HANDSHAKE = "IFS= read -r grant && [ \"$grant\" = \"execute\" ] || exit 125; exec \"$@\"";
99
+ async function runNativeServiceCommand(input) {
100
+ const lock = currentDaemonServiceLifecycleLock();
101
+ const attached = lock !== null && process.platform !== "win32";
102
+ const child = spawn(attached ? "/bin/sh" : input.command, attached ? [
103
+ "-c",
104
+ EXEC_HANDSHAKE,
105
+ "openmeld-native-command",
106
+ input.command,
107
+ ...input.args
108
+ ] : input.args, {
109
+ stdio: [
110
+ attached ? "pipe" : "ignore",
111
+ "pipe",
112
+ "pipe"
113
+ ],
114
+ env: input.env ?? process.env,
115
+ windowsHide: true
116
+ });
117
+ let stdout = "";
118
+ let stderr = "";
119
+ let spawnError;
120
+ child.stdout?.on("data", (chunk) => {
121
+ stdout += chunk.toString();
122
+ });
123
+ child.stderr?.on("data", (chunk) => {
124
+ stderr += chunk.toString();
125
+ });
126
+ child.on("error", (error) => {
127
+ spawnError = error;
128
+ });
129
+ child.stdin?.on("error", () => void 0);
130
+ const completion = new Promise((resolve) => {
131
+ child.once("close", (code) => resolve(code ?? 1));
132
+ });
133
+ let participant;
134
+ try {
135
+ if (attached) {
136
+ if (!child.pid) throw new Error("Native command did not establish a process.");
137
+ participant = await attachLockProcess(lock, child.pid);
138
+ child.stdin?.end("execute\n");
139
+ }
140
+ const exitCode = await completion;
141
+ if (input.throwOnError && (spawnError || exitCode !== 0)) throw spawnError ?? new Error([
142
+ `command failed: ${input.command} ${input.args.join(" ")}`,
143
+ stdout.trim(),
144
+ stderr.trim()
145
+ ].filter(Boolean).join(" | "));
146
+ return {
147
+ exitCode,
148
+ stdout,
149
+ stderr: `${stderr}${spawnError ? String(spawnError) : ""}`
150
+ };
151
+ } finally {
152
+ child.stdin?.destroy();
153
+ if (child.exitCode === null && child.signalCode === null) child.kill();
154
+ await completion;
155
+ if (participant) await releaseLock(participant);
156
+ }
157
+ }
158
+ //#endregion
97
159
  //#region src/local-service/lifecycle/daemon-service-manager.ts
98
160
  /**
99
161
  * Disables autostart only when the OS definition is already committed.
@@ -182,7 +244,7 @@ const LAUNCHD_CONTROLLER = "launchd";
182
244
  const WINDOWS_CONTROLLER = "windows-service";
183
245
  const DAEMON_SERVICE_RESTART_BACKOFF_SECONDS = 60;
184
246
  async function startLaunchdService(input) {
185
- const run = input.run ?? runCommand;
247
+ const run = input.run ?? runNativeServiceCommand;
186
248
  const observed = await run({
187
249
  command: "launchctl",
188
250
  args: ["print", input.serviceKey],
@@ -212,54 +274,6 @@ async function startLaunchdService(input) {
212
274
  throwOnError: true
213
275
  });
214
276
  }
215
- async function runCommand(input) {
216
- return await new Promise((resolve, reject) => {
217
- const child = spawn(input.command, input.args, {
218
- stdio: [
219
- "ignore",
220
- "pipe",
221
- "pipe"
222
- ],
223
- env: input.env ?? process.env,
224
- windowsHide: true
225
- });
226
- let stdout = "";
227
- let stderr = "";
228
- child.stdout?.on("data", (chunk) => {
229
- stdout += chunk.toString();
230
- });
231
- child.stderr?.on("data", (chunk) => {
232
- stderr += chunk.toString();
233
- });
234
- child.once("error", (error) => {
235
- if (input.throwOnError) {
236
- reject(error);
237
- return;
238
- }
239
- resolve({
240
- exitCode: 1,
241
- stdout,
242
- stderr: `${stderr}${String(error)}`
243
- });
244
- });
245
- child.once("close", (code) => {
246
- const exitCode = typeof code === "number" ? code : 1;
247
- if (input.throwOnError && exitCode !== 0) {
248
- reject(new Error([
249
- `command failed: ${input.command} ${input.args.join(" ")}`,
250
- stdout.trim(),
251
- stderr.trim()
252
- ].filter(Boolean).join(" | ")));
253
- return;
254
- }
255
- resolve({
256
- exitCode,
257
- stdout,
258
- stderr
259
- });
260
- });
261
- });
262
- }
263
277
  async function pathExists(path) {
264
278
  try {
265
279
  await access(path, constants.F_OK);
@@ -301,7 +315,7 @@ function isLaunchdServiceMissing(result) {
301
315
  async function waitForLaunchdJobUnloaded(serviceKey) {
302
316
  await waitForCondition({
303
317
  until: async () => {
304
- const result = await runCommand({
318
+ const result = await runNativeServiceCommand({
305
319
  command: "launchctl",
306
320
  args: ["print", serviceKey],
307
321
  throwOnError: false
@@ -550,12 +564,12 @@ function buildSystemdManager(pathInput = {}) {
550
564
  encoding: "utf8",
551
565
  mode: 384
552
566
  });
553
- await runCommand({
567
+ await runNativeServiceCommand({
554
568
  command: "systemctl",
555
569
  args: ["--user", "daemon-reload"],
556
570
  throwOnError: true
557
571
  });
558
- await runCommand({
572
+ await runNativeServiceCommand({
559
573
  command: "systemctl",
560
574
  args: [
561
575
  "--user",
@@ -564,7 +578,7 @@ function buildSystemdManager(pathInput = {}) {
564
578
  ],
565
579
  throwOnError: true
566
580
  });
567
- await runCommand({
581
+ await runNativeServiceCommand({
568
582
  command: "loginctl",
569
583
  args: ["enable-linger", process.env.USER || userInfo().username],
570
584
  throwOnError: false
@@ -572,7 +586,7 @@ function buildSystemdManager(pathInput = {}) {
572
586
  },
573
587
  rollbackNewDefinition: async () => {
574
588
  await runServiceDefinitionRollbackSteps([
575
- async () => await runCommand({
589
+ async () => await runNativeServiceCommand({
576
590
  command: "systemctl",
577
591
  args: [
578
592
  "--user",
@@ -582,7 +596,7 @@ function buildSystemdManager(pathInput = {}) {
582
596
  throwOnError: true
583
597
  }),
584
598
  async () => await rm(unitPath, { force: true }),
585
- async () => await runCommand({
599
+ async () => await runNativeServiceCommand({
586
600
  command: "systemctl",
587
601
  args: ["--user", "daemon-reload"],
588
602
  throwOnError: true
@@ -596,7 +610,7 @@ function buildSystemdManager(pathInput = {}) {
596
610
  });
597
611
  },
598
612
  uninstall: async () => {
599
- await runCommand({
613
+ await runNativeServiceCommand({
600
614
  command: "systemctl",
601
615
  args: [
602
616
  "--user",
@@ -607,7 +621,7 @@ function buildSystemdManager(pathInput = {}) {
607
621
  throwOnError: false
608
622
  });
609
623
  await rm(unitPath, { force: true });
610
- await runCommand({
624
+ await runNativeServiceCommand({
611
625
  command: "systemctl",
612
626
  args: ["--user", "daemon-reload"],
613
627
  throwOnError: false
@@ -615,7 +629,7 @@ function buildSystemdManager(pathInput = {}) {
615
629
  },
616
630
  enableAutostart: async () => {
617
631
  if (!await pathExists(unitPath)) throw new Error("OpenMeld Service is not installed for systemd.");
618
- await runCommand({
632
+ await runNativeServiceCommand({
619
633
  command: "systemctl",
620
634
  args: [
621
635
  "--user",
@@ -627,7 +641,7 @@ function buildSystemdManager(pathInput = {}) {
627
641
  },
628
642
  disableAutostart: async () => {
629
643
  if (!await pathExists(unitPath)) throw new Error("OpenMeld Service is not installed for systemd.");
630
- await runCommand({
644
+ await runNativeServiceCommand({
631
645
  command: "systemctl",
632
646
  args: [
633
647
  "--user",
@@ -638,7 +652,7 @@ function buildSystemdManager(pathInput = {}) {
638
652
  });
639
653
  },
640
654
  start: async () => {
641
- await runCommand({
655
+ await runNativeServiceCommand({
642
656
  command: "systemctl",
643
657
  args: [
644
658
  "--user",
@@ -650,7 +664,7 @@ function buildSystemdManager(pathInput = {}) {
650
664
  });
651
665
  },
652
666
  stop: async () => {
653
- await runCommand({
667
+ await runNativeServiceCommand({
654
668
  command: "systemctl",
655
669
  args: [
656
670
  "--user",
@@ -662,7 +676,7 @@ function buildSystemdManager(pathInput = {}) {
662
676
  });
663
677
  },
664
678
  deactivate: async () => {
665
- await runCommand({
679
+ await runNativeServiceCommand({
666
680
  command: "systemctl",
667
681
  args: [
668
682
  "--user",
@@ -674,7 +688,7 @@ function buildSystemdManager(pathInput = {}) {
674
688
  },
675
689
  status: async () => {
676
690
  const installed = await pathExists(unitPath);
677
- const activeResult = await runCommand({
691
+ const activeResult = await runNativeServiceCommand({
678
692
  command: "systemctl",
679
693
  args: [
680
694
  "--user",
@@ -683,7 +697,7 @@ function buildSystemdManager(pathInput = {}) {
683
697
  ],
684
698
  throwOnError: false
685
699
  });
686
- const enabledResult = await runCommand({
700
+ const enabledResult = await runNativeServiceCommand({
687
701
  command: "systemctl",
688
702
  args: [
689
703
  "--user",
@@ -767,14 +781,14 @@ function buildLaunchdManager(pathInput = {}) {
767
781
  mode: 420
768
782
  });
769
783
  await chmod(plistPath, 420);
770
- await runCommand({
784
+ await runNativeServiceCommand({
771
785
  command: "launchctl",
772
786
  args: ["enable", launchdServiceKey],
773
787
  throwOnError: true
774
788
  });
775
789
  },
776
790
  rollbackNewDefinition: async () => {
777
- await runServiceDefinitionRollbackSteps([async () => await runCommand({
791
+ await runServiceDefinitionRollbackSteps([async () => await runNativeServiceCommand({
778
792
  command: "launchctl",
779
793
  args: ["disable", launchdServiceKey],
780
794
  throwOnError: true
@@ -787,17 +801,17 @@ function buildLaunchdManager(pathInput = {}) {
787
801
  });
788
802
  },
789
803
  uninstall: async () => {
790
- await runCommand({
804
+ await runNativeServiceCommand({
791
805
  command: "launchctl",
792
806
  args: ["disable", launchdServiceKey],
793
807
  throwOnError: false
794
808
  });
795
- await runCommand({
809
+ await runNativeServiceCommand({
796
810
  command: "launchctl",
797
811
  args: ["bootout", launchdServiceKey],
798
812
  throwOnError: false
799
813
  });
800
- await runCommand({
814
+ await runNativeServiceCommand({
801
815
  command: "launchctl",
802
816
  args: ["remove", serviceIdentity.launchdLabel],
803
817
  throwOnError: false
@@ -806,7 +820,7 @@ function buildLaunchdManager(pathInput = {}) {
806
820
  },
807
821
  enableAutostart: async () => {
808
822
  if (!await pathExists(plistPath)) throw new Error("OpenMeld Service is not installed for launchd.");
809
- await runCommand({
823
+ await runNativeServiceCommand({
810
824
  command: "launchctl",
811
825
  args: ["enable", launchdServiceKey],
812
826
  throwOnError: true
@@ -814,7 +828,7 @@ function buildLaunchdManager(pathInput = {}) {
814
828
  },
815
829
  disableAutostart: async () => {
816
830
  if (!await pathExists(plistPath)) throw new Error("OpenMeld Service is not installed for launchd.");
817
- await runCommand({
831
+ await runNativeServiceCommand({
818
832
  command: "launchctl",
819
833
  args: ["disable", launchdServiceKey],
820
834
  throwOnError: true
@@ -828,19 +842,19 @@ function buildLaunchdManager(pathInput = {}) {
828
842
  });
829
843
  },
830
844
  stop: async () => {
831
- await runCommand({
845
+ await runNativeServiceCommand({
832
846
  command: "launchctl",
833
847
  args: ["disable", launchdServiceKey],
834
848
  throwOnError: false
835
849
  });
836
- await runCommand({
850
+ await runNativeServiceCommand({
837
851
  command: "launchctl",
838
852
  args: ["bootout", launchdServiceKey],
839
853
  throwOnError: false
840
854
  });
841
855
  },
842
856
  deactivate: async () => {
843
- await runCommand({
857
+ await runNativeServiceCommand({
844
858
  command: "launchctl",
845
859
  args: ["bootout", launchdServiceKey],
846
860
  throwOnError: false
@@ -848,12 +862,12 @@ function buildLaunchdManager(pathInput = {}) {
848
862
  },
849
863
  status: async () => {
850
864
  const installed = await pathExists(plistPath);
851
- const printResult = await runCommand({
865
+ const printResult = await runNativeServiceCommand({
852
866
  command: "launchctl",
853
867
  args: ["print", launchdServiceKey],
854
868
  throwOnError: false
855
869
  });
856
- const disabledResult = await runCommand({
870
+ const disabledResult = await runNativeServiceCommand({
857
871
  command: "launchctl",
858
872
  args: ["print-disabled", guiDomain],
859
873
  throwOnError: false
@@ -875,7 +889,7 @@ function buildLaunchdManager(pathInput = {}) {
875
889
  };
876
890
  },
877
891
  readJobDiagnostics: async () => {
878
- const printResult = await runCommand({
892
+ const printResult = await runNativeServiceCommand({
879
893
  command: "launchctl",
880
894
  args: ["print", launchdServiceKey],
881
895
  throwOnError: false
@@ -896,7 +910,7 @@ function buildLaunchdManager(pathInput = {}) {
896
910
  waitUntilAbsent: async () => {
897
911
  await waitForCondition({
898
912
  until: async () => {
899
- const [installed, printResult] = await Promise.all([pathExists(plistPath), runCommand({
913
+ const [installed, printResult] = await Promise.all([pathExists(plistPath), runNativeServiceCommand({
900
914
  command: "launchctl",
901
915
  args: ["print", launchdServiceKey],
902
916
  throwOnError: false
@@ -916,7 +930,7 @@ function buildLaunchdManager(pathInput = {}) {
916
930
  waitUntilStopped: async () => {
917
931
  await waitForCondition({
918
932
  until: async () => {
919
- const result = await runCommand({
933
+ const result = await runNativeServiceCommand({
920
934
  command: "launchctl",
921
935
  args: ["print", launchdServiceKey],
922
936
  throwOnError: false
@@ -1146,21 +1160,21 @@ function decodeXmlText(value) {
1146
1160
  return value.replace(/&apos;/g, "'").replace(/&quot;/g, "\"").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&amp;/g, "&");
1147
1161
  }
1148
1162
  function isSystemdAvailable() {
1149
- return runCommand({
1163
+ return runNativeServiceCommand({
1150
1164
  command: "systemctl",
1151
1165
  args: ["--user", "--version"],
1152
1166
  throwOnError: false
1153
1167
  }).then((result) => result.exitCode === 0);
1154
1168
  }
1155
1169
  function isLaunchdAvailable() {
1156
- return runCommand({
1170
+ return runNativeServiceCommand({
1157
1171
  command: "launchctl",
1158
1172
  args: ["version"],
1159
1173
  throwOnError: false
1160
1174
  }).then((result) => result.exitCode === 0);
1161
1175
  }
1162
1176
  function isWindowsTaskSchedulerAvailable() {
1163
- return runCommand({
1177
+ return runNativeServiceCommand({
1164
1178
  command: windowsPowerShellPath(),
1165
1179
  args: [
1166
1180
  "-NoProfile",
@@ -1252,4 +1266,4 @@ async function resolveUnguardedDaemonServiceManager(controller, pathInput = {})
1252
1266
  //#endregion
1253
1267
  export { isTestProcess as A, runServiceDefinitionRollbackSteps as C, assertNoPublishedProductionMutationDuringTests as D, resolveDaemonServiceIdentity as E, assertSafePublishedProductionServiceRegistrationMutation as O, resolveDaemonServiceManager as S, waitForLaunchdJobUnloaded as T, readDaemonServiceJobCrashExitCode as _, disableDaemonServiceAutostartIfConfigured as a, readSystemdServiceEnabledProbe as b, getDaemonSystemServiceLogPath as c, isDaemonServiceJobNeverSpawned as d, isDaemonServiceJobSpawnPending as f, parseLaunchdServiceJobDiagnostics as g, parseDaemonServiceEnvironmentTargetFromDefinition as h, buildSystemdUnitFile as i, isPublishedProductionOpenMeldRoot as k, guardDaemonServiceManagerMutations as l, parseDaemonServiceEnvironmentFromDefinition as m, assertServiceManagerProbeSucceeded as n, formatDaemonServiceJobDiagnosticsEvidence as o, matchesLaunchdServiceStartupPolicy as p, buildLaunchdPlist as r, getDaemonServiceLaunchdLabel as s, DaemonServiceWaitTimeoutError as t, installMissingServiceDefinitionFailAtomically as u, readDaemonServiceStartupPolicyCurrent as v, startLaunchdService as w, readWindowsRunnerCommandSummary as x, readSystemdServiceActiveProbe as y };
1254
1268
 
1255
- //# sourceMappingURL=daemon-service-manager-BVipiZwK.js.map
1269
+ //# sourceMappingURL=daemon-service-manager-GiMCiTmu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-service-manager-GiMCiTmu.js","names":["runCommand"],"sources":["../src/config/published-production-safety.ts","../src/local-service/lifecycle/daemon-service-identity.ts","../src/local-service/lifecycle/native-command.ts","../src/local-service/lifecycle/daemon-service-manager.ts"],"sourcesContent":["import { 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 { currentDaemonServiceLifecycleLock } from \"../../config/daemon-state\";\nimport {\n attachLockProcess,\n type OpenMeldLock,\n releaseLock,\n} from \"../../config/lock\";\n\n// The shell waits without spawning another process. exec preserves its PID\n// and start identity. EOF before a grant prevents the platform command.\nconst EXEC_HANDSHAKE =\n 'IFS= read -r grant && [ \"$grant\" = \"execute\" ] || exit 125; exec \"$@\"';\n\nexport async function runNativeServiceCommand(input: {\n command: string;\n args: string[];\n env?: NodeJS.ProcessEnv;\n throwOnError?: boolean;\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const lock = currentDaemonServiceLifecycleLock();\n const attached = lock !== null && process.platform !== \"win32\";\n const child = spawn(\n attached ? \"/bin/sh\" : input.command,\n attached\n ? [\n \"-c\",\n EXEC_HANDSHAKE,\n \"openmeld-native-command\",\n input.command,\n ...input.args,\n ]\n : input.args,\n {\n stdio: [attached ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n env: input.env ?? process.env,\n windowsHide: true,\n }\n );\n let stdout = \"\";\n let stderr = \"\";\n let spawnError: Error | undefined;\n child.stdout?.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (error) => {\n spawnError = error;\n });\n // EPIPE is expected when a waiting participant exits before the grant.\n child.stdin?.on(\"error\", () => undefined);\n const completion = new Promise<number>((resolve) => {\n child.once(\"close\", (code) => resolve(code ?? 1));\n });\n let participant: OpenMeldLock | undefined;\n try {\n if (attached) {\n if (!child.pid) {\n throw new Error(\"Native command did not establish a process.\");\n }\n participant = await attachLockProcess(lock, child.pid);\n child.stdin?.end(\"execute\\n\");\n }\n const exitCode = await completion;\n if (input.throwOnError && (spawnError || exitCode !== 0)) {\n throw (\n spawnError ??\n new Error(\n [\n `command failed: ${input.command} ${input.args.join(\" \")}`,\n stdout.trim(),\n stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n )\n );\n }\n return {\n exitCode,\n stdout,\n stderr: `${stderr}${spawnError ? String(spawnError) : \"\"}`,\n };\n } finally {\n child.stdin?.destroy();\n if (child.exitCode === null && child.signalCode === null) {\n child.kill();\n }\n await completion;\n if (participant) {\n await releaseLock(participant);\n }\n }\n}\n","import { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n mkdir,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { WindowsUserTaskRequest } from \"@openmeld/schemas\";\nimport { sleep } from \"@openmeld/utils\";\nimport type { DaemonServiceController } from \"../../config/daemon-state\";\nimport { daemonRuntimeRootPath } from \"../../config/daemon-state\";\nimport type { OpenMeldEnvironmentTarget } from \"../../config/openmeld-environment-target\";\nimport type { OpenMeldPathResolutionInput } from \"../../config/paths\";\nimport {\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"../../config/paths\";\nimport { assertSafePublishedProductionServiceRegistrationMutation } from \"../../config/published-production-safety\";\nimport { resolveDaemonServiceIdentity } from \"./daemon-service-identity\";\nimport { runNativeServiceCommand as runCommand } from \"./native-command\";\nimport {\n readWindowsTaskAction,\n runWindowsUserTask,\n windowsPowerShellPath,\n windowsTaskActionArguments,\n} from \"./windows-user-task\";\n\nexport type RunCommandResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type RunCommandOptions = {\n args: string[];\n command: string;\n env?: NodeJS.ProcessEnv;\n throwOnError?: boolean;\n};\n\nexport type DaemonServiceCommandSpec = {\n executable: string;\n args: string[];\n env: Record<string, string>;\n workingDirectory?: string;\n};\n\nexport type DaemonServiceManagerRuntimeStatus = {\n installed: boolean;\n running: boolean;\n enabled: boolean;\n definitionPath?: string | null;\n commandSummary?: string | null;\n /** Native launch action when the supervisor does not use a definition file. */\n commandSpec?: DaemonServiceCommandSpec;\n /**\n * The OpenMeld backend target persisted in the OS service definition.\n * `undefined` is reserved for older/custom manager implementations that do\n * not expose this observation; `null` means the definition was readable but\n * did not contain one complete, valid target.\n */\n environmentTarget?: OpenMeldEnvironmentTarget | null;\n};\n\nexport type DaemonServiceJobDiagnostics = {\n controller: DaemonServiceController;\n /** The service definition is loaded in the OS service manager domain. */\n loaded: boolean;\n /** How many times the OS service manager spawned the process since load. */\n runs: number | null;\n state: string | null;\n /** Raw last-exit text as reported, e.g. \"(never exited)\" or \"78\". */\n lastExitCodeText: string | null;\n /** Numeric last exit code when the raw text is a plain integer. */\n lastExitCode: number | null;\n /** launchd marker for deferred non-demand startup; not proof of permission denial. */\n pendedNondemandSpawn: string | null;\n /** Job is configured to auto-start and stay alive (keepalive + runatload). */\n keepaliveRunAtLoad: boolean;\n};\n\nexport type DaemonServiceManager = {\n controller: DaemonServiceController;\n /**\n * Installs or refreshes the supervisor definition without starting another\n * process. When the definition was absent, success means a fresh status\n * probe confirmed that it is installed and enabled. A failed install or\n * verification removes that newly created definition before rejecting.\n */\n install: (spec: DaemonServiceCommandSpec) => Promise<void>;\n uninstall: () => Promise<void>;\n enableAutostart: () => Promise<void>;\n disableAutostart: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => Promise<void>;\n deactivate: () => Promise<void>;\n status: () => Promise<DaemonServiceManagerRuntimeStatus>;\n waitUntilAbsent: () => Promise<void>;\n waitUntilStopped: () => Promise<void>;\n waitUntilRunning: () => Promise<void>;\n /**\n * Controller-reported job-state evidence for startup failure diagnosis\n * (for launchd: `launchctl print` runs/state/last exit code/pended spawn).\n * Diagnostic evidence only; it must never feed availability, readiness,\n * or lifecycle decisions. Resolves null when the controller offers no\n * job-state evidence or the probe fails.\n */\n readJobDiagnostics?: () => Promise<DaemonServiceJobDiagnostics | null>;\n};\n\n/**\n * Disables autostart only when the OS definition is already committed.\n * Setup can run a candidate Service from its stable carrier before that\n * definition exists; the process can still be stopped without toggling it.\n */\nexport async function disableDaemonServiceAutostartIfConfigured(input: {\n manager: DaemonServiceManager;\n status: DaemonServiceManagerRuntimeStatus | null;\n}): Promise<boolean> {\n if (!(input.status?.installed === true && input.status.enabled === true)) {\n return false;\n }\n await input.manager.disableAutostart();\n return true;\n}\n\nconst SHELL_QUOTING_PATTERN = /[\\s\"\\\\]/g;\nconst SHELL_BACKSLASH_PATTERN = /\\\\/g;\nconst SHELL_DOUBLE_QUOTE_PATTERN = /\"/g;\nconst WINDOWS_QUOTE_PATTERN = /\"/g;\nconst XML_AMPERSAND_PATTERN = /&/g;\nconst XML_LESS_THAN_PATTERN = /</g;\nconst XML_GREATER_THAN_PATTERN = />/g;\nconst XML_DOUBLE_QUOTE_ESCAPE_PATTERN = /\"/g;\nconst XML_SINGLE_QUOTE_PATTERN = /'/g;\nconst LAUNCHD_ENABLED_PATTERN = /enabled\\s*=\\s*(true|false)/i;\nconst LAUNCHD_STATE_PATTERN = /state\\s*=\\s*running/i;\nconst LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN =\n /\"([^\"]+)\"\\s*=>\\s*(enabled|disabled)/i;\nconst LAUNCHD_STRING_PATTERN = /<string>([^<]+)<\\/string>/g;\nconst LAUNCHD_SERVICE_PROCESS_TYPE = \"Interactive\";\nconst LAUNCHD_PROCESS_TYPE_PATTERN =\n /<key>ProcessType<\\/key>\\s*<string>([^<]+)<\\/string>/;\nconst LAUNCHD_ENVIRONMENT_BLOCK_PATTERN =\n /<key>EnvironmentVariables<\\/key>\\s*<dict>([\\s\\S]*?)<\\/dict>/;\nconst WINDOWS_LINE_SEPARATOR_PATTERN = /\\r?\\n/;\nconst WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN = /^set \"([^=]+)=(.*)\"$/i;\nconst SYSTEMD_ACTIVE_STATES = new Set([\n \"active\",\n \"reloading\",\n \"inactive\",\n \"failed\",\n \"activating\",\n \"deactivating\",\n \"maintenance\",\n \"unknown\",\n]);\nconst SYSTEMD_ENABLED_STATES = new Set([\n \"enabled\",\n \"enabled-runtime\",\n \"linked\",\n \"linked-runtime\",\n \"alias\",\n \"masked\",\n \"masked-runtime\",\n \"static\",\n \"indirect\",\n \"generated\",\n \"transient\",\n \"disabled\",\n \"bad\",\n \"not-found\",\n]);\nconst LAUNCHD_ALREADY_PATTERN = /already/i;\nconst WINDOWS_SCRIPT_LINE_SPLIT_PATTERN = /\\r?\\n/u;\nconst LAUNCHD_SERVICE_NOT_FOUND_PATTERNS = [\n /could not find service/i,\n /service could not be found/i,\n /could not find domain/i,\n] as const;\nconst LAUNCHD_PRINT_RUNS_PATTERN = /^\\s*runs\\s*=\\s*(\\d+)\\s*$/m;\nconst LAUNCHD_PRINT_STATE_PATTERN = /^\\s*state\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN =\n /^\\s*last exit code\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN =\n /^\\s*pended nondemand spawn\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PRINT_PROPERTIES_PATTERN = /^\\s*properties\\s*=\\s*(.+?)\\s*$/m;\nconst LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN = /\\bkeepalive\\b/i;\nconst LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN = /\\brunatload\\b/i;\nconst INTEGER_TEXT_PATTERN = /^-?\\d+$/;\nconst SYSTEM_SERVICE_WAIT_MS = 15_000;\nconst SYSTEM_SERVICE_POLL_MS = 200;\n\nconst QUOTED_XML_REPLACEMENT = \"&quot;\";\nconst APOSTROPHE_XML_REPLACEMENT = \"&apos;\";\nconst GREATER_XML_REPLACEMENT = \"&gt;\";\nconst LESS_XML_REPLACEMENT = \"&lt;\";\nconst AMPERSAND_XML_REPLACEMENT = \"&amp;\";\n\nexport function getDaemonSystemServiceLogPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return join(\n daemonRuntimeRootPath(pathInput),\n \"logs\",\n \"daemon-system-service.log\"\n );\n}\n\nexport function getDaemonServiceLaunchdLabel(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n return resolveDaemonServiceIdentity(pathInput).launchdLabel;\n}\n\nconst SYSTEMD_CONTROLLER: DaemonServiceController = \"systemd\";\nconst LAUNCHD_CONTROLLER: DaemonServiceController = \"launchd\";\nconst WINDOWS_CONTROLLER: DaemonServiceController = \"windows-service\";\nconst DAEMON_SERVICE_RESTART_BACKOFF_SECONDS = 60;\n\nexport async function startLaunchdService(input: {\n serviceKey: string;\n guiDomain: string;\n plistPath: string;\n run?: (options: RunCommandOptions) => Promise<RunCommandResult>;\n}): Promise<void> {\n const run = input.run ?? runCommand;\n const observed = await run({\n command: \"launchctl\",\n args: [\"print\", input.serviceKey],\n throwOnError: false,\n });\n if (observed.exitCode !== 0 && !isLaunchdServiceMissing(observed)) {\n throw buildServiceManagerProbeError(\"launchctl print\", observed);\n }\n await run({\n command: \"launchctl\",\n args: [\"enable\", input.serviceKey],\n throwOnError: true,\n });\n // A loaded job must not be bootstrapped again: launchd can report EIO for\n // that case, which is not evidence that its registration needs replacing.\n if (observed.exitCode !== 0) {\n const bootstrap = await run({\n command: \"launchctl\",\n args: [\"bootstrap\", input.guiDomain, input.plistPath],\n throwOnError: false,\n });\n if (\n bootstrap.exitCode !== 0 &&\n !LAUNCHD_ALREADY_PATTERN.test(bootstrap.stderr)\n ) {\n throw new Error(\n `failed to start launchd service: ${bootstrap.stderr.trim() || bootstrap.stdout.trim()}`\n );\n }\n }\n // Registration/KeepAlive is not a demand start. Never use -k: an existing\n // healthy instance must survive repeated setup/start requests.\n await run({\n command: \"launchctl\",\n args: [\"kickstart\", input.serviceKey],\n throwOnError: true,\n });\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n throw error;\n }\n}\n\n// Thrown when a service-manager wait (running/stopped/absent) times out. On the\n// launchd running path it carries the structured launchd job-state verdict so\n// upstream lifecycle journaling can distinguish a never-spawned (Login Items\n// blocked) job from a crash loop — matching the `openmeld service run` startup path.\n// Diagnostic evidence only: jobDiagnostics must never gate lifecycle decisions.\nexport class DaemonServiceWaitTimeoutError extends Error {\n readonly jobDiagnostics: DaemonServiceJobDiagnostics | null;\n\n constructor(input: {\n message: string;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n }) {\n super(input.message);\n this.name = \"DaemonServiceWaitTimeoutError\";\n this.jobDiagnostics = input.jobDiagnostics ?? null;\n }\n}\n\nexport function isDaemonServiceWaitTimeoutError(\n error: unknown\n): error is DaemonServiceWaitTimeoutError {\n return error instanceof DaemonServiceWaitTimeoutError;\n}\n\nfunction buildSystemServiceWaitTimeoutError(input: {\n action: \"absent\" | \"running\" | \"stopped\";\n controller: DaemonServiceController;\n details?: string | null;\n jobDiagnostics?: DaemonServiceJobDiagnostics | null;\n}): DaemonServiceWaitTimeoutError {\n const detailSuffix =\n input.details && input.details.trim().length > 0\n ? ` Last observed state: ${input.details.trim()}`\n : \"\";\n return new DaemonServiceWaitTimeoutError({\n message: `timed out waiting for ${input.controller} service to become ${input.action}.${detailSuffix}`,\n jobDiagnostics: input.jobDiagnostics ?? null,\n });\n}\n\nasync function waitForCondition(input: {\n waitMs?: number;\n pollMs?: number;\n until: () => Promise<boolean>;\n onTimeout: () => Promise<Error> | Error;\n}): Promise<void> {\n const deadline = Date.now() + (input.waitMs ?? SYSTEM_SERVICE_WAIT_MS);\n const pollMs = input.pollMs ?? SYSTEM_SERVICE_POLL_MS;\n while (Date.now() < deadline) {\n if (await input.until()) {\n return;\n }\n await sleep(pollMs);\n }\n throw await input.onTimeout();\n}\n\nfunction isLaunchdServiceMissing(result: RunCommandResult): boolean {\n if (result.exitCode === 0) {\n return false;\n }\n const output = `${result.stdout}\\n${result.stderr}`;\n return LAUNCHD_SERVICE_NOT_FOUND_PATTERNS.some((pattern) =>\n pattern.test(output)\n );\n}\n\nexport async function waitForLaunchdJobUnloaded(\n serviceKey: string\n): Promise<void> {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", serviceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: () =>\n new Error(`Timed out waiting for launchd job ${serviceKey} to unload.`),\n });\n}\n\nfunction formatManagerStatusDetails(\n status: DaemonServiceManagerRuntimeStatus\n): string {\n return `installed=${String(status.installed)} running=${String(status.running)} enabled=${String(status.enabled)}`;\n}\n\nfunction quoteShellValue(input: string): string {\n if (input === \"\") {\n return '\"\"';\n }\n if (SHELL_QUOTING_PATTERN.test(input)) {\n return `\"${input\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n }\n return input;\n}\n\nfunction quoteWindowsArg(input: string): string {\n return `\"${input.replace(WINDOWS_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction escapeXmlText(input: string): string {\n return input\n .replace(XML_AMPERSAND_PATTERN, AMPERSAND_XML_REPLACEMENT)\n .replace(XML_LESS_THAN_PATTERN, LESS_XML_REPLACEMENT)\n .replace(XML_GREATER_THAN_PATTERN, GREATER_XML_REPLACEMENT)\n .replace(XML_DOUBLE_QUOTE_ESCAPE_PATTERN, QUOTED_XML_REPLACEMENT)\n .replace(XML_SINGLE_QUOTE_PATTERN, APOSTROPHE_XML_REPLACEMENT);\n}\n\nexport function buildSystemdUnitFile(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const command = [\n quoteShellValue(spec.executable),\n ...spec.args.map(quoteShellValue),\n ].join(\" \");\n const workingDirectory = quoteShellValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n );\n const envRows = Object.entries(spec.env).map(\n ([key, value]) =>\n `Environment=${key}=${quoteSystemdEnvironmentValue(value)}`\n );\n return `# Managed by OpenMeld CLI\n[Unit]\nDescription=OpenMeld Daemon Service\nAfter=network-online.target\n\n[Service]\nType=simple\nWorkingDirectory=${workingDirectory}\nExecStart=${command}\nRestart=always\nRestartSec=${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}\n${envRows.join(\"\\n\")}\nStandardOutput=append:${serviceLogPath}\nStandardError=append:${serviceLogPath}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nfunction quoteSystemdEnvironmentValue(value: string): string {\n return `\"${value\n .replace(SHELL_BACKSLASH_PATTERN, \"\\\\\\\\\")\n .replace(SHELL_DOUBLE_QUOTE_PATTERN, '\\\\\"')}\"`;\n}\n\nfunction sanitizeLaunchdEnvironmentValue(value: string): string {\n return sanitizeControlCharacters(value);\n}\n\nfunction sanitizeControlCharacters(value: string): string {\n let sanitized = \"\";\n for (const char of value) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n continue;\n }\n if (code >= 0x00 && code <= 0x1f) {\n continue;\n }\n if (code === 0x7f) {\n continue;\n }\n sanitized += char;\n }\n return sanitized;\n}\n\nexport function matchesLaunchdServiceStartupPolicy(\n definition: string\n): boolean {\n return (\n LAUNCHD_PROCESS_TYPE_PATTERN.exec(definition)?.[1] ===\n LAUNCHD_SERVICE_PROCESS_TYPE\n );\n}\n\n/** Reads only the owned definition; callers report drift through existing diagnostics. */\nexport async function readDaemonServiceStartupPolicyCurrent(input: {\n controller: DaemonServiceController | null;\n status: DaemonServiceManagerRuntimeStatus | null;\n}): Promise<boolean | null> {\n if (\n input.controller !== \"launchd\" ||\n !input.status?.installed ||\n !input.status.definitionPath\n ) {\n return null;\n }\n const definition = await readFile(input.status.definitionPath, \"utf8\").catch(\n (error: NodeJS.ErrnoException) => {\n // An uninstalled definition is not evidence of a scheduling-policy mismatch.\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n );\n return definition === null\n ? null\n : matchesLaunchdServiceStartupPolicy(definition);\n}\n\nexport function buildLaunchdPlist(\n spec: DaemonServiceCommandSpec,\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const serviceLogPath = getDaemonSystemServiceLogPath(pathInput);\n const args = [spec.executable, ...spec.args]\n .map((value) => ` <string>${escapeXmlText(value)}</string>`)\n .join(\"\\n\");\n const workingDirectory = escapeXmlText(\n sanitizeLaunchdEnvironmentValue(\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput)\n )\n );\n const envRows = Object.entries(spec.env)\n .filter(([key, value]) => key.trim() !== \"\" && value !== \"\")\n .map(\n ([key, value]) =>\n ` <key>${escapeXmlText(key)}</key>\\n <string>${escapeXmlText(\n sanitizeLaunchdEnvironmentValue(value)\n )}</string>`\n )\n .join(\"\\n\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${serviceIdentity.launchdLabel}</string>\n <key>ProgramArguments</key>\n <array>\n${args}\n </array>\n <key>WorkingDirectory</key>\n <string>${workingDirectory}</string>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>ProcessType</key>\n <string>${LAUNCHD_SERVICE_PROCESS_TYPE}</string>\n <key>ThrottleInterval</key>\n <integer>${DAEMON_SERVICE_RESTART_BACKOFF_SECONDS}</integer>\n <key>EnvironmentVariables</key>\n <dict>\n${envRows}\n </dict>\n <key>StandardOutPath</key>\n <string>${serviceLogPath}</string>\n <key>StandardErrorPath</key>\n <string>${serviceLogPath}</string>\n</dict>\n</plist>\n`;\n}\n\nfunction resolveSystemdUnitPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \".config\",\n \"systemd\",\n \"user\",\n `${serviceIdentity.serviceName}.service`\n );\n}\n\nfunction resolveLaunchdPlistPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n userInfo().homedir,\n \"Library\",\n \"LaunchAgents\",\n `${serviceIdentity.launchdLabel}.plist`\n );\n}\n\nfunction resolveWindowsServiceScriptPath(\n pathInput: OpenMeldPathResolutionInput = {}\n): string {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n return join(\n daemonRuntimeRootPath(pathInput),\n `${serviceIdentity.serviceName}-runner.bat`\n );\n}\n\nfunction parseRegexGroup(input: string, pattern: RegExp): string | null {\n const match = input.match(pattern);\n return match?.[1] ?? null;\n}\n\nfunction parseLaunchdEnabled(output: string): boolean {\n const value = parseRegexGroup(output, LAUNCHD_ENABLED_PATTERN);\n return value !== null && value.toLowerCase() === \"true\";\n}\n\nexport function parseLaunchdServiceJobDiagnostics(\n printOutput: string\n): DaemonServiceJobDiagnostics {\n const runsText = parseRegexGroup(printOutput, LAUNCHD_PRINT_RUNS_PATTERN);\n const lastExitCodeText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_LAST_EXIT_CODE_PATTERN\n );\n const propertiesText = parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PROPERTIES_PATTERN\n );\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: true,\n runs: runsText === null ? null : Number.parseInt(runsText, 10),\n state: parseRegexGroup(printOutput, LAUNCHD_PRINT_STATE_PATTERN),\n lastExitCodeText,\n lastExitCode:\n lastExitCodeText !== null && INTEGER_TEXT_PATTERN.test(lastExitCodeText)\n ? Number.parseInt(lastExitCodeText, 10)\n : null,\n pendedNondemandSpawn: parseRegexGroup(\n printOutput,\n LAUNCHD_PRINT_PENDED_NONDEMAND_SPAWN_PATTERN\n ),\n keepaliveRunAtLoad:\n propertiesText !== null &&\n LAUNCHD_PROPERTIES_KEEPALIVE_PATTERN.test(propertiesText) &&\n LAUNCHD_PROPERTIES_RUNATLOAD_PATTERN.test(propertiesText),\n };\n}\n\nexport function isDaemonServiceJobNeverSpawned(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.loaded &&\n diagnostics.runs === 0 &&\n diagnostics.keepaliveRunAtLoad\n );\n}\n\n// A pending spawn is evidence of deferred startup, not of a denied permission.\n// launchd also reports it when the GUI domain is in on-demand-only mode.\nexport function isDaemonServiceJobSpawnPending(\n diagnostics: DaemonServiceJobDiagnostics\n): boolean {\n return (\n diagnostics.controller === LAUNCHD_CONTROLLER &&\n isDaemonServiceJobNeverSpawned(diagnostics) &&\n diagnostics.pendedNondemandSpawn !== null\n );\n}\n\nexport function readDaemonServiceJobCrashExitCode(\n diagnostics: DaemonServiceJobDiagnostics\n): number | null {\n if (!diagnostics.loaded) {\n return null;\n }\n if (diagnostics.runs === null || diagnostics.runs <= 0) {\n return null;\n }\n if (diagnostics.lastExitCode === null || diagnostics.lastExitCode === 0) {\n return null;\n }\n return diagnostics.lastExitCode;\n}\n\nexport function formatDaemonServiceJobDiagnosticsEvidence(\n diagnostics: DaemonServiceJobDiagnostics\n): string {\n if (!diagnostics.loaded) {\n return `${diagnostics.controller} job: not loaded`;\n }\n const parts = [\n `state=${diagnostics.state ?? \"unknown\"}`,\n `runs=${diagnostics.runs ?? \"unknown\"}`,\n `last exit code=${diagnostics.lastExitCodeText ?? \"unknown\"}`,\n ...(diagnostics.pendedNondemandSpawn\n ? [`pended nondemand spawn=${diagnostics.pendedNondemandSpawn}`]\n : []),\n ...(diagnostics.keepaliveRunAtLoad\n ? [\"properties=keepalive|runatload\"]\n : []),\n ];\n return `${diagnostics.controller} job: ${parts.join(\", \")}`;\n}\n\nfunction parseLaunchdEnabledFromDisabledServices(\n output: string,\n label: string\n): boolean | null {\n const lines = output.split(\"\\n\");\n for (const line of lines) {\n const match = line.match(LAUNCHD_DISABLED_SERVICES_ENTRY_PATTERN);\n if (!match) {\n continue;\n }\n const serviceLabel = match[1];\n const state = match[2];\n if (!(serviceLabel && state) || serviceLabel !== label) {\n continue;\n }\n return state.toLowerCase() === \"enabled\";\n }\n return null;\n}\n\nexport async function installMissingServiceDefinitionFailAtomically(input: {\n definitionWasPresent: boolean;\n install: () => Promise<void>;\n rollbackNewDefinition: () => Promise<void>;\n verifyNewDefinition: () => Promise<void>;\n}): Promise<void> {\n try {\n await input.install();\n await input.verifyNewDefinition();\n } catch (installError) {\n if (input.definitionWasPresent) {\n throw installError;\n }\n try {\n await input.rollbackNewDefinition();\n } catch (rollbackError) {\n throw new AggregateError(\n [installError, rollbackError],\n \"service registration install failed and its new definition could not be rolled back\"\n );\n }\n throw installError;\n }\n}\n\nexport function readSystemdServiceActiveProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ACTIVE_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-active\", result);\n }\n return state === \"active\" || state === \"reloading\";\n}\n\nexport function readSystemdServiceEnabledProbe(\n result: RunCommandResult\n): boolean {\n const state = result.stdout.trim().toLowerCase();\n if (!SYSTEMD_ENABLED_STATES.has(state)) {\n throw buildServiceManagerProbeError(\"systemctl is-enabled\", result);\n }\n return state === \"enabled\" || state === \"enabled-runtime\";\n}\n\nexport function assertServiceManagerProbeSucceeded(\n probe: string,\n result: RunCommandResult\n): void {\n if (result.exitCode !== 0) {\n throw buildServiceManagerProbeError(probe, result);\n }\n}\n\nfunction buildServiceManagerProbeError(\n probe: string,\n result: RunCommandResult\n): Error {\n return new Error(\n [\n `${probe} probe failed`,\n `exitCode=${result.exitCode}`,\n result.stdout.trim(),\n result.stderr.trim(),\n ]\n .filter(Boolean)\n .join(\" | \")\n );\n}\n\nexport async function runServiceDefinitionRollbackSteps(\n steps: ReadonlyArray<() => Promise<unknown>>\n): Promise<void> {\n const errors: unknown[] = [];\n for (const step of steps) {\n try {\n await step();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n \"one or more service registration rollback steps failed\"\n );\n }\n}\n\nfunction assertServiceRegistrationInstalledAndEnabled(\n controller: DaemonServiceController,\n status: DaemonServiceManagerRuntimeStatus\n): void {\n if (status.installed && status.enabled) {\n return;\n }\n throw new Error(\n `${controller} service registration install did not restore an installed, enabled registration`\n );\n}\n\nfunction buildSystemdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const unitPath = resolveSystemdUnitPath(pathInput);\n const unitName = `${serviceIdentity.serviceName}.service`;\n\n return {\n controller: SYSTEMD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(unitPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(unitPath), { recursive: true });\n await writeFile(unitPath, buildSystemdUnitFile(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n const user = process.env.USER || userInfo().username;\n await runCommand({\n command: \"loginctl\",\n args: [\"enable-linger\", user],\n throwOnError: false,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n }),\n async () => await rm(unitPath, { force: true }),\n async () =>\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: true,\n }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildSystemdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n SYSTEMD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: false,\n });\n await rm(unitPath, { force: true });\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"daemon-reload\"],\n throwOnError: false,\n });\n },\n enableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", unitName],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(unitPath))) {\n throw new Error(\"OpenMeld Service is not installed for systemd.\");\n }\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", unitName],\n throwOnError: true,\n });\n },\n start: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"enable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"disable\", \"--now\", unitName],\n throwOnError: true,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"stop\", unitName],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(unitPath);\n const activeResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-active\", unitName],\n throwOnError: false,\n });\n const enabledResult = await runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"is-enabled\", unitName],\n throwOnError: false,\n });\n return {\n installed,\n running: readSystemdServiceActiveProbe(activeResult),\n enabled: readSystemdServiceEnabledProbe(enabledResult),\n definitionPath: installed ? unitPath : null,\n commandSummary: installed\n ? await readSystemServiceCommandSummary(unitPath, \"ExecStart=\")\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: SYSTEMD_CONTROLLER,\n path: unitPath,\n })\n : null,\n };\n },\n // systemd does not expose the launchd-style job spawn evidence yet.\n readJobDiagnostics: async () => null,\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return !(status.installed || status.running || status.enabled);\n },\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () =>\n !(await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildSystemdManager(pathInput).status()).running,\n onTimeout: async () => {\n const status = await buildSystemdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: SYSTEMD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n };\n}\n\nfunction buildLaunchdManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const serviceIdentity = resolveDaemonServiceIdentity(pathInput);\n const plistPath = resolveLaunchdPlistPath(pathInput);\n const guiDomain =\n process.getuid === undefined ? \"gui/501\" : `gui/${process.getuid()}`;\n const launchdServiceKey = `${guiDomain}/${serviceIdentity.launchdLabel}`;\n\n return {\n controller: LAUNCHD_CONTROLLER,\n install: async (spec) => {\n const definitionWasPresent = await pathExists(plistPath);\n await installMissingServiceDefinitionFailAtomically({\n definitionWasPresent,\n install: async () => {\n await ensureServiceLogDirectory(pathInput);\n await mkdir(dirname(plistPath), { recursive: true });\n await writeFile(plistPath, buildLaunchdPlist(spec, pathInput), {\n encoding: \"utf8\",\n mode: 0o644,\n });\n await chmod(plistPath, 0o644);\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n rollbackNewDefinition: async () => {\n await runServiceDefinitionRollbackSteps([\n async () =>\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n }),\n async () => await rm(plistPath, { force: true }),\n ]);\n },\n verifyNewDefinition: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n assertServiceRegistrationInstalledAndEnabled(\n LAUNCHD_CONTROLLER,\n status\n );\n },\n });\n },\n uninstall: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"remove\", serviceIdentity.launchdLabel],\n throwOnError: false,\n });\n await rm(plistPath, { force: true });\n },\n enableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"enable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n disableAutostart: async () => {\n if (!(await pathExists(plistPath))) {\n throw new Error(\"OpenMeld Service is not installed for launchd.\");\n }\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: true,\n });\n },\n start: async () => {\n await startLaunchdService({\n serviceKey: launchdServiceKey,\n guiDomain,\n plistPath,\n });\n },\n stop: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"disable\", launchdServiceKey],\n throwOnError: false,\n });\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n deactivate: async () => {\n await runCommand({\n command: \"launchctl\",\n args: [\"bootout\", launchdServiceKey],\n throwOnError: false,\n });\n },\n status: async () => {\n const installed = await pathExists(plistPath);\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n const disabledResult = await runCommand({\n command: \"launchctl\",\n args: [\"print-disabled\", guiDomain],\n throwOnError: false,\n });\n if (printResult.exitCode !== 0 && !isLaunchdServiceMissing(printResult)) {\n throw buildServiceManagerProbeError(\"launchctl print\", printResult);\n }\n assertServiceManagerProbeSucceeded(\n \"launchctl print-disabled\",\n disabledResult\n );\n const output = `${printResult.stdout}\\n${printResult.stderr}`;\n const disabledOutput = `${disabledResult.stdout}\\n${disabledResult.stderr}`;\n const enabledFromDisabledServices =\n parseLaunchdEnabledFromDisabledServices(\n disabledOutput,\n serviceIdentity.launchdLabel\n );\n return {\n installed,\n running: LAUNCHD_STATE_PATTERN.test(output),\n enabled: enabledFromDisabledServices ?? parseLaunchdEnabled(output),\n definitionPath: installed ? plistPath : null,\n commandSummary: installed\n ? await readLaunchdProgramArguments(plistPath)\n : null,\n environmentTarget: installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: LAUNCHD_CONTROLLER,\n path: plistPath,\n })\n : null,\n };\n },\n readJobDiagnostics: async () => {\n const printResult = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (printResult.exitCode === 0) {\n return parseLaunchdServiceJobDiagnostics(\n `${printResult.stdout}\\n${printResult.stderr}`\n );\n }\n if (isLaunchdServiceMissing(printResult)) {\n return {\n controller: LAUNCHD_CONTROLLER,\n loaded: false,\n runs: null,\n state: null,\n lastExitCodeText: null,\n lastExitCode: null,\n pendedNondemandSpawn: null,\n keepaliveRunAtLoad: false,\n };\n }\n return null;\n },\n waitUntilAbsent: async () => {\n await waitForCondition({\n until: async () => {\n const [installed, printResult] = await Promise.all([\n pathExists(plistPath),\n runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n }),\n ]);\n return !installed && isLaunchdServiceMissing(printResult);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"absent\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilStopped: async () => {\n await waitForCondition({\n until: async () => {\n const result = await runCommand({\n command: \"launchctl\",\n args: [\"print\", launchdServiceKey],\n throwOnError: false,\n });\n if (result.exitCode !== 0 && !isLaunchdServiceMissing(result)) {\n throw buildServiceManagerProbeError(\"launchctl print\", result);\n }\n return isLaunchdServiceMissing(result);\n },\n onTimeout: async () => {\n const status = await buildLaunchdManager(pathInput).status();\n return buildSystemServiceWaitTimeoutError({\n action: \"stopped\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n });\n },\n });\n },\n waitUntilRunning: async () => {\n await waitForCondition({\n until: async () =>\n (await buildLaunchdManager(pathInput).status()).running,\n onTimeout: async () => {\n const manager = buildLaunchdManager(pathInput);\n const status = await manager.status();\n // Diagnostic-only launchd job-state probe on timeout, mirroring the\n // `openmeld service run` startup path so the lifecycle journal can record a\n // never-spawned vs crash-loop verdict. Best-effort; never gates state.\n const jobDiagnostics = manager.readJobDiagnostics\n ? await manager.readJobDiagnostics().catch(() => null)\n : null;\n return buildSystemServiceWaitTimeoutError({\n action: \"running\",\n controller: LAUNCHD_CONTROLLER,\n details: formatManagerStatusDetails(status),\n jobDiagnostics,\n });\n },\n });\n },\n };\n}\n\nfunction buildWindowsManager(\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const identity = resolveDaemonServiceIdentity(pathInput);\n const scriptPath = resolveWindowsServiceScriptPath(pathInput);\n const task = (operation: WindowsUserTaskRequest[\"operation\"]) =>\n runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation,\n });\n const status = async (): Promise<DaemonServiceManagerRuntimeStatus> => {\n const observed = await task(\"status\");\n if (observed.actionArguments !== null) {\n const action = readWindowsTaskAction(observed.actionArguments);\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: `Task Scheduler: ${identity.windowsServiceName} (current user)`,\n commandSummary: [\n quoteWindowsArg(action.executable),\n ...action.args.map(quoteWindowsArg),\n ].join(\" \"),\n commandSpec: action,\n environmentTarget: serviceEnvironmentTarget(action.env),\n };\n }\n return {\n installed: observed.installed,\n running: observed.running,\n enabled: observed.enabled,\n definitionPath: observed.installed ? scriptPath : null,\n commandSummary: observed.installed\n ? await readWindowsRunnerCommandSummary(scriptPath)\n : null,\n environmentTarget: observed.installed\n ? await readDaemonServiceEnvironmentTargetFromDefinition({\n controller: WINDOWS_CONTROLLER,\n path: scriptPath,\n })\n : null,\n };\n };\n const wait = async (action: \"absent\" | \"stopped\" | \"running\") => {\n await waitForCondition({\n until: async () => {\n const current = await status();\n if (action === \"running\") {\n return current.running;\n }\n return action === \"stopped\" ? !current.running : !current.installed;\n },\n onTimeout: async () =>\n buildSystemServiceWaitTimeoutError({\n action,\n controller: WINDOWS_CONTROLLER,\n details: formatManagerStatusDetails(await status()),\n }),\n });\n };\n return {\n controller: WINDOWS_CONTROLLER,\n install: async (spec) => {\n await ensureServiceLogDirectory(pathInput);\n await runWindowsUserTask({\n name: identity.windowsServiceName,\n legacyScript: scriptPath,\n operation: \"install\",\n executable: windowsPowerShellPath(),\n arguments: windowsTaskActionArguments({\n ...spec,\n logPath: getDaemonSystemServiceLogPath(pathInput),\n }),\n workingDirectory:\n spec.workingDirectory ?? daemonRuntimeRootPath(pathInput),\n });\n assertServiceRegistrationInstalledAndEnabled(\n WINDOWS_CONTROLLER,\n await status()\n );\n await rm(scriptPath, { force: true });\n },\n uninstall: async () => {\n await task(\"uninstall\");\n await rm(scriptPath, { force: true });\n },\n enableAutostart: async () => {\n await task(\"enable\");\n },\n disableAutostart: async () => {\n await task(\"disable\");\n },\n start: async () => {\n await task(\"enable\");\n await task(\"start\");\n },\n stop: async () => {\n await task(\"disable\");\n await task(\"stop\");\n },\n deactivate: async () => {\n await task(\"stop\");\n },\n status,\n readJobDiagnostics: async () => null,\n waitUntilAbsent: () => wait(\"absent\"),\n waitUntilStopped: () => wait(\"stopped\"),\n waitUntilRunning: () => wait(\"running\"),\n };\n}\n\nexport async function readWindowsRunnerCommandSummary(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const lines = file\n .split(WINDOWS_SCRIPT_LINE_SPLIT_PATTERN)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index];\n if (!line) {\n continue;\n }\n const normalizedLine = line.toLowerCase();\n if (\n !(\n normalizedLine === \"@echo off\" ||\n normalizedLine === \"setlocal\" ||\n normalizedLine.startsWith(\"set \")\n )\n ) {\n return line;\n }\n }\n return null;\n}\n\nasync function readSystemServiceCommandSummary(\n path: string,\n prefix: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const line = file\n .split(\"\\n\")\n .map((entry) => entry.trim())\n .find((entry) => entry.startsWith(prefix));\n if (!line) {\n return null;\n }\n return line.slice(prefix.length).trim() || null;\n}\n\nasync function readLaunchdProgramArguments(\n path: string\n): Promise<string | null> {\n const file = await readFile(path, \"utf8\").catch(() => null);\n if (!file) {\n return null;\n }\n const matches = [...file.matchAll(LAUNCHD_STRING_PATTERN)].map(\n (match) => match[1]\n );\n if (matches.length === 0) {\n return null;\n }\n return matches.join(\" \");\n}\n\nconst SERVICE_ENVIRONMENT_TARGET_KEYS = {\n preset: \"OPENMELD_ENV_PRESET\",\n gatewayUrl: \"OPENMELD_GATEWAY_URL\",\n authBaseUrl: \"OPENMELD_AUTH_URL\",\n userFacingCommand: \"OPENMELD_USER_FACING_CLI_COMMAND\",\n} as const;\n\nexport function parseDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): OpenMeldEnvironmentTarget | null {\n return serviceEnvironmentTarget(\n parseDaemonServiceEnvironmentFromDefinition(input)\n );\n}\n\nexport function parseDaemonServiceEnvironmentFromDefinition(input: {\n controller: DaemonServiceController;\n definition: string;\n}): Record<string, string> {\n if (input.controller === SYSTEMD_CONTROLLER) {\n return parseSystemdEnvironment(input.definition);\n }\n if (input.controller === LAUNCHD_CONTROLLER) {\n return parseLaunchdEnvironment(input.definition);\n }\n return parseWindowsEnvironment(input.definition);\n}\n\nfunction serviceEnvironmentTarget(\n environment: Record<string, string>\n): OpenMeldEnvironmentTarget | null {\n const preset = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.preset];\n const gatewayUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.gatewayUrl];\n const authBaseUrl = environment[SERVICE_ENVIRONMENT_TARGET_KEYS.authBaseUrl];\n const userFacingCommand =\n environment[SERVICE_ENVIRONMENT_TARGET_KEYS.userFacingCommand];\n if (\n !(\n (preset === \"prod\" || preset === \"canary\" || preset === \"dev-local\") &&\n gatewayUrl &&\n authBaseUrl &&\n userFacingCommand\n )\n ) {\n return null;\n }\n return {\n preset,\n gatewayUrl,\n authBaseUrl,\n userFacingCommand,\n };\n}\n\nasync function readDaemonServiceEnvironmentTargetFromDefinition(input: {\n controller: DaemonServiceController;\n path: string;\n}): Promise<OpenMeldEnvironmentTarget | null> {\n const definition = await readFile(input.path, \"utf8\").catch(() => null);\n if (!definition) {\n return null;\n }\n return parseDaemonServiceEnvironmentTargetFromDefinition({\n controller: input.controller,\n definition,\n });\n}\n\nfunction parseSystemdEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line.startsWith(\"Environment=\")) {\n continue;\n }\n const assignment = line.slice(\"Environment=\".length);\n const separatorIndex = assignment.indexOf(\"=\");\n if (separatorIndex <= 0) {\n continue;\n }\n const key = assignment.slice(0, separatorIndex);\n let value = assignment.slice(separatorIndex + 1);\n if (value.startsWith('\"') && value.endsWith('\"')) {\n value = value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n }\n environment[key] = value;\n }\n return environment;\n}\n\nfunction parseLaunchdEnvironment(definition: string): Record<string, string> {\n const environmentBlock = definition.match(\n LAUNCHD_ENVIRONMENT_BLOCK_PATTERN\n )?.[1];\n if (!environmentBlock) {\n return {};\n }\n const environment: Record<string, string> = {};\n for (const match of environmentBlock.matchAll(\n /<key>([^<]+)<\\/key>\\s*<string>([^<]*)<\\/string>/g\n )) {\n const key = decodeXmlText(match[1] ?? \"\");\n if (!key) {\n continue;\n }\n environment[key] = decodeXmlText(match[2] ?? \"\");\n }\n return environment;\n}\n\nfunction parseWindowsEnvironment(definition: string): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const rawLine of definition.split(WINDOWS_LINE_SEPARATOR_PATTERN)) {\n const match = rawLine.trim().match(WINDOWS_ENVIRONMENT_ASSIGNMENT_PATTERN);\n if (!(match?.[1] && match[2] !== undefined)) {\n continue;\n }\n environment[match[1]] = match[2].replace(/\\\\\"/g, '\"');\n }\n return environment;\n}\n\nfunction decodeXmlText(value: string): string {\n return value\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, \">\")\n .replace(/&lt;/g, \"<\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction isSystemdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"systemctl\",\n args: [\"--user\", \"--version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isLaunchdAvailable(): Promise<boolean> {\n return runCommand({\n command: \"launchctl\",\n args: [\"version\"],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nfunction isWindowsTaskSchedulerAvailable(): Promise<boolean> {\n return runCommand({\n command: windowsPowerShellPath(),\n args: [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"$ErrorActionPreference='Stop'; $s=New-Object -ComObject Schedule.Service; $s.Connect()\",\n ],\n throwOnError: false,\n }).then((result) => result.exitCode === 0);\n}\n\nasync function ensureServiceLogDirectory(\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<void> {\n await mkdir(dirname(getDaemonSystemServiceLogPath(pathInput)), {\n recursive: true,\n });\n}\n\nexport function guardDaemonServiceManagerMutations(\n manager: DaemonServiceManager,\n pathInput: OpenMeldPathResolutionInput = {}\n): DaemonServiceManager {\n const assertMutationAllowed = async (operation: string): Promise<void> => {\n assertSafePublishedProductionServiceRegistrationMutation(\n operation,\n pathInput\n );\n if (resolveOpenMeldEnvPreset(pathInput) !== \"dev-local\") {\n return;\n }\n const status = await manager.status();\n if (!status.installed) {\n return;\n }\n const env =\n status.commandSpec?.env ??\n (status.definitionPath\n ? parseDaemonServiceEnvironmentFromDefinition({\n controller: manager.controller,\n definition: await readFile(status.definitionPath, \"utf8\"),\n })\n : {});\n if (\n env.OPENMELD_ENV_PRESET !== \"dev-local\" ||\n !env.OPENMELD_HOME ||\n resolve(env.OPENMELD_HOME) !== resolve(resolveOpenMeldRootDir(pathInput))\n ) {\n throw new Error(\n `Cannot ${operation} OpenMeld Service: its registered development home does not match this environment.`\n );\n }\n };\n return {\n ...manager,\n install: async (spec) => {\n await assertMutationAllowed(\"install\");\n await manager.install(spec);\n },\n uninstall: async () => {\n await assertMutationAllowed(\"uninstall\");\n await manager.uninstall();\n },\n enableAutostart: async () => {\n await assertMutationAllowed(\"enable autostart for\");\n await manager.enableAutostart();\n },\n disableAutostart: async () => {\n await assertMutationAllowed(\"disable autostart for\");\n await manager.disableAutostart();\n },\n start: async () => {\n await assertMutationAllowed(\"start\");\n await manager.start();\n },\n stop: async () => {\n await assertMutationAllowed(\"stop\");\n await manager.stop();\n },\n deactivate: async () => {\n await assertMutationAllowed(\"deactivate\");\n await manager.deactivate();\n },\n };\n}\n\nexport async function resolveDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n const manager = await resolveUnguardedDaemonServiceManager(\n controller,\n pathInput\n );\n return manager\n ? guardDaemonServiceManagerMutations(manager, pathInput)\n : null;\n}\n\nasync function resolveUnguardedDaemonServiceManager(\n controller?: DaemonServiceController,\n pathInput: OpenMeldPathResolutionInput = {}\n): Promise<DaemonServiceManager | null> {\n if (controller === SYSTEMD_CONTROLLER) {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (controller === LAUNCHD_CONTROLLER) {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (controller === WINDOWS_CONTROLLER) {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n if (process.platform === \"darwin\") {\n if (!(await isLaunchdAvailable())) {\n return null;\n }\n return buildLaunchdManager(pathInput);\n }\n if (process.platform === \"linux\") {\n if (!(await isSystemdAvailable())) {\n return null;\n }\n return buildSystemdManager(pathInput);\n }\n if (process.platform === \"win32\") {\n if (!(await isWindowsTaskSchedulerAvailable())) {\n return null;\n }\n return buildWindowsManager(pathInput);\n }\n\n return null;\n}\n"],"mappings":"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"}