@mono-agent/agent-app 0.19.0 → 0.20.0

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 (303) hide show
  1. package/README.md +304 -32
  2. package/dist/acp-bridge.d.ts.map +1 -1
  3. package/dist/acp-bridge.js +113 -54
  4. package/dist/acp-bridge.js.map +1 -1
  5. package/dist/acp-session-store.d.ts +12 -0
  6. package/dist/acp-session-store.d.ts.map +1 -0
  7. package/dist/acp-session-store.js +74 -0
  8. package/dist/acp-session-store.js.map +1 -0
  9. package/dist/agent-artifact-paths.d.ts +8 -0
  10. package/dist/agent-artifact-paths.d.ts.map +1 -0
  11. package/dist/agent-artifact-paths.js +11 -0
  12. package/dist/agent-artifact-paths.js.map +1 -0
  13. package/dist/agent-root-coordinator.d.ts +101 -0
  14. package/dist/agent-root-coordinator.d.ts.map +1 -0
  15. package/dist/agent-root-coordinator.js +470 -0
  16. package/dist/agent-root-coordinator.js.map +1 -0
  17. package/dist/app-controller-channels.d.ts +11 -1
  18. package/dist/app-controller-channels.d.ts.map +1 -1
  19. package/dist/app-controller-channels.js +145 -20
  20. package/dist/app-controller-channels.js.map +1 -1
  21. package/dist/app-controller-continuation.d.ts +2 -0
  22. package/dist/app-controller-continuation.d.ts.map +1 -1
  23. package/dist/app-controller-continuation.js.map +1 -1
  24. package/dist/app-controller-lifecycle.d.ts +5 -0
  25. package/dist/app-controller-lifecycle.d.ts.map +1 -1
  26. package/dist/app-controller-lifecycle.js +24 -5
  27. package/dist/app-controller-lifecycle.js.map +1 -1
  28. package/dist/app-controller-maintenance.d.ts +2 -0
  29. package/dist/app-controller-maintenance.d.ts.map +1 -1
  30. package/dist/app-controller-maintenance.js +32 -2
  31. package/dist/app-controller-maintenance.js.map +1 -1
  32. package/dist/app-controller-process-jobs.d.ts +46 -0
  33. package/dist/app-controller-process-jobs.d.ts.map +1 -0
  34. package/dist/app-controller-process-jobs.js +281 -0
  35. package/dist/app-controller-process-jobs.js.map +1 -0
  36. package/dist/app-controller-responder.d.ts +15 -0
  37. package/dist/app-controller-responder.d.ts.map +1 -1
  38. package/dist/app-controller-responder.js +146 -12
  39. package/dist/app-controller-responder.js.map +1 -1
  40. package/dist/app-controller-traceability.d.ts +6 -0
  41. package/dist/app-controller-traceability.d.ts.map +1 -1
  42. package/dist/app-controller-traceability.js +10 -0
  43. package/dist/app-controller-traceability.js.map +1 -1
  44. package/dist/app-controller-utils.d.ts +8 -0
  45. package/dist/app-controller-utils.d.ts.map +1 -1
  46. package/dist/app-controller-utils.js +24 -1
  47. package/dist/app-controller-utils.js.map +1 -1
  48. package/dist/app-controller.d.ts +40 -1
  49. package/dist/app-controller.d.ts.map +1 -1
  50. package/dist/app-controller.js +124 -39
  51. package/dist/app-controller.js.map +1 -1
  52. package/dist/background-log-maintenance.d.ts +85 -2
  53. package/dist/background-log-maintenance.d.ts.map +1 -1
  54. package/dist/background-log-maintenance.js +407 -136
  55. package/dist/background-log-maintenance.js.map +1 -1
  56. package/dist/background-runtime.d.ts.map +1 -1
  57. package/dist/background-runtime.js +22 -41
  58. package/dist/background-runtime.js.map +1 -1
  59. package/dist/background.d.ts +18 -26
  60. package/dist/background.d.ts.map +1 -1
  61. package/dist/background.js +83 -138
  62. package/dist/background.js.map +1 -1
  63. package/dist/channel-drivers/cron.d.ts +12 -1
  64. package/dist/channel-drivers/cron.d.ts.map +1 -1
  65. package/dist/channel-drivers/cron.js +121 -18
  66. package/dist/channel-drivers/cron.js.map +1 -1
  67. package/dist/channel-drivers/native-notify.d.ts +3 -0
  68. package/dist/channel-drivers/native-notify.d.ts.map +1 -1
  69. package/dist/channel-drivers/native-notify.js +2 -1
  70. package/dist/channel-drivers/native-notify.js.map +1 -1
  71. package/dist/channel-drivers/slack.d.ts.map +1 -1
  72. package/dist/channel-drivers/slack.js +41 -4
  73. package/dist/channel-drivers/slack.js.map +1 -1
  74. package/dist/channel-drivers/telegram.d.ts.map +1 -1
  75. package/dist/channel-drivers/telegram.js +46 -3
  76. package/dist/channel-drivers/telegram.js.map +1 -1
  77. package/dist/channel-drivers/tui.d.ts +13 -2
  78. package/dist/channel-drivers/tui.d.ts.map +1 -1
  79. package/dist/channel-drivers/tui.js +112 -3
  80. package/dist/channel-drivers/tui.js.map +1 -1
  81. package/dist/channels.d.ts +1 -1
  82. package/dist/channels.d.ts.map +1 -1
  83. package/dist/channels.js +4 -2
  84. package/dist/channels.js.map +1 -1
  85. package/dist/cli-args.d.ts +15 -1
  86. package/dist/cli-args.d.ts.map +1 -1
  87. package/dist/cli-args.js +82 -12
  88. package/dist/cli-args.js.map +1 -1
  89. package/dist/cli-background-command.d.ts +9 -2
  90. package/dist/cli-background-command.d.ts.map +1 -1
  91. package/dist/cli-background-command.js +174 -66
  92. package/dist/cli-background-command.js.map +1 -1
  93. package/dist/cli-commands.d.ts.map +1 -1
  94. package/dist/cli-commands.js +50 -12
  95. package/dist/cli-commands.js.map +1 -1
  96. package/dist/cli-help.d.ts.map +1 -1
  97. package/dist/cli-help.js +21 -1
  98. package/dist/cli-help.js.map +1 -1
  99. package/dist/config-reference.d.ts.map +1 -1
  100. package/dist/config-reference.js +99 -2
  101. package/dist/config-reference.js.map +1 -1
  102. package/dist/configured-agent.d.ts +44 -3
  103. package/dist/configured-agent.d.ts.map +1 -1
  104. package/dist/configured-agent.js +805 -156
  105. package/dist/configured-agent.js.map +1 -1
  106. package/dist/conversation-state-roots.d.ts +59 -0
  107. package/dist/conversation-state-roots.d.ts.map +1 -0
  108. package/dist/conversation-state-roots.js +248 -0
  109. package/dist/conversation-state-roots.js.map +1 -0
  110. package/dist/cron-control-store.d.ts +91 -0
  111. package/dist/cron-control-store.d.ts.map +1 -0
  112. package/dist/cron-control-store.js +1251 -0
  113. package/dist/cron-control-store.js.map +1 -0
  114. package/dist/cron-operator-service.d.ts +54 -0
  115. package/dist/cron-operator-service.d.ts.map +1 -0
  116. package/dist/cron-operator-service.js +352 -0
  117. package/dist/cron-operator-service.js.map +1 -0
  118. package/dist/doctor-session-history.d.ts +9 -0
  119. package/dist/doctor-session-history.d.ts.map +1 -0
  120. package/dist/doctor-session-history.js +313 -0
  121. package/dist/doctor-session-history.js.map +1 -0
  122. package/dist/doctor.d.ts +2 -1
  123. package/dist/doctor.d.ts.map +1 -1
  124. package/dist/doctor.js +320 -9
  125. package/dist/doctor.js.map +1 -1
  126. package/dist/index.d.ts +4 -0
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/interaction-bridge.d.ts +1 -0
  131. package/dist/interaction-bridge.d.ts.map +1 -1
  132. package/dist/interaction-bridge.js +54 -6
  133. package/dist/interaction-bridge.js.map +1 -1
  134. package/dist/jobs-command.d.ts +17 -0
  135. package/dist/jobs-command.d.ts.map +1 -0
  136. package/dist/jobs-command.js +207 -0
  137. package/dist/jobs-command.js.map +1 -0
  138. package/dist/launchd-lifecycle-lock.d.ts +36 -0
  139. package/dist/launchd-lifecycle-lock.d.ts.map +1 -0
  140. package/dist/launchd-lifecycle-lock.js +124 -0
  141. package/dist/launchd-lifecycle-lock.js.map +1 -0
  142. package/dist/launchd-log-monitor-status.d.ts +7 -0
  143. package/dist/launchd-log-monitor-status.d.ts.map +1 -0
  144. package/dist/launchd-log-monitor-status.js +224 -0
  145. package/dist/launchd-log-monitor-status.js.map +1 -0
  146. package/dist/launchd-logs.d.ts +9 -1
  147. package/dist/launchd-logs.d.ts.map +1 -1
  148. package/dist/launchd-logs.js +69 -16
  149. package/dist/launchd-logs.js.map +1 -1
  150. package/dist/launchd-maintenance-command.d.ts +10 -0
  151. package/dist/launchd-maintenance-command.d.ts.map +1 -0
  152. package/dist/launchd-maintenance-command.js +2 -0
  153. package/dist/launchd-maintenance-command.js.map +1 -0
  154. package/dist/launchd-maintenance-entry.d.ts +30 -0
  155. package/dist/launchd-maintenance-entry.d.ts.map +1 -0
  156. package/dist/launchd-maintenance-entry.js +206 -0
  157. package/dist/launchd-maintenance-entry.js.map +1 -0
  158. package/dist/launchd-maintenance-gate.d.ts +28 -0
  159. package/dist/launchd-maintenance-gate.d.ts.map +1 -0
  160. package/dist/launchd-maintenance-gate.js +80 -0
  161. package/dist/launchd-maintenance-gate.js.map +1 -0
  162. package/dist/launchd-private-files.d.ts +3 -0
  163. package/dist/launchd-private-files.d.ts.map +1 -0
  164. package/dist/launchd-private-files.js +58 -0
  165. package/dist/launchd-private-files.js.map +1 -0
  166. package/dist/launchd.d.ts +56 -2
  167. package/dist/launchd.d.ts.map +1 -1
  168. package/dist/launchd.js +210 -5
  169. package/dist/launchd.js.map +1 -1
  170. package/dist/local-configuration.d.ts.map +1 -1
  171. package/dist/local-configuration.js +33 -7
  172. package/dist/local-configuration.js.map +1 -1
  173. package/dist/managed-launchd-maintenance-environment.d.ts +3 -0
  174. package/dist/managed-launchd-maintenance-environment.d.ts.map +1 -0
  175. package/dist/managed-launchd-maintenance-environment.js +12 -0
  176. package/dist/managed-launchd-maintenance-environment.js.map +1 -0
  177. package/dist/managed-runtime-launch-proof.d.ts +11 -0
  178. package/dist/managed-runtime-launch-proof.d.ts.map +1 -0
  179. package/dist/managed-runtime-launch-proof.js +59 -0
  180. package/dist/managed-runtime-launch-proof.js.map +1 -0
  181. package/dist/managed-runtime-maintenance-entry.d.ts +10 -0
  182. package/dist/managed-runtime-maintenance-entry.d.ts.map +1 -0
  183. package/dist/managed-runtime-maintenance-entry.js +244 -0
  184. package/dist/managed-runtime-maintenance-entry.js.map +1 -0
  185. package/dist/managed-web-logs.d.ts +29 -11
  186. package/dist/managed-web-logs.d.ts.map +1 -1
  187. package/dist/managed-web-logs.js +244 -121
  188. package/dist/managed-web-logs.js.map +1 -1
  189. package/dist/managed-web-maintenance-environment.d.ts +6 -0
  190. package/dist/managed-web-maintenance-environment.d.ts.map +1 -0
  191. package/dist/managed-web-maintenance-environment.js +19 -0
  192. package/dist/managed-web-maintenance-environment.js.map +1 -0
  193. package/dist/mcp-apps.d.ts +37 -0
  194. package/dist/mcp-apps.d.ts.map +1 -0
  195. package/dist/mcp-apps.js +1753 -0
  196. package/dist/mcp-apps.js.map +1 -0
  197. package/dist/memory-command.d.ts +12 -0
  198. package/dist/memory-command.d.ts.map +1 -1
  199. package/dist/memory-command.js +510 -1
  200. package/dist/memory-command.js.map +1 -1
  201. package/dist/modules/known-tools.d.ts +1 -1
  202. package/dist/modules/known-tools.d.ts.map +1 -1
  203. package/dist/modules/known-tools.js +2 -0
  204. package/dist/modules/known-tools.js.map +1 -1
  205. package/dist/posted-reply-history.d.ts.map +1 -1
  206. package/dist/posted-reply-history.js +12 -0
  207. package/dist/posted-reply-history.js.map +1 -1
  208. package/dist/proactive-notify.d.ts +4 -1
  209. package/dist/proactive-notify.d.ts.map +1 -1
  210. package/dist/proactive-notify.js +43 -5
  211. package/dist/proactive-notify.js.map +1 -1
  212. package/dist/process-jobs-config.d.ts +82 -0
  213. package/dist/process-jobs-config.d.ts.map +1 -0
  214. package/dist/process-jobs-config.js +423 -0
  215. package/dist/process-jobs-config.js.map +1 -0
  216. package/dist/process-jobs-context.d.ts +24 -0
  217. package/dist/process-jobs-context.d.ts.map +1 -0
  218. package/dist/process-jobs-context.js +135 -0
  219. package/dist/process-jobs-context.js.map +1 -0
  220. package/dist/process-jobs-root-registry.d.ts +115 -0
  221. package/dist/process-jobs-root-registry.d.ts.map +1 -0
  222. package/dist/process-jobs-root-registry.js +978 -0
  223. package/dist/process-jobs-root-registry.js.map +1 -0
  224. package/dist/process-jobs-runtime.d.ts +35 -0
  225. package/dist/process-jobs-runtime.d.ts.map +1 -0
  226. package/dist/process-jobs-runtime.js +177 -0
  227. package/dist/process-jobs-runtime.js.map +1 -0
  228. package/dist/process-jobs-service.d.ts +70 -0
  229. package/dist/process-jobs-service.d.ts.map +1 -0
  230. package/dist/process-jobs-service.js +1989 -0
  231. package/dist/process-jobs-service.js.map +1 -0
  232. package/dist/process-jobs-store.d.ts +151 -0
  233. package/dist/process-jobs-store.d.ts.map +1 -0
  234. package/dist/process-jobs-store.js +1290 -0
  235. package/dist/process-jobs-store.js.map +1 -0
  236. package/dist/reply-artifacts.d.ts +65 -0
  237. package/dist/reply-artifacts.d.ts.map +1 -0
  238. package/dist/reply-artifacts.js +1147 -0
  239. package/dist/reply-artifacts.js.map +1 -0
  240. package/dist/reply-part-budget.d.ts +16 -0
  241. package/dist/reply-part-budget.d.ts.map +1 -0
  242. package/dist/reply-part-budget.js +57 -0
  243. package/dist/reply-part-budget.js.map +1 -0
  244. package/dist/request-model-override.d.ts +19 -0
  245. package/dist/request-model-override.d.ts.map +1 -1
  246. package/dist/request-model-override.js +54 -1
  247. package/dist/request-model-override.js.map +1 -1
  248. package/dist/request-scoped-mcp.d.ts +31 -0
  249. package/dist/request-scoped-mcp.d.ts.map +1 -0
  250. package/dist/request-scoped-mcp.js +197 -0
  251. package/dist/request-scoped-mcp.js.map +1 -0
  252. package/dist/run-history.d.ts.map +1 -1
  253. package/dist/run-history.js +50 -254
  254. package/dist/run-history.js.map +1 -1
  255. package/dist/runtime-option-extensions.d.ts +21 -0
  256. package/dist/runtime-option-extensions.d.ts.map +1 -1
  257. package/dist/runtime-option-extensions.js +53 -0
  258. package/dist/runtime-option-extensions.js.map +1 -1
  259. package/dist/secure-file-replace.d.ts +3 -0
  260. package/dist/secure-file-replace.d.ts.map +1 -1
  261. package/dist/secure-file-replace.js +31 -7
  262. package/dist/secure-file-replace.js.map +1 -1
  263. package/dist/session-history.d.ts +146 -0
  264. package/dist/session-history.d.ts.map +1 -0
  265. package/dist/session-history.js +347 -0
  266. package/dist/session-history.js.map +1 -0
  267. package/dist/sessions.d.ts +45 -2
  268. package/dist/sessions.d.ts.map +1 -1
  269. package/dist/sessions.js +849 -30
  270. package/dist/sessions.js.map +1 -1
  271. package/dist/web-command.d.ts +12 -11
  272. package/dist/web-command.d.ts.map +1 -1
  273. package/dist/web-command.js +554 -80
  274. package/dist/web-command.js.map +1 -1
  275. package/dist/web-log-maintenance-command.d.ts +7 -0
  276. package/dist/web-log-maintenance-command.d.ts.map +1 -0
  277. package/dist/web-log-maintenance-command.js +21 -0
  278. package/dist/web-log-maintenance-command.js.map +1 -0
  279. package/dist/web-log-maintenance-status.d.ts +26 -0
  280. package/dist/web-log-maintenance-status.d.ts.map +1 -0
  281. package/dist/web-log-maintenance-status.js +171 -0
  282. package/dist/web-log-maintenance-status.js.map +1 -0
  283. package/dist/web-log-maintenance.d.ts +32 -0
  284. package/dist/web-log-maintenance.d.ts.map +1 -0
  285. package/dist/web-log-maintenance.js +163 -0
  286. package/dist/web-log-maintenance.js.map +1 -0
  287. package/dist/web-maintenance-paths.d.ts +12 -0
  288. package/dist/web-maintenance-paths.d.ts.map +1 -0
  289. package/dist/web-maintenance-paths.js +24 -0
  290. package/dist/web-maintenance-paths.js.map +1 -0
  291. package/dist/wizard/prompts.d.ts.map +1 -1
  292. package/dist/wizard/prompts.js +1 -0
  293. package/dist/wizard/prompts.js.map +1 -1
  294. package/dist/wizard/run.js +1 -1
  295. package/dist/wizard/run.js.map +1 -1
  296. package/package.json +15 -15
  297. package/schema/mono-agent.config.schema.json +102 -1
  298. package/skills/mono-agent-composer/references/config-blueprint.md +26 -2
  299. package/skills/mono-agent-composer/references/discovery-questions.md +2 -2
  300. package/skills/mono-agent-composer/references/feature-coverage.md +6 -4
  301. package/skills/mono-agent-composer/references/package-map.md +19 -3
  302. package/skills/mono-agent-composer/references/playbooks.md +3 -3
  303. package/skills/mono-agent-composer/references/validation.md +4 -2
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ import { basename, isAbsolute, resolve } from "node:path";
3
+ import process from "node:process";
4
+ import { fileURLToPath } from "node:url";
5
+ import { deriveLaunchdLabel, INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND, INTERNAL_WEB_LOG_MAINTENANCE_COMMAND, launchdMaintenanceDispersionSeconds, launchdWebMaintenanceInfo, launchdPathsFor, MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV, MANAGED_WEB_LOG_MAINTENANCE_ENV, webMaintenanceDispersionSeconds, } from "./launchd.js";
6
+ import { MANAGED_LAUNCHD_MAINTENANCE_ENTRY_FILE } from "./launchd-maintenance-command.js";
7
+ import { defaultLaunchdMaintenanceGateDependencies, withLaunchdMaintenanceControllerLock, } from "./launchd-maintenance-gate.js";
8
+ import { sanitizeManagedLaunchdLogMaintenanceEnvironment } from "./managed-launchd-maintenance-environment.js";
9
+ import { sanitizeManagedWebLogMaintenanceEnvironment } from "./managed-web-maintenance-environment.js";
10
+ import { verifyManagedRuntimeMaintenanceEntrypoint, } from "./managed-runtime-maintenance-entry.js";
11
+ import { parseWebLogMaintenanceArguments } from "./web-log-maintenance-command.js";
12
+ export function defaultLaunchdMaintenanceEntryDependencies() {
13
+ return {
14
+ gate: defaultLaunchdMaintenanceGateDependencies(),
15
+ pathsForLabel: (label) => launchdPathsFor(label),
16
+ verifyEntrypoint: verifyManagedRuntimeMaintenanceEntrypoint,
17
+ loadHeavy: async () => await import("./cli-background-command.js"),
18
+ loadWebHeavy: async () => await import("./web-log-maintenance.js"),
19
+ inspectWebHelper: launchdWebMaintenanceInfo,
20
+ currentEntrypointPath: fileURLToPath(import.meta.url),
21
+ platform: process.platform,
22
+ sleep: wait,
23
+ stderr: (text) => void process.stderr.write(text),
24
+ };
25
+ }
26
+ /** Dedicated entry: deterministic dispersion and the per-agent lease precede heavy imports. */
27
+ export async function runLaunchdMaintenanceEntry(argv, env = process.env, deps = defaultLaunchdMaintenanceEntryDependencies()) {
28
+ const command = argv[0];
29
+ const agentMarked = env[MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV] === "1";
30
+ const webMarked = env[MANAGED_WEB_LOG_MAINTENANCE_ENV] === "1";
31
+ if (command === INTERNAL_WEB_LOG_MAINTENANCE_COMMAND) {
32
+ if (!webMarked || agentMarked) {
33
+ safeStderr(deps, "The web log maintenance command is reserved for its exact managed LaunchAgent marker.");
34
+ return 2;
35
+ }
36
+ let webArgs;
37
+ try {
38
+ webArgs = parseWebLogMaintenanceArguments(argv);
39
+ }
40
+ catch (error) {
41
+ safeStderr(deps, safeError(error));
42
+ return 2;
43
+ }
44
+ sanitizeManagedWebLogMaintenanceEnvironment(env);
45
+ if (deps.platform !== "darwin") {
46
+ safeStderr(deps, "Scheduled web log maintenance is only available on macOS launchd.");
47
+ return 1;
48
+ }
49
+ try {
50
+ // Mirror the agent helper's pre-import, pre-lock RunAtLoad dispersion.
51
+ await deps.sleep(webMaintenanceDispersionSeconds() * 1_000);
52
+ await deps.verifyEntrypoint({
53
+ currentEntrypointPath: deps.currentEntrypointPath,
54
+ launchProof: webArgs.expectedManagedRuntimeLaunch,
55
+ });
56
+ const helperPid = deps.gate.currentPid();
57
+ const helper = await (deps.inspectWebHelper ?? launchdWebMaintenanceInfo)(deps.gate.runner, deps.gate.getuid());
58
+ const definition = helper.definition;
59
+ if (!helper.loaded
60
+ || helper.pid !== helperPid
61
+ || !deps.gate.isAlive(helperPid)
62
+ || definition === undefined
63
+ || definition.nodePath !== process.execPath
64
+ || definition.cliPath !== deps.currentEntrypointPath
65
+ || definition.expectedManagedRuntimeLaunch !== webArgs.expectedManagedRuntimeLaunch
66
+ || definition.expectedWebPlistIdentity !== webArgs.expectedWebPlistIdentity) {
67
+ throw new Error("launchd does not own this exact web-maintenance helper definition and pid");
68
+ }
69
+ const heavy = await (deps.loadWebHeavy ?? (async () => await import("./web-log-maintenance.js")))();
70
+ return await heavy.runWebLogMaintenanceCommand(webArgs);
71
+ }
72
+ catch (error) {
73
+ safeStderr(deps, `Scheduled web maintenance could not establish its dispersed attested boundary: ${safeError(error)}`);
74
+ return 1;
75
+ }
76
+ }
77
+ if (command !== INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND) {
78
+ safeStderr(deps, agentMarked || webMarked
79
+ ? "The managed log-maintenance marker cannot authorize another command."
80
+ : "The launchd maintenance entry only accepts its reserved managed command.");
81
+ return 2;
82
+ }
83
+ if (!agentMarked || webMarked) {
84
+ safeStderr(deps, "The launchd log maintenance command is reserved for its managed LaunchAgent.");
85
+ return 2;
86
+ }
87
+ sanitizeManagedLaunchdLogMaintenanceEnvironment(env);
88
+ if (deps.platform !== "darwin") {
89
+ safeStderr(deps, "Scheduled log maintenance is only available on macOS launchd.");
90
+ return 1;
91
+ }
92
+ let args;
93
+ try {
94
+ args = parseManagedArguments(argv);
95
+ }
96
+ catch (error) {
97
+ safeStderr(deps, safeError(error));
98
+ return 2;
99
+ }
100
+ const configPath = resolve(args.configPath);
101
+ const label = deriveLaunchdLabel(configPath);
102
+ const target = { label, paths: deps.pathsForLabel(label) };
103
+ try {
104
+ // RunAtLoad starts every helper together. Preserve N/N recovery coverage
105
+ // while spreading the heavy boundary deterministically without new lock
106
+ // authority or stale-owner state.
107
+ await deps.sleep(launchdMaintenanceDispersionSeconds(label) * 1_000);
108
+ return await withLaunchdMaintenanceControllerLock(target, deps.gate, async (ownership) => {
109
+ await deps.verifyEntrypoint({
110
+ currentEntrypointPath: deps.currentEntrypointPath,
111
+ launchProof: args.expectedManagedRuntimeLaunch,
112
+ });
113
+ const heavy = await deps.loadHeavy();
114
+ return await heavy.runLaunchdLogMaintenanceCommandWithLifecycleLease(args, ownership);
115
+ });
116
+ }
117
+ catch (error) {
118
+ safeStderr(deps, `Scheduled recovery could not establish its dispersed attested ownership boundary: ${safeError(error)}`);
119
+ return 1;
120
+ }
121
+ }
122
+ function wait(milliseconds) {
123
+ return new Promise((resolvePromise) => setTimeout(resolvePromise, milliseconds));
124
+ }
125
+ function parseManagedArguments(argv) {
126
+ const required = [
127
+ "--config",
128
+ "--controller-cli",
129
+ "--agent-cwd",
130
+ "--agent-path",
131
+ "--expected-managed-runtime-launch",
132
+ ];
133
+ let index = 1;
134
+ const values = [];
135
+ for (const flag of required) {
136
+ if (argv[index++] !== flag)
137
+ throw new Error(`Managed launchd recovery requires ${flag}.`);
138
+ const value = argv[index++];
139
+ if (value === undefined || value.length === 0 || hasControlCharacter(value)) {
140
+ throw new Error(`Managed launchd recovery received an invalid ${flag} value.`);
141
+ }
142
+ values.push(value);
143
+ }
144
+ let envFile;
145
+ if (argv[index] === "--env-file") {
146
+ envFile = argv[index + 1];
147
+ index += 2;
148
+ if (envFile === undefined || !isAbsolute(envFile) || hasControlCharacter(envFile)) {
149
+ throw new Error("Managed launchd recovery received an invalid --env-file value.");
150
+ }
151
+ }
152
+ if (index !== argv.length)
153
+ throw new Error("Managed launchd recovery received unexpected arguments.");
154
+ const [configPath, controllerCliPath, agentCwd, agentPath, expectedManagedRuntimeLaunch] = values;
155
+ if (![configPath, controllerCliPath, agentCwd].every((path) => isAbsolute(path))) {
156
+ throw new Error("Managed launchd recovery requires absolute config, controller CLI, and agent cwd paths.");
157
+ }
158
+ if (!/^[0-9A-Za-z_-]+$/u.test(expectedManagedRuntimeLaunch)) {
159
+ throw new Error("Managed launchd recovery received a malformed runtime launch proof.");
160
+ }
161
+ return {
162
+ configPath,
163
+ controllerCliPath,
164
+ agentCwd,
165
+ agentPath,
166
+ expectedManagedRuntimeLaunch,
167
+ ...(envFile === undefined ? {} : { envFile }),
168
+ };
169
+ }
170
+ function safeStderr(deps, message) {
171
+ const line = `[error] ${message}\n`;
172
+ try {
173
+ const reported = deps.stderr(line);
174
+ if (reported !== undefined)
175
+ void Promise.resolve(reported).catch(() => undefined);
176
+ }
177
+ catch {
178
+ // Reporter failure never becomes an unhandled rejection or widens authority.
179
+ }
180
+ }
181
+ function safeError(error) {
182
+ return (error instanceof Error ? error.message : String(error))
183
+ .replace(/[\u0000-\u001f\u007f]+/gu, " ")
184
+ .replace(/\b(token|secret|password|api[-_]?key|authorization)\s*[=:]\s*\S+/giu, "$1=<redacted>")
185
+ .replace(/\bBearer\s+\S+/giu, "Bearer <redacted>")
186
+ .replace(/(?:\/[A-Za-z0-9._~!$&'()+,;=:@%-]+){2,}/gu, "<path>")
187
+ .replace(/\s+/gu, " ")
188
+ .trim()
189
+ .slice(0, 512);
190
+ }
191
+ function hasControlCharacter(value) {
192
+ return /[\u0000-\u001f\u007f]/u.test(value);
193
+ }
194
+ const entryName = process.argv[1] === undefined ? undefined : basename(process.argv[1]);
195
+ if (entryName === MANAGED_LAUNCHD_MAINTENANCE_ENTRY_FILE) {
196
+ runLaunchdMaintenanceEntry(process.argv.slice(2))
197
+ .then((code) => {
198
+ if (code !== 0)
199
+ process.exitCode = code;
200
+ })
201
+ .catch((error) => {
202
+ process.stderr.write(`[error] Launchd maintenance failed: ${safeError(error)}\n`);
203
+ process.exitCode = 1;
204
+ });
205
+ }
206
+ //# sourceMappingURL=launchd-maintenance-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-maintenance-entry.js","sourceRoot":"","sources":["../src/launchd-maintenance-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { LaunchctlRunner } from "./launchd.js";
2
+ import type { BackgroundLifecycleTarget, BackgroundLockAcquireOptions } from "./launchd-lifecycle-lock.js";
3
+ declare const OWNED_MAINTENANCE_LIFECYCLE: unique symbol;
4
+ export interface LaunchdMaintenanceLifecycleLease {
5
+ readonly label: string;
6
+ readonly pid: number;
7
+ readonly [OWNED_MAINTENANCE_LIFECYCLE]: true;
8
+ }
9
+ export interface LaunchdMaintenanceGateDependencies {
10
+ readonly runner: LaunchctlRunner;
11
+ readonly getuid: () => number;
12
+ readonly currentPid: () => number;
13
+ readonly isAlive: (pid: number) => boolean;
14
+ readonly acquireLifecycleLock: (target: BackgroundLifecycleTarget, options?: BackgroundLockAcquireOptions) => Promise<(() => Promise<void>) | undefined>;
15
+ readonly stderr: (text: string) => void | Promise<void>;
16
+ }
17
+ export declare function defaultLaunchdMaintenanceGateDependencies(): LaunchdMaintenanceGateDependencies;
18
+ /**
19
+ * Authenticate the exact launchd-owned helper, then own its per-agent lifecycle
20
+ * lock nonblocking before invoking any caller-supplied inspection or import.
21
+ * The account-wide log lock is deliberately acquired later, only around the
22
+ * shared-chain mutation that actually needs it.
23
+ */
24
+ export declare function withLaunchdMaintenanceControllerLock(target: BackgroundLifecycleTarget, deps: LaunchdMaintenanceGateDependencies, operation: (ownership: LaunchdMaintenanceLifecycleLease) => Promise<number>): Promise<number>;
25
+ /** Reject heavy reconciliation calls that did not cross this authenticated gate. */
26
+ export declare function assertLaunchdMaintenanceLifecycleLease(ownership: LaunchdMaintenanceLifecycleLease, target: BackgroundLifecycleTarget): void;
27
+ export {};
28
+ //# sourceMappingURL=launchd-maintenance-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-maintenance-gate.d.ts","sourceRoot":"","sources":["../src/launchd-maintenance-gate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAIrC,QAAA,MAAM,2BAA2B,eAAgD,CAAC;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,2BAA2B,CAAC,EAAE,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,wBAAgB,yCAAyC,IAAI,kCAAkC,CAS9F;AAED;;;;;GAKG;AACH,wBAAsB,oCAAoC,CACxD,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,kCAAkC,EACxC,SAAS,EAAE,CAAC,SAAS,EAAE,gCAAgC,KAAK,OAAO,CAAC,MAAM,CAAC,GAC1E,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED,oFAAoF;AACpF,wBAAgB,sCAAsC,CACpD,SAAS,EAAE,gCAAgC,EAC3C,MAAM,EAAE,yBAAyB,GAChC,IAAI,CAMN"}
@@ -0,0 +1,80 @@
1
+ import process from "node:process";
2
+ import { deriveLaunchdMaintenanceLabel, launchdServiceInfo, makeLaunchctlRunner, } from "./launchd.js";
3
+ import { acquireFilesystemLifecycleLock, } from "./launchd-lifecycle-lock.js";
4
+ import { maintenanceErrorMessage } from "./background-lifecycle-utils.js";
5
+ import * as ui from "./ui.js";
6
+ const OWNED_MAINTENANCE_LIFECYCLE = Symbol("owned-launchd-maintenance-lifecycle");
7
+ export function defaultLaunchdMaintenanceGateDependencies() {
8
+ return {
9
+ runner: makeLaunchctlRunner(),
10
+ getuid: () => process.getuid?.() ?? 0,
11
+ currentPid: () => process.pid,
12
+ isAlive: processIsAlive,
13
+ acquireLifecycleLock: acquireFilesystemLifecycleLock,
14
+ stderr: (text) => void process.stderr.write(text),
15
+ };
16
+ }
17
+ /**
18
+ * Authenticate the exact launchd-owned helper, then own its per-agent lifecycle
19
+ * lock nonblocking before invoking any caller-supplied inspection or import.
20
+ * The account-wide log lock is deliberately acquired later, only around the
21
+ * shared-chain mutation that actually needs it.
22
+ */
23
+ export async function withLaunchdMaintenanceControllerLock(target, deps, operation) {
24
+ const helperLabel = deriveLaunchdMaintenanceLabel(target.label);
25
+ const helperPid = deps.currentPid();
26
+ const helperService = await launchdServiceInfo(deps.runner, helperLabel, deps.getuid());
27
+ if (!helperService.loaded || helperService.pid !== helperPid || !deps.isAlive(helperPid)) {
28
+ reportFailure(target, deps, "authenticate the launchd-owned recovery controller", new Error(`launchd does not own this helper pid ${helperPid}`));
29
+ return 1;
30
+ }
31
+ const releasePerAgent = await deps.acquireLifecycleLock(target, {
32
+ purpose: "lifecycle",
33
+ waitTimeoutMs: 0,
34
+ });
35
+ if (releasePerAgent === undefined)
36
+ return 0;
37
+ try {
38
+ return await operation({
39
+ label: target.label,
40
+ pid: helperPid,
41
+ [OWNED_MAINTENANCE_LIFECYCLE]: true,
42
+ });
43
+ }
44
+ finally {
45
+ await releasePerAgent().catch((error) => {
46
+ safeStderr(deps, ui.errorLine(`Could not release lifecycle lock for ${target.label}: ${maintenanceErrorMessage(error)}`));
47
+ });
48
+ }
49
+ }
50
+ /** Reject heavy reconciliation calls that did not cross this authenticated gate. */
51
+ export function assertLaunchdMaintenanceLifecycleLease(ownership, target) {
52
+ if (ownership?.[OWNED_MAINTENANCE_LIFECYCLE] !== true
53
+ || ownership.label !== target.label
54
+ || ownership.pid !== process.pid) {
55
+ throw new Error("Launchd maintenance requires the authenticated per-agent lifecycle capability.");
56
+ }
57
+ }
58
+ function reportFailure(target, deps, action, error) {
59
+ safeStderr(deps, ui.errorLine(`Scheduled log maintenance could not ${action} for ${target.label}: ${maintenanceErrorMessage(error)}`));
60
+ }
61
+ function safeStderr(deps, text) {
62
+ try {
63
+ const reported = deps.stderr(text);
64
+ if (reported !== undefined)
65
+ void Promise.resolve(reported).catch(() => undefined);
66
+ }
67
+ catch {
68
+ // A reporter cannot change lock ownership, helper lifecycle, or rejection.
69
+ }
70
+ }
71
+ function processIsAlive(pid) {
72
+ try {
73
+ process.kill(pid, 0);
74
+ return true;
75
+ }
76
+ catch (error) {
77
+ return error?.code === "EPERM";
78
+ }
79
+ }
80
+ //# sourceMappingURL=launchd-maintenance-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-maintenance-gate.js","sourceRoot":"","sources":["../src/launchd-maintenance-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Secure one account-owned launchd state directory without following links. */
2
+ export declare function ensureOwnerPrivateLaunchdDirectory(path: string): Promise<void>;
3
+ //# sourceMappingURL=launchd-private-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-private-files.d.ts","sourceRoot":"","sources":["../src/launchd-private-files.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,wBAAsB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCpF"}
@@ -0,0 +1,58 @@
1
+ import { constants as fsConstants } from "node:fs";
2
+ import { lstat, mkdir, open } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import process from "node:process";
5
+ /** Secure one account-owned launchd state directory without following links. */
6
+ export async function ensureOwnerPrivateLaunchdDirectory(path) {
7
+ const parent = dirname(path);
8
+ const parentDetails = await lstat(parent);
9
+ assertOwnerDirectory(parentDetails, parent, "LaunchAgent parent");
10
+ try {
11
+ await mkdir(path, { mode: 0o700 });
12
+ }
13
+ catch (error) {
14
+ if (!isErrno(error, "EEXIST"))
15
+ throw error;
16
+ }
17
+ const parentAfter = await lstat(parent);
18
+ assertOwnerDirectory(parentAfter, parent, "LaunchAgent parent");
19
+ if (!sameFilesystemIdentity(parentDetails, parentAfter)) {
20
+ throw new Error(`LaunchAgent parent ${parent} changed while ${path} was created.`);
21
+ }
22
+ const handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);
23
+ try {
24
+ const before = await handle.stat();
25
+ assertOwnerDirectory(before, path, "LaunchAgent directory");
26
+ await handle.chmod(0o700);
27
+ const secured = await handle.stat();
28
+ if (!sameFilesystemIdentity(before, secured)) {
29
+ throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
30
+ }
31
+ assertOwnerDirectory(secured, path, "LaunchAgent directory");
32
+ if ((secured.mode & 0o077) !== 0) {
33
+ throw new Error(`LaunchAgent directory ${path} must be owner-only.`);
34
+ }
35
+ const current = await lstat(path);
36
+ if (!sameFilesystemIdentity(secured, current)) {
37
+ throw new Error(`LaunchAgent directory ${path} changed while it was secured.`);
38
+ }
39
+ }
40
+ finally {
41
+ await handle.close();
42
+ }
43
+ }
44
+ function assertOwnerDirectory(details, path, description) {
45
+ if (!details.isDirectory() || details.isSymbolicLink()) {
46
+ throw new Error(`${description} ${path} must be a real directory.`);
47
+ }
48
+ if (typeof process.getuid === "function" && details.uid !== process.getuid()) {
49
+ throw new Error(`${description} ${path} is not owned by the current user.`);
50
+ }
51
+ }
52
+ function sameFilesystemIdentity(left, right) {
53
+ return left.dev === right.dev && left.ino === right.ino;
54
+ }
55
+ function isErrno(error, code) {
56
+ return error?.code === code;
57
+ }
58
+ //# sourceMappingURL=launchd-private-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-private-files.js","sourceRoot":"","sources":["../src/launchd-private-files.ts"],"names":[],"mappings":"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"}
package/dist/launchd.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { MANAGED_WEB_LOG_MAINTENANCE_ENV } from "./managed-web-maintenance-environment.js";
1
2
  /**
2
3
  * Thin, side-effect-light helpers around macOS launchd. The `launchctl` runner
3
4
  * is injectable so orchestration can be unit tested without touching the real
@@ -39,7 +40,7 @@ export interface PlistInput {
39
40
  export interface MaintenancePlistInput {
40
41
  readonly label: string;
41
42
  readonly nodePath: string;
42
- /** Immutable CLI closure that executes the recovery controller itself. */
43
+ /** Attested lightweight executable in the immutable managed closure. */
43
44
  readonly cliPath: string;
44
45
  readonly configPath: string;
45
46
  readonly cwd: string;
@@ -47,10 +48,25 @@ export interface MaintenancePlistInput {
47
48
  readonly controllerCliPath: string;
48
49
  readonly agentCwd: string;
49
50
  readonly agentPath: string;
51
+ /** Path-free proof covering the managed marker, main CLI, and helper entry. */
52
+ readonly expectedManagedRuntimeLaunch: string;
50
53
  readonly envFile?: string;
51
54
  /** Deliberately allowlisted, non-secret maintenance environment. */
52
55
  readonly environment: Readonly<Record<string, string>>;
53
- readonly intervalSeconds: number;
56
+ /** Minute in each hour derived from the canonical main LaunchAgent label. */
57
+ readonly calendarMinute: number;
58
+ }
59
+ export interface WebMaintenancePlistInput {
60
+ readonly label: typeof WEB_MAINTENANCE_LAUNCHD_LABEL;
61
+ readonly nodePath: string;
62
+ /** The same attested lightweight entry used by agent maintenance. */
63
+ readonly cliPath: string;
64
+ readonly cwd: string;
65
+ readonly expectedManagedRuntimeLaunch: string;
66
+ /** Fresh dev:ino:size:sha256 identity of the paired main web plist. */
67
+ readonly expectedWebPlistIdentity: string;
68
+ readonly environment: Readonly<Record<string, string>>;
69
+ readonly calendarMinute: number;
54
70
  }
55
71
  export interface WebPlistInput {
56
72
  readonly label: string;
@@ -86,8 +102,23 @@ export interface LaunchdManagedWorkerInfo extends LaunchdServiceInfo {
86
102
  /** Present only when launchctl exposes the exact current producer shape. */
87
103
  readonly definition?: LaunchdManagedWorkerDefinition;
88
104
  }
105
+ export interface LaunchdWebMaintenanceDefinition {
106
+ readonly plistPath: string;
107
+ readonly nodePath: string;
108
+ readonly cliPath: string;
109
+ readonly cwd: string;
110
+ readonly expectedManagedRuntimeLaunch: string;
111
+ readonly expectedWebPlistIdentity: string;
112
+ }
113
+ export interface LaunchdWebMaintenanceInfo extends LaunchdServiceInfo {
114
+ /** Present only when launchctl exposes the exact cached helper definition. */
115
+ readonly definition?: LaunchdWebMaintenanceDefinition;
116
+ }
89
117
  export declare const INTERNAL_LAUNCHD_LOG_MAINTENANCE_COMMAND = "__launchd-log-maintenance";
90
118
  export declare const MANAGED_LAUNCHD_LOG_MAINTENANCE_ENV = "MONO_AGENT_MANAGED_LOG_MAINTENANCE";
119
+ export declare const WEB_LAUNCHD_LABEL = "com.mono-agent-web";
120
+ export declare const WEB_MAINTENANCE_LAUNCHD_LABEL = "com.mono-agent-web-maintenance";
121
+ export declare const INTERNAL_WEB_LOG_MAINTENANCE_COMMAND = "__web-log-maintenance";
91
122
  /**
92
123
  * A stable, launchd-legal label derived from the resolved config path. The
93
124
  * folder name keeps it human-readable; an 8-char hash of the absolute config
@@ -102,7 +133,18 @@ export declare function launchdPathsFor(label: string, home?: string): LaunchdPa
102
133
  * not mistake a scheduled one-shot helper for an extra agent.
103
134
  */
104
135
  export declare function deriveLaunchdMaintenanceLabel(mainLabel: string): string;
136
+ /** Deterministically stagger recurring helpers by the canonical main label. */
137
+ export declare function launchdMaintenanceCalendarMinute(canonicalMainLabel: string): number;
138
+ export declare const LAUNCHD_MAINTENANCE_DISPERSION_SECONDS = 120;
139
+ /** Spread login helpers before PID authentication, locking, or heavy import. */
140
+ export declare function launchdMaintenanceDispersionSeconds(canonicalMainLabel: string): number;
141
+ /** Web has a fixed label and therefore a distinct exact-label schedule validator. */
142
+ export declare function webMaintenanceCalendarMinute(label?: string): number;
143
+ /** Mirror agent RunAtLoad dispersion without admitting the web label to agent grammar. */
144
+ export declare function webMaintenanceDispersionSeconds(label?: string): number;
105
145
  export declare function launchdMaintenancePathsFor(mainLabel: string, home?: string): LaunchdMaintenancePaths;
146
+ /** Canonical lightweight helper next to the attested managed-runtime CLI. */
147
+ export declare function launchdMaintenanceEntrypointPathForCli(cliPath: string): string;
106
148
  export declare function escapeXml(value: string): string;
107
149
  /**
108
150
  * The plist runs the blocking worker through `/usr/bin/env -i`. Clearing the
@@ -113,14 +155,20 @@ export declare function escapeXml(value: string): string;
113
155
  export declare function buildPlistXml(input: PlistInput): string;
114
156
  /** Scheduled one-shot recovery controller. It owns no logs and never KeepAlives. */
115
157
  export declare function buildLaunchdMaintenancePlistXml(input: MaintenancePlistInput): string;
158
+ /** Scheduled one-shot web log controller. It never owns a KeepAlive or log stream. */
159
+ export declare function buildWebMaintenancePlistXml(input: WebMaintenancePlistInput): string;
116
160
  /** Always-on web-console LaunchAgent. It runs the public blocking `web run` worker. */
117
161
  export declare function buildWebPlistXml(input: WebPlistInput): string;
118
162
  /** Exact argv persisted by the managed LaunchAgent producer. */
119
163
  export declare function buildLaunchdProgramArguments(input: PlistInput): readonly string[];
120
164
  /** Exact argv persisted by the private scheduled maintenance LaunchAgent. */
121
165
  export declare function buildLaunchdMaintenanceProgramArguments(input: MaintenancePlistInput): readonly string[];
166
+ /** Exact argv persisted by the private scheduled web-maintenance LaunchAgent. */
167
+ export declare function buildWebMaintenanceProgramArguments(input: WebMaintenancePlistInput): readonly string[];
122
168
  /** Exact argv persisted for the always-on web console. */
123
169
  export declare function buildWebLaunchdProgramArguments(input: WebPlistInput): readonly string[];
170
+ export declare function buildEnvironmentArguments(environment: Readonly<Record<string, string>>): string[];
171
+ export declare function assertWebPlistIdentity(value: string): void;
124
172
  /**
125
173
  * PATH for the background worker: the launching shell's PATH (so the user's
126
174
  * toolchain is reachable) plus Homebrew/usr-local in case launchd started from
@@ -141,12 +189,18 @@ export declare function launchdServiceInfo(runner: LaunchctlRunner, label: strin
141
189
  * distinguish during upgrades.
142
190
  */
143
191
  export declare function launchdManagedWorkerInfo(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchdManagedWorkerInfo>;
192
+ /** Read the cached definition, not merely the mutable helper plist on disk. */
193
+ export declare function launchdWebMaintenanceInfo(runner: LaunchctlRunner, uid: number): Promise<LaunchdWebMaintenanceInfo>;
194
+ /** Parse only the exact cached web-helper definition emitted by this producer. */
195
+ export declare function parseLaunchdWebMaintenanceDefinition(output: string): LaunchdWebMaintenanceDefinition | undefined;
144
196
  /** Parse only the exact managed-worker launchctl-print shape emitted here. */
145
197
  export declare function parseLaunchdManagedWorkerDefinition(output: string): LaunchdManagedWorkerDefinition | undefined;
146
198
  /** Parse only launchd's top-level `pid = N` field; never infer a pid from noise. */
147
199
  export declare function parseLaunchdServicePid(output: string): number | undefined;
148
200
  /** Bootstrap (load + RunAtLoad-launch) the plist. Caller tolerates "already bootstrapped". */
149
201
  export declare function bootstrap(runner: LaunchctlRunner, plistPath: string, uid: number): Promise<LaunchctlResult>;
202
+ /** Ask launchd to start a loaded one-shot service without replacing a running instance. */
203
+ export declare function kickstart(runner: LaunchctlRunner, label: string, uid: number): Promise<LaunchctlResult>;
150
204
  /**
151
205
  * Remove the service from the domain. Sends SIGTERM and — unlike a plain kill —
152
206
  * prevents KeepAlive from relaunching it. Caller tolerates "not loaded".
@@ -1 +1 @@
1
- {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"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"}