@excitedjs/dreamux 0.26.0-beta.265 → 0.26.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 (494) hide show
  1. package/CHANGELOG.json +393 -0
  2. package/CHANGELOG.md +71 -1
  3. package/README.md +47 -34
  4. package/dist/admin/client.js +18 -7
  5. package/dist/admin/client.js.map +1 -1
  6. package/dist/admin/socket.js +15 -104
  7. package/dist/admin/socket.js.map +1 -1
  8. package/dist/agent-runtime/capabilities.js +4 -17
  9. package/dist/agent-runtime/capabilities.js.map +1 -1
  10. package/dist/agent-runtime/catalog.js.map +1 -1
  11. package/dist/agent-runtime/external-provider.js.map +1 -1
  12. package/dist/agent-runtime/host-context.js +1 -12
  13. package/dist/agent-runtime/host-context.js.map +1 -1
  14. package/dist/agent-runtime/host-paths.js +1 -1
  15. package/dist/agent-runtime/host-paths.js.map +1 -1
  16. package/dist/agent-runtime/index.js +7 -0
  17. package/dist/agent-runtime/index.js.map +1 -1
  18. package/dist/agent-runtime/skill-sources.js +23 -6
  19. package/dist/agent-runtime/skill-sources.js.map +1 -1
  20. package/dist/channel/catalog.js.map +1 -1
  21. package/dist/channel/external-channel-provider.js.map +1 -1
  22. package/dist/cli/commands/daemon.js +5 -8
  23. package/dist/cli/commands/daemon.js.map +1 -1
  24. package/dist/cli/commands/dispatcher.js +11 -15
  25. package/dist/cli/commands/dispatcher.js.map +1 -1
  26. package/dist/cli/commands/index.js +4 -4
  27. package/dist/cli/commands/index.js.map +1 -1
  28. package/dist/cli/commands/mcp.js +2 -4
  29. package/dist/cli/commands/mcp.js.map +1 -1
  30. package/dist/cli/commands/onboard.js +0 -4
  31. package/dist/cli/commands/onboard.js.map +1 -1
  32. package/dist/cli/commands/parse.js +1 -1
  33. package/dist/cli/commands/parse.js.map +1 -1
  34. package/dist/cli/commands/serve.js +3 -2
  35. package/dist/cli/commands/serve.js.map +1 -1
  36. package/dist/cli/commands/status.js +3 -3
  37. package/dist/cli/commands/status.js.map +1 -1
  38. package/dist/cli/commands/types.js +25 -3
  39. package/dist/cli/commands/types.js.map +1 -1
  40. package/dist/cli/commands/uninstall.js +2 -8
  41. package/dist/cli/commands/uninstall.js.map +1 -1
  42. package/dist/cli/doctor-plugins.js +44 -0
  43. package/dist/cli/doctor-plugins.js.map +1 -0
  44. package/dist/cli/doctor-types.js +2 -0
  45. package/dist/cli/doctor-types.js.map +1 -0
  46. package/dist/cli/doctor.js +48 -125
  47. package/dist/cli/doctor.js.map +1 -1
  48. package/dist/cli/dreamux.js +2 -30
  49. package/dist/cli/dreamux.js.map +1 -1
  50. package/dist/cli/server.js +55 -70
  51. package/dist/cli/server.js.map +1 -1
  52. package/dist/command/errors.js +43 -2
  53. package/dist/command/errors.js.map +1 -1
  54. package/dist/command/host.js +10 -17
  55. package/dist/command/host.js.map +1 -1
  56. package/dist/command/payload.js +0 -9
  57. package/dist/command/payload.js.map +1 -1
  58. package/dist/command/port.js +0 -4
  59. package/dist/command/port.js.map +1 -1
  60. package/dist/command/registry.js +0 -4
  61. package/dist/command/registry.js.map +1 -1
  62. package/dist/command/schema.js.map +1 -1
  63. package/dist/command/types.js.map +1 -0
  64. package/dist/command/validate.js +22 -41
  65. package/dist/command/validate.js.map +1 -1
  66. package/dist/config/commands.js +46 -0
  67. package/dist/config/commands.js.map +1 -0
  68. package/dist/config/config.js +155 -169
  69. package/dist/config/config.js.map +1 -1
  70. package/dist/config/load.js +138 -0
  71. package/dist/config/load.js.map +1 -0
  72. package/dist/config/service.js +196 -0
  73. package/dist/config/service.js.map +1 -0
  74. package/dist/daemon/{service-control.js → control.js} +15 -16
  75. package/dist/daemon/control.js.map +1 -0
  76. package/dist/daemon/environment.js +353 -0
  77. package/dist/daemon/environment.js.map +1 -0
  78. package/dist/daemon/host.js +16 -0
  79. package/dist/daemon/host.js.map +1 -0
  80. package/dist/daemon/install.js +167 -69
  81. package/dist/daemon/install.js.map +1 -1
  82. package/dist/daemon/status.js +87 -0
  83. package/dist/daemon/status.js.map +1 -0
  84. package/dist/{cli/service-status-parse.js → daemon/unit.js} +90 -12
  85. package/dist/daemon/unit.js.map +1 -0
  86. package/dist/{service/mcp/descriptor.js → mcp/launch.js} +3 -7
  87. package/dist/mcp/launch.js.map +1 -0
  88. package/dist/mcp/server.js +9 -5
  89. package/dist/mcp/server.js.map +1 -1
  90. package/dist/mcp/shim.js +18 -16
  91. package/dist/mcp/shim.js.map +1 -1
  92. package/dist/onboard/config-files.js +12 -26
  93. package/dist/onboard/config-files.js.map +1 -1
  94. package/dist/onboard/run.js +47 -66
  95. package/dist/onboard/run.js.map +1 -1
  96. package/dist/onboard/uninstall.js +59 -42
  97. package/dist/onboard/uninstall.js.map +1 -1
  98. package/dist/onboard/wizard.js +33 -18
  99. package/dist/onboard/wizard.js.map +1 -1
  100. package/dist/{onboard/commands.js → platform/command-runner.js} +7 -3
  101. package/dist/platform/command-runner.js.map +1 -0
  102. package/dist/platform/deduplicate.js +32 -0
  103. package/dist/platform/deduplicate.js.map +1 -0
  104. package/dist/{state → platform}/dispatcher-id.js +1 -1
  105. package/dist/platform/dispatcher-id.js.map +1 -0
  106. package/dist/platform/errors.js +23 -23
  107. package/dist/platform/errors.js.map +1 -1
  108. package/dist/{onboard/ledger.js → platform/file-ledger.js} +13 -38
  109. package/dist/platform/file-ledger.js.map +1 -0
  110. package/dist/platform/history-page.js +62 -0
  111. package/dist/platform/history-page.js.map +1 -0
  112. package/dist/platform/in-flight-work.js.map +1 -0
  113. package/dist/platform/instance-lock.js +95 -0
  114. package/dist/platform/instance-lock.js.map +1 -0
  115. package/dist/platform/json-value.js +26 -15
  116. package/dist/platform/json-value.js.map +1 -1
  117. package/dist/platform/jsonl.js.map +1 -1
  118. package/dist/platform/logger.js +5 -5
  119. package/dist/platform/logger.js.map +1 -1
  120. package/dist/platform/package-bin.js +3 -1
  121. package/dist/platform/package-bin.js.map +1 -1
  122. package/dist/platform/paths.js +42 -69
  123. package/dist/platform/paths.js.map +1 -1
  124. package/dist/platform/runtime-sockets.js +7 -2
  125. package/dist/platform/runtime-sockets.js.map +1 -1
  126. package/dist/platform/serial-queue.js +22 -0
  127. package/dist/platform/serial-queue.js.map +1 -0
  128. package/dist/platform/shutdown-errors.js.map +1 -0
  129. package/dist/platform/work-fence.js +30 -0
  130. package/dist/platform/work-fence.js.map +1 -0
  131. package/dist/plugin/hooks.js +407 -0
  132. package/dist/plugin/hooks.js.map +1 -0
  133. package/dist/plugin/host.js +97 -0
  134. package/dist/plugin/host.js.map +1 -0
  135. package/dist/plugin/loader.js +250 -0
  136. package/dist/plugin/loader.js.map +1 -0
  137. package/dist/provider-diagnostics.js +12 -8
  138. package/dist/provider-diagnostics.js.map +1 -1
  139. package/dist/registry/builtins.js +49 -45
  140. package/dist/registry/builtins.js.map +1 -1
  141. package/dist/registry/index.js +10 -2
  142. package/dist/registry/index.js.map +1 -1
  143. package/dist/registry/provider-loader.js +41 -61
  144. package/dist/registry/provider-loader.js.map +1 -1
  145. package/dist/registry/provider-ref.js.map +1 -1
  146. package/dist/registry/registry.js +14 -22
  147. package/dist/registry/registry.js.map +1 -1
  148. package/dist/{command/catalog.js → server/command-catalog.js} +14 -5
  149. package/dist/server/command-catalog.js.map +1 -0
  150. package/dist/server/command-host.js +2 -0
  151. package/dist/server/command-host.js.map +1 -0
  152. package/dist/server-commands.js +1 -1
  153. package/dist/server-commands.js.map +1 -1
  154. package/dist/server.js +70 -129
  155. package/dist/server.js.map +1 -1
  156. package/dist/service/{agent-entity/activity-reader.js → agent/activity.js} +86 -34
  157. package/dist/service/agent/activity.js.map +1 -0
  158. package/dist/service/{teammate-service/admission-ledger.js → agent/admission.js} +66 -1
  159. package/dist/service/agent/admission.js.map +1 -0
  160. package/dist/service/{channel-submission.js → agent/channel-submission.js} +5 -5
  161. package/dist/service/agent/channel-submission.js.map +1 -0
  162. package/dist/service/{teammate-collection → agent}/commands.js +38 -50
  163. package/dist/service/agent/commands.js.map +1 -0
  164. package/dist/service/{teammate-service → agent}/completion-renderer.js +30 -5
  165. package/dist/service/agent/completion-renderer.js.map +1 -0
  166. package/dist/service/agent/errors.js.map +1 -0
  167. package/dist/service/agent/factory.js +78 -0
  168. package/dist/service/agent/factory.js.map +1 -0
  169. package/dist/service/{agent-entity/types.js → agent/identity.js} +28 -34
  170. package/dist/service/agent/identity.js.map +1 -0
  171. package/dist/service/agent/index.js +769 -0
  172. package/dist/service/agent/index.js.map +1 -0
  173. package/dist/service/agent/mcp.js +420 -0
  174. package/dist/service/agent/mcp.js.map +1 -0
  175. package/dist/service/agent/records.js +74 -0
  176. package/dist/service/agent/records.js.map +1 -0
  177. package/dist/service/agent/requests.js +172 -0
  178. package/dist/service/agent/requests.js.map +1 -0
  179. package/dist/service/{teammate-service/runtime-owner.js → agent/runtime-generation.js} +81 -79
  180. package/dist/service/agent/runtime-generation.js.map +1 -0
  181. package/dist/service/agent/runtime-id.js +22 -0
  182. package/dist/service/agent/runtime-id.js.map +1 -0
  183. package/dist/service/{agent-entity → agent}/runtime-state.js +33 -40
  184. package/dist/service/agent/runtime-state.js.map +1 -0
  185. package/dist/service/agent/service-types.js +28 -0
  186. package/dist/service/agent/service-types.js.map +1 -0
  187. package/dist/service/{teammate-service/index.js → agent/service.js} +236 -102
  188. package/dist/service/agent/service.js.map +1 -0
  189. package/dist/service/{agent-entity/identity-store.js → agent/store.js} +175 -96
  190. package/dist/service/agent/store.js.map +1 -0
  191. package/dist/service/agent/submission.js.map +1 -0
  192. package/dist/service/{teammate-collection → agent}/system-prompt.js +7 -3
  193. package/dist/service/agent/system-prompt.js.map +1 -0
  194. package/dist/service/agent/turn.js +89 -0
  195. package/dist/service/agent/turn.js.map +1 -0
  196. package/dist/service/agent/types.js.map +1 -0
  197. package/dist/service/channel-service/commands.js +7 -3
  198. package/dist/service/channel-service/commands.js.map +1 -1
  199. package/dist/{channel → service/channel-service}/core-port.js +6 -5
  200. package/dist/service/channel-service/core-port.js.map +1 -0
  201. package/dist/service/channel-service/index.js +211 -93
  202. package/dist/service/channel-service/index.js.map +1 -1
  203. package/dist/service/channel-service/mcp-delegate.js +8 -9
  204. package/dist/service/channel-service/mcp-delegate.js.map +1 -1
  205. package/dist/service/completion-router/index.js +27 -27
  206. package/dist/service/completion-router/index.js.map +1 -1
  207. package/dist/{channel → service/dispatcher-core-events}/conversation-projection.js +9 -7
  208. package/dist/service/dispatcher-core-events/conversation-projection.js.map +1 -0
  209. package/dist/service/dispatcher-core-events/index.js +76 -68
  210. package/dist/service/dispatcher-core-events/index.js.map +1 -1
  211. package/dist/service/dispatcher-core-events/seal.js +1 -24
  212. package/dist/service/dispatcher-core-events/seal.js.map +1 -1
  213. package/dist/service/dispatcher-service/agent.js +267 -45
  214. package/dist/service/dispatcher-service/agent.js.map +1 -1
  215. package/dist/service/dispatcher-service/base-prompt.js +2 -2
  216. package/dist/service/dispatcher-service/base-prompt.js.map +1 -1
  217. package/dist/service/dispatcher-service/index.js +139 -378
  218. package/dist/service/dispatcher-service/index.js.map +1 -1
  219. package/dist/service/dispatcher-service/lifecycle.js +230 -0
  220. package/dist/service/dispatcher-service/lifecycle.js.map +1 -0
  221. package/dist/{daemon → service/dispatcher-service}/restart-intent.js +17 -38
  222. package/dist/service/dispatcher-service/restart-intent.js.map +1 -0
  223. package/dist/service/dispatcher-workspace.js +10 -23
  224. package/dist/service/dispatcher-workspace.js.map +1 -1
  225. package/dist/service/dispatchers/commands.js +30 -31
  226. package/dist/service/dispatchers/commands.js.map +1 -1
  227. package/dist/service/dispatchers/index.js +92 -64
  228. package/dist/service/dispatchers/index.js.map +1 -1
  229. package/dist/service/index.js +2 -2
  230. package/dist/service/index.js.map +1 -1
  231. package/dist/{mcp → service/mcp}/catalog.js +11 -48
  232. package/dist/service/mcp/catalog.js.map +1 -0
  233. package/dist/service/mcp/commands.js +3 -3
  234. package/dist/service/mcp/commands.js.map +1 -1
  235. package/dist/service/mcp/dispatch-reminders.js +1 -1
  236. package/dist/service/mcp/dispatch-reminders.js.map +1 -1
  237. package/dist/service/mcp/identity-version.js +14 -0
  238. package/dist/service/mcp/identity-version.js.map +1 -1
  239. package/dist/service/mcp/leases.js +12 -33
  240. package/dist/service/mcp/leases.js.map +1 -1
  241. package/dist/service/mcp/tool-metadata.js +15 -76
  242. package/dist/service/mcp/tool-metadata.js.map +1 -1
  243. package/dist/service/name-allocator.js +2 -3
  244. package/dist/service/name-allocator.js.map +1 -1
  245. package/dist/service/scheduler/commands.js +7 -19
  246. package/dist/service/scheduler/commands.js.map +1 -1
  247. package/dist/service/scheduler/errors.js +1 -1
  248. package/dist/service/scheduler/errors.js.map +1 -1
  249. package/dist/service/scheduler/{service.js → index.js} +175 -142
  250. package/dist/service/scheduler/index.js.map +1 -0
  251. package/dist/service/scheduler/{mcp-delegate.js → mcp.js} +61 -58
  252. package/dist/service/scheduler/mcp.js.map +1 -0
  253. package/dist/service/scheduler/requests.js +60 -0
  254. package/dist/service/scheduler/requests.js.map +1 -0
  255. package/dist/service/scheduler/store.js +183 -151
  256. package/dist/service/scheduler/store.js.map +1 -1
  257. package/dist/service/scheduler/types.js +1 -33
  258. package/dist/service/scheduler/types.js.map +1 -1
  259. package/dist/service/{team-collection → team}/commands.js +45 -59
  260. package/dist/service/team/commands.js.map +1 -0
  261. package/dist/service/{team-collection → team}/create-request.js +8 -20
  262. package/dist/service/team/create-request.js.map +1 -0
  263. package/dist/service/{team-collection → team}/errors.js +7 -10
  264. package/dist/service/team/errors.js.map +1 -0
  265. package/dist/service/team/index.js +817 -0
  266. package/dist/service/team/index.js.map +1 -0
  267. package/dist/service/team/leader-mcp.js +42 -0
  268. package/dist/service/team/leader-mcp.js.map +1 -0
  269. package/dist/service/team/leader.js +157 -0
  270. package/dist/service/team/leader.js.map +1 -0
  271. package/dist/service/team/mcp.js +328 -0
  272. package/dist/service/team/mcp.js.map +1 -0
  273. package/dist/service/{team-collection/types.js → team/requests.js} +64 -15
  274. package/dist/service/team/requests.js.map +1 -0
  275. package/dist/service/team/service.js +903 -0
  276. package/dist/service/team/service.js.map +1 -0
  277. package/dist/service/team/store.js +373 -0
  278. package/dist/service/team/store.js.map +1 -0
  279. package/dist/service/team/team-summary.js.map +1 -0
  280. package/dist/service/team/teams-port.js +2 -0
  281. package/dist/service/team/teams-port.js.map +1 -0
  282. package/dist/service/team/types.js +22 -0
  283. package/dist/service/team/types.js.map +1 -0
  284. package/dist/service/workflow-service/commands.js +5 -6
  285. package/dist/service/workflow-service/commands.js.map +1 -1
  286. package/dist/service/workflow-service/errors.js +2 -0
  287. package/dist/service/workflow-service/errors.js.map +1 -1
  288. package/dist/service/workflow-service/index.js +80 -112
  289. package/dist/service/workflow-service/index.js.map +1 -1
  290. package/dist/service/workflow-service/journal.js +90 -6
  291. package/dist/service/workflow-service/journal.js.map +1 -1
  292. package/dist/service/workflow-service/limits.js +20 -9
  293. package/dist/service/workflow-service/limits.js.map +1 -1
  294. package/dist/service/workflow-service/mcp.js +171 -0
  295. package/dist/service/workflow-service/mcp.js.map +1 -0
  296. package/dist/service/workflow-service/protocol.js +72 -1
  297. package/dist/service/workflow-service/protocol.js.map +1 -1
  298. package/dist/service/workflow-service/requests.js +70 -0
  299. package/dist/service/workflow-service/requests.js.map +1 -0
  300. package/dist/service/workflow-service/run.js +258 -145
  301. package/dist/service/workflow-service/run.js.map +1 -1
  302. package/dist/service/workflow-service/runner-process.js +0 -19
  303. package/dist/service/workflow-service/runner-process.js.map +1 -1
  304. package/dist/service/workflow-service/runner.js +6 -30
  305. package/dist/service/workflow-service/runner.js.map +1 -1
  306. package/dist/service/workflow-service/script-compiler.js +7 -9
  307. package/dist/service/workflow-service/script-compiler.js.map +1 -1
  308. package/dist/service/workflow-service/{run-support.js → semaphore.js} +1 -30
  309. package/dist/service/workflow-service/semaphore.js.map +1 -0
  310. package/dist/service/workflow-service/store.js +105 -25
  311. package/dist/service/workflow-service/store.js.map +1 -1
  312. package/dist/service/workflow-service/types.js +1 -77
  313. package/dist/service/workflow-service/types.js.map +1 -1
  314. package/dist/service/worktree/manager.js +29 -62
  315. package/dist/service/worktree/manager.js.map +1 -1
  316. package/dist/service/worktree/paths.js +4 -1
  317. package/dist/service/worktree/paths.js.map +1 -1
  318. package/dist/service/worktree/repo-request.js +38 -14
  319. package/dist/service/worktree/repo-request.js.map +1 -1
  320. package/dist/service/worktree/types.js +2 -0
  321. package/dist/service/worktree/types.js.map +1 -0
  322. package/dist/service/worktree/workspaces.js +27 -34
  323. package/dist/service/worktree/workspaces.js.map +1 -1
  324. package/package.json +13 -8
  325. package/skills/dispatcher/dreamux-maintenance/SKILL.md +5 -4
  326. package/skills/dispatcher/dreamux-maintenance/references/builtin-bootstrap.md +50 -0
  327. package/skills/dispatcher/dreamux-maintenance/references/builtin-codex.md +4 -5
  328. package/skills/dispatcher/dreamux-maintenance/references/builtin-feishu.md +69 -11
  329. package/skills/dispatcher/dreamux-maintenance/references/config-envelope.md +77 -12
  330. package/skills/dispatcher/dreamux-maintenance/references/feishu-access-v3.md +39 -24
  331. package/skills/dispatcher/dreamux-maintenance/references/service-lifecycle.md +105 -37
  332. package/dist/channel/conversation-projection.js.map +0 -1
  333. package/dist/channel/core-port.js.map +0 -1
  334. package/dist/cli/server-ctl.js +0 -163
  335. package/dist/cli/server-ctl.js.map +0 -1
  336. package/dist/cli/service-status-parse.js.map +0 -1
  337. package/dist/command/catalog.js.map +0 -1
  338. package/dist/config/config-helpers.js +0 -100
  339. package/dist/config/config-helpers.js.map +0 -1
  340. package/dist/daemon/restart-intent.js.map +0 -1
  341. package/dist/daemon/service-control.js.map +0 -1
  342. package/dist/mcp/catalog.js.map +0 -1
  343. package/dist/mcp/failure-text.js +0 -46
  344. package/dist/mcp/failure-text.js.map +0 -1
  345. package/dist/onboard/commands.js.map +0 -1
  346. package/dist/onboard/ledger.js.map +0 -1
  347. package/dist/onboard/service-node.js +0 -183
  348. package/dist/onboard/service-node.js.map +0 -1
  349. package/dist/onboard/service.js +0 -310
  350. package/dist/onboard/service.js.map +0 -1
  351. package/dist/platform/atomic-write.js +0 -63
  352. package/dist/platform/atomic-write.js.map +0 -1
  353. package/dist/platform/error-info.js +0 -11
  354. package/dist/platform/error-info.js.map +0 -1
  355. package/dist/platform/json-document-store.js +0 -54
  356. package/dist/platform/json-document-store.js.map +0 -1
  357. package/dist/service/agent-entity/activity-errors.js +0 -71
  358. package/dist/service/agent-entity/activity-errors.js.map +0 -1
  359. package/dist/service/agent-entity/activity-reader.js.map +0 -1
  360. package/dist/service/agent-entity/agent-config.js +0 -48
  361. package/dist/service/agent-entity/agent-config.js.map +0 -1
  362. package/dist/service/agent-entity/history-query.js +0 -60
  363. package/dist/service/agent-entity/history-query.js.map +0 -1
  364. package/dist/service/agent-entity/identity-store.js.map +0 -1
  365. package/dist/service/agent-entity/read-helpers.js +0 -172
  366. package/dist/service/agent-entity/read-helpers.js.map +0 -1
  367. package/dist/service/agent-entity/runtime-profile.js +0 -53
  368. package/dist/service/agent-entity/runtime-profile.js.map +0 -1
  369. package/dist/service/agent-entity/runtime-state.js.map +0 -1
  370. package/dist/service/agent-entity/types.js.map +0 -1
  371. package/dist/service/channel-service/mcp-delegates.js +0 -21
  372. package/dist/service/channel-service/mcp-delegates.js.map +0 -1
  373. package/dist/service/channel-service/types.js.map +0 -1
  374. package/dist/service/channel-submission.js.map +0 -1
  375. package/dist/service/closed-fact.js +0 -49
  376. package/dist/service/closed-fact.js.map +0 -1
  377. package/dist/service/deduplicate.js +0 -42
  378. package/dist/service/deduplicate.js.map +0 -1
  379. package/dist/service/dispatcher-core-events/scoped-source.js +0 -59
  380. package/dist/service/dispatcher-core-events/scoped-source.js.map +0 -1
  381. package/dist/service/dispatcher-service/dispatcher-workflows.js +0 -50
  382. package/dist/service/dispatcher-service/dispatcher-workflows.js.map +0 -1
  383. package/dist/service/dispatcher-service/identity.js +0 -97
  384. package/dist/service/dispatcher-service/identity.js.map +0 -1
  385. package/dist/service/dispatcher-service/inbound-task-drain.js +0 -37
  386. package/dist/service/dispatcher-service/inbound-task-drain.js.map +0 -1
  387. package/dist/service/dispatcher-service/input-source-lifecycle.js +0 -312
  388. package/dist/service/dispatcher-service/input-source-lifecycle.js.map +0 -1
  389. package/dist/service/dispatcher-service/input-source-start-rollback.js +0 -53
  390. package/dist/service/dispatcher-service/input-source-start-rollback.js.map +0 -1
  391. package/dist/service/dispatcher-service/mcp-delegates.js +0 -67
  392. package/dist/service/dispatcher-service/mcp-delegates.js.map +0 -1
  393. package/dist/service/dispatcher-service/restart-notice.js +0 -27
  394. package/dist/service/dispatcher-service/restart-notice.js.map +0 -1
  395. package/dist/service/dispatcher-service/runnable-channel.js +0 -13
  396. package/dist/service/dispatcher-service/runnable-channel.js.map +0 -1
  397. package/dist/service/dispatcher-service/runtime-helpers.js +0 -11
  398. package/dist/service/dispatcher-service/runtime-helpers.js.map +0 -1
  399. package/dist/service/dispatcher-service/runtime-status.js +0 -35
  400. package/dist/service/dispatcher-service/runtime-status.js.map +0 -1
  401. package/dist/service/dispatcher-service/team-leader-handle.js +0 -29
  402. package/dist/service/dispatcher-service/team-leader-handle.js.map +0 -1
  403. package/dist/service/dispatcher-service/team-runtime-stop.js +0 -13
  404. package/dist/service/dispatcher-service/team-runtime-stop.js.map +0 -1
  405. package/dist/service/dispatcher-service/teammate-ops.js +0 -14
  406. package/dist/service/dispatcher-service/teammate-ops.js.map +0 -1
  407. package/dist/service/frozen-snapshot.js +0 -16
  408. package/dist/service/frozen-snapshot.js.map +0 -1
  409. package/dist/service/in-flight-work.js.map +0 -1
  410. package/dist/service/legacy-state.js +0 -119
  411. package/dist/service/legacy-state.js.map +0 -1
  412. package/dist/service/mcp/descriptor.js.map +0 -1
  413. package/dist/service/scheduler/mcp-delegate.js.map +0 -1
  414. package/dist/service/scheduler/service.js.map +0 -1
  415. package/dist/service/serial-queue.js +0 -64
  416. package/dist/service/serial-queue.js.map +0 -1
  417. package/dist/service/shutdown-errors.js.map +0 -1
  418. package/dist/service/team-collection/commands.js.map +0 -1
  419. package/dist/service/team-collection/create-request.js.map +0 -1
  420. package/dist/service/team-collection/errors.js.map +0 -1
  421. package/dist/service/team-collection/index.js +0 -304
  422. package/dist/service/team-collection/index.js.map +0 -1
  423. package/dist/service/team-collection/mcp-delegate.js +0 -389
  424. package/dist/service/team-collection/mcp-delegate.js.map +0 -1
  425. package/dist/service/team-collection/read-helpers.js +0 -66
  426. package/dist/service/team-collection/read-helpers.js.map +0 -1
  427. package/dist/service/team-collection/read-model.js +0 -120
  428. package/dist/service/team-collection/read-model.js.map +0 -1
  429. package/dist/service/team-collection/roster-reader.js +0 -52
  430. package/dist/service/team-collection/roster-reader.js.map +0 -1
  431. package/dist/service/team-collection/runtime-registry.js +0 -369
  432. package/dist/service/team-collection/runtime-registry.js.map +0 -1
  433. package/dist/service/team-collection/store.js +0 -320
  434. package/dist/service/team-collection/store.js.map +0 -1
  435. package/dist/service/team-collection/types.js.map +0 -1
  436. package/dist/service/team-collection/worktree-cleanup.js +0 -45
  437. package/dist/service/team-collection/worktree-cleanup.js.map +0 -1
  438. package/dist/service/team-service/closing.js +0 -279
  439. package/dist/service/team-service/closing.js.map +0 -1
  440. package/dist/service/team-service/collaborators.js +0 -82
  441. package/dist/service/team-service/collaborators.js.map +0 -1
  442. package/dist/service/team-service/completion-targets.js +0 -72
  443. package/dist/service/team-service/completion-targets.js.map +0 -1
  444. package/dist/service/team-service/index.js +0 -559
  445. package/dist/service/team-service/index.js.map +0 -1
  446. package/dist/service/team-service/leader-agent.js +0 -170
  447. package/dist/service/team-service/leader-agent.js.map +0 -1
  448. package/dist/service/team-service/roster-projection.js +0 -69
  449. package/dist/service/team-service/roster-projection.js.map +0 -1
  450. package/dist/service/team-service/team-summary.js.map +0 -1
  451. package/dist/service/team-service/types.js +0 -61
  452. package/dist/service/team-service/types.js.map +0 -1
  453. package/dist/service/teammate-collection/commands.js.map +0 -1
  454. package/dist/service/teammate-collection/dissolve-members.js +0 -44
  455. package/dist/service/teammate-collection/dissolve-members.js.map +0 -1
  456. package/dist/service/teammate-collection/errors.js.map +0 -1
  457. package/dist/service/teammate-collection/index.js +0 -497
  458. package/dist/service/teammate-collection/index.js.map +0 -1
  459. package/dist/service/teammate-collection/mcp-delegate.js +0 -210
  460. package/dist/service/teammate-collection/mcp-delegate.js.map +0 -1
  461. package/dist/service/teammate-collection/mcp-tool-descriptors.js +0 -421
  462. package/dist/service/teammate-collection/mcp-tool-descriptors.js.map +0 -1
  463. package/dist/service/teammate-collection/system-prompt.js.map +0 -1
  464. package/dist/service/teammate-collection/types.js.map +0 -1
  465. package/dist/service/teammate-service/admission-ledger.js.map +0 -1
  466. package/dist/service/teammate-service/completion-renderer.js.map +0 -1
  467. package/dist/service/teammate-service/factory.js +0 -5
  468. package/dist/service/teammate-service/factory.js.map +0 -1
  469. package/dist/service/teammate-service/index.js.map +0 -1
  470. package/dist/service/teammate-service/runtime-owner.js.map +0 -1
  471. package/dist/service/teammate-service/submission.js.map +0 -1
  472. package/dist/service/teammate-service/turn-coordinator.js +0 -93
  473. package/dist/service/teammate-service/turn-coordinator.js.map +0 -1
  474. package/dist/service/teammate-service/turn-recording.js +0 -178
  475. package/dist/service/teammate-service/turn-recording.js.map +0 -1
  476. package/dist/service/teammate-service/types.js +0 -12
  477. package/dist/service/teammate-service/types.js.map +0 -1
  478. package/dist/service/workflow-service/agent-policy.js +0 -6
  479. package/dist/service/workflow-service/agent-policy.js.map +0 -1
  480. package/dist/service/workflow-service/json-args.js +0 -72
  481. package/dist/service/workflow-service/json-args.js.map +0 -1
  482. package/dist/service/workflow-service/run-support.js.map +0 -1
  483. package/dist/service/workflow-service/run-terminal.js +0 -111
  484. package/dist/service/workflow-service/run-terminal.js.map +0 -1
  485. package/dist/state/dispatcher-id.js.map +0 -1
  486. package/dist/state/dispatcher-store.js +0 -73
  487. package/dist/state/dispatcher-store.js.map +0 -1
  488. /package/dist/{service/channel-service → command}/types.js +0 -0
  489. /package/dist/{service → platform}/in-flight-work.js +0 -0
  490. /package/dist/{service → platform}/shutdown-errors.js +0 -0
  491. /package/dist/service/{teammate-collection → agent}/errors.js +0 -0
  492. /package/dist/service/{teammate-service → agent}/submission.js +0 -0
  493. /package/dist/service/{teammate-collection → agent}/types.js +0 -0
  494. /package/dist/service/{team-service → team}/team-summary.js +0 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Managed-service launch environment: Node-binary selection for the pinned
3
+ * service Node, and PATH/launch-environment orchestration (the env vars and
4
+ * effective PATH persisted into the service unit, and the preflight that
5
+ * confirms the service can actually launch under them). Declares
6
+ * `ServiceInstallAnswers`, the resolved-answers shape both entry points
7
+ * render a unit from. `resolveManagedServiceAnswers` is the one install
8
+ * pipeline (fallback exec dirs → provider binary resolution → stable Node
9
+ * selection) `daemon install` (`daemon/install.ts`) and `dreamux onboard`
10
+ * (`onboard/run.ts`) both build a `ServiceInstallAnswers` from.
11
+ */
12
+ import { constants } from 'node:fs';
13
+ import { access, realpath } from 'node:fs/promises';
14
+ import { homedir } from 'node:os';
15
+ import { delimiter, dirname, isAbsolute, join, resolve } from 'node:path';
16
+ import { errorMessage } from '@excitedjs/dreamux-utils';
17
+ import { expandHome } from '../config/config.js';
18
+ import { buildServicePath, dreamuxRoot, probeStandardExecDirs, withServicePath, } from '../platform/paths.js';
19
+ import { providerBinChecksForConfig, } from '../provider-diagnostics.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Service-Node selection
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Minimum Node version the managed-service environment requires. The launchd
25
+ * plist and systemd user unit persist a stable Node binary; selection (see
26
+ * {@link selectServiceNodeBin}) refuses candidates below this version.
27
+ */
28
+ export const MIN_SERVICE_NODE_VERSION = '22.7.0';
29
+ /**
30
+ * Parse a `node --version` (or `v<major>.<minor>.<patch>`) string and decide
31
+ * whether it satisfies {@link MIN_SERVICE_NODE_VERSION}. Pure and side-effect
32
+ * free so selection and the launch doctor share one comparison.
33
+ */
34
+ export function nodeVersionSatisfies(raw) {
35
+ const match = raw.trim().match(/^v?(\d+)\.(\d+)\.(\d+)/);
36
+ if (match === null)
37
+ return false;
38
+ const major = Number(match[1]);
39
+ const minor = Number(match[2]);
40
+ if (!Number.isInteger(major) || !Number.isInteger(minor))
41
+ return false;
42
+ if (major > 22)
43
+ return true;
44
+ return major === 22 && minor >= 7;
45
+ }
46
+ export const defaultServiceNodeProbe = {
47
+ realpath: (path) => realpath(path),
48
+ isExecutable: (path) => isExecutable(path),
49
+ };
50
+ // Markers matched (case-insensitively) against a Node binary's resolved path.
51
+ // Each keeps a leading `/.<name>/` or segment anchor so a user dir like
52
+ // `/home/volta/` never matches `/.volta/`. macOS fnm installs under
53
+ // `~/Library/Application Support/fnm/`; dreamux supports launchd so cover it.
54
+ const VERSION_MANAGER_MARKERS = [
55
+ { manager: 'nvm', markers: ['/.nvm/versions/node/'] },
56
+ {
57
+ manager: 'fnm',
58
+ markers: [
59
+ '/.fnm/',
60
+ 'fnm_multishells',
61
+ '/.local/share/fnm/',
62
+ '/library/application support/fnm/',
63
+ ],
64
+ },
65
+ { manager: 'asdf', markers: ['/.asdf/installs/nodejs/', '/.asdf/shims/'] },
66
+ { manager: 'volta', markers: ['/.volta/'] },
67
+ ];
68
+ /** Pure marker match on a single path; returns the manager name or null. */
69
+ export function versionManagerOfPath(path) {
70
+ const needle = path.toLowerCase();
71
+ for (const entry of VERSION_MANAGER_MARKERS) {
72
+ if (entry.markers.some((marker) => needle.includes(marker))) {
73
+ return entry.manager;
74
+ }
75
+ }
76
+ return null;
77
+ }
78
+ /**
79
+ * Single async/injectable predicate selection and doctor share. Resolves
80
+ * symlinks first so a `/usr/local/bin/node` shim into nvm/fnm/asdf is caught;
81
+ * falls back to the raw path when realpath fails.
82
+ */
83
+ export async function detectServiceNodeVersionManager(nodeBin, probe = defaultServiceNodeProbe) {
84
+ const raw = versionManagerOfPath(nodeBin);
85
+ if (raw !== null)
86
+ return raw;
87
+ let resolved;
88
+ try {
89
+ resolved = await probe.realpath(nodeBin);
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ return versionManagerOfPath(resolved);
95
+ }
96
+ /**
97
+ * Platform-aware stable Node candidates. macOS covers Homebrew (Apple Silicon
98
+ * and Intel prefixes); Linux covers standard system locations.
99
+ */
100
+ export function stableNodeCandidates(platform) {
101
+ if (platform === 'darwin') {
102
+ return [
103
+ '/opt/homebrew/bin/node',
104
+ '/opt/homebrew/opt/node/bin/node',
105
+ '/opt/homebrew/opt/node@24/bin/node',
106
+ '/opt/homebrew/opt/node@22/bin/node',
107
+ '/usr/local/bin/node',
108
+ '/usr/local/opt/node/bin/node',
109
+ '/usr/local/opt/node@24/bin/node',
110
+ '/usr/local/opt/node@22/bin/node',
111
+ '/usr/bin/node',
112
+ ];
113
+ }
114
+ return ['/usr/local/bin/node', '/usr/bin/node', '/bin/node'];
115
+ }
116
+ /**
117
+ * Choose the Node binary persisted into the managed-service environment.
118
+ * Prefers a stable system Node (exists, not version-manager-bound, satisfies
119
+ * MIN_SERVICE_NODE_VERSION); falls back to the current Node otherwise.
120
+ */
121
+ export async function selectServiceNodeBin(options) {
122
+ const probe = options.probe ?? defaultServiceNodeProbe;
123
+ for (const candidate of stableNodeCandidates(options.platform)) {
124
+ if (!(await probe.isExecutable(candidate)))
125
+ continue;
126
+ if ((await detectServiceNodeVersionManager(candidate, probe)) !== null) {
127
+ continue;
128
+ }
129
+ let version;
130
+ try {
131
+ version = await options.runner.capture(candidate, ['--version']);
132
+ }
133
+ catch {
134
+ continue;
135
+ }
136
+ if (!nodeVersionSatisfies(version))
137
+ continue;
138
+ // Persist the candidate path itself (a stable symlink), never its realpath,
139
+ // so a Homebrew symlink keeps the volatile Cellar path out of the service.
140
+ return candidate;
141
+ }
142
+ return stabilizeHomebrewCellarNode(options.currentNodeBin, options.platform, probe);
143
+ }
144
+ const HOMEBREW_PREFIXES = ['/opt/homebrew', '/usr/local'];
145
+ function matchHomebrewCellar(path) {
146
+ for (const prefix of HOMEBREW_PREFIXES) {
147
+ const cellar = `${prefix}/Cellar/node`;
148
+ if (!path.startsWith(`${cellar}/`) && !path.startsWith(`${cellar}@`)) {
149
+ continue;
150
+ }
151
+ const major = path.slice(cellar.length).match(/^@(\d+)\//);
152
+ return { prefix, major: major === null ? null : major[1] };
153
+ }
154
+ return null;
155
+ }
156
+ /**
157
+ * Homebrew Cellar (`<prefix>/Cellar/node[@major]/<version>/bin/node`) is a
158
+ * version-pinned path unfit for a persistent service. Best-effort remap to the
159
+ * matching stable Homebrew symlink; no match returns the input unchanged and
160
+ * never throws. darwin-only.
161
+ */
162
+ export async function stabilizeHomebrewCellarNode(nodeBin, platform, probe = defaultServiceNodeProbe) {
163
+ if (platform !== 'darwin')
164
+ return nodeBin;
165
+ let resolved;
166
+ try {
167
+ resolved = await probe.realpath(nodeBin);
168
+ }
169
+ catch {
170
+ resolved = nodeBin;
171
+ }
172
+ const cellar = matchHomebrewCellar(nodeBin) ?? matchHomebrewCellar(resolved);
173
+ if (cellar === null)
174
+ return nodeBin;
175
+ const links = [];
176
+ if (cellar.major !== null) {
177
+ links.push(`${cellar.prefix}/opt/node@${cellar.major}/bin/node`);
178
+ }
179
+ links.push(`${cellar.prefix}/opt/node/bin/node`, `${cellar.prefix}/bin/node`);
180
+ for (const link of links) {
181
+ if (!(await probe.isExecutable(link)))
182
+ continue;
183
+ try {
184
+ if ((await probe.realpath(link)) === resolved)
185
+ return link;
186
+ }
187
+ catch {
188
+ // ignore and try the next candidate symlink
189
+ }
190
+ }
191
+ return nodeBin;
192
+ }
193
+ /** True when `path` is executable by the current process; never throws. */
194
+ export async function isExecutable(path) {
195
+ try {
196
+ await access(path, constants.X_OK);
197
+ return true;
198
+ }
199
+ catch {
200
+ return false;
201
+ }
202
+ }
203
+ // ---------------------------------------------------------------------------
204
+ // PATH / launch-environment orchestration
205
+ // ---------------------------------------------------------------------------
206
+ export function managedServiceEnvironment(answers) {
207
+ const home = answers.homeDir ?? homedir();
208
+ // Unit PATH: stable dirs → captured session PATH → fallbacks (see managedServicePath).
209
+ const env = {
210
+ DREAMUX_ROOT: dreamuxRoot(),
211
+ HOME: home,
212
+ DREAMUX_NODE_BIN: answers.nodeBin,
213
+ PATH: managedServicePath(answers),
214
+ };
215
+ return env;
216
+ }
217
+ export async function validateManagedServiceLaunch(answers, runner) {
218
+ const env = managedServiceEnvironment(answers);
219
+ const errors = [];
220
+ try {
221
+ const version = await runner.capture(answers.nodeBin, ['--version'], {
222
+ env,
223
+ });
224
+ if (!nodeVersionSatisfies(version)) {
225
+ errors.push(`managed service Node must be >=${MIN_SERVICE_NODE_VERSION}: ${answers.nodeBin} reported ${version.trim() || '<empty>'}`);
226
+ }
227
+ }
228
+ catch (err) {
229
+ errors.push(`managed service cannot execute Node at ${answers.nodeBin}: ${errorMessage(err)}`);
230
+ }
231
+ if (!(await runner.check(answers.dreamuxBin, ['--help'], { env }))) {
232
+ errors.push(`managed service cannot execute dreamux launcher at ${answers.dreamuxBin}`);
233
+ }
234
+ for (const check of answers.providerBinChecks) {
235
+ if (!(await runner.check(check.bin, check.args, { env }))) {
236
+ errors.push(`managed service cannot execute provider binary '${check.name}' at ${check.bin}`);
237
+ }
238
+ }
239
+ return {
240
+ ok: errors.length === 0,
241
+ errors,
242
+ };
243
+ }
244
+ export async function resolveServiceExecutable(command, env) {
245
+ const trimmed = command.trim();
246
+ if (trimmed === '') {
247
+ throw new Error('managed service executable path is empty');
248
+ }
249
+ if (trimmed.includes('/') || trimmed.startsWith('~')) {
250
+ const candidate = resolve(expandHome(trimmed));
251
+ await assertExecutable(candidate, command);
252
+ return candidate;
253
+ }
254
+ for (const dir of (env['PATH'] ?? '').split(delimiter)) {
255
+ if (dir === '')
256
+ continue;
257
+ const candidate = join(dir, trimmed);
258
+ if (await isExecutable(candidate))
259
+ return candidate;
260
+ }
261
+ throw new Error(`managed service cannot resolve executable '${command}' from PATH; pass an absolute path and rerun dreamux onboard`);
262
+ }
263
+ /**
264
+ * Builds the resolve-time effective PATH used to resolve bare provider/agent
265
+ * binaries during `onboard`/`daemon install`. Captured session PATH leads, then
266
+ * the caller's captured fresh-install fallback dirs.
267
+ * Stable Dreamux-owned dirs are added at service render time (see
268
+ * managedServicePath). Delegates to {@link withServicePath} in paths.ts. Never
269
+ * mutates env.
270
+ */
271
+ export function withUserLocalBinPath(env, fallbackDirs) {
272
+ const sessionPath = env['PATH'] ?? '';
273
+ return withServicePath(env, { stableDirs: [], sessionPath, fallbackDirs });
274
+ }
275
+ function configuredProviderBinChecks(config, env, catalogs) {
276
+ return providerBinChecksForConfig({
277
+ config,
278
+ catalogs,
279
+ env,
280
+ scope: 'managedService',
281
+ });
282
+ }
283
+ /**
284
+ * The one "resolve fallback exec dirs → resolve provider binary paths →
285
+ * select a stable service Node" pipeline shared by `daemon install`
286
+ * (`daemon/install.ts`'s `runDaemonInstall`) and `dreamux onboard`
287
+ * (`onboard/run.ts`'s `runOnboard`). `config`/`catalogs` are nullable because
288
+ * onboard's dry run never writes (and so never reads back) a real config;
289
+ * `daemon install` always has one already on disk.
290
+ */
291
+ export async function resolveManagedServiceAnswers(input) {
292
+ const fallbackDirs = await probeStandardExecDirs({
293
+ platform: input.host.platform,
294
+ homeDir: input.host.homeDir,
295
+ env: input.env,
296
+ });
297
+ const resolveEnv = withUserLocalBinPath(input.env, fallbackDirs);
298
+ const providerBinChecks = input.config === null || input.catalogs === null
299
+ ? []
300
+ : await Promise.all(configuredProviderBinChecks(input.config, input.env, input.catalogs).map(async (check) => ({
301
+ ...check,
302
+ bin: input.dryRun
303
+ ? check.bin
304
+ : await resolveServiceExecutable(check.bin, resolveEnv),
305
+ })));
306
+ // Pin the managed service to a stable system Node (issue #83) rather than
307
+ // the current process Node — otherwise running onboard/daemon install from
308
+ // a version-manager Node would re-pin the service to that unstable Node.
309
+ const nodeBin = input.dryRun
310
+ ? process.execPath
311
+ : await selectServiceNodeBin({
312
+ platform: input.host.platform,
313
+ currentNodeBin: process.execPath,
314
+ runner: input.host.runner,
315
+ probe: input.nodeProbe,
316
+ });
317
+ return {
318
+ dreamuxBin: input.dreamuxBin,
319
+ nodeBin,
320
+ providerBinChecks,
321
+ startService: input.startService,
322
+ dryRun: input.dryRun,
323
+ homeDir: input.host.homeDir,
324
+ env: input.env,
325
+ fallbackDirs,
326
+ };
327
+ }
328
+ function managedServicePath(answers) {
329
+ // Service PATH order: stable Dreamux-owned dirs (Node bin, provider bin dirs,
330
+ // dreamux bin) → captured session PATH (original order) → fresh-install
331
+ // fallback dirs from paths.ts. De-duped via buildServicePath. Never reads
332
+ // process.env; platform/homeDir/env passed explicitly.
333
+ const stableDirs = [
334
+ dirname(answers.nodeBin),
335
+ ...answers.providerBinChecks.flatMap((check) => absoluteDir(check.bin)),
336
+ ...absoluteDir(answers.dreamuxBin),
337
+ ];
338
+ const sessionPath = answers.env?.['PATH'] ?? '';
339
+ return buildServicePath({
340
+ stableDirs,
341
+ sessionPath,
342
+ fallbackDirs: answers.fallbackDirs,
343
+ });
344
+ }
345
+ function absoluteDir(path) {
346
+ return isAbsolute(path) ? [dirname(path)] : [];
347
+ }
348
+ async function assertExecutable(path, label) {
349
+ if (await isExecutable(path))
350
+ return;
351
+ throw new Error(`managed service executable is not runnable: ${label}`);
352
+ }
353
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/daemon/environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { homedir } from 'node:os';
2
+ import { ExecaCommandRunner, } from '../platform/command-runner.js';
3
+ /**
4
+ * Resolve a `ServiceHost` from caller-supplied overrides (tests pass a fake
5
+ * runner/probe; production CLI entry points pass nothing and get the real
6
+ * shell runner, current platform, home dir, and uid).
7
+ */
8
+ export function createServiceHost(overrides = {}) {
9
+ return {
10
+ runner: overrides.runner ?? new ExecaCommandRunner(),
11
+ platform: overrides.platform ?? process.platform,
12
+ homeDir: overrides.homeDir ?? homedir(),
13
+ uid: overrides.uid ?? process.getuid?.(),
14
+ };
15
+ }
16
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/daemon/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AAiBvC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAkC,EAAE;IAEpC,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,IAAI,kBAAkB,EAAE;QACpD,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAChD,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,OAAO,EAAE;QACvC,GAAG,EAAE,SAAS,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE;KACzC,CAAC;AACJ,CAAC"}
@@ -1,41 +1,38 @@
1
1
  /**
2
- * `dreamux daemon install` / `daemon uninstall`.
2
+ * `daemon/` owns the managed-service lifecycle end to end: rendering and
3
+ * installing the launchd/systemd unit (`installUserService`,
4
+ * `registerLaunchd`, `registerSystemd`, `enableSystemdLinger`), and removing
5
+ * it (`removeUserService`).
3
6
  *
4
- * `install` re-registers the user-level service from the already-written
5
- * dreamux config (it does not collect onboarding answers). It reuses the exact
6
- * service slice onboard uses — `installUserService` — so linger handling and
7
- * the unit contents stay single-sourced. `uninstall` removes only the service
8
- * unit (never config / state / logs); that is the boundary against the
9
- * top-level `dreamux uninstall`.
7
+ * `dreamux daemon install` / `daemon uninstall` (`runDaemonInstall` /
8
+ * `runDaemonUninstall` below) re-register or remove the service from the
9
+ * already-written dreamux config; they do not collect onboarding answers.
10
+ * `dreamux onboard` (`onboard/run.ts`) is the other caller of
11
+ * `installUserService`, so linger handling and unit contents stay
12
+ * single-sourced across both entry points. `daemon uninstall` removes only
13
+ * the service unit (never config / state / logs); that is the boundary
14
+ * against the top-level `dreamux uninstall`.
10
15
  */
11
- import { ExecaCommandRunner } from '../onboard/commands.js';
12
- import { homedir } from 'node:os';
13
- import { installUserService, removeUserService, resolveServiceExecutable, selectServiceNodeBin, validateManagedServiceLaunch, withUserLocalBinPath, } from '../onboard/service.js';
14
- import { TransparentFileLedger } from '../onboard/ledger.js';
15
- import { globalConfigDir, loadConfig, } from '../config/config.js';
16
+ import { rm } from 'node:fs/promises';
17
+ import { join } from 'node:path';
16
18
  import { AgentRuntimeProviderCatalog } from '../agent-runtime/catalog.js';
17
19
  import { ChannelProviderCatalog } from '../channel/catalog.js';
18
- import { providerBinChecksForConfig, } from '../provider-diagnostics.js';
20
+ import { loadConfig } from '../config/load.js';
21
+ import { ensureDirectory, ensureTextFile, TransparentFileLedger, writeTextFile, } from '../platform/file-ledger.js';
22
+ import { pathExists } from '../platform/fs-errors.js';
19
23
  import { dreamuxBinPath } from '../platform/package-bin.js';
20
- import { probeStandardExecDirs, setRuntimeConfig, } from '../platform/paths.js';
21
- function serviceProviderBinChecks(config, env, catalogs) {
22
- return providerBinChecksForConfig({
23
- config,
24
- catalogs,
25
- env,
26
- scope: 'managedService',
27
- });
28
- }
24
+ import { logsRoot, stateRoot } from '../platform/paths.js';
25
+ import { resolveManagedServiceAnswers, validateManagedServiceLaunch, } from './environment.js';
26
+ import { createServiceHost } from './host.js';
27
+ import { launchdTarget, renderLaunchdPlist, renderSystemdUnit, serviceUnitPath, SYSTEMD_UNIT, } from './unit.js';
29
28
  export async function runDaemonInstall(options = {}) {
30
- const runner = options.runner ?? new ExecaCommandRunner();
29
+ const host = createServiceHost(options);
31
30
  const env = options.env ?? process.env;
32
- const platform = options.platform ?? process.platform;
33
- const homeDir = options.homeDir ?? homedir();
34
31
  const dryRun = options.dryRun ?? false;
35
32
  const startService = options.startService ?? true;
36
33
  // Fail loudly when the operator has not run onboard yet — daemon install
37
34
  // re-registers an existing setup, it does not create one.
38
- const loaded = await loadConfig({ configDir: globalConfigDir() });
35
+ const loaded = await loadConfig();
39
36
  const { config } = loaded;
40
37
  const catalogs = {
41
38
  agentRuntime: new AgentRuntimeProviderCatalog({
@@ -45,44 +42,23 @@ export async function runDaemonInstall(options = {}) {
45
42
  registry: loaded.providerRegistry,
46
43
  }),
47
44
  };
48
- setRuntimeConfig(config);
49
- const fallbackDirs = await probeStandardExecDirs({ platform, homeDir, env }, options.execDirProbe);
50
- const resolveEnv = withUserLocalBinPath(env, fallbackDirs);
51
- const providerBinChecks = await Promise.all(serviceProviderBinChecks(config, env, catalogs).map(async (check) => ({
52
- ...check,
53
- bin: dryRun
54
- ? check.bin
55
- : await resolveServiceExecutable(check.bin, resolveEnv),
56
- })));
57
- // Pin the managed service to a stable system Node (issue #83) rather than the
58
- // current process Node — otherwise running `daemon install` from a
59
- // version-manager Node would re-pin the service to that unstable Node.
60
- const nodeBin = dryRun
61
- ? process.execPath
62
- : await selectServiceNodeBin({
63
- platform,
64
- currentNodeBin: process.execPath,
65
- runner,
66
- ...(options.nodeProbe !== undefined ? { probe: options.nodeProbe } : {}),
67
- });
68
45
  // Persist the effective env/homeDir and captured fallback dirs (not the
69
46
  // optional raw option values) so managedServicePath renders the same PATH
70
47
  // used by provider resolution. In normal CLI use options.env is undefined, so
71
48
  // env falls back to process.env — that ambient PATH must be persisted into
72
49
  // the service unit.
73
- const answers = {
74
- configDir: globalConfigDir(),
50
+ const answers = await resolveManagedServiceAnswers({
51
+ config,
52
+ catalogs,
75
53
  dreamuxBin: dreamuxBinPath(env),
76
- nodeBin,
77
- providerBinChecks,
78
54
  startService,
79
55
  dryRun,
80
- homeDir,
56
+ host,
81
57
  env,
82
- fallbackDirs,
83
- };
58
+ nodeProbe: options.nodeProbe,
59
+ });
84
60
  if (!dryRun) {
85
- const launch = await validateManagedServiceLaunch(answers, runner);
61
+ const launch = await validateManagedServiceLaunch(answers, host.runner);
86
62
  if (!launch.ok) {
87
63
  throw new Error([
88
64
  'dreamux managed service launch environment is not ready',
@@ -92,24 +68,146 @@ export async function runDaemonInstall(options = {}) {
92
68
  }
93
69
  }
94
70
  const ledger = new TransparentFileLedger();
95
- const service = await installUserService({
96
- answers,
97
- ledger,
98
- runner,
99
- platform,
100
- homeDir,
101
- uid: options.uid,
102
- });
71
+ const service = await installUserService({ answers, ledger, host });
103
72
  return { service, files: ledger.entries() };
104
73
  }
105
74
  export async function runDaemonUninstall(options = {}) {
106
- const runner = options.runner ?? new ExecaCommandRunner();
107
- return removeUserService({
108
- runner,
109
- platform: options.platform,
110
- homeDir: options.homeDir,
111
- uid: options.uid,
112
- dryRun: options.dryRun ?? false,
75
+ const host = createServiceHost(options);
76
+ return removeUserService({ host, dryRun: options.dryRun ?? false });
77
+ }
78
+ export async function installUserService(options) {
79
+ const unit = serviceUnitPath(options.host.platform, options.host.homeDir);
80
+ const workingDir = stateRoot();
81
+ const logDir = logsRoot();
82
+ const stdoutLog = join(logDir, 'daemon.stdout.log');
83
+ const stderrLog = join(logDir, 'daemon.stderr.log');
84
+ await ensureDirectory(workingDir, options.ledger, 'managed service working directory', { dryRun: options.answers.dryRun });
85
+ await ensureDirectory(logDir, options.ledger, 'daemon log directory', {
86
+ dryRun: options.answers.dryRun,
87
+ });
88
+ await ensureTextFile(stdoutLog, '', options.ledger, 'daemon stdout log', {
89
+ mode: 0o600,
90
+ dryRun: options.answers.dryRun,
91
+ });
92
+ await ensureTextFile(stderrLog, '', options.ledger, 'daemon stderr log', {
93
+ mode: 0o600,
94
+ dryRun: options.answers.dryRun,
95
+ });
96
+ const content = unit.platform === 'launchd'
97
+ ? renderLaunchdPlist(options.answers, stdoutLog, stderrLog)
98
+ : renderSystemdUnit(options.answers, stdoutLog, stderrLog);
99
+ const unitStatus = await writeTextFile(unit.path, content, options.ledger, `${unit.platform} unit`, {
100
+ mode: 0o600,
101
+ dryRun: options.answers.dryRun,
102
+ });
103
+ let lingerEnabled = null;
104
+ const warnings = [];
105
+ if (unit.platform === 'launchd') {
106
+ await registerLaunchd(unit.path, unitStatus, options);
107
+ }
108
+ else {
109
+ const systemd = await registerSystemd(unit.path, options);
110
+ lingerEnabled = systemd.lingerEnabled;
111
+ warnings.push(...systemd.warnings);
112
+ }
113
+ return {
114
+ platform: unit.platform,
115
+ unitPath: unit.path,
116
+ registered: true,
117
+ started: options.answers.startService,
118
+ lingerEnabled,
119
+ warnings,
120
+ };
121
+ }
122
+ async function registerLaunchd(unitPath, unitStatus, options) {
123
+ const serviceTarget = launchdTarget(options.host.uid);
124
+ const domain = `gui/${options.host.uid}`;
125
+ const loaded = await options.host.runner.check('launchctl', ['print', serviceTarget], { dryRun: options.answers.dryRun });
126
+ if (!loaded) {
127
+ await options.host.runner.run('launchctl', ['bootstrap', domain, unitPath], {
128
+ dryRun: options.answers.dryRun,
129
+ });
130
+ }
131
+ else if (unitStatus !== 'unchanged') {
132
+ await options.host.runner.run('launchctl', ['bootout', serviceTarget], {
133
+ dryRun: options.answers.dryRun,
134
+ });
135
+ await options.host.runner.run('launchctl', ['bootstrap', domain, unitPath], {
136
+ dryRun: options.answers.dryRun,
137
+ });
138
+ }
139
+ if (options.answers.startService) {
140
+ await options.host.runner.run('launchctl', ['kickstart', '-k', serviceTarget], { dryRun: options.answers.dryRun });
141
+ }
142
+ }
143
+ async function registerSystemd(unitPath, options) {
144
+ await options.host.runner.run('systemctl', ['--user', 'daemon-reload'], {
145
+ dryRun: options.answers.dryRun,
113
146
  });
147
+ const enableArgs = options.answers.startService
148
+ ? ['--user', 'enable', '--now', SYSTEMD_UNIT]
149
+ : ['--user', 'enable', SYSTEMD_UNIT];
150
+ await options.host.runner.run('systemctl', enableArgs, {
151
+ dryRun: options.answers.dryRun,
152
+ });
153
+ options.ledger.record(unitPath, 'unchanged', 'systemd user service registered');
154
+ // `systemctl --user enable` only schedules the service for an active login
155
+ // session. `loginctl enable-linger` makes a user service boot without a login;
156
+ // without it "enabled" silently fails to autostart on reboot. Best-effort: a
157
+ // strict polkit / non-root setup may deny it, but that must not fail onboard.
158
+ const { lingerEnabled, warnings } = await enableSystemdLinger(options);
159
+ return { lingerEnabled, warnings };
160
+ }
161
+ /** Enable systemd user lingering, best-effort. Skipped (null) on dry run. */
162
+ export async function enableSystemdLinger(options) {
163
+ if (options.answers.dryRun)
164
+ return { lingerEnabled: null, warnings: [] };
165
+ const ok = await options.host.runner.check('loginctl', ['enable-linger']);
166
+ if (ok)
167
+ return { lingerEnabled: true, warnings: [] };
168
+ return {
169
+ lingerEnabled: false,
170
+ warnings: [
171
+ 'could not enable systemd lingering (loginctl enable-linger); the service ' +
172
+ 'will not start at boot until you log in. Enable it manually with: ' +
173
+ 'loginctl enable-linger',
174
+ ],
175
+ };
176
+ }
177
+ /**
178
+ * Unregister and remove the user-level service unit only. Shared by
179
+ * `dreamux uninstall` (also recursively removes DREAMUX_ROOT) and
180
+ * `daemon uninstall` (removes nothing else). Unit-file removal is authoritative.
181
+ */
182
+ export async function removeUserService(options) {
183
+ const unit = serviceUnitPath(options.host.platform, options.host.homeDir);
184
+ const dryRun = options.dryRun ?? false;
185
+ if (unit.platform === 'launchd') {
186
+ const serviceTarget = launchdTarget(options.host.uid);
187
+ const loaded = await options.host.runner.check('launchctl', ['print', serviceTarget], {
188
+ dryRun,
189
+ });
190
+ if (loaded) {
191
+ await runServiceBestEffort(options.host.runner, 'launchctl', ['bootout', serviceTarget], dryRun);
192
+ }
193
+ }
194
+ else {
195
+ await runServiceBestEffort(options.host.runner, 'systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT], dryRun);
196
+ }
197
+ const existed = await pathExists(unit.path);
198
+ if (existed && !dryRun)
199
+ await rm(unit.path, { force: true });
200
+ if (unit.platform === 'systemd') {
201
+ await runServiceBestEffort(options.host.runner, 'systemctl', ['--user', 'daemon-reload'], dryRun);
202
+ }
203
+ return { platform: unit.platform, unitPath: unit.path, removed: existed };
204
+ }
205
+ async function runServiceBestEffort(runner, command, args, dryRun) {
206
+ try {
207
+ await runner.run(command, args, { dryRun });
208
+ }
209
+ catch {
210
+ /* The unit may already be absent or stopped; file removal is authoritative. */
211
+ }
114
212
  }
115
213
  //# sourceMappingURL=install.js.map