@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,138 @@
1
+ import { pathExists } from '../platform/fs-errors.js';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { loadAgentRuntimeProviders } from '../agent-runtime/external-provider.js';
4
+ import { loadChannelProviders } from '../channel/external-channel-provider.js';
5
+ import { parseProviderRef, ProviderRegistry } from '../registry/index.js';
6
+ import { isPlainObject } from '@excitedjs/dreamux-utils';
7
+ import { createLogger } from '../platform/logger.js';
8
+ import { loadPlugins, readPluginConfigs, readPluginEntries, } from '../plugin/loader.js';
9
+ import { assertConfigFileMode, globalConfigFile, legacyGlobalConfigFile, mergeWithDefaults, } from './config.js';
10
+ export async function loadConfig(overrides = {}) {
11
+ const file = globalConfigFile();
12
+ const providerRegistry = overrides.providerRegistry ?? new ProviderRegistry();
13
+ await assertNoLegacyTomlOnly();
14
+ const { config, plugins } = await readConfigFile(file, providerRegistry);
15
+ return { config, configFile: file, providerRegistry, plugins };
16
+ }
17
+ /**
18
+ * Open, parse, and resolve `config.json`: existence and mode checks, JSON
19
+ * parse, one-time plugin load, then {@link resolveConfig}. Shared by the CLI
20
+ * read path below (`doctor`/`onboard`/`loadConfig`) and `ConfigService`'s own
21
+ * open sequence (`config/service.ts`'s `loadFile`), so "open the file" is
22
+ * written once; `ConfigService` additionally holds `raw` (the parsed object,
23
+ * returned here so it does not re-parse) for its `TransactionalStore`.
24
+ */
25
+ export async function readConfigFile(file, providerRegistry) {
26
+ if (!(await pathExists(file))) {
27
+ throw new Error(`dreamux config is missing at ${file}.\n` +
28
+ 'Run `dreamux onboard` to create it before starting the server.');
29
+ }
30
+ await assertConfigFileMode(file);
31
+ const text = await readFile(file, 'utf8');
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(text);
35
+ }
36
+ catch (err) {
37
+ const msg = err instanceof Error ? err.message : String(err);
38
+ throw new Error(`dreamux config parse error in ${file}: ${msg}\n` +
39
+ `Fix the JSON syntax in ${file}, then restart. Run \`dreamux onboard\` if you need to recreate the config.`);
40
+ }
41
+ // Plugins contribute providers config may address, so they load before
42
+ // provider refs are loaded and validated. A non-object top level is still
43
+ // reported by resolveConfig's mergeWithDefaults.
44
+ const entries = isPlainObject(parsed)
45
+ ? readPluginEntries(parsed, file)
46
+ : undefined;
47
+ const plugins = await loadPlugins({
48
+ registry: providerRegistry,
49
+ entries: entries ?? [],
50
+ // The serve file logger does not exist yet; contribute only registers.
51
+ logger: createLogger({ name: 'plugins' }),
52
+ });
53
+ const config = await resolveConfig(parsed, file, providerRegistry);
54
+ readPluginConfigs(plugins, file);
55
+ return {
56
+ // resolveConfig's mergeWithDefaults already rejects a non-object top
57
+ // level before returning, so parsed is a plain object whenever this
58
+ // line runs.
59
+ raw: parsed,
60
+ config: entries === undefined ? config : { ...config, plugins: entries },
61
+ plugins,
62
+ };
63
+ }
64
+ /**
65
+ * Loads the agent-runtime/channel providers `raw`'s `agents[]`/
66
+ * `dispatchers[].channels[]` entries reference, then validates and shapes
67
+ * `raw` into a `DreamuxConfig`. Deliberately excludes `plugins[]` loading
68
+ * (`loadPlugins`/`readPluginConfigs`): that is a one-time, process-open step
69
+ * — a plugin's `contribute()` registers providers and collides with itself
70
+ * if run twice — so callers that may resolve a config more than once per
71
+ * process (`ConfigService.replaceAgents`, `config/service.ts`) must not
72
+ * route `plugins[]` through here.
73
+ */
74
+ export async function resolveConfig(raw, file, providerRegistry) {
75
+ await loadAgentRuntimeProviders({
76
+ registry: providerRegistry,
77
+ refs: agentProviderRefs(raw),
78
+ });
79
+ await loadChannelProviders({
80
+ registry: providerRegistry,
81
+ refs: channelProviderRefs(raw),
82
+ });
83
+ return mergeWithDefaults(raw, file, providerRegistry);
84
+ }
85
+ export async function assertNoLegacyTomlOnly() {
86
+ const jsonFile = globalConfigFile();
87
+ const tomlFile = legacyGlobalConfigFile();
88
+ if ((await pathExists(jsonFile)) || !(await pathExists(tomlFile)))
89
+ return;
90
+ throw new Error(`legacy dreamux config detected at ${tomlFile}, but ${jsonFile} does not exist.\n` +
91
+ 'dreamux 0.x does not migrate TOML config; it will not read it or write default ' +
92
+ 'JSON over an existing install.\n' +
93
+ `Recreate the config as JSON (run \`dreamux onboard\`, or write ${jsonFile} with a ` +
94
+ `dispatchers array), then move ${tomlFile} aside.`);
95
+ }
96
+ /**
97
+ * Every well-formed `agents[].provider` ref the loader should resolve. Malformed
98
+ * refs are dropped here; normal config validation reports them with context.
99
+ */
100
+ function agentProviderRefs(raw) {
101
+ if (!isPlainObject(raw))
102
+ return [];
103
+ return providerRefsFrom(raw['agents'], (agent) => agent['provider']);
104
+ }
105
+ function channelProviderRefs(raw) {
106
+ if (!isPlainObject(raw))
107
+ return [];
108
+ const dispatchers = raw['dispatchers'];
109
+ if (!Array.isArray(dispatchers))
110
+ return [];
111
+ const out = [];
112
+ for (const dispatcher of dispatchers) {
113
+ if (!isPlainObject(dispatcher))
114
+ continue;
115
+ out.push(...providerRefsFrom(dispatcher['channels'], (channel) => channel['provider']));
116
+ }
117
+ return out;
118
+ }
119
+ function providerRefsFrom(entries, pick) {
120
+ if (!Array.isArray(entries))
121
+ return [];
122
+ const out = [];
123
+ for (const entry of entries) {
124
+ if (!isPlainObject(entry))
125
+ continue;
126
+ const provider = pick(entry);
127
+ if (typeof provider !== 'string')
128
+ continue;
129
+ try {
130
+ out.push(parseProviderRef(provider).raw);
131
+ }
132
+ catch {
133
+ // The normal config validation path reports malformed refs with context.
134
+ }
135
+ }
136
+ return out;
137
+ }
138
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * The Config Service: `config.json`'s single in-process authority.
3
+ *
4
+ * One process opens one `ConfigService` (`cli/server.ts`, at the point
5
+ * `loadConfig` ran before this existed) and every long-lived object that
6
+ * needs the current config holds this instead of a `DreamuxConfig` value it
7
+ * captured once — see {@link ConfigReader}. A `TransactionalStore` backs it,
8
+ * so every read sees the same committed value and every write goes through
9
+ * the store's own serialized read-decide-replace: no second reservation,
10
+ * file-open, or validation path beside the one `readConfigFile`/
11
+ * `resolveConfig` (`./load.js`) already gives the file-read path
12
+ * `doctor`/`onboard`/`loadConfig` use.
13
+ *
14
+ * The store's value pairs the parsed file (`raw`) with its resolved shape
15
+ * (`config`). `raw` is what gets written back out — a hand-written
16
+ * `dispatchers` block, `~` paths, and every other value survive a
17
+ * `config.agents.replace` untouched, because only `raw.agents` is ever
18
+ * replaced and the rest of `raw` travels through unchanged; a
19
+ * `config.agents.replace` write does re-serialize the whole file at
20
+ * two-space indentation (`encode`, below), so whitespace/indentation is not
21
+ * preserved byte-for-byte, only values and key order. `config` is never
22
+ * serialized; it exists so `current()` never has to re-run `resolveConfig`
23
+ * on every read.
24
+ */
25
+ import { isPlainObject, isSecretKeyName, redactSecretKeyValues, TransactionalStore, } from '@excitedjs/dreamux-utils';
26
+ import { throwCallerMistake } from '../command/errors.js';
27
+ import { globalConfigFile } from './config.js';
28
+ import { assertNoLegacyTomlOnly, readConfigFile, resolveConfig, } from './load.js';
29
+ export class ConfigService {
30
+ file;
31
+ providerRegistry;
32
+ store;
33
+ loadedPlugins = [];
34
+ constructor(file, providerRegistry) {
35
+ this.file = file;
36
+ this.providerRegistry = providerRegistry;
37
+ this.store = new TransactionalStore({
38
+ path: file,
39
+ load: () => this.loadFile(),
40
+ encode: (value) => `${JSON.stringify(value.raw, null, 2)}\n`,
41
+ });
42
+ }
43
+ /**
44
+ * Open `config.json`, running today's checks in today's order with
45
+ * today's messages (legacy TOML, missing file, file mode, parse), then
46
+ * loading it. A failure rejects here — `dreamux serve` still stops before
47
+ * a `ConfigService` exists. Loading before returning means `current()` and
48
+ * {@link plugins} are never observably pre-load.
49
+ */
50
+ static async open(options) {
51
+ const service = new ConfigService(globalConfigFile(), options.providerRegistry);
52
+ await service.store.load();
53
+ return service;
54
+ }
55
+ current() {
56
+ return this.store.current.config;
57
+ }
58
+ /** Loaded and contributed, with configs read; populated by the one `open()` load. */
59
+ get plugins() {
60
+ return this.loadedPlugins;
61
+ }
62
+ /**
63
+ * The current `agents[]` in file shape, every secret-named value emptied.
64
+ * A deep copy: the caller may do anything with it without touching the
65
+ * store's committed value.
66
+ */
67
+ readAgents() {
68
+ const rawAgents = this.store.current.raw['agents'];
69
+ const copy = structuredClone(Array.isArray(rawAgents) ? rawAgents : []);
70
+ redactSecretKeyValues(copy, '');
71
+ return copy;
72
+ }
73
+ /**
74
+ * Replace the whole `agents[]` section and return the redacted projection
75
+ * of what committed.
76
+ *
77
+ * One store `update`: merge `candidateAgents` onto the committed
78
+ * `agents[]` by `id` (restoring a committed secret under a submitted `''`,
79
+ * {@link mergeAgentEntries}), splice the result into the committed `raw`,
80
+ * then run it through `resolveConfig` — the identical loader/validator a
81
+ * fresh `dreamux serve` uses, so a write this rejects is a write the next
82
+ * start would also reject. Every validator on that path raises a
83
+ * `RuleViolation` for a value it checked and refused: `config.ts`'s
84
+ * `mergeWithDefaults`, the shared readers in `@excitedjs/dreamux-utils`, each
85
+ * provider's own `config.read`, and the loader's refusal of an unregistered
86
+ * `builtin:` ref. {@link throwCallerMistake} re-types exactly that into the
87
+ * caller's mistake, so `config.agents.replace` reports `BAD_REQUEST` instead
88
+ * of `INTERNAL` for a bad payload. A dynamic import, a file read, or a
89
+ * provider's own `TypeError` is not a refused value and keeps its own code.
90
+ * Either way this call rejects with file and memory unchanged, by
91
+ * `TransactionalStore.update`'s own contract (nothing is written or swapped
92
+ * before `change` returns).
93
+ */
94
+ async replaceAgents(candidateAgents) {
95
+ await this.store.update(async (committed) => {
96
+ const committedAgents = committed.raw['agents'];
97
+ const mergedAgents = mergeAgentEntries(candidateAgents, Array.isArray(committedAgents) ? committedAgents : []);
98
+ const candidateRaw = { ...committed.raw, agents: mergedAgents };
99
+ let config;
100
+ try {
101
+ config = await resolveConfig(candidateRaw, this.file, this.providerRegistry);
102
+ }
103
+ catch (err) {
104
+ throwCallerMistake(err);
105
+ }
106
+ // resolveConfig (mergeWithDefaults) never sets `config.plugins` — that
107
+ // field is loadFile's own addition, carrying the raw plugins[] entries
108
+ // only so stringifyConfig can round-trip them (./config.js). A replace
109
+ // never touches plugins[] (design decision 1), so the committed value
110
+ // is still exactly right; without this, current().plugins would flip
111
+ // to undefined on the first replace even though raw.plugins is unchanged.
112
+ return {
113
+ raw: candidateRaw,
114
+ config: committed.config.plugins === undefined
115
+ ? config
116
+ : { ...config, plugins: committed.config.plugins },
117
+ };
118
+ });
119
+ return this.readAgents();
120
+ }
121
+ /**
122
+ * The store's `load()` callback — the whole open sequence, including
123
+ * one-time plugin loading. Delegates the "open the file" sequence to
124
+ * `readConfigFile` (`./load.js`), the same function the CLI read path
125
+ * (`doctor`/`onboard`/`loadConfig`) uses, so today's checks, order, and
126
+ * messages (legacy TOML, missing file, file mode, parse) stay one
127
+ * implementation. `TransactionalStore.load()` guarantees this runs at most
128
+ * once per store, which is what makes assigning `this.loadedPlugins` here
129
+ * safe: a plugin's `contribute()` registers providers and collides with
130
+ * itself if run twice, so this must never re-run for the life of this
131
+ * `ConfigService`.
132
+ */
133
+ async loadFile() {
134
+ await assertNoLegacyTomlOnly();
135
+ const { raw, config, plugins } = await readConfigFile(this.file, this.providerRegistry);
136
+ // Runs once per this store (see this method's own doc comment); a future
137
+ // change to TransactionalStore's "load() runs at most once" guarantee
138
+ // would make this reassign on every read instead of the one open.
139
+ this.loadedPlugins = plugins;
140
+ return { raw, config };
141
+ }
142
+ }
143
+ /**
144
+ * The whole-entry-replace merge {@link ConfigService.replaceAgents} performs
145
+ * on every submitted `agents[]` entry, matched to a committed entry by `id`.
146
+ * A submitted value survives at every depth except one override: a
147
+ * secret-named key submitted as `''` is restored to the committed value at
148
+ * that same JSON path, but only when the committed entry (same `id`)
149
+ * actually has a value there — a new `id`, or a key the committed entry never
150
+ * had, keeps the submitted `''`, since there is nothing to fall back to. An
151
+ * `id` present only in `committedAgents` is dropped: this replaces the whole
152
+ * section, not one entry in it.
153
+ *
154
+ * `id` is trusted to be a non-empty string here: `config/commands.ts`'s
155
+ * `parse()`, the only caller of `replaceAgents`, already narrowed the payload
156
+ * to that shape before this runs.
157
+ */
158
+ function mergeAgentEntries(candidateAgents, committedAgents) {
159
+ const committedById = new Map();
160
+ for (const entry of committedAgents) {
161
+ if (isPlainObject(entry) && typeof entry['id'] === 'string') {
162
+ committedById.set(entry['id'], entry);
163
+ }
164
+ }
165
+ return candidateAgents.map((candidate) => {
166
+ const committed = committedById.get(candidate['id']);
167
+ return restoreCommittedSecrets(candidate, committed);
168
+ });
169
+ }
170
+ /**
171
+ * Walk `submitted`, restoring `committed`'s value wherever a secret-named
172
+ * key's submitted value is `''` and `committed` has a value at that same
173
+ * path; every other value — known key or not, at any depth — passes through
174
+ * as submitted. Arrays walk by index, mirroring `redactSecretKeyValues`'s own
175
+ * walk (`@excitedjs/dreamux-utils/src/redaction.ts`).
176
+ */
177
+ function restoreCommittedSecrets(submitted, committed) {
178
+ if (Array.isArray(submitted)) {
179
+ const committedArray = Array.isArray(committed) ? committed : undefined;
180
+ return submitted.map((item, index) => restoreCommittedSecrets(item, committedArray?.[index]));
181
+ }
182
+ if (!isPlainObject(submitted))
183
+ return submitted;
184
+ const committedObject = isPlainObject(committed) ? committed : undefined;
185
+ const out = {};
186
+ for (const [key, value] of Object.entries(submitted)) {
187
+ const committedValue = committedObject?.[key];
188
+ if (isSecretKeyName(key) && value === '' && committedValue !== undefined) {
189
+ out[key] = committedValue;
190
+ continue;
191
+ }
192
+ out[key] = restoreCommittedSecrets(value, committedValue);
193
+ }
194
+ return out;
195
+ }
196
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/config/service.ts"],"names":[],"mappings":"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"}
@@ -14,43 +14,42 @@
14
14
  * launchd's KeepAlive=true relaunches a plain `kill`, so a stop that *stays*
15
15
  * stopped is a `bootout`; start/restart then re-bootstrap when needed.
16
16
  */
17
- import { homedir } from 'node:os';
18
- import { LAUNCHD_LABEL, serviceUnitPath, SYSTEMD_UNIT } from '../onboard/service.js';
17
+ import { createServiceHost } from './host.js';
18
+ import { launchdTarget, serviceUnitPath, SYSTEMD_UNIT, } from './unit.js';
19
19
  export async function controlUserService(verb, options) {
20
- const homeDir = options.homeDir ?? homedir();
21
- const unit = serviceUnitPath(options.platform, homeDir);
20
+ const host = createServiceHost(options);
21
+ const unit = serviceUnitPath(host.platform, host.homeDir);
22
22
  const dryRun = options.dryRun ?? false;
23
23
  const commands = [];
24
24
  if (unit.platform === 'systemd') {
25
25
  const args = ['--user', verb, SYSTEMD_UNIT];
26
- await options.runner.run('systemctl', args, { dryRun });
26
+ await host.runner.run('systemctl', args, { dryRun });
27
27
  commands.push({ command: 'systemctl', args });
28
28
  return { platform: 'systemd', verb, commands };
29
29
  }
30
- const uid = options.uid ?? process.getuid?.();
31
- if (uid === undefined) {
32
- throw new Error('launchd user service control requires a numeric uid');
33
- }
34
- const target = `gui/${uid}/${LAUNCHD_LABEL}`;
35
- const loaded = await options.runner.check('launchctl', ['print', target], { dryRun });
30
+ const target = launchdTarget(host.uid);
31
+ const domain = `gui/${host.uid}`;
32
+ const loaded = await host.runner.check('launchctl', ['print', target], {
33
+ dryRun,
34
+ });
36
35
  if (verb === 'stop') {
37
36
  if (loaded) {
38
37
  const args = ['bootout', target];
39
- await options.runner.run('launchctl', args, { dryRun });
38
+ await host.runner.run('launchctl', args, { dryRun });
40
39
  commands.push({ command: 'launchctl', args });
41
40
  }
42
41
  return { platform: 'launchd', verb, commands };
43
42
  }
44
43
  if (!loaded) {
45
- const args = ['bootstrap', `gui/${uid}`, unit.path];
46
- await options.runner.run('launchctl', args, { dryRun });
44
+ const args = ['bootstrap', domain, unit.path];
45
+ await host.runner.run('launchctl', args, { dryRun });
47
46
  commands.push({ command: 'launchctl', args });
48
47
  if (verb === 'start')
49
48
  return { platform: 'launchd', verb, commands };
50
49
  }
51
50
  const args = verb === 'restart' ? ['kickstart', '-k', target] : ['kickstart', target];
52
- await options.runner.run('launchctl', args, { dryRun });
51
+ await host.runner.run('launchctl', args, { dryRun });
53
52
  commands.push({ command: 'launchctl', args });
54
53
  return { platform: 'launchd', verb, commands };
55
54
  }
56
- //# sourceMappingURL=service-control.js.map
55
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/daemon/control.ts"],"names":[],"mappings":"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"}