@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["toPluginConfigView"],"sources":["../../../src/commands/channel/index.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { getWorkspacePath, loadConfig, saveConfig } from \"@nextclaw/core\";\nimport { BUILTIN_CHANNEL_PLUGIN_IDS, builtinProviderIds } from \"@nextclaw/runtime\";\nimport { buildPluginStatusReport, enablePluginInConfig, getPluginChannelBindings } from \"@nextclaw/openclaw-compat\";\nimport { loadPluginRegistry, mergePluginConfigView, toPluginConfigView } from \"../plugin/index.js\";\nimport { resolveChannelConfigView } from \"./channel-config-view.js\";\nimport { ChannelListViewService } from \"./channel-list-view.service.js\";\nimport type { ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, RequestRestartParams } from \"../../shared/types/cli.types.js\";\n\nexport { resolveChannelConfigView } from \"./channel-config-view.js\";\n\nconst CHANNEL_LABELS: Record<string, string> = {\n telegram: \"Telegram\",\n whatsapp: \"WhatsApp\",\n discord: \"Discord\",\n feishu: \"Feishu\",\n dingtalk: \"DingTalk\",\n wecom: \"WeCom\",\n email: \"Email\",\n slack: \"Slack\",\n qq: \"QQ\",\n weixin: \"Weixin\"\n};\nconst RESERVED_PROVIDER_IDS = builtinProviderIds();\n\ntype PluginChannelBinding = ReturnType<typeof getPluginChannelBindings>[number];\ntype PluginLoginResult = {\n pluginConfig: Record<string, unknown>;\n accountId?: string | null;\n notes?: string[];\n};\ntype RequiredChannelSetup = NonNullable<PluginChannelBinding[\"channel\"][\"setup\"]> & {\n applyAccountConfig: NonNullable<NonNullable<PluginChannelBinding[\"channel\"][\"setup\"]>[\"applyAccountConfig\"]>;\n};\n\ntype PluginChannelContext = {\n binding: PluginChannelBinding;\n bindings: PluginChannelBinding[];\n};\n\nfunction resolveChannelBindings(pluginRegistry: ReturnType<typeof loadPluginRegistry>): PluginChannelBinding[] {\n return getPluginChannelBindings(pluginRegistry);\n}\n\nexport class ChannelCommands {\n private readonly channelListView = new ChannelListViewService();\n\n constructor(\n private deps: {\n logo: string;\n getBridgeDir: () => string;\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n status = (): void => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const channelConfig = resolveChannelConfigView(config, resolveChannelBindings(pluginRegistry));\n\n console.log(\"Channel Status\");\n const channels = channelConfig.channels as Record<string, { enabled?: boolean }>;\n for (const channelId of BUILTIN_CHANNEL_PLUGIN_IDS) {\n const label = CHANNEL_LABELS[channelId] ?? channelId;\n const enabled = channels[channelId]?.enabled === true;\n console.log(`${label}: ${enabled ? \"✓\" : \"✗\"}`);\n }\n\n const report = buildPluginStatusReport({\n config,\n workspaceDir,\n reservedChannelIds: [],\n reservedProviderIds: RESERVED_PROVIDER_IDS\n });\n\n const pluginChannels = report.plugins.filter((plugin) => plugin.status === \"loaded\" && plugin.channelIds.length > 0);\n if (pluginChannels.length > 0) {\n console.log(\"Plugin Channels:\");\n for (const plugin of pluginChannels) {\n const channels = plugin.channelIds.join(\", \");\n console.log(`- ${channels} (plugin: ${plugin.id})`);\n }\n }\n };\n\n list = (opts: ChannelsListOptions = {}): void => {\n const output = this.buildChannelListOutput();\n if (opts.json) {\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n console.log(\"Channels\");\n for (const channel of output.channels) {\n const flags = [\n channel.enabled ? \"enabled\" : \"disabled\",\n channel.defaultAccountId ? `defaultAccountId=${channel.defaultAccountId}` : undefined,\n ].filter(Boolean);\n console.log(`- ${channel.id} [${flags.join(\", \")}]`);\n }\n };\n\n login = async (opts: ChannelsLoginOptions = {}): Promise<void> => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n this.runLegacyBridgeLogin();\n return;\n }\n\n const config = loadConfig();\n const channelContext = this.resolvePluginChannelContext(config, channelId);\n if (!channelContext) {\n console.error(`No plugin channel found for: ${channelId}`);\n process.exit(1);\n }\n\n const result = await this.loginPluginChannel(config, channelContext, opts);\n if (!result) {\n return;\n }\n\n saveConfig(this.buildNextConfigAfterChannelLogin(config, channelContext.binding, result));\n this.printPluginChannelLoginResult(channelContext.binding, result);\n await this.deps.requestRestart({\n mode: \"notify\",\n reason: `channel login via plugin: ${channelContext.binding.pluginId}`,\n manualMessage: \"渠道配置已保存,等待你手动重启后生效。\"\n });\n };\n\n private runLegacyBridgeLogin = (): void => {\n const bridgeDir = this.deps.getBridgeDir();\n console.log(`${this.deps.logo} Starting bridge...`);\n console.log(\"Scan the QR code to connect.\\n\");\n const result = spawnSync(\"npm\", [\"start\"], { cwd: bridgeDir, stdio: \"inherit\" });\n if (result.status !== 0) {\n console.error(`Bridge failed: ${result.status ?? 1}`);\n }\n };\n\n private resolvePluginChannelContext = (config: ReturnType<typeof loadConfig>, channelId: string): PluginChannelContext | null => {\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const bindings = resolveChannelBindings(pluginRegistry);\n const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);\n if (!binding) {\n return null;\n }\n return { binding, bindings };\n };\n\n private buildChannelListOutput = () => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n return this.channelListView.build({\n config,\n workspaceDir,\n pluginBindings: resolveChannelBindings(pluginRegistry),\n });\n };\n\n private loginPluginChannel = async (\n config: ReturnType<typeof loadConfig>,\n channelContext: PluginChannelContext,\n opts: ChannelsLoginOptions,\n ): Promise<PluginLoginResult | null> => {\n const { binding, bindings } = channelContext;\n const login = binding.channel.auth?.login;\n if (!login) {\n if (binding.channelId === \"whatsapp\") {\n this.runLegacyBridgeLogin();\n return null;\n }\n console.error(`Channel \"${binding.channelId}\" does not support login.`);\n process.exit(1);\n }\n\n const configView = resolveChannelConfigView(config, bindings);\n const result = await login({\n cfg: configView,\n pluginId: binding.pluginId,\n channelId: binding.channelId,\n pluginConfig: this.clonePluginConfig(configView.channels?.[binding.channelId]),\n accountId: opts.account?.trim() || null,\n baseUrl: opts.url?.trim() || opts.httpUrl?.trim() || null,\n verbose: Boolean(opts.verbose)\n });\n this.assertValidPluginLoginResult(result);\n return result;\n };\n\n private clonePluginConfig = (value: unknown): Record<string, unknown> | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n };\n\n private assertValidPluginLoginResult: (result: unknown) => asserts result is PluginLoginResult = (result) => {\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n console.error(\"Channel login returned an invalid result.\");\n process.exit(1);\n }\n const record = result as Record<string, unknown>;\n if (!record.pluginConfig || typeof record.pluginConfig !== \"object\" || Array.isArray(record.pluginConfig)) {\n console.error(\"Channel login returned an invalid plugin config.\");\n process.exit(1);\n }\n };\n\n private buildNextConfigAfterChannelLogin = (\n config: ReturnType<typeof loadConfig>,\n binding: PluginChannelBinding,\n result: PluginLoginResult,\n ): ReturnType<typeof loadConfig> => {\n const nextConfig = {\n ...config,\n channels: {\n ...config.channels,\n [binding.channelId]: result.pluginConfig as ReturnType<typeof loadConfig>[\"channels\"][keyof ReturnType<typeof loadConfig>[\"channels\"]]\n }\n };\n return enablePluginInConfig(nextConfig, binding.pluginId);\n };\n\n private printPluginChannelLoginResult = (binding: PluginChannelBinding, result: PluginLoginResult): void => {\n console.log(`Logged into channel \"${binding.channelId}\" via plugin \"${binding.pluginId}\".`);\n if (result.accountId) {\n console.log(`Active account: ${result.accountId}`);\n }\n for (const note of result.notes ?? []) {\n console.log(note);\n }\n };\n\n add = async (opts: ChannelsAddOptions): Promise<void> => {\n const channelId = this.requireChannelId(opts);\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const { binding, bindings } = this.resolveRequiredChannelBinding(pluginRegistry, channelId);\n const setup = this.resolveRequiredChannelSetup(binding);\n const input = this.buildChannelSetupInput(opts);\n\n const currentView = toPluginConfigView(config, bindings);\n const accountId = binding.channel.config?.defaultAccountId?.(currentView) ?? \"default\";\n\n const validateError = setup.validateInput?.({\n cfg: currentView,\n input,\n accountId\n });\n if (validateError) {\n console.error(`Channel setup validation failed: ${validateError}`);\n process.exit(1);\n }\n\n const nextView = setup.applyAccountConfig({\n cfg: currentView,\n input,\n accountId\n });\n\n if (!nextView || typeof nextView !== \"object\" || Array.isArray(nextView)) {\n console.error(\"Channel setup returned invalid config payload.\");\n process.exit(1);\n }\n\n let next = mergePluginConfigView(config, nextView as Record<string, unknown>, bindings);\n next = enablePluginInConfig(next, binding.pluginId);\n saveConfig(next);\n\n console.log(`Configured channel \"${binding.channelId}\" via plugin \"${binding.pluginId}\".`);\n await this.deps.requestRestart({\n mode: \"notify\",\n reason: `channel configured via plugin: ${binding.pluginId}`,\n manualMessage: \"渠道配置已保存,等待你手动重启后生效。\"\n });\n };\n\n private requireChannelId = (opts: ChannelsAddOptions): string => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n console.error(\"--channel is required\");\n process.exit(1);\n }\n return channelId;\n };\n\n private resolveRequiredChannelBinding = (\n pluginRegistry: ReturnType<typeof loadPluginRegistry>,\n channelId: string,\n ): PluginChannelContext => {\n const bindings = resolveChannelBindings(pluginRegistry);\n const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);\n if (!binding) {\n console.error(`No plugin channel found for: ${channelId}`);\n process.exit(1);\n }\n return { binding, bindings };\n };\n\n private resolveRequiredChannelSetup = (binding: PluginChannelBinding): RequiredChannelSetup => {\n const setup = binding.channel.setup;\n if (!setup?.applyAccountConfig) {\n console.error(`Channel \"${binding.channelId}\" does not support setup.`);\n process.exit(1);\n }\n return setup as RequiredChannelSetup;\n };\n\n private buildChannelSetupInput = (opts: ChannelsAddOptions): Record<string, string | undefined> => {\n return {\n name: opts.name,\n token: opts.token,\n code: opts.code,\n url: opts.url,\n httpUrl: opts.httpUrl\n };\n };\n}\n"],"mappings":"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"}
@@ -15,4 +15,5 @@ declare function toAccountStatusView(result: PlatformMeResult): AccountStatusVie
15
15
  declare function printAccountStatus(view: AccountStatusView): void;
16
16
  declare function printUsernameUpdated(view: AccountStatusView): void;
17
17
  //#endregion
18
- export { AccountStatusView, printAccountStatus, printUsernameUpdated, toAccountStatusView };
18
+ export { AccountStatusView, printAccountStatus, printUsernameUpdated, toAccountStatusView };
19
+ //# sourceMappingURL=account-status.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-status.service.d.ts","names":[],"sources":["../../../../src/commands/platform-auth/services/account-status.service.ts"],"mappings":";;KAKY,iBAAA;EACV,KAAA;EACA,IAAA;EACA,QAAA;EACA,YAAA;EACA,MAAA;EACA,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,qBAAA;AAAA;AAAA,iBAGc,mBAAA,CAAoB,MAAA,EAAQ,gBAAA,GAAmB,iBAAA;AAAA,iBAe/C,kBAAA,CAAmB,IAAA,EAAM,iBAAA;AAAA,iBAazB,oBAAA,CAAqB,IAAA,EAAM,iBAAA"}
@@ -32,3 +32,5 @@ function printUsernameUpdated(view) {
32
32
  }
33
33
  //#endregion
34
34
  export { printAccountStatus, printUsernameUpdated, toAccountStatusView };
35
+
36
+ //# sourceMappingURL=account-status.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-status.service.js","names":[],"sources":["../../../../src/commands/platform-auth/services/account-status.service.ts"],"sourcesContent":["import type { PlatformMeResult } from \"../index.js\";\n\nconst NEXTCLAW_WEB_ACCOUNT_URL = \"https://platform.nextclaw.io/account\";\nconst ACCOUNT_SET_USERNAME_HELP = \"nextclaw account set-username <username>\";\n\nexport type AccountStatusView = {\n email: string;\n role: string;\n username: string | null;\n platformBase: string;\n v1Base: string;\n publishReadiness: \"ready\" | \"needs_username\";\n personalScope: string | null;\n nextClawWebAccountUrl: string;\n cliSetUsernameCommand: string;\n};\n\nexport function toAccountStatusView(result: PlatformMeResult): AccountStatusView {\n const username = result.user.username?.trim() || null;\n return {\n email: result.user.email,\n role: result.user.role,\n username,\n platformBase: result.platformBase,\n v1Base: result.v1Base,\n publishReadiness: username ? \"ready\" : \"needs_username\",\n personalScope: username ? `@${username}/*` : null,\n nextClawWebAccountUrl: NEXTCLAW_WEB_ACCOUNT_URL,\n cliSetUsernameCommand: ACCOUNT_SET_USERNAME_HELP\n };\n}\n\nexport function printAccountStatus(view: AccountStatusView): void {\n console.log(\"NextClaw account status\");\n console.log(`Email: ${view.email}`);\n console.log(`Role: ${view.role}`);\n console.log(`Username: ${view.username ?? \"(not set)\"}`);\n console.log(\n `Publish readiness: ${view.publishReadiness === \"ready\" ? \"ready\" : \"action required - username missing\"}`\n );\n console.log(`Personal scope: ${view.personalScope ?? \"(blocked until username is set)\"}`);\n console.log(`NextClaw Web account settings: ${view.nextClawWebAccountUrl}`);\n console.log(`CLI fallback: ${view.cliSetUsernameCommand}`);\n}\n\nexport function printUsernameUpdated(view: AccountStatusView): void {\n console.log(`✓ Username saved: ${view.username}`);\n console.log(`✓ Personal publish scope: ${view.personalScope}`);\n console.log(`✓ NextClaw Web account settings: ${view.nextClawWebAccountUrl}`);\n}\n"],"mappings":";AAEA,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAclC,SAAgB,oBAAoB,QAA6C;CAC/E,MAAM,WAAW,OAAO,KAAK,UAAU,MAAM,IAAI;AACjD,QAAO;EACL,OAAO,OAAO,KAAK;EACnB,MAAM,OAAO,KAAK;EAClB;EACA,cAAc,OAAO;EACrB,QAAQ,OAAO;EACf,kBAAkB,WAAW,UAAU;EACvC,eAAe,WAAW,IAAI,SAAS,MAAM;EAC7C,uBAAuB;EACvB,uBAAuB;EACxB;;AAGH,SAAgB,mBAAmB,MAA+B;AAChE,SAAQ,IAAI,0BAA0B;AACtC,SAAQ,IAAI,UAAU,KAAK,QAAQ;AACnC,SAAQ,IAAI,SAAS,KAAK,OAAO;AACjC,SAAQ,IAAI,aAAa,KAAK,YAAY,cAAc;AACxD,SAAQ,IACN,sBAAsB,KAAK,qBAAqB,UAAU,UAAU,uCACrE;AACD,SAAQ,IAAI,mBAAmB,KAAK,iBAAiB,oCAAoC;AACzF,SAAQ,IAAI,kCAAkC,KAAK,wBAAwB;AAC3E,SAAQ,IAAI,iBAAiB,KAAK,wBAAwB;;AAG5D,SAAgB,qBAAqB,MAA+B;AAClE,SAAQ,IAAI,qBAAqB,KAAK,WAAW;AACjD,SAAQ,IAAI,6BAA6B,KAAK,gBAAgB;AAC9D,SAAQ,IAAI,oCAAoC,KAAK,wBAAwB"}
@@ -74,4 +74,5 @@ declare class PlatformAuthCommands {
74
74
  }) => Promise<void>;
75
75
  }
76
76
  //#endregion
77
- export { PlatformAuthCommands, PlatformBrowserAuthPollResult, PlatformBrowserAuthStartResult, PlatformLoginResult, PlatformMeResult, PlatformUserView };
77
+ export { PlatformAuthCommands, PlatformBrowserAuthPollResult, PlatformBrowserAuthStartResult, PlatformLoginResult, PlatformMeResult, PlatformUserView };
78
+ //# sourceMappingURL=platform-auth-commands.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth-commands.service.d.ts","names":[],"sources":["../../../../src/commands/platform-auth/services/platform-auth-commands.service.ts"],"mappings":";;;KAwBY,mBAAA;EACV,KAAA;EACA,IAAA;EACA,KAAA;EACA,YAAA;EACA,MAAA;AAAA;AAAA,KAGU,gBAAA;EACV,EAAA;EACA,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,KAGU,gBAAA;EACV,IAAA,EAAM,gBAAA;EACN,KAAA;EACA,YAAA;EACA,MAAA;AAAA;AAAA,KAGU,8BAAA;EACV,SAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,YAAA;EACA,MAAA;AAAA;AAAA,KAGU,6BAAA;EAER,MAAA;EACA,UAAA;AAAA;EAGA,MAAA;EACA,KAAA;EACA,IAAA;EACA,KAAA;EACA,YAAA;EACA,MAAA;AAAA;EAGA,MAAA;EACA,OAAA;AAAA;AAAA,cAyFS,oBAAA;EAAA,QACH,qBAAA;EAAA,QAMA,OAAA;EAAA,QAIA,mBAAA;EAAA,QAKA,iBAAA;EAAA,QAMA,sBAAA;EAAA,QA4BA,yBAAA;EAAA,QA0BA,sBAAA;EAAA,QAoBA,eAAA;EAqBR,WAAA,GAAqB,IAAA,GAAM,mBAAA,KAA2B,OAAA,CAAQ,mBAAA;EAmC9D,gBAAA,GAA0B,IAAA,GAAM,IAAA,CAAK,mBAAA,iBAAuC,OAAA,CAAQ,8BAAA;EAqBpF,eAAA,GAAyB,MAAA;IACvB,OAAA;IACA,SAAA;EAAA,MACE,OAAA,CAAQ,6BAAA;EAiDZ,KAAA,GAAe,IAAA,GAAM,mBAAA,KAA2B,OAAA;EAOhD,EAAA,GAAY,MAAA;IAAU,OAAA;EAAA,MAA0B,OAAA,CAAQ,gBAAA;EAmBxD,aAAA,GAAuB,MAAA;IAAU,QAAA;IAAkB,OAAA;EAAA,MAAqB,OAAA,CAAQ,gBAAA;EA0ChF,MAAA;IAAe,OAAA;EAAA;EASf,aAAA,GAAuB,IAAA,GAAM,qBAAA,KAA6B,OAAA;EAU1D,kBAAA,GAA4B,IAAA,EAAM,gCAAA;IAAqC,QAAA;EAAA,MAAqB,OAAA;AAAA"}
@@ -293,3 +293,5 @@ var PlatformAuthCommands = class {
293
293
  };
294
294
  //#endregion
295
295
  export { PlatformAuthCommands };
296
+
297
+ //# sourceMappingURL=platform-auth-commands.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-auth-commands.service.js","names":[],"sources":["../../../../src/commands/platform-auth/services/platform-auth-commands.service.ts"],"sourcesContent":["import { getConfigPath, loadConfig, saveConfig } from \"@nextclaw/core\";\nimport { createInterface } from \"node:readline\";\nimport { buildPlatformApiBaseErrorMessage, resolvePlatformApiBase } from \"../../remote/index.js\";\nimport {\n readBrowserAuthPollPayload,\n readBrowserAuthStartPayload,\n readLoginPayload,\n readPlatformAuthResultPayload,\n readPlatformErrorMessage,\n readPlatformUserPayload\n} from \"../utils/payload.utils.js\";\nimport { printAccountStatus, printUsernameUpdated, toAccountStatusView } from \"./account-status.service.js\";\nimport type { AccountCommandOptions, AccountSetUsernameCommandOptions, LoginCommandOptions } from \"../../../shared/types/cli.types.js\";\nimport { openBrowser, prompt } from \"../../../shared/utils/cli.utils.js\";\n\ntype NextclawProviderConfig = {\n displayName?: string;\n apiKey?: string;\n apiBase?: string | null;\n extraHeaders?: Record<string, string> | null;\n wireApi?: \"auto\" | \"chat\" | \"responses\";\n models?: string[];\n};\n\nexport type PlatformLoginResult = {\n token: string;\n role: string;\n email: string;\n platformBase: string;\n v1Base: string;\n};\n\nexport type PlatformUserView = {\n id: string;\n email: string;\n username: string | null;\n role: string;\n};\n\nexport type PlatformMeResult = {\n user: PlatformUserView;\n token: string;\n platformBase: string;\n v1Base: string;\n};\n\nexport type PlatformBrowserAuthStartResult = {\n sessionId: string;\n verificationUri: string;\n expiresAt: string;\n intervalMs: number;\n platformBase: string;\n v1Base: string;\n};\n\nexport type PlatformBrowserAuthPollResult =\n | {\n status: \"pending\";\n nextPollMs: number;\n }\n | {\n status: \"authorized\";\n token: string;\n role: string;\n email: string;\n platformBase: string;\n v1Base: string;\n }\n | {\n status: \"expired\";\n message: string;\n };\n\nfunction resolveProviderConfig(opts: LoginCommandOptions): {\n configPath: string;\n config: ReturnType<typeof loadConfig>;\n providers: Record<string, NextclawProviderConfig>;\n nextclawProvider: NextclawProviderConfig;\n platformBase: string;\n v1Base: string;\n inputApiBase: string;\n} {\n const configPath = getConfigPath();\n const config = loadConfig(configPath);\n const providers = config.providers as Record<string, NextclawProviderConfig>;\n const nextclawProvider = providers.nextclaw ?? {\n displayName: \"\",\n apiKey: \"\",\n apiBase: null,\n extraHeaders: null,\n wireApi: \"auto\",\n models: []\n };\n const configuredApiBase =\n typeof nextclawProvider.apiBase === \"string\" && nextclawProvider.apiBase.trim().length > 0\n ? nextclawProvider.apiBase.trim()\n : \"https://ai-gateway-api.nextclaw.io/v1\";\n const requestedApiBase =\n typeof opts.apiBase === \"string\" && opts.apiBase.trim().length > 0\n ? opts.apiBase.trim()\n : configuredApiBase;\n const { platformBase, v1Base, inputApiBase } = resolvePlatformApiBase({\n explicitApiBase: requestedApiBase,\n fallbackApiBase: \"https://ai-gateway-api.nextclaw.io/v1\"\n });\n return {\n configPath,\n config,\n providers,\n nextclawProvider,\n platformBase,\n v1Base,\n inputApiBase\n };\n}\n\nasync function resolveCredentials(opts: LoginCommandOptions): Promise<{ email: string; password: string }> {\n let email = typeof opts.email === \"string\" ? opts.email.trim() : \"\";\n let password = typeof opts.password === \"string\" ? opts.password : \"\";\n if (email && password) {\n return { email, password };\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n try {\n if (!email) {\n email = (await prompt(rl, \"Email: \")).trim();\n }\n if (!password) {\n password = await prompt(rl, \"Password: \");\n }\n } finally {\n rl.close();\n }\n\n if (!email || !password) {\n throw new Error(\"Email and password are required.\");\n }\n return { email, password };\n}\n\nfunction persistPlatformToken(params: {\n configPath: string;\n config: ReturnType<typeof loadConfig>;\n providers: Record<string, NextclawProviderConfig>;\n nextclawProvider: NextclawProviderConfig;\n v1Base: string;\n token: string;\n}): void {\n const { configPath, config, providers, nextclawProvider, v1Base, token } = params;\n nextclawProvider.apiBase = v1Base;\n nextclawProvider.apiKey = token;\n providers.nextclaw = nextclawProvider;\n saveConfig(config, configPath);\n}\n\nexport class PlatformAuthCommands {\n private shouldUseBrowserLogin = (opts: LoginCommandOptions): boolean => {\n const email = typeof opts.email === \"string\" ? opts.email.trim() : \"\";\n const password = typeof opts.password === \"string\" ? opts.password : \"\";\n return !email && !password;\n };\n\n private waitFor = async (delayMs: number): Promise<void> => {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n };\n\n private formatLoginDeadline = (expiresAt: string): string => {\n const value = Date.parse(expiresAt);\n return Number.isNaN(value) ? expiresAt : new Date(value).toLocaleString();\n };\n\n private printLoginSuccess = (result: PlatformLoginResult): void => {\n console.log(`✓ Logged in to NextClaw platform (${result.platformBase})`);\n console.log(`✓ Account: ${result.email} (${result.role})`);\n console.log(\"✓ Token saved into providers.nextclaw.apiKey\");\n };\n\n private printBrowserLoginIntro = (params: {\n verificationUri: string;\n expiresAt: string;\n open: boolean;\n openedBrowser: boolean;\n }): void => {\n const {\n expiresAt,\n open,\n openedBrowser,\n verificationUri\n } = params;\n const expiresText = this.formatLoginDeadline(expiresAt);\n console.log(\"NextClaw browser sign-in\");\n console.log(`Open this link to continue: ${verificationUri}`);\n if (open) {\n if (openedBrowser) {\n console.log(\"✓ Opened the default browser. Finish sign-in there and this terminal will complete automatically.\");\n } else {\n console.log(\"Browser did not open automatically. Open the link above in any browser to continue.\");\n }\n } else {\n console.log(\"Automatic browser opening is disabled. Open the link above in any browser to continue.\");\n }\n console.log(\"This link can be opened on this machine or on another device if your CLI is running remotely.\");\n console.log(`Waiting for authorization until ${expiresText}...`);\n };\n\n private waitForBrowserLoginResult = async (params: {\n apiBase?: string;\n sessionId: string;\n }): Promise<PlatformLoginResult> => {\n while (true) {\n const result = await this.pollBrowserAuth({\n apiBase: params.apiBase,\n sessionId: params.sessionId\n });\n if (result.status === \"pending\") {\n await this.waitFor(result.nextPollMs);\n continue;\n }\n if (result.status === \"expired\") {\n throw new Error(`${result.message} Run \\`nextclaw login\\` again to generate a new sign-in link.`);\n }\n return {\n token: result.token,\n role: result.role,\n email: result.email,\n platformBase: result.platformBase,\n v1Base: result.v1Base\n };\n }\n };\n\n private loginWithBrowserResult = async (opts: LoginCommandOptions = {}): Promise<PlatformLoginResult> => {\n const startResult = await this.startBrowserAuth({\n apiBase: opts.apiBase\n });\n const shouldOpenBrowser = opts.open !== false;\n const openedBrowser = shouldOpenBrowser ? openBrowser(startResult.verificationUri) : false;\n this.printBrowserLoginIntro({\n verificationUri: startResult.verificationUri,\n expiresAt: startResult.expiresAt,\n open: shouldOpenBrowser,\n openedBrowser\n });\n const result = await this.waitForBrowserLoginResult({\n apiBase: opts.apiBase,\n sessionId: startResult.sessionId\n });\n console.log(\"✓ Browser authorization completed.\");\n return result;\n };\n\n private readStoredToken = (params: { apiBase?: string } = {}): {\n configPath: string;\n config: ReturnType<typeof loadConfig>;\n providers: Record<string, NextclawProviderConfig>;\n nextclawProvider: NextclawProviderConfig;\n platformBase: string;\n v1Base: string;\n inputApiBase: string;\n token: string;\n } => {\n const resolved = resolveProviderConfig({ apiBase: params.apiBase });\n const token = resolved.nextclawProvider.apiKey?.trim() ?? \"\";\n if (!token) {\n throw new Error(\"Not logged in. Run `nextclaw login` first.\");\n }\n return {\n ...resolved,\n token\n };\n };\n\n loginResult = async (opts: LoginCommandOptions = {}): Promise<PlatformLoginResult> => {\n const { configPath, config, providers, nextclawProvider, platformBase, v1Base, inputApiBase } = resolveProviderConfig(opts);\n const { email, password } = await resolveCredentials(opts);\n const response = await fetch(`${platformBase}/platform/auth/login`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ email, password })\n });\n const raw = await response.text();\n\n if (!response.ok) {\n throw new Error(buildPlatformApiBaseErrorMessage(inputApiBase, readPlatformErrorMessage(raw, response.status)));\n }\n\n const { token, role } = readLoginPayload(raw);\n persistPlatformToken({\n configPath,\n config,\n providers,\n nextclawProvider,\n v1Base,\n token\n });\n\n return {\n token,\n role,\n email,\n platformBase,\n v1Base\n };\n };\n\n startBrowserAuth = async (opts: Pick<LoginCommandOptions, \"apiBase\"> = {}): Promise<PlatformBrowserAuthStartResult> => {\n const { platformBase, v1Base, inputApiBase } = resolveProviderConfig(opts);\n const response = await fetch(`${platformBase}/platform/auth/browser/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({})\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(buildPlatformApiBaseErrorMessage(inputApiBase, readPlatformErrorMessage(raw, response.status)));\n }\n const result = readBrowserAuthStartPayload(raw);\n return {\n ...result,\n platformBase,\n v1Base\n };\n };\n\n pollBrowserAuth = async (params: {\n apiBase?: string;\n sessionId: string;\n }): Promise<PlatformBrowserAuthPollResult> => {\n const { configPath, config, providers, nextclawProvider, platformBase, v1Base, inputApiBase } = resolveProviderConfig({\n apiBase: params.apiBase\n });\n const response = await fetch(`${platformBase}/platform/auth/browser/poll`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n sessionId: params.sessionId\n })\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(buildPlatformApiBaseErrorMessage(inputApiBase, readPlatformErrorMessage(raw, response.status)));\n }\n const result = readBrowserAuthPollPayload(raw);\n if (result.status === \"pending\") {\n return {\n status: \"pending\",\n nextPollMs: result.nextPollMs ?? 1500\n };\n }\n if (result.status === \"expired\") {\n return {\n status: \"expired\",\n message: result.message ?? \"Authorization session expired.\"\n };\n }\n\n persistPlatformToken({\n configPath,\n config,\n providers,\n nextclawProvider,\n v1Base,\n token: result.token ?? \"\"\n });\n return {\n status: \"authorized\",\n token: result.token ?? \"\",\n role: result.role ?? \"user\",\n email: result.email ?? \"\",\n platformBase,\n v1Base\n };\n };\n\n login = async (opts: LoginCommandOptions = {}): Promise<void> => {\n const result = this.shouldUseBrowserLogin(opts)\n ? await this.loginWithBrowserResult(opts)\n : await this.loginResult(opts);\n this.printLoginSuccess(result);\n };\n\n me = async (params: { apiBase?: string } = {}): Promise<PlatformMeResult> => {\n const { platformBase, v1Base, inputApiBase, token } = this.readStoredToken(params);\n const response = await fetch(`${platformBase}/platform/auth/me`, {\n headers: {\n Authorization: `Bearer ${token}`\n }\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(buildPlatformApiBaseErrorMessage(inputApiBase, readPlatformErrorMessage(raw, response.status)));\n }\n return {\n user: readPlatformUserPayload(raw),\n token,\n platformBase,\n v1Base\n };\n };\n\n updateProfile = async (params: { username: string; apiBase?: string }): Promise<PlatformMeResult> => {\n const {\n configPath,\n config,\n providers,\n nextclawProvider,\n platformBase,\n v1Base,\n inputApiBase,\n token\n } = this.readStoredToken(params);\n const response = await fetch(`${platformBase}/platform/auth/profile`, {\n method: \"PATCH\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n username: params.username\n })\n });\n const raw = await response.text();\n if (!response.ok) {\n throw new Error(buildPlatformApiBaseErrorMessage(inputApiBase, readPlatformErrorMessage(raw, response.status)));\n }\n const result = readPlatformAuthResultPayload(raw);\n persistPlatformToken({\n configPath,\n config,\n providers,\n nextclawProvider,\n v1Base,\n token: result.token\n });\n return {\n user: result.user,\n token: result.token,\n platformBase,\n v1Base\n };\n };\n\n logout = (): { cleared: boolean } => {\n const { configPath, config, providers, nextclawProvider } = resolveProviderConfig({});\n const cleared = Boolean(nextclawProvider.apiKey?.trim());\n nextclawProvider.apiKey = \"\";\n providers.nextclaw = nextclawProvider;\n saveConfig(config, configPath);\n return { cleared };\n };\n\n accountStatus = async (opts: AccountCommandOptions = {}): Promise<void> => {\n const result = await this.me({ apiBase: opts.apiBase });\n const view = toAccountStatusView(result);\n if (opts.json) {\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n printAccountStatus(view);\n };\n\n accountSetUsername = async (opts: AccountSetUsernameCommandOptions & { username: string }): Promise<void> => {\n const result = await this.updateProfile({\n apiBase: opts.apiBase,\n username: opts.username\n });\n const view = toAccountStatusView(result);\n if (opts.json) {\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n printUsernameUpdated(view);\n printAccountStatus(view);\n };\n}\n"],"mappings":"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"}
@@ -25,4 +25,5 @@ declare function readBrowserAuthPollPayload(raw: string): {
25
25
  message?: string;
26
26
  };
27
27
  //#endregion
28
- export { readBrowserAuthPollPayload, readBrowserAuthStartPayload, readLoginPayload, readPlatformAuthResultPayload, readPlatformErrorMessage, readPlatformUserPayload };
28
+ export { readBrowserAuthPollPayload, readBrowserAuthStartPayload, readLoginPayload, readPlatformAuthResultPayload, readPlatformErrorMessage, readPlatformUserPayload };
29
+ //# sourceMappingURL=payload.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.utils.d.ts","names":[],"sources":["../../../../src/commands/platform-auth/utils/payload.utils.ts"],"mappings":";;iBAEgB,gBAAA,CAAiB,GAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;AAAA,iBAQhD,uBAAA,CAAwB,GAAA,WAAc,gBAAA;AAAA,iBAyBtC,6BAAA,CAA8B,GAAA;EAAgB,KAAA;EAAe,IAAA,EAAM,gBAAA;AAAA;AAAA,iBAenE,wBAAA,CAAyB,GAAA,UAAa,cAAA;AAAA,iBAUtC,2BAAA,CAA4B,GAAA;EAC1C,SAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;AAAA;AAAA,iBAuBc,0BAAA,CAA2B,GAAA;EACzC,MAAA;EACA,UAAA;EACA,KAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;AAAA"}
@@ -85,3 +85,5 @@ function parseJsonText(raw) {
85
85
  }
86
86
  //#endregion
87
87
  export { readBrowserAuthPollPayload, readBrowserAuthStartPayload, readLoginPayload, readPlatformAuthResultPayload, readPlatformErrorMessage, readPlatformUserPayload };
88
+
89
+ //# sourceMappingURL=payload.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.utils.js","names":[],"sources":["../../../../src/commands/platform-auth/utils/payload.utils.ts"],"sourcesContent":["import type { PlatformUserView } from \"../index.js\";\n\nexport function readLoginPayload(raw: string): { token: string; role: string } {\n const authResult = readPlatformAuthResultPayload(raw);\n return {\n token: authResult.token,\n role: authResult.user.role\n };\n}\n\nexport function readPlatformUserPayload(raw: string): PlatformUserView {\n const parsed = parseJsonText(raw);\n const data = typeof parsed === \"object\" && parsed && \"data\" in parsed\n ? (parsed as { data?: Record<string, unknown> }).data\n : null;\n const user = typeof data?.user === \"object\" && data.user ? data.user as Record<string, unknown> : null;\n const id = typeof user?.id === \"string\" ? user.id.trim() : \"\";\n const email = typeof user?.email === \"string\" ? user.email.trim() : \"\";\n const role = typeof user?.role === \"string\" ? user.role.trim() : \"user\";\n const username = typeof user?.username === \"string\"\n ? user.username.trim()\n : user?.username === null\n ? null\n : null;\n if (!id || !email) {\n throw new Error(\"Platform user payload is incomplete.\");\n }\n return {\n id,\n email,\n username: username && username.length > 0 ? username : null,\n role\n };\n}\n\nexport function readPlatformAuthResultPayload(raw: string): { token: string; user: PlatformUserView } {\n const parsed = parseJsonText(raw);\n const token = typeof parsed === \"object\" &&\n parsed &&\n \"data\" in parsed &&\n typeof (parsed as { data?: { token?: unknown } }).data?.token === \"string\"\n ? (parsed as { data: { token: string } }).data.token\n : \"\";\n const user = readPlatformUserPayload(raw);\n if (!token) {\n throw new Error(\"Login succeeded but token is missing.\");\n }\n return { token, user };\n}\n\nexport function readPlatformErrorMessage(raw: string, fallbackStatus: number): string {\n const parsed = parseJsonText(raw);\n return typeof parsed === \"object\" &&\n parsed &&\n \"error\" in parsed &&\n typeof (parsed as { error?: { message?: unknown } }).error?.message === \"string\"\n ? (parsed as { error: { message: string } }).error.message\n : raw || `Request failed (${fallbackStatus})`;\n}\n\nexport function readBrowserAuthStartPayload(raw: string): {\n sessionId: string;\n verificationUri: string;\n expiresAt: string;\n intervalMs: number;\n} {\n const parsed = parseJsonText(raw);\n const data = typeof parsed === \"object\" && parsed && \"data\" in parsed\n ? (parsed as { data?: Record<string, unknown> }).data\n : null;\n const sessionId = typeof data?.sessionId === \"string\" ? data.sessionId.trim() : \"\";\n const verificationUri = typeof data?.verificationUri === \"string\" ? data.verificationUri.trim() : \"\";\n const expiresAt = typeof data?.expiresAt === \"string\" ? data.expiresAt.trim() : \"\";\n const intervalMs = typeof data?.intervalMs === \"number\" && Number.isFinite(data.intervalMs)\n ? Math.max(1000, Math.trunc(data.intervalMs))\n : 1500;\n if (!sessionId || !verificationUri || !expiresAt) {\n throw new Error(\"Browser authorization session payload is incomplete.\");\n }\n return {\n sessionId,\n verificationUri,\n expiresAt,\n intervalMs\n };\n}\n\nexport function readBrowserAuthPollPayload(raw: string): {\n status: \"pending\" | \"authorized\" | \"expired\";\n nextPollMs?: number;\n token?: string;\n role?: string;\n email?: string;\n message?: string;\n} {\n const parsed = parseJsonText(raw);\n const data = typeof parsed === \"object\" && parsed && \"data\" in parsed\n ? (parsed as { data?: Record<string, unknown> }).data\n : null;\n const status = typeof data?.status === \"string\" ? data.status.trim() : \"\";\n if (status === \"pending\") {\n return {\n status,\n nextPollMs: typeof data?.nextPollMs === \"number\" && Number.isFinite(data.nextPollMs)\n ? Math.max(1000, Math.trunc(data.nextPollMs))\n : 1500\n };\n }\n if (status === \"expired\") {\n return {\n status,\n message: typeof data?.message === \"string\" && data.message.trim()\n ? data.message.trim()\n : \"Authorization session expired.\"\n };\n }\n if (status !== \"authorized\") {\n throw new Error(\"Unexpected browser authorization status.\");\n }\n const token = typeof data?.token === \"string\" ? data.token.trim() : \"\";\n const user = typeof data?.user === \"object\" && data.user ? data.user as Record<string, unknown> : null;\n const role = typeof user?.role === \"string\" ? user.role.trim() : \"user\";\n const email = typeof user?.email === \"string\" ? user.email.trim() : \"\";\n if (!token || !email) {\n throw new Error(\"Authorized browser login payload is incomplete.\");\n }\n return {\n status,\n token,\n role,\n email\n };\n}\n\nfunction parseJsonText(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n"],"mappings":"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"}
@@ -25,4 +25,5 @@ declare class PluginCommands {
25
25
  private buildUninstallConfigPreview;
26
26
  }
27
27
  //#endregion
28
- export { PluginCommands, loadPluginRegistry, logPluginDiagnostics, mergePluginConfigView, toPluginConfigView };
28
+ export { PluginCommands, loadPluginRegistry, logPluginDiagnostics, mergePluginConfigView, toPluginConfigView };
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/commands/plugin/index.ts"],"mappings":";;;;;iBAmCgB,kBAAA,CAAmB,MAAA,EAAQ,MAAA,EAAQ,YAAA,WAAuB,cAAA;AAAA,iBAO1D,oBAAA,CAAqB,QAAA,EAAU,IAAA,CAAK,cAAA;AAAA,cAYvC,cAAA;EACX,IAAA,GAAQ,IAAA,GAAM,kBAAA;EAwDd,IAAA,GAAQ,EAAA,UAAY,IAAA,GAAM,kBAAA;EAgB1B,MAAA,GAAgB,EAAA,aAAa,OAAA;EAW7B,OAAA,GAAiB,EAAA,aAAa,OAAA;EAW9B,SAAA,GAAmB,EAAA,UAAY,IAAA,GAAM,uBAAA,KAA+B,OAAA;EAoCpE,OAAA,GAAiB,UAAA,UAAoB,IAAA,GAAM,qBAAA,KAA6B,OAAA;EAWxE,MAAA;EAAA,QA8BQ,YAAA;EAAA,QAeA,gBAAA;EAAA,QAWA,oBAAA;EAAA,QAaA,gBAAA;EAAA,QAcA,oBAAA;EAAA,QAeA,uBAAA;EAAA,QAeA,gBAAA;EAAA,QAMA,wBAAA;EAAA,QAkBA,qBAAA;EAAA,QAkBA,2BAAA;AAAA"}
@@ -252,3 +252,5 @@ var PluginCommands = class {
252
252
  };
253
253
  //#endregion
254
254
  export { PluginCommands, loadPluginRegistry, logPluginDiagnostics, mergePluginConfigView, toPluginConfigView };
255
+
256
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/commands/plugin/index.ts"],"sourcesContent":["import {\n buildPluginStatusReport,\n resolveUninstallDirectoryTargets,\n type PluginRegistry\n} from \"@nextclaw/openclaw-compat\";\nimport {\n appendPluginCapabilityLines,\n buildReservedPluginLoadOptions,\n} from \"./plugin-command.utils.js\";\nimport { ExtensionPluginRegistryService } from \"@nextclaw/kernel\";\nimport {\n loadConfig,\n type Config,\n getWorkspacePath\n} from \"@nextclaw/core\";\nimport { createInterface } from \"node:readline\";\nimport { resolve } from \"node:path\";\nimport type {\n PluginsInfoOptions,\n PluginsInstallOptions,\n PluginsListOptions,\n PluginsUninstallOptions\n} from \"../../shared/types/cli.types.js\";\nimport {\n disablePluginMutation,\n enablePluginMutation,\n installPluginMutation,\n uninstallPluginMutation,\n} from \"./plugin-mutation-actions.utils.js\";\nexport { mergePluginConfigView, toPluginConfigView } from \"@nextclaw/openclaw-compat\";\n\ntype PluginStatusReport = ReturnType<typeof buildPluginStatusReport>;\ntype PluginStatusEntry = PluginStatusReport[\"plugins\"][number];\ntype PluginInstallRecord = NonNullable<Config[\"plugins\"][\"installs\"]>[string];\n\nexport function loadPluginRegistry(config: Config, workspaceDir: string): PluginRegistry {\n return new ExtensionPluginRegistryService().load({\n config,\n workspace: workspaceDir,\n });\n}\n\nexport function logPluginDiagnostics(registry: Pick<PluginRegistry, \"diagnostics\">): void {\n for (const diag of registry.diagnostics) {\n const prefix = diag.pluginId ? `${diag.pluginId}: ` : \"\";\n const text = `${prefix}${diag.message}`;\n if (diag.level === \"error\") {\n console.error(`[plugins] ${text}`);\n } else {\n console.warn(`[plugins] ${text}`);\n }\n };\n}\n\nexport class PluginCommands {\n list = (opts: PluginsListOptions = {}): void => {\n const { report, workspaceDir } = this.loadStatusReport();\n\n const list = opts.enabled ? report.plugins.filter((plugin) => plugin.status === \"loaded\") : report.plugins;\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n workspaceDir,\n plugins: list,\n diagnostics: report.diagnostics\n },\n null,\n 2\n )\n );\n return;\n }\n\n if (list.length === 0) {\n console.log(\"No plugins discovered.\");\n return;\n }\n\n for (const plugin of list) {\n const status = plugin.status === \"loaded\" ? \"loaded\" : plugin.status === \"disabled\" ? \"disabled\" : \"error\";\n const title = plugin.name && plugin.name !== plugin.id ? `${plugin.name} (${plugin.id})` : plugin.id;\n if (!opts.verbose) {\n const desc = plugin.description\n ? plugin.description.length > 80\n ? `${plugin.description.slice(0, 77)}...`\n : plugin.description\n : \"(no description)\";\n console.log(`${title} ${status} - ${desc}`);\n continue;\n }\n\n console.log(`${title} ${status}`);\n console.log(` source: ${plugin.source}`);\n console.log(` origin: ${plugin.origin}`);\n if (plugin.version) {\n console.log(` version: ${plugin.version}`);\n }\n const capabilityLines: string[] = [];\n appendPluginCapabilityLines(capabilityLines, plugin);\n for (const line of capabilityLines) {\n console.log(` ${line.toLowerCase()}`);\n }\n if (plugin.error) {\n console.log(` error: ${plugin.error}`);\n }\n console.log(\"\");\n }\n };\n\n info = (id: string, opts: PluginsInfoOptions = {}): void => {\n const { config, report } = this.loadStatusReport();\n const plugin = report.plugins.find((entry) => entry.id === id || entry.name === id);\n if (!plugin) {\n console.error(`Plugin not found: ${id}`);\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(plugin, null, 2));\n return;\n }\n\n console.log(this.buildPluginInfoLines(plugin, config).join(\"\\n\"));\n };\n\n enable = async (id: string): Promise<void> => {\n try {\n const result = await enablePluginMutation(id);\n console.log(result.message);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n console.log(\"If gateway is running, plugin changes are hot-applied automatically.\");\n };\n\n disable = async (id: string): Promise<void> => {\n try {\n const result = await disablePluginMutation(id);\n console.log(result.message);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n console.log(\"If gateway is running, plugin changes are hot-applied automatically.\");\n };\n\n uninstall = async (id: string, opts: PluginsUninstallOptions = {}): Promise<void> => {\n if (opts.keepConfig) {\n console.log(\"`--keep-config` is deprecated, use `--keep-files`.\");\n }\n\n const { config, report } = this.loadStatusReport();\n\n const keepFiles = Boolean(opts.keepFiles || opts.keepConfig);\n const plugin = report.plugins.find((entry) => entry.id === id || entry.name === id);\n const pluginId = plugin?.id ?? id;\n\n const hasEntry = pluginId in (config.plugins.entries ?? {});\n const hasInstall = pluginId in (config.plugins.installs ?? {});\n\n this.assertPluginCanUninstall(id, pluginId, plugin, hasEntry, hasInstall);\n\n const install = config.plugins.installs?.[pluginId];\n const preview = this.buildUninstallPreview({ config, hasEntry, hasInstall, install, keepFiles, pluginId });\n\n const pluginName = plugin?.name || pluginId;\n const pluginTitle = pluginName !== pluginId ? `${pluginName} (${pluginId})` : pluginName;\n console.log(`Plugin: ${pluginTitle}`);\n console.log(`Will remove: ${preview.length > 0 ? preview.join(\", \") : \"(nothing)\"}`);\n\n if (opts.dryRun) {\n console.log(\"Dry run, no changes made.\");\n return;\n }\n\n if (!(await this.confirmUninstall(pluginId, opts))) {\n return;\n }\n await this.runUninstallMutation(id, opts);\n console.log(\"If gateway is running, plugin changes are hot-applied automatically.\");\n };\n\n install = async (pathOrSpec: string, opts: PluginsInstallOptions = {}): Promise<void> => {\n try {\n const result = await installPluginMutation(pathOrSpec, opts);\n console.log(result.message);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n console.log(\"If gateway is running, plugin changes are hot-applied automatically.\");\n };\n\n doctor = (): void => {\n const { report } = this.loadStatusReport();\n\n const pluginErrors = report.plugins.filter((plugin) => plugin.status === \"error\");\n const diagnostics = report.diagnostics.filter((diag) => diag.level === \"error\");\n\n if (pluginErrors.length === 0 && diagnostics.length === 0) {\n console.log(\"No plugin issues detected.\");\n return;\n }\n\n if (pluginErrors.length > 0) {\n console.log(\"Plugin errors:\");\n for (const entry of pluginErrors) {\n console.log(`- ${entry.id}: ${entry.error ?? \"failed to load\"} (${entry.source})`);\n }\n }\n\n if (diagnostics.length > 0) {\n if (pluginErrors.length > 0) {\n console.log(\"\");\n }\n console.log(\"Diagnostics:\");\n for (const diag of diagnostics) {\n const prefix = diag.pluginId ? `${diag.pluginId}: ` : \"\";\n console.log(`- ${prefix}${diag.message}`);\n }\n }\n };\n\n private confirmYesNo = async (question: string): Promise<boolean> => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(`${question} [y/N] `, (line) => resolve(line));\n });\n\n rl.close();\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n };\n\n private confirmUninstall = async (pluginId: string, opts: PluginsUninstallOptions): Promise<boolean> => {\n if (opts.force) {\n return true;\n }\n const confirmed = await this.confirmYesNo(`Uninstall plugin \"${pluginId}\"?`);\n if (!confirmed) {\n console.log(\"Cancelled.\");\n }\n return confirmed;\n };\n\n private runUninstallMutation = async (id: string, opts: PluginsUninstallOptions): Promise<void> => {\n try {\n const result = await uninstallPluginMutation(id, opts);\n for (const warning of result.warnings) {\n console.warn(warning);\n }\n console.log(result.message);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n };\n\n private loadStatusReport = (): { config: Config; report: PluginStatusReport; workspaceDir: string } => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n return {\n config,\n workspaceDir,\n report: buildPluginStatusReport({\n config,\n workspaceDir,\n ...buildReservedPluginLoadOptions()\n })\n };\n };\n\n private buildPluginInfoLines = (plugin: PluginStatusEntry, config: Config): string[] => {\n const install = config.plugins.installs?.[plugin.id];\n const lines = this.buildPluginSummaryLines(plugin);\n if (install) {\n lines.push(\"\");\n lines.push(`Install: ${install.source}`);\n this.pushOptionalLine(lines, \"Spec\", install.spec);\n this.pushOptionalLine(lines, \"Source path\", install.sourcePath);\n this.pushOptionalLine(lines, \"Install path\", install.installPath);\n this.pushOptionalLine(lines, \"Recorded version\", install.version);\n this.pushOptionalLine(lines, \"Installed at\", install.installedAt);\n }\n return lines;\n };\n\n private buildPluginSummaryLines = (plugin: PluginStatusEntry): string[] => {\n const lines = [plugin.name || plugin.id];\n if (plugin.name && plugin.name !== plugin.id) {\n lines.push(`id: ${plugin.id}`);\n }\n if (plugin.description) {\n lines.push(plugin.description);\n }\n lines.push(\"\", `Status: ${plugin.status}`, `Source: ${plugin.source}`, `Origin: ${plugin.origin}`);\n this.pushOptionalLine(lines, \"Version\", plugin.version);\n appendPluginCapabilityLines(lines, plugin);\n this.pushOptionalLine(lines, \"Error\", plugin.error);\n return lines;\n };\n\n private pushOptionalLine = (lines: string[], label: string, value: string | undefined): void => {\n if (value) {\n lines.push(`${label}: ${value}`);\n }\n };\n\n private assertPluginCanUninstall = (\n requestedId: string,\n pluginId: string,\n plugin: PluginStatusEntry | undefined,\n hasEntry: boolean,\n hasInstall: boolean,\n ): void => {\n if (hasEntry || hasInstall) {\n return;\n }\n if (plugin) {\n console.error(`Plugin \"${pluginId}\" is not managed by plugins config/install records and cannot be uninstalled.`);\n } else {\n console.error(`Plugin not found: ${requestedId}`);\n }\n process.exit(1);\n };\n\n private buildUninstallPreview = (params: {\n config: Config;\n pluginId: string;\n hasEntry: boolean;\n hasInstall: boolean;\n keepFiles: boolean;\n install: PluginInstallRecord | undefined;\n }): string[] => {\n const { config, hasEntry, hasInstall, install, keepFiles, pluginId } = params;\n const preview = this.buildUninstallConfigPreview({ config, hasEntry, hasInstall, install, pluginId });\n if (!keepFiles) {\n for (const deleteTarget of resolveUninstallDirectoryTargets({ config, pluginId, hasInstall, installRecord: install })) {\n preview.push(`directory: ${deleteTarget}`);\n }\n }\n return preview;\n };\n\n private buildUninstallConfigPreview = (params: {\n config: Config;\n pluginId: string;\n hasEntry: boolean;\n hasInstall: boolean;\n install: PluginInstallRecord | undefined;\n }): string[] => {\n const { config, hasEntry, hasInstall, install, pluginId } = params;\n const preview: string[] = [];\n const isLinked =\n install?.source === \"path\" &&\n (!install.installPath || !install.sourcePath || resolve(install.installPath) === resolve(install.sourcePath));\n if (hasEntry) {\n preview.push(\"config entry\");\n }\n if (hasInstall) {\n preview.push(\"install record\");\n }\n if (config.plugins.allow?.includes(pluginId)) {\n preview.push(\"allowlist entry\");\n }\n if (isLinked && install?.sourcePath && config.plugins.load?.paths?.includes(install.sourcePath)) {\n preview.push(\"load path\");\n }\n return preview;\n };\n}\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { PluginRegistry } from "@nextclaw/openclaw-compat";
2
2
 
3
3
  //#region src/commands/plugin/plugin-command.utils.d.ts
4
- declare const RESERVED_PROVIDER_IDS: any;
4
+ declare const RESERVED_PROVIDER_IDS: string[];
5
5
  declare function buildReservedPluginLoadOptions(): {
6
6
  reservedToolNames: ("read_file" | "write_file" | "edit_file" | "list_dir" | "exec" | "web_search" | "web_fetch" | "message" | "spawn" | "sessions_list" | "sessions_history" | "memory_search" | "memory_get" | "subagents" | "gateway" | "cron")[];
7
7
  reservedChannelIds: string[];
8
- reservedProviderIds: any;
8
+ reservedProviderIds: string[];
9
9
  };
10
10
  declare function appendPluginCapabilityLines(lines: string[], plugin: PluginRegistry["plugins"][number]): void;
11
11
  //#endregion
12
- export { RESERVED_PROVIDER_IDS, appendPluginCapabilityLines, buildReservedPluginLoadOptions };
12
+ export { RESERVED_PROVIDER_IDS, appendPluginCapabilityLines, buildReservedPluginLoadOptions };
13
+ //# sourceMappingURL=plugin-command.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-command.utils.d.ts","names":[],"sources":["../../../src/commands/plugin/plugin-command.utils.ts"],"mappings":";;;cAGa,qBAAA;AAAA,iBAqBG,8BAAA,CAAA;;;;;iBAQA,2BAAA,CAA4B,KAAA,YAAiB,MAAA,EAAQ,cAAA"}
@@ -33,3 +33,5 @@ function appendPluginCapabilityLines(lines, plugin) {
33
33
  }
34
34
  //#endregion
35
35
  export { RESERVED_PROVIDER_IDS, appendPluginCapabilityLines, buildReservedPluginLoadOptions };
36
+
37
+ //# sourceMappingURL=plugin-command.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-command.utils.js","names":[],"sources":["../../../src/commands/plugin/plugin-command.utils.ts"],"sourcesContent":["import { builtinProviderIds } from \"@nextclaw/runtime\";\nimport type { PluginRegistry } from \"@nextclaw/openclaw-compat\";\n\nexport const RESERVED_PROVIDER_IDS = builtinProviderIds();\n\nconst RESERVED_TOOL_NAMES = [\n \"read_file\",\n \"write_file\",\n \"edit_file\",\n \"list_dir\",\n \"exec\",\n \"web_search\",\n \"web_fetch\",\n \"message\",\n \"spawn\",\n \"sessions_list\",\n \"sessions_history\",\n \"memory_search\",\n \"memory_get\",\n \"subagents\",\n \"gateway\",\n \"cron\",\n] as const;\n\nexport function buildReservedPluginLoadOptions() {\n return {\n reservedToolNames: [...RESERVED_TOOL_NAMES],\n reservedChannelIds: [] as string[],\n reservedProviderIds: RESERVED_PROVIDER_IDS,\n };\n}\n\nexport function appendPluginCapabilityLines(lines: string[], plugin: PluginRegistry[\"plugins\"][number]): void {\n if (plugin.toolNames.length > 0) {\n lines.push(`Tools: ${plugin.toolNames.join(\", \")}`);\n }\n if (plugin.channelIds.length > 0) {\n lines.push(`Channels: ${plugin.channelIds.join(\", \")}`);\n }\n if (plugin.providerIds.length > 0) {\n lines.push(`Providers: ${plugin.providerIds.join(\", \")}`);\n }\n}\n"],"mappings":";;AAGA,MAAa,wBAAwB,oBAAoB;AAEzD,MAAM,sBAAsB;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,iCAAiC;AAC/C,QAAO;EACL,mBAAmB,CAAC,GAAG,oBAAoB;EAC3C,oBAAoB,EAAE;EACtB,qBAAqB;EACtB;;AAGH,SAAgB,4BAA4B,OAAiB,QAAiD;AAC5G,KAAI,OAAO,UAAU,SAAS,EAC5B,OAAM,KAAK,UAAU,OAAO,UAAU,KAAK,KAAK,GAAG;AAErD,KAAI,OAAO,WAAW,SAAS,EAC7B,OAAM,KAAK,aAAa,OAAO,WAAW,KAAK,KAAK,GAAG;AAEzD,KAAI,OAAO,YAAY,SAAS,EAC9B,OAAM,KAAK,cAAc,OAAO,YAAY,KAAK,KAAK,GAAG"}
@@ -12,4 +12,5 @@ declare function disablePluginMutation(id: string): Promise<PluginMutationResult
12
12
  declare function uninstallPluginMutation(id: string, opts?: PluginsUninstallOptions): Promise<PluginUninstallMutationResult>;
13
13
  declare function installPluginMutation(pathOrSpec: string, opts?: PluginsInstallOptions): Promise<PluginMutationResult>;
14
14
  //#endregion
15
- export { PluginMutationResult, PluginUninstallMutationResult, disablePluginMutation, enablePluginMutation, installPluginMutation, uninstallPluginMutation };
15
+ export { PluginMutationResult, PluginUninstallMutationResult, disablePluginMutation, enablePluginMutation, installPluginMutation, uninstallPluginMutation };
16
+ //# sourceMappingURL=plugin-mutation-actions.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-mutation-actions.utils.d.ts","names":[],"sources":["../../../src/commands/plugin/plugin-mutation-actions.utils.ts"],"mappings":";;;KAgBY,oBAAA;EACV,OAAA;AAAA;AAAA,KAGU,6BAAA,GAAgC,oBAAA;EAC1C,QAAA;AAAA;AAAA,iBA+JoB,oBAAA,CAAqB,EAAA,WAAa,OAAA,CAAQ,oBAAA;AAAA,iBAS1C,qBAAA,CAAsB,EAAA,WAAa,OAAA,CAAQ,oBAAA;AAAA,iBAS3C,uBAAA,CACpB,EAAA,UACA,IAAA,GAAM,uBAAA,GACL,OAAA,CAAQ,6BAAA;AAAA,iBA4DW,qBAAA,CACpB,UAAA,UACA,IAAA,GAAM,qBAAA,GACL,OAAA,CAAQ,oBAAA"}
@@ -160,3 +160,5 @@ async function installPluginMutation(pathOrSpec, opts = {}) {
160
160
  }
161
161
  //#endregion
162
162
  export { disablePluginMutation, enablePluginMutation, installPluginMutation, uninstallPluginMutation };
163
+
164
+ //# sourceMappingURL=plugin-mutation-actions.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-mutation-actions.utils.js","names":[],"sources":["../../../src/commands/plugin/plugin-mutation-actions.utils.ts"],"sourcesContent":["import {\n addPluginLoadPath,\n buildPluginStatusReport,\n disablePluginInConfig,\n enablePluginInConfig,\n installPluginFromNpmSpec,\n installPluginFromPath,\n recordPluginInstall,\n uninstallPlugin,\n} from \"@nextclaw/openclaw-compat\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { expandHome, getWorkspacePath, loadConfig, saveConfig } from \"@nextclaw/core\";\nimport { buildReservedPluginLoadOptions } from \"./plugin-command.utils.js\";\nimport type { PluginsInstallOptions, PluginsUninstallOptions } from \"../../shared/types/cli.types.js\";\n\nexport type PluginMutationResult = {\n message: string;\n};\n\nexport type PluginUninstallMutationResult = PluginMutationResult & {\n warnings: string[];\n};\n\nconst pluginInstallLogger = {\n info: (message: string) => console.log(message),\n warn: (message: string) => console.warn(message)\n};\n\nfunction resolveFileNpmSpecToLocalPath(\n raw: string,\n): { ok: true; path: string } | { ok: false; error: string } | null {\n const trimmed = raw.trim();\n if (!trimmed.toLowerCase().startsWith(\"file:\")) {\n return null;\n }\n const rest = trimmed.slice(\"file:\".length);\n if (!rest) {\n return { ok: false, error: \"unsupported file: spec: missing path\" };\n }\n if (rest.startsWith(\"///\")) {\n return { ok: true, path: rest.slice(2) };\n }\n if (rest.startsWith(\"//localhost/\")) {\n return { ok: true, path: rest.slice(\"//localhost\".length) };\n }\n if (rest.startsWith(\"//\")) {\n return {\n ok: false,\n error: 'unsupported file: URL host (expected \"file:<path>\" or \"file:///abs/path\")'\n };\n }\n return { ok: true, path: rest };\n}\n\nfunction looksLikePath(raw: string): boolean {\n return (\n raw.startsWith(\".\") ||\n raw.startsWith(\"~\") ||\n raw.startsWith(\"/\") ||\n raw.endsWith(\".ts\") ||\n raw.endsWith(\".js\") ||\n raw.endsWith(\".mjs\") ||\n raw.endsWith(\".cjs\") ||\n raw.endsWith(\".tgz\") ||\n raw.endsWith(\".tar.gz\") ||\n raw.endsWith(\".tar\") ||\n raw.endsWith(\".zip\")\n );\n}\n\nfunction isArchivePath(filePath: string): boolean {\n const lower = filePath.toLowerCase();\n return lower.endsWith(\".zip\") || lower.endsWith(\".tgz\") || lower.endsWith(\".tar.gz\") || lower.endsWith(\".tar\");\n}\n\nfunction saveLinkedPluginInstall(\n config: ReturnType<typeof loadConfig>,\n params: {\n resolvedPath: string;\n pluginId: string;\n version?: string | null;\n },\n): PluginMutationResult {\n let next = addPluginLoadPath(config, params.resolvedPath);\n next = enablePluginInConfig(next, params.pluginId);\n next = recordPluginInstall(next, {\n pluginId: params.pluginId,\n source: \"path\",\n sourcePath: params.resolvedPath,\n installPath: params.resolvedPath,\n version: params.version ?? undefined\n });\n saveConfig(next);\n return {\n message: `Linked plugin path: ${params.resolvedPath}`,\n };\n}\n\nfunction saveInstalledPluginResult(\n config: ReturnType<typeof loadConfig>,\n params: {\n pluginId: string;\n installPath: string;\n version?: string | null;\n source: \"archive\" | \"path\" | \"npm\";\n sourcePath?: string;\n spec?: string;\n },\n): PluginMutationResult {\n let next = enablePluginInConfig(config, params.pluginId);\n next = recordPluginInstall(next, {\n pluginId: params.pluginId,\n source: params.source,\n sourcePath: params.sourcePath,\n spec: params.spec,\n installPath: params.installPath,\n version: params.version ?? undefined\n });\n saveConfig(next);\n return {\n message: `Installed plugin: ${params.pluginId}`,\n };\n}\n\nasync function installPluginFromLocalPath(\n config: ReturnType<typeof loadConfig>,\n resolvedPath: string,\n link: boolean,\n): Promise<PluginMutationResult> {\n if (link) {\n const probe = await installPluginFromPath({ path: resolvedPath, dryRun: true });\n if (!probe.ok) {\n throw new Error(probe.error);\n }\n return saveLinkedPluginInstall(config, {\n resolvedPath,\n pluginId: probe.pluginId,\n version: probe.version\n });\n }\n\n const result = await installPluginFromPath({\n path: resolvedPath,\n logger: pluginInstallLogger\n });\n if (!result.ok) {\n throw new Error(result.error);\n }\n\n return saveInstalledPluginResult(config, {\n pluginId: result.pluginId,\n source: isArchivePath(resolvedPath) ? \"archive\" : \"path\",\n sourcePath: resolvedPath,\n installPath: result.targetDir,\n version: result.version\n });\n}\n\nasync function installPluginFromRegistrySpec(\n config: ReturnType<typeof loadConfig>,\n spec: string,\n): Promise<PluginMutationResult> {\n const result = await installPluginFromNpmSpec({\n spec,\n logger: pluginInstallLogger\n });\n if (!result.ok) {\n throw new Error(result.error);\n }\n\n return saveInstalledPluginResult(config, {\n pluginId: result.pluginId,\n source: \"npm\",\n spec,\n installPath: result.targetDir,\n version: result.version\n });\n}\n\nexport async function enablePluginMutation(id: string): Promise<PluginMutationResult> {\n const config = loadConfig();\n const next = enablePluginInConfig(config, id);\n saveConfig(next);\n return {\n message: `Enabled plugin \"${id}\".`,\n };\n}\n\nexport async function disablePluginMutation(id: string): Promise<PluginMutationResult> {\n const config = loadConfig();\n const next = disablePluginInConfig(config, id);\n saveConfig(next);\n return {\n message: `Disabled plugin \"${id}\".`,\n };\n}\n\nexport async function uninstallPluginMutation(\n id: string,\n opts: PluginsUninstallOptions = {},\n): Promise<PluginUninstallMutationResult> {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const report = buildPluginStatusReport({\n config,\n workspaceDir,\n ...buildReservedPluginLoadOptions()\n });\n\n const keepFiles = Boolean(opts.keepFiles || opts.keepConfig);\n const plugin = report.plugins.find((entry) => entry.id === id || entry.name === id);\n const pluginId = plugin?.id ?? id;\n\n const hasEntry = pluginId in (config.plugins.entries ?? {});\n const hasInstall = pluginId in (config.plugins.installs ?? {});\n\n if (!hasEntry && !hasInstall) {\n if (plugin) {\n throw new Error(\n `Plugin \"${pluginId}\" is not managed by plugins config/install records and cannot be uninstalled.`,\n );\n }\n throw new Error(`Plugin not found: ${id}`);\n }\n\n const result = await uninstallPlugin({\n config,\n pluginId,\n deleteFiles: !keepFiles\n });\n\n if (!result.ok) {\n throw new Error(result.error);\n }\n\n saveConfig(result.config);\n\n const removed: string[] = [];\n if (result.actions.entry) {\n removed.push(\"config entry\");\n }\n if (result.actions.install) {\n removed.push(\"install record\");\n }\n if (result.actions.allowlist) {\n removed.push(\"allowlist\");\n }\n if (result.actions.loadPath) {\n removed.push(\"load path\");\n }\n if (result.actions.directory) {\n removed.push(\"directory\");\n }\n\n return {\n message: `Uninstalled plugin \"${pluginId}\". Removed: ${removed.length > 0 ? removed.join(\", \") : \"nothing\"}.`,\n warnings: result.warnings,\n };\n}\n\nexport async function installPluginMutation(\n pathOrSpec: string,\n opts: PluginsInstallOptions = {},\n): Promise<PluginMutationResult> {\n const fileSpec = resolveFileNpmSpecToLocalPath(pathOrSpec);\n if (fileSpec && !fileSpec.ok) {\n throw new Error(fileSpec.error);\n }\n const normalized = fileSpec && fileSpec.ok ? fileSpec.path : pathOrSpec;\n const resolved = resolve(expandHome(normalized));\n const config = loadConfig();\n\n if (existsSync(resolved)) {\n return installPluginFromLocalPath(config, resolved, Boolean(opts.link));\n }\n\n if (opts.link) {\n throw new Error(\"`--link` requires a local path.\");\n }\n\n if (looksLikePath(pathOrSpec)) {\n throw new Error(`Path not found: ${resolved}`);\n }\n\n return installPluginFromRegistrySpec(config, pathOrSpec);\n}\n"],"mappings":"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"}
@@ -44,4 +44,5 @@ declare class RemoteCommands {
44
44
  doctor(opts?: RemoteDoctorCommandOptions): Promise<void>;
45
45
  }
46
46
  //#endregion
47
- export { RemoteCommandDoctorCheck, RemoteCommandDoctorView, RemoteCommandStatusView, RemoteCommands, buildNextclawConfiguredRemoteState, buildPlatformApiBaseErrorMessage, createNextclawRemoteConnector, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, resolveNextclawRemoteStatusSnapshot, resolvePlatformApiBase };
47
+ export { RemoteCommandDoctorCheck, RemoteCommandDoctorView, RemoteCommandStatusView, RemoteCommands, buildNextclawConfiguredRemoteState, buildPlatformApiBaseErrorMessage, createNextclawRemoteConnector, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, resolveNextclawRemoteStatusSnapshot, resolvePlatformApiBase };
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/commands/remote/index.ts"],"mappings":";;;;;;KAyBK,kBAAA;EACH,OAAA;EACA,MAAA,EAAQ,MAAA;AAAA;AAAA,KAGE,uBAAA;EACV,iBAAA;EACA,OAAA,EAAS,oBAAA;EACT,WAAA;EACA,UAAA;EACA,YAAA;AAAA;AAAA,KAGU,wBAAA;EACV,IAAA;EACA,EAAA;EACA,MAAA;AAAA;AAAA,KAGU,uBAAA;EACV,WAAA;EACA,MAAA,EAAQ,wBAAA;EACR,QAAA,EAAU,oBAAA;AAAA;AAAA,cA4DC,cAAA;EAAA,iBACkB,IAAA;cAAA,IAAA;IAAQ,kBAAA;EAAA;EAErC,YAAA,CAAa,MAAA;IACX,OAAA;IACA,OAAA;IACA,IAAA;EAAA,IACO,kBAAA;EA0BT,YAAA,CAAa,IAAA,GAAM,0BAAA,GAAkC,kBAAA;EAQrD,aAAA,CAAA,GAAiB,kBAAA;EAIX,OAAA,CAAQ,IAAA,GAAM,2BAAA,GAAmC,OAAA;EAQvD,aAAA,CAAA,GAAiB,uBAAA;EAoBX,MAAA,CAAO,IAAA,GAAM,0BAAA,GAAkC,OAAA;EA2B/C,aAAA,CAAA,GAAiB,OAAA,CAAQ,uBAAA;EA0CzB,MAAA,CAAO,IAAA,GAAM,0BAAA,GAAkC,OAAA;AAAA"}
@@ -172,3 +172,5 @@ var RemoteCommands = class {
172
172
  };
173
173
  //#endregion
174
174
  export { RemoteCommands, buildNextclawConfiguredRemoteState, buildPlatformApiBaseErrorMessage, createNextclawRemoteConnector, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, resolveNextclawRemoteStatusSnapshot, resolvePlatformApiBase };
175
+
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/commands/remote/index.ts"],"sourcesContent":["import { getConfigPath, loadConfig, saveConfig, type Config } from \"@nextclaw/core\";\nimport {\n readPlatformSessionTokenState,\n type RemoteConnectCommandOptions,\n type RemoteDoctorCommandOptions,\n type RemoteEnableCommandOptions,\n type RemoteStatusCommandOptions,\n type RemoteStatusSnapshot\n} from \"@nextclaw/remote\";\nimport { hostname } from \"node:os\";\nimport { localUiDiscoveryService } from \"@nextclaw-service/shared/services/ui/local-ui-discovery.service.js\";\nimport { createNextclawRemoteConnector, resolveNextclawRemoteStatusSnapshot } from \"./utils/remote-runtime-support.utils.js\";\n\nexport {\n buildNextclawConfiguredRemoteState,\n createNextclawRemoteConnector,\n createNextclawRemoteStatusStore,\n hasRunningNextclawManagedService,\n resolveNextclawRemoteStatusSnapshot\n} from \"./utils/remote-runtime-support.utils.js\";\nexport {\n buildPlatformApiBaseErrorMessage,\n resolvePlatformApiBase\n} from \"./utils/platform-api-base.utils.js\";\n\ntype RemoteConfigChange = {\n changed: boolean;\n config: Config;\n};\n\nexport type RemoteCommandStatusView = {\n configuredEnabled: boolean;\n runtime: RemoteStatusSnapshot[\"runtime\"];\n localOrigin: string;\n deviceName: string;\n platformBase: string | null;\n};\n\nexport type RemoteCommandDoctorCheck = {\n name: string;\n ok: boolean;\n detail: string;\n};\n\nexport type RemoteCommandDoctorView = {\n generatedAt: string;\n checks: RemoteCommandDoctorCheck[];\n snapshot: RemoteStatusSnapshot;\n};\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveConfiguredLocalOrigin(config: Config): string {\n return localUiDiscoveryService.resolveLocalOrigin(config);\n}\n\nasync function probeLocalUi(localOrigin: string): Promise<{ ok: boolean; detail: string }> {\n try {\n const response = await fetch(`${localOrigin}/api/health`);\n if (!response.ok) {\n return { ok: false, detail: `health returned ${response.status}` };\n }\n return { ok: true, detail: \"health endpoint returned ok\" };\n } catch (error) {\n return {\n ok: false,\n detail: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nfunction describePlatformTokenCheck(token: string | undefined): RemoteCommandDoctorCheck {\n const tokenState = readPlatformSessionTokenState(token);\n if (tokenState.valid) {\n return {\n name: \"platform-token\",\n ok: true,\n detail: \"platform session token configured\"\n };\n }\n if (tokenState.reason === \"expired\") {\n return {\n name: \"platform-token\",\n ok: false,\n detail: 'platform session token expired; run remote browser login or \"nextclaw login\" again'\n };\n }\n if (tokenState.reason === \"malformed\") {\n return {\n name: \"platform-token\",\n ok: false,\n detail: 'platform session token invalid; run remote browser login or \"nextclaw login\" again'\n };\n }\n return {\n name: \"platform-token\",\n ok: false,\n detail: 'run remote browser login or \"nextclaw login\" first'\n };\n}\n\nexport class RemoteCommands {\n constructor(private readonly deps: { currentLocalOrigin?: string } = {}) {}\n\n updateConfig(params: {\n enabled?: boolean;\n apiBase?: string;\n name?: string;\n } = {}): RemoteConfigChange {\n const config = loadConfig(getConfigPath());\n const nextEnabled = typeof params.enabled === \"boolean\" ? params.enabled : config.remote.enabled;\n const nextPlatformApiBase =\n typeof params.apiBase === \"string\" ? params.apiBase.trim() : config.remote.platformApiBase;\n const nextDeviceName =\n typeof params.name === \"string\" ? params.name.trim() : config.remote.deviceName;\n const next: Config = {\n ...config,\n remote: {\n ...config.remote,\n enabled: nextEnabled,\n platformApiBase: nextPlatformApiBase,\n deviceName: nextDeviceName\n }\n };\n saveConfig(next);\n return {\n changed:\n config.remote.enabled !== next.remote.enabled ||\n config.remote.platformApiBase !== next.remote.platformApiBase ||\n config.remote.deviceName !== next.remote.deviceName,\n config: next\n };\n }\n\n enableConfig(opts: RemoteEnableCommandOptions = {}): RemoteConfigChange {\n return this.updateConfig({\n enabled: true,\n apiBase: typeof opts.apiBase === \"string\" ? opts.apiBase : undefined,\n name: typeof opts.name === \"string\" ? opts.name : undefined\n });\n }\n\n disableConfig(): RemoteConfigChange {\n return this.updateConfig({ enabled: false });\n }\n\n async connect(opts: RemoteConnectCommandOptions = {}): Promise<void> {\n const connector = createNextclawRemoteConnector();\n await connector.run({\n ...opts,\n mode: \"foreground\"\n });\n }\n\n getStatusView(): RemoteCommandStatusView {\n const config = loadConfig(getConfigPath());\n const snapshot = resolveNextclawRemoteStatusSnapshot(config);\n const resolvedLocalOrigin =\n snapshot.runtime?.localOrigin ??\n this.deps.currentLocalOrigin ??\n resolveConfiguredLocalOrigin(config);\n return {\n configuredEnabled: snapshot.configuredEnabled,\n runtime: snapshot.runtime,\n localOrigin: resolvedLocalOrigin,\n deviceName: snapshot.runtime?.deviceName ?? normalizeOptionalString(config.remote.deviceName) ?? hostname(),\n platformBase:\n snapshot.runtime?.platformBase ??\n normalizeOptionalString(config.remote.platformApiBase) ??\n normalizeOptionalString(config.providers.nextclaw?.apiBase) ??\n null\n };\n }\n\n async status(opts: RemoteStatusCommandOptions = {}): Promise<void> {\n const view = this.getStatusView();\n\n if (opts.json) {\n console.log(JSON.stringify(view, null, 2));\n return;\n }\n\n const runtime = view.runtime;\n console.log(\"NextClaw Remote Status\");\n console.log(`Enabled: ${view.configuredEnabled ? \"yes\" : \"no\"}`);\n console.log(`Mode: ${runtime?.mode ?? \"service\"}`);\n console.log(`State: ${runtime?.state ?? \"disabled\"}`);\n console.log(`Device: ${view.deviceName}`);\n console.log(`Platform: ${view.platformBase ?? \"not set\"}`);\n console.log(`Local origin: ${runtime?.localOrigin ?? view.localOrigin}`);\n if (runtime?.deviceId) {\n console.log(`Device ID: ${runtime.deviceId}`);\n }\n if (runtime?.lastConnectedAt) {\n console.log(`Last connected: ${runtime.lastConnectedAt}`);\n }\n if (runtime?.lastError) {\n console.log(`Last error: ${runtime.lastError}`);\n }\n }\n\n async getDoctorView(): Promise<RemoteCommandDoctorView> {\n const config = loadConfig(getConfigPath());\n const snapshot = resolveNextclawRemoteStatusSnapshot(config);\n const localOrigin =\n snapshot.runtime?.localOrigin ??\n this.deps.currentLocalOrigin ??\n resolveConfiguredLocalOrigin(config);\n const localUi = await probeLocalUi(localOrigin);\n const token = normalizeOptionalString(config.providers.nextclaw?.apiKey);\n const platformApiBase =\n normalizeOptionalString(config.remote.platformApiBase) ??\n normalizeOptionalString(config.providers.nextclaw?.apiBase);\n const checks = [\n {\n name: \"remote-enabled\",\n ok: snapshot.configuredEnabled,\n detail: snapshot.configuredEnabled ? \"enabled in config\" : \"disabled in config\"\n },\n describePlatformTokenCheck(token),\n {\n name: \"platform-api-base\",\n ok: Boolean(platformApiBase),\n detail: platformApiBase ?? \"set remote.platformApiBase or login with --api-base\"\n },\n {\n name: \"local-ui\",\n ok: localUi.ok,\n detail: `${localOrigin} (${localUi.detail})`\n },\n {\n name: \"service-runtime\",\n ok: snapshot.runtime?.state === \"connected\",\n detail: snapshot.runtime ? snapshot.runtime.state : \"no managed remote runtime detected\"\n }\n ];\n return {\n generatedAt: new Date().toISOString(),\n checks,\n snapshot\n };\n }\n\n async doctor(opts: RemoteDoctorCommandOptions = {}): Promise<void> {\n const report = await this.getDoctorView();\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n return;\n }\n\n console.log(\"NextClaw Remote Doctor\");\n for (const check of report.checks) {\n console.log(`${check.ok ? \"✓\" : \"✗\"} ${check.name}: ${check.detail}`);\n }\n }\n}\n"],"mappings":"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"}
@@ -38,4 +38,5 @@ declare class RemoteAccessHost implements UiRemoteAccessHost {
38
38
  }) => Promise<RemoteAccessView>;
39
39
  }
40
40
  //#endregion
41
- export { RemoteAccessHost };
41
+ export { RemoteAccessHost };
42
+ //# sourceMappingURL=remote-access-host.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-access-host.service.d.ts","names":[],"sources":["../../../../src/commands/remote/services/remote-access-host.service.ts"],"mappings":";;;;;;cAmDa,gBAAA,YAA4B,kBAAA;EAAA,iBAEpB,IAAA;cAAA,IAAA;IACf,eAAA,EAAiB,+BAAA;IACjB,4BAAA,GAA+B,OAAA;MAAY,MAAA;MAAiB,MAAA;IAAA,MAAsB,OAAA;IAClF,cAAA,EAAgB,cAAA;IAChB,oBAAA,EAAsB,oBAAA;IACtB,SAAA;MACE,IAAA;MACA,IAAA;IAAA;IAEF,uBAAA,GAA0B,uBAAA;EAAA;EAI9B,SAAA,QAAgB,gBAAA;EAuBhB,KAAA,GAAe,KAAA;IACb,KAAA;IACA,QAAA;IACA,OAAA;EAAA,MACE,OAAA,CAAQ,gBAAA;EAKZ,gBAAA,GAA0B,KAAA,EAAO,6BAAA,KAAgC,OAAA,CAAQ,4BAAA;EAYzE,eAAA,GAAyB,KAAA,EAAO,4BAAA,KAA+B,OAAA,CAAQ,2BAAA;EAmBvE,MAAA,QAAa,gBAAA;EAKb,cAAA,GAAkB,KAAA,EAAO,2BAAA,KAA8B,gBAAA;EASvD,SAAA,QAAsB,OAAA,CAAQ,gBAAA;EAY9B,cAAA,GAAwB,MAAA,EAAQ,mBAAA,KAAsB,OAAA,CAAQ,yBAAA;EAAA,QAItD,eAAA;EA4BR,aAAA,GAAuB,KAAA;IAAS,QAAA;EAAA,MAAqB,OAAA,CAAQ,gBAAA;AAAA"}
@@ -124,3 +124,5 @@ var RemoteAccessHost = class {
124
124
  };
125
125
  //#endregion
126
126
  export { RemoteAccessHost };
127
+
128
+ //# sourceMappingURL=remote-access-host.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-access-host.service.js","names":[],"sources":["../../../../src/commands/remote/services/remote-access-host.service.ts"],"sourcesContent":["import { getConfigPath, loadConfig } from \"@nextclaw/core\";\nimport { readPlatformSessionTokenState } from \"@nextclaw/remote\";\nimport type {\n RemoteAccessView,\n RemoteAccountView,\n RemoteBrowserAuthPollRequest,\n RemoteBrowserAuthPollResult,\n RemoteBrowserAuthStartRequest,\n RemoteBrowserAuthStartResult,\n RemoteDoctorView,\n RemoteRuntimeView,\n RemoteServiceAction,\n RemoteServiceActionResult,\n RemoteSettingsUpdateRequest,\n UiRemoteAccessHost\n} from \"@nextclaw/server\";\nimport type { PlatformAuthCommands } from \"../../platform-auth/index.js\";\nimport type { RemoteCommands } from \"../index.js\";\nimport {\n controlRemoteService,\n resolveRemoteServiceView,\n type RemoteAccessHostServiceCommands,\n type RemoteRuntimeController\n} from \"./remote-service-control.service.js\";\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction toRemoteRuntimeView(runtime: ReturnType<RemoteCommands[\"getStatusView\"]>[\"runtime\"]): RemoteRuntimeView | null {\n if (!runtime) {\n return null;\n }\n return {\n enabled: runtime.enabled,\n mode: runtime.mode,\n state: runtime.state,\n deviceId: runtime.deviceId,\n deviceName: runtime.deviceName,\n platformBase: runtime.platformBase,\n localOrigin: runtime.localOrigin,\n lastConnectedAt: runtime.lastConnectedAt,\n lastError: runtime.lastError,\n updatedAt: runtime.updatedAt\n };\n}\n\nexport class RemoteAccessHost implements UiRemoteAccessHost {\n constructor(\n private readonly deps: {\n serviceCommands: RemoteAccessHostServiceCommands;\n requestManagedServiceRestart: (options?: { uiPort?: number; reason?: string }) => Promise<void>;\n remoteCommands: RemoteCommands;\n platformAuthCommands: PlatformAuthCommands;\n currentUi?: {\n host: string;\n port: number;\n };\n remoteRuntimeController?: RemoteRuntimeController | null;\n }\n ) {}\n\n getStatus = (): RemoteAccessView => {\n const config = loadConfig(getConfigPath());\n const status = this.deps.remoteCommands.getStatusView();\n const account = this.readAccountView({\n token: normalizeOptionalString(config.providers.nextclaw?.apiKey),\n apiBase: normalizeOptionalString(config.providers.nextclaw?.apiBase),\n platformBase: status.platformBase\n });\n return {\n account,\n settings: {\n enabled: config.remote.enabled,\n deviceName: config.remote.deviceName,\n platformApiBase: config.remote.platformApiBase\n },\n service: resolveRemoteServiceView(this.deps.currentUi),\n localOrigin: status.localOrigin,\n configuredEnabled: status.configuredEnabled,\n platformBase: status.platformBase,\n runtime: toRemoteRuntimeView(status.runtime)\n };\n };\n\n login = async (input: {\n email: string;\n password: string;\n apiBase?: string;\n }): Promise<RemoteAccessView> => {\n await this.deps.platformAuthCommands.loginResult(input);\n return this.getStatus();\n };\n\n startBrowserAuth = async (input: RemoteBrowserAuthStartRequest): Promise<RemoteBrowserAuthStartResult> => {\n const result = await this.deps.platformAuthCommands.startBrowserAuth({\n apiBase: input.apiBase\n });\n return {\n sessionId: result.sessionId,\n verificationUri: result.verificationUri,\n expiresAt: result.expiresAt,\n intervalMs: result.intervalMs\n };\n };\n\n pollBrowserAuth = async (input: RemoteBrowserAuthPollRequest): Promise<RemoteBrowserAuthPollResult> => {\n const config = loadConfig(getConfigPath());\n const result = await this.deps.platformAuthCommands.pollBrowserAuth({\n apiBase: normalizeOptionalString(input.apiBase)\n ?? normalizeOptionalString(config.remote.platformApiBase)\n ?? normalizeOptionalString(config.providers.nextclaw?.apiBase)\n ?? undefined,\n sessionId: input.sessionId\n });\n if (result.status !== \"authorized\") {\n return result;\n }\n return {\n status: \"authorized\",\n email: result.email,\n role: result.role\n };\n };\n\n logout = (): RemoteAccessView => {\n this.deps.platformAuthCommands.logout();\n return this.getStatus();\n };\n\n updateSettings = (input: RemoteSettingsUpdateRequest): RemoteAccessView => {\n this.deps.remoteCommands.updateConfig({\n enabled: input.enabled,\n apiBase: input.platformApiBase,\n name: input.deviceName\n });\n return this.getStatus();\n };\n\n runDoctor = async (): Promise<RemoteDoctorView> => {\n const report = await this.deps.remoteCommands.getDoctorView();\n return {\n generatedAt: report.generatedAt,\n checks: report.checks,\n snapshot: {\n configuredEnabled: report.snapshot.configuredEnabled,\n runtime: toRemoteRuntimeView(report.snapshot.runtime)\n }\n };\n };\n\n controlService = async (action: RemoteServiceAction): Promise<RemoteServiceActionResult> => {\n return controlRemoteService(action, this.deps);\n };\n\n private readAccountView = (params: {\n token: string | null;\n apiBase: string | null;\n platformBase: string | null;\n }): RemoteAccountView => {\n const { apiBase, platformBase, token } = params;\n const tokenState = readPlatformSessionTokenState(token);\n if (!tokenState.valid) {\n return {\n loggedIn: false,\n apiBase,\n platformBase\n };\n }\n const payload = tokenState.payload;\n const email = typeof payload?.email === \"string\" ? payload.email : undefined;\n const username = typeof payload?.username === \"string\" ? payload.username : undefined;\n const role = typeof payload?.role === \"string\" ? payload.role : undefined;\n return {\n loggedIn: true,\n email,\n username,\n role,\n apiBase,\n platformBase\n };\n };\n\n updateProfile = async (input: { username: string }): Promise<RemoteAccessView> => {\n await this.deps.platformAuthCommands.updateProfile({\n username: input.username\n });\n return this.getStatus();\n };\n}\n"],"mappings":"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"}
@@ -30,4 +30,5 @@ type RemoteServiceControlDeps = {
30
30
  declare function resolveRemoteServiceView(currentUi?: CurrentUi): RemoteServiceView;
31
31
  declare function controlRemoteService(action: RemoteServiceAction, deps: RemoteServiceControlDeps): Promise<RemoteServiceActionResult>;
32
32
  //#endregion
33
- export { RemoteAccessHostServiceCommands, RemoteRuntimeController, controlRemoteService, resolveRemoteServiceView };
33
+ export { RemoteAccessHostServiceCommands, RemoteRuntimeController, controlRemoteService, resolveRemoteServiceView };
34
+ //# sourceMappingURL=remote-service-control.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-service-control.service.d.ts","names":[],"sources":["../../../../src/commands/remote/services/remote-service-control.service.ts"],"mappings":";;;;KAOY,+BAAA;EACV,YAAA,GAAe,OAAA;IAAW,WAAA,EAAa,OAAA,CAAQ,UAAA,QAAkB,eAAA;IAAmB,IAAA;EAAA,MAAoB,OAAA;EACxG,WAAA,QAAmB,OAAA;AAAA;AAAA,KAGT,uBAAA;EACV,KAAA,QAAa,OAAA;EACb,IAAA,QAAY,OAAA;EACZ,OAAA,QAAe,OAAA;AAAA;AAAA,KAGZ,SAAA;EACH,IAAA;EACA,IAAA;AAAA;AAAA,KAGG,wBAAA;EACH,eAAA,EAAiB,+BAAA;EACjB,4BAAA,GAA+B,OAAA;IAAY,MAAA;IAAiB,MAAA;EAAA,MAAsB,OAAA;EAClF,SAAA,GAAY,SAAA;EACZ,uBAAA,GAA0B,uBAAA;AAAA;AAAA,iBA6MZ,wBAAA,CAAyB,SAAA,GAAY,SAAA,GAAY,iBAAA;AAAA,iBAI3C,oBAAA,CACpB,MAAA,EAAQ,mBAAA,EACR,IAAA,EAAM,wBAAA,GACL,OAAA,CAAQ,yBAAA"}
@@ -243,3 +243,5 @@ function launchManagedSelfControl(params = {}) {
243
243
  }
244
244
  //#endregion
245
245
  export { controlRemoteService, resolveRemoteServiceView };
246
+
247
+ //# sourceMappingURL=remote-service-control.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-service-control.service.js","names":[],"sources":["../../../../src/commands/remote/services/remote-service-control.service.ts"],"sourcesContent":["import { getConfigPath, loadConfig } from \"@nextclaw/core\";\nimport type { RemoteServiceAction, RemoteServiceActionResult, RemoteServiceView } from \"@nextclaw/server\";\nimport { spawn } from \"node:child_process\";\nimport { resolveUiApiBase, resolveUiConfig } from \"../../../shared/utils/cli.utils.js\";\nimport { managedServiceStateStore } from \"../../../shared/stores/managed-service-state.store.js\";\nimport { ManagedServiceSupervisor } from \"../../../shared/services/runtime/managed-service-supervisor.service.js\";\n\nexport type RemoteAccessHostServiceCommands = {\n startService: (options: { uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>; open: boolean }) => Promise<void>;\n stopService: () => Promise<void>;\n};\n\nexport type RemoteRuntimeController = {\n start: () => Promise<void> | null;\n stop: () => Promise<void>;\n restart: () => Promise<void>;\n};\n\ntype CurrentUi = {\n host: string;\n port: number;\n};\n\ntype RemoteServiceControlDeps = {\n serviceCommands: RemoteAccessHostServiceCommands;\n requestManagedServiceRestart: (options?: { uiPort?: number; reason?: string }) => Promise<void>;\n currentUi?: CurrentUi;\n remoteRuntimeController?: RemoteRuntimeController | null;\n};\n\nconst FORCED_PUBLIC_UI_HOST = \"0.0.0.0\";\ntype ManagedServiceControlState = {\n currentProcess: boolean;\n recordedProcessExists: boolean;\n running: boolean;\n};\n\nclass RemoteServiceControlService {\n private readonly managedServiceSupervisor = new ManagedServiceSupervisor();\n\n readonly resolveView = (currentUi?: CurrentUi): RemoteServiceView => {\n if (currentUi) {\n return {\n running: true,\n currentProcess: true,\n pid: process.pid,\n uiUrl: resolveUiApiBase(currentUi.host, currentUi.port),\n uiPort: currentUi.port\n };\n }\n\n const serviceState = managedServiceStateStore.read();\n const liveness = this.managedServiceSupervisor.resolveStateLiveness(serviceState);\n const serviceRunning = Boolean(serviceState && liveness.running);\n return {\n running: serviceRunning,\n currentProcess: Boolean(serviceRunning && serviceState?.pid === process.pid),\n ...(serviceState?.pid ? { pid: serviceState.pid } : {}),\n ...(serviceState?.uiUrl ? { uiUrl: serviceState.uiUrl } : {}),\n ...(typeof serviceState?.uiPort === \"number\" ? { uiPort: serviceState.uiPort } : {})\n };\n };\n\n readonly control = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps\n ): Promise<RemoteServiceActionResult> => {\n if (deps.remoteRuntimeController) {\n return this.controlCurrentProcessRuntime(action, deps.remoteRuntimeController);\n }\n\n return this.controlManagedService(action, deps);\n };\n\n private readonly controlCurrentProcessRuntime = async (\n action: RemoteServiceAction,\n controller: RemoteRuntimeController\n ): Promise<RemoteServiceActionResult> => {\n if (action === \"start\") {\n await controller.start();\n return { accepted: true, action, message: \"Remote runtime started.\" };\n }\n if (action === \"stop\") {\n await controller.stop();\n return { accepted: true, action, message: \"Remote runtime stopped.\" };\n }\n await controller.restart();\n return { accepted: true, action, message: \"Remote runtime restarted.\" };\n };\n\n private readonly controlManagedService = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps\n ): Promise<RemoteServiceActionResult> => {\n const serviceState = this.resolveManagedServiceControlState();\n const uiOverrides = this.resolveManagedUiOverrides();\n\n if (action === \"start\") {\n return this.startManagedService(action, deps, serviceState, uiOverrides);\n }\n if (!serviceState.running) {\n return this.controlStoppedManagedService(action, deps, serviceState, uiOverrides);\n }\n if (serviceState.currentProcess) {\n return this.controlCurrentManagedProcess(action, deps, uiOverrides);\n }\n return this.controlExternalManagedProcess(action, deps, uiOverrides);\n };\n\n private readonly resolveManagedServiceControlState = (): ManagedServiceControlState => {\n const state = managedServiceStateStore.read();\n const liveness = this.managedServiceSupervisor.resolveStateLiveness(state);\n const running = Boolean(state && liveness.running);\n return {\n currentProcess: Boolean(running && state?.pid === process.pid),\n recordedProcessExists: Boolean(state && liveness.processExists),\n running\n };\n };\n\n private readonly startManagedService = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps,\n serviceState: ManagedServiceControlState,\n uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>\n ): Promise<RemoteServiceActionResult> => {\n if (serviceState.running) {\n return {\n accepted: true,\n action,\n message: serviceState.currentProcess ? \"Managed service is already running for this UI.\" : \"Managed service is already running.\"\n };\n }\n if (serviceState.recordedProcessExists) {\n return this.controlStaleManagedServiceProcess(action, deps, uiOverrides);\n }\n await deps.serviceCommands.startService({ uiOverrides, open: false });\n return { accepted: true, action, message: \"Managed service started.\" };\n };\n\n private readonly controlStoppedManagedService = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps,\n serviceState: ManagedServiceControlState,\n uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>\n ): Promise<RemoteServiceActionResult> => {\n if (serviceState.recordedProcessExists) {\n return this.controlStaleManagedServiceProcess(action, deps, uiOverrides);\n }\n if (action === \"restart\") {\n await deps.serviceCommands.startService({ uiOverrides, open: false });\n return {\n accepted: true,\n action,\n message: \"Managed service was not running and has been started.\"\n };\n }\n return { accepted: true, action, message: \"No managed service is currently running.\" };\n };\n\n private readonly controlStaleManagedServiceProcess = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps,\n uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>\n ): Promise<RemoteServiceActionResult> => {\n if (action === \"stop\") {\n await deps.serviceCommands.stopService();\n return { accepted: true, action, message: \"Stale managed service process stopped.\" };\n }\n if (action === \"restart\") {\n await deps.serviceCommands.stopService();\n await deps.serviceCommands.startService({ uiOverrides, open: false });\n return { accepted: true, action, message: \"Stale managed service process replaced.\" };\n }\n await deps.serviceCommands.stopService();\n await deps.serviceCommands.startService({ uiOverrides, open: false });\n return { accepted: true, action, message: \"Stale managed service process replaced.\" };\n };\n\n private readonly controlCurrentManagedProcess = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps,\n uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>\n ): Promise<RemoteServiceActionResult> => {\n if (action === \"restart\") {\n await deps.requestManagedServiceRestart({ uiPort: uiOverrides.port ?? 55667 });\n } else {\n launchManagedSelfControl();\n }\n return {\n accepted: true,\n action,\n message:\n action === \"restart\"\n ? \"Restart scheduled. This page may disconnect for a few seconds.\"\n : \"Stop scheduled. This page will disconnect shortly.\"\n };\n };\n\n private readonly controlExternalManagedProcess = async (\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps,\n uiOverrides: Partial<ReturnType<typeof resolveUiConfig>>\n ): Promise<RemoteServiceActionResult> => {\n if (action === \"stop\") {\n await deps.serviceCommands.stopService();\n return { accepted: true, action, message: \"Managed service stopped.\" };\n }\n\n await deps.serviceCommands.stopService();\n await deps.serviceCommands.startService({ uiOverrides, open: false });\n return { accepted: true, action, message: \"Managed service restarted.\" };\n };\n\n private readonly resolveManagedUiOverrides = (): Partial<ReturnType<typeof resolveUiConfig>> => {\n const config = loadConfig(getConfigPath());\n const resolved = resolveUiConfig(config, {\n enabled: true,\n host: FORCED_PUBLIC_UI_HOST,\n open: false\n });\n return {\n enabled: true,\n host: FORCED_PUBLIC_UI_HOST,\n open: false,\n port: resolved.port\n };\n };\n}\n\nconst remoteServiceControlService = new RemoteServiceControlService();\n\nexport function resolveRemoteServiceView(currentUi?: CurrentUi): RemoteServiceView {\n return remoteServiceControlService.resolveView(currentUi);\n}\n\nexport async function controlRemoteService(\n action: RemoteServiceAction,\n deps: RemoteServiceControlDeps\n): Promise<RemoteServiceActionResult> {\n return remoteServiceControlService.control(action, deps);\n}\n\nfunction launchManagedSelfControl(params: {\n command?: string;\n args?: string[];\n} = {}): void {\n const script = [\n 'const { spawn } = require(\"node:child_process\");',\n 'const { rmSync } = require(\"node:fs\");',\n `const parentPid = ${process.pid};`,\n `const serviceStatePath = ${JSON.stringify(managedServiceStateStore.path)};`,\n `const command = ${JSON.stringify(params.command ?? null)};`,\n `const args = ${JSON.stringify(params.args ?? [])};`,\n `const cwd = ${JSON.stringify(process.cwd())};`,\n \"const env = process.env;\",\n \"function isRunning(pid) {\",\n \" try {\",\n \" process.kill(pid, 0);\",\n \" return true;\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"setTimeout(() => {\",\n \" try {\",\n \" process.kill(parentPid, 'SIGTERM');\",\n \" } catch {}\",\n \"}, 150);\",\n \"const startedAt = Date.now();\",\n \"const maxWaitMs = 30000;\",\n \"const timer = setInterval(() => {\",\n \" if (isRunning(parentPid)) {\",\n \" if (Date.now() - startedAt > maxWaitMs) {\",\n \" try {\",\n \" process.kill(parentPid, 'SIGKILL');\",\n \" } catch {}\",\n \" }\",\n \" return;\",\n \" }\",\n \" clearInterval(timer);\",\n \" try {\",\n \" rmSync(serviceStatePath, { force: true });\",\n \" } catch {}\",\n \" if (command) {\",\n \" const child = spawn(command, args, { detached: true, stdio: 'ignore', cwd, env });\",\n \" child.unref();\",\n \" }\",\n \" process.exit(0);\",\n \"}, 250);\"\n ].join(\"\");\n const helper = spawn(process.execPath, [\"-e\", script], {\n detached: true,\n stdio: \"ignore\",\n env: process.env,\n cwd: process.cwd()\n });\n helper.unref();\n}\n"],"mappings":";;;;;;AA8BA,MAAM,wBAAwB;AAO9B,IAAM,8BAAN,MAAkC;CAChC,2BAA4C,IAAI,0BAA0B;CAE1E,eAAwB,cAA6C;AACnE,MAAI,UACF,QAAO;GACL,SAAS;GACT,gBAAgB;GAChB,KAAK,QAAQ;GACb,OAAO,iBAAiB,UAAU,MAAM,UAAU,KAAK;GACvD,QAAQ,UAAU;GACnB;EAGH,MAAM,eAAe,yBAAyB,MAAM;EACpD,MAAM,WAAW,KAAK,yBAAyB,qBAAqB,aAAa;EACjF,MAAM,iBAAiB,QAAQ,gBAAgB,SAAS,QAAQ;AAChE,SAAO;GACL,SAAS;GACT,gBAAgB,QAAQ,kBAAkB,cAAc,QAAQ,QAAQ,IAAI;GAC5E,GAAI,cAAc,MAAM,EAAE,KAAK,aAAa,KAAK,GAAG,EAAE;GACtD,GAAI,cAAc,QAAQ,EAAE,OAAO,aAAa,OAAO,GAAG,EAAE;GAC5D,GAAI,OAAO,cAAc,WAAW,WAAW,EAAE,QAAQ,aAAa,QAAQ,GAAG,EAAE;GACpF;;CAGH,UAAmB,OACjB,QACA,SACuC;AACvC,MAAI,KAAK,wBACP,QAAO,KAAK,6BAA6B,QAAQ,KAAK,wBAAwB;AAGhF,SAAO,KAAK,sBAAsB,QAAQ,KAAK;;CAGjD,+BAAgD,OAC9C,QACA,eACuC;AACvC,MAAI,WAAW,SAAS;AACtB,SAAM,WAAW,OAAO;AACxB,UAAO;IAAE,UAAU;IAAM;IAAQ,SAAS;IAA2B;;AAEvE,MAAI,WAAW,QAAQ;AACrB,SAAM,WAAW,MAAM;AACvB,UAAO;IAAE,UAAU;IAAM;IAAQ,SAAS;IAA2B;;AAEvE,QAAM,WAAW,SAAS;AAC1B,SAAO;GAAE,UAAU;GAAM;GAAQ,SAAS;GAA6B;;CAGzE,wBAAyC,OACvC,QACA,SACuC;EACvC,MAAM,eAAe,KAAK,mCAAmC;EAC7D,MAAM,cAAc,KAAK,2BAA2B;AAEpD,MAAI,WAAW,QACb,QAAO,KAAK,oBAAoB,QAAQ,MAAM,cAAc,YAAY;AAE1E,MAAI,CAAC,aAAa,QAChB,QAAO,KAAK,6BAA6B,QAAQ,MAAM,cAAc,YAAY;AAEnF,MAAI,aAAa,eACf,QAAO,KAAK,6BAA6B,QAAQ,MAAM,YAAY;AAErE,SAAO,KAAK,8BAA8B,QAAQ,MAAM,YAAY;;CAGtE,0CAAuF;EACrF,MAAM,QAAQ,yBAAyB,MAAM;EAC7C,MAAM,WAAW,KAAK,yBAAyB,qBAAqB,MAAM;EAC1E,MAAM,UAAU,QAAQ,SAAS,SAAS,QAAQ;AAClD,SAAO;GACL,gBAAgB,QAAQ,WAAW,OAAO,QAAQ,QAAQ,IAAI;GAC9D,uBAAuB,QAAQ,SAAS,SAAS,cAAc;GAC/D;GACD;;CAGH,sBAAuC,OACrC,QACA,MACA,cACA,gBACuC;AACvC,MAAI,aAAa,QACf,QAAO;GACL,UAAU;GACV;GACA,SAAS,aAAa,iBAAiB,oDAAoD;GAC5F;AAEH,MAAI,aAAa,sBACf,QAAO,KAAK,kCAAkC,QAAQ,MAAM,YAAY;AAE1E,QAAM,KAAK,gBAAgB,aAAa;GAAE;GAAa,MAAM;GAAO,CAAC;AACrE,SAAO;GAAE,UAAU;GAAM;GAAQ,SAAS;GAA4B;;CAGxE,+BAAgD,OAC9C,QACA,MACA,cACA,gBACuC;AACvC,MAAI,aAAa,sBACf,QAAO,KAAK,kCAAkC,QAAQ,MAAM,YAAY;AAE1E,MAAI,WAAW,WAAW;AACxB,SAAM,KAAK,gBAAgB,aAAa;IAAE;IAAa,MAAM;IAAO,CAAC;AACrE,UAAO;IACL,UAAU;IACV;IACA,SAAS;IACV;;AAEH,SAAO;GAAE,UAAU;GAAM;GAAQ,SAAS;GAA4C;;CAGxF,oCAAqD,OACnD,QACA,MACA,gBACuC;AACvC,MAAI,WAAW,QAAQ;AACrB,SAAM,KAAK,gBAAgB,aAAa;AACxC,UAAO;IAAE,UAAU;IAAM;IAAQ,SAAS;IAA0C;;AAEtF,MAAI,WAAW,WAAW;AACxB,SAAM,KAAK,gBAAgB,aAAa;AACxC,SAAM,KAAK,gBAAgB,aAAa;IAAE;IAAa,MAAM;IAAO,CAAC;AACrE,UAAO;IAAE,UAAU;IAAM;IAAQ,SAAS;IAA2C;;AAEvF,QAAM,KAAK,gBAAgB,aAAa;AACxC,QAAM,KAAK,gBAAgB,aAAa;GAAE;GAAa,MAAM;GAAO,CAAC;AACrE,SAAO;GAAE,UAAU;GAAM;GAAQ,SAAS;GAA2C;;CAGvF,+BAAgD,OAC9C,QACA,MACA,gBACuC;AACvC,MAAI,WAAW,UACb,OAAM,KAAK,6BAA6B,EAAE,QAAQ,YAAY,QAAQ,OAAO,CAAC;MAE9E,2BAA0B;AAE5B,SAAO;GACL,UAAU;GACV;GACA,SACE,WAAW,YACP,mEACA;GACP;;CAGH,gCAAiD,OAC/C,QACA,MACA,gBACuC;AACvC,MAAI,WAAW,QAAQ;AACrB,SAAM,KAAK,gBAAgB,aAAa;AACxC,UAAO;IAAE,UAAU;IAAM;IAAQ,SAAS;IAA4B;;AAGxE,QAAM,KAAK,gBAAgB,aAAa;AACxC,QAAM,KAAK,gBAAgB,aAAa;GAAE;GAAa,MAAM;GAAO,CAAC;AACrE,SAAO;GAAE,UAAU;GAAM;GAAQ,SAAS;GAA8B;;CAG1E,kCAAgG;AAO9F,SAAO;GACL,SAAS;GACT,MAAM;GACN,MAAM;GACN,MATe,gBADF,WAAW,eAAe,CAAC,EACD;IACvC,SAAS;IACT,MAAM;IACN,MAAM;IACP,CAAC,CAKe;GAChB;;;AAIL,MAAM,8BAA8B,IAAI,6BAA6B;AAErE,SAAgB,yBAAyB,WAA0C;AACjF,QAAO,4BAA4B,YAAY,UAAU;;AAG3D,eAAsB,qBACpB,QACA,MACoC;AACpC,QAAO,4BAA4B,QAAQ,QAAQ,KAAK;;AAG1D,SAAS,yBAAyB,SAG9B,EAAE,EAAQ;CACZ,MAAM,SAAS;EACb;EACA;EACA,qBAAqB,QAAQ,IAAI;EACjC,4BAA4B,KAAK,UAAU,yBAAyB,KAAK,CAAC;EAC1E,mBAAmB,KAAK,UAAU,OAAO,WAAW,KAAK,CAAC;EAC1D,gBAAgB,KAAK,UAAU,OAAO,QAAQ,EAAE,CAAC,CAAC;EAClD,eAAe,KAAK,UAAU,QAAQ,KAAK,CAAC,CAAC;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,GAAG;AACK,OAAM,QAAQ,UAAU,CAAC,MAAM,OAAO,EAAE;EACrD,UAAU;EACV,OAAO;EACP,KAAK,QAAQ;EACb,KAAK,QAAQ,KAAK;EACnB,CAAC,CACK,OAAO"}
@@ -11,4 +11,5 @@ declare function resolvePlatformApiBase(params: {
11
11
  };
12
12
  declare function buildPlatformApiBaseErrorMessage(inputApiBase: string, rawMessage: string): string;
13
13
  //#endregion
14
- export { buildPlatformApiBaseErrorMessage, resolvePlatformApiBase };
14
+ export { buildPlatformApiBaseErrorMessage, resolvePlatformApiBase };
15
+ //# sourceMappingURL=platform-api-base.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-api-base.utils.d.ts","names":[],"sources":["../../../../src/commands/remote/utils/platform-api-base.utils.ts"],"mappings":";iBAgBgB,sBAAA,CAAuB,MAAA;EACrC,eAAA;EACA,iBAAA;EACA,eAAA;EACA,iBAAA;AAAA;EAEA,YAAA;EACA,MAAA;EACA,YAAA;AAAA;AAAA,iBAkCc,gCAAA,CAAiC,YAAA,UAAsB,UAAA"}
@@ -37,3 +37,5 @@ function buildPlatformApiBaseErrorMessage(inputApiBase, rawMessage) {
37
37
  }
38
38
  //#endregion
39
39
  export { buildPlatformApiBaseErrorMessage, resolvePlatformApiBase };
40
+
41
+ //# sourceMappingURL=platform-api-base.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-api-base.utils.js","names":[],"sources":["../../../../src/commands/remote/utils/platform-api-base.utils.ts"],"sourcesContent":["const DEFAULT_PLATFORM_API_BASE = \"https://ai-gateway-api.nextclaw.io/v1\";\nconst INVALID_PLATFORM_HINT =\n `Use ${DEFAULT_PLATFORM_API_BASE} or the platform root URL without a trailing path.`;\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction normalizeExplicitApiBase(rawApiBase: string): string {\n const trimmed = trimTrailingSlash(rawApiBase.trim());\n if (!trimmed) {\n return \"\";\n }\n return trimmed.replace(/\\/v1?$/i, \"\");\n}\n\nexport function resolvePlatformApiBase(params: {\n explicitApiBase?: string | null;\n configuredApiBase?: string | null;\n fallbackApiBase?: string;\n requireConfigured?: boolean;\n}): {\n platformBase: string;\n v1Base: string;\n inputApiBase: string;\n} {\n const explicitApiBase = typeof params.explicitApiBase === \"string\" ? params.explicitApiBase.trim() : \"\";\n const configuredApiBase = typeof params.configuredApiBase === \"string\" ? params.configuredApiBase.trim() : \"\";\n const fallbackApiBase = params.fallbackApiBase ?? DEFAULT_PLATFORM_API_BASE;\n const inputApiBase = explicitApiBase || configuredApiBase || (params.requireConfigured ? \"\" : fallbackApiBase);\n if (!inputApiBase) {\n throw new Error(\"Platform API base is missing. Pass --api-base or run nextclaw login.\");\n }\n\n const platformBase = normalizeExplicitApiBase(inputApiBase);\n if (!platformBase) {\n throw new Error(`Invalid --api-base \"${inputApiBase}\". ${INVALID_PLATFORM_HINT}`);\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(platformBase);\n } catch {\n throw new Error(`Invalid --api-base \"${inputApiBase}\". ${INVALID_PLATFORM_HINT}`);\n }\n\n if (parsedUrl.pathname !== \"\" && parsedUrl.pathname !== \"/\") {\n throw new Error(`Invalid --api-base \"${inputApiBase}\". ${INVALID_PLATFORM_HINT}`);\n }\n\n const normalizedPlatformBase = trimTrailingSlash(parsedUrl.toString());\n return {\n platformBase: normalizedPlatformBase,\n v1Base: `${normalizedPlatformBase}/v1`,\n inputApiBase\n };\n}\n\nexport function buildPlatformApiBaseErrorMessage(inputApiBase: string, rawMessage: string): string {\n if (\n rawMessage.includes(\"Remote session cookie missing\") ||\n rawMessage.includes(\"endpoint not found\") ||\n rawMessage.includes(\"NOT_FOUND\")\n ) {\n return `Invalid --api-base \"${inputApiBase}\". ${INVALID_PLATFORM_HINT}`;\n }\n return rawMessage;\n}\n"],"mappings":";AAAA,MAAM,4BAA4B;AAClC,MAAM,wBACJ,OAAO,0BAA0B;AAEnC,SAAS,kBAAkB,OAAuB;AAChD,QAAO,MAAM,QAAQ,QAAQ,GAAG;;AAGlC,SAAS,yBAAyB,YAA4B;CAC5D,MAAM,UAAU,kBAAkB,WAAW,MAAM,CAAC;AACpD,KAAI,CAAC,QACH,QAAO;AAET,QAAO,QAAQ,QAAQ,WAAW,GAAG;;AAGvC,SAAgB,uBAAuB,QASrC;CACA,MAAM,kBAAkB,OAAO,OAAO,oBAAoB,WAAW,OAAO,gBAAgB,MAAM,GAAG;CACrG,MAAM,oBAAoB,OAAO,OAAO,sBAAsB,WAAW,OAAO,kBAAkB,MAAM,GAAG;CAC3G,MAAM,kBAAkB,OAAO,mBAAmB;CAClD,MAAM,eAAe,mBAAmB,sBAAsB,OAAO,oBAAoB,KAAK;AAC9F,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,uEAAuE;CAGzF,MAAM,eAAe,yBAAyB,aAAa;AAC3D,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,uBAAuB,aAAa,KAAK,wBAAwB;CAGnF,IAAI;AACJ,KAAI;AACF,cAAY,IAAI,IAAI,aAAa;SAC3B;AACN,QAAM,IAAI,MAAM,uBAAuB,aAAa,KAAK,wBAAwB;;AAGnF,KAAI,UAAU,aAAa,MAAM,UAAU,aAAa,IACtD,OAAM,IAAI,MAAM,uBAAuB,aAAa,KAAK,wBAAwB;CAGnF,MAAM,yBAAyB,kBAAkB,UAAU,UAAU,CAAC;AACtE,QAAO;EACL,cAAc;EACd,QAAQ,GAAG,uBAAuB;EAClC;EACD;;AAGH,SAAgB,iCAAiC,cAAsB,YAA4B;AACjG,KACE,WAAW,SAAS,gCAAgC,IACpD,WAAW,SAAS,qBAAqB,IACzC,WAAW,SAAS,YAAY,CAEhC,QAAO,uBAAuB,aAAa,KAAK;AAElD,QAAO"}
@@ -12,4 +12,5 @@ declare function buildNextclawConfiguredRemoteState(config: Config): RemoteRunti
12
12
  declare function readCurrentNextclawRemoteRuntimeState(): RemoteRuntimeState | null;
13
13
  declare function resolveNextclawRemoteStatusSnapshot(config: Config): RemoteStatusSnapshot;
14
14
  //#endregion
15
- export { buildNextclawConfiguredRemoteState, createNextclawRemoteConnector, createNextclawRemotePlatformClient, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, readCurrentNextclawRemoteRuntimeState, resolveNextclawRemoteStatusSnapshot };
15
+ export { buildNextclawConfiguredRemoteState, createNextclawRemoteConnector, createNextclawRemotePlatformClient, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, readCurrentNextclawRemoteRuntimeState, resolveNextclawRemoteStatusSnapshot };
16
+ //# sourceMappingURL=remote-runtime-support.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-runtime-support.utils.d.ts","names":[],"sources":["../../../../src/commands/remote/utils/remote-runtime-support.utils.ts"],"mappings":";;;;iBAqBgB,gCAAA,CAAA;AAAA,iBAKA,kCAAA,CAAA,GAAsC,oBAAA;AAAA,iBAwBtC,6BAAA,CAA8B,MAAA;EAC5C,MAAA,GAAS,YAAA;AAAA,IACF,eAAA;AAAA,iBAOO,+BAAA,CACd,IAAA,EAAM,kBAAA,UAA4B,QAAA,IAAY,IAAA,EAAM,kBAAA,YACnD,iBAAA;AAAA,iBAwBa,kCAAA,CAAmC,MAAA,EAAQ,MAAA,GAAS,kBAAA;AAAA,iBAIpD,qCAAA,CAAA,GAAyC,kBAAA;AAAA,iBAqBzC,mCAAA,CAAoC,MAAA,EAAQ,MAAA,GAAS,oBAAA"}
@@ -78,3 +78,5 @@ function resolveNextclawRemoteStatusSnapshot(config) {
78
78
  }
79
79
  //#endregion
80
80
  export { buildNextclawConfiguredRemoteState, createNextclawRemoteConnector, createNextclawRemotePlatformClient, createNextclawRemoteStatusStore, hasRunningNextclawManagedService, readCurrentNextclawRemoteRuntimeState, resolveNextclawRemoteStatusSnapshot };
81
+
82
+ //# sourceMappingURL=remote-runtime-support.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-runtime-support.utils.js","names":[],"sources":["../../../../src/commands/remote/utils/remote-runtime-support.utils.ts"],"sourcesContent":["import { getConfigPath, getDataDir, loadConfig, type Config } from \"@nextclaw/core\";\nimport {\n RemoteConnector,\n RemotePlatformClient,\n RemoteStatusStore,\n buildConfiguredRemoteState,\n resolveRemoteStatusSnapshot,\n type RemoteLogger,\n type RemoteRuntimeState,\n type RemoteStatusSnapshot\n} from \"@nextclaw/remote\";\nimport {\n getPackageVersion,\n isProcessRunning\n} from \"../../../shared/utils/cli.utils.js\";\nimport { localUiRuntimeStore } from \"../../../shared/stores/local-ui-runtime.store.js\";\nimport { managedServiceStateStore } from \"../../../shared/stores/managed-service-state.store.js\";\nimport { resolvePlatformApiBase } from \"../utils/platform-api-base.utils.js\";\n\nlet currentProcessRemoteRuntimeState: RemoteRuntimeState | null = null;\n\nexport function hasRunningNextclawManagedService(): boolean {\n const state = managedServiceStateStore.read();\n return Boolean(state && isProcessRunning(state.pid));\n}\n\nexport function createNextclawRemotePlatformClient(): RemotePlatformClient {\n return new RemotePlatformClient({\n loadConfig: () => loadConfig(getConfigPath()),\n getDataDir,\n getPackageVersion,\n resolvePlatformBase: (rawApiBase) =>\n resolvePlatformApiBase({\n explicitApiBase: rawApiBase,\n requireConfigured: true\n }).platformBase,\n readManagedServiceState: () => {\n const state = managedServiceStateStore.read();\n if (!state) {\n return null;\n }\n return {\n pid: state.pid,\n uiPort: state.uiPort\n };\n },\n isProcessRunning\n });\n}\n\nexport function createNextclawRemoteConnector(params: {\n logger?: RemoteLogger;\n} = {}): RemoteConnector {\n return new RemoteConnector({\n platformClient: createNextclawRemotePlatformClient(),\n logger: params.logger\n });\n}\n\nexport function createNextclawRemoteStatusStore(\n mode: RemoteRuntimeState[\"mode\"], onChange?: (next: RemoteRuntimeState) => void\n): RemoteStatusStore {\n return new RemoteStatusStore(mode, {\n writeRemoteState: (next) => {\n currentProcessRemoteRuntimeState = next;\n onChange?.(next);\n const uiRuntimeState = localUiRuntimeStore.read();\n if (uiRuntimeState?.pid === process.pid) {\n localUiRuntimeStore.update((state) => ({\n ...state,\n remote: next\n }));\n }\n const serviceState = managedServiceStateStore.read();\n if (!serviceState || serviceState.pid !== process.pid) {\n return;\n }\n managedServiceStateStore.update((state) => ({\n ...state,\n remote: next\n }));\n }\n });\n}\n\nexport function buildNextclawConfiguredRemoteState(config: Config): RemoteRuntimeState {\n return buildConfiguredRemoteState(config);\n}\n\nexport function readCurrentNextclawRemoteRuntimeState(): RemoteRuntimeState | null {\n const uiRuntimeState = localUiRuntimeStore.read();\n const serviceState = managedServiceStateStore.read();\n const currentRemoteState = currentProcessRemoteRuntimeState ?? uiRuntimeState?.remote ?? serviceState?.remote ?? null;\n if (!currentRemoteState) {\n return null;\n }\n\n const owningRuntime = uiRuntimeState ?? serviceState;\n if (!owningRuntime || isProcessRunning(owningRuntime.pid)) {\n return currentRemoteState;\n }\n\n return {\n ...currentRemoteState,\n state: currentRemoteState.enabled ? \"disconnected\" : \"disabled\",\n lastError: currentRemoteState.lastError ?? \"Managed service is not running.\",\n updatedAt: new Date().toISOString()\n };\n}\n\nexport function resolveNextclawRemoteStatusSnapshot(config: Config): RemoteStatusSnapshot {\n return resolveRemoteStatusSnapshot({\n config,\n currentRemoteState: readCurrentNextclawRemoteRuntimeState()\n });\n}\n"],"mappings":";;;;;;;;AAmBA,IAAI,mCAA8D;AAElE,SAAgB,mCAA4C;CAC1D,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,QAAO,QAAQ,SAAS,iBAAiB,MAAM,IAAI,CAAC;;AAGtD,SAAgB,qCAA2D;AACzE,QAAO,IAAI,qBAAqB;EAC9B,kBAAkB,WAAW,eAAe,CAAC;EAC7C;EACA,mBAAA;EACA,sBAAsB,eACpB,uBAAuB;GACrB,iBAAiB;GACjB,mBAAmB;GACpB,CAAC,CAAC;EACL,+BAA+B;GAC7B,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,OAAI,CAAC,MACH,QAAO;AAET,UAAO;IACL,KAAK,MAAM;IACX,QAAQ,MAAM;IACf;;EAEH;EACD,CAAC;;AAGJ,SAAgB,8BAA8B,SAE1C,EAAE,EAAmB;AACvB,QAAO,IAAI,gBAAgB;EACzB,gBAAgB,oCAAoC;EACpD,QAAQ,OAAO;EAChB,CAAC;;AAGJ,SAAgB,gCACd,MAAkC,UACf;AACnB,QAAO,IAAI,kBAAkB,MAAM,EACjC,mBAAmB,SAAS;AAC1B,qCAAmC;AACnC,aAAW,KAAK;AAEhB,MADuB,oBAAoB,MAAM,EAC7B,QAAQ,QAAQ,IAClC,qBAAoB,QAAQ,WAAW;GACrC,GAAG;GACH,QAAQ;GACT,EAAE;EAEL,MAAM,eAAe,yBAAyB,MAAM;AACpD,MAAI,CAAC,gBAAgB,aAAa,QAAQ,QAAQ,IAChD;AAEF,2BAAyB,QAAQ,WAAW;GAC1C,GAAG;GACH,QAAQ;GACT,EAAE;IAEN,CAAC;;AAGJ,SAAgB,mCAAmC,QAAoC;AACrF,QAAO,2BAA2B,OAAO;;AAG3C,SAAgB,wCAAmE;CACjF,MAAM,iBAAiB,oBAAoB,MAAM;CACjD,MAAM,eAAe,yBAAyB,MAAM;CACpD,MAAM,qBAAqB,oCAAoC,gBAAgB,UAAU,cAAc,UAAU;AACjH,KAAI,CAAC,mBACH,QAAO;CAGT,MAAM,gBAAgB,kBAAkB;AACxC,KAAI,CAAC,iBAAiB,iBAAiB,cAAc,IAAI,CACvD,QAAO;AAGT,QAAO;EACL,GAAG;EACH,OAAO,mBAAmB,UAAU,iBAAiB;EACrD,WAAW,mBAAmB,aAAa;EAC3C,4BAAW,IAAI,MAAM,EAAC,aAAa;EACpC;;AAGH,SAAgB,oCAAoC,QAAsC;AACxF,QAAO,4BAA4B;EACjC;EACA,oBAAoB,uCAAuC;EAC5D,CAAC"}
@@ -13,4 +13,5 @@ declare class ServiceCommands {
13
13
  autostartDoctor: (options?: ServiceAutostartCommandOptions) => Promise<void>;
14
14
  }
15
15
  //#endregion
16
- export { ServiceCommands };
16
+ export { ServiceCommands };
17
+ //# sourceMappingURL=index.d.ts.map