@nextclaw/service 0.1.15 → 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 +2 -0
  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 +2 -0
  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 +2 -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 +2 -0
  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 +2 -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 +4 -3
  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 +2 -0
  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 -0
  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 +2 -1
  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 +2 -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 +2 -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 +2 -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 +2 -1
  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 +2 -0
  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 +2 -1
  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 +2 -0
  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 +2 -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 +2 -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
@@ -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"}
@@ -181,3 +181,5 @@ var NpmRuntimeUpdateManager = class {
181
181
  };
182
182
  //#endregion
183
183
  export { NpmRuntimeUpdateManager };
184
+
185
+ //# sourceMappingURL=npm-runtime-update.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update.manager.js","names":[],"sources":["../../src/launcher/npm-runtime-update.manager.ts"],"sourcesContent":["import type { UpdateManifest, UpdateProgress, UpdateSnapshot } from \"@nextclaw/kernel\";\nimport { getPackageVersion } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { resolveEffectiveNpmRuntimeVersion } from \"./npm-runtime-bundle.service.js\";\nimport type { NpmRuntimeBundleService } from \"./npm-runtime-bundle.service.js\";\nimport type { NpmRuntimeBundleLayoutStore } from \"./npm-runtime-bundle-layout.store.js\";\nimport type { NpmRuntimeUpdateService, NpmRuntimeAvailableUpdate } from \"./npm-runtime-update.service.js\";\nimport type { NpmRuntimeUpdateStateStore } from \"./npm-runtime-update-state.store.js\";\nimport type { NpmRuntimeReleaseChannel } from \"./npm-runtime-update-source.service.js\";\nimport type { NpmRuntimeUpdateState } from \"./npm-runtime-bundle.types.js\";\n\ntype NpmRuntimeUpdateManagerOptions = {\n layout: NpmRuntimeBundleLayoutStore;\n stateStore: NpmRuntimeUpdateStateStore;\n bundleService: NpmRuntimeBundleService;\n updateService: NpmRuntimeUpdateService;\n resolveManifestUrl: (channel: NpmRuntimeReleaseChannel) => string | null;\n launcherVersion?: string;\n channel: NpmRuntimeReleaseChannel;\n now?: () => Date;\n};\n\ntype NpmRuntimeUpdateActionOptions = {\n apply?: boolean;\n applyAfterDownload?: boolean;\n checkOnly?: boolean;\n onProgress?: (progress: UpdateProgress) => void;\n};\n\nexport class NpmRuntimeUpdateManager {\n private readonly launcherVersion: string;\n private readonly now: () => Date;\n private availableManifest: UpdateManifest | null = null;\n\n constructor(private readonly options: NpmRuntimeUpdateManagerOptions) {\n this.launcherVersion = options.launcherVersion ?? getPackageVersion();\n this.now = options.now ?? (() => new Date());\n this.options.layout.ensureLauncherDirs();\n this.syncStateFromCurrentPointer();\n }\n\n getSnapshot = (): UpdateSnapshot => this.toSnapshotFromState(this.options.stateStore.read(), {\n status: this.options.stateStore.read().downloadedVersion ? \"downloaded\" : \"idle\"\n });\n\n run = async (options: NpmRuntimeUpdateActionOptions = {}): Promise<UpdateSnapshot> => {\n if (options.apply) {\n return this.applyDownloadedUpdate();\n }\n\n const applyAfterDownload = options.applyAfterDownload ?? true;\n const checkedSnapshot = await this.checkForUpdate();\n if (options.checkOnly) {\n return checkedSnapshot;\n }\n if (applyAfterDownload && checkedSnapshot.status === \"downloaded\") {\n return this.applyDownloadedUpdate();\n }\n if (checkedSnapshot.status !== \"update-available\") {\n return checkedSnapshot;\n }\n const downloadedSnapshot = await this.downloadUpdate(options.onProgress);\n if (!applyAfterDownload || downloadedSnapshot.status !== \"downloaded\") {\n return downloadedSnapshot;\n }\n return this.applyDownloadedUpdate();\n };\n\n checkForUpdate = async (): Promise<UpdateSnapshot> => {\n const manifestUrl = this.options.resolveManifestUrl(this.options.channel);\n if (!this.options.updateService.hasSignatureVerifier()) {\n return this.toSnapshotFromState(this.options.stateStore.read(), {\n status: \"blocked\",\n installationKind: \"npm-runtime-bundle\",\n blockReason: \"signature-verification-unavailable\",\n recoveryCommand: \"Set NEXTCLAW_UPDATE_BUNDLE_PUBLIC_KEY or NEXTCLAW_UPDATE_BUNDLE_PUBLIC_KEY_PATH\",\n errorMessage: \"Runtime bundle updates require a configured update public key.\"\n });\n }\n if (!manifestUrl) {\n return this.toSnapshotFromState(this.options.stateStore.read(), {\n status: \"blocked\",\n installationKind: \"npm-runtime-bundle\",\n blockReason: \"unsupported-installation\",\n recoveryCommand: \"Set NEXTCLAW_UPDATE_MANIFEST_URL or NEXTCLAW_UPDATE_MANIFEST_BASE_URL\",\n errorMessage: \"Runtime bundle update manifest URL is not configured.\"\n });\n }\n\n const checkedAt = this.now().toISOString();\n const state = this.options.stateStore.update((current) => ({\n ...current,\n channel: this.options.channel,\n lastUpdateCheckAt: checkedAt\n }));\n const availableUpdate = await this.options.updateService.checkForUpdate(manifestUrl, state.currentVersion, state.badVersions);\n return this.toSnapshotAfterCheck(availableUpdate, this.options.stateStore.read());\n };\n\n downloadUpdate = async (onProgress?: (progress: UpdateProgress) => void): Promise<UpdateSnapshot> => {\n const manifest = this.availableManifest ?? await this.ensureAvailableManifest();\n const downloaded = await this.options.updateService.downloadAndInstallUpdate(manifest, onProgress);\n const state = this.options.stateStore.update((current) => ({\n ...current,\n downloadedVersion: downloaded.downloadedVersion,\n downloadedReleaseNotesUrl: downloaded.manifest.releaseNotesUrl\n }));\n await this.options.bundleService.pruneRetainedArtifacts();\n return this.toSnapshotFromState(state, {\n status: \"downloaded\",\n availableVersion: downloaded.downloadedVersion,\n downloadedVersion: downloaded.downloadedVersion,\n minimumHostVersion: downloaded.manifest.minimumLauncherVersion,\n releaseNotesUrl: downloaded.manifest.releaseNotesUrl,\n canApplyInApp: true,\n requiresRestart: false\n });\n };\n\n applyDownloadedUpdate = (): UpdateSnapshot => {\n const downloadedVersion = this.options.stateStore.read().downloadedVersion?.trim();\n if (!downloadedVersion) {\n throw new Error(\"No downloaded npm runtime update is ready to apply.\");\n }\n this.options.bundleService.activateVersion(downloadedVersion);\n this.availableManifest = null;\n return this.toSnapshotFromState(this.options.stateStore.read(), {\n status: \"restart-required\",\n availableVersion: null,\n downloadedVersion: null,\n releaseNotesUrl: null,\n canApplyInApp: false,\n requiresRestart: true\n });\n };\n\n private ensureAvailableManifest = async (): Promise<UpdateManifest> => {\n const snapshot = await this.checkForUpdate();\n if (!this.availableManifest) {\n if (snapshot.downloadedVersion) {\n throw new Error(`Version ${snapshot.downloadedVersion} has already been downloaded and is ready to apply.`);\n }\n throw new Error(\"No npm runtime update is currently available.\");\n }\n return this.availableManifest;\n };\n\n private toSnapshotAfterCheck = (\n availableUpdate: NpmRuntimeAvailableUpdate | null,\n state: NpmRuntimeUpdateState\n ): UpdateSnapshot => {\n if (state.downloadedVersion) {\n this.availableManifest = availableUpdate?.kind === \"runtime-bundle-update\" ? availableUpdate.manifest : this.availableManifest;\n return this.toSnapshotFromState(state, {\n status: \"downloaded\",\n availableVersion: availableUpdate?.kind === \"runtime-bundle-update\" ? availableUpdate.manifest.latestVersion : state.downloadedVersion,\n minimumHostVersion: availableUpdate?.kind === \"runtime-bundle-update\" ? availableUpdate.manifest.minimumLauncherVersion : null,\n canApplyInApp: true,\n requiresRestart: false\n });\n }\n if (!availableUpdate) {\n this.availableManifest = null;\n return this.toSnapshotFromState(state, {\n status: \"up-to-date\",\n availableVersion: null,\n downloadedVersion: null,\n releaseNotesUrl: null\n });\n }\n if (availableUpdate.kind === \"host-update-required\") {\n this.availableManifest = null;\n return this.toSnapshotFromState(state, {\n status: \"blocked\",\n availableVersion: availableUpdate.manifest.latestVersion,\n minimumHostVersion: availableUpdate.manifest.minimumLauncherVersion,\n releaseNotesUrl: availableUpdate.manifest.releaseNotesUrl,\n blockReason: \"host-too-old\",\n recoveryCommand: \"npm install -g nextclaw@latest\",\n errorMessage: `NextClaw npm launcher ${this.launcherVersion} is too old for runtime bundle ${availableUpdate.manifest.latestVersion}.`\n });\n }\n if (availableUpdate.kind === \"quarantined-bad-version\") {\n this.availableManifest = null;\n return this.toSnapshotFromState(state, {\n status: \"failed\",\n availableVersion: availableUpdate.manifest.latestVersion,\n minimumHostVersion: availableUpdate.manifest.minimumLauncherVersion,\n releaseNotesUrl: availableUpdate.manifest.releaseNotesUrl,\n errorMessage: `Version ${availableUpdate.manifest.latestVersion} was quarantined after a failed launch.`\n });\n }\n this.availableManifest = availableUpdate.manifest;\n return this.toSnapshotFromState(state, {\n status: \"update-available\",\n availableVersion: availableUpdate.manifest.latestVersion,\n minimumHostVersion: availableUpdate.manifest.minimumLauncherVersion,\n releaseNotesUrl: availableUpdate.manifest.releaseNotesUrl\n });\n };\n\n private syncStateFromCurrentPointer = (): void => {\n const currentPointer = this.options.layout.readCurrentPointer();\n const effectiveCurrentVersion = resolveEffectiveNpmRuntimeVersion({\n launcherVersion: this.launcherVersion,\n currentBundleVersion: currentPointer?.version ?? null\n });\n if (!effectiveCurrentVersion) {\n return;\n }\n this.options.stateStore.update((state) => ({\n ...state,\n currentVersion: effectiveCurrentVersion\n }));\n };\n\n private toSnapshotFromState = (\n state: NpmRuntimeUpdateState,\n patch: Partial<UpdateSnapshot> & Pick<UpdateSnapshot, \"status\">\n ): UpdateSnapshot => {\n const hasDownloadedVersion = Boolean(state.downloadedVersion);\n const { status } = patch;\n return {\n installationKind: \"npm-runtime-bundle\",\n channel: state.channel,\n hostVersion: this.launcherVersion,\n currentVersion: state.currentVersion,\n availableVersion: null,\n downloadedVersion: state.downloadedVersion,\n minimumHostVersion: null,\n releaseNotesUrl: state.downloadedReleaseNotesUrl,\n lastCheckedAt: state.lastUpdateCheckAt,\n progress: null,\n canAutoDownload: state.updatePreferences.autoDownload,\n canApplyInApp: hasDownloadedVersion,\n requiresRestart: false,\n blockReason: null,\n recoveryCommand: null,\n errorMessage: null,\n preferences: { ...state.updatePreferences },\n ...patch,\n status\n };\n };\n}\n"],"mappings":"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"}
@@ -51,4 +51,5 @@ declare class NpmRuntimeUpdateService {
51
51
  private assertBundleSignature;
52
52
  }
53
53
  //#endregion
54
- export { NpmRuntimeAvailableUpdate, NpmRuntimeUpdateService };
54
+ export { NpmRuntimeAvailableUpdate, NpmRuntimeUpdateService };
55
+ //# sourceMappingURL=npm-runtime-update.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update.service.d.ts","names":[],"sources":["../../src/launcher/npm-runtime-update.service.ts"],"mappings":";;;;;;KAkBK,SAAA,UAAmB,KAAA;AAAA,KAEnB,8BAAA;EACH,MAAA,EAAQ,2BAAA;EACR,aAAA,EAAe,uBAAA;EACf,eAAA;EACA,eAAA;EACA,SAAA,GAAY,SAAA;EACZ,QAAA,GAAW,MAAA,CAAO,QAAA;EAClB,IAAA;EACA,cAAA,GAAiB,oBAAA;EACjB,GAAA;AAAA;AAAA,KAGU,yBAAA;EACN,IAAA;EAA+B,QAAA,EAAU,cAAA;AAAA;EACzC,IAAA;EAA8B,QAAA,EAAU,cAAA;AAAA;EACxC,IAAA;EAAiC,QAAA,EAAU,cAAA;AAAA;AAAA,cAEpC,uBAAA;EAAA,iBAQkB,OAAA;EAAA,iBAPZ,QAAA;EAAA,iBACA,IAAA;EAAA,iBACA,SAAA;EAAA,iBACA,cAAA;EAAA,iBACA,eAAA;EAAA,iBACA,GAAA;cAEY,OAAA,EAAS,8BAAA;EAStC,oBAAA;EAEA,cAAA,GAAwB,WAAA,UAAqB,cAAA,iBAA+B,WAAA,gBAA6B,OAAA,CAAQ,yBAAA;EAcjH,wBAAA,GACE,QAAA,EAAU,cAAA,EACV,cAAA,GAAiB,gCAAA,KAChB,OAAA,CAAQ,0BAAA;EAAA,QAmCH,mBAAA;EAAA,QAcA,aAAA;EAAA,QAaA,cAAA;EAAA,QAiBA,WAAA;EAAA,QAiBA,iBAAA;EAAA,QA0BA,iBAAA;EAAA,QASA,sBAAA;EAAA,QAYA,cAAA;EAAA,QAYA,oBAAA;EAAA,QAgBA,uBAAA;EAAA,QAWA,qBAAA;AAAA"}
@@ -181,3 +181,5 @@ function readDirectoryNames(directory) {
181
181
  }
182
182
  //#endregion
183
183
  export { NpmRuntimeUpdateService };
184
+
185
+ //# sourceMappingURL=npm-runtime-update.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-runtime-update.service.js","names":[],"sources":["../../src/launcher/npm-runtime-update.service.ts"],"sourcesContent":["import { createHash, createPublicKey, verify, type KeyObject } from \"node:crypto\";\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport JSZip from \"jszip\";\nimport {\n serializeUnsignedUpdateManifest,\n UpdateManifestReader,\n type UpdateManifest\n} from \"@nextclaw/kernel\";\nimport type { NpmRuntimeBundleLayoutStore } from \"./npm-runtime-bundle-layout.store.js\";\nimport { compareNpmRuntimeVersions, type NpmRuntimeBundleService } from \"./npm-runtime-bundle.service.js\";\nimport type {\n NpmRuntimeDownloadedUpdate,\n NpmRuntimeUpdateProgressReporter\n} from \"./npm-runtime-bundle.types.js\";\n\ntype FetchLike = typeof fetch;\n\ntype NpmRuntimeUpdateServiceOptions = {\n layout: NpmRuntimeBundleLayoutStore;\n bundleService: NpmRuntimeBundleService;\n launcherVersion: string;\n bundlePublicKey?: string;\n fetchImpl?: FetchLike;\n platform?: NodeJS.Platform;\n arch?: string;\n manifestReader?: UpdateManifestReader;\n now?: () => number;\n};\n\nexport type NpmRuntimeAvailableUpdate =\n | { kind: \"runtime-bundle-update\"; manifest: UpdateManifest }\n | { kind: \"host-update-required\"; manifest: UpdateManifest }\n | { kind: \"quarantined-bad-version\"; manifest: UpdateManifest };\n\nexport class NpmRuntimeUpdateService {\n private readonly platform: NodeJS.Platform;\n private readonly arch: string;\n private readonly fetchImpl: FetchLike;\n private readonly manifestReader: UpdateManifestReader;\n private readonly bundlePublicKey: KeyObject | null;\n private readonly now: () => number;\n\n constructor(private readonly options: NpmRuntimeUpdateServiceOptions) {\n this.platform = options.platform ?? process.platform;\n this.arch = options.arch ?? process.arch;\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.manifestReader = options.manifestReader ?? new UpdateManifestReader();\n this.bundlePublicKey = this.parseBundlePublicKey(options.bundlePublicKey);\n this.now = options.now ?? Date.now;\n }\n\n hasSignatureVerifier = (): boolean => Boolean(this.bundlePublicKey);\n\n checkForUpdate = async (manifestUrl: string, currentVersion: string | null, badVersions: string[] = []): Promise<NpmRuntimeAvailableUpdate | null> => {\n const manifest = await this.fetchManifest(manifestUrl);\n if (currentVersion && compareNpmRuntimeVersions(manifest.latestVersion, currentVersion) <= 0) {\n return null;\n }\n if (compareNpmRuntimeVersions(this.options.launcherVersion, manifest.minimumLauncherVersion) < 0) {\n return { kind: \"host-update-required\", manifest };\n }\n if (badVersions.includes(manifest.latestVersion)) {\n return { kind: \"quarantined-bad-version\", manifest };\n }\n return { kind: \"runtime-bundle-update\", manifest };\n };\n\n downloadAndInstallUpdate = async (\n manifest: UpdateManifest,\n reportProgress?: NpmRuntimeUpdateProgressReporter\n ): Promise<NpmRuntimeDownloadedUpdate> => {\n const bytes = await this.downloadBundleBytes(manifest, reportProgress);\n const stagingRoot = join(this.options.layout.getStagingDir(), `download-${manifest.latestVersion}-${this.now()}`);\n await rm(stagingRoot, { recursive: true, force: true });\n mkdirSync(stagingRoot, { recursive: true });\n\n try {\n const zip = await JSZip.loadAsync(bytes);\n const entries = Object.values(zip.files) as JSZip.JSZipObject[];\n await Promise.all(entries.map(async (entry) => {\n const targetPath = resolve(stagingRoot, entry.name);\n const resolvedStagingRoot = resolve(stagingRoot);\n if (targetPath !== resolvedStagingRoot && !targetPath.startsWith(`${resolvedStagingRoot}${sep}`)) {\n throw new Error(`runtime bundle archive contains invalid path: ${entry.name}`);\n }\n if (entry.dir) {\n mkdirSync(targetPath, { recursive: true });\n return;\n }\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, Buffer.from(await entry.async(\"uint8array\")));\n }));\n const bundleRoot = this.findBundleRoot(stagingRoot);\n const installedBundle = await this.options.bundleService.installFromDirectory(bundleRoot);\n return {\n manifest,\n downloadedVersion: installedBundle.manifest.bundleVersion,\n bundleDirectory: installedBundle.bundleDirectory\n };\n } catch (error) {\n await rm(stagingRoot, { recursive: true, force: true });\n throw error;\n }\n };\n\n private downloadBundleBytes = async (\n manifest: UpdateManifest,\n reportProgress?: NpmRuntimeUpdateProgressReporter\n ): Promise<Buffer> => {\n const response = await this.fetchBundle(manifest.bundleUrl);\n const bytes = await this.readResponseBytes(response, reportProgress);\n const sha256 = createHash(\"sha256\").update(bytes).digest(\"hex\");\n if (sha256 !== manifest.bundleSha256) {\n throw new Error(`runtime bundle sha256 mismatch: expected ${manifest.bundleSha256} but got ${sha256}`);\n }\n this.assertBundleSignature(manifest, bytes);\n return bytes;\n };\n\n private fetchManifest = async (manifestUrl: string): Promise<UpdateManifest> => {\n if (manifestUrl.startsWith(\"file://\")) {\n const manifest = this.manifestReader.parse(JSON.parse(readFileSync(fileURLToPath(manifestUrl), \"utf8\")), manifestUrl);\n return this.verifyManifest(manifest, manifestUrl);\n }\n const response = await this.fetchImpl(manifestUrl);\n if (!response.ok) {\n throw new Error(`runtime update manifest request failed with status ${response.status}`);\n }\n const manifest = this.manifestReader.parse(await response.json(), manifestUrl);\n return this.verifyManifest(manifest, manifestUrl);\n };\n\n private verifyManifest = (manifest: UpdateManifest, _manifestUrl: string): UpdateManifest => {\n if (manifest.hostKind && manifest.hostKind !== \"npm-runtime-bundle\") {\n throw new Error(`runtime update manifest hostKind mismatch: expected npm-runtime-bundle but got ${manifest.hostKind}`);\n }\n if (manifest.channel !== \"stable\" && manifest.channel !== \"beta\") {\n throw new Error(`runtime update manifest channel is unsupported: ${manifest.channel}`);\n }\n if (manifest.platform !== this.platform) {\n throw new Error(`runtime update manifest platform mismatch: expected ${this.platform} but got ${manifest.platform}`);\n }\n if (manifest.arch !== this.arch) {\n throw new Error(`runtime update manifest arch mismatch: expected ${this.arch} but got ${manifest.arch}`);\n }\n this.assertManifestSignature(manifest);\n return manifest;\n };\n\n private fetchBundle = async (bundleUrl: string): Promise<Response> => {\n if (bundleUrl.startsWith(\"file://\")) {\n const bytes = readFileSync(fileURLToPath(bundleUrl));\n return new Response(bytes, {\n status: 200,\n headers: {\n \"content-length\": String(bytes.byteLength)\n }\n });\n }\n const response = await this.fetchImpl(bundleUrl);\n if (!response.ok) {\n throw new Error(`runtime bundle download failed with status ${response.status}`);\n }\n return response;\n };\n\n private readResponseBytes = async (\n response: Response,\n reportProgress?: NpmRuntimeUpdateProgressReporter\n ): Promise<Buffer> => {\n const totalBytes = this.readContentLength(response);\n if (!response.body) {\n const bytes = Buffer.from(await response.arrayBuffer());\n this.reportDownloadProgress(reportProgress, bytes.byteLength, totalBytes ?? bytes.byteLength);\n return bytes;\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let downloadedBytes = 0;\n this.reportDownloadProgress(reportProgress, downloadedBytes, totalBytes);\n while (true) {\n const next = await reader.read();\n if (next.done) {\n break;\n }\n chunks.push(next.value);\n downloadedBytes += next.value.byteLength;\n this.reportDownloadProgress(reportProgress, downloadedBytes, totalBytes);\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n };\n\n private readContentLength = (response: Response): number | null => {\n const raw = response.headers.get(\"content-length\");\n if (!raw) {\n return null;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n };\n\n private reportDownloadProgress = (\n reportProgress: NpmRuntimeUpdateProgressReporter | undefined,\n downloadedBytes: number,\n totalBytes: number | null\n ): void => {\n reportProgress?.({\n downloadedBytes,\n totalBytes,\n percent: totalBytes && totalBytes > 0 ? Math.min(100, Math.round((downloadedBytes / totalBytes) * 100)) : null\n });\n };\n\n private findBundleRoot = (stagingRoot: string): string => {\n const directManifestPath = join(stagingRoot, \"manifest.json\");\n if (existsSync(directManifestPath)) {\n return stagingRoot;\n }\n const entries = readDirectoryNames(stagingRoot).filter((entry) => existsSync(join(stagingRoot, entry, \"manifest.json\")));\n if (entries.length === 1) {\n return join(stagingRoot, entries[0]);\n }\n throw new Error(`runtime bundle archive does not contain exactly one manifest root under ${stagingRoot}`);\n };\n\n private parseBundlePublicKey = (publicKey: string | undefined): KeyObject | null => {\n const normalizedKey = publicKey?.trim();\n if (!normalizedKey) {\n return null;\n }\n const pemOrEscapedPem = normalizedKey.replaceAll(\"\\\\n\", \"\\n\");\n if (pemOrEscapedPem.includes(\"BEGIN PUBLIC KEY\")) {\n return createPublicKey(pemOrEscapedPem);\n }\n return createPublicKey({\n key: Buffer.from(normalizedKey, \"base64\"),\n format: \"der\",\n type: \"spki\"\n });\n };\n\n private assertManifestSignature = (manifest: UpdateManifest): void => {\n if (!this.bundlePublicKey) {\n throw new Error(\"runtime update manifest signature verification requires bundlePublicKey\");\n }\n const signature = Buffer.from(manifest.manifestSignature, \"base64\");\n const valid = verify(null, Buffer.from(serializeUnsignedUpdateManifest(manifest)), this.bundlePublicKey, signature);\n if (!valid) {\n throw new Error(`runtime update manifest signature verification failed for ${manifest.latestVersion}`);\n }\n };\n\n private assertBundleSignature = (manifest: UpdateManifest, bytes: Buffer): void => {\n if (!this.bundlePublicKey) {\n throw new Error(\"runtime bundle signature verification requires bundlePublicKey\");\n }\n const signature = Buffer.from(manifest.bundleSignature, \"base64\");\n const valid = verify(null, bytes, this.bundlePublicKey, signature);\n if (!valid) {\n throw new Error(`runtime bundle signature verification failed for ${manifest.latestVersion}`);\n }\n };\n}\n\nfunction readDirectoryNames(directory: string): string[] {\n return readdirSync(directory, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n}\n"],"mappings":"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"}
@@ -86,4 +86,5 @@ declare class NextclawServiceRuntime {
86
86
  }
87
87
  declare const runNextclawNpmRuntimeLauncher: (argv?: string[]) => void;
88
88
  //#endregion
89
- export { NextclawServiceCommands, NextclawServiceRuntime, NextclawServiceRuntimeAccount, NextclawServiceRuntimeOptions, runNextclawNpmRuntimeLauncher };
89
+ export { NextclawServiceCommands, NextclawServiceRuntime, NextclawServiceRuntimeAccount, NextclawServiceRuntimeOptions, runNextclawNpmRuntimeLauncher };
90
+ //# sourceMappingURL=service-runtime.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-runtime.service.d.ts","names":[],"sources":["../src/service-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;KA8CY,6BAAA;EACV,IAAA;AAAA;AAAA,KAGU,6BAAA;EACV,MAAA,GAAS,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MAAqB,OAAA;EACzD,WAAA,GACE,QAAA,UACA,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MACxB,OAAA;AAAA;AAAA,KAGK,uBAAA;EACV,MAAA,EAAQ,oBAAA;EACR,MAAA,EAAQ,cAAA;EACR,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,cAAA;EACR,GAAA,EAAK,WAAA;EACL,OAAA,EAAS,eAAA;EACT,OAAA,EAAS,cAAA;EACT,MAAA,EAAQ,aAAA;EACR,QAAA,EAAU,eAAA;EACV,IAAA,EAAM,YAAA;EACN,WAAA,EAAa,mBAAA;EACb,IAAA,EAAM,YAAA;EACN,OAAA,EAAS,eAAA;EACT,EAAA,EAAI,UAAA;EACJ,KAAA,EAAO,aAAA;EACP,OAAA,EAAS,eAAA;EACT,KAAA,EAAO,aAAA;EACP,IAAA,EAAM,YAAA;EACN,KAAA,EAAO,sBAAA;AAAA;AAAA,cAGI,sBAAA;EAAA,QACH,IAAA;EAAA,QACA,kBAAA;EAAA,QACA,kBAAA;EAAA,QACA,iBAAA;EAAA,QACA,qBAAA;EAAA,QACA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,oBAAA;EAAA,QACA,cAAA;EACR,OAAA,EAAS,6BAAA;EACT,QAAA,EAAU,uBAAA;cACE,OAAA,EAAS,6BAAA;EAAA,QAyCb,cAAA;EAAA,IA+DJ,OAAA,CAAA;EAAA,QAII,mBAAA;EAAA,QAOA,wBAAA;EAAA,QAuCA,yBAAA;EAAA,QA0GA,cAAA;EAAA,QAIA,mCAAA;EA0BR,OAAA,QAAoB,OAAA;EAOpB,IAAA,GAAc,OAAA;IAAW,MAAA;IAAiB,IAAA;IAAgB,KAAA;EAAA,MAAyB,OAAA;EA8CnF,KAAA,GAAe,IAAA,GAAM,mBAAA,KAA2B,OAAA;EAKhD,KAAA,GAAe,IAAA,EAAM,mBAAA,KAAsB,OAAA;EAoD3C,MAAA,GAAgB,IAAA,EAAM,oBAAA,KAAuB,OAAA;AAAA;AAAA,cAkBlC,6BAAA,GACX,IAAA"}
@@ -362,7 +362,10 @@ var NextclawServiceRuntime = class {
362
362
  };
363
363
  update = async (opts) => {
364
364
  const versionBefore = this.version;
365
- if (!opts.json) console.log(`Current npm launcher version: ${versionBefore}`);
365
+ if (!opts.json) {
366
+ const installationLabel = process.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === "1" ? "desktop runtime" : "npm launcher";
367
+ console.log(`Current ${installationLabel} version: ${versionBefore}`);
368
+ }
366
369
  const snapshot = await new NpmRuntimeUpdateCommandService().run(opts);
367
370
  if (snapshot.status === "blocked" || snapshot.status === "failed") process.exit(1);
368
371
  const state = managedServiceStateStore.read();
@@ -379,3 +382,5 @@ const runNextclawNpmRuntimeLauncher = (argv = process.argv) => {
379
382
  };
380
383
  //#endregion
381
384
  export { NextclawServiceRuntime, runNextclawNpmRuntimeLauncher };
385
+
386
+ //# sourceMappingURL=service-runtime.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-runtime.service.js","names":["toPluginConfigView"],"sources":["../src/service-runtime.service.ts"],"sourcesContent":["import { loadConfig, saveConfig, getConfigPath, getDataDir, resolveWorkspacePath, resolveConfigSecrets, APP_NAME } from \"@nextclaw/core\";\nimport { NextclawKernel } from \"@nextclaw/kernel\";\nimport { RemoteRuntimeActions } from \"@nextclaw/remote\";\nimport {\n setPluginRuntimeBridge,\n} from \"@nextclaw/openclaw-compat\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { RestartCoordinator } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport type { RestartStrategy } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport { initializeConfigIfMissing } from \"@nextclaw-service/shared/services/runtime/runtime-config-init.service.js\";\nimport { writeRestartSentinel } from \"@nextclaw-service/shared/services/restart/restart-sentinel.service.js\";\nimport { createTopLevelNextclawCommandEnv } from \"@nextclaw-service/shared/utils/top-level-nextclaw-command-env.utils.js\";\nimport { resolveCliSubcommandLaunch } from \"@nextclaw-service/shared/utils/marketplace/cli-subcommand-launch.utils.js\";\nimport { logStartupTrace, measureStartupSync } from \"@nextclaw-service/shared/utils/startup-trace.js\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { NpmRuntimeUpdateCommandService } from \"@nextclaw-service/launcher/npm-runtime-update-command.service.js\";\nimport { NpmRuntimeLauncher } from \"@nextclaw-service/launcher/npm-runtime-launcher.service.js\";\nimport { managedServiceStateStore } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport { mergePluginConfigView, toPluginConfigView, PluginCommands } from \"@nextclaw-service/commands/plugin/index.js\";\nimport { ConfigCommands } from \"@nextclaw-service/cli/commands/config/index.js\";\nimport { McpCommands } from \"@nextclaw-service/cli/commands/mcp/index.js\";\nimport { SecretsCommands } from \"@nextclaw-service/cli/commands/secrets/index.js\";\nimport { ChannelCommands } from \"@nextclaw-service/commands/channel/index.js\";\nimport { CronCommands } from \"@nextclaw-service/cli/commands/cron/index.js\";\nimport { AgentCommands, runCliAgentCommand } from \"@nextclaw-service/cli/commands/agent/index.js\";\nimport { PlatformAuthCommands } from \"@nextclaw-service/commands/platform-auth/index.js\";\nimport { RemoteCommands, hasRunningNextclawManagedService } from \"@nextclaw-service/commands/remote/index.js\";\nimport { DiagnosticsCommands } from \"@nextclaw-service/cli/commands/diagnostics/index.js\";\nimport { LogsCommands } from \"@nextclaw-service/cli/commands/logs/index.js\";\nimport { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport { ServiceCommands } from \"@nextclaw-service/commands/service/index.js\";\nimport { WorkspaceManager } from \"@nextclaw-service/shared/services/workspace/workspace-manager.service.js\";\nimport { RuntimeRestartRequestService } from \"@nextclaw-service/shared/services/restart/runtime-restart-request.service.js\";\nimport { SkillsCommands } from \"@nextclaw-service/cli/commands/skills/index.js\";\nimport { GatewayCommands } from \"@nextclaw-service/cli/commands/gateway/index.js\";\nimport { UiCommands } from \"@nextclaw-service/cli/commands/ui/index.js\";\nimport { StartCommands } from \"@nextclaw-service/cli/commands/start/index.js\";\nimport { RestartCommands } from \"@nextclaw-service/cli/commands/restart/index.js\";\nimport { ServeCommands } from \"@nextclaw-service/cli/commands/serve/index.js\";\nimport { StopCommands } from \"@nextclaw-service/cli/commands/stop/index.js\";\nimport { LlmUsageCommandService } from \"@nextclaw-service/cli/commands/usage/index.js\";\nimport type { AgentCommandOptions, LoginCommandOptions, RequestRestartParams, UpdateCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nconst FORCED_PUBLIC_UI_HOST = \"0.0.0.0\";\n\nexport type NextclawServiceRuntimeOptions = {\n logo?: string;\n};\n\nexport type NextclawServiceRuntimeAccount = {\n status: (opts?: { apiBase?: string; json?: boolean }) => Promise<void>;\n setUsername: (\n username: string,\n opts?: { apiBase?: string; json?: boolean },\n ) => Promise<void>;\n};\n\nexport type NextclawServiceCommands = {\n remote: RemoteRuntimeActions;\n skills: SkillsCommands;\n service: ServiceCommands;\n config: ConfigCommands;\n mcp: McpCommands;\n secrets: SecretsCommands;\n plugins: PluginCommands;\n agents: AgentCommands;\n channels: ChannelCommands;\n cron: CronCommands;\n diagnostics: DiagnosticsCommands;\n logs: LogsCommands;\n gateway: GatewayCommands;\n ui: UiCommands;\n start: StartCommands;\n restart: RestartCommands;\n serve: ServeCommands;\n stop: StopCommands;\n usage: LlmUsageCommandService;\n};\n\nexport class NextclawServiceRuntime {\n private logo: string;\n private restartCoordinator: RestartCoordinator;\n private serviceRestartTask: Promise<boolean> | null = null;\n private selfRelaunchArmed = false;\n private restartRequestService: RuntimeRestartRequestService;\n private workspaceManager: WorkspaceManager;\n private runtimeCommandService: RuntimeCommandService;\n private platformAuthCommands!: PlatformAuthCommands;\n private remoteCommands!: RemoteCommands;\n account: NextclawServiceRuntimeAccount;\n commands: NextclawServiceCommands;\n constructor(options: NextclawServiceRuntimeOptions) {\n logStartupTrace(\"cli.runtime.constructor.begin\");\n this.logo = options.logo ?? \"🤖\";\n this.workspaceManager = measureStartupSync(\"cli.runtime.workspace_manager\", () => new WorkspaceManager(this.logo));\n this.runtimeCommandService = measureStartupSync(\"cli.runtime.runtime_command_service\", () => new RuntimeCommandService({\n requestRestart: (params) => this.requestRestart(params),\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n }));\n this.commands = this.createCommands();\n\n this.restartCoordinator = measureStartupSync(\"cli.runtime.restart_coordinator\", () => new RestartCoordinator({\n readServiceState: managedServiceStateStore.read,\n isProcessRunning,\n currentPid: () => process.pid,\n restartBackgroundService: async (reason) =>\n this.restartBackgroundService(reason),\n scheduleProcessExit: (delayMs, reason) =>\n this.scheduleProcessExit(delayMs, reason),\n }));\n this.restartRequestService = new RuntimeRestartRequestService({\n armManagedServiceRelaunch: (params) => this.armManagedServiceRelaunch(params),\n requestRestartFromCoordinator: async (params) =>\n await this.restartCoordinator.requestRestart(params)\n });\n this.account = {\n status: async (opts = {}) => {\n await this.init({ source: \"account status\", auto: true });\n await this.platformAuthCommands.accountStatus(opts);\n },\n setUsername: async (username, opts = {}) => {\n await this.init({ source: \"account set-username\", auto: true });\n await this.platformAuthCommands.accountSetUsername({\n apiBase: opts.apiBase,\n json: opts.json,\n username\n });\n },\n };\n logStartupTrace(\"cli.runtime.constructor.end\");\n }\n\n private createCommands = (): NextclawServiceCommands => {\n const start = measureStartupSync(\"cli.runtime.start_commands\", () => new StartCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n init: (params) => this.init(params)\n }));\n this.platformAuthCommands = measureStartupSync(\"cli.runtime.platform_auth_commands\", () => new PlatformAuthCommands());\n this.remoteCommands = measureStartupSync(\"cli.runtime.remote_commands\", () => new RemoteCommands());\n return {\n remote: measureStartupSync(\"cli.runtime.remote_runtime_actions\", () => new RemoteRuntimeActions({\n appName: APP_NAME,\n initAuto: (source) => this.init({ source, auto: true }),\n remoteCommands: this.remoteCommands,\n restartBackgroundService: (reason) => this.restartBackgroundService(reason),\n hasRunningManagedService: hasRunningNextclawManagedService\n })),\n skills: measureStartupSync(\"cli.runtime.skills_commands\", () => new SkillsCommands()),\n service: measureStartupSync(\"cli.runtime.service_commands\", () => new ServiceCommands()),\n config: measureStartupSync(\"cli.runtime.config_commands\", () => new ConfigCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n mcp: measureStartupSync(\"cli.runtime.mcp_commands\", () => new McpCommands()),\n secrets: measureStartupSync(\"cli.runtime.secrets_commands\", () => new SecretsCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n plugins: measureStartupSync(\"cli.runtime.plugin_commands\", () => new PluginCommands()),\n agents: measureStartupSync(\"cli.runtime.agent_commands\", () => new AgentCommands({\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n })),\n channels: measureStartupSync(\"cli.runtime.channel_commands\", () => new ChannelCommands({\n logo: this.logo,\n getBridgeDir: () => this.workspaceManager.getBridgeDir(),\n requestRestart: (params) => this.requestRestart(params),\n })),\n cron: measureStartupSync(\"cli.runtime.cron_commands\", () => new CronCommands()),\n diagnostics: measureStartupSync(\"cli.runtime.diagnostics_commands\", () => new DiagnosticsCommands({ logo: this.logo })),\n logs: measureStartupSync(\"cli.runtime.logs_commands\", () => new LogsCommands()),\n gateway: measureStartupSync(\"cli.runtime.gateway_commands\", () => new GatewayCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n ui: measureStartupSync(\"cli.runtime.ui_commands\", () => new UiCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n start,\n restart: measureStartupSync(\"cli.runtime.restart_commands\", () => new RestartCommands({\n runtimeCommandService: this.runtimeCommandService,\n startCommands: start,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n writeRestartSentinelFromExecContext: (reason) => this.writeRestartSentinelFromExecContext(reason)\n })),\n serve: measureStartupSync(\"cli.runtime.serve_commands\", () => new ServeCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n stop: measureStartupSync(\"cli.runtime.stop_commands\", () => new StopCommands({\n runtimeCommandService: this.runtimeCommandService\n })),\n usage: measureStartupSync(\"cli.runtime.usage_commands\", () => new LlmUsageCommandService()),\n };\n };\n\n get version(): string {\n return NextclawDistributionService.get().version;\n }\n\n private scheduleProcessExit = (delayMs: number, reason: string): void => {\n console.warn(`Gateway restart requested (${reason}).`);\n setTimeout(() => {\n process.exit(0);\n }, delayMs);\n };\n\n private restartBackgroundService = async (reason: string): Promise<boolean> => {\n if (this.serviceRestartTask) {\n return this.serviceRestartTask;\n }\n\n this.serviceRestartTask = (async () => {\n const state = managedServiceStateStore.read();\n if (!state || !isProcessRunning(state.pid) || state.pid === process.pid) {\n return false;\n }\n\n const uiHost = FORCED_PUBLIC_UI_HOST;\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n\n console.log(\n `Applying changes (${reason}): restarting ${APP_NAME} background service...`,\n );\n await this.runtimeCommandService.stopService();\n await this.runtimeCommandService.startService({\n uiOverrides: {\n enabled: true,\n host: uiHost,\n port: uiPort,\n },\n open: false,\n });\n return true;\n })();\n\n try {\n return await this.serviceRestartTask;\n } finally {\n this.serviceRestartTask = null;\n }\n };\n\n private armManagedServiceRelaunch = (params: {\n reason: string;\n strategy?: RestartStrategy;\n delayMs?: number;\n }): void => {\n const { delayMs: requestedDelayMs, reason, strategy: requestedStrategy } = params;\n const strategy = requestedStrategy ?? \"background-service-or-manual\";\n if (\n strategy !== \"background-service-or-exit\" &&\n strategy !== \"exit-process\"\n ) {\n return;\n }\n if (this.selfRelaunchArmed) {\n return;\n }\n\n const state = managedServiceStateStore.read();\n if (!state || state.pid !== process.pid) {\n return;\n }\n\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n const delayMs =\n typeof requestedDelayMs === \"number\" && Number.isFinite(requestedDelayMs)\n ? Math.max(0, Math.floor(requestedDelayMs))\n : 100;\n const launch = resolveCliSubcommandLaunch({\n argvEntry: process.argv[1],\n importMetaUrl: import.meta.url,\n cliArgs: [\"start\", \"--ui-port\", String(uiPort)],\n nodePath: process.execPath\n });\n const serviceStatePath = managedServiceStateStore.path;\n const helperScript = [\n 'const { spawnSync } = require(\"node:child_process\");',\n 'const { readFileSync } = require(\"node:fs\");',\n `const parentPid = ${process.pid};`,\n `const delayMs = ${delayMs};`,\n \"const maxWaitMs = 120000;\",\n \"const retryIntervalMs = 1000;\",\n `const command = ${JSON.stringify(launch.command)};`,\n `const args = ${JSON.stringify(launch.args)};`,\n `const serviceStatePath = ${JSON.stringify(serviceStatePath)};`,\n \"function isRunning(pid) {\",\n \" try {\",\n \" process.kill(pid, 0);\",\n \" return true;\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function hasReplacementService() {\",\n \" try {\",\n ' const raw = readFileSync(serviceStatePath, \"utf-8\");',\n \" const state = JSON.parse(raw);\",\n \" const pid = Number(state?.pid);\",\n \" return Number.isFinite(pid) && pid > 0 && pid !== parentPid && isRunning(pid);\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function tryStart() {\",\n \" spawnSync(command, args, {\",\n ' stdio: \"ignore\",',\n \" env: process.env,\",\n \" timeout: 60000,\",\n \" windowsHide: true\",\n \" });\",\n \"}\",\n \"setTimeout(() => {\",\n \" const startedAt = Date.now();\",\n \" const tick = () => {\",\n \" if (hasReplacementService() || Date.now() - startedAt >= maxWaitMs) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" tryStart();\",\n \" if (hasReplacementService()) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" setTimeout(tick, retryIntervalMs);\",\n \" };\",\n \" tick();\",\n \"}, delayMs);\",\n ].join(\"\\n\");\n\n try {\n const helper = spawn(process.execPath, [\"-e\", helperScript], {\n detached: true,\n stdio: \"ignore\",\n env: createTopLevelNextclawCommandEnv(process.env),\n windowsHide: true\n });\n helper.unref();\n this.selfRelaunchArmed = true;\n console.warn(`Gateway self-restart armed (${reason}).`);\n } catch (error) {\n console.error(`Failed to arm gateway self-restart: ${String(error)}`);\n }\n };\n\n private requestRestart = async (params: RequestRestartParams): Promise<void> => {\n await this.restartRequestService.run(params);\n };\n\n private writeRestartSentinelFromExecContext = async (reason: string): Promise<void> => {\n const sessionKeyRaw = process.env.NEXTCLAW_RUNTIME_SESSION_KEY;\n const sessionKey =\n typeof sessionKeyRaw === \"string\" ? sessionKeyRaw.trim() : \"\";\n if (!sessionKey) {\n return;\n }\n\n try {\n await writeRestartSentinel({\n kind: \"restart\",\n status: \"ok\",\n ts: Date.now(),\n sessionKey,\n stats: {\n reason: reason || \"cli.restart\",\n strategy: \"exec-tool\",\n },\n });\n } catch (error) {\n console.warn(\n `Warning: failed to write restart sentinel from exec context: ${String(error)}`,\n );\n }\n };\n\n onboard = async (): Promise<void> => {\n console.warn(\n `Warning: ${APP_NAME} onboard is deprecated. Use \"${APP_NAME} init\" instead.`,\n );\n await this.init({ source: \"onboard\" });\n };\n\n init = async (options: { source?: string; auto?: boolean; force?: boolean } = {}): Promise<void> => {\n const source = options.source ?? \"init\";\n const prefix = options.auto ? \"Auto init\" : \"Init\";\n const force = Boolean(options.force);\n\n const configPath = getConfigPath();\n const createdConfig = initializeConfigIfMissing(configPath);\n\n const config = loadConfig();\n const workspacePath = resolveWorkspacePath(config.agents.defaults.workspace);\n const workspaceExisted = existsSync(workspacePath);\n mkdirSync(workspacePath, { recursive: true });\n const templateResult = this.workspaceManager.createWorkspaceTemplates(\n workspacePath,\n { force },\n );\n\n if (createdConfig) {\n console.log(`✓ ${prefix}: created config at ${configPath}`);\n }\n if (!workspaceExisted) {\n console.log(`✓ ${prefix}: created workspace at ${workspacePath}`);\n }\n for (const file of templateResult.created) {\n console.log(`✓ ${prefix}: created ${file}`);\n }\n if (\n !createdConfig &&\n workspaceExisted &&\n templateResult.created.length === 0\n ) {\n console.log(`${prefix}: already initialized.`);\n }\n\n if (!options.auto) {\n console.log(`\\n${this.logo} ${APP_NAME} is ready! (${source})`);\n console.log(\"\\nNext steps:\");\n console.log(` 1. Add your API key to ${configPath}`);\n console.log(` 2. Chat: ${APP_NAME} agent -m \"Hello!\"`);\n } else {\n console.log(\n `Tip: Run \"${APP_NAME} init${force ? \" --force\" : \"\"}\" to re-run initialization if needed.`,\n );\n }\n };\n\n login = async (opts: LoginCommandOptions = {}): Promise<void> => {\n await this.init({ source: \"login\", auto: true });\n await this.platformAuthCommands.login(opts);\n };\n\n agent = async (opts: AgentCommandOptions): Promise<void> => {\n const configPath = getConfigPath();\n const kernel = new NextclawKernel({\n homeDir: getDataDir(),\n configPath,\n });\n const config = kernel.configManager.config;\n\n setPluginRuntimeBridge({\n loadConfig: () =>\n toPluginConfigView(\n resolveConfigSecrets(loadConfig(), { configPath }),\n kernel.extensions.getChannelBindings(),\n ),\n writeConfigFile: async (nextConfigView) => {\n if (\n !nextConfigView ||\n typeof nextConfigView !== \"object\" ||\n Array.isArray(nextConfigView)\n ) {\n throw new Error(\n \"plugin runtime writeConfigFile expects an object config\",\n );\n }\n const current = loadConfig();\n const next = mergePluginConfigView(\n current,\n nextConfigView,\n kernel.extensions.getChannelBindings(),\n );\n saveConfig(next);\n },\n });\n\n try {\n const providerManager = kernel.llmUsage.observeProviderManager(\n kernel.llmProviders,\n \"cli-agent\",\n );\n\n await runCliAgentCommand({\n logo: this.logo,\n opts,\n config,\n kernel,\n providerManager,\n });\n } finally {\n setPluginRuntimeBridge(null);\n }\n };\n\n update = async (opts: UpdateCommandOptions): Promise<void> => {\n const versionBefore = this.version;\n if (!opts.json) {\n const installationLabel = process.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === \"1\" ? \"desktop runtime\" : \"npm launcher\";\n console.log(`Current ${installationLabel} version: ${versionBefore}`);\n }\n const snapshot = await new NpmRuntimeUpdateCommandService().run(opts);\n if (snapshot.status === \"blocked\" || snapshot.status === \"failed\") {\n process.exit(1);\n }\n\n const state = managedServiceStateStore.read();\n if (snapshot.requiresRestart && state && isProcessRunning(state.pid)) {\n console.log(`Tip: restart ${APP_NAME} to apply the update.`);\n }\n };\n}\n\nexport const runNextclawNpmRuntimeLauncher = (\n argv: string[] = process.argv,\n): void => {\n const distribution = NextclawDistributionService.get();\n new NpmRuntimeLauncher({\n argv,\n launcherVersion: distribution.version,\n packagedAppEntrypoint: distribution.appEntrypoint,\n }).run();\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,wBAAwB;AAoC9B,IAAa,yBAAb,MAAoC;CAClC;CACA;CACA,qBAAsD;CACtD,oBAA4B;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA,YAAY,SAAwC;AAClD,kBAAgB,gCAAgC;AAChD,OAAK,OAAO,QAAQ,QAAQ;AAC5B,OAAK,mBAAmB,mBAAmB,uCAAuC,IAAI,iBAAiB,KAAK,KAAK,CAAC;AAClH,OAAK,wBAAwB,mBAAmB,6CAA6C,IAAI,sBAAsB;GACrH,iBAAiB,WAAW,KAAK,eAAe,OAAO;GACvD,+BAA+B,kBAAkB,KAAK,iBAAiB,yBAAyB,cAAc;GAC/G,CAAC,CAAC;AACH,OAAK,WAAW,KAAK,gBAAgB;AAErC,OAAK,qBAAqB,mBAAmB,yCAAyC,IAAI,mBAAmB;GAC3G,kBAAkB,yBAAyB;GAC3C;GACA,kBAAkB,QAAQ;GAC1B,0BAA0B,OAAO,WAC/B,KAAK,yBAAyB,OAAO;GACvC,sBAAsB,SAAS,WAC7B,KAAK,oBAAoB,SAAS,OAAO;GAC5C,CAAC,CAAC;AACH,OAAK,wBAAwB,IAAI,6BAA6B;GAC5D,4BAA4B,WAAW,KAAK,0BAA0B,OAAO;GAC7E,+BAA+B,OAAO,WACpC,MAAM,KAAK,mBAAmB,eAAe,OAAO;GACvD,CAAC;AACF,OAAK,UAAU;GACb,QAAQ,OAAO,OAAO,EAAE,KAAK;AAC3B,UAAM,KAAK,KAAK;KAAE,QAAQ;KAAkB,MAAM;KAAM,CAAC;AACzD,UAAM,KAAK,qBAAqB,cAAc,KAAK;;GAErD,aAAa,OAAO,UAAU,OAAO,EAAE,KAAK;AAC1C,UAAM,KAAK,KAAK;KAAE,QAAQ;KAAwB,MAAM;KAAM,CAAC;AAC/D,UAAM,KAAK,qBAAqB,mBAAmB;KACjD,SAAS,KAAK;KACd,MAAM,KAAK;KACX;KACD,CAAC;;GAEL;AACD,kBAAgB,8BAA8B;;CAGhD,uBAAwD;EACtD,MAAM,QAAQ,mBAAmB,oCAAoC,IAAI,cAAc;GACrF,uBAAuB,KAAK;GAC5B,kBAAkB;GAClB,OAAO,WAAW,KAAK,KAAK,OAAO;GACpC,CAAC,CAAC;AACH,OAAK,uBAAuB,mBAAmB,4CAA4C,IAAI,sBAAsB,CAAC;AACtH,OAAK,iBAAiB,mBAAmB,qCAAqC,IAAI,gBAAgB,CAAC;AACnG,SAAO;GACL,QAAQ,mBAAmB,4CAA4C,IAAI,qBAAqB;IAC9F,SAAS;IACT,WAAW,WAAW,KAAK,KAAK;KAAE;KAAQ,MAAM;KAAM,CAAC;IACvD,gBAAgB,KAAK;IACrB,2BAA2B,WAAW,KAAK,yBAAyB,OAAO;IAC3E,0BAA0B;IAC3B,CAAC,CAAC;GACH,QAAQ,mBAAmB,qCAAqC,IAAI,gBAAgB,CAAC;GACrF,SAAS,mBAAmB,sCAAsC,IAAI,iBAAiB,CAAC;GACxF,QAAQ,mBAAmB,qCAAqC,IAAI,eAAe,EACjF,iBAAiB,WAAW,KAAK,eAAe,OAAO,EACxD,CAAC,CAAC;GACH,KAAK,mBAAmB,kCAAkC,IAAI,aAAa,CAAC;GAC5E,SAAS,mBAAmB,sCAAsC,IAAI,gBAAgB,EACpF,iBAAiB,WAAW,KAAK,eAAe,OAAO,EACxD,CAAC,CAAC;GACH,SAAS,mBAAmB,qCAAqC,IAAI,gBAAgB,CAAC;GACtF,QAAQ,mBAAmB,oCAAoC,IAAI,cAAc,EAC/E,+BAA+B,kBAAkB,KAAK,iBAAiB,yBAAyB,cAAc,EAC/G,CAAC,CAAC;GACH,UAAU,mBAAmB,sCAAsC,IAAI,gBAAgB;IACrF,MAAM,KAAK;IACX,oBAAoB,KAAK,iBAAiB,cAAc;IACxD,iBAAiB,WAAW,KAAK,eAAe,OAAO;IACxD,CAAC,CAAC;GACH,MAAM,mBAAmB,mCAAmC,IAAI,cAAc,CAAC;GAC/E,aAAa,mBAAmB,0CAA0C,IAAI,oBAAoB,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;GACvH,MAAM,mBAAmB,mCAAmC,IAAI,cAAc,CAAC;GAC/E,SAAS,mBAAmB,sCAAsC,IAAI,gBAAgB;IACpF,uBAAuB,KAAK;IAC5B,kBAAkB;IACnB,CAAC,CAAC;GACH,IAAI,mBAAmB,iCAAiC,IAAI,WAAW;IACrE,uBAAuB,KAAK;IAC5B,kBAAkB;IACnB,CAAC,CAAC;GACH;GACA,SAAS,mBAAmB,sCAAsC,IAAI,gBAAgB;IACpF,uBAAuB,KAAK;IAC5B,eAAe;IACf,kBAAkB;IAClB,sCAAsC,WAAW,KAAK,oCAAoC,OAAO;IAClG,CAAC,CAAC;GACH,OAAO,mBAAmB,oCAAoC,IAAI,cAAc;IAC9E,uBAAuB,KAAK;IAC5B,kBAAkB;IACnB,CAAC,CAAC;GACH,MAAM,mBAAmB,mCAAmC,IAAI,aAAa,EAC3E,uBAAuB,KAAK,uBAC7B,CAAC,CAAC;GACH,OAAO,mBAAmB,oCAAoC,IAAI,wBAAwB,CAAC;GAC5F;;CAGH,IAAI,UAAkB;AACpB,SAAO,4BAA4B,KAAK,CAAC;;CAG3C,uBAA+B,SAAiB,WAAyB;AACvE,UAAQ,KAAK,8BAA8B,OAAO,IAAI;AACtD,mBAAiB;AACf,WAAQ,KAAK,EAAE;KACd,QAAQ;;CAGb,2BAAmC,OAAO,WAAqC;AAC7E,MAAI,KAAK,mBACP,QAAO,KAAK;AAGd,OAAK,sBAAsB,YAAY;GACrC,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,OAAI,CAAC,SAAS,CAAC,iBAAiB,MAAM,IAAI,IAAI,MAAM,QAAQ,QAAQ,IAClE,QAAO;GAGT,MAAM,SAAS;GACf,MAAM,SACJ,OAAO,MAAM,WAAW,YAAY,OAAO,SAAS,MAAM,OAAO,GAC7D,MAAM,SACN;AAEN,WAAQ,IACN,qBAAqB,OAAO,gBAAgB,SAAS,wBACtD;AACD,SAAM,KAAK,sBAAsB,aAAa;AAC9C,SAAM,KAAK,sBAAsB,aAAa;IAC5C,aAAa;KACX,SAAS;KACT,MAAM;KACN,MAAM;KACP;IACD,MAAM;IACP,CAAC;AACF,UAAO;MACL;AAEJ,MAAI;AACF,UAAO,MAAM,KAAK;YACV;AACR,QAAK,qBAAqB;;;CAI9B,6BAAqC,WAIzB;EACV,MAAM,EAAE,SAAS,kBAAkB,QAAQ,UAAU,sBAAsB;EAC3E,MAAM,WAAW,qBAAqB;AACtC,MACE,aAAa,gCACb,aAAa,eAEb;AAEF,MAAI,KAAK,kBACP;EAGF,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,MAAI,CAAC,SAAS,MAAM,QAAQ,QAAQ,IAClC;EAGF,MAAM,SACJ,OAAO,MAAM,WAAW,YAAY,OAAO,SAAS,MAAM,OAAO,GAC7D,MAAM,SACN;EACN,MAAM,UACJ,OAAO,qBAAqB,YAAY,OAAO,SAAS,iBAAiB,GACrE,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,CAAC,GACzC;EACN,MAAM,SAAS,2BAA2B;GACxC,WAAW,QAAQ,KAAK;GACxB,eAAe,OAAO,KAAK;GAC3B,SAAS;IAAC;IAAS;IAAa,OAAO,OAAO;IAAC;GAC/C,UAAU,QAAQ;GACnB,CAAC;EACF,MAAM,mBAAmB,yBAAyB;EAClD,MAAM,eAAe;GACnB;GACA;GACA,qBAAqB,QAAQ,IAAI;GACjC,mBAAmB,QAAQ;GAC3B;GACA;GACA,mBAAmB,KAAK,UAAU,OAAO,QAAQ,CAAC;GAClD,gBAAgB,KAAK,UAAU,OAAO,KAAK,CAAC;GAC5C,4BAA4B,KAAK,UAAU,iBAAiB,CAAC;GAC7D;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,KAAK,KAAK;AAEZ,MAAI;AACa,SAAM,QAAQ,UAAU,CAAC,MAAM,aAAa,EAAE;IAC3D,UAAU;IACV,OAAO;IACP,KAAK,iCAAiC,QAAQ,IAAI;IAClD,aAAa;IACd,CAAC,CACK,OAAO;AACd,QAAK,oBAAoB;AACzB,WAAQ,KAAK,+BAA+B,OAAO,IAAI;WAChD,OAAO;AACd,WAAQ,MAAM,uCAAuC,OAAO,MAAM,GAAG;;;CAIzE,iBAAyB,OAAO,WAAgD;AAC9E,QAAM,KAAK,sBAAsB,IAAI,OAAO;;CAG9C,sCAA8C,OAAO,WAAkC;EACrF,MAAM,gBAAgB,QAAQ,IAAI;EAClC,MAAM,aACJ,OAAO,kBAAkB,WAAW,cAAc,MAAM,GAAG;AAC7D,MAAI,CAAC,WACH;AAGF,MAAI;AACF,SAAM,qBAAqB;IACzB,MAAM;IACN,QAAQ;IACR,IAAI,KAAK,KAAK;IACd;IACA,OAAO;KACL,QAAQ,UAAU;KAClB,UAAU;KACX;IACF,CAAC;WACK,OAAO;AACd,WAAQ,KACN,gEAAgE,OAAO,MAAM,GAC9E;;;CAIL,UAAU,YAA2B;AACnC,UAAQ,KACN,YAAY,SAAS,+BAA+B,SAAS,iBAC9D;AACD,QAAM,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;;CAGxC,OAAO,OAAO,UAAgE,EAAE,KAAoB;EAClG,MAAM,SAAS,QAAQ,UAAU;EACjC,MAAM,SAAS,QAAQ,OAAO,cAAc;EAC5C,MAAM,QAAQ,QAAQ,QAAQ,MAAM;EAEpC,MAAM,aAAa,eAAe;EAClC,MAAM,gBAAgB,0BAA0B,WAAW;EAG3D,MAAM,gBAAgB,qBADP,YAAY,CACuB,OAAO,SAAS,UAAU;EAC5E,MAAM,mBAAmB,WAAW,cAAc;AAClD,YAAU,eAAe,EAAE,WAAW,MAAM,CAAC;EAC7C,MAAM,iBAAiB,KAAK,iBAAiB,yBAC3C,eACA,EAAE,OAAO,CACV;AAED,MAAI,cACF,SAAQ,IAAI,KAAK,OAAO,sBAAsB,aAAa;AAE7D,MAAI,CAAC,iBACH,SAAQ,IAAI,KAAK,OAAO,yBAAyB,gBAAgB;AAEnE,OAAK,MAAM,QAAQ,eAAe,QAChC,SAAQ,IAAI,KAAK,OAAO,YAAY,OAAO;AAE7C,MACE,CAAC,iBACD,oBACA,eAAe,QAAQ,WAAW,EAElC,SAAQ,IAAI,GAAG,OAAO,wBAAwB;AAGhD,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAQ,IAAI,KAAK,KAAK,KAAK,GAAG,SAAS,cAAc,OAAO,GAAG;AAC/D,WAAQ,IAAI,gBAAgB;AAC5B,WAAQ,IAAI,4BAA4B,aAAa;AACrD,WAAQ,IAAI,cAAc,SAAS,oBAAoB;QAEvD,SAAQ,IACN,aAAa,SAAS,OAAO,QAAQ,aAAa,GAAG,uCACtD;;CAIL,QAAQ,OAAO,OAA4B,EAAE,KAAoB;AAC/D,QAAM,KAAK,KAAK;GAAE,QAAQ;GAAS,MAAM;GAAM,CAAC;AAChD,QAAM,KAAK,qBAAqB,MAAM,KAAK;;CAG7C,QAAQ,OAAO,SAA6C;EAC1D,MAAM,aAAa,eAAe;EAClC,MAAM,SAAS,IAAI,eAAe;GAChC,SAAS,YAAY;GACrB;GACD,CAAC;EACF,MAAM,SAAS,OAAO,cAAc;AAEpC,yBAAuB;GACrB,kBACEA,qBACE,qBAAqB,YAAY,EAAE,EAAE,YAAY,CAAC,EAClD,OAAO,WAAW,oBAAoB,CACvC;GACH,iBAAiB,OAAO,mBAAmB;AACzC,QACE,CAAC,kBACD,OAAO,mBAAmB,YAC1B,MAAM,QAAQ,eAAe,CAE7B,OAAM,IAAI,MACR,0DACD;AAQH,eALa,sBADG,YAAY,EAG1B,gBACA,OAAO,WAAW,oBAAoB,CACvC,CACe;;GAEnB,CAAC;AAEF,MAAI;GACF,MAAM,kBAAkB,OAAO,SAAS,uBACtC,OAAO,cACP,YACD;AAED,SAAM,mBAAmB;IACvB,MAAM,KAAK;IACX;IACA;IACA;IACA;IACD,CAAC;YACM;AACR,0BAAuB,KAAK;;;CAIhC,SAAS,OAAO,SAA8C;EAC5D,MAAM,gBAAgB,KAAK;AAC3B,MAAI,CAAC,KAAK,MAAM;GACd,MAAM,oBAAoB,QAAQ,IAAI,qCAAqC,MAAM,oBAAoB;AACrG,WAAQ,IAAI,WAAW,kBAAkB,YAAY,gBAAgB;;EAEvE,MAAM,WAAW,MAAM,IAAI,gCAAgC,CAAC,IAAI,KAAK;AACrE,MAAI,SAAS,WAAW,aAAa,SAAS,WAAW,SACvD,SAAQ,KAAK,EAAE;EAGjB,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,MAAI,SAAS,mBAAmB,SAAS,iBAAiB,MAAM,IAAI,CAClE,SAAQ,IAAI,gBAAgB,SAAS,uBAAuB;;;AAKlE,MAAa,iCACX,OAAiB,QAAQ,SAChB;CACT,MAAM,eAAe,4BAA4B,KAAK;AACtD,KAAI,mBAAmB;EACrB;EACA,iBAAiB,aAAa;EAC9B,uBAAuB,aAAa;EACrC,CAAC,CAAC,KAAK"}
@@ -50,4 +50,5 @@ declare class GatewayControllerImpl implements GatewayController {
50
50
  }) => Promise<Record<string, unknown>>;
51
51
  }
52
52
  //#endregion
53
- export { GatewayControllerImpl };
53
+ export { GatewayControllerImpl };
54
+ //# sourceMappingURL=gateway.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.controller.d.ts","names":[],"sources":["../../../src/shared/controllers/gateway.controller.ts"],"mappings":";;;;KAcK,cAAA;EACH,aAAA,EAAe,aAAA;EACf,QAAA,EAAU,cAAA;EACV,IAAA,EAAM,WAAA;EACN,cAAA,GAAiB,cAAA;EACjB,cAAA,IAAkB,OAAA;IAAY,OAAA;IAAkB,MAAA;EAAA,MAAsB,OAAA;AAAA;AAAA,cAG3D,qBAAA,YAAiC,iBAAA;EAAA,QACxB,IAAA;cAAA,IAAA,EAAM,cAAA;EAAA,QAElB,uBAAA;EAAA,QAQA,sBAAA;EAAA,QA8CA,2BAAA;EAAA,QA6BA,cAAA;EAcR,MAAA,QAAa,MAAA;EAQb,YAAA,GAAsB,MAAA,cAAkB,OAAA;EAIxC,OAAA,GAAiB,OAAA;IAAY,OAAA;IAAkB,MAAA;IAAiB,UAAA;EAAA,MAAwB,OAAA;EAWxF,SAAA,QAAsB,OAAA,CAAQ,MAAA;EAI9B,eAAA,QAA4B,OAAA,CAAQ,MAAA;EAIpC,WAAA,GAAqB,MAAA;IACnB,GAAA;IACA,QAAA;IACA,IAAA;IACA,cAAA;IACA,UAAA;EAAA,MACE,OAAA,CAAQ,MAAA;EASZ,WAAA,GAAqB,MAAA;IACnB,GAAA;IACA,QAAA;IACA,IAAA;IACA,cAAA;IACA,UAAA;EAAA,MACE,OAAA,CAAQ,MAAA;EASZ,SAAA,GAAmB,MAAA;IACjB,IAAA;IACA,cAAA;IACA,SAAA;IACA,UAAA;EAAA,MACE,OAAA,CAAQ,MAAA;AAAA"}
@@ -158,3 +158,5 @@ var GatewayControllerImpl = class {
158
158
  };
159
159
  //#endregion
160
160
  export { GatewayControllerImpl };
161
+
162
+ //# sourceMappingURL=gateway.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.controller.js","names":["getPackageVersion"],"sources":["../../../src/shared/controllers/gateway.controller.ts"],"sourcesContent":["import {\n type GatewayController,\n type CronService,\n type SessionManager\n} from \"@nextclaw/core\";\nimport type { ChannelManager, ConfigManager } from \"@nextclaw/kernel\";\nimport { getPackageVersion } from \"../utils/cli.utils.js\";\nimport { NpmRuntimeUpdateCommandService } from \"@nextclaw-service/launcher/npm-runtime-update-command.service.js\";\nimport {\n parseSessionKey,\n type RestartSentinelDeliveryContext,\n writeRestartSentinel\n} from \"../services/restart/restart-sentinel.service.js\";\n\ntype ControllerDeps = {\n configManager: ConfigManager;\n channels: ChannelManager;\n cron: CronService;\n sessionManager?: SessionManager;\n requestRestart?: (options?: { delayMs?: number; reason?: string }) => Promise<void> | void;\n};\n\nexport class GatewayControllerImpl implements GatewayController {\n constructor(private deps: ControllerDeps) {}\n\n private normalizeOptionalString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n };\n\n private resolveDeliveryContext = (sessionKey?: string): RestartSentinelDeliveryContext | undefined => {\n const normalizedSessionKey = this.normalizeOptionalString(sessionKey);\n const keyTarget = parseSessionKey(normalizedSessionKey);\n const keyRoute = keyTarget && keyTarget.channel !== \"agent\" ? keyTarget : null;\n const session = normalizedSessionKey ? this.deps.sessionManager?.getIfExists(normalizedSessionKey) : null;\n const metadata = session?.metadata ?? {};\n const rawContext = metadata.last_delivery_context;\n const cachedContext =\n rawContext && typeof rawContext === \"object\" && !Array.isArray(rawContext)\n ? (rawContext as Record<string, unknown>)\n : null;\n const cachedMetadataRaw = cachedContext?.metadata;\n const cachedMetadata =\n cachedMetadataRaw && typeof cachedMetadataRaw === \"object\" && !Array.isArray(cachedMetadataRaw)\n ? ({ ...(cachedMetadataRaw as Record<string, unknown>) } as Record<string, unknown>)\n : {};\n\n const channel = this.normalizeOptionalString(cachedContext?.channel) ?? keyRoute?.channel;\n const chatId =\n this.normalizeOptionalString(cachedContext?.chatId) ??\n this.normalizeOptionalString(metadata.last_to) ??\n keyRoute?.chatId;\n const replyTo =\n this.normalizeOptionalString(cachedContext?.replyTo) ??\n this.normalizeOptionalString(metadata.last_message_id);\n const accountId =\n this.normalizeOptionalString(cachedContext?.accountId) ??\n this.normalizeOptionalString(metadata.last_account_id);\n\n if (!channel || !chatId) {\n return undefined;\n }\n\n if (accountId && !this.normalizeOptionalString(cachedMetadata.accountId)) {\n cachedMetadata.accountId = accountId;\n }\n\n return {\n channel,\n chatId,\n ...(replyTo ? { replyTo } : {}),\n ...(accountId ? { accountId } : {}),\n ...(Object.keys(cachedMetadata).length > 0 ? { metadata: cachedMetadata } : {})\n };\n };\n\n private writeRestartSentinelPayload = async (params: {\n kind: \"config.apply\" | \"config.patch\" | \"update.run\" | \"restart\";\n status: \"ok\" | \"error\" | \"skipped\";\n sessionKey?: string;\n note?: string;\n reason?: string;\n strategy?: string;\n }): Promise<string | null> => {\n const { kind, note, reason, sessionKey: rawSessionKey, status, strategy } = params;\n const sessionKey = this.normalizeOptionalString(rawSessionKey);\n const deliveryContext = this.resolveDeliveryContext(sessionKey);\n try {\n return await writeRestartSentinel({\n kind,\n status,\n ts: Date.now(),\n sessionKey,\n deliveryContext,\n message: note ?? null,\n stats: {\n reason: reason ?? null,\n strategy: strategy ?? null\n }\n });\n } catch {\n return null;\n }\n };\n\n private requestRestart = async (options?: { delayMs?: number; reason?: string }): Promise<void> => {\n const { delayMs, reason } = options ?? {};\n if (this.deps.requestRestart) {\n await this.deps.requestRestart(options);\n return;\n }\n const delay =\n typeof delayMs === \"number\" && Number.isFinite(delayMs) ? Math.max(0, delayMs) : 100;\n console.log(`Gateway restart requested via tool${reason ? ` (${reason})` : \"\"}.`);\n setTimeout(() => {\n process.exit(0);\n }, delay);\n };\n\n status = (): Record<string, unknown> => {\n return {\n channels: this.deps.channels.enabledChannels,\n cron: this.deps.cron.status(),\n configPath: this.deps.configManager.configPath\n };\n };\n\n reloadConfig = async (reason?: string): Promise<string> => {\n return this.deps.configManager.reloadConfig(reason);\n };\n\n restart = async (options?: { delayMs?: number; reason?: string; sessionKey?: string }): Promise<string> => {\n await this.writeRestartSentinelPayload({\n kind: \"restart\",\n status: \"ok\",\n sessionKey: options?.sessionKey,\n reason: options?.reason ?? \"gateway.restart\"\n });\n await this.requestRestart(options);\n return \"Restart scheduled\";\n };\n\n getConfig = async (): Promise<Record<string, unknown>> => {\n return this.deps.configManager.getConfigSnapshot({ version: getPackageVersion() });\n };\n\n getConfigSchema = async (): Promise<Record<string, unknown>> => {\n return this.deps.configManager.getConfigSchema({ version: getPackageVersion() });\n };\n\n applyConfig = async (params: {\n raw: string;\n baseHash?: string;\n note?: string;\n restartDelayMs?: number;\n sessionKey?: string;\n }): Promise<Record<string, unknown>> => {\n return this.deps.configManager.applyRawConfig({\n raw: params.raw,\n baseHash: params.baseHash,\n note: params.note,\n version: getPackageVersion()\n });\n };\n\n patchConfig = async (params: {\n raw: string;\n baseHash?: string;\n note?: string;\n restartDelayMs?: number;\n sessionKey?: string;\n }): Promise<Record<string, unknown>> => {\n return this.deps.configManager.patchRawConfig({\n raw: params.raw,\n baseHash: params.baseHash,\n note: params.note,\n version: getPackageVersion()\n });\n };\n\n updateRun = async (params: {\n note?: string;\n restartDelayMs?: number;\n timeoutMs?: number;\n sessionKey?: string;\n }): Promise<Record<string, unknown>> => {\n const { note, restartDelayMs, sessionKey, timeoutMs } = params;\n const versionBefore = getPackageVersion();\n void timeoutMs;\n const snapshot = await new NpmRuntimeUpdateCommandService().runManaged({});\n if (snapshot.status === \"blocked\" || snapshot.status === \"failed\") {\n return {\n ok: false,\n error: snapshot.errorMessage ?? snapshot.blockReason ?? \"update failed\",\n snapshot,\n version: {\n before: versionBefore,\n after: getPackageVersion(),\n changed: false\n }\n };\n }\n\n const versionAfter = getPackageVersion();\n const delayMs = restartDelayMs ?? 0;\n const sentinelPath = await this.writeRestartSentinelPayload({\n kind: \"update.run\",\n status: \"ok\",\n sessionKey,\n note,\n reason: \"update.run\",\n strategy: \"runtime-bundle\"\n });\n await this.requestRestart({ delayMs, reason: \"update.run\" });\n return {\n ok: true,\n note: note ?? null,\n restart: { scheduled: true, delayMs },\n strategy: \"runtime-bundle\",\n snapshot,\n version: {\n before: versionBefore,\n after: versionAfter,\n changed: versionBefore !== versionAfter\n },\n sentinel: sentinelPath ? { path: sentinelPath } : null\n };\n };\n}\n"],"mappings":"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"}
@@ -9,4 +9,5 @@ declare class GatewayRestartWakeService {
9
9
  private buildRestartWakePrompt;
10
10
  }
11
11
  //#endregion
12
- export { GatewayRestartWakeService };
12
+ export { GatewayRestartWakeService };
13
+ //# sourceMappingURL=gateway-restart-wake.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-restart-wake.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/gateway-restart-wake.service.ts"],"mappings":";;;cAmBa,yBAAA;EAAA,iBACkB,OAAA;cAAA,OAAA,EAAS,sBAAA;EAEtC,uBAAA,QAAoC,OAAA;EAAA,QA4D5B,mCAAA;EAAA,QAiBA,sBAAA;AAAA"}
@@ -90,3 +90,5 @@ var GatewayRestartWakeService = class {
90
90
  };
91
91
  //#endregion
92
92
  export { GatewayRestartWakeService };
93
+
94
+ //# sourceMappingURL=gateway-restart-wake.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-restart-wake.service.js","names":[],"sources":["../../../../src/shared/services/gateway/gateway-restart-wake.service.ts"],"sourcesContent":["import {\n parseAgentScopedSessionKey,\n} from \"@nextclaw/core\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\nimport {\n consumeRestartSentinel,\n formatRestartSentinelMessage,\n parseSessionKey,\n} from \"@nextclaw-service/shared/services/restart/restart-sentinel.service.js\";\nimport { resolveSessionRouteCandidate } from \"@nextclaw-service/shared/services/runtime/service-managed-startup.service.js\";\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nexport class GatewayRestartWakeService {\n constructor(private readonly gateway: NextclawGatewayRuntime) {}\n\n wakeFromRestartSentinel = async (): Promise<void> => {\n const sentinel = await consumeRestartSentinel();\n if (!sentinel) {\n return;\n }\n\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 750));\n\n const payload = sentinel.payload;\n const summary = formatRestartSentinelMessage(payload);\n const sentinelSessionKey = normalizeOptionalString(payload.sessionKey);\n const fallbackSessionKey = sentinelSessionKey ? undefined : this.resolveMostRecentRoutableSessionKey();\n if (!sentinelSessionKey && fallbackSessionKey) {\n console.warn(`Warning: restart sentinel missing sessionKey; fallback to ${fallbackSessionKey}.`);\n }\n const sessionKey = sentinelSessionKey ?? fallbackSessionKey ?? \"cli:default\";\n const parsedSession = parseSessionKey(sessionKey);\n const parsedAgentSession = parseAgentScopedSessionKey(sessionKey);\n const parsedSessionRoute = parsedSession && parsedSession.channel !== \"agent\" ? parsedSession : null;\n\n const context = payload.deliveryContext;\n const channel =\n normalizeOptionalString(context?.channel) ??\n parsedSessionRoute?.channel ??\n normalizeOptionalString((this.gateway.sessionManager.getIfExists(sessionKey)?.metadata ?? {}).last_channel);\n const chatId =\n normalizeOptionalString(context?.chatId) ??\n parsedSessionRoute?.chatId ??\n normalizeOptionalString((this.gateway.sessionManager.getIfExists(sessionKey)?.metadata ?? {}).last_to);\n const replyTo = normalizeOptionalString(context?.replyTo);\n const accountId = normalizeOptionalString(context?.accountId);\n\n if (!channel || !chatId) {\n console.warn(`Warning: restart sentinel cannot resolve route for session ${sessionKey}.`);\n return;\n }\n\n await this.gateway.messageBus.publishInbound({\n channel: \"system\",\n senderId: \"restart-sentinel\",\n chatId: `${channel}:${chatId}`,\n content: this.buildRestartWakePrompt({\n summary,\n reason: normalizeOptionalString(payload.stats?.reason),\n note: normalizeOptionalString(payload.message),\n ...(replyTo ? { replyTo } : {}),\n }),\n timestamp: new Date(),\n attachments: [],\n metadata: {\n source: \"restart-sentinel\",\n restart_summary: summary,\n session_key_override: sessionKey,\n ...(replyTo ? { reply_to: replyTo } : {}),\n ...(parsedAgentSession ? { target_agent_id: parsedAgentSession.agentId } : {}),\n ...(accountId ? { account_id: accountId, accountId } : {}),\n },\n });\n };\n\n private resolveMostRecentRoutableSessionKey = (): string | undefined => {\n let best: { key: string; updatedAt: number } | null = null;\n for (const session of this.gateway.sessionManager.listSessions()) {\n const candidate = resolveSessionRouteCandidate({\n session,\n normalizeOptionalString,\n });\n if (!candidate) {\n continue;\n }\n if (!best || candidate.updatedAt >= best.updatedAt) {\n best = candidate;\n }\n }\n return best?.key;\n };\n\n private buildRestartWakePrompt = (params: {\n summary: string;\n reason?: string;\n note?: string;\n replyTo?: string;\n }): string => {\n const { note, reason, replyTo, summary } = params;\n const lines = [\n \"System event: the gateway has restarted successfully.\",\n \"Please send one short confirmation to the user that you are back online.\",\n \"Do not call any tools.\",\n \"Use the same language as the user's recent conversation.\",\n `Reference summary: ${summary}`,\n ];\n\n const normalizedReason = normalizeOptionalString(reason);\n if (normalizedReason) {\n lines.push(`Restart reason: ${normalizedReason}`);\n }\n\n const normalizedNote = normalizeOptionalString(note);\n if (normalizedNote) {\n lines.push(`Extra note: ${normalizedNote}`);\n }\n\n const normalizedReplyTo = normalizeOptionalString(replyTo);\n if (normalizedReplyTo) {\n lines.push(`Reply target message id: ${normalizedReplyTo}. If suitable, include [[reply_to:${normalizedReplyTo}]].`);\n }\n\n return lines.join(\"\\n\");\n };\n}\n"],"mappings":";;;;;AAWA,SAAS,wBAAwB,OAAoC;AACnE,KAAI,OAAO,UAAU,SACnB;AAGF,QADgB,MAAM,MAAM,IACV,KAAA;;AAGpB,IAAa,4BAAb,MAAuC;CACrC,YAAY,SAAkD;AAAjC,OAAA,UAAA;;CAE7B,0BAA0B,YAA2B;EACnD,MAAM,WAAW,MAAM,wBAAwB;AAC/C,MAAI,CAAC,SACH;AAGF,QAAM,IAAI,SAAS,mBAAmB,WAAW,gBAAgB,IAAI,CAAC;EAEtE,MAAM,UAAU,SAAS;EACzB,MAAM,UAAU,6BAA6B,QAAQ;EACrD,MAAM,qBAAqB,wBAAwB,QAAQ,WAAW;EACtE,MAAM,qBAAqB,qBAAqB,KAAA,IAAY,KAAK,qCAAqC;AACtG,MAAI,CAAC,sBAAsB,mBACzB,SAAQ,KAAK,6DAA6D,mBAAmB,GAAG;EAElG,MAAM,aAAa,sBAAsB,sBAAsB;EAC/D,MAAM,gBAAgB,gBAAgB,WAAW;EACjD,MAAM,qBAAqB,2BAA2B,WAAW;EACjE,MAAM,qBAAqB,iBAAiB,cAAc,YAAY,UAAU,gBAAgB;EAEhG,MAAM,UAAU,QAAQ;EACxB,MAAM,UACJ,wBAAwB,SAAS,QAAQ,IACzC,oBAAoB,WACpB,yBAAyB,KAAK,QAAQ,eAAe,YAAY,WAAW,EAAE,YAAY,EAAE,EAAE,aAAa;EAC7G,MAAM,SACJ,wBAAwB,SAAS,OAAO,IACxC,oBAAoB,UACpB,yBAAyB,KAAK,QAAQ,eAAe,YAAY,WAAW,EAAE,YAAY,EAAE,EAAE,QAAQ;EACxG,MAAM,UAAU,wBAAwB,SAAS,QAAQ;EACzD,MAAM,YAAY,wBAAwB,SAAS,UAAU;AAE7D,MAAI,CAAC,WAAW,CAAC,QAAQ;AACvB,WAAQ,KAAK,8DAA8D,WAAW,GAAG;AACzF;;AAGF,QAAM,KAAK,QAAQ,WAAW,eAAe;GAC3C,SAAS;GACT,UAAU;GACV,QAAQ,GAAG,QAAQ,GAAG;GACtB,SAAS,KAAK,uBAAuB;IACnC;IACA,QAAQ,wBAAwB,QAAQ,OAAO,OAAO;IACtD,MAAM,wBAAwB,QAAQ,QAAQ;IAC9C,GAAI,UAAU,EAAE,SAAS,GAAG,EAAE;IAC/B,CAAC;GACF,2BAAW,IAAI,MAAM;GACrB,aAAa,EAAE;GACf,UAAU;IACR,QAAQ;IACR,iBAAiB;IACjB,sBAAsB;IACtB,GAAI,UAAU,EAAE,UAAU,SAAS,GAAG,EAAE;IACxC,GAAI,qBAAqB,EAAE,iBAAiB,mBAAmB,SAAS,GAAG,EAAE;IAC7E,GAAI,YAAY;KAAE,YAAY;KAAW;KAAW,GAAG,EAAE;IAC1D;GACF,CAAC;;CAGJ,4CAAwE;EACtE,IAAI,OAAkD;AACtD,OAAK,MAAM,WAAW,KAAK,QAAQ,eAAe,cAAc,EAAE;GAChE,MAAM,YAAY,6BAA6B;IAC7C;IACA;IACD,CAAC;AACF,OAAI,CAAC,UACH;AAEF,OAAI,CAAC,QAAQ,UAAU,aAAa,KAAK,UACvC,QAAO;;AAGX,SAAO,MAAM;;CAGf,0BAAkC,WAKpB;EACZ,MAAM,EAAE,MAAM,QAAQ,SAAS,YAAY;EAC3C,MAAM,QAAQ;GACZ;GACA;GACA;GACA;GACA,sBAAsB;GACvB;EAED,MAAM,mBAAmB,wBAAwB,OAAO;AACxD,MAAI,iBACF,OAAM,KAAK,mBAAmB,mBAAmB;EAGnD,MAAM,iBAAiB,wBAAwB,KAAK;AACpD,MAAI,eACF,OAAM,KAAK,eAAe,iBAAiB;EAG7C,MAAM,oBAAoB,wBAAwB,QAAQ;AAC1D,MAAI,kBACF,OAAM,KAAK,4BAA4B,kBAAkB,oCAAoC,kBAAkB,KAAK;AAGtH,SAAO,MAAM,KAAK,KAAK"}
@@ -28,4 +28,5 @@ declare class GatewayPluginManager {
28
28
  private isChannelEnabled;
29
29
  }
30
30
  //#endregion
31
- export { GatewayPluginManager };
31
+ export { GatewayPluginManager };
32
+ //# sourceMappingURL=gateway-plugin.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-plugin.manager.d.ts","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-plugin.manager.ts"],"mappings":";;;;;;cAea,oBAAA;EAAA,iBAGkB,OAAA;EAAA,QAFrB,cAAA;cAEqB,OAAA,EAAS,sBAAA;EAEtC,kBAAA,QAAyB,oBAAA;EAEzB,aAAA,QAF6C,4BAAA,CAEhC,gBAAA;EAEb,IAAA,QAAiB,OAAA;EAmCjB,qBAAA,GAA+B,MAAA;IAC7B,MAAA,EAAQ,MAAA;IACR,YAAA;EAAA,MACE,OAAA;IAAU,eAAA;EAAA;EAad,qBAAA,GAA+B,YAAA,eAAyB,OAAA;EAWxD,aAAA,QAA0B,OAAA;EAuB1B,oBAAA;EAWA,eAAA,QAA4B,OAAA;EAK5B,YAAA,QAAyB,OAAA;EAAA,QAYjB,oBAAA;EAAA,QAgEA,wBAAA;EAAA,QAcA,yBAAA;EAAA,QA0BA,gBAAA;AAAA"}
@@ -172,3 +172,5 @@ var GatewayPluginManager = class {
172
172
  };
173
173
  //#endregion
174
174
  export { GatewayPluginManager };
175
+
176
+ //# sourceMappingURL=gateway-plugin.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-plugin.manager.js","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-plugin.manager.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport { eventKeys } from \"@nextclaw/shared\";\nimport {\n toPluginConfigView,\n type PluginChannelBinding,\n type PluginChannelGatewayHandle,\n type PluginDiagnostic,\n} from \"@nextclaw/openclaw-compat\";\nimport { logPluginDiagnostics } from \"@nextclaw-service/commands/plugin/index.js\";\nimport {\n logPluginGatewayDiagnostics,\n pluginGatewayLogger,\n} from \"@nextclaw-service/shared/services/gateway/service-startup-support.service.js\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\n\nexport class GatewayPluginManager {\n private gatewayHandles: PluginChannelGatewayHandle[] = [];\n\n constructor(private readonly gateway: NextclawGatewayRuntime) {}\n\n getChannelBindings = (): PluginChannelBinding[] => this.gateway.kernel.extensions.getChannelBindings();\n\n getUiMetadata = () => this.gateway.kernel.extensions.getUiMetadata();\n\n load = async (): Promise<void> => {\n const config = this.gateway.configManager.loadConfig();\n let totalPluginCount = 0;\n this.gateway.bootstrapStatus.markChannelsPending();\n\n try {\n const result = await this.gateway.kernel.extensions.load({\n config,\n onLoadStart: ({ totalPluginCount: nextTotalPluginCount }) => {\n totalPluginCount = nextTotalPluginCount;\n this.gateway.bootstrapStatus.markPluginHydrationRunning({ totalPluginCount: nextTotalPluginCount });\n },\n onPluginProcessed: ({ loadedPluginCount: nextCount }) => {\n this.gateway.bootstrapStatus.markPluginHydrationProgress({\n loadedPluginCount: nextCount,\n totalPluginCount,\n });\n }\n });\n logPluginDiagnostics({ diagnostics: result.diagnostics });\n\n if (result.shouldRestartChannels) {\n await this.gateway.configManager.rebuildChannels(config, { start: false });\n }\n this.publishConfigChanges();\n this.gateway.bootstrapStatus.markPluginHydrationReady({\n loadedPluginCount: result.loadedPluginCount,\n totalPluginCount,\n });\n } catch (error) {\n this.gateway.bootstrapStatus.markPluginHydrationError(error instanceof Error ? error.message : String(error));\n throw error;\n }\n };\n\n reloadForConfigChange = async (params: {\n config: Config;\n changedPaths: string[];\n }): Promise<{ restartChannels: boolean }> => {\n const result = await this.gateway.kernel.extensions.reloadForConfigChange({\n config: params.config,\n changedPaths: params.changedPaths,\n });\n logPluginDiagnostics({ diagnostics: result.diagnostics });\n if (result.shouldRestartChannels) {\n await this.restartGateways();\n }\n this.publishConfigChanges();\n return { restartChannels: result.shouldRestartChannels };\n };\n\n reloadForDevHotReload = async (changedPaths: string[]): Promise<void> => {\n const config = this.gateway.configManager.loadConfig();\n const result = await this.reloadForConfigChange({\n config,\n changedPaths,\n });\n if (result.restartChannels) {\n await this.gateway.configManager.rebuildChannels(config, { start: true });\n }\n };\n\n startGateways = async (): Promise<void> => {\n const config = this.gateway.configManager.loadConfig();\n const diagnostics: PluginDiagnostic[] = [];\n const handles: PluginChannelGatewayHandle[] = [];\n const channelBindings = this.gateway.kernel.extensions.getChannelBindings();\n const configView = toPluginConfigView(config, channelBindings);\n\n for (const binding of channelBindings) {\n if (!this.isChannelEnabled(binding.channelId, configView)) {\n continue;\n }\n await this.startChannelGateways({\n binding,\n configView,\n diagnostics,\n handles,\n });\n }\n\n this.gatewayHandles = handles;\n logPluginGatewayDiagnostics(diagnostics);\n };\n\n publishConfigChanges = (): void => {\n this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: \"channels\" }, {\n emittedAt: new Date().toISOString(),\n source: \"backend\",\n });\n this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: \"plugins\" }, {\n emittedAt: new Date().toISOString(),\n source: \"backend\",\n });\n };\n\n restartGateways = async (): Promise<void> => {\n await this.stopGateways();\n await this.startGateways();\n };\n\n stopGateways = async (): Promise<void> => {\n for (const handle of this.gatewayHandles) {\n try {\n handle.abort?.();\n await handle.stop?.();\n } catch {\n // Ignore stop failures during shutdown.\n }\n }\n this.gatewayHandles = [];\n };\n\n private startChannelGateways = async (params: {\n binding: PluginChannelBinding;\n configView: Record<string, unknown>;\n diagnostics: PluginDiagnostic[];\n handles: PluginChannelGatewayHandle[];\n }): Promise<void> => {\n const { binding, configView, diagnostics, handles } = params;\n const gateway = binding.channel.gateway;\n if (!gateway?.startAccount) {\n return;\n }\n const accountIds = this.resolveGatewayAccountIds(binding, configView);\n for (const accountId of accountIds) {\n const abortController = new AbortController();\n let stopGateway: (() => void | Promise<void>) | undefined;\n const startTask = Promise.resolve()\n .then(async () =>\n await gateway.startAccount?.({\n accountId,\n channelId: binding.channelId,\n cfg: configView as Config,\n abortSignal: abortController.signal,\n runtime: {\n log: pluginGatewayLogger.info,\n info: pluginGatewayLogger.info,\n warn: pluginGatewayLogger.warn,\n error: pluginGatewayLogger.error,\n debug: pluginGatewayLogger.debug,\n },\n setStatus: () => undefined,\n log: pluginGatewayLogger,\n })\n )\n .then((started) => {\n if (started && typeof started === \"object\" && \"stop\" in started && typeof started.stop === \"function\") {\n stopGateway = started.stop.bind(started);\n }\n })\n .catch((error) => {\n if (abortController.signal.aborted) {\n return;\n }\n this.reportGatewayStartFailure({\n accountId,\n binding,\n diagnostics,\n error,\n });\n });\n\n handles.push({\n pluginId: binding.pluginId,\n channelId: binding.channelId,\n accountId,\n abort: () => abortController.abort(),\n stop: async () => {\n abortController.abort();\n await startTask;\n await stopGateway?.();\n },\n });\n }\n };\n\n private resolveGatewayAccountIds = (\n binding: PluginChannelBinding,\n configView: Record<string, unknown>,\n ): string[] => {\n const accountIdsRaw =\n binding.channel.config?.listAccountIds?.(configView) ?? [\n binding.channel.config?.defaultAccountId?.(configView) ?? \"default\",\n ];\n const accountIds = Array.from(\n new Set(accountIdsRaw.map((id) => (typeof id === \"string\" ? id.trim() : \"\")).filter(Boolean)),\n );\n return accountIds.length > 0 ? accountIds : [\"default\"];\n };\n\n private reportGatewayStartFailure = (params: {\n accountId: string;\n binding: PluginChannelBinding;\n diagnostics: PluginDiagnostic[];\n error: unknown;\n }): void => {\n const { accountId, binding, diagnostics, error } = params;\n const raw = String(error);\n const lower = raw.toLowerCase();\n const level =\n lower.includes(\"required\") || lower.includes(\"not configured\") || lower.includes(\"missing\")\n ? \"warn\"\n : \"error\";\n const message = `failed to start channel gateway for ${binding.channelId}/${accountId}: ${raw}`;\n diagnostics.push({\n level,\n pluginId: binding.pluginId,\n message,\n });\n if (level === \"error\") {\n pluginGatewayLogger.error(message);\n return;\n }\n pluginGatewayLogger.warn(message);\n };\n\n private isChannelEnabled = (\n channelId: string,\n configView: Record<string, unknown>,\n ): boolean => {\n const channels =\n configView.channels && typeof configView.channels === \"object\" && !Array.isArray(configView.channels)\n ? (configView.channels as Record<string, unknown>)\n : {};\n const channelConfig = channels[channelId];\n if (!channelConfig || typeof channelConfig !== \"object\" || Array.isArray(channelConfig)) {\n return false;\n }\n return (channelConfig as { enabled?: unknown }).enabled === true;\n };\n\n}\n"],"mappings":"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"}
@@ -19,4 +19,5 @@ declare class GatewayRemoteManager {
19
19
  stop: () => Promise<void>;
20
20
  }
21
21
  //#endregion
22
- export { GatewayRemoteManager };
22
+ export { GatewayRemoteManager };
23
+ //# sourceMappingURL=gateway-remote.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-remote.manager.d.ts","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-remote.manager.ts"],"mappings":";;;;;;;;KAQK,qBAAA,GAAsB,UAAA,QAAkB,8BAAA;AAAA,cAEhC,oBAAA;EAAA,SACF,YAAA,EAAc,qBAAA;EAAA,SACd,YAAA,EAAc,kBAAA;cAEX,MAAA;IACV,IAAA,EAAM,kBAAA;IACN,aAAA,EAAe,aAAA;IACf,QAAA,EAAU,MAAA;IACV,mBAAA,IAAuB,KAAA,EAAO,kBAAA;EAAA;EAgBhC,IAAA,QAAiB,OAAA;AAAA"}
@@ -24,3 +24,5 @@ var GatewayRemoteManager = class {
24
24
  };
25
25
  //#endregion
26
26
  export { GatewayRemoteManager };
27
+
28
+ //# sourceMappingURL=gateway-remote.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-remote.manager.js","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-remote.manager.ts"],"sourcesContent":["import type { UiRemoteAccessHost } from \"@nextclaw/server\";\nimport type { RemoteRuntimeState } from \"@nextclaw/remote\";\nimport type { ConfigManager } from \"@nextclaw/kernel\";\nimport type { Config } from \"@nextclaw/core\";\nimport { createManagedRemoteModuleForUi } from \"@nextclaw-service/shared/services/runtime/utils/service-remote-runtime.utils.js\";\nimport { createRemoteAccessHost } from \"@nextclaw-service/shared/services/ui/service-remote-access.service.js\";\nimport type { GatewayRuntimeDeps } from \"../nextclaw-gateway-runtime.service.js\";\n\ntype RemoteServiceModule = ReturnType<typeof createManagedRemoteModuleForUi>;\n\nexport class GatewayRemoteManager {\n readonly remoteModule: RemoteServiceModule;\n readonly remoteAccess: UiRemoteAccessHost;\n\n constructor(params: {\n deps: GatewayRuntimeDeps;\n configManager: ConfigManager;\n uiConfig: Config[\"ui\"];\n onRemoteStateChange?: (state: RemoteRuntimeState) => void;\n }) {\n const { configManager, deps, uiConfig } = params;\n this.remoteModule = createManagedRemoteModuleForUi({\n loadConfig: configManager.loadConfig,\n uiConfig,\n onRemoteStateChange: params.onRemoteStateChange,\n });\n this.remoteAccess = createRemoteAccessHost({\n serviceCommands: deps,\n requestRestart: deps.requestRestart,\n uiConfig,\n remoteModule: this.remoteModule,\n });\n }\n\n stop = async (): Promise<void> => {\n await this.remoteModule?.stop();\n };\n}\n"],"mappings":";;;AAUA,IAAa,uBAAb,MAAkC;CAChC;CACA;CAEA,YAAY,QAKT;EACD,MAAM,EAAE,eAAe,MAAM,aAAa;AAC1C,OAAK,eAAe,+BAA+B;GACjD,YAAY,cAAc;GAC1B;GACA,qBAAqB,OAAO;GAC7B,CAAC;AACF,OAAK,eAAe,uBAAuB;GACzC,iBAAiB;GACjB,gBAAgB,KAAK;GACrB;GACA,cAAc,KAAK;GACpB,CAAC;;CAGJ,OAAO,YAA2B;AAChC,QAAM,KAAK,cAAc,MAAM"}
@@ -14,4 +14,5 @@ declare class NextclawApp {
14
14
  private readonly handleKernelStartupError;
15
15
  }
16
16
  //#endregion
17
- export { NextclawApp, UiStartupHandle };
17
+ export { NextclawApp, UiStartupHandle };
18
+ //# sourceMappingURL=nextclaw-app.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextclaw-app.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-app.service.ts"],"mappings":";;;KAIY,eAAA;EACV,QAAA;AAAA;AAAA,cAQW,WAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,MAAA;cAEY,OAAA,EAAS,sBAAA;EAItC,KAAA,QAAkB,OAAA;EAalB,eAAA,QAA4B,OAAA;EAc5B,4BAAA,QAAyC,OAAA;EAAA,iBAoBxB,wBAAA;AAAA"}
@@ -41,3 +41,5 @@ var NextclawApp = class {
41
41
  };
42
42
  //#endregion
43
43
  export { NextclawApp };
44
+
45
+ //# sourceMappingURL=nextclaw-app.service.js.map