@nextclaw/service 0.1.14 → 0.1.16

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 (417) hide show
  1. package/dist/cli/commands/agent/agent-runtime.utils.d.ts +2 -1
  2. package/dist/cli/commands/agent/agent-runtime.utils.d.ts.map +1 -0
  3. package/dist/cli/commands/agent/agent-runtime.utils.js +3 -1
  4. package/dist/cli/commands/agent/agent-runtime.utils.js.map +1 -0
  5. package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts +2 -1
  6. package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts.map +1 -0
  7. package/dist/cli/commands/agent/cli-agent-runner.utils.js +3 -5
  8. package/dist/cli/commands/agent/cli-agent-runner.utils.js.map +1 -0
  9. package/dist/cli/commands/agent/services/agent-commands.service.d.ts +2 -1
  10. package/dist/cli/commands/agent/services/agent-commands.service.d.ts.map +1 -0
  11. package/dist/cli/commands/agent/services/agent-commands.service.js +2 -0
  12. package/dist/cli/commands/agent/services/agent-commands.service.js.map +1 -0
  13. package/dist/cli/commands/config/services/config-commands.service.d.ts +2 -1
  14. package/dist/cli/commands/config/services/config-commands.service.d.ts.map +1 -0
  15. package/dist/cli/commands/config/services/config-commands.service.js +2 -0
  16. package/dist/cli/commands/config/services/config-commands.service.js.map +1 -0
  17. package/dist/cli/commands/cron/services/cron-commands.service.d.ts +2 -1
  18. package/dist/cli/commands/cron/services/cron-commands.service.d.ts.map +1 -0
  19. package/dist/cli/commands/cron/services/cron-commands.service.js +2 -0
  20. package/dist/cli/commands/cron/services/cron-commands.service.js.map +1 -0
  21. package/dist/cli/commands/cron/services/cron-local.service.d.ts +2 -1
  22. package/dist/cli/commands/cron/services/cron-local.service.d.ts.map +1 -0
  23. package/dist/cli/commands/cron/services/cron-local.service.js +2 -0
  24. package/dist/cli/commands/cron/services/cron-local.service.js.map +1 -0
  25. package/dist/cli/commands/cron/utils/cron-job.utils.d.ts +2 -1
  26. package/dist/cli/commands/cron/utils/cron-job.utils.d.ts.map +1 -0
  27. package/dist/cli/commands/cron/utils/cron-job.utils.js +2 -0
  28. package/dist/cli/commands/cron/utils/cron-job.utils.js.map +1 -0
  29. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts +4 -1
  30. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts.map +1 -0
  31. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js +40 -14
  32. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js.map +1 -0
  33. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts +2 -1
  34. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts.map +1 -0
  35. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js +8 -0
  36. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js.map +1 -0
  37. package/dist/cli/commands/gateway/index.d.ts +2 -1
  38. package/dist/cli/commands/gateway/index.d.ts.map +1 -0
  39. package/dist/cli/commands/gateway/index.js +2 -0
  40. package/dist/cli/commands/gateway/index.js.map +1 -0
  41. package/dist/cli/commands/logs/index.d.ts +2 -1
  42. package/dist/cli/commands/logs/index.d.ts.map +1 -0
  43. package/dist/cli/commands/logs/index.js +2 -0
  44. package/dist/cli/commands/logs/index.js.map +1 -0
  45. package/dist/cli/commands/mcp/index.d.ts +2 -1
  46. package/dist/cli/commands/mcp/index.d.ts.map +1 -0
  47. package/dist/cli/commands/mcp/index.js +2 -0
  48. package/dist/cli/commands/mcp/index.js.map +1 -0
  49. package/dist/cli/commands/restart/index.d.ts +2 -1
  50. package/dist/cli/commands/restart/index.d.ts.map +1 -0
  51. package/dist/cli/commands/restart/index.js +2 -0
  52. package/dist/cli/commands/restart/index.js.map +1 -0
  53. package/dist/cli/commands/secrets/index.d.ts +2 -1
  54. package/dist/cli/commands/secrets/index.d.ts.map +1 -0
  55. package/dist/cli/commands/secrets/index.js +2 -0
  56. package/dist/cli/commands/secrets/index.js.map +1 -0
  57. package/dist/cli/commands/serve/index.d.ts +2 -1
  58. package/dist/cli/commands/serve/index.d.ts.map +1 -0
  59. package/dist/cli/commands/serve/index.js +2 -0
  60. package/dist/cli/commands/serve/index.js.map +1 -0
  61. package/dist/cli/commands/skills/index.d.ts +2 -1
  62. package/dist/cli/commands/skills/index.d.ts.map +1 -0
  63. package/dist/cli/commands/skills/index.js +2 -0
  64. package/dist/cli/commands/skills/index.js.map +1 -0
  65. package/dist/cli/commands/skills/marketplace-client.d.ts +2 -1
  66. package/dist/cli/commands/skills/marketplace-client.d.ts.map +1 -0
  67. package/dist/cli/commands/skills/marketplace-client.js +2 -0
  68. package/dist/cli/commands/skills/marketplace-client.js.map +1 -0
  69. package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts +2 -1
  70. package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts.map +1 -0
  71. package/dist/cli/commands/skills/marketplace-command-options.utils.js +2 -0
  72. package/dist/cli/commands/skills/marketplace-command-options.utils.js.map +1 -0
  73. package/dist/cli/commands/skills/marketplace-identity.utils.d.ts +2 -1
  74. package/dist/cli/commands/skills/marketplace-identity.utils.d.ts.map +1 -0
  75. package/dist/cli/commands/skills/marketplace-identity.utils.js +2 -0
  76. package/dist/cli/commands/skills/marketplace-identity.utils.js.map +1 -0
  77. package/dist/cli/commands/skills/marketplace-network-retry.d.ts +2 -1
  78. package/dist/cli/commands/skills/marketplace-network-retry.d.ts.map +1 -0
  79. package/dist/cli/commands/skills/marketplace-network-retry.js +2 -0
  80. package/dist/cli/commands/skills/marketplace-network-retry.js.map +1 -0
  81. package/dist/cli/commands/skills/marketplace.metadata.d.ts +2 -1
  82. package/dist/cli/commands/skills/marketplace.metadata.d.ts.map +1 -0
  83. package/dist/cli/commands/skills/marketplace.metadata.js +2 -0
  84. package/dist/cli/commands/skills/marketplace.metadata.js.map +1 -0
  85. package/dist/cli/commands/skills/marketplace.utils.d.ts +2 -1
  86. package/dist/cli/commands/skills/marketplace.utils.d.ts.map +1 -0
  87. package/dist/cli/commands/skills/marketplace.utils.js +2 -0
  88. package/dist/cli/commands/skills/marketplace.utils.js.map +1 -0
  89. package/dist/cli/commands/skills/skills-query.service.d.ts +2 -1
  90. package/dist/cli/commands/skills/skills-query.service.d.ts.map +1 -0
  91. package/dist/cli/commands/skills/skills-query.service.js +2 -0
  92. package/dist/cli/commands/skills/skills-query.service.js.map +1 -0
  93. package/dist/cli/commands/start/index.d.ts +2 -1
  94. package/dist/cli/commands/start/index.d.ts.map +1 -0
  95. package/dist/cli/commands/start/index.js +2 -0
  96. package/dist/cli/commands/start/index.js.map +1 -0
  97. package/dist/cli/commands/stop/index.d.ts +2 -1
  98. package/dist/cli/commands/stop/index.d.ts.map +1 -0
  99. package/dist/cli/commands/stop/index.js +2 -0
  100. package/dist/cli/commands/stop/index.js.map +1 -0
  101. package/dist/cli/commands/ui/index.d.ts +2 -1
  102. package/dist/cli/commands/ui/index.d.ts.map +1 -0
  103. package/dist/cli/commands/ui/index.js +2 -0
  104. package/dist/cli/commands/ui/index.js.map +1 -0
  105. package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts +2 -1
  106. package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts.map +1 -0
  107. package/dist/cli/commands/usage/services/llm-usage-command.service.js +2 -0
  108. package/dist/cli/commands/usage/services/llm-usage-command.service.js.map +1 -0
  109. package/dist/commands/channel/channel-config-view.d.ts +2 -1
  110. package/dist/commands/channel/channel-config-view.d.ts.map +1 -0
  111. package/dist/commands/channel/channel-config-view.js +2 -0
  112. package/dist/commands/channel/channel-config-view.js.map +1 -0
  113. package/dist/commands/channel/channel-list-view.service.d.ts +2 -1
  114. package/dist/commands/channel/channel-list-view.service.d.ts.map +1 -0
  115. package/dist/commands/channel/channel-list-view.service.js +2 -0
  116. package/dist/commands/channel/channel-list-view.service.js.map +1 -0
  117. package/dist/commands/channel/index.d.ts +2 -1
  118. package/dist/commands/channel/index.d.ts.map +1 -0
  119. package/dist/commands/channel/index.js +2 -0
  120. package/dist/commands/channel/index.js.map +1 -0
  121. package/dist/commands/platform-auth/services/account-status.service.d.ts +2 -1
  122. package/dist/commands/platform-auth/services/account-status.service.d.ts.map +1 -0
  123. package/dist/commands/platform-auth/services/account-status.service.js +2 -0
  124. package/dist/commands/platform-auth/services/account-status.service.js.map +1 -0
  125. package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts +2 -1
  126. package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts.map +1 -0
  127. package/dist/commands/platform-auth/services/platform-auth-commands.service.js +2 -0
  128. package/dist/commands/platform-auth/services/platform-auth-commands.service.js.map +1 -0
  129. package/dist/commands/platform-auth/utils/payload.utils.d.ts +2 -1
  130. package/dist/commands/platform-auth/utils/payload.utils.d.ts.map +1 -0
  131. package/dist/commands/platform-auth/utils/payload.utils.js +2 -0
  132. package/dist/commands/platform-auth/utils/payload.utils.js.map +1 -0
  133. package/dist/commands/plugin/index.d.ts +2 -1
  134. package/dist/commands/plugin/index.d.ts.map +1 -0
  135. package/dist/commands/plugin/index.js +2 -0
  136. package/dist/commands/plugin/index.js.map +1 -0
  137. package/dist/commands/plugin/plugin-command.utils.d.ts +2 -1
  138. package/dist/commands/plugin/plugin-command.utils.d.ts.map +1 -0
  139. package/dist/commands/plugin/plugin-command.utils.js +2 -0
  140. package/dist/commands/plugin/plugin-command.utils.js.map +1 -0
  141. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts +2 -1
  142. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts.map +1 -0
  143. package/dist/commands/plugin/plugin-mutation-actions.utils.js +2 -0
  144. package/dist/commands/plugin/plugin-mutation-actions.utils.js.map +1 -0
  145. package/dist/commands/remote/index.d.ts +2 -1
  146. package/dist/commands/remote/index.d.ts.map +1 -0
  147. package/dist/commands/remote/index.js +2 -0
  148. package/dist/commands/remote/index.js.map +1 -0
  149. package/dist/commands/remote/services/remote-access-host.service.d.ts +2 -1
  150. package/dist/commands/remote/services/remote-access-host.service.d.ts.map +1 -0
  151. package/dist/commands/remote/services/remote-access-host.service.js +2 -0
  152. package/dist/commands/remote/services/remote-access-host.service.js.map +1 -0
  153. package/dist/commands/remote/services/remote-service-control.service.d.ts +2 -1
  154. package/dist/commands/remote/services/remote-service-control.service.d.ts.map +1 -0
  155. package/dist/commands/remote/services/remote-service-control.service.js +134 -75
  156. package/dist/commands/remote/services/remote-service-control.service.js.map +1 -0
  157. package/dist/commands/remote/utils/platform-api-base.utils.d.ts +2 -1
  158. package/dist/commands/remote/utils/platform-api-base.utils.d.ts.map +1 -0
  159. package/dist/commands/remote/utils/platform-api-base.utils.js +2 -0
  160. package/dist/commands/remote/utils/platform-api-base.utils.js.map +1 -0
  161. package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts +2 -1
  162. package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts.map +1 -0
  163. package/dist/commands/remote/utils/remote-runtime-support.utils.js +2 -0
  164. package/dist/commands/remote/utils/remote-runtime-support.utils.js.map +1 -0
  165. package/dist/commands/service/index.d.ts +2 -1
  166. package/dist/commands/service/index.d.ts.map +1 -0
  167. package/dist/commands/service/index.js +2 -0
  168. package/dist/commands/service/index.js.map +1 -0
  169. package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts +2 -1
  170. package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts.map +1 -0
  171. package/dist/commands/service/services/autostart/host-autostart-command.service.js +2 -0
  172. package/dist/commands/service/services/autostart/host-autostart-command.service.js.map +1 -0
  173. package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts +2 -1
  174. package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts.map +1 -0
  175. package/dist/commands/service/services/autostart/host-autostart-runtime.service.js +2 -0
  176. package/dist/commands/service/services/autostart/host-autostart-runtime.service.js.map +1 -0
  177. package/dist/commands/service/services/autostart/host-autostart.service.d.ts +2 -1
  178. package/dist/commands/service/services/autostart/host-autostart.service.d.ts.map +1 -0
  179. package/dist/commands/service/services/autostart/host-autostart.service.js +2 -0
  180. package/dist/commands/service/services/autostart/host-autostart.service.js.map +1 -0
  181. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts +2 -1
  182. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts.map +1 -0
  183. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js +2 -0
  184. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js.map +1 -0
  185. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts +2 -1
  186. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts.map +1 -0
  187. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js +2 -0
  188. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js.map +1 -0
  189. package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts +2 -1
  190. package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts.map +1 -0
  191. package/dist/commands/service/services/autostart/windows-task-autostart.service.js +2 -0
  192. package/dist/commands/service/services/autostart/windows-task-autostart.service.js.map +1 -0
  193. package/dist/commands/service/types/autostart/host-autostart.types.d.ts +2 -1
  194. package/dist/commands/service/types/autostart/host-autostart.types.d.ts.map +1 -0
  195. package/dist/launcher/npm-runtime-bundle-layout.store.d.ts +2 -1
  196. package/dist/launcher/npm-runtime-bundle-layout.store.d.ts.map +1 -0
  197. package/dist/launcher/npm-runtime-bundle-layout.store.js +2 -0
  198. package/dist/launcher/npm-runtime-bundle-layout.store.js.map +1 -0
  199. package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts +2 -1
  200. package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts.map +1 -0
  201. package/dist/launcher/npm-runtime-bundle-manifest.service.js +2 -0
  202. package/dist/launcher/npm-runtime-bundle-manifest.service.js.map +1 -0
  203. package/dist/launcher/npm-runtime-bundle.service.d.ts +2 -1
  204. package/dist/launcher/npm-runtime-bundle.service.d.ts.map +1 -0
  205. package/dist/launcher/npm-runtime-bundle.service.js +2 -0
  206. package/dist/launcher/npm-runtime-bundle.service.js.map +1 -0
  207. package/dist/launcher/npm-runtime-bundle.types.d.ts +2 -1
  208. package/dist/launcher/npm-runtime-bundle.types.d.ts.map +1 -0
  209. package/dist/launcher/npm-runtime-launcher.service.d.ts +2 -1
  210. package/dist/launcher/npm-runtime-launcher.service.d.ts.map +1 -0
  211. package/dist/launcher/npm-runtime-launcher.service.js +2 -0
  212. package/dist/launcher/npm-runtime-launcher.service.js.map +1 -0
  213. package/dist/launcher/npm-runtime-update-command.service.d.ts +5 -1
  214. package/dist/launcher/npm-runtime-update-command.service.d.ts.map +1 -0
  215. package/dist/launcher/npm-runtime-update-command.service.js +32 -0
  216. package/dist/launcher/npm-runtime-update-command.service.js.map +1 -0
  217. package/dist/launcher/npm-runtime-update-source.service.d.ts +2 -1
  218. package/dist/launcher/npm-runtime-update-source.service.d.ts.map +1 -0
  219. package/dist/launcher/npm-runtime-update-source.service.js +2 -0
  220. package/dist/launcher/npm-runtime-update-source.service.js.map +1 -0
  221. package/dist/launcher/npm-runtime-update-state.store.d.ts +2 -1
  222. package/dist/launcher/npm-runtime-update-state.store.d.ts.map +1 -0
  223. package/dist/launcher/npm-runtime-update-state.store.js +2 -0
  224. package/dist/launcher/npm-runtime-update-state.store.js.map +1 -0
  225. package/dist/launcher/npm-runtime-update.manager.d.ts +2 -1
  226. package/dist/launcher/npm-runtime-update.manager.d.ts.map +1 -0
  227. package/dist/launcher/npm-runtime-update.manager.js +2 -0
  228. package/dist/launcher/npm-runtime-update.manager.js.map +1 -0
  229. package/dist/launcher/npm-runtime-update.service.d.ts +2 -1
  230. package/dist/launcher/npm-runtime-update.service.d.ts.map +1 -0
  231. package/dist/launcher/npm-runtime-update.service.js +2 -0
  232. package/dist/launcher/npm-runtime-update.service.js.map +1 -0
  233. package/dist/service-runtime.service.d.ts +2 -1
  234. package/dist/service-runtime.service.d.ts.map +1 -0
  235. package/dist/service-runtime.service.js +6 -1
  236. package/dist/service-runtime.service.js.map +1 -0
  237. package/dist/shared/controllers/gateway.controller.d.ts +2 -1
  238. package/dist/shared/controllers/gateway.controller.d.ts.map +1 -0
  239. package/dist/shared/controllers/gateway.controller.js +2 -0
  240. package/dist/shared/controllers/gateway.controller.js.map +1 -0
  241. package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts +2 -1
  242. package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts.map +1 -0
  243. package/dist/shared/services/gateway/gateway-restart-wake.service.js +2 -0
  244. package/dist/shared/services/gateway/gateway-restart-wake.service.js.map +1 -0
  245. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts +2 -1
  246. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts.map +1 -0
  247. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js +2 -0
  248. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js.map +1 -0
  249. package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts +2 -1
  250. package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts.map +1 -0
  251. package/dist/shared/services/gateway/managers/gateway-remote.manager.js +2 -0
  252. package/dist/shared/services/gateway/managers/gateway-remote.manager.js.map +1 -0
  253. package/dist/shared/services/gateway/nextclaw-app.service.d.ts +2 -1
  254. package/dist/shared/services/gateway/nextclaw-app.service.d.ts.map +1 -0
  255. package/dist/shared/services/gateway/nextclaw-app.service.js +2 -0
  256. package/dist/shared/services/gateway/nextclaw-app.service.js.map +1 -0
  257. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts +2 -1
  258. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts.map +1 -0
  259. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js +2 -0
  260. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js.map +1 -0
  261. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts +2 -1
  262. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts.map +1 -0
  263. package/dist/shared/services/gateway/service-bootstrap-status.service.js +2 -0
  264. package/dist/shared/services/gateway/service-bootstrap-status.service.js.map +1 -0
  265. package/dist/shared/services/gateway/service-startup-support.service.d.ts +2 -1
  266. package/dist/shared/services/gateway/service-startup-support.service.d.ts.map +1 -0
  267. package/dist/shared/services/gateway/service-startup-support.service.js +2 -0
  268. package/dist/shared/services/gateway/service-startup-support.service.js.map +1 -0
  269. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts +2 -1
  270. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts.map +1 -0
  271. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js +2 -0
  272. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js.map +1 -0
  273. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts +2 -1
  274. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts.map +1 -0
  275. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js +2 -0
  276. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js.map +1 -0
  277. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts +2 -1
  278. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts.map +1 -0
  279. package/dist/shared/services/marketplace/service-marketplace-installer.service.js +2 -0
  280. package/dist/shared/services/marketplace/service-marketplace-installer.service.js.map +1 -0
  281. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts +2 -1
  282. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts.map +1 -0
  283. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js +2 -0
  284. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js.map +1 -0
  285. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts +2 -1
  286. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts.map +1 -0
  287. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js +2 -0
  288. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js.map +1 -0
  289. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts +2 -1
  290. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts.map +1 -0
  291. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js +2 -1
  292. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js.map +1 -0
  293. package/dist/shared/services/restart/restart-coordinator.service.d.ts +2 -1
  294. package/dist/shared/services/restart/restart-coordinator.service.d.ts.map +1 -0
  295. package/dist/shared/services/restart/restart-coordinator.service.js +2 -0
  296. package/dist/shared/services/restart/restart-coordinator.service.js.map +1 -0
  297. package/dist/shared/services/restart/restart-sentinel.service.d.ts +2 -1
  298. package/dist/shared/services/restart/restart-sentinel.service.d.ts.map +1 -0
  299. package/dist/shared/services/restart/restart-sentinel.service.js +2 -0
  300. package/dist/shared/services/restart/restart-sentinel.service.js.map +1 -0
  301. package/dist/shared/services/restart/runtime-restart-request.service.d.ts +2 -1
  302. package/dist/shared/services/restart/runtime-restart-request.service.d.ts.map +1 -0
  303. package/dist/shared/services/restart/runtime-restart-request.service.js +2 -0
  304. package/dist/shared/services/restart/runtime-restart-request.service.js.map +1 -0
  305. package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts +85 -0
  306. package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts.map +1 -0
  307. package/dist/shared/services/runtime/managed-service-supervisor.service.js +271 -0
  308. package/dist/shared/services/runtime/managed-service-supervisor.service.js.map +1 -0
  309. package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts +2 -1
  310. package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts.map +1 -0
  311. package/dist/shared/services/runtime/nextclaw-distribution.service.js +2 -0
  312. package/dist/shared/services/runtime/nextclaw-distribution.service.js.map +1 -0
  313. package/dist/shared/services/runtime/runtime-command.service.d.ts +3 -1
  314. package/dist/shared/services/runtime/runtime-command.service.d.ts.map +1 -0
  315. package/dist/shared/services/runtime/runtime-command.service.js +5 -0
  316. package/dist/shared/services/runtime/runtime-command.service.js.map +1 -0
  317. package/dist/shared/services/runtime/runtime-config-init.service.d.ts +2 -1
  318. package/dist/shared/services/runtime/runtime-config-init.service.d.ts.map +1 -0
  319. package/dist/shared/services/runtime/runtime-config-init.service.js +2 -0
  320. package/dist/shared/services/runtime/runtime-config-init.service.js.map +1 -0
  321. package/dist/shared/services/runtime/service-managed-startup.service.d.ts +4 -32
  322. package/dist/shared/services/runtime/service-managed-startup.service.d.ts.map +1 -0
  323. package/dist/shared/services/runtime/service-managed-startup.service.js +10 -92
  324. package/dist/shared/services/runtime/service-managed-startup.service.js.map +1 -0
  325. package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts +2 -1
  326. package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts.map +1 -0
  327. package/dist/shared/services/runtime/utils/managed-service-routing.utils.js +2 -0
  328. package/dist/shared/services/runtime/utils/managed-service-routing.utils.js.map +1 -0
  329. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts +5 -2
  330. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts.map +1 -0
  331. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js +23 -17
  332. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js.map +1 -0
  333. package/dist/shared/services/ui/companion-runtime.service.d.ts +2 -1
  334. package/dist/shared/services/ui/companion-runtime.service.d.ts.map +1 -0
  335. package/dist/shared/services/ui/companion-runtime.service.js +2 -0
  336. package/dist/shared/services/ui/companion-runtime.service.js.map +1 -0
  337. package/dist/shared/services/ui/local-ui-discovery.service.d.ts +2 -1
  338. package/dist/shared/services/ui/local-ui-discovery.service.d.ts.map +1 -0
  339. package/dist/shared/services/ui/local-ui-discovery.service.js +2 -0
  340. package/dist/shared/services/ui/local-ui-discovery.service.js.map +1 -0
  341. package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts +2 -1
  342. package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts.map +1 -0
  343. package/dist/shared/services/ui/npm-runtime-update-host.service.js +2 -0
  344. package/dist/shared/services/ui/npm-runtime-update-host.service.js.map +1 -0
  345. package/dist/shared/services/ui/runtime-control-host.service.d.ts +2 -1
  346. package/dist/shared/services/ui/runtime-control-host.service.d.ts.map +1 -0
  347. package/dist/shared/services/ui/runtime-control-host.service.js +2 -0
  348. package/dist/shared/services/ui/runtime-control-host.service.js.map +1 -0
  349. package/dist/shared/services/ui/service-remote-access.service.d.ts +2 -1
  350. package/dist/shared/services/ui/service-remote-access.service.d.ts.map +1 -0
  351. package/dist/shared/services/ui/service-remote-access.service.js +2 -0
  352. package/dist/shared/services/ui/service-remote-access.service.js.map +1 -0
  353. package/dist/shared/services/ui/ui-bridge-api.service.d.ts +2 -1
  354. package/dist/shared/services/ui/ui-bridge-api.service.d.ts.map +1 -0
  355. package/dist/shared/services/ui/ui-bridge-api.service.js +2 -0
  356. package/dist/shared/services/ui/ui-bridge-api.service.js.map +1 -0
  357. package/dist/shared/services/workspace/workspace-manager.service.d.ts +2 -1
  358. package/dist/shared/services/workspace/workspace-manager.service.d.ts.map +1 -0
  359. package/dist/shared/services/workspace/workspace-manager.service.js +2 -0
  360. package/dist/shared/services/workspace/workspace-manager.service.js.map +1 -0
  361. package/dist/shared/stores/companion-runtime.store.d.ts +2 -1
  362. package/dist/shared/stores/companion-runtime.store.d.ts.map +1 -0
  363. package/dist/shared/stores/companion-runtime.store.js +2 -0
  364. package/dist/shared/stores/companion-runtime.store.js.map +1 -0
  365. package/dist/shared/stores/local-ui-runtime.store.d.ts +2 -1
  366. package/dist/shared/stores/local-ui-runtime.store.d.ts.map +1 -0
  367. package/dist/shared/stores/local-ui-runtime.store.js +2 -0
  368. package/dist/shared/stores/local-ui-runtime.store.js.map +1 -0
  369. package/dist/shared/stores/managed-service-state.store.d.ts +19 -1
  370. package/dist/shared/stores/managed-service-state.store.d.ts.map +1 -0
  371. package/dist/shared/stores/managed-service-state.store.js +2 -0
  372. package/dist/shared/stores/managed-service-state.store.js.map +1 -0
  373. package/dist/shared/stores/pending-restart.store.d.ts +2 -1
  374. package/dist/shared/stores/pending-restart.store.d.ts.map +1 -0
  375. package/dist/shared/stores/pending-restart.store.js +2 -0
  376. package/dist/shared/stores/pending-restart.store.js.map +1 -0
  377. package/dist/shared/types/cli.types.d.ts +16 -1
  378. package/dist/shared/types/cli.types.d.ts.map +1 -0
  379. package/dist/shared/types/distribution.types.d.ts +2 -1
  380. package/dist/shared/types/distribution.types.d.ts.map +1 -0
  381. package/dist/shared/utils/cli.utils.d.ts +2 -1
  382. package/dist/shared/utils/cli.utils.d.ts.map +1 -0
  383. package/dist/shared/utils/cli.utils.js +2 -0
  384. package/dist/shared/utils/cli.utils.js.map +1 -0
  385. package/dist/shared/utils/config-path.d.ts +2 -1
  386. package/dist/shared/utils/config-path.d.ts.map +1 -0
  387. package/dist/shared/utils/config-path.js +2 -0
  388. package/dist/shared/utils/config-path.js.map +1 -0
  389. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts +2 -1
  390. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts.map +1 -0
  391. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js +2 -0
  392. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js.map +1 -0
  393. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts +2 -1
  394. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts.map +1 -0
  395. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js +2 -0
  396. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js.map +1 -0
  397. package/dist/shared/utils/package/package-manifest.utils.d.ts +2 -1
  398. package/dist/shared/utils/package/package-manifest.utils.d.ts.map +1 -0
  399. package/dist/shared/utils/package/package-manifest.utils.js +2 -0
  400. package/dist/shared/utils/package/package-manifest.utils.js.map +1 -0
  401. package/dist/shared/utils/runtime-helpers.d.ts +2 -1
  402. package/dist/shared/utils/runtime-helpers.d.ts.map +1 -0
  403. package/dist/shared/utils/runtime-helpers.js +2 -0
  404. package/dist/shared/utils/runtime-helpers.js.map +1 -0
  405. package/dist/shared/utils/service-port-probe.utils.d.ts +2 -1
  406. package/dist/shared/utils/service-port-probe.utils.d.ts.map +1 -0
  407. package/dist/shared/utils/service-port-probe.utils.js +2 -0
  408. package/dist/shared/utils/service-port-probe.utils.js.map +1 -0
  409. package/dist/shared/utils/startup-trace.d.ts +2 -1
  410. package/dist/shared/utils/startup-trace.d.ts.map +1 -0
  411. package/dist/shared/utils/startup-trace.js +2 -0
  412. package/dist/shared/utils/startup-trace.js.map +1 -0
  413. package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts +2 -1
  414. package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts.map +1 -0
  415. package/dist/shared/utils/top-level-nextclaw-command-env.utils.js +2 -0
  416. package/dist/shared/utils/top-level-nextclaw-command-env.utils.js.map +1 -0
  417. package/package.json +20 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-systemd-autostart.service.js","names":[],"sources":["../../../../../src/commands/service/services/autostart/linux-systemd-autostart.service.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport type {\n HostAutostartCheck,\n HostAutostartDoctorReport,\n HostAutostartInstallResult,\n HostAutostartOwner,\n HostAutostartRunCommand,\n HostAutostartRunCommandResult,\n HostAutostartScope,\n HostAutostartStatus,\n HostAutostartUninstallResult,\n} from \"../../types/autostart/host-autostart.types.js\";\nimport { HostAutostartRuntimeService } from \"./host-autostart-runtime.service.js\";\n\ntype CheckedCommandParams = {\n command: string;\n args: string[];\n};\n\ntype LinuxSystemdAutostartServiceOptions = {\n platform?: NodeJS.Platform;\n env?: NodeJS.ProcessEnv;\n getHomeDir?: () => string;\n existsSync?: (path: string) => boolean;\n mkdirSync?: typeof mkdirSync;\n writeFileSync?: typeof writeFileSync;\n rmSync?: typeof rmSync;\n runCommand?: HostAutostartRunCommand;\n runtimeService?: HostAutostartRuntimeService;\n};\n\ntype ResolvedScopeStatus = {\n scope: HostAutostartScope | null;\n reasonIfUnavailable: string | null;\n};\n\nconst DEFAULT_SYSTEMD_SERVICE_NAME = \"nextclaw.service\";\nconst SUPPORTED_PLATFORM = \"linux\";\n\nexport class LinuxSystemdAutostartService {\n private readonly platform: NodeJS.Platform;\n private readonly env: NodeJS.ProcessEnv;\n private readonly getHomeDir: () => string;\n private readonly pathExists: (path: string) => boolean;\n private readonly ensureDir: typeof mkdirSync;\n private readonly writeFile: typeof writeFileSync;\n private readonly removeFile: typeof rmSync;\n private readonly runCommandImpl: HostAutostartRunCommand;\n private readonly runtimeService: HostAutostartRuntimeService;\n\n constructor(options: LinuxSystemdAutostartServiceOptions = {}) {\n this.platform = options.platform ?? process.platform;\n this.env = options.env ?? process.env;\n this.getHomeDir = options.getHomeDir ?? homedir;\n this.pathExists = options.existsSync ?? existsSync;\n this.ensureDir = options.mkdirSync ?? mkdirSync;\n this.writeFile = options.writeFileSync ?? writeFileSync;\n this.removeFile = options.rmSync ?? rmSync;\n this.runCommandImpl = options.runCommand ?? defaultRunCommand;\n this.runtimeService = options.runtimeService ?? new HostAutostartRuntimeService();\n }\n\n install = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartInstallResult> => {\n if (!this.isSupported()) {\n return this.createUnsupportedInstallResult(scope, Boolean(options.dryRun));\n }\n\n const plan = this.buildPlan(scope);\n const actions = [\n `write unit file ${plan.resourcePath}`,\n `run ${this.formatCommand(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"daemon-reload\"])}`,\n `run ${this.formatCommand(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"enable\", plan.resourceName])}`,\n `run ${this.formatCommand(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"restart\", plan.resourceName])}`,\n ];\n\n try {\n if (!options.dryRun) {\n this.ensureDir(dirname(plan.resourcePath), { recursive: true });\n this.writeFile(plan.resourcePath, plan.unitContent);\n await this.runCheckedCommand({\n command: plan.systemctlCommand,\n args: [...plan.systemctlScopeArgs, \"daemon-reload\"],\n });\n await this.runCheckedCommand({\n command: plan.systemctlCommand,\n args: [...plan.systemctlScopeArgs, \"enable\", plan.resourceName],\n });\n await this.runCheckedCommand({\n command: plan.systemctlCommand,\n args: [...plan.systemctlScopeArgs, \"restart\", plan.resourceName],\n });\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"systemd autostart install failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n uninstall = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartUninstallResult> => {\n const plan = this.buildPlan(scope);\n if (!this.isSupported()) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions: [],\n reasonIfUnavailable: this.getUnsupportedReason(),\n };\n }\n\n const installed = this.pathExists(plan.resourcePath);\n const actions: string[] = [];\n\n if (!installed) {\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions: [\"no installed unit file found\"],\n reasonIfUnavailable: null,\n };\n }\n\n actions.push(`run ${this.formatCommand(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"disable\", \"--now\", plan.resourceName])}`);\n actions.push(`remove unit file ${plan.resourcePath}`);\n actions.push(`run ${this.formatCommand(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"daemon-reload\"])}`);\n\n try {\n if (!options.dryRun) {\n await this.runCheckedCommand({\n command: plan.systemctlCommand,\n args: [...plan.systemctlScopeArgs, \"disable\", \"--now\", plan.resourceName],\n });\n this.removeFile(plan.resourcePath, { force: true });\n await this.runCheckedCommand({\n command: plan.systemctlCommand,\n args: [...plan.systemctlScopeArgs, \"daemon-reload\"],\n });\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"systemd autostart uninstall failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: true,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n status = async (requestedScope?: HostAutostartScope): Promise<HostAutostartStatus> => {\n if (!this.isSupported()) {\n return this.createUnsupportedStatus();\n }\n\n const resolvedScope = this.resolveScopeForRead(requestedScope);\n if (!resolvedScope.scope) {\n return {\n supported: true,\n installed: false,\n enabled: null,\n active: null,\n scope: null,\n hostOwner: null,\n resourceName: null,\n resourcePath: null,\n homeDir: null,\n command: null,\n logHint: null,\n reasonIfUnavailable: resolvedScope.reasonIfUnavailable,\n };\n }\n\n const plan = this.buildPlan(resolvedScope.scope);\n const installed = this.pathExists(plan.resourcePath);\n if (!installed) {\n return {\n supported: true,\n installed: false,\n enabled: false,\n active: false,\n scope: resolvedScope.scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n reasonIfUnavailable: null,\n };\n }\n\n const enabledResult = await this.runCommandImpl(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"is-enabled\", plan.resourceName]);\n const activeResult = await this.runCommandImpl(plan.systemctlCommand, [...plan.systemctlScopeArgs, \"is-active\", plan.resourceName]);\n\n return {\n supported: true,\n installed: true,\n enabled: enabledResult.code === 0,\n active: activeResult.code === 0,\n scope: resolvedScope.scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n reasonIfUnavailable: null,\n };\n };\n\n doctor = async (requestedScope?: HostAutostartScope): Promise<HostAutostartDoctorReport> => {\n const status = await this.status(requestedScope);\n const checks: HostAutostartCheck[] = [];\n const launchPlan = this.runtimeService.resolveForegroundServeLaunch();\n\n checks.push({\n name: \"platform\",\n status: status.supported ? \"pass\" : \"fail\",\n detail: status.supported ? \"linux supported\" : (status.reasonIfUnavailable ?? \"unsupported platform\"),\n });\n\n checks.push({\n name: \"unit-file\",\n status: status.installed ? \"pass\" : \"warn\",\n detail: status.resourcePath ?? \"no unit path\",\n });\n\n checks.push({\n name: \"exec-path\",\n status: this.pathExists(launchPlan.command) ? \"pass\" : \"fail\",\n detail: launchPlan.command,\n });\n\n checks.push({\n name: \"home-dir\",\n status: this.pathExists(launchPlan.homeDir) ? \"pass\" : \"warn\",\n detail: launchPlan.homeDir,\n });\n\n if (status.installed) {\n checks.push({\n name: \"enabled\",\n status: status.enabled ? \"pass\" : \"warn\",\n detail: status.enabled ? \"systemd unit enabled\" : \"systemd unit not enabled\",\n });\n checks.push({\n name: \"active\",\n status: status.active ? \"pass\" : \"warn\",\n detail: status.active ? \"systemd unit active\" : \"systemd unit not active\",\n });\n }\n\n const exitCode = checks.some((check) => check.status === \"fail\")\n ? 1\n : checks.some((check) => check.status === \"warn\")\n ? 1\n : 0;\n\n return {\n status,\n checks,\n exitCode,\n };\n };\n\n private isSupported = (): boolean => {\n return this.platform === SUPPORTED_PLATFORM;\n };\n\n private getUnsupportedReason = (): string => {\n return \"systemd autostart currently supports Linux only.\";\n };\n\n private createUnsupportedStatus = (): HostAutostartStatus => {\n return {\n supported: false,\n installed: false,\n enabled: null,\n active: null,\n scope: null,\n hostOwner: null,\n resourceName: null,\n resourcePath: null,\n homeDir: null,\n command: null,\n logHint: null,\n reasonIfUnavailable: this.getUnsupportedReason(),\n };\n };\n\n private createUnsupportedInstallResult = (scope: HostAutostartScope, dryRun: boolean): HostAutostartInstallResult => {\n const plan = this.buildPlan(scope);\n return {\n ok: false,\n dryRun,\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions: [],\n reasonIfUnavailable: this.getUnsupportedReason(),\n };\n };\n\n private resolveScopeForRead = (requestedScope?: HostAutostartScope): ResolvedScopeStatus => {\n if (requestedScope) {\n return { scope: requestedScope, reasonIfUnavailable: null };\n }\n const userInstalled = this.pathExists(this.getUnitPath(\"user\"));\n const systemInstalled = this.pathExists(this.getUnitPath(\"system\"));\n if (userInstalled && systemInstalled) {\n return {\n scope: null,\n reasonIfUnavailable: \"Both user and system units are installed. Re-run with --user or --system.\",\n };\n }\n if (userInstalled) {\n return { scope: \"user\", reasonIfUnavailable: null };\n }\n if (systemInstalled) {\n return { scope: \"system\", reasonIfUnavailable: null };\n }\n return { scope: \"user\", reasonIfUnavailable: null };\n };\n\n private buildPlan = (scope: HostAutostartScope) => {\n const launch = this.runtimeService.resolveForegroundServeLaunch();\n const command = this.formatCommand(launch.command, launch.args);\n const resourceName = DEFAULT_SYSTEMD_SERVICE_NAME;\n const resourcePath = this.getUnitPath(scope);\n const homeDir = launch.homeDir;\n const hostOwner: HostAutostartOwner = scope === \"user\" ? \"systemd-user-service\" : \"systemd-system-service\";\n const systemctlScopeArgs = scope === \"user\" ? [\"--user\"] : [];\n const logHint = scope === \"user\"\n ? `journalctl --user -u ${resourceName} -f`\n : `journalctl -u ${resourceName} -f`;\n const wantedBy = scope === \"user\" ? \"default.target\" : \"multi-user.target\";\n\n return {\n scope,\n resourceName,\n resourcePath,\n homeDir,\n hostOwner,\n command,\n logHint,\n unitContent: [\n \"[Unit]\",\n \"Description=NextClaw managed local service\",\n \"After=network-online.target\",\n \"Wants=network-online.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `WorkingDirectory=${this.escapeSystemdValue(homeDir)}`,\n `Environment=NEXTCLAW_HOME=${this.escapeSystemdValue(homeDir)}`,\n `ExecStart=${command}`,\n \"Restart=on-failure\",\n \"RestartSec=2\",\n \"\",\n \"[Install]\",\n `WantedBy=${wantedBy}`,\n \"\",\n ].join(\"\\n\"),\n systemctlCommand: \"systemctl\",\n systemctlScopeArgs,\n };\n };\n\n private getUnitPath = (scope: HostAutostartScope): string => {\n if (scope === \"system\") {\n return \"/etc/systemd/system/nextclaw.service\";\n }\n const xdgConfigHome = this.env.XDG_CONFIG_HOME?.trim();\n const configHome = xdgConfigHome || join(this.getHomeDir(), \".config\");\n return resolve(configHome, \"systemd\", \"user\", \"nextclaw.service\");\n };\n\n private escapeSystemdValue = (value: string): string => {\n if (/^[A-Za-z0-9_./:@%+=,-]+$/.test(value)) {\n return value;\n }\n return `\"${value.replace(/([\"\\\\])/g, \"\\\\$1\")}\"`;\n };\n\n private formatCommand = (command: string, args: string[]): string => {\n return [command, ...args].map((value) => this.escapeSystemdValue(value)).join(\" \");\n };\n\n private runCheckedCommand = async ({ command, args }: CheckedCommandParams): Promise<void> => {\n const result = await this.runCommandImpl(command, args);\n if (result.code === 0) {\n return;\n }\n const detail = result.stderr || result.stdout || `exit code ${result.code}`;\n throw new Error(`Command failed: ${this.formatCommand(command, args)} (${detail})`);\n };\n}\n\nconst defaultRunCommand = async (command: string, args: string[]): Promise<HostAutostartRunCommandResult> => {\n return await new Promise<HostAutostartRunCommandResult>((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf-8\");\n child.stderr?.setEncoding(\"utf-8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", (error) => {\n rejectPromise(error);\n });\n child.on(\"close\", (code) => {\n resolvePromise({\n code: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n });\n });\n });\n};\n"],"mappings":"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"}
@@ -51,4 +51,5 @@ declare class MacosLaunchAgentAutostartService {
51
51
  private runTolerantCommand;
52
52
  }
53
53
  //#endregion
54
- export { MacosLaunchAgentAutostartService };
54
+ export { MacosLaunchAgentAutostartService };
55
+ //# sourceMappingURL=macos-launch-agent-autostart.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos-launch-agent-autostart.service.d.ts","names":[],"sources":["../../../../../src/commands/service/services/autostart/macos-launch-agent-autostart.service.ts"],"mappings":";;;;;KAqBK,uCAAA;EACH,QAAA,GAAW,MAAA,CAAO,QAAA;EAClB,GAAA,GAAM,MAAA,CAAO,UAAA;EACb,UAAA;EACA,MAAA;EACA,UAAA,IAAc,IAAA;EACd,SAAA,UAAmB,SAAA;EACnB,aAAA,UAAuB,aAAA;EACvB,MAAA,UAAgB,MAAA;EAChB,UAAA,GAAa,uBAAA;EACb,cAAA,GAAiB,2BAAA;AAAA;AAAA,cAMN,gCAAA;EAAA,iBACM,QAAA;EAAA,iBACA,GAAA;EAAA,iBACA,UAAA;EAAA,iBACA,MAAA;EAAA,iBACA,UAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,iBACA,UAAA;EAAA,iBACA,cAAA;EAAA,iBACA,cAAA;cAEL,OAAA,GAAS,uCAAA;EAarB,OAAA,GAAiB,KAAA,EAAO,kBAAA,EAAoB,OAAA;IAAW,MAAA;EAAA,MAA0B,OAAA,CAAQ,0BAAA;EAuEzF,SAAA,GAAmB,KAAA,EAAO,kBAAA,EAAoB,OAAA;IAAW,MAAA;EAAA,MAA0B,OAAA,CAAQ,4BAAA;EAqE3F,MAAA,GAAgB,cAAA,GAAiB,kBAAA,KAAqB,OAAA,CAAQ,mBAAA;EAgC9D,MAAA,GAAgB,cAAA,GAAiB,kBAAA,KAAqB,OAAA,CAAQ,yBAAA;EAAA,QAwDtD,WAAA;EAAA,QAIA,uBAAA;EAAA,QAiBA,8BAAA;EAAA,QAqBA,gCAAA;EAAA,QAoBA,SAAA;EAAA,QAgCA,WAAA;EAAA,QAyCA,SAAA;EAAA,QASA,gBAAA;EAAA,QAIA,aAAA;EAAA,QAIA,YAAA;EAAA,QAKA,gBAAA;EAAA,QAYA,YAAA;EAAA,QAIA,iBAAA;EAAA,QASA,kBAAA;AAAA"}
@@ -403,3 +403,5 @@ const defaultRunCommand = async (command, args) => {
403
403
  };
404
404
  //#endregion
405
405
  export { MacosLaunchAgentAutostartService };
406
+
407
+ //# sourceMappingURL=macos-launch-agent-autostart.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos-launch-agent-autostart.service.js","names":[],"sources":["../../../../../src/commands/service/services/autostart/macos-launch-agent-autostart.service.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, resolve } from \"node:path\";\nimport type {\n HostAutostartCheck,\n HostAutostartDoctorReport,\n HostAutostartInstallResult,\n HostAutostartRunCommand,\n HostAutostartRunCommandResult,\n HostAutostartScope,\n HostAutostartStatus,\n HostAutostartUninstallResult,\n} from \"../../types/autostart/host-autostart.types.js\";\nimport { HostAutostartRuntimeService } from \"./host-autostart-runtime.service.js\";\n\ntype CheckedCommandParams = {\n command: string;\n args: string[];\n};\n\ntype MacosLaunchAgentAutostartServiceOptions = {\n platform?: NodeJS.Platform;\n env?: NodeJS.ProcessEnv;\n getHomeDir?: () => string;\n getUid?: () => number;\n existsSync?: (path: string) => boolean;\n mkdirSync?: typeof mkdirSync;\n writeFileSync?: typeof writeFileSync;\n rmSync?: typeof rmSync;\n runCommand?: HostAutostartRunCommand;\n runtimeService?: HostAutostartRuntimeService;\n};\n\nconst DEFAULT_LAUNCH_AGENT_LABEL = \"io.nextclaw.host-agent\";\nconst SUPPORTED_PLATFORM = \"darwin\";\n\nexport class MacosLaunchAgentAutostartService {\n private readonly platform: NodeJS.Platform;\n private readonly env: NodeJS.ProcessEnv;\n private readonly getHomeDir: () => string;\n private readonly getUid: () => number;\n private readonly pathExists: (path: string) => boolean;\n private readonly ensureDir: typeof mkdirSync;\n private readonly writeFile: typeof writeFileSync;\n private readonly removeFile: typeof rmSync;\n private readonly runCommandImpl: HostAutostartRunCommand;\n private readonly runtimeService: HostAutostartRuntimeService;\n\n constructor(options: MacosLaunchAgentAutostartServiceOptions = {}) {\n this.platform = options.platform ?? process.platform;\n this.env = options.env ?? process.env;\n this.getHomeDir = options.getHomeDir ?? homedir;\n this.getUid = options.getUid ?? (() => process.getuid?.() ?? Number(this.env.UID ?? 0));\n this.pathExists = options.existsSync ?? existsSync;\n this.ensureDir = options.mkdirSync ?? mkdirSync;\n this.writeFile = options.writeFileSync ?? writeFileSync;\n this.removeFile = options.rmSync ?? rmSync;\n this.runCommandImpl = options.runCommand ?? defaultRunCommand;\n this.runtimeService = options.runtimeService ?? new HostAutostartRuntimeService();\n }\n\n install = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartInstallResult> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedInstallResult(scope, Boolean(options.dryRun));\n }\n if (scope === \"system\") {\n return this.createUnsupportedInstallResult(scope, Boolean(options.dryRun), \"macOS launch agent currently supports --user only.\");\n }\n\n const actions = [\n `write launch agent plist ${plan.resourcePath}`,\n `if the GUI login domain is active, run ${this.formatCommand(\"launchctl\", [\"bootstrap\", plan.guiDomain, plan.resourcePath])}`,\n `if the GUI login domain is active, run ${this.formatCommand(\"launchctl\", [\"enable\", plan.serviceTarget])}`,\n `if the GUI login domain is active, run ${this.formatCommand(\"launchctl\", [\"kickstart\", \"-k\", plan.serviceTarget])}`,\n ];\n\n try {\n if (!options.dryRun) {\n this.ensureDir(dirname(plan.resourcePath), { recursive: true });\n this.ensureDir(dirname(plan.stdoutPath), { recursive: true });\n this.writeFile(plan.resourcePath, plan.plistContent);\n if (await this.hasGuiDomain(plan.guiDomain)) {\n await this.runTolerantCommand({\n command: \"launchctl\",\n args: [\"bootout\", plan.serviceTarget],\n });\n await this.runCheckedCommand({\n command: \"launchctl\",\n args: [\"bootstrap\", plan.guiDomain, plan.resourcePath],\n });\n await this.runCheckedCommand({\n command: \"launchctl\",\n args: [\"enable\", plan.serviceTarget],\n });\n await this.runCheckedCommand({\n command: \"launchctl\",\n args: [\"kickstart\", \"-k\", plan.serviceTarget],\n });\n }\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"launch agent install failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n uninstall = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartUninstallResult> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedUninstallResult(scope, Boolean(options.dryRun));\n }\n if (scope === \"system\") {\n return this.createUnsupportedUninstallResult(scope, Boolean(options.dryRun), \"macOS launch agent currently supports --user only.\");\n }\n\n const installed = this.pathExists(plan.resourcePath);\n const actions = [\n `if the GUI login domain is active, run ${this.formatCommand(\"launchctl\", [\"bootout\", plan.serviceTarget])}`,\n `remove launch agent plist ${plan.resourcePath}`,\n ];\n\n if (!installed) {\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions: [\"no installed launch agent plist found\"],\n reasonIfUnavailable: null,\n };\n }\n\n try {\n if (!options.dryRun) {\n if (await this.hasGuiDomain(plan.guiDomain)) {\n await this.runTolerantCommand({\n command: \"launchctl\",\n args: [\"bootout\", plan.serviceTarget],\n });\n }\n this.removeFile(plan.resourcePath, { force: true });\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"launch agent uninstall failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: true,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n status = async (requestedScope?: HostAutostartScope): Promise<HostAutostartStatus> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedStatus();\n }\n if (requestedScope === \"system\") {\n return this.createUnsupportedStatus(\"macOS launch agent currently supports --user only.\");\n }\n\n const installed = this.pathExists(plan.resourcePath);\n const enabled = installed ? await this.readEnabledState(plan.guiDomain, plan.resourceName) : false;\n const guiDomainAvailable = await this.hasGuiDomain(plan.guiDomain);\n const active = installed && guiDomainAvailable\n ? (await this.runCommandImpl(\"launchctl\", [\"print\", plan.serviceTarget])).code === 0\n : false;\n\n return {\n supported: true,\n installed,\n enabled,\n active,\n scope: \"user\",\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n reasonIfUnavailable: null,\n };\n };\n\n doctor = async (requestedScope?: HostAutostartScope): Promise<HostAutostartDoctorReport> => {\n const status = await this.status(requestedScope);\n const plan = this.buildPlan();\n const checks: HostAutostartCheck[] = [];\n const guiDomainAvailable = await this.hasGuiDomain(plan.guiDomain);\n\n checks.push({\n name: \"platform\",\n status: status.supported ? \"pass\" : \"fail\",\n detail: status.supported ? \"macOS supported\" : (status.reasonIfUnavailable ?? \"unsupported platform\"),\n });\n\n checks.push({\n name: \"plist-file\",\n status: status.installed ? \"pass\" : \"warn\",\n detail: plan.resourcePath,\n });\n\n checks.push({\n name: \"gui-domain\",\n status: guiDomainAvailable ? \"pass\" : \"warn\",\n detail: guiDomainAvailable ? plan.guiDomain : \"GUI login domain is not active; the agent will load on next login.\",\n });\n\n checks.push({\n name: \"exec-path\",\n status: this.pathExists(plan.launch.command) ? \"pass\" : \"fail\",\n detail: plan.launch.command,\n });\n\n checks.push({\n name: \"home-dir\",\n status: this.pathExists(plan.homeDir) ? \"pass\" : \"warn\",\n detail: plan.homeDir,\n });\n\n if (status.installed) {\n checks.push({\n name: \"enabled\",\n status: status.enabled === false ? \"warn\" : \"pass\",\n detail: status.enabled === false ? \"launch agent is disabled\" : \"launch agent enabled\",\n });\n checks.push({\n name: \"active\",\n status: status.active ? \"pass\" : \"warn\",\n detail: status.active ? \"launch agent active\" : \"launch agent not active in the current GUI session\",\n });\n }\n\n return {\n status,\n checks,\n exitCode: checks.some((check) => check.status === \"fail\" || check.status === \"warn\") ? 1 : 0,\n };\n };\n\n private isSupported = (): boolean => {\n return this.platform === SUPPORTED_PLATFORM;\n };\n\n private createUnsupportedStatus = (reason = \"launch agent autostart currently supports macOS only.\"): HostAutostartStatus => {\n return {\n supported: false,\n installed: false,\n enabled: null,\n active: null,\n scope: null,\n hostOwner: null,\n resourceName: null,\n resourcePath: null,\n homeDir: null,\n command: null,\n logHint: null,\n reasonIfUnavailable: reason,\n };\n };\n\n private createUnsupportedInstallResult = (\n scope: HostAutostartScope,\n dryRun: boolean,\n reason = \"launch agent autostart currently supports macOS only.\",\n ): HostAutostartInstallResult => {\n const plan = this.buildPlan();\n return {\n ok: false,\n dryRun,\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions: [],\n reasonIfUnavailable: reason,\n };\n };\n\n private createUnsupportedUninstallResult = (\n scope: HostAutostartScope,\n dryRun: boolean,\n reason = \"launch agent autostart currently supports macOS only.\",\n ): HostAutostartUninstallResult => {\n const plan = this.buildPlan();\n return {\n ok: false,\n dryRun,\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions: [],\n reasonIfUnavailable: reason,\n };\n };\n\n private buildPlan = () => {\n const launch = this.runtimeService.resolveForegroundServeLaunch();\n const homeDir = launch.homeDir;\n const resourceName = DEFAULT_LAUNCH_AGENT_LABEL;\n const resourcePath = resolve(this.getHomeDir(), \"Library\", \"LaunchAgents\", `${resourceName}.plist`);\n const stdoutPath = resolve(homeDir, \"logs\", \"host-autostart\", \"macos-launch-agent.stdout.log\");\n const stderrPath = resolve(homeDir, \"logs\", \"host-autostart\", \"macos-launch-agent.stderr.log\");\n const guiDomain = `gui/${this.getUid()}`;\n const serviceTarget = `${guiDomain}/${resourceName}`;\n\n return {\n launch,\n homeDir,\n hostOwner: \"launchd-launch-agent\" as const,\n resourceName,\n resourcePath,\n stdoutPath,\n stderrPath,\n guiDomain,\n serviceTarget,\n command: this.formatCommand(launch.command, launch.args),\n logHint: `tail -f ${this.escapeShellValue(stdoutPath)} ${this.escapeShellValue(stderrPath)}`,\n plistContent: this.renderPlist({\n label: resourceName,\n launch,\n homeDir,\n stdoutPath,\n stderrPath,\n }),\n };\n };\n\n private renderPlist = (params: {\n label: string;\n launch: { command: string; args: string[] };\n homeDir: string;\n stdoutPath: string;\n stderrPath: string;\n }): string => {\n const {\n label,\n launch,\n homeDir,\n stdoutPath,\n stderrPath,\n } = params;\n const lines = [\n \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\",\n \"<!DOCTYPE plist PUBLIC \\\"-//Apple//DTD PLIST 1.0//EN\\\" \\\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\\">\",\n \"<plist version=\\\"1.0\\\">\",\n \"<dict>\",\n ` <key>Label</key><string>${this.escapeXml(label)}</string>`,\n \" <key>ProgramArguments</key>\",\n \" <array>\",\n ...[launch.command, ...launch.args].map((value) => ` <string>${this.escapeXml(value)}</string>`),\n \" </array>\",\n ` <key>WorkingDirectory</key><string>${this.escapeXml(homeDir)}</string>`,\n \" <key>EnvironmentVariables</key>\",\n \" <dict>\",\n \" <key>NEXTCLAW_HOME</key>\",\n ` <string>${this.escapeXml(homeDir)}</string>`,\n \" </dict>\",\n \" <key>RunAtLoad</key><true/>\",\n \" <key>KeepAlive</key><false/>\",\n ` <key>StandardOutPath</key><string>${this.escapeXml(stdoutPath)}</string>`,\n ` <key>StandardErrorPath</key><string>${this.escapeXml(stderrPath)}</string>`,\n \"</dict>\",\n \"</plist>\",\n \"\",\n ];\n return lines.join(\"\\n\");\n };\n\n private escapeXml = (value: string): string => {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n };\n\n private escapeShellValue = (value: string): string => {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n };\n\n private formatCommand = (command: string, args: string[]): string => {\n return [command, ...args].map((value) => this.escapeShellValue(value)).join(\" \");\n };\n\n private hasGuiDomain = async (guiDomain: string): Promise<boolean> => {\n const result = await this.runCommandImpl(\"launchctl\", [\"print\", guiDomain]);\n return result.code === 0;\n };\n\n private readEnabledState = async (guiDomain: string, label: string): Promise<boolean | null> => {\n const result = await this.runCommandImpl(\"launchctl\", [\"print-disabled\", guiDomain]);\n if (result.code !== 0) {\n return null;\n }\n const matched = result.stdout.match(new RegExp(`\"${this.escapeRegExp(label)}\"\\\\s*=>\\\\s*(enabled|disabled)`));\n if (!matched) {\n return true;\n }\n return matched[1] === \"enabled\";\n };\n\n private escapeRegExp = (value: string): string => {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n private runCheckedCommand = async ({ command, args }: CheckedCommandParams): Promise<void> => {\n const result = await this.runCommandImpl(command, args);\n if (result.code === 0) {\n return;\n }\n const detail = result.stderr || result.stdout || `exit code ${result.code}`;\n throw new Error(`Command failed: ${this.formatCommand(command, args)} (${detail})`);\n };\n\n private runTolerantCommand = async ({ command, args }: CheckedCommandParams): Promise<void> => {\n await this.runCommandImpl(command, args);\n };\n}\n\nconst defaultRunCommand = async (command: string, args: string[]): Promise<HostAutostartRunCommandResult> => {\n return await new Promise<HostAutostartRunCommandResult>((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf-8\");\n child.stderr?.setEncoding(\"utf-8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", (error) => {\n rejectPromise(error);\n });\n child.on(\"close\", (code) => {\n resolvePromise({\n code: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n });\n });\n });\n};\n"],"mappings":"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"}
@@ -51,4 +51,5 @@ declare class WindowsTaskAutostartService {
51
51
  private runPowerShell;
52
52
  }
53
53
  //#endregion
54
- export { WindowsTaskAutostartService };
54
+ export { WindowsTaskAutostartService };
55
+ //# sourceMappingURL=windows-task-autostart.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-task-autostart.service.d.ts","names":[],"sources":["../../../../../src/commands/service/services/autostart/windows-task-autostart.service.ts"],"mappings":";;;;;KAeK,kCAAA;EACH,QAAA,GAAW,MAAA,CAAO,QAAA;EAClB,UAAA,IAAc,IAAA;EACd,SAAA,UAAmB,SAAA;EACnB,aAAA,UAAuB,aAAA;EACvB,MAAA,UAAgB,MAAA;EAChB,UAAA,GAAa,uBAAA;EACb,cAAA,GAAiB,2BAAA;AAAA;AAAA,cAeN,2BAAA;EAAA,iBACM,QAAA;EAAA,iBACA,UAAA;EAAA,iBACA,SAAA;EAAA,iBACA,SAAA;EAAA,iBACA,UAAA;EAAA,iBACA,cAAA;EAAA,iBACA,cAAA;cAEL,OAAA,GAAS,kCAAA;EAUrB,OAAA,GAAiB,KAAA,EAAO,kBAAA,EAAoB,OAAA;IAAW,MAAA;EAAA,MAA0B,OAAA,CAAQ,0BAAA;EAqDzF,SAAA,GAAmB,KAAA,EAAO,kBAAA,EAAoB,OAAA;IAAW,MAAA;EAAA,MAA0B,OAAA,CAAQ,4BAAA;EAmE3F,MAAA,GAAgB,cAAA,GAAiB,kBAAA,KAAqB,OAAA,CAAQ,mBAAA;EA4B9D,MAAA,GAAgB,cAAA,GAAiB,kBAAA,KAAqB,OAAA,CAAQ,yBAAA;EAAA,QAoBtD,WAAA;EAAA,QAIA,uBAAA;EAAA,QAiBA,8BAAA;EAAA,QAsBA,gCAAA;EAAA,QAqBA,mBAAA;EAAA,QAQA,eAAA;EAAA,QAYA,yBAAA;EAAA,QAQA,mBAAA;EAAA,QAQA,kBAAA;EAAA,QAQA,2BAAA;EAAA,QAsBA,yBAAA;EAAA,QAWA,SAAA;EAAA,QA0BA,cAAA;EAAA,QAiBA,gBAAA;EAAA,QAIA,mBAAA;EAAA,QAaA,qBAAA;EAAA,QASA,YAAA;EAAA,QAYA,kBAAA;EAAA,QAmBA,oBAAA;EAAA,QASA,aAAA;AAAA"}
@@ -402,3 +402,5 @@ const defaultRunCommand = async (command, args) => {
402
402
  };
403
403
  //#endregion
404
404
  export { WindowsTaskAutostartService };
405
+
406
+ //# sourceMappingURL=windows-task-autostart.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-task-autostart.service.js","names":["windowsPath"],"sources":["../../../../../src/commands/service/services/autostart/windows-task-autostart.service.ts"],"sourcesContent":["import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { win32 as windowsPath } from \"node:path\";\nimport type {\n HostAutostartCheck,\n HostAutostartDoctorReport,\n HostAutostartInstallResult,\n HostAutostartRunCommand,\n HostAutostartRunCommandResult,\n HostAutostartScope,\n HostAutostartStatus,\n HostAutostartUninstallResult,\n} from \"../../types/autostart/host-autostart.types.js\";\nimport { HostAutostartRuntimeService } from \"./host-autostart-runtime.service.js\";\n\ntype WindowsTaskAutostartServiceOptions = {\n platform?: NodeJS.Platform;\n existsSync?: (path: string) => boolean;\n mkdirSync?: typeof mkdirSync;\n writeFileSync?: typeof writeFileSync;\n rmSync?: typeof rmSync;\n runCommand?: HostAutostartRunCommand;\n runtimeService?: HostAutostartRuntimeService;\n};\n\ntype WindowsScheduledTaskInfo = {\n installed: boolean;\n enabled: boolean | null;\n active: boolean | null;\n state?: string | null;\n taskPath?: string | null;\n lastTaskResult?: number | null;\n};\n\nconst DEFAULT_TASK_NAME = \"NextClaw Host Autostart\";\nconst SUPPORTED_PLATFORM = \"win32\";\n\nexport class WindowsTaskAutostartService {\n private readonly platform: NodeJS.Platform;\n private readonly pathExists: (path: string) => boolean;\n private readonly ensureDir: typeof mkdirSync;\n private readonly writeFile: typeof writeFileSync;\n private readonly removeFile: typeof rmSync;\n private readonly runCommandImpl: HostAutostartRunCommand;\n private readonly runtimeService: HostAutostartRuntimeService;\n\n constructor(options: WindowsTaskAutostartServiceOptions = {}) {\n this.platform = options.platform ?? process.platform;\n this.pathExists = options.existsSync ?? existsSync;\n this.ensureDir = options.mkdirSync ?? mkdirSync;\n this.writeFile = options.writeFileSync ?? writeFileSync;\n this.removeFile = options.rmSync ?? rmSync;\n this.runCommandImpl = options.runCommand ?? defaultRunCommand;\n this.runtimeService = options.runtimeService ?? new HostAutostartRuntimeService();\n }\n\n install = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartInstallResult> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedInstallResult(scope, Boolean(options.dryRun));\n }\n if (scope === \"system\") {\n return this.createUnsupportedInstallResult(scope, Boolean(options.dryRun), \"Windows task autostart currently supports --user only.\");\n }\n\n const actions = [\n `write launcher script ${plan.resourcePath}`,\n `register scheduled task ${plan.resourceName}`,\n `start scheduled task ${plan.resourceName}`,\n ];\n\n try {\n if (!options.dryRun) {\n this.ensureDir(windowsPath.dirname(plan.resourcePath), { recursive: true });\n this.ensureDir(windowsPath.dirname(plan.logPath), { recursive: true });\n this.writeFile(plan.resourcePath, plan.launcherContent);\n await this.runCheckedPowerShell(this.renderInstallScript(plan));\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"windows task install failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n uninstall = async (scope: HostAutostartScope, options: { dryRun?: boolean } = {}): Promise<HostAutostartUninstallResult> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedUninstallResult(scope, Boolean(options.dryRun));\n }\n if (scope === \"system\") {\n return this.createUnsupportedUninstallResult(scope, Boolean(options.dryRun), \"Windows task autostart currently supports --user only.\");\n }\n\n const taskInfo = await this.readTaskInfo(plan.resourceName);\n const installed = taskInfo?.installed ?? false;\n const actions = [\n `unregister scheduled task ${plan.resourceName}`,\n `remove launcher script ${plan.resourcePath}`,\n ];\n\n if (!installed && !this.pathExists(plan.resourcePath)) {\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions: [\"no installed scheduled task or launcher script found\"],\n reasonIfUnavailable: null,\n };\n }\n\n try {\n if (!options.dryRun) {\n if (installed) {\n await this.runCheckedPowerShell(this.renderUninstallScript(plan.resourceName));\n }\n this.removeFile(plan.resourcePath, { force: true });\n }\n } catch (error) {\n return {\n ok: false,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: false,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: error instanceof Error ? error.message : \"windows task uninstall failed.\",\n };\n }\n\n return {\n ok: true,\n dryRun: Boolean(options.dryRun),\n scope,\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n removed: true,\n logHint: plan.logHint,\n actions,\n reasonIfUnavailable: null,\n };\n };\n\n status = async (requestedScope?: HostAutostartScope): Promise<HostAutostartStatus> => {\n const plan = this.buildPlan();\n if (!this.isSupported()) {\n return this.createUnsupportedStatus();\n }\n if (requestedScope === \"system\") {\n return this.createUnsupportedStatus(\"Windows task autostart currently supports --user only.\");\n }\n\n const taskInfo = await this.readTaskInfo(plan.resourceName);\n const installed = taskInfo?.installed ?? false;\n\n return {\n supported: true,\n installed,\n enabled: taskInfo?.enabled ?? false,\n active: taskInfo?.active ?? false,\n scope: \"user\",\n hostOwner: plan.hostOwner,\n resourceName: plan.resourceName,\n resourcePath: plan.resourcePath,\n homeDir: plan.homeDir,\n command: plan.command,\n logHint: plan.logHint,\n reasonIfUnavailable: null,\n };\n };\n\n doctor = async (requestedScope?: HostAutostartScope): Promise<HostAutostartDoctorReport> => {\n const status = await this.status(requestedScope);\n const plan = this.buildPlan();\n const taskInfo = await this.readTaskInfo(plan.resourceName);\n const checks: HostAutostartCheck[] = [\n this.createPlatformCheck(status),\n this.createTaskCheck(status, taskInfo, plan.resourceName),\n this.createLauncherScriptCheck(plan.resourcePath),\n this.createExecPathCheck(plan.launch.command),\n this.createHomeDirCheck(plan.homeDir),\n ...this.createInstalledDoctorChecks(status, taskInfo),\n ];\n\n return {\n status,\n checks,\n exitCode: checks.some((check) => check.status === \"fail\" || check.status === \"warn\") ? 1 : 0,\n };\n };\n\n private isSupported = (): boolean => {\n return this.platform === SUPPORTED_PLATFORM;\n };\n\n private createUnsupportedStatus = (reason = \"windows task autostart currently supports Windows only.\"): HostAutostartStatus => {\n return {\n supported: false,\n installed: false,\n enabled: null,\n active: null,\n scope: null,\n hostOwner: null,\n resourceName: null,\n resourcePath: null,\n homeDir: null,\n command: null,\n logHint: null,\n reasonIfUnavailable: reason,\n };\n };\n\n private createUnsupportedInstallResult = (\n scope: HostAutostartScope,\n dryRun: boolean,\n reason = \"windows task autostart currently supports Windows only.\",\n ): HostAutostartInstallResult => {\n const plan = this.buildPlan();\n const includePlan = this.isSupported();\n return {\n ok: false,\n dryRun,\n scope,\n hostOwner: includePlan ? plan.hostOwner : \"windows-logon-task\",\n resourceName: includePlan ? plan.resourceName : DEFAULT_TASK_NAME,\n resourcePath: includePlan ? plan.resourcePath : null,\n homeDir: includePlan ? plan.homeDir : null,\n command: includePlan ? plan.command : null,\n logHint: includePlan ? plan.logHint : null,\n actions: [],\n reasonIfUnavailable: reason,\n };\n };\n\n private createUnsupportedUninstallResult = (\n scope: HostAutostartScope,\n dryRun: boolean,\n reason = \"windows task autostart currently supports Windows only.\",\n ): HostAutostartUninstallResult => {\n const plan = this.buildPlan();\n const includePlan = this.isSupported();\n return {\n ok: false,\n dryRun,\n scope,\n hostOwner: includePlan ? plan.hostOwner : \"windows-logon-task\",\n resourceName: includePlan ? plan.resourceName : DEFAULT_TASK_NAME,\n resourcePath: includePlan ? plan.resourcePath : null,\n removed: false,\n logHint: includePlan ? plan.logHint : null,\n actions: [],\n reasonIfUnavailable: reason,\n };\n };\n\n private createPlatformCheck = (status: HostAutostartStatus): HostAutostartCheck => {\n return {\n name: \"platform\",\n status: status.supported ? \"pass\" : \"fail\",\n detail: status.supported ? \"windows supported\" : (status.reasonIfUnavailable ?? \"unsupported platform\"),\n };\n };\n\n private createTaskCheck = (\n status: HostAutostartStatus,\n taskInfo: WindowsScheduledTaskInfo | null,\n taskName: string,\n ): HostAutostartCheck => {\n return {\n name: \"task\",\n status: status.installed ? \"pass\" : \"warn\",\n detail: taskInfo?.taskPath ?? taskName,\n };\n };\n\n private createLauncherScriptCheck = (resourcePath: string): HostAutostartCheck => {\n return {\n name: \"launcher-script\",\n status: this.pathExists(resourcePath) ? \"pass\" : \"warn\",\n detail: resourcePath,\n };\n };\n\n private createExecPathCheck = (commandPath: string): HostAutostartCheck => {\n return {\n name: \"exec-path\",\n status: this.pathExists(commandPath) ? \"pass\" : \"fail\",\n detail: commandPath,\n };\n };\n\n private createHomeDirCheck = (homeDir: string): HostAutostartCheck => {\n return {\n name: \"home-dir\",\n status: this.pathExists(homeDir) ? \"pass\" : \"warn\",\n detail: homeDir,\n };\n };\n\n private createInstalledDoctorChecks = (\n status: HostAutostartStatus,\n taskInfo: WindowsScheduledTaskInfo | null,\n ): HostAutostartCheck[] => {\n if (!status.installed) {\n return [];\n }\n return [\n {\n name: \"enabled\",\n status: status.enabled === false ? \"warn\" : \"pass\",\n detail: status.enabled === false ? \"scheduled task disabled\" : \"scheduled task enabled\",\n },\n {\n name: \"active\",\n status: status.active ? \"pass\" : \"warn\",\n detail: taskInfo?.state ?? (status.active ? \"Running\" : \"Not running\"),\n },\n this.createLastTaskResultCheck(taskInfo),\n ];\n };\n\n private createLastTaskResultCheck = (taskInfo: WindowsScheduledTaskInfo | null): HostAutostartCheck => {\n const lastTaskResult = taskInfo?.lastTaskResult;\n return {\n name: \"last-task-result\",\n status: lastTaskResult === null || lastTaskResult === undefined || lastTaskResult === 0 ? \"pass\" : \"warn\",\n detail: lastTaskResult === null || lastTaskResult === undefined\n ? \"no recorded task result\"\n : String(lastTaskResult),\n };\n };\n\n private buildPlan = () => {\n const launch = this.runtimeService.resolveForegroundServeLaunch();\n const homeDir = launch.homeDir;\n const resourcePath = windowsPath.resolve(homeDir, \"autostart\", \"nextclaw-host-autostart.cmd\");\n const logPath = windowsPath.resolve(homeDir, \"logs\", \"host-autostart\", \"windows-task.log\");\n const launcherCommand = `cmd.exe /d /c \"${resourcePath}\"`;\n\n return {\n launch,\n homeDir,\n hostOwner: \"windows-logon-task\" as const,\n resourceName: DEFAULT_TASK_NAME,\n resourcePath,\n logPath,\n command: launcherCommand,\n logHint: `Get-Content -Path '${logPath.replace(/'/g, \"''\")}' -Wait`,\n launcherContent: this.renderLauncher({\n launch,\n homeDir,\n logPath,\n }),\n actionExecute: \"cmd.exe\",\n actionArguments: `/d /c \"${resourcePath}\"`,\n };\n };\n\n private renderLauncher = (params: {\n launch: { command: string; args: string[] };\n homeDir: string;\n logPath: string;\n }): string => {\n const { launch, homeDir, logPath } = params;\n const args = launch.args.map((value) => `\"${this.escapeBatchValue(value)}\"`).join(\" \");\n return [\n \"@echo off\",\n \"setlocal\",\n `set \"NEXTCLAW_HOME=${this.escapeBatchValue(homeDir)}\"`,\n `cd /d \"${this.escapeBatchValue(homeDir)}\"`,\n `\"${this.escapeBatchValue(launch.command)}\" ${args} >> \"${this.escapeBatchValue(logPath)}\" 2>&1`,\n \"\",\n ].join(\"\\r\\n\");\n };\n\n private escapeBatchValue = (value: string): string => {\n return value.replace(/\"/g, \"\\\"\\\"\");\n };\n\n private renderInstallScript = (plan: ReturnType<WindowsTaskAutostartService[\"buildPlan\"]>): string => {\n return [\n `$taskName = '${plan.resourceName.replace(/'/g, \"''\")}'`,\n `$userId = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name`,\n `$action = New-ScheduledTaskAction -Execute 'cmd.exe' -Argument '/d /c \"${plan.resourcePath.replace(/'/g, \"''\")}\"'`,\n \"$trigger = New-ScheduledTaskTrigger -AtLogOn\",\n \"$principal = New-ScheduledTaskPrincipal -UserId $userId -LogonType InteractiveToken -RunLevel Limited\",\n \"$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries\",\n \"Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force | Out-Null\",\n \"Start-ScheduledTask -TaskName $taskName\",\n ].join(\"\\n\");\n };\n\n private renderUninstallScript = (taskName: string): string => {\n return [\n `$task = Get-ScheduledTask -TaskName '${taskName.replace(/'/g, \"''\")}' -ErrorAction SilentlyContinue`,\n \"if ($null -ne $task) {\",\n \" Unregister-ScheduledTask -TaskName $task.TaskName -Confirm:$false\",\n \"}\",\n ].join(\"\\n\");\n };\n\n private readTaskInfo = async (taskName: string): Promise<WindowsScheduledTaskInfo | null> => {\n const result = await this.runPowerShell(this.renderStatusScript(taskName));\n if (result.code !== 0) {\n return null;\n }\n const payload = result.stdout.trim();\n if (!payload) {\n return null;\n }\n return JSON.parse(payload) as WindowsScheduledTaskInfo;\n };\n\n private renderStatusScript = (taskName: string): string => {\n return [\n `$task = Get-ScheduledTask -TaskName '${taskName.replace(/'/g, \"''\")}' -ErrorAction SilentlyContinue`,\n \"if ($null -eq $task) {\",\n \" [pscustomobject]@{ installed = $false; enabled = $false; active = $false; state = $null; taskPath = $null; lastTaskResult = $null } | ConvertTo-Json -Compress\",\n \" exit 0\",\n \"}\",\n \"$info = Get-ScheduledTaskInfo -TaskName $task.TaskName\",\n \"[pscustomobject]@{\",\n \" installed = $true\",\n \" enabled = [bool]$task.Settings.Enabled\",\n \" active = ([string]$task.State -eq 'Running')\",\n \" state = [string]$task.State\",\n \" taskPath = [string]$task.TaskPath\",\n \" lastTaskResult = [int]$info.LastTaskResult\",\n \"} | ConvertTo-Json -Compress\",\n ].join(\"\\n\");\n };\n\n private runCheckedPowerShell = async (script: string): Promise<void> => {\n const result = await this.runPowerShell(script);\n if (result.code === 0) {\n return;\n }\n const detail = result.stderr || result.stdout || `exit code ${result.code}`;\n throw new Error(`PowerShell command failed: ${detail}`);\n };\n\n private runPowerShell = async (script: string): Promise<HostAutostartRunCommandResult> => {\n const encodedScript = Buffer.from(script, \"utf16le\").toString(\"base64\");\n return await this.runCommandImpl(\"powershell\", [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-EncodedCommand\",\n encodedScript,\n ]);\n };\n}\n\nconst defaultRunCommand = async (command: string, args: string[]): Promise<HostAutostartRunCommandResult> => {\n return await new Promise<HostAutostartRunCommandResult>((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf-8\");\n child.stderr?.setEncoding(\"utf-8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", (error) => {\n rejectPromise(error);\n });\n child.on(\"close\", (code) => {\n resolvePromise({\n code: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n });\n });\n });\n};\n"],"mappings":"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"}
@@ -61,4 +61,5 @@ type SystemdScopeFlags = {
61
61
  system?: boolean;
62
62
  };
63
63
  //#endregion
64
- export { HostAutostartCheck, HostAutostartDoctorReport, HostAutostartInstallResult, HostAutostartOwner, HostAutostartRunCommand, HostAutostartRunCommandResult, HostAutostartScope, HostAutostartStatus, HostAutostartUninstallResult, SystemdScopeFlags };
64
+ export { HostAutostartCheck, HostAutostartDoctorReport, HostAutostartInstallResult, HostAutostartOwner, HostAutostartRunCommand, HostAutostartRunCommandResult, HostAutostartScope, HostAutostartStatus, HostAutostartUninstallResult, SystemdScopeFlags };
65
+ //# sourceMappingURL=host-autostart.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-autostart.types.d.ts","names":[],"sources":["../../../../../src/commands/service/types/autostart/host-autostart.types.ts"],"mappings":";KAAY,kBAAA;AAAA,KAEA,kBAAA;AAAA,KAMA,6BAAA;EACV,IAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,KAGU,uBAAA,IACV,OAAA,UACA,IAAA,eACG,OAAA,CAAQ,6BAAA;AAAA,KAED,mBAAA;EACV,SAAA;EACA,SAAA;EACA,OAAA;EACA,MAAA;EACA,KAAA,EAAO,kBAAA;EACP,SAAA,EAAW,kBAAA;EACX,YAAA;EACA,YAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,mBAAA;AAAA;AAAA,KAGU,kBAAA;EACV,IAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,KAGU,yBAAA;EACV,MAAA,EAAQ,mBAAA;EACR,MAAA,EAAQ,kBAAA;EACR,QAAA;AAAA;AAAA,KAGU,0BAAA;EACV,EAAA;EACA,MAAA;EACA,KAAA,EAAO,kBAAA;EACP,SAAA,EAAW,kBAAA;EACX,YAAA;EACA,YAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,mBAAA;AAAA;AAAA,KAGU,4BAAA;EACV,EAAA;EACA,MAAA;EACA,KAAA,EAAO,kBAAA;EACP,SAAA,EAAW,kBAAA;EACX,YAAA;EACA,YAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,mBAAA;AAAA;AAAA,KAGU,iBAAA;EACV,IAAA;EACA,MAAA;AAAA"}
@@ -20,4 +20,5 @@ declare class NpmRuntimeBundleLayoutStore {
20
20
  private writePointer;
21
21
  }
22
22
  //#endregion
23
- export { NpmRuntimeBundleLayoutStore };
23
+ export { NpmRuntimeBundleLayoutStore };
24
+ //# sourceMappingURL=npm-runtime-bundle-layout.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle-layout.store.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-bundle-layout.store.ts"],"mappings":";;;cAKa,2BAAA;EAAA,iBACkB,aAAA;cAAA,aAAA;EAE7B,UAAA;EAEA,cAAA;EAEA,aAAA,GAAiB,OAAA;EAEjB,aAAA;EAEA,qBAAA;EAEA,sBAAA;EAEA,YAAA;EAEA,kBAAA;EAMA,kBAAA,QAAyB,uBAAA;EAEzB,mBAAA,QAA0B,uBAAA;EAE1B,mBAAA,GAAuB,OAAA,EAAS,uBAAA;EAEhC,oBAAA,GAAwB,OAAA,EAAS,uBAAA;EAAA,QAEzB,WAAA;EAAA,QASA,YAAA;AAAA"}
@@ -35,3 +35,5 @@ var NpmRuntimeBundleLayoutStore = class {
35
35
  };
36
36
  //#endregion
37
37
  export { NpmRuntimeBundleLayoutStore };
38
+
39
+ //# sourceMappingURL=npm-runtime-bundle-layout.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle-layout.store.js","names":[],"sources":["../../src/launcher/npm-runtime-bundle-layout.store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { getDataDir } from \"@nextclaw/core\";\nimport type { NpmRuntimeBundlePointer } from \"./npm-runtime-bundle.types.js\";\n\nexport class NpmRuntimeBundleLayoutStore {\n constructor(private readonly rootDirectory = join(getDataDir(), \"launcher\", \"runtime-bundles\")) {}\n\n getRootDir = (): string => this.rootDirectory;\n\n getVersionsDir = (): string => join(this.rootDirectory, \"versions\");\n\n getVersionDir = (version: string): string => join(this.getVersionsDir(), version);\n\n getStagingDir = (): string => join(this.rootDirectory, \"staging\");\n\n getCurrentPointerPath = (): string => join(this.rootDirectory, \"current.json\");\n\n getPreviousPointerPath = (): string => join(this.rootDirectory, \"previous.json\");\n\n getStatePath = (): string => join(getDataDir(), \"launcher\", \"npm-runtime-update-state.json\");\n\n ensureLauncherDirs = (): void => {\n mkdirSync(this.getVersionsDir(), { recursive: true });\n mkdirSync(this.getStagingDir(), { recursive: true });\n mkdirSync(dirname(this.getStatePath()), { recursive: true });\n };\n\n readCurrentPointer = (): NpmRuntimeBundlePointer | null => this.readPointer(this.getCurrentPointerPath());\n\n readPreviousPointer = (): NpmRuntimeBundlePointer | null => this.readPointer(this.getPreviousPointerPath());\n\n writeCurrentPointer = (pointer: NpmRuntimeBundlePointer): void => this.writePointer(this.getCurrentPointerPath(), pointer);\n\n writePreviousPointer = (pointer: NpmRuntimeBundlePointer): void => this.writePointer(this.getPreviousPointerPath(), pointer);\n\n private readPointer = (pointerPath: string): NpmRuntimeBundlePointer | null => {\n if (!existsSync(pointerPath)) {\n return null;\n }\n const parsed = JSON.parse(readFileSync(pointerPath, \"utf8\")) as Record<string, unknown>;\n const version = typeof parsed.version === \"string\" ? parsed.version.trim() : \"\";\n return version ? { version } : null;\n };\n\n private writePointer = (pointerPath: string, pointer: NpmRuntimeBundlePointer): void => {\n mkdirSync(dirname(pointerPath), { recursive: true });\n writeFileSync(pointerPath, `${JSON.stringify(pointer, null, 2)}\\n`, \"utf8\");\n };\n}\n"],"mappings":";;;;AAKA,IAAa,8BAAb,MAAyC;CACvC,YAAY,gBAAiC,KAAK,YAAY,EAAE,YAAY,kBAAkB,EAAE;AAAnE,OAAA,gBAAA;;CAE7B,mBAA2B,KAAK;CAEhC,uBAA+B,KAAK,KAAK,eAAe,WAAW;CAEnE,iBAAiB,YAA4B,KAAK,KAAK,gBAAgB,EAAE,QAAQ;CAEjF,sBAA8B,KAAK,KAAK,eAAe,UAAU;CAEjE,8BAAsC,KAAK,KAAK,eAAe,eAAe;CAE9E,+BAAuC,KAAK,KAAK,eAAe,gBAAgB;CAEhF,qBAA6B,KAAK,YAAY,EAAE,YAAY,gCAAgC;CAE5F,2BAAiC;AAC/B,YAAU,KAAK,gBAAgB,EAAE,EAAE,WAAW,MAAM,CAAC;AACrD,YAAU,KAAK,eAAe,EAAE,EAAE,WAAW,MAAM,CAAC;AACpD,YAAU,QAAQ,KAAK,cAAc,CAAC,EAAE,EAAE,WAAW,MAAM,CAAC;;CAG9D,2BAA2D,KAAK,YAAY,KAAK,uBAAuB,CAAC;CAEzG,4BAA4D,KAAK,YAAY,KAAK,wBAAwB,CAAC;CAE3G,uBAAuB,YAA2C,KAAK,aAAa,KAAK,uBAAuB,EAAE,QAAQ;CAE1H,wBAAwB,YAA2C,KAAK,aAAa,KAAK,wBAAwB,EAAE,QAAQ;CAE5H,eAAuB,gBAAwD;AAC7E,MAAI,CAAC,WAAW,YAAY,CAC1B,QAAO;EAET,MAAM,SAAS,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;EAC5D,MAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,QAAQ,MAAM,GAAG;AAC7E,SAAO,UAAU,EAAE,SAAS,GAAG;;CAGjC,gBAAwB,aAAqB,YAA2C;AACtF,YAAU,QAAQ,YAAY,EAAE,EAAE,WAAW,MAAM,CAAC;AACpD,gBAAc,aAAa,GAAG,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,KAAK,OAAO"}
@@ -6,4 +6,5 @@ declare class NpmRuntimeBundleManifestReader {
6
6
  parse: (input: unknown, context?: string) => NpmRuntimeBundleManifest;
7
7
  }
8
8
  //#endregion
9
- export { NpmRuntimeBundleManifestReader };
9
+ export { NpmRuntimeBundleManifestReader };
10
+ //# sourceMappingURL=npm-runtime-bundle-manifest.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle-manifest.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-bundle-manifest.service.ts"],"mappings":";;;cAmBa,8BAAA;EACX,QAAA,GAAY,QAAA,aAAmB,wBAAA;EAO/B,KAAA,GAAS,KAAA,WAAgB,OAAA,cAAsC,wBAAA;AAAA"}
@@ -37,3 +37,5 @@ var NpmRuntimeBundleManifestReader = class {
37
37
  };
38
38
  //#endregion
39
39
  export { NpmRuntimeBundleManifestReader };
40
+
41
+ //# sourceMappingURL=npm-runtime-bundle-manifest.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle-manifest.service.js","names":[],"sources":["../../src/launcher/npm-runtime-bundle-manifest.service.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { NpmRuntimeBundleManifest } from \"./npm-runtime-bundle.types.js\";\n\nfunction readRequiredString(record: Record<string, unknown>, key: string, context: string): string {\n const value = record[key];\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${context} missing required string field: ${key}`);\n }\n return value.trim();\n}\n\nfunction readRequiredObject(record: Record<string, unknown>, key: string, context: string): Record<string, unknown> {\n const value = record[key];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${context} missing required object field: ${key}`);\n }\n return value as Record<string, unknown>;\n}\n\nexport class NpmRuntimeBundleManifestReader {\n readFile = (filePath: string): NpmRuntimeBundleManifest => {\n if (!existsSync(filePath)) {\n throw new Error(`runtime bundle manifest not found: ${filePath}`);\n }\n return this.parse(JSON.parse(readFileSync(filePath, \"utf8\")), filePath);\n };\n\n parse = (input: unknown, context = \"runtime bundle manifest\"): NpmRuntimeBundleManifest => {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(`${context} must be an object`);\n }\n const record = input as Record<string, unknown>;\n const launcherCompatibility = readRequiredObject(record, \"launcherCompatibility\", context);\n const entrypoints = readRequiredObject(record, \"entrypoints\", context);\n const migrationVersion = Number(record.migrationVersion);\n if (!Number.isInteger(migrationVersion) || migrationVersion < 0) {\n throw new Error(`${context} has invalid migrationVersion`);\n }\n return {\n bundleVersion: readRequiredString(record, \"bundleVersion\", context),\n platform: readRequiredString(record, \"platform\", context),\n arch: readRequiredString(record, \"arch\", context),\n uiVersion: readRequiredString(record, \"uiVersion\", context),\n runtimeVersion: readRequiredString(record, \"runtimeVersion\", context),\n builtInPluginSetVersion: readRequiredString(record, \"builtInPluginSetVersion\", context),\n launcherCompatibility: {\n minVersion: readRequiredString(launcherCompatibility, \"minVersion\", `${context}.launcherCompatibility`)\n },\n entrypoints: {\n runtimeScript: readRequiredString(entrypoints, \"runtimeScript\", `${context}.entrypoints`)\n },\n migrationVersion\n };\n };\n}\n"],"mappings":";;AAGA,SAAS,mBAAmB,QAAiC,KAAa,SAAyB;CACjG,MAAM,QAAQ,OAAO;AACrB,KAAI,OAAO,UAAU,YAAY,CAAC,MAAM,MAAM,CAC5C,OAAM,IAAI,MAAM,GAAG,QAAQ,kCAAkC,MAAM;AAErE,QAAO,MAAM,MAAM;;AAGrB,SAAS,mBAAmB,QAAiC,KAAa,SAA0C;CAClH,MAAM,QAAQ,OAAO;AACrB,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,OAAM,IAAI,MAAM,GAAG,QAAQ,kCAAkC,MAAM;AAErE,QAAO;;AAGT,IAAa,iCAAb,MAA4C;CAC1C,YAAY,aAA+C;AACzD,MAAI,CAAC,WAAW,SAAS,CACvB,OAAM,IAAI,MAAM,sCAAsC,WAAW;AAEnE,SAAO,KAAK,MAAM,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC,EAAE,SAAS;;CAGzE,SAAS,OAAgB,UAAU,8BAAwD;AACzF,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,OAAM,IAAI,MAAM,GAAG,QAAQ,oBAAoB;EAEjD,MAAM,SAAS;EACf,MAAM,wBAAwB,mBAAmB,QAAQ,yBAAyB,QAAQ;EAC1F,MAAM,cAAc,mBAAmB,QAAQ,eAAe,QAAQ;EACtE,MAAM,mBAAmB,OAAO,OAAO,iBAAiB;AACxD,MAAI,CAAC,OAAO,UAAU,iBAAiB,IAAI,mBAAmB,EAC5D,OAAM,IAAI,MAAM,GAAG,QAAQ,+BAA+B;AAE5D,SAAO;GACL,eAAe,mBAAmB,QAAQ,iBAAiB,QAAQ;GACnE,UAAU,mBAAmB,QAAQ,YAAY,QAAQ;GACzD,MAAM,mBAAmB,QAAQ,QAAQ,QAAQ;GACjD,WAAW,mBAAmB,QAAQ,aAAa,QAAQ;GAC3D,gBAAgB,mBAAmB,QAAQ,kBAAkB,QAAQ;GACrE,yBAAyB,mBAAmB,QAAQ,2BAA2B,QAAQ;GACvF,uBAAuB,EACrB,YAAY,mBAAmB,uBAAuB,cAAc,GAAG,QAAQ,wBAAwB,EACxG;GACD,aAAa,EACX,eAAe,mBAAmB,aAAa,iBAAiB,GAAG,QAAQ,cAAc,EAC1F;GACD;GACD"}
@@ -44,4 +44,5 @@ declare function shouldPreferPackagedNpmRuntime(params: {
44
44
  currentBundleVersion: string | null;
45
45
  }): boolean;
46
46
  //#endregion
47
- export { NpmRuntimeBundleService, ResolvedNpmRuntimeBundle, compareNpmRuntimeVersions, resolveEffectiveNpmRuntimeVersion, shouldPreferPackagedNpmRuntime };
47
+ export { NpmRuntimeBundleService, ResolvedNpmRuntimeBundle, compareNpmRuntimeVersions, resolveEffectiveNpmRuntimeVersion, shouldPreferPackagedNpmRuntime };
48
+ //# sourceMappingURL=npm-runtime-bundle.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-bundle.service.ts"],"mappings":";;;;;;KAQY,wBAAA;EACV,eAAA;EACA,QAAA,EAAU,wBAAA;EACV,iBAAA;AAAA;AAAA,KAGG,8BAAA;EACH,MAAA,EAAQ,2BAAA;EACR,UAAA,EAAY,0BAAA;EACZ,cAAA,GAAiB,8BAAA;EACjB,QAAA,GAAW,MAAA,CAAO,QAAA;EAClB,IAAA;EACA,eAAA;EACA,GAAA;AAAA;AAAA,cAWW,uBAAA;EAAA,iBAOkB,OAAA;EAAA,iBANZ,cAAA;EAAA,iBACA,QAAA;EAAA,iBACA,IAAA;EAAA,iBACA,eAAA;EAAA,iBACA,GAAA;cAEY,OAAA,EAAS,8BAAA;EAQtC,oBAAA,QAA2B,wBAAA;EAQ3B,cAAA,GAAkB,OAAA,aAAkB,wBAAA;EASpC,oBAAA,GAA8B,eAAA,aAA0B,OAAA,CAAQ,wBAAA;EA6BhE,eAAA,GAAmB,OAAA;EAkBnB,sBAAA,QAAmC,OAAA;EAAA,QAyB3B,qBAAA;EAAA,QAKA,YAAA;AAAA;AAAA,iBAuBM,yBAAA,CAA0B,IAAA,UAAc,KAAA;AAAA,iBAcxC,iCAAA,CAAkC,MAAA;EAChD,eAAA;EACA,oBAAA;AAAA;AAAA,iBAec,8BAAA,CAA+B,MAAA;EAC7C,eAAA;EACA,oBAAA;AAAA"}
@@ -148,3 +148,5 @@ function parseVersionParts(version) {
148
148
  }
149
149
  //#endregion
150
150
  export { NpmRuntimeBundleService, compareNpmRuntimeVersions, resolveEffectiveNpmRuntimeVersion, shouldPreferPackagedNpmRuntime };
151
+
152
+ //# sourceMappingURL=npm-runtime-bundle.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle.service.js","names":[],"sources":["../../src/launcher/npm-runtime-bundle.service.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { cp, readdir, rename, rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { NpmRuntimeBundleManifestReader } from \"./npm-runtime-bundle-manifest.service.js\";\nimport type { NpmRuntimeBundleLayoutStore } from \"./npm-runtime-bundle-layout.store.js\";\nimport type { NpmRuntimeBundleManifest } from \"./npm-runtime-bundle.types.js\";\nimport type { NpmRuntimeUpdateStateStore } from \"./npm-runtime-update-state.store.js\";\n\nexport type ResolvedNpmRuntimeBundle = {\n bundleDirectory: string;\n manifest: NpmRuntimeBundleManifest;\n runtimeScriptPath: string;\n};\n\ntype NpmRuntimeBundleServiceOptions = {\n layout: NpmRuntimeBundleLayoutStore;\n stateStore: NpmRuntimeUpdateStateStore;\n manifestReader?: NpmRuntimeBundleManifestReader;\n platform?: NodeJS.Platform;\n arch?: string;\n launcherVersion?: string;\n now?: () => number;\n};\n\nfunction shouldRetryInstallWithCopy(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n const code = \"code\" in error ? String(error.code) : \"\";\n return code === \"EXDEV\" || code === \"EPERM\";\n}\n\nexport class NpmRuntimeBundleService {\n private readonly manifestReader: NpmRuntimeBundleManifestReader;\n private readonly platform: NodeJS.Platform;\n private readonly arch: string;\n private readonly launcherVersion: string | null;\n private readonly now: () => number;\n\n constructor(private readonly options: NpmRuntimeBundleServiceOptions) {\n this.manifestReader = options.manifestReader ?? new NpmRuntimeBundleManifestReader();\n this.platform = options.platform ?? process.platform;\n this.arch = options.arch ?? process.arch;\n this.launcherVersion = options.launcherVersion?.trim() || null;\n this.now = options.now ?? Date.now;\n }\n\n resolveCurrentBundle = (): ResolvedNpmRuntimeBundle | null => {\n const pointer = this.options.layout.readCurrentPointer();\n if (!pointer) {\n return null;\n }\n return this.resolveVersion(pointer.version);\n };\n\n resolveVersion = (version: string): ResolvedNpmRuntimeBundle => {\n const bundleDirectory = this.options.layout.getVersionDir(version);\n const bundle = this.verifyBundle(bundleDirectory);\n if (bundle.manifest.bundleVersion !== version) {\n throw new Error(`runtime bundle version mismatch: pointer expects ${version} but manifest is ${bundle.manifest.bundleVersion}`);\n }\n return bundle;\n };\n\n installFromDirectory = async (sourceDirectory: string): Promise<ResolvedNpmRuntimeBundle> => {\n this.options.layout.ensureLauncherDirs();\n const sourceBundle = this.verifyBundle(sourceDirectory);\n const targetDirectory = this.options.layout.getVersionDir(sourceBundle.manifest.bundleVersion);\n if (existsSync(targetDirectory)) {\n return this.verifyBundle(targetDirectory);\n }\n\n try {\n await rename(sourceDirectory, targetDirectory);\n return this.verifyBundle(targetDirectory);\n } catch (error) {\n if (!shouldRetryInstallWithCopy(error)) {\n throw error;\n }\n }\n\n const stagingDirectory = join(this.options.layout.getStagingDir(), `${sourceBundle.manifest.bundleVersion}-${this.now()}`);\n await rm(stagingDirectory, { recursive: true, force: true });\n try {\n await cp(sourceDirectory, stagingDirectory, { recursive: true });\n await rename(stagingDirectory, targetDirectory);\n return this.verifyBundle(targetDirectory);\n } catch (error) {\n await rm(stagingDirectory, { recursive: true, force: true });\n throw error;\n }\n };\n\n activateVersion = (version: string): void => {\n this.resolveVersion(version);\n const currentPointer = this.options.layout.readCurrentPointer();\n if (currentPointer) {\n this.options.layout.writePreviousPointer(currentPointer);\n }\n this.options.layout.writeCurrentPointer({ version });\n this.options.stateStore.update((state) => ({\n ...state,\n currentVersion: version,\n previousVersion: currentPointer?.version ?? state.previousVersion,\n candidateVersion: version,\n candidateLaunchCount: 0,\n downloadedVersion: null,\n downloadedReleaseNotesUrl: null\n }));\n };\n\n pruneRetainedArtifacts = async (): Promise<void> => {\n this.options.layout.ensureLauncherDirs();\n const state = this.options.stateStore.read();\n const retained = new Set(\n [\n state.currentVersion,\n state.previousVersion,\n state.candidateVersion,\n state.lastKnownGoodVersion,\n state.downloadedVersion,\n this.options.layout.readCurrentPointer()?.version,\n this.options.layout.readPreviousPointer()?.version\n ].filter((version): version is string => Boolean(version?.trim()))\n );\n\n const entries = await readdir(this.options.layout.getVersionsDir(), { withFileTypes: true });\n for (const entry of entries.sort((left, right) => compareNpmRuntimeVersions(left.name, right.name))) {\n if (!entry.isDirectory() || retained.has(entry.name)) {\n continue;\n }\n await rm(join(this.options.layout.getVersionsDir(), entry.name), { recursive: true, force: true });\n }\n await this.clearStagingDirectory();\n };\n\n private clearStagingDirectory = async (): Promise<void> => {\n const entries = await readdir(this.options.layout.getStagingDir(), { withFileTypes: true });\n await Promise.all(entries.map(async (entry) => await rm(join(this.options.layout.getStagingDir(), entry.name), { recursive: true, force: true })));\n };\n\n private verifyBundle = (bundleDirectory: string): ResolvedNpmRuntimeBundle => {\n const manifest = this.manifestReader.readFile(resolve(bundleDirectory, \"manifest.json\"));\n if (manifest.platform !== this.platform) {\n throw new Error(`runtime bundle platform mismatch: expected ${this.platform} but got ${manifest.platform}`);\n }\n if (manifest.arch !== this.arch) {\n throw new Error(`runtime bundle arch mismatch: expected ${this.arch} but got ${manifest.arch}`);\n }\n if (this.launcherVersion && compareNpmRuntimeVersions(this.launcherVersion, manifest.launcherCompatibility.minVersion) < 0) {\n throw new Error(`runtime bundle requires launcher >= ${manifest.launcherCompatibility.minVersion} but current launcher is ${this.launcherVersion}`);\n }\n const runtimeScriptPath = resolve(bundleDirectory, manifest.entrypoints.runtimeScript);\n if (!existsSync(runtimeScriptPath)) {\n throw new Error(`runtime bundle script missing: ${runtimeScriptPath}`);\n }\n return {\n bundleDirectory,\n manifest,\n runtimeScriptPath\n };\n };\n}\n\nexport function compareNpmRuntimeVersions(left: string, right: string): number {\n const leftParts = parseVersionParts(left);\n const rightParts = parseVersionParts(right);\n const length = Math.max(leftParts.length, rightParts.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = leftParts[index] ?? 0;\n const rightPart = rightParts[index] ?? 0;\n if (leftPart !== rightPart) {\n return leftPart - rightPart;\n }\n }\n return left.localeCompare(right);\n}\n\nexport function resolveEffectiveNpmRuntimeVersion(params: {\n launcherVersion: string | null;\n currentBundleVersion: string | null;\n}): string | null {\n const launcherVersion = params.launcherVersion?.trim() || null;\n const currentBundleVersion = params.currentBundleVersion?.trim() || null;\n if (!launcherVersion) {\n return currentBundleVersion;\n }\n if (!currentBundleVersion) {\n return launcherVersion;\n }\n return compareNpmRuntimeVersions(launcherVersion, currentBundleVersion) > 0\n ? launcherVersion\n : currentBundleVersion;\n}\n\nexport function shouldPreferPackagedNpmRuntime(params: {\n launcherVersion: string | null;\n currentBundleVersion: string | null;\n}): boolean {\n const launcherVersion = params.launcherVersion?.trim() || null;\n const currentBundleVersion = params.currentBundleVersion?.trim() || null;\n if (!launcherVersion || !currentBundleVersion) {\n return false;\n }\n return resolveEffectiveNpmRuntimeVersion(params) === launcherVersion;\n}\n\nfunction parseVersionParts(version: string): number[] {\n return version\n .split(/[.-]/)\n .map((part) => Number(part))\n .map((part) => (Number.isFinite(part) ? part : 0));\n}\n"],"mappings":"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"}
@@ -46,4 +46,5 @@ type NpmRuntimeUpdateCommandResult = {
46
46
  message: string;
47
47
  };
48
48
  //#endregion
49
- export { NpmRuntimeBundleManifest, NpmRuntimeBundlePointer, NpmRuntimeDownloadedUpdate, NpmRuntimeUpdateCommandResult, NpmRuntimeUpdateProgressReporter, NpmRuntimeUpdateState };
49
+ export { NpmRuntimeBundleManifest, NpmRuntimeBundlePointer, NpmRuntimeDownloadedUpdate, NpmRuntimeUpdateCommandResult, NpmRuntimeUpdateProgressReporter, NpmRuntimeUpdateState };
50
+ //# sourceMappingURL=npm-runtime-bundle.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-bundle.types.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-bundle.types.ts"],"mappings":";;;KAEY,wBAAA;EACV,aAAA;EACA,QAAA;EACA,IAAA;EACA,SAAA;EACA,cAAA;EACA,uBAAA;EACA,qBAAA;IACE,UAAA;EAAA;EAEF,WAAA;IACE,aAAA;EAAA;EAEF,gBAAA;AAAA;AAAA,KAGU,uBAAA;EACV,OAAA;AAAA;AAAA,KAGU,qBAAA;EACV,OAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,oBAAA;EACA,WAAA;EACA,iBAAA;EACA,iBAAA;EACA,yBAAA;EACA,iBAAA;IACE,eAAA;IACA,YAAA;EAAA;AAAA;AAAA,KAIQ,0BAAA;EACV,QAAA,EAAU,cAAA;EACV,iBAAA;EACA,eAAA;AAAA;AAAA,KAGU,gCAAA,IAAoC,QAAA,EAAU,cAAA;AAAA,KAE9C,6BAAA;EACV,QAAA,EAAU,cAAA;EACV,OAAA;AAAA"}
@@ -19,4 +19,5 @@ declare class NpmRuntimeLauncher {
19
19
  private resolvePackagedAppEntrypoint;
20
20
  }
21
21
  //#endregion
22
- export { NpmRuntimeLauncher };
22
+ export { NpmRuntimeLauncher };
23
+ //# sourceMappingURL=npm-runtime-launcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-launcher.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-launcher.service.ts"],"mappings":";;;KAUK,yBAAA;EACH,IAAA;EACA,GAAA,GAAM,MAAA,CAAO,UAAA;EACb,MAAA,GAAS,2BAAA;EACT,eAAA;EACA,qBAAA;AAAA;AAAA,cAGW,kBAAA;EAAA,iBAIkB,OAAA;EAAA,iBAHZ,GAAA;EAAA,iBACA,MAAA;cAEY,OAAA,EAAS,yBAAA;EAKtC,GAAA;EAAA,QAaQ,wBAAA;EAAA,QAgCA,sBAAA;EAAA,QAEA,4BAAA;AAAA"}
@@ -59,3 +59,5 @@ var NpmRuntimeLauncher = class {
59
59
  };
60
60
  //#endregion
61
61
  export { NpmRuntimeLauncher };
62
+
63
+ //# sourceMappingURL=npm-runtime-launcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-launcher.service.js","names":["getPackageVersion"],"sources":["../../src/launcher/npm-runtime-launcher.service.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { createExternalCommandEnv } from \"@nextclaw/core\";\nimport { NpmRuntimeBundleLayoutStore } from \"./npm-runtime-bundle-layout.store.js\";\nimport { NpmRuntimeBundleService, shouldPreferPackagedNpmRuntime } from \"./npm-runtime-bundle.service.js\";\nimport { inferDefaultNpmRuntimeReleaseChannel } from \"./npm-runtime-update-source.service.js\";\nimport { NpmRuntimeUpdateStateStore } from \"./npm-runtime-update-state.store.js\";\nimport { getPackageVersion } from \"@nextclaw-service/shared/utils/cli.utils.js\";\n\ntype NpmRuntimeLauncherOptions = {\n argv: string[];\n env?: NodeJS.ProcessEnv;\n layout?: NpmRuntimeBundleLayoutStore;\n launcherVersion?: string;\n packagedAppEntrypoint?: string;\n};\n\nexport class NpmRuntimeLauncher {\n private readonly env: NodeJS.ProcessEnv;\n private readonly layout: NpmRuntimeBundleLayoutStore;\n\n constructor(private readonly options: NpmRuntimeLauncherOptions) {\n this.env = options.env ?? process.env;\n this.layout = options.layout ?? new NpmRuntimeBundleLayoutStore();\n }\n\n run = (): never => {\n const runtimeScriptPath = this.resolveRuntimeScriptPath();\n const result = spawnSync(process.execPath, [runtimeScriptPath, ...this.options.argv.slice(2)], {\n stdio: \"inherit\",\n env: {\n ...createExternalCommandEnv(this.env),\n NEXTCLAW_RUNTIME_BUNDLE_CHILD: \"1\"\n },\n windowsHide: true\n });\n process.exit(typeof result.status === \"number\" ? result.status : 1);\n };\n\n private resolveRuntimeScriptPath = (): string => {\n const launcherVersion = this.resolveLauncherVersion();\n if (this.env.NEXTCLAW_DISABLE_RUNTIME_BUNDLE_LAUNCHER === \"1\" || this.env.NEXTCLAW_RUNTIME_BUNDLE_CHILD === \"1\") {\n return this.resolvePackagedAppEntrypoint();\n }\n const stateStore = new NpmRuntimeUpdateStateStore(this.layout.getStatePath(), {\n defaultChannel: inferDefaultNpmRuntimeReleaseChannel(launcherVersion)\n });\n const bundleService = new NpmRuntimeBundleService({\n layout: this.layout,\n stateStore,\n launcherVersion\n });\n try {\n const currentBundle = bundleService.resolveCurrentBundle();\n if (\n currentBundle &&\n shouldPreferPackagedNpmRuntime({\n launcherVersion,\n currentBundleVersion: currentBundle.manifest.runtimeVersion ?? currentBundle.manifest.bundleVersion\n })\n ) {\n return this.resolvePackagedAppEntrypoint();\n }\n return currentBundle?.runtimeScriptPath ?? this.resolvePackagedAppEntrypoint();\n } catch (error) {\n console.error(`Cannot start current runtime bundle: ${error instanceof Error ? error.message : String(error)}`);\n console.error(\"Falling back to the packaged npm launcher runtime.\");\n return this.resolvePackagedAppEntrypoint();\n }\n };\n\n private resolveLauncherVersion = (): string => this.options.launcherVersion ?? getPackageVersion();\n\n private resolvePackagedAppEntrypoint = (): string => {\n if (this.options.packagedAppEntrypoint) {\n return this.options.packagedAppEntrypoint;\n }\n return resolve(dirname(fileURLToPath(import.meta.url)), \"../app/index.js\");\n };\n}\n"],"mappings":";;;;;;;;;;;AAkBA,IAAa,qBAAb,MAAgC;CAC9B;CACA;CAEA,YAAY,SAAqD;AAApC,OAAA,UAAA;AAC3B,OAAK,MAAM,QAAQ,OAAO,QAAQ;AAClC,OAAK,SAAS,QAAQ,UAAU,IAAI,6BAA6B;;CAGnE,YAAmB;EACjB,MAAM,oBAAoB,KAAK,0BAA0B;EACzD,MAAM,SAAS,UAAU,QAAQ,UAAU,CAAC,mBAAmB,GAAG,KAAK,QAAQ,KAAK,MAAM,EAAE,CAAC,EAAE;GAC7F,OAAO;GACP,KAAK;IACH,GAAG,yBAAyB,KAAK,IAAI;IACrC,+BAA+B;IAChC;GACD,aAAa;GACd,CAAC;AACF,UAAQ,KAAK,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,EAAE;;CAGrE,iCAAiD;EAC/C,MAAM,kBAAkB,KAAK,wBAAwB;AACrD,MAAI,KAAK,IAAI,6CAA6C,OAAO,KAAK,IAAI,kCAAkC,IAC1G,QAAO,KAAK,8BAA8B;EAE5C,MAAM,aAAa,IAAI,2BAA2B,KAAK,OAAO,cAAc,EAAE,EAC5E,gBAAgB,qCAAqC,gBAAgB,EACtE,CAAC;EACF,MAAM,gBAAgB,IAAI,wBAAwB;GAChD,QAAQ,KAAK;GACb;GACA;GACD,CAAC;AACF,MAAI;GACF,MAAM,gBAAgB,cAAc,sBAAsB;AAC1D,OACE,iBACA,+BAA+B;IAC7B;IACA,sBAAsB,cAAc,SAAS,kBAAkB,cAAc,SAAS;IACvF,CAAC,CAEF,QAAO,KAAK,8BAA8B;AAE5C,UAAO,eAAe,qBAAqB,KAAK,8BAA8B;WACvE,OAAO;AACd,WAAQ,MAAM,wCAAwC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAAG;AAC/G,WAAQ,MAAM,qDAAqD;AACnE,UAAO,KAAK,8BAA8B;;;CAI9C,+BAA+C,KAAK,QAAQ,mBAAmBA,qBAAmB;CAElG,qCAAqD;AACnD,MAAI,KAAK,QAAQ,sBACf,QAAO,KAAK,QAAQ;AAEtB,SAAO,QAAQ,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC,EAAE,kBAAkB"}
@@ -3,10 +3,14 @@ import { UpdateSnapshot } from "@nextclaw/kernel";
3
3
 
4
4
  //#region src/launcher/npm-runtime-update-command.service.d.ts
5
5
  declare class NpmRuntimeUpdateCommandService {
6
+ private readonly env;
7
+ constructor(env?: NodeJS.ProcessEnv);
6
8
  run: (opts: UpdateCommandOptions) => Promise<UpdateSnapshot>;
7
9
  runManaged: (opts: UpdateCommandOptions) => Promise<UpdateSnapshot>;
8
10
  private printProgress;
9
11
  private printSnapshot;
12
+ private createDesktopCommandSurfaceBlockedSnapshot;
10
13
  }
11
14
  //#endregion
12
- export { NpmRuntimeUpdateCommandService };
15
+ export { NpmRuntimeUpdateCommandService };
16
+ //# sourceMappingURL=npm-runtime-update-command.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-command.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-update-command.service.ts"],"mappings":";;;;cAUa,8BAAA;EAAA,iBACkB,GAAA;cAAA,GAAA,GAAK,MAAA,CAAO,UAAA;EAEzC,GAAA,GAAa,IAAA,EAAM,oBAAA,KAAuB,OAAA,CAAQ,cAAA;EAUlD,UAAA,GAAoB,IAAA,EAAM,oBAAA,KAAuB,OAAA,CAAQ,cAAA;EAAA,QA8CjD,aAAA;EAAA,QASA,aAAA;EAAA,QAiCA,0CAAA;AAAA"}
@@ -7,6 +7,9 @@ import { NpmRuntimeUpdateStateStore } from "./npm-runtime-update-state.store.js"
7
7
  import { NextclawDistributionService } from "../shared/services/runtime/nextclaw-distribution.service.js";
8
8
  //#region src/launcher/npm-runtime-update-command.service.ts
9
9
  var NpmRuntimeUpdateCommandService = class {
10
+ constructor(env = process.env) {
11
+ this.env = env;
12
+ }
10
13
  run = async (opts) => {
11
14
  const snapshot = await this.runManaged(opts);
12
15
  if (opts.json) console.log(JSON.stringify(snapshot, null, 2));
@@ -14,6 +17,7 @@ var NpmRuntimeUpdateCommandService = class {
14
17
  return snapshot;
15
18
  };
16
19
  runManaged = async (opts) => {
20
+ if (this.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === "1") return this.createDesktopCommandSurfaceBlockedSnapshot(opts);
17
21
  const downloadOnly = Boolean(opts.downloadOnly || opts.download);
18
22
  const distribution = NextclawDistributionService.get();
19
23
  const source = new NpmRuntimeUpdateSourceService({ packagedPublicKeyPath: distribution.runtimeUpdatePublicKeyPath });
@@ -83,6 +87,34 @@ var NpmRuntimeUpdateCommandService = class {
83
87
  }
84
88
  console.log(`Update status: ${snapshot.status}`);
85
89
  };
90
+ createDesktopCommandSurfaceBlockedSnapshot = (opts) => {
91
+ const distribution = NextclawDistributionService.get();
92
+ return {
93
+ status: "blocked",
94
+ installationKind: "desktop-bundle",
95
+ channel: opts.channel === "beta" ? "beta" : "stable",
96
+ hostVersion: distribution.version,
97
+ currentVersion: distribution.version,
98
+ availableVersion: null,
99
+ downloadedVersion: null,
100
+ minimumHostVersion: null,
101
+ releaseNotesUrl: null,
102
+ lastCheckedAt: (/* @__PURE__ */ new Date()).toISOString(),
103
+ progress: null,
104
+ canAutoDownload: false,
105
+ canApplyInApp: false,
106
+ requiresRestart: false,
107
+ blockReason: "unsupported-installation",
108
+ recoveryCommand: "Use the desktop update settings or restart NextClaw Desktop to check for desktop updates.",
109
+ errorMessage: "The desktop-installed nextclaw command uses the desktop update channel instead of the npm runtime updater.",
110
+ preferences: {
111
+ automaticChecks: false,
112
+ autoDownload: false
113
+ }
114
+ };
115
+ };
86
116
  };
87
117
  //#endregion
88
118
  export { NpmRuntimeUpdateCommandService };
119
+
120
+ //# sourceMappingURL=npm-runtime-update-command.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-command.service.js","names":[],"sources":["../../src/launcher/npm-runtime-update-command.service.ts"],"sourcesContent":["import { NpmRuntimeBundleLayoutStore } from \"./npm-runtime-bundle-layout.store.js\";\nimport { NpmRuntimeBundleService } from \"./npm-runtime-bundle.service.js\";\nimport { NpmRuntimeUpdateManager } from \"./npm-runtime-update.manager.js\";\nimport { NpmRuntimeUpdateService } from \"./npm-runtime-update.service.js\";\nimport { NpmRuntimeUpdateSourceService } from \"./npm-runtime-update-source.service.js\";\nimport { NpmRuntimeUpdateStateStore } from \"./npm-runtime-update-state.store.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport type { UpdateCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport type { UpdateProgress, UpdateSnapshot } from \"@nextclaw/kernel\";\n\nexport class NpmRuntimeUpdateCommandService {\n constructor(private readonly env: NodeJS.ProcessEnv = process.env) {}\n\n run = async (opts: UpdateCommandOptions): Promise<UpdateSnapshot> => {\n const snapshot = await this.runManaged(opts);\n if (opts.json) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n this.printSnapshot(snapshot);\n }\n return snapshot;\n };\n\n runManaged = async (opts: UpdateCommandOptions): Promise<UpdateSnapshot> => {\n if (this.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === \"1\") {\n return this.createDesktopCommandSurfaceBlockedSnapshot(opts);\n }\n\n const downloadOnly = Boolean(opts.downloadOnly || opts.download);\n const distribution = NextclawDistributionService.get();\n const source = new NpmRuntimeUpdateSourceService({\n packagedPublicKeyPath: distribution.runtimeUpdatePublicKeyPath,\n });\n const launcherVersion = distribution.version;\n const channel = source.resolveChannel(opts.channel, launcherVersion);\n const manifestUrl = source.resolveManifestUrl(channel, opts.manifestUrl);\n const layout = new NpmRuntimeBundleLayoutStore();\n const stateStore = new NpmRuntimeUpdateStateStore(layout.getStatePath(), {\n defaultChannel: channel\n });\n const bundleService = new NpmRuntimeBundleService({\n layout,\n stateStore,\n launcherVersion\n });\n const updateService = new NpmRuntimeUpdateService({\n layout,\n bundleService,\n launcherVersion,\n bundlePublicKey: source.resolveBundlePublicKey() ?? undefined\n });\n const manager = new NpmRuntimeUpdateManager({\n layout,\n stateStore,\n bundleService,\n updateService,\n resolveManifestUrl: () => manifestUrl,\n launcherVersion,\n channel\n });\n\n return await manager.run({\n apply: Boolean(opts.apply),\n checkOnly: Boolean(opts.check),\n applyAfterDownload: !downloadOnly,\n onProgress: opts.json ? undefined : this.printProgress\n });\n };\n\n private printProgress = (progress: UpdateProgress): void => {\n const percent = progress.percent === null ? \"\" : ` ${progress.percent}%`;\n const total = progress.totalBytes === null ? \"\" : ` / ${progress.totalBytes} bytes`;\n process.stdout.write(`\\rDownloading${percent} (${progress.downloadedBytes} bytes${total})`);\n if (progress.percent === 100) {\n process.stdout.write(\"\\n\");\n }\n };\n\n private printSnapshot = (snapshot: UpdateSnapshot): void => {\n if (snapshot.status === \"blocked\") {\n console.error(`Update blocked: ${snapshot.errorMessage ?? snapshot.blockReason ?? \"unknown reason\"}`);\n if (snapshot.recoveryCommand) {\n console.error(`Recovery: ${snapshot.recoveryCommand}`);\n }\n return;\n }\n if (snapshot.status === \"failed\") {\n console.error(`Update failed: ${snapshot.errorMessage ?? \"unknown error\"}`);\n return;\n }\n if (snapshot.status === \"up-to-date\") {\n console.log(`NextClaw runtime is already up to date (${snapshot.currentVersion ?? snapshot.hostVersion ?? \"unknown\"}).`);\n return;\n }\n if (snapshot.status === \"downloaded\") {\n console.log(`Runtime update downloaded: ${snapshot.downloadedVersion ?? snapshot.availableVersion}`);\n console.log(\"Run `nextclaw update --apply` to switch to the downloaded runtime.\");\n return;\n }\n if (snapshot.status === \"restart-required\") {\n console.log(`Runtime update applied: ${snapshot.currentVersion}`);\n console.log(\"Restart the running NextClaw service or start a new CLI process to use it.\");\n return;\n }\n if (snapshot.status === \"update-available\") {\n console.log(`Runtime update available: ${snapshot.currentVersion ?? \"none\"} -> ${snapshot.availableVersion}`);\n return;\n }\n console.log(`Update status: ${snapshot.status}`);\n };\n\n private createDesktopCommandSurfaceBlockedSnapshot = (opts: UpdateCommandOptions): UpdateSnapshot => {\n const distribution = NextclawDistributionService.get();\n return {\n status: \"blocked\",\n installationKind: \"desktop-bundle\",\n channel: opts.channel === \"beta\" ? \"beta\" : \"stable\",\n hostVersion: distribution.version,\n currentVersion: distribution.version,\n availableVersion: null,\n downloadedVersion: null,\n minimumHostVersion: null,\n releaseNotesUrl: null,\n lastCheckedAt: new Date().toISOString(),\n progress: null,\n canAutoDownload: false,\n canApplyInApp: false,\n requiresRestart: false,\n blockReason: \"unsupported-installation\",\n recoveryCommand: \"Use the desktop update settings or restart NextClaw Desktop to check for desktop updates.\",\n errorMessage: \"The desktop-installed nextclaw command uses the desktop update channel instead of the npm runtime updater.\",\n preferences: {\n automaticChecks: false,\n autoDownload: false\n }\n };\n };\n}\n"],"mappings":"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"}
@@ -18,4 +18,5 @@ declare class NpmRuntimeUpdateSourceService {
18
18
  resolveBundlePublicKey: () => string | null;
19
19
  }
20
20
  //#endregion
21
- export { NpmRuntimeReleaseChannel, NpmRuntimeUpdateSourceService, inferDefaultNpmRuntimeReleaseChannel };
21
+ export { NpmRuntimeReleaseChannel, NpmRuntimeUpdateSourceService, inferDefaultNpmRuntimeReleaseChannel };
22
+ //# sourceMappingURL=npm-runtime-update-source.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-source.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-update-source.service.ts"],"mappings":";KAIY,wBAAA;AAAA,KAIP,oCAAA;EACH,GAAA,GAAM,MAAA,CAAO,UAAA;EACb,QAAA,GAAW,MAAA,CAAO,QAAA;EAClB,IAAA;EACA,qBAAA;AAAA;AAAA,iBAec,oCAAA,CAAqC,eAAA,mBAAkC,wBAAA;AAAA,cAc1E,6BAAA;EAAA,iBACM,GAAA;EAAA,iBACA,QAAA;EAAA,iBACA,IAAA;EAAA,iBACA,qBAAA;cAEL,OAAA,GAAS,oCAAA;EAOrB,cAAA,GAAkB,eAAA,YAA2B,eAAA,qBAAkC,wBAAA;EAO/E,kBAAA,GAAsB,OAAA,EAAS,wBAAA,EAA0B,mBAAA;EASzD,sBAAA;AAAA"}
@@ -57,3 +57,5 @@ var NpmRuntimeUpdateSourceService = class {
57
57
  };
58
58
  //#endregion
59
59
  export { NpmRuntimeUpdateSourceService, inferDefaultNpmRuntimeReleaseChannel };
60
+
61
+ //# sourceMappingURL=npm-runtime-update-source.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-source.service.js","names":[],"sources":["../../src/launcher/npm-runtime-update-source.service.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type NpmRuntimeReleaseChannel = \"stable\" | \"beta\";\n\nconst DEFAULT_NPM_RUNTIME_UPDATE_BASE_URL = \"https://Peiiii.github.io/nextclaw/npm-runtime-updates\";\n\ntype NpmRuntimeUpdateSourceServiceOptions = {\n env?: NodeJS.ProcessEnv;\n platform?: NodeJS.Platform;\n arch?: string;\n packagedPublicKeyPath?: string;\n};\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeChannel(value: unknown): NpmRuntimeReleaseChannel {\n return typeof value === \"string\" && value.trim().toLowerCase() === \"beta\" ? \"beta\" : \"stable\";\n}\n\nexport function inferDefaultNpmRuntimeReleaseChannel(launcherVersion?: string | null): NpmRuntimeReleaseChannel {\n return typeof launcherVersion === \"string\" && launcherVersion.toLowerCase().includes(\"-beta\") ? \"beta\" : \"stable\";\n}\n\nfunction resolvePackagedPublicKeyPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"..\", \"resources\", \"update-bundle-public.pem\"),\n resolve(moduleDir, \"../../..\", \"resources\", \"update-bundle-public.pem\"),\n resolve(moduleDir, \"../../../..\", \"resources\", \"update-bundle-public.pem\")\n ];\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n}\n\nexport class NpmRuntimeUpdateSourceService {\n private readonly env: NodeJS.ProcessEnv;\n private readonly platform: NodeJS.Platform;\n private readonly arch: string;\n private readonly packagedPublicKeyPath?: string;\n\n constructor(options: NpmRuntimeUpdateSourceServiceOptions = {}) {\n this.env = options.env ?? process.env;\n this.platform = options.platform ?? process.platform;\n this.arch = options.arch ?? process.arch;\n this.packagedPublicKeyPath = options.packagedPublicKeyPath;\n }\n\n resolveChannel = (explicitChannel?: unknown, launcherVersion?: string | null): NpmRuntimeReleaseChannel => {\n if (explicitChannel !== undefined || this.env.NEXTCLAW_UPDATE_CHANNEL !== undefined) {\n return normalizeChannel(explicitChannel ?? this.env.NEXTCLAW_UPDATE_CHANNEL);\n }\n return inferDefaultNpmRuntimeReleaseChannel(launcherVersion);\n };\n\n resolveManifestUrl = (channel: NpmRuntimeReleaseChannel, explicitManifestUrl?: unknown): string | null => {\n const manifestUrl = normalizeOptionalString(explicitManifestUrl) ?? normalizeOptionalString(this.env.NEXTCLAW_UPDATE_MANIFEST_URL);\n if (manifestUrl) {\n return manifestUrl;\n }\n const baseUrl = normalizeOptionalString(this.env.NEXTCLAW_UPDATE_MANIFEST_BASE_URL) ?? DEFAULT_NPM_RUNTIME_UPDATE_BASE_URL;\n return new URL(`${channel}/manifest-${channel}-${this.platform}-${this.arch}.json`, `${baseUrl.replace(/\\/+$/, \"\")}/`).toString();\n };\n\n resolveBundlePublicKey = (): string | null => {\n const explicitPublicKey = normalizeOptionalString(this.env.NEXTCLAW_UPDATE_BUNDLE_PUBLIC_KEY);\n if (explicitPublicKey) {\n return explicitPublicKey;\n }\n const publicKeyPath = normalizeOptionalString(this.env.NEXTCLAW_UPDATE_BUNDLE_PUBLIC_KEY_PATH);\n if (!publicKeyPath || !existsSync(publicKeyPath)) {\n const packagedPublicKeyPath = this.packagedPublicKeyPath ?? resolvePackagedPublicKeyPath();\n return existsSync(packagedPublicKeyPath) ? readFileSync(packagedPublicKeyPath, \"utf8\").trim() : null;\n }\n return readFileSync(publicKeyPath, \"utf8\").trim();\n };\n}\n"],"mappings":";;;;AAMA,MAAM,sCAAsC;AAS5C,SAAS,wBAAwB,OAA+B;AAC9D,KAAI,OAAO,UAAU,SACnB,QAAO;CAET,MAAM,UAAU,MAAM,MAAM;AAC5B,QAAO,UAAU,UAAU;;AAG7B,SAAS,iBAAiB,OAA0C;AAClE,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,aAAa,KAAK,SAAS,SAAS;;AAGvF,SAAgB,qCAAqC,iBAA2D;AAC9G,QAAO,OAAO,oBAAoB,YAAY,gBAAgB,aAAa,CAAC,SAAS,QAAQ,GAAG,SAAS;;AAG3G,SAAS,+BAAuC;CAC9C,MAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;CACzD,MAAM,aAAa;EACjB,QAAQ,WAAW,MAAM,aAAa,2BAA2B;EACjE,QAAQ,WAAW,YAAY,aAAa,2BAA2B;EACvE,QAAQ,WAAW,eAAe,aAAa,2BAA2B;EAC3E;AACD,QAAO,WAAW,MAAM,cAAc,WAAW,UAAU,CAAC,IAAI,WAAW;;AAG7E,IAAa,gCAAb,MAA2C;CACzC;CACA;CACA;CACA;CAEA,YAAY,UAAgD,EAAE,EAAE;AAC9D,OAAK,MAAM,QAAQ,OAAO,QAAQ;AAClC,OAAK,WAAW,QAAQ,YAAY,QAAQ;AAC5C,OAAK,OAAO,QAAQ,QAAQ,QAAQ;AACpC,OAAK,wBAAwB,QAAQ;;CAGvC,kBAAkB,iBAA2B,oBAA8D;AACzG,MAAI,oBAAoB,KAAA,KAAa,KAAK,IAAI,4BAA4B,KAAA,EACxE,QAAO,iBAAiB,mBAAmB,KAAK,IAAI,wBAAwB;AAE9E,SAAO,qCAAqC,gBAAgB;;CAG9D,sBAAsB,SAAmC,wBAAiD;EACxG,MAAM,cAAc,wBAAwB,oBAAoB,IAAI,wBAAwB,KAAK,IAAI,6BAA6B;AAClI,MAAI,YACF,QAAO;EAET,MAAM,UAAU,wBAAwB,KAAK,IAAI,kCAAkC,IAAI;AACvF,SAAO,IAAI,IAAI,GAAG,QAAQ,YAAY,QAAQ,GAAG,KAAK,SAAS,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,GAAG,CAAC,GAAG,CAAC,UAAU;;CAGnI,+BAA8C;EAC5C,MAAM,oBAAoB,wBAAwB,KAAK,IAAI,kCAAkC;AAC7F,MAAI,kBACF,QAAO;EAET,MAAM,gBAAgB,wBAAwB,KAAK,IAAI,uCAAuC;AAC9F,MAAI,CAAC,iBAAiB,CAAC,WAAW,cAAc,EAAE;GAChD,MAAM,wBAAwB,KAAK,yBAAyB,8BAA8B;AAC1F,UAAO,WAAW,sBAAsB,GAAG,aAAa,uBAAuB,OAAO,CAAC,MAAM,GAAG;;AAElG,SAAO,aAAa,eAAe,OAAO,CAAC,MAAM"}
@@ -14,4 +14,5 @@ declare class NpmRuntimeUpdateStateStore {
14
14
  update: (updater: (state: NpmRuntimeUpdateState) => NpmRuntimeUpdateState) => NpmRuntimeUpdateState;
15
15
  }
16
16
  //#endregion
17
- export { NpmRuntimeUpdateStateStore };
17
+ export { NpmRuntimeUpdateStateStore };
18
+ //# sourceMappingURL=npm-runtime-update-state.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-state.store.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-update-state.store.ts"],"mappings":";;;;KA4FK,iCAAA;EACH,cAAA,GAAiB,wBAAA;AAAA;AAAA,cAGN,0BAAA;EAAA,iBAIQ,SAAA;EAAA,iBAHF,cAAA;cAGE,SAAA,UACjB,OAAA,GAAS,iCAAA;EAKX,IAAA,QAAW,qBAAA;EAQX,KAAA,GAAS,KAAA,EAAO,qBAAA;EAKhB,MAAA,GAAU,OAAA,GAAU,KAAA,EAAO,qBAAA,KAA0B,qBAAA,KAAwB,qBAAA;AAAA"}
@@ -90,3 +90,5 @@ var NpmRuntimeUpdateStateStore = class {
90
90
  };
91
91
  //#endregion
92
92
  export { NpmRuntimeUpdateStateStore };
93
+
94
+ //# sourceMappingURL=npm-runtime-update-state.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update-state.store.js","names":[],"sources":["../../src/launcher/npm-runtime-update-state.store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { NpmRuntimeUpdateState } from \"./npm-runtime-bundle.types.js\";\nimport type { NpmRuntimeReleaseChannel } from \"./npm-runtime-update-source.service.js\";\n\nfunction createDefaultState(channel: NpmRuntimeReleaseChannel): NpmRuntimeUpdateState {\n return {\n channel,\n currentVersion: null,\n previousVersion: null,\n candidateVersion: null,\n candidateLaunchCount: 0,\n lastKnownGoodVersion: null,\n badVersions: [],\n lastUpdateCheckAt: null,\n downloadedVersion: null,\n downloadedReleaseNotesUrl: null,\n updatePreferences: {\n automaticChecks: true,\n autoDownload: true\n }\n };\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction normalizeChannel(value: unknown, fallback: NpmRuntimeReleaseChannel): NpmRuntimeReleaseChannel {\n if (typeof value !== \"string\") {\n return fallback;\n }\n const trimmed = value.trim().toLowerCase();\n if (trimmed === \"beta\") {\n return \"beta\";\n }\n if (trimmed === \"stable\") {\n return \"stable\";\n }\n return fallback;\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return [...new Set(value.filter((entry): entry is string => typeof entry === \"string\").map((entry) => entry.trim()).filter(Boolean))];\n}\n\nfunction normalizeUpdatePreferences(value: unknown): NpmRuntimeUpdateState[\"updatePreferences\"] {\n const defaultState = createDefaultState(\"stable\");\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return { ...defaultState.updatePreferences };\n }\n const record = value as Record<string, unknown>;\n return {\n automaticChecks:\n typeof record.automaticChecks === \"boolean\"\n ? record.automaticChecks\n : defaultState.updatePreferences.automaticChecks,\n autoDownload:\n typeof record.autoDownload === \"boolean\"\n ? record.autoDownload\n : defaultState.updatePreferences.autoDownload\n };\n}\n\nfunction normalizeState(input: unknown, defaultChannel: NpmRuntimeReleaseChannel): NpmRuntimeUpdateState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"npm runtime update state must be an object\");\n }\n const record = input as Record<string, unknown>;\n const candidateLaunchCount = Number(record.candidateLaunchCount);\n return {\n channel: normalizeChannel(record.channel, defaultChannel),\n currentVersion: normalizeOptionalString(record.currentVersion),\n previousVersion: normalizeOptionalString(record.previousVersion),\n candidateVersion: normalizeOptionalString(record.candidateVersion),\n candidateLaunchCount: Number.isInteger(candidateLaunchCount) && candidateLaunchCount >= 0 ? candidateLaunchCount : 0,\n lastKnownGoodVersion: normalizeOptionalString(record.lastKnownGoodVersion),\n badVersions: normalizeStringArray(record.badVersions),\n lastUpdateCheckAt: normalizeOptionalString(record.lastUpdateCheckAt),\n downloadedVersion: normalizeOptionalString(record.downloadedVersion),\n downloadedReleaseNotesUrl: normalizeOptionalString(record.downloadedReleaseNotesUrl),\n updatePreferences: normalizeUpdatePreferences(record.updatePreferences)\n };\n}\n\ntype NpmRuntimeUpdateStateStoreOptions = {\n defaultChannel?: NpmRuntimeReleaseChannel;\n};\n\nexport class NpmRuntimeUpdateStateStore {\n private readonly defaultChannel: NpmRuntimeReleaseChannel;\n\n constructor(\n private readonly statePath: string,\n options: NpmRuntimeUpdateStateStoreOptions = {}\n ) {\n this.defaultChannel = options.defaultChannel ?? \"stable\";\n }\n\n read = (): NpmRuntimeUpdateState => {\n if (!existsSync(this.statePath)) {\n const defaultState = createDefaultState(this.defaultChannel);\n return { ...defaultState, updatePreferences: { ...defaultState.updatePreferences } };\n }\n return normalizeState(JSON.parse(readFileSync(this.statePath, \"utf8\")), this.defaultChannel);\n };\n\n write = (state: NpmRuntimeUpdateState): void => {\n mkdirSync(dirname(this.statePath), { recursive: true });\n writeFileSync(this.statePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\n };\n\n update = (updater: (state: NpmRuntimeUpdateState) => NpmRuntimeUpdateState): NpmRuntimeUpdateState => {\n const nextState = updater(this.read());\n this.write(nextState);\n return nextState;\n };\n}\n"],"mappings":"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"}
@@ -39,4 +39,5 @@ declare class NpmRuntimeUpdateManager {
39
39
  private toSnapshotFromState;
40
40
  }
41
41
  //#endregion
42
- export { NpmRuntimeUpdateManager };
42
+ export { NpmRuntimeUpdateManager };
43
+ //# sourceMappingURL=npm-runtime-update.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update.manager.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-update.manager.ts"],"mappings":";;;;;;;;KAUK,8BAAA;EACH,MAAA,EAAQ,2BAAA;EACR,UAAA,EAAY,0BAAA;EACZ,aAAA,EAAe,uBAAA;EACf,aAAA,EAAe,uBAAA;EACf,kBAAA,GAAqB,OAAA,EAAS,wBAAA;EAC9B,eAAA;EACA,OAAA,EAAS,wBAAA;EACT,GAAA,SAAY,IAAA;AAAA;AAAA,KAGT,6BAAA;EACH,KAAA;EACA,kBAAA;EACA,SAAA;EACA,UAAA,IAAc,QAAA,EAAU,cAAA;AAAA;AAAA,cAGb,uBAAA;EAAA,iBAKkB,OAAA;EAAA,iBAJZ,eAAA;EAAA,iBACA,GAAA;EAAA,QACT,iBAAA;cAEqB,OAAA,EAAS,8BAAA;EAOtC,WAAA,QAAkB,cAAA;EAIlB,GAAA,GAAa,OAAA,GAAS,6BAAA,KAAqC,OAAA,CAAQ,cAAA;EAuBnE,cAAA,QAA2B,OAAA,CAAQ,cAAA;EA+BnC,cAAA,GAAwB,UAAA,IAAc,QAAA,EAAU,cAAA,cAA0B,OAAA,CAAQ,cAAA;EAoBlF,qBAAA,QAA4B,cAAA;EAAA,QAiBpB,uBAAA;EAAA,QAWA,oBAAA;EAAA,QAsDA,2BAAA;EAAA,QAeA,mBAAA;AAAA"}