@mono-agent/agent-app 0.20.11 → 0.21.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 (369) hide show
  1. package/README.md +260 -98
  2. package/dist/adapter-send-tools.d.ts +3 -2
  3. package/dist/adapter-send-tools.d.ts.map +1 -1
  4. package/dist/adapter-send-tools.js +15 -5
  5. package/dist/adapter-send-tools.js.map +1 -1
  6. package/dist/app-controller-channels.d.ts +6 -0
  7. package/dist/app-controller-channels.d.ts.map +1 -1
  8. package/dist/app-controller-channels.js +29 -2
  9. package/dist/app-controller-channels.js.map +1 -1
  10. package/dist/app-controller-continuation.d.ts.map +1 -1
  11. package/dist/app-controller-continuation.js +2 -3
  12. package/dist/app-controller-continuation.js.map +1 -1
  13. package/dist/app-controller-lifecycle.d.ts +4 -0
  14. package/dist/app-controller-lifecycle.d.ts.map +1 -1
  15. package/dist/app-controller-lifecycle.js +7 -0
  16. package/dist/app-controller-lifecycle.js.map +1 -1
  17. package/dist/app-controller-maintenance.d.ts +3 -1
  18. package/dist/app-controller-maintenance.d.ts.map +1 -1
  19. package/dist/app-controller-maintenance.js +3 -0
  20. package/dist/app-controller-maintenance.js.map +1 -1
  21. package/dist/app-controller-monitors.d.ts +26 -0
  22. package/dist/app-controller-monitors.d.ts.map +1 -0
  23. package/dist/app-controller-monitors.js +127 -0
  24. package/dist/app-controller-monitors.js.map +1 -0
  25. package/dist/app-controller-responder.d.ts +9 -17
  26. package/dist/app-controller-responder.d.ts.map +1 -1
  27. package/dist/app-controller-responder.js +54 -86
  28. package/dist/app-controller-responder.js.map +1 -1
  29. package/dist/app-controller-traceability.d.ts.map +1 -1
  30. package/dist/app-controller-traceability.js +3 -0
  31. package/dist/app-controller-traceability.js.map +1 -1
  32. package/dist/app-controller-types.d.ts +1 -0
  33. package/dist/app-controller-types.d.ts.map +1 -1
  34. package/dist/app-controller-utils.d.ts +1 -5
  35. package/dist/app-controller-utils.d.ts.map +1 -1
  36. package/dist/app-controller-utils.js +4 -21
  37. package/dist/app-controller-utils.js.map +1 -1
  38. package/dist/app-controller.d.ts +26 -10
  39. package/dist/app-controller.d.ts.map +1 -1
  40. package/dist/app-controller.js +39 -1
  41. package/dist/app-controller.js.map +1 -1
  42. package/dist/artifact-retention.js +11 -0
  43. package/dist/artifact-retention.js.map +1 -1
  44. package/dist/background.d.ts +0 -6
  45. package/dist/background.d.ts.map +1 -1
  46. package/dist/background.js +5 -58
  47. package/dist/background.js.map +1 -1
  48. package/dist/channel-drivers/slack.d.ts.map +1 -1
  49. package/dist/channel-drivers/slack.js +18 -0
  50. package/dist/channel-drivers/slack.js.map +1 -1
  51. package/dist/channel-drivers/telegram.d.ts.map +1 -1
  52. package/dist/channel-drivers/telegram.js +26 -0
  53. package/dist/channel-drivers/telegram.js.map +1 -1
  54. package/dist/channel-drivers/tui.d.ts +68 -8
  55. package/dist/channel-drivers/tui.d.ts.map +1 -1
  56. package/dist/channel-drivers/tui.js +407 -89
  57. package/dist/channel-drivers/tui.js.map +1 -1
  58. package/dist/channel-runtime-controls.d.ts +2 -1
  59. package/dist/channel-runtime-controls.d.ts.map +1 -1
  60. package/dist/channel-runtime-controls.js +79 -22
  61. package/dist/channel-runtime-controls.js.map +1 -1
  62. package/dist/cli-args.d.ts +5 -8
  63. package/dist/cli-args.d.ts.map +1 -1
  64. package/dist/cli-args.js +33 -52
  65. package/dist/cli-args.js.map +1 -1
  66. package/dist/cli-background-command.d.ts.map +1 -1
  67. package/dist/cli-background-command.js +4 -0
  68. package/dist/cli-background-command.js.map +1 -1
  69. package/dist/cli-commands.d.ts.map +1 -1
  70. package/dist/cli-commands.js +24 -2
  71. package/dist/cli-commands.js.map +1 -1
  72. package/dist/cli-help.d.ts +26 -0
  73. package/dist/cli-help.d.ts.map +1 -1
  74. package/dist/cli-help.js +58 -53
  75. package/dist/cli-help.js.map +1 -1
  76. package/dist/cli-init-command.d.ts +1 -2
  77. package/dist/cli-init-command.d.ts.map +1 -1
  78. package/dist/cli-init-command.js +31 -71
  79. package/dist/cli-init-command.js.map +1 -1
  80. package/dist/cli-install-skill-command.d.ts.map +1 -1
  81. package/dist/cli-install-skill-command.js +12 -3
  82. package/dist/cli-install-skill-command.js.map +1 -1
  83. package/dist/config-reference.d.ts +1 -0
  84. package/dist/config-reference.d.ts.map +1 -1
  85. package/dist/config-reference.js +217 -60
  86. package/dist/config-reference.js.map +1 -1
  87. package/dist/configured-agent.d.ts +27 -4
  88. package/dist/configured-agent.d.ts.map +1 -1
  89. package/dist/configured-agent.js +159 -112
  90. package/dist/configured-agent.js.map +1 -1
  91. package/dist/conversation-title.d.ts.map +1 -1
  92. package/dist/conversation-title.js +9 -2
  93. package/dist/conversation-title.js.map +1 -1
  94. package/dist/cron-control-store.d.ts.map +1 -1
  95. package/dist/cron-control-store.js +4 -2
  96. package/dist/cron-control-store.js.map +1 -1
  97. package/dist/doctor.d.ts +7 -13
  98. package/dist/doctor.d.ts.map +1 -1
  99. package/dist/doctor.js +406 -770
  100. package/dist/doctor.js.map +1 -1
  101. package/dist/first-run-readiness.d.ts.map +1 -1
  102. package/dist/first-run-readiness.js +0 -6
  103. package/dist/first-run-readiness.js.map +1 -1
  104. package/dist/index.d.ts +2 -0
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +1 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/interaction-bridge.d.ts +3 -3
  109. package/dist/interaction-bridge.d.ts.map +1 -1
  110. package/dist/interaction-bridge.js +27 -10
  111. package/dist/interaction-bridge.js.map +1 -1
  112. package/dist/launchd.d.ts +2 -0
  113. package/dist/launchd.d.ts.map +1 -1
  114. package/dist/launchd.js +3 -0
  115. package/dist/launchd.js.map +1 -1
  116. package/dist/local-tui-session.d.ts +14 -0
  117. package/dist/local-tui-session.d.ts.map +1 -0
  118. package/dist/local-tui-session.js +100 -0
  119. package/dist/local-tui-session.js.map +1 -0
  120. package/dist/mcp-apps.d.ts.map +1 -1
  121. package/dist/mcp-apps.js +3 -0
  122. package/dist/mcp-apps.js.map +1 -1
  123. package/dist/memory-journal.d.ts +53 -0
  124. package/dist/memory-journal.d.ts.map +1 -0
  125. package/dist/memory-journal.js +586 -0
  126. package/dist/memory-journal.js.map +1 -0
  127. package/dist/memory-recall.d.ts.map +1 -1
  128. package/dist/memory-recall.js +16 -2
  129. package/dist/memory-recall.js.map +1 -1
  130. package/dist/memory-remember.d.ts +49 -0
  131. package/dist/memory-remember.d.ts.map +1 -0
  132. package/dist/memory-remember.js +190 -0
  133. package/dist/memory-remember.js.map +1 -0
  134. package/dist/memory-retrieval.d.ts +33 -0
  135. package/dist/memory-retrieval.d.ts.map +1 -1
  136. package/dist/memory-retrieval.js +43 -0
  137. package/dist/memory-retrieval.js.map +1 -1
  138. package/dist/model-effort-capabilities.d.ts +8 -9
  139. package/dist/model-effort-capabilities.d.ts.map +1 -1
  140. package/dist/model-effort-capabilities.js +17 -35
  141. package/dist/model-effort-capabilities.js.map +1 -1
  142. package/dist/modules/base.d.ts +3 -4
  143. package/dist/modules/base.d.ts.map +1 -1
  144. package/dist/modules/base.js +4 -6
  145. package/dist/modules/base.js.map +1 -1
  146. package/dist/modules/catalog.d.ts.map +1 -1
  147. package/dist/modules/catalog.js +11 -9
  148. package/dist/modules/catalog.js.map +1 -1
  149. package/dist/modules/known-tools.d.ts +2 -2
  150. package/dist/modules/known-tools.d.ts.map +1 -1
  151. package/dist/modules/known-tools.js +7 -0
  152. package/dist/modules/known-tools.js.map +1 -1
  153. package/dist/monitor-channel-routing.d.ts +20 -0
  154. package/dist/monitor-channel-routing.d.ts.map +1 -0
  155. package/dist/monitor-channel-routing.js +73 -0
  156. package/dist/monitor-channel-routing.js.map +1 -0
  157. package/dist/monitors-command.d.ts +23 -0
  158. package/dist/monitors-command.d.ts.map +1 -0
  159. package/dist/monitors-command.js +217 -0
  160. package/dist/monitors-command.js.map +1 -0
  161. package/dist/monitors-config.d.ts +77 -0
  162. package/dist/monitors-config.d.ts.map +1 -0
  163. package/dist/monitors-config.js +150 -0
  164. package/dist/monitors-config.js.map +1 -0
  165. package/dist/monitors-context.d.ts +58 -0
  166. package/dist/monitors-context.d.ts.map +1 -0
  167. package/dist/monitors-context.js +194 -0
  168. package/dist/monitors-context.js.map +1 -0
  169. package/dist/monitors-runtime.d.ts +36 -0
  170. package/dist/monitors-runtime.d.ts.map +1 -0
  171. package/dist/monitors-runtime.js +103 -0
  172. package/dist/monitors-runtime.js.map +1 -0
  173. package/dist/monitors-service.d.ts +71 -0
  174. package/dist/monitors-service.d.ts.map +1 -0
  175. package/dist/monitors-service.js +1796 -0
  176. package/dist/monitors-service.js.map +1 -0
  177. package/dist/monitors-store.d.ts +93 -0
  178. package/dist/monitors-store.d.ts.map +1 -0
  179. package/dist/monitors-store.js +313 -0
  180. package/dist/monitors-store.js.map +1 -0
  181. package/dist/notify-destinations.d.ts +3 -2
  182. package/dist/notify-destinations.d.ts.map +1 -1
  183. package/dist/notify-destinations.js +6 -7
  184. package/dist/notify-destinations.js.map +1 -1
  185. package/dist/posted-reply-history.d.ts.map +1 -1
  186. package/dist/posted-reply-history.js +40 -3
  187. package/dist/posted-reply-history.js.map +1 -1
  188. package/dist/proactive-notify.d.ts +20 -1
  189. package/dist/proactive-notify.d.ts.map +1 -1
  190. package/dist/proactive-notify.js +56 -3
  191. package/dist/proactive-notify.js.map +1 -1
  192. package/dist/process-job-channel-routing.js +2 -1
  193. package/dist/process-job-channel-routing.js.map +1 -1
  194. package/dist/process-job-output-tail.d.ts +53 -0
  195. package/dist/process-job-output-tail.d.ts.map +1 -0
  196. package/dist/process-job-output-tail.js +257 -0
  197. package/dist/process-job-output-tail.js.map +1 -0
  198. package/dist/process-jobs-config.d.ts +1 -1
  199. package/dist/process-jobs-config.js +1 -1
  200. package/dist/process-jobs-config.js.map +1 -1
  201. package/dist/process-jobs-context.d.ts +11 -1
  202. package/dist/process-jobs-context.d.ts.map +1 -1
  203. package/dist/process-jobs-context.js +55 -11
  204. package/dist/process-jobs-context.js.map +1 -1
  205. package/dist/process-jobs-protection.js +1 -1
  206. package/dist/process-jobs-protection.js.map +1 -1
  207. package/dist/process-jobs-runtime.d.ts.map +1 -1
  208. package/dist/process-jobs-runtime.js +15 -12
  209. package/dist/process-jobs-runtime.js.map +1 -1
  210. package/dist/process-jobs-service.d.ts.map +1 -1
  211. package/dist/process-jobs-service.js +118 -172
  212. package/dist/process-jobs-service.js.map +1 -1
  213. package/dist/process-jobs-store.d.ts +3 -1
  214. package/dist/process-jobs-store.d.ts.map +1 -1
  215. package/dist/process-jobs-store.js +4 -1
  216. package/dist/process-jobs-store.js.map +1 -1
  217. package/dist/process-output-redaction.d.ts +58 -0
  218. package/dist/process-output-redaction.d.ts.map +1 -0
  219. package/dist/process-output-redaction.js +311 -0
  220. package/dist/process-output-redaction.js.map +1 -0
  221. package/dist/project-skills.d.ts +11 -5
  222. package/dist/project-skills.d.ts.map +1 -1
  223. package/dist/project-skills.js +88 -39
  224. package/dist/project-skills.js.map +1 -1
  225. package/dist/provider-auth-checks.d.ts +27 -0
  226. package/dist/provider-auth-checks.d.ts.map +1 -0
  227. package/dist/provider-auth-checks.js +349 -0
  228. package/dist/provider-auth-checks.js.map +1 -0
  229. package/dist/provider-auth-observations.d.ts +22 -0
  230. package/dist/provider-auth-observations.d.ts.map +1 -0
  231. package/dist/provider-auth-observations.js +139 -0
  232. package/dist/provider-auth-observations.js.map +1 -0
  233. package/dist/provider-auth-operator.d.ts +19 -0
  234. package/dist/provider-auth-operator.d.ts.map +1 -0
  235. package/dist/provider-auth-operator.js +560 -0
  236. package/dist/provider-auth-operator.js.map +1 -0
  237. package/dist/provider-auth-status.d.ts +20 -0
  238. package/dist/provider-auth-status.d.ts.map +1 -0
  239. package/dist/provider-auth-status.js +235 -0
  240. package/dist/provider-auth-status.js.map +1 -0
  241. package/dist/provider-model-catalog.d.ts +95 -0
  242. package/dist/provider-model-catalog.d.ts.map +1 -0
  243. package/dist/provider-model-catalog.js +550 -0
  244. package/dist/provider-model-catalog.js.map +1 -0
  245. package/dist/provider-setup.d.ts +26 -13
  246. package/dist/provider-setup.d.ts.map +1 -1
  247. package/dist/provider-setup.js +106 -130
  248. package/dist/provider-setup.js.map +1 -1
  249. package/dist/readiness-probe-worker.d.ts +1 -2
  250. package/dist/readiness-probe-worker.d.ts.map +1 -1
  251. package/dist/readiness-probe-worker.js +3 -8
  252. package/dist/readiness-probe-worker.js.map +1 -1
  253. package/dist/readiness-probe.d.ts +1 -1
  254. package/dist/readiness-probe.d.ts.map +1 -1
  255. package/dist/readiness-probe.js +3 -33
  256. package/dist/readiness-probe.js.map +1 -1
  257. package/dist/reply-artifacts.d.ts +3 -1
  258. package/dist/reply-artifacts.d.ts.map +1 -1
  259. package/dist/reply-artifacts.js +45 -10
  260. package/dist/reply-artifacts.js.map +1 -1
  261. package/dist/request-model-override.d.ts +14 -37
  262. package/dist/request-model-override.d.ts.map +1 -1
  263. package/dist/request-model-override.js +105 -143
  264. package/dist/request-model-override.js.map +1 -1
  265. package/dist/request-scoped-mcp.d.ts +3 -0
  266. package/dist/request-scoped-mcp.d.ts.map +1 -1
  267. package/dist/request-scoped-mcp.js +1 -1
  268. package/dist/request-scoped-mcp.js.map +1 -1
  269. package/dist/run-history.d.ts.map +1 -1
  270. package/dist/run-history.js +56 -13
  271. package/dist/run-history.js.map +1 -1
  272. package/dist/runtime-option-extensions.d.ts +2 -4
  273. package/dist/runtime-option-extensions.d.ts.map +1 -1
  274. package/dist/runtime-option-extensions.js +4 -8
  275. package/dist/runtime-option-extensions.js.map +1 -1
  276. package/dist/runtime-routes.d.ts +5 -5
  277. package/dist/runtime-routes.d.ts.map +1 -1
  278. package/dist/runtime-routes.js +29 -18
  279. package/dist/runtime-routes.js.map +1 -1
  280. package/dist/sandbox-settings-cleanup.d.ts +15 -0
  281. package/dist/sandbox-settings-cleanup.d.ts.map +1 -0
  282. package/dist/sandbox-settings-cleanup.js +88 -0
  283. package/dist/sandbox-settings-cleanup.js.map +1 -0
  284. package/dist/seen-conversations.d.ts +4 -3
  285. package/dist/seen-conversations.d.ts.map +1 -1
  286. package/dist/seen-conversations.js +6 -5
  287. package/dist/seen-conversations.js.map +1 -1
  288. package/dist/session-history.d.ts +14 -0
  289. package/dist/session-history.d.ts.map +1 -1
  290. package/dist/session-history.js +120 -5
  291. package/dist/session-history.js.map +1 -1
  292. package/dist/systemd-command.d.ts +8 -0
  293. package/dist/systemd-command.d.ts.map +1 -0
  294. package/dist/systemd-command.js +206 -0
  295. package/dist/systemd-command.js.map +1 -0
  296. package/dist/systemd.d.ts +51 -0
  297. package/dist/systemd.d.ts.map +1 -0
  298. package/dist/systemd.js +299 -0
  299. package/dist/systemd.js.map +1 -0
  300. package/dist/tool-output-artifacts.d.ts +4 -0
  301. package/dist/tool-output-artifacts.d.ts.map +1 -0
  302. package/dist/tool-output-artifacts.js +17 -0
  303. package/dist/tool-output-artifacts.js.map +1 -0
  304. package/dist/trigger-overrides.d.ts +6 -0
  305. package/dist/trigger-overrides.d.ts.map +1 -1
  306. package/dist/trigger-overrides.js +36 -4
  307. package/dist/trigger-overrides.js.map +1 -1
  308. package/dist/tui-command.d.ts +0 -45
  309. package/dist/tui-command.d.ts.map +1 -1
  310. package/dist/tui-command.js +27 -264
  311. package/dist/tui-command.js.map +1 -1
  312. package/dist/untrusted-text.d.ts +36 -0
  313. package/dist/untrusted-text.d.ts.map +1 -0
  314. package/dist/untrusted-text.js +150 -0
  315. package/dist/untrusted-text.js.map +1 -0
  316. package/dist/web-command.d.ts +3 -0
  317. package/dist/web-command.d.ts.map +1 -1
  318. package/dist/web-command.js +112 -7
  319. package/dist/web-command.js.map +1 -1
  320. package/dist/web-request-coordinator.d.ts +19 -0
  321. package/dist/web-request-coordinator.d.ts.map +1 -0
  322. package/dist/web-request-coordinator.js +242 -0
  323. package/dist/web-request-coordinator.js.map +1 -0
  324. package/dist/wizard/answers.d.ts +3 -9
  325. package/dist/wizard/answers.d.ts.map +1 -1
  326. package/dist/wizard/answers.js +11 -36
  327. package/dist/wizard/answers.js.map +1 -1
  328. package/dist/wizard/from-flags.d.ts +1 -2
  329. package/dist/wizard/from-flags.d.ts.map +1 -1
  330. package/dist/wizard/from-flags.js +8 -3
  331. package/dist/wizard/from-flags.js.map +1 -1
  332. package/dist/wizard/model-discovery.d.ts +7 -8
  333. package/dist/wizard/model-discovery.d.ts.map +1 -1
  334. package/dist/wizard/model-discovery.js +58 -431
  335. package/dist/wizard/model-discovery.js.map +1 -1
  336. package/dist/wizard/presets.js +2 -2
  337. package/dist/wizard/presets.js.map +1 -1
  338. package/dist/wizard/prompts.d.ts +13 -12
  339. package/dist/wizard/prompts.d.ts.map +1 -1
  340. package/dist/wizard/prompts.js +25 -45
  341. package/dist/wizard/prompts.js.map +1 -1
  342. package/dist/wizard/run.d.ts.map +1 -1
  343. package/dist/wizard/run.js +30 -153
  344. package/dist/wizard/run.js.map +1 -1
  345. package/package.json +18 -18
  346. package/schema/mono-agent.config.schema.json +301 -53
  347. package/skills/mono-agent-composer/SKILL.md +5 -5
  348. package/skills/mono-agent-composer/references/config-blueprint.md +61 -47
  349. package/skills/mono-agent-composer/references/discovery-questions.md +18 -18
  350. package/skills/mono-agent-composer/references/feature-coverage.md +39 -21
  351. package/skills/mono-agent-composer/references/package-map.md +26 -17
  352. package/skills/mono-agent-composer/references/playbooks.md +39 -28
  353. package/skills/mono-agent-composer/references/validation.md +4 -3
  354. package/dist/codex-model-catalog.d.ts +0 -15
  355. package/dist/codex-model-catalog.d.ts.map +0 -1
  356. package/dist/codex-model-catalog.js +0 -220
  357. package/dist/codex-model-catalog.js.map +0 -1
  358. package/dist/configuration-proposal-main.d.ts +0 -3
  359. package/dist/configuration-proposal-main.d.ts.map +0 -1
  360. package/dist/configuration-proposal-main.js +0 -13
  361. package/dist/configuration-proposal-main.js.map +0 -1
  362. package/dist/configuration-proposal-tool.d.ts +0 -33
  363. package/dist/configuration-proposal-tool.d.ts.map +0 -1
  364. package/dist/configuration-proposal-tool.js +0 -188
  365. package/dist/configuration-proposal-tool.js.map +0 -1
  366. package/dist/local-configuration.d.ts +0 -99
  367. package/dist/local-configuration.d.ts.map +0 -1
  368. package/dist/local-configuration.js +0 -1330
  369. package/dist/local-configuration.js.map +0 -1
@@ -0,0 +1,206 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { listTraceSources } from "@mono-agent/observability";
6
+ import { canonicalBackgroundConfigPath, resolveInstanceTarget } from "./background.js";
7
+ import { selectBackgroundOperationalEnvironment } from "./background-environment.js";
8
+ import { loadDurableBackgroundEnvironment } from "./background-snapshot.js";
9
+ import { ensureStartable } from "./cli-background-command.js";
10
+ import { hasCompletedManagedStartup } from "./managed-startup.js";
11
+ import { inspectSystemd, isSystemdUserManagerUnavailable, readSystemdDefinition, startSystemd, stopSystemd, systemdLogs, systemdUnitName, withSystemdLock, SYSTEMD_WEB_IDENTITY, } from "./systemd.js";
12
+ const cliPath = fileURLToPath(new URL("./cli.js", import.meta.url));
13
+ /** Clear the systemd manager's ambient environment; provider settings come from dotenv. */
14
+ function workerArgv(args, environment) {
15
+ return ["/usr/bin/env", "-i", ...Object.entries(environment).map(([key, value]) => `${key}=${value}`), process.execPath, "--", cliPath, ...args];
16
+ }
17
+ function operationalEnvironment(env) {
18
+ const selected = { ...selectBackgroundOperationalEnvironment(env) };
19
+ for (const key of ["XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME", "XDG_RUNTIME_DIR", "DBUS_SESSION_BUS_ADDRESS"]) {
20
+ if (env[key] !== undefined)
21
+ selected[key] = env[key];
22
+ }
23
+ return selected;
24
+ }
25
+ function statusFields(identity, service, ready) {
26
+ return { backend: "systemd-user", unit: systemdUnitName(identity), runtime: "dev (unmanaged)", ...service, ready };
27
+ }
28
+ function report(identity, service, ready, deps) {
29
+ const status = statusFields(identity, service, ready);
30
+ (deps.stdout ?? process.stdout).write(`${status.unit}: ${service.activeState}/${service.subState}; PID ${service.pid}; ready ${ready ? "yes" : "no"}\nRuntime: dev (unmanaged)\nStarted: ${service.startedAt || "—"}; boot enabled: ${service.enabled ? "yes" : "no"}\n`);
31
+ }
32
+ function reportAgentJson(identity, installed, service, ready, deps) {
33
+ const status = { backend: "systemd-user", unit: systemdUnitName(identity), runtime: "dev (unmanaged)", ...service, ready };
34
+ const present = installed || service.loadState !== "not-found";
35
+ (deps.stdout ?? process.stdout).write(`${JSON.stringify({
36
+ ok: ready,
37
+ instance: present ? {
38
+ pid: service.pid > 0 ? service.pid : null,
39
+ health: ready ? "running" : service.activeState === "failed" ? "crashed" : "stopped",
40
+ status: service.activeState,
41
+ configPath: identity,
42
+ startedAt: service.startedAt,
43
+ } : null,
44
+ others: [],
45
+ ...status,
46
+ })}\n`);
47
+ }
48
+ function processIsAlive(pid) {
49
+ try {
50
+ process.kill(pid, 0);
51
+ return true;
52
+ }
53
+ catch (error) {
54
+ return error.code === "EPERM";
55
+ }
56
+ }
57
+ export async function runSystemdAgentCommand(args, action, env, deps = {}) {
58
+ const stderr = deps.stderr ?? process.stderr;
59
+ try {
60
+ const identity = await canonicalBackgroundConfigPath(process.cwd(), args.configPath);
61
+ if (action === "logs")
62
+ return await systemdLogs(identity, args.follow, args.lines ?? 200, deps);
63
+ if (action === "stop") {
64
+ await withSystemdLock(identity, deps, () => stopSystemd(identity, deps));
65
+ (deps.stdout ?? process.stdout).write(`${systemdUnitName(identity)} stopped and removed.\n`);
66
+ return 0;
67
+ }
68
+ if (action === "restart" && args.clearSessions) {
69
+ throw new Error("Linux restart --clear-sessions is not supported yet. No service or conversation state was changed.");
70
+ }
71
+ // Read the installed cwd/env-file when inspecting or restarting from another directory.
72
+ const installed = await readSystemdDefinition(identity, deps);
73
+ const cwd = installed?.cwd ?? await realpath(process.cwd());
74
+ const envIndex = installed?.argv.indexOf("--env-file") ?? -1;
75
+ const envFile = args.envFile === undefined
76
+ ? (envIndex >= 0 ? installed?.argv[envIndex + 1] : undefined) ?? resolve(cwd, ".env")
77
+ : resolve(process.cwd(), args.envFile);
78
+ const environment = operationalEnvironment(env);
79
+ if (action === "status") {
80
+ const service = await inspectSystemd(identity, deps);
81
+ let healthy = false;
82
+ if (installed && service.activeState === "active" && service.pid > 0) {
83
+ try {
84
+ const effective = { ...await loadDurableBackgroundEnvironment({ cwd, envFile, operationalEnvironment: environment }), ...environment };
85
+ const target = await resolveInstanceTarget({ args: { configPath: identity, envFile }, env: effective, cwd, cliPath });
86
+ const traces = await listTraceSources({ registryDir: target.registryDir, staleAfterMs: target.staleAfterMs });
87
+ healthy = traces.sources.some((source) => source.configPath === identity && source.pid === service.pid && sourceReady(source));
88
+ }
89
+ catch {
90
+ stderr.write("Service state is available, but config/trace readiness could not be read. Inspect validate and logs.\n");
91
+ }
92
+ }
93
+ if (args.json === true)
94
+ reportAgentJson(identity, installed !== undefined, service, healthy, deps);
95
+ else
96
+ report(identity, service, healthy, deps);
97
+ return healthy ? 0 : 1;
98
+ }
99
+ const effective = { ...await loadDurableBackgroundEnvironment({ cwd, envFile, operationalEnvironment: environment }), ...environment };
100
+ const target = await resolveInstanceTarget({ args: { configPath: identity, envFile }, env: effective, cwd, cliPath });
101
+ const ready = async (service) => {
102
+ const result = await listTraceSources({ registryDir: target.registryDir, staleAfterMs: target.staleAfterMs });
103
+ return result.sources.some((source) => source.configPath === identity && source.pid === service.pid && sourceReady(source));
104
+ };
105
+ const preflight = await ensureStartable(args, effective, { cwd, configPath: identity });
106
+ if (!preflight.ok) {
107
+ stderr.write(preflight.kind === "missing-config" ? `No config at ${identity}. Run mono-agent init.\n`
108
+ : `Cannot start: ${preflight.report.sections.filter((section) => section.status === "error").map((section) => `${section.label}: ${section.details.join("; ")}`).join("\n")}\n`);
109
+ return preflight.code;
110
+ }
111
+ const definition = { identity, cwd, environment: {}, argv: workerArgv([
112
+ "start", "--foreground", "--config", identity, "--env-file", envFile,
113
+ ], environment) };
114
+ await withSystemdLock(identity, deps, async () => {
115
+ // The foreground singleton lease is the final guard; fail before installing a unit when a live trace is already present.
116
+ const current = await inspectSystemd(identity, deps);
117
+ const traces = await listTraceSources({ registryDir: target.registryDir, staleAfterMs: target.staleAfterMs });
118
+ const isAlive = deps.isAlive ?? processIsAlive;
119
+ if (traces.sources.some((source) => source.configPath === identity && source.health === "running"
120
+ && source.pid !== undefined && source.pid > 0 && source.pid !== current.pid && isAlive(source.pid))) {
121
+ throw new Error("Another supervisor or foreground worker already runs this config. Stop it explicitly before installing a Mono systemd service.");
122
+ }
123
+ await startSystemd(definition, action === "restart", ready, deps);
124
+ });
125
+ report(identity, await inspectSystemd(identity, deps), true, deps);
126
+ return 0;
127
+ }
128
+ catch (error) {
129
+ stderr.write(`Linux lifecycle: ${error instanceof Error ? error.message : String(error)}\n`);
130
+ return 1;
131
+ }
132
+ }
133
+ function sourceReady(source) {
134
+ if (source.health !== "running" || !hasCompletedManagedStartup(source) || source.memoryHealth?.status === "unhealthy")
135
+ return false;
136
+ const channels = source.metadata?.channels;
137
+ return !channels || typeof channels !== "object" || !Object.values(channels).some((channel) => channel !== null && typeof channel === "object" && channel.kind === "failed");
138
+ }
139
+ export async function runSystemdWebCommand(options, deps = {}) {
140
+ const identity = SYSTEMD_WEB_IDENTITY;
141
+ const stdout = deps.stdout ?? process.stdout;
142
+ const stderr = deps.stderr ?? process.stderr;
143
+ const action = options.positionals[0] ?? "status";
144
+ try {
145
+ if (action === "logs")
146
+ return await systemdLogs(identity, options.follow === true, options.lines ?? 200, deps);
147
+ if (action === "stop") {
148
+ await withSystemdLock(identity, deps, () => stopSystemd(identity, deps));
149
+ stdout.write("Web systemd service stopped and removed; conversation data and external HTTPS routes retained.\n");
150
+ return 0;
151
+ }
152
+ const installed = await readSystemdDefinition(identity, deps);
153
+ const previousOption = (key) => {
154
+ const index = installed?.argv.indexOf(key) ?? -1;
155
+ return index < 0 ? undefined : installed?.argv[index + 1];
156
+ };
157
+ const host = options.loopback ? "127.0.0.1" : options.host ?? previousOption("--host") ?? "0.0.0.0";
158
+ const port = options.port ?? Number(previousOption("--port") ?? 5050);
159
+ const theme = options.theme ?? previousOption("--theme") ?? "evergreen";
160
+ // No default: an absent name means the worker falls back to the machine hostname.
161
+ let consoleName = previousOption("--name");
162
+ if (options.name !== undefined) {
163
+ const requestedName = options.name.trim();
164
+ consoleName = requestedName === "-" ? undefined : requestedName;
165
+ }
166
+ const probeHost = host === "0.0.0.0" ? "127.0.0.1" : host === "::" || host === "[::]" ? "[::1]" : host.includes(":") && !host.startsWith("[") ? `[${host}]` : host;
167
+ const url = `http://${probeHost}:${port}/`;
168
+ const { webHealthcheck } = await import("./web-command.js");
169
+ const ready = async () => await webHealthcheck(`${url}healthz`);
170
+ if (action === "status") {
171
+ const service = await inspectSystemd(identity, deps);
172
+ const healthy = service.activeState === "active" && service.pid > 0 && await ready();
173
+ report(identity, service, healthy, deps);
174
+ stdout.write(`Web: ${url}\nTheme: ${theme}\nName: ${consoleName ?? "— (machine hostname)"}\nHTTPS routes: externally managed; inspect tailscale serve status.\n`);
175
+ return options.positionals.length === 0 ? 0 : healthy ? 0 : 1;
176
+ }
177
+ if (action !== "start" && action !== "restart")
178
+ throw new Error(`Unsupported systemd web action: ${action}`);
179
+ const environment = operationalEnvironment(options.env);
180
+ const previousAllowed = installed?.argv.find((arg) => arg.startsWith("MONO_AGENT_WEB_ALLOWED_HOSTS="))?.slice("MONO_AGENT_WEB_ALLOWED_HOSTS=".length);
181
+ const allowed = options.env.MONO_AGENT_WEB_ALLOWED_HOSTS ?? previousAllowed;
182
+ if (allowed !== undefined)
183
+ environment.MONO_AGENT_WEB_ALLOWED_HOSTS = allowed;
184
+ const definition = { identity, cwd: deps.homeDir ?? homedir(), environment: {},
185
+ argv: workerArgv([
186
+ "web", "run", "--host", host, "--port", String(port), "--theme", theme,
187
+ ...(consoleName === undefined ? [] : ["--name", consoleName]),
188
+ ], environment) };
189
+ await withSystemdLock(identity, deps, async () => {
190
+ const service = await inspectSystemd(identity, deps);
191
+ const ownedServiceMayAnswer = installed !== undefined && service.pid > 0 && Number(previousOption("--port")) === port;
192
+ if (!ownedServiceMayAnswer && await ready())
193
+ throw new Error("A web console already answers at this address. Stop its existing supervisor before installing this service.");
194
+ await startSystemd(definition, action === "restart", ready, deps);
195
+ });
196
+ stdout.write(`Web ready: ${url}\nRuntime: dev (unmanaged); logs: mono-agent web logs\nHTTPS routes remain externally managed on Linux.\n`);
197
+ return 0;
198
+ }
199
+ catch (error) {
200
+ if (action === "status" && isSystemdUserManagerUnavailable(error))
201
+ throw error;
202
+ stderr.write(`Linux web lifecycle: ${error instanceof Error ? error.message : String(error)}\n`);
203
+ return 1;
204
+ }
205
+ }
206
+ //# sourceMappingURL=systemd-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd-command.js","sourceRoot":"","sources":["../src/systemd-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export interface SystemdResult {
2
+ readonly code: number;
3
+ readonly stdout: string;
4
+ readonly stderr: string;
5
+ }
6
+ export interface SystemdDeps {
7
+ readonly run?: (command: string, args: readonly string[]) => Promise<SystemdResult>;
8
+ readonly journal?: (args: readonly string[]) => Promise<number>;
9
+ readonly isAlive?: (pid: number) => boolean;
10
+ readonly homeDir?: string;
11
+ readonly configDir?: string;
12
+ readonly now?: () => number;
13
+ readonly sleep?: (ms: number) => Promise<void>;
14
+ readonly stdout?: {
15
+ write(text: string): unknown;
16
+ };
17
+ readonly stderr?: {
18
+ write(text: string): unknown;
19
+ };
20
+ }
21
+ export interface SystemdDefinition {
22
+ readonly identity: string;
23
+ readonly cwd: string;
24
+ readonly argv: readonly string[];
25
+ readonly environment: Readonly<Record<string, string>>;
26
+ }
27
+ export interface SystemdService {
28
+ readonly loadState: string;
29
+ readonly activeState: string;
30
+ readonly subState: string;
31
+ readonly pid: number;
32
+ readonly startedAt: string;
33
+ readonly enabled: boolean;
34
+ readonly fragmentPath: string;
35
+ }
36
+ export declare const SYSTEMD_WEB_IDENTITY = "web";
37
+ export declare class SystemdUserManagerUnavailableError extends Error {
38
+ readonly name = "SystemdUserManagerUnavailableError";
39
+ }
40
+ export declare function isSystemdUserManagerUnavailable(error: unknown): boolean;
41
+ export declare function systemdUnitName(identity: string): string;
42
+ export declare function systemdUnitPath(identity: string, deps?: SystemdDeps): string;
43
+ export declare function renderSystemdUnit(definition: SystemdDefinition): string;
44
+ export declare function runSystemdTool(command: string, args: readonly string[]): Promise<SystemdResult>;
45
+ export declare function inspectSystemd(identity: string, deps?: SystemdDeps): Promise<SystemdService>;
46
+ export declare function readSystemdDefinition(identity: string, deps?: SystemdDeps): Promise<SystemdDefinition | undefined>;
47
+ export declare function withSystemdLock<T>(identity: string, deps: SystemdDeps, action: () => Promise<T>): Promise<T>;
48
+ export declare function stopSystemd(identity: string, deps?: SystemdDeps): Promise<void>;
49
+ export declare function startSystemd(definition: SystemdDefinition, restart: boolean, ready: (service: SystemdService) => Promise<boolean>, deps?: SystemdDeps): Promise<void>;
50
+ export declare function systemdLogs(identity: string, follow: boolean, lines: number, deps?: SystemdDeps): Promise<number>;
51
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../src/systemd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { lstat, mkdir, readFile, realpath, rename, unlink, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, isAbsolute, join } from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { acquireFilesystemLifecycleLock } from "./launchd-lifecycle-lock.js";
8
+ const MARKER = "# mono-agent systemd user service v1 ";
9
+ export const SYSTEMD_WEB_IDENTITY = "web";
10
+ export class SystemdUserManagerUnavailableError extends Error {
11
+ name = "SystemdUserManagerUnavailableError";
12
+ }
13
+ export function isSystemdUserManagerUnavailable(error) {
14
+ return error instanceof SystemdUserManagerUnavailableError;
15
+ }
16
+ export function systemdUnitName(identity) {
17
+ return identity === SYSTEMD_WEB_IDENTITY ? "mono-agent-web.service"
18
+ : `mono-agent-${createHash("sha256").update(identity).digest("hex").slice(0, 24)}.service`;
19
+ }
20
+ export function systemdUnitPath(identity, deps = {}) {
21
+ const root = deps.configDir ?? (deps.homeDir === undefined ? process.env.XDG_CONFIG_HOME : undefined) ?? join(deps.homeDir ?? homedir(), ".config");
22
+ if (!isAbsolute(root))
23
+ throw new Error("XDG_CONFIG_HOME must be absolute.");
24
+ return join(root, "systemd", "user", systemdUnitName(identity));
25
+ }
26
+ /** systemd syntax is not shell syntax: quote whitespace, disable specifiers and dollar expansion. */
27
+ function quote(value, exec = false) {
28
+ if (/[\x00-\x1f\x7f]/u.test(value))
29
+ throw new Error("Service values must not contain control characters.");
30
+ const escaped = value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%");
31
+ return `"${exec ? escaped.replaceAll("$", () => "$$") : escaped}"`;
32
+ }
33
+ export function renderSystemdUnit(definition) {
34
+ if (!isAbsolute(definition.cwd) || !isAbsolute(definition.argv[0] ?? "")) {
35
+ throw new Error("Service working directory and executable must be absolute.");
36
+ }
37
+ if (definition.cwd.trim() !== definition.cwd || /[\x00-\x1f\x7f"\\]/u.test(definition.cwd)) {
38
+ throw new Error("Service working directory must not contain quotes, backslashes, control characters, or edge whitespace.");
39
+ }
40
+ return [
41
+ MARKER + Buffer.from(JSON.stringify(definition)).toString("base64"),
42
+ "[Unit]", "Description=Mono-agent (dev, unmanaged runtime)", "StartLimitIntervalSec=60", "StartLimitBurst=5", "",
43
+ "[Service]", "Type=exec", `WorkingDirectory=${definition.cwd.replaceAll("%", "%%")}`,
44
+ `ExecStart=${definition.argv.map((arg) => quote(arg, true)).join(" ")}`,
45
+ ...Object.entries(definition.environment).sort(([a], [b]) => a.localeCompare(b)).map(([name, value]) => {
46
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name))
47
+ throw new Error("Invalid service environment name.");
48
+ return `Environment=${quote(`${name}=${value}`)}`;
49
+ }),
50
+ "Restart=on-failure", "RestartSec=5", "TimeoutStopSec=60", "KillMode=mixed", "UMask=0077",
51
+ "StandardOutput=journal", "StandardError=journal", "", "[Install]", "WantedBy=default.target", "",
52
+ ].join("\n");
53
+ }
54
+ export async function runSystemdTool(command, args) {
55
+ try {
56
+ const result = await promisify(execFile)(command, [...args], { timeout: 90_000, maxBuffer: 1024 * 1024, env: { ...process.env, LC_ALL: "C" } });
57
+ return { code: 0, ...result };
58
+ }
59
+ catch (error) {
60
+ const failure = error;
61
+ return { code: typeof failure.code === "number" ? failure.code : 1, stdout: failure.stdout ?? "", stderr: failure.stderr || failure.message || "Command failed" };
62
+ }
63
+ }
64
+ async function checked(args, deps) {
65
+ const result = await (deps.run ?? runSystemdTool)("systemctl", ["--user", ...args]);
66
+ if (result.code !== 0)
67
+ throw new Error(`systemctl --user ${args[0]} failed: ${result.stderr.trim() || result.stdout.trim()}. A running systemd user manager is required.`);
68
+ return result;
69
+ }
70
+ export async function inspectSystemd(identity, deps = {}) {
71
+ const result = await (deps.run ?? runSystemdTool)("systemctl", ["--user", "show", systemdUnitName(identity),
72
+ "--property=LoadState,ActiveState,SubState,MainPID,ExecMainStartTimestamp,UnitFileState,FragmentPath"]);
73
+ const properties = Object.fromEntries(result.stdout.trim().split("\n").map((line) => {
74
+ const index = line.indexOf("=");
75
+ return [line.slice(0, index), line.slice(index + 1)];
76
+ }));
77
+ if (result.code !== 0 && properties.LoadState !== "not-found") {
78
+ const detail = result.stderr.trim() || "systemctl failed";
79
+ const message = `Cannot inspect systemd user service: ${detail}`;
80
+ if (/Failed to connect to bus|System has not been booted with systemd|No medium found|(?:spawn|systemctl).*ENOENT/iu.test(detail)) {
81
+ throw new SystemdUserManagerUnavailableError(message);
82
+ }
83
+ throw new Error(message);
84
+ }
85
+ if (!properties.LoadState || !properties.ActiveState)
86
+ throw new Error("systemctl returned an incomplete service record.");
87
+ const pid = Number(properties.MainPID ?? "0");
88
+ if (!Number.isSafeInteger(pid) || pid < 0)
89
+ throw new Error("systemctl returned an invalid PID.");
90
+ return {
91
+ loadState: properties.LoadState, activeState: properties.ActiveState, subState: properties.SubState ?? "unknown",
92
+ pid, startedAt: properties.ExecMainStartTimestamp ?? "", enabled: properties.UnitFileState === "enabled",
93
+ fragmentPath: properties.FragmentPath ?? "",
94
+ };
95
+ }
96
+ async function ownedFile(path) {
97
+ try {
98
+ const info = await lstat(path);
99
+ if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1 || info.uid !== process.getuid?.() || (info.mode & 0o022) !== 0) {
100
+ throw new Error(`Refusing unsafe service file ${path}.`);
101
+ }
102
+ return await readFile(path, "utf8");
103
+ }
104
+ catch (error) {
105
+ if (error.code === "ENOENT")
106
+ return undefined;
107
+ throw error;
108
+ }
109
+ }
110
+ function parseSystemdDefinition(value) {
111
+ if (value === null || typeof value !== "object" || Array.isArray(value))
112
+ return undefined;
113
+ const record = value;
114
+ if (typeof record.identity !== "string" || typeof record.cwd !== "string"
115
+ || !Array.isArray(record.argv) || record.argv.length === 0 || !record.argv.every((arg) => typeof arg === "string")
116
+ || record.environment === null || typeof record.environment !== "object" || Array.isArray(record.environment)
117
+ || !Object.values(record.environment).every((entry) => typeof entry === "string"))
118
+ return undefined;
119
+ return {
120
+ identity: record.identity,
121
+ cwd: record.cwd,
122
+ argv: record.argv,
123
+ environment: record.environment,
124
+ };
125
+ }
126
+ async function readOwnedSystemdUnit(identity, deps) {
127
+ const contents = await ownedFile(systemdUnitPath(identity, deps));
128
+ if (contents === undefined)
129
+ return undefined;
130
+ try {
131
+ const first = contents.split("\n", 1)[0];
132
+ if (!first.startsWith(MARKER))
133
+ throw new Error("missing ownership marker");
134
+ const definition = parseSystemdDefinition(JSON.parse(Buffer.from(first.slice(MARKER.length), "base64").toString("utf8")));
135
+ if (definition?.identity !== identity)
136
+ throw new Error("invalid unit identity");
137
+ return { definition, contents };
138
+ }
139
+ catch {
140
+ throw new Error(`Refusing to replace or remove an unrecognized service file: ${systemdUnitPath(identity, deps)}.`);
141
+ }
142
+ }
143
+ export async function readSystemdDefinition(identity, deps = {}) {
144
+ return (await readOwnedSystemdUnit(identity, deps))?.definition;
145
+ }
146
+ function sameSystemdDefinition(left, right) {
147
+ if (left.identity !== right.identity || left.cwd !== right.cwd || left.argv.length !== right.argv.length
148
+ || left.argv.some((value, index) => value !== right.argv[index]))
149
+ return false;
150
+ const leftEnvironment = Object.entries(left.environment).sort(([a], [b]) => a.localeCompare(b));
151
+ const rightEnvironment = Object.entries(right.environment).sort(([a], [b]) => a.localeCompare(b));
152
+ return leftEnvironment.length === rightEnvironment.length
153
+ && leftEnvironment.every(([name, value], index) => name === rightEnvironment[index]?.[0] && value === rightEnvironment[index]?.[1]);
154
+ }
155
+ async function ensureDirectory(path) {
156
+ try {
157
+ await mkdir(path, { mode: 0o700 });
158
+ }
159
+ catch (error) {
160
+ if (error.code !== "EEXIST")
161
+ throw error;
162
+ }
163
+ const info = await lstat(path);
164
+ if (!info.isDirectory() || info.isSymbolicLink() || info.uid !== process.getuid?.() || (info.mode & 0o022) !== 0) {
165
+ throw new Error(`Refusing unsafe service directory ${path}.`);
166
+ }
167
+ }
168
+ async function publish(path, contents) {
169
+ const root = dirname(dirname(dirname(path)));
170
+ for (const dir of [root, dirname(dirname(path)), dirname(path)])
171
+ await ensureDirectory(dir);
172
+ const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
173
+ try {
174
+ await writeFile(temporary, contents, { mode: 0o600, flag: "wx" });
175
+ await rename(temporary, path);
176
+ }
177
+ finally {
178
+ await unlink(temporary).catch((error) => { if (error.code !== "ENOENT")
179
+ throw error; });
180
+ }
181
+ }
182
+ export async function withSystemdLock(identity, deps, action) {
183
+ const root = join(deps.homeDir ?? homedir(), ".mono-agent");
184
+ await ensureDirectory(root);
185
+ const release = await acquireFilesystemLifecycleLock({ label: systemdUnitName(identity), paths: {
186
+ logDir: join(root, "logs"), plistPath: systemdUnitPath(identity, deps), stdoutPath: "", stderrPath: "", launchAgentsDir: dirname(systemdUnitPath(identity, deps)),
187
+ } });
188
+ if (!release)
189
+ throw new Error("Another lifecycle command is active for this service.");
190
+ try {
191
+ return await action();
192
+ }
193
+ finally {
194
+ await release();
195
+ }
196
+ }
197
+ async function assertFragment(identity, service, deps) {
198
+ if (service.fragmentPath && service.fragmentPath !== systemdUnitPath(identity, deps)
199
+ && await realpath(service.fragmentPath) !== await realpath(systemdUnitPath(identity, deps))) {
200
+ throw new Error(`Refusing foreign unit ${service.fragmentPath}.`);
201
+ }
202
+ }
203
+ export async function stopSystemd(identity, deps = {}) {
204
+ const definition = await readSystemdDefinition(identity, deps);
205
+ const service = await inspectSystemd(identity, deps);
206
+ await assertFragment(identity, service, deps);
207
+ if (!definition) {
208
+ if (service.loadState !== "not-found")
209
+ throw new Error("Service exists without an owned unit; refusing to stop it.");
210
+ return;
211
+ }
212
+ await checked(["disable", "--now", systemdUnitName(identity)], deps);
213
+ const stopped = await inspectSystemd(identity, deps);
214
+ if (stopped.pid !== 0 || !["inactive", "failed"].includes(stopped.activeState))
215
+ throw new Error("Service did not stop; its unit was retained.");
216
+ await unlink(systemdUnitPath(identity, deps));
217
+ await checked(["daemon-reload"], deps);
218
+ }
219
+ export async function startSystemd(definition, restart, ready, deps = {}) {
220
+ const identity = definition.identity;
221
+ const previousUnit = await readOwnedSystemdUnit(identity, deps);
222
+ const previous = previousUnit?.definition;
223
+ const priorService = await inspectSystemd(identity, deps);
224
+ await assertFragment(identity, priorService, deps);
225
+ if (!previous && priorService.loadState !== "not-found")
226
+ throw new Error("Service exists without an owned unit; refusing to replace it.");
227
+ const contents = renderSystemdUnit(definition);
228
+ if (!restart && priorService.activeState === "active") {
229
+ if (!previous || !sameSystemdDefinition(previous, definition))
230
+ throw new Error("Service configuration changed; use restart to apply it.");
231
+ if (!await ready(priorService))
232
+ throw new Error("Service is running but has not reported ready; inspect status and logs.");
233
+ return;
234
+ }
235
+ let published = false;
236
+ try {
237
+ await publish(systemdUnitPath(identity, deps), contents);
238
+ published = true;
239
+ await checked(["daemon-reload"], deps);
240
+ await checked(["enable", systemdUnitName(identity)], deps);
241
+ await checked([restart ? "restart" : "start", systemdUnitName(identity)], deps);
242
+ const now = deps.now ?? Date.now;
243
+ const deadline = now() + 30_000;
244
+ for (;;) {
245
+ const service = await inspectSystemd(identity, deps);
246
+ if (service.activeState === "active" && service.pid > 0 && await ready(service))
247
+ break;
248
+ if (service.activeState === "failed" || now() >= deadline)
249
+ throw new Error("Service did not report ready; inspect journal logs.");
250
+ await (deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms))))(200);
251
+ }
252
+ }
253
+ catch (error) {
254
+ if (!published)
255
+ throw error;
256
+ try {
257
+ const failedService = await inspectSystemd(identity, deps);
258
+ if (failedService.pid > 0 || !["inactive", "failed"].includes(failedService.activeState)) {
259
+ await checked(["stop", systemdUnitName(identity)], deps);
260
+ }
261
+ const stopped = await inspectSystemd(identity, deps);
262
+ if (stopped.pid !== 0 || !["inactive", "failed"].includes(stopped.activeState))
263
+ throw new Error("Replacement worker is still running.");
264
+ if (previousUnit)
265
+ await publish(systemdUnitPath(identity, deps), previousUnit.contents);
266
+ else {
267
+ await checked(["disable", systemdUnitName(identity)], deps);
268
+ await unlink(systemdUnitPath(identity, deps));
269
+ }
270
+ await checked(["daemon-reload"], deps);
271
+ if (previous) {
272
+ await checked([priorService.enabled ? "enable" : "disable", systemdUnitName(identity)], deps);
273
+ if (priorService.activeState === "active")
274
+ await checked(["start", systemdUnitName(identity)], deps);
275
+ }
276
+ }
277
+ catch (rollback) {
278
+ throw new Error(`${String(error)}; rollback failed: ${String(rollback)}`);
279
+ }
280
+ throw error;
281
+ }
282
+ const linger = await (deps.run ?? runSystemdTool)("loginctl", ["show-user", String(process.getuid?.()), "--property=Linger", "--value"]);
283
+ if (linger.code !== 0 || linger.stdout.trim() !== "yes") {
284
+ (deps.stderr ?? process.stderr).write("Boot persistence is not confirmed. Run `loginctl enable-linger` for this user to keep services running after logout.\n");
285
+ }
286
+ }
287
+ export async function systemdLogs(identity, follow, lines, deps = {}) {
288
+ if (!Number.isSafeInteger(lines) || lines < 0)
289
+ throw new Error("Log lines must be a nonnegative integer.");
290
+ const args = ["--user", "--unit", systemdUnitName(identity), "--no-pager", "--lines", String(lines), ...(follow ? ["--follow"] : [])];
291
+ if (deps.journal)
292
+ return await deps.journal(args);
293
+ return await new Promise((resolve) => {
294
+ const child = spawn("journalctl", args, { stdio: "inherit" });
295
+ child.on("error", () => resolve(127));
296
+ child.on("close", (code) => resolve(code ?? 1));
297
+ });
298
+ }
299
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../src/systemd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RuntimeOptionsExtension } from "./runtime-option-extensions.js";
2
+ /** Attach the configured app's artifact sink after every caller-owned extension. */
3
+ export declare function createToolOutputArtifactsRuntimeExtension(next: RuntimeOptionsExtension | undefined, artifactRoot: string): RuntimeOptionsExtension;
4
+ //# sourceMappingURL=tool-output-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output-artifacts.d.ts","sourceRoot":"","sources":["../src/tool-output-artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,oFAAoF;AACpF,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,uBAAuB,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GACnB,uBAAuB,CAazB"}