@nextclaw/service 0.1.14 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/dist/cli/commands/agent/agent-runtime.utils.d.ts +2 -1
  2. package/dist/cli/commands/agent/agent-runtime.utils.d.ts.map +1 -0
  3. package/dist/cli/commands/agent/agent-runtime.utils.js +3 -1
  4. package/dist/cli/commands/agent/agent-runtime.utils.js.map +1 -0
  5. package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts +2 -1
  6. package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts.map +1 -0
  7. package/dist/cli/commands/agent/cli-agent-runner.utils.js +3 -5
  8. package/dist/cli/commands/agent/cli-agent-runner.utils.js.map +1 -0
  9. package/dist/cli/commands/agent/services/agent-commands.service.d.ts +2 -1
  10. package/dist/cli/commands/agent/services/agent-commands.service.d.ts.map +1 -0
  11. package/dist/cli/commands/agent/services/agent-commands.service.js +2 -0
  12. package/dist/cli/commands/agent/services/agent-commands.service.js.map +1 -0
  13. package/dist/cli/commands/config/services/config-commands.service.d.ts +2 -1
  14. package/dist/cli/commands/config/services/config-commands.service.d.ts.map +1 -0
  15. package/dist/cli/commands/config/services/config-commands.service.js +2 -0
  16. package/dist/cli/commands/config/services/config-commands.service.js.map +1 -0
  17. package/dist/cli/commands/cron/services/cron-commands.service.d.ts +2 -1
  18. package/dist/cli/commands/cron/services/cron-commands.service.d.ts.map +1 -0
  19. package/dist/cli/commands/cron/services/cron-commands.service.js +2 -0
  20. package/dist/cli/commands/cron/services/cron-commands.service.js.map +1 -0
  21. package/dist/cli/commands/cron/services/cron-local.service.d.ts +2 -1
  22. package/dist/cli/commands/cron/services/cron-local.service.d.ts.map +1 -0
  23. package/dist/cli/commands/cron/services/cron-local.service.js +2 -0
  24. package/dist/cli/commands/cron/services/cron-local.service.js.map +1 -0
  25. package/dist/cli/commands/cron/utils/cron-job.utils.d.ts +2 -1
  26. package/dist/cli/commands/cron/utils/cron-job.utils.d.ts.map +1 -0
  27. package/dist/cli/commands/cron/utils/cron-job.utils.js +2 -0
  28. package/dist/cli/commands/cron/utils/cron-job.utils.js.map +1 -0
  29. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts +4 -1
  30. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.d.ts.map +1 -0
  31. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js +40 -14
  32. package/dist/cli/commands/diagnostics/services/diagnostics-commands.service.js.map +1 -0
  33. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts +2 -1
  34. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.d.ts.map +1 -0
  35. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js +8 -0
  36. package/dist/cli/commands/diagnostics/utils/diagnostics-render.utils.js.map +1 -0
  37. package/dist/cli/commands/gateway/index.d.ts +2 -1
  38. package/dist/cli/commands/gateway/index.d.ts.map +1 -0
  39. package/dist/cli/commands/gateway/index.js +2 -0
  40. package/dist/cli/commands/gateway/index.js.map +1 -0
  41. package/dist/cli/commands/logs/index.d.ts +2 -1
  42. package/dist/cli/commands/logs/index.d.ts.map +1 -0
  43. package/dist/cli/commands/logs/index.js +2 -0
  44. package/dist/cli/commands/logs/index.js.map +1 -0
  45. package/dist/cli/commands/mcp/index.d.ts +2 -1
  46. package/dist/cli/commands/mcp/index.d.ts.map +1 -0
  47. package/dist/cli/commands/mcp/index.js +2 -0
  48. package/dist/cli/commands/mcp/index.js.map +1 -0
  49. package/dist/cli/commands/restart/index.d.ts +2 -1
  50. package/dist/cli/commands/restart/index.d.ts.map +1 -0
  51. package/dist/cli/commands/restart/index.js +2 -0
  52. package/dist/cli/commands/restart/index.js.map +1 -0
  53. package/dist/cli/commands/secrets/index.d.ts +2 -1
  54. package/dist/cli/commands/secrets/index.d.ts.map +1 -0
  55. package/dist/cli/commands/secrets/index.js +2 -0
  56. package/dist/cli/commands/secrets/index.js.map +1 -0
  57. package/dist/cli/commands/serve/index.d.ts +2 -1
  58. package/dist/cli/commands/serve/index.d.ts.map +1 -0
  59. package/dist/cli/commands/serve/index.js +2 -0
  60. package/dist/cli/commands/serve/index.js.map +1 -0
  61. package/dist/cli/commands/skills/index.d.ts +2 -1
  62. package/dist/cli/commands/skills/index.d.ts.map +1 -0
  63. package/dist/cli/commands/skills/index.js +2 -0
  64. package/dist/cli/commands/skills/index.js.map +1 -0
  65. package/dist/cli/commands/skills/marketplace-client.d.ts +2 -1
  66. package/dist/cli/commands/skills/marketplace-client.d.ts.map +1 -0
  67. package/dist/cli/commands/skills/marketplace-client.js +2 -0
  68. package/dist/cli/commands/skills/marketplace-client.js.map +1 -0
  69. package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts +2 -1
  70. package/dist/cli/commands/skills/marketplace-command-options.utils.d.ts.map +1 -0
  71. package/dist/cli/commands/skills/marketplace-command-options.utils.js +2 -0
  72. package/dist/cli/commands/skills/marketplace-command-options.utils.js.map +1 -0
  73. package/dist/cli/commands/skills/marketplace-identity.utils.d.ts +2 -1
  74. package/dist/cli/commands/skills/marketplace-identity.utils.d.ts.map +1 -0
  75. package/dist/cli/commands/skills/marketplace-identity.utils.js +2 -0
  76. package/dist/cli/commands/skills/marketplace-identity.utils.js.map +1 -0
  77. package/dist/cli/commands/skills/marketplace-network-retry.d.ts +2 -1
  78. package/dist/cli/commands/skills/marketplace-network-retry.d.ts.map +1 -0
  79. package/dist/cli/commands/skills/marketplace-network-retry.js +2 -0
  80. package/dist/cli/commands/skills/marketplace-network-retry.js.map +1 -0
  81. package/dist/cli/commands/skills/marketplace.metadata.d.ts +2 -1
  82. package/dist/cli/commands/skills/marketplace.metadata.d.ts.map +1 -0
  83. package/dist/cli/commands/skills/marketplace.metadata.js +2 -0
  84. package/dist/cli/commands/skills/marketplace.metadata.js.map +1 -0
  85. package/dist/cli/commands/skills/marketplace.utils.d.ts +2 -1
  86. package/dist/cli/commands/skills/marketplace.utils.d.ts.map +1 -0
  87. package/dist/cli/commands/skills/marketplace.utils.js +2 -0
  88. package/dist/cli/commands/skills/marketplace.utils.js.map +1 -0
  89. package/dist/cli/commands/skills/skills-query.service.d.ts +2 -1
  90. package/dist/cli/commands/skills/skills-query.service.d.ts.map +1 -0
  91. package/dist/cli/commands/skills/skills-query.service.js +2 -0
  92. package/dist/cli/commands/skills/skills-query.service.js.map +1 -0
  93. package/dist/cli/commands/start/index.d.ts +2 -1
  94. package/dist/cli/commands/start/index.d.ts.map +1 -0
  95. package/dist/cli/commands/start/index.js +2 -0
  96. package/dist/cli/commands/start/index.js.map +1 -0
  97. package/dist/cli/commands/stop/index.d.ts +2 -1
  98. package/dist/cli/commands/stop/index.d.ts.map +1 -0
  99. package/dist/cli/commands/stop/index.js +2 -0
  100. package/dist/cli/commands/stop/index.js.map +1 -0
  101. package/dist/cli/commands/ui/index.d.ts +2 -1
  102. package/dist/cli/commands/ui/index.d.ts.map +1 -0
  103. package/dist/cli/commands/ui/index.js +2 -0
  104. package/dist/cli/commands/ui/index.js.map +1 -0
  105. package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts +2 -1
  106. package/dist/cli/commands/usage/services/llm-usage-command.service.d.ts.map +1 -0
  107. package/dist/cli/commands/usage/services/llm-usage-command.service.js +2 -0
  108. package/dist/cli/commands/usage/services/llm-usage-command.service.js.map +1 -0
  109. package/dist/commands/channel/channel-config-view.d.ts +2 -1
  110. package/dist/commands/channel/channel-config-view.d.ts.map +1 -0
  111. package/dist/commands/channel/channel-config-view.js +2 -0
  112. package/dist/commands/channel/channel-config-view.js.map +1 -0
  113. package/dist/commands/channel/channel-list-view.service.d.ts +2 -1
  114. package/dist/commands/channel/channel-list-view.service.d.ts.map +1 -0
  115. package/dist/commands/channel/channel-list-view.service.js +2 -0
  116. package/dist/commands/channel/channel-list-view.service.js.map +1 -0
  117. package/dist/commands/channel/index.d.ts +2 -1
  118. package/dist/commands/channel/index.d.ts.map +1 -0
  119. package/dist/commands/channel/index.js +2 -0
  120. package/dist/commands/channel/index.js.map +1 -0
  121. package/dist/commands/platform-auth/services/account-status.service.d.ts +2 -1
  122. package/dist/commands/platform-auth/services/account-status.service.d.ts.map +1 -0
  123. package/dist/commands/platform-auth/services/account-status.service.js +2 -0
  124. package/dist/commands/platform-auth/services/account-status.service.js.map +1 -0
  125. package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts +2 -1
  126. package/dist/commands/platform-auth/services/platform-auth-commands.service.d.ts.map +1 -0
  127. package/dist/commands/platform-auth/services/platform-auth-commands.service.js +2 -0
  128. package/dist/commands/platform-auth/services/platform-auth-commands.service.js.map +1 -0
  129. package/dist/commands/platform-auth/utils/payload.utils.d.ts +2 -1
  130. package/dist/commands/platform-auth/utils/payload.utils.d.ts.map +1 -0
  131. package/dist/commands/platform-auth/utils/payload.utils.js +2 -0
  132. package/dist/commands/platform-auth/utils/payload.utils.js.map +1 -0
  133. package/dist/commands/plugin/index.d.ts +2 -1
  134. package/dist/commands/plugin/index.d.ts.map +1 -0
  135. package/dist/commands/plugin/index.js +2 -0
  136. package/dist/commands/plugin/index.js.map +1 -0
  137. package/dist/commands/plugin/plugin-command.utils.d.ts +2 -1
  138. package/dist/commands/plugin/plugin-command.utils.d.ts.map +1 -0
  139. package/dist/commands/plugin/plugin-command.utils.js +2 -0
  140. package/dist/commands/plugin/plugin-command.utils.js.map +1 -0
  141. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts +2 -1
  142. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts.map +1 -0
  143. package/dist/commands/plugin/plugin-mutation-actions.utils.js +2 -0
  144. package/dist/commands/plugin/plugin-mutation-actions.utils.js.map +1 -0
  145. package/dist/commands/remote/index.d.ts +2 -1
  146. package/dist/commands/remote/index.d.ts.map +1 -0
  147. package/dist/commands/remote/index.js +2 -0
  148. package/dist/commands/remote/index.js.map +1 -0
  149. package/dist/commands/remote/services/remote-access-host.service.d.ts +2 -1
  150. package/dist/commands/remote/services/remote-access-host.service.d.ts.map +1 -0
  151. package/dist/commands/remote/services/remote-access-host.service.js +2 -0
  152. package/dist/commands/remote/services/remote-access-host.service.js.map +1 -0
  153. package/dist/commands/remote/services/remote-service-control.service.d.ts +2 -1
  154. package/dist/commands/remote/services/remote-service-control.service.d.ts.map +1 -0
  155. package/dist/commands/remote/services/remote-service-control.service.js +134 -75
  156. package/dist/commands/remote/services/remote-service-control.service.js.map +1 -0
  157. package/dist/commands/remote/utils/platform-api-base.utils.d.ts +2 -1
  158. package/dist/commands/remote/utils/platform-api-base.utils.d.ts.map +1 -0
  159. package/dist/commands/remote/utils/platform-api-base.utils.js +2 -0
  160. package/dist/commands/remote/utils/platform-api-base.utils.js.map +1 -0
  161. package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts +2 -1
  162. package/dist/commands/remote/utils/remote-runtime-support.utils.d.ts.map +1 -0
  163. package/dist/commands/remote/utils/remote-runtime-support.utils.js +2 -0
  164. package/dist/commands/remote/utils/remote-runtime-support.utils.js.map +1 -0
  165. package/dist/commands/service/index.d.ts +2 -1
  166. package/dist/commands/service/index.d.ts.map +1 -0
  167. package/dist/commands/service/index.js +2 -0
  168. package/dist/commands/service/index.js.map +1 -0
  169. package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts +2 -1
  170. package/dist/commands/service/services/autostart/host-autostart-command.service.d.ts.map +1 -0
  171. package/dist/commands/service/services/autostart/host-autostart-command.service.js +2 -0
  172. package/dist/commands/service/services/autostart/host-autostart-command.service.js.map +1 -0
  173. package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts +2 -1
  174. package/dist/commands/service/services/autostart/host-autostart-runtime.service.d.ts.map +1 -0
  175. package/dist/commands/service/services/autostart/host-autostart-runtime.service.js +2 -0
  176. package/dist/commands/service/services/autostart/host-autostart-runtime.service.js.map +1 -0
  177. package/dist/commands/service/services/autostart/host-autostart.service.d.ts +2 -1
  178. package/dist/commands/service/services/autostart/host-autostart.service.d.ts.map +1 -0
  179. package/dist/commands/service/services/autostart/host-autostart.service.js +2 -0
  180. package/dist/commands/service/services/autostart/host-autostart.service.js.map +1 -0
  181. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts +2 -1
  182. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.d.ts.map +1 -0
  183. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js +2 -0
  184. package/dist/commands/service/services/autostart/linux-systemd-autostart.service.js.map +1 -0
  185. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts +2 -1
  186. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.d.ts.map +1 -0
  187. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js +2 -0
  188. package/dist/commands/service/services/autostart/macos-launch-agent-autostart.service.js.map +1 -0
  189. package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts +2 -1
  190. package/dist/commands/service/services/autostart/windows-task-autostart.service.d.ts.map +1 -0
  191. package/dist/commands/service/services/autostart/windows-task-autostart.service.js +2 -0
  192. package/dist/commands/service/services/autostart/windows-task-autostart.service.js.map +1 -0
  193. package/dist/commands/service/types/autostart/host-autostart.types.d.ts +2 -1
  194. package/dist/commands/service/types/autostart/host-autostart.types.d.ts.map +1 -0
  195. package/dist/launcher/npm-runtime-bundle-layout.store.d.ts +2 -1
  196. package/dist/launcher/npm-runtime-bundle-layout.store.d.ts.map +1 -0
  197. package/dist/launcher/npm-runtime-bundle-layout.store.js +2 -0
  198. package/dist/launcher/npm-runtime-bundle-layout.store.js.map +1 -0
  199. package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts +2 -1
  200. package/dist/launcher/npm-runtime-bundle-manifest.service.d.ts.map +1 -0
  201. package/dist/launcher/npm-runtime-bundle-manifest.service.js +2 -0
  202. package/dist/launcher/npm-runtime-bundle-manifest.service.js.map +1 -0
  203. package/dist/launcher/npm-runtime-bundle.service.d.ts +2 -1
  204. package/dist/launcher/npm-runtime-bundle.service.d.ts.map +1 -0
  205. package/dist/launcher/npm-runtime-bundle.service.js +2 -0
  206. package/dist/launcher/npm-runtime-bundle.service.js.map +1 -0
  207. package/dist/launcher/npm-runtime-bundle.types.d.ts +2 -1
  208. package/dist/launcher/npm-runtime-bundle.types.d.ts.map +1 -0
  209. package/dist/launcher/npm-runtime-launcher.service.d.ts +2 -1
  210. package/dist/launcher/npm-runtime-launcher.service.d.ts.map +1 -0
  211. package/dist/launcher/npm-runtime-launcher.service.js +2 -0
  212. package/dist/launcher/npm-runtime-launcher.service.js.map +1 -0
  213. package/dist/launcher/npm-runtime-update-command.service.d.ts +5 -1
  214. package/dist/launcher/npm-runtime-update-command.service.d.ts.map +1 -0
  215. package/dist/launcher/npm-runtime-update-command.service.js +32 -0
  216. package/dist/launcher/npm-runtime-update-command.service.js.map +1 -0
  217. package/dist/launcher/npm-runtime-update-source.service.d.ts +2 -1
  218. package/dist/launcher/npm-runtime-update-source.service.d.ts.map +1 -0
  219. package/dist/launcher/npm-runtime-update-source.service.js +2 -0
  220. package/dist/launcher/npm-runtime-update-source.service.js.map +1 -0
  221. package/dist/launcher/npm-runtime-update-state.store.d.ts +2 -1
  222. package/dist/launcher/npm-runtime-update-state.store.d.ts.map +1 -0
  223. package/dist/launcher/npm-runtime-update-state.store.js +2 -0
  224. package/dist/launcher/npm-runtime-update-state.store.js.map +1 -0
  225. package/dist/launcher/npm-runtime-update.manager.d.ts +2 -1
  226. package/dist/launcher/npm-runtime-update.manager.d.ts.map +1 -0
  227. package/dist/launcher/npm-runtime-update.manager.js +2 -0
  228. package/dist/launcher/npm-runtime-update.manager.js.map +1 -0
  229. package/dist/launcher/npm-runtime-update.service.d.ts +2 -1
  230. package/dist/launcher/npm-runtime-update.service.d.ts.map +1 -0
  231. package/dist/launcher/npm-runtime-update.service.js +2 -0
  232. package/dist/launcher/npm-runtime-update.service.js.map +1 -0
  233. package/dist/service-runtime.service.d.ts +2 -1
  234. package/dist/service-runtime.service.d.ts.map +1 -0
  235. package/dist/service-runtime.service.js +6 -1
  236. package/dist/service-runtime.service.js.map +1 -0
  237. package/dist/shared/controllers/gateway.controller.d.ts +2 -1
  238. package/dist/shared/controllers/gateway.controller.d.ts.map +1 -0
  239. package/dist/shared/controllers/gateway.controller.js +2 -0
  240. package/dist/shared/controllers/gateway.controller.js.map +1 -0
  241. package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts +2 -1
  242. package/dist/shared/services/gateway/gateway-restart-wake.service.d.ts.map +1 -0
  243. package/dist/shared/services/gateway/gateway-restart-wake.service.js +2 -0
  244. package/dist/shared/services/gateway/gateway-restart-wake.service.js.map +1 -0
  245. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts +2 -1
  246. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts.map +1 -0
  247. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js +2 -0
  248. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js.map +1 -0
  249. package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts +2 -1
  250. package/dist/shared/services/gateway/managers/gateway-remote.manager.d.ts.map +1 -0
  251. package/dist/shared/services/gateway/managers/gateway-remote.manager.js +2 -0
  252. package/dist/shared/services/gateway/managers/gateway-remote.manager.js.map +1 -0
  253. package/dist/shared/services/gateway/nextclaw-app.service.d.ts +2 -1
  254. package/dist/shared/services/gateway/nextclaw-app.service.d.ts.map +1 -0
  255. package/dist/shared/services/gateway/nextclaw-app.service.js +2 -0
  256. package/dist/shared/services/gateway/nextclaw-app.service.js.map +1 -0
  257. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts +2 -1
  258. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts.map +1 -0
  259. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js +2 -0
  260. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js.map +1 -0
  261. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts +2 -1
  262. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts.map +1 -0
  263. package/dist/shared/services/gateway/service-bootstrap-status.service.js +2 -0
  264. package/dist/shared/services/gateway/service-bootstrap-status.service.js.map +1 -0
  265. package/dist/shared/services/gateway/service-startup-support.service.d.ts +2 -1
  266. package/dist/shared/services/gateway/service-startup-support.service.d.ts.map +1 -0
  267. package/dist/shared/services/gateway/service-startup-support.service.js +2 -0
  268. package/dist/shared/services/gateway/service-startup-support.service.js.map +1 -0
  269. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts +2 -1
  270. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts.map +1 -0
  271. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js +2 -0
  272. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js.map +1 -0
  273. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts +2 -1
  274. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.d.ts.map +1 -0
  275. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js +2 -0
  276. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js.map +1 -0
  277. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts +2 -1
  278. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts.map +1 -0
  279. package/dist/shared/services/marketplace/service-marketplace-installer.service.js +2 -0
  280. package/dist/shared/services/marketplace/service-marketplace-installer.service.js.map +1 -0
  281. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts +2 -1
  282. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.d.ts.map +1 -0
  283. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js +2 -0
  284. package/dist/shared/services/marketplace/service-mcp-marketplace-ops.js.map +1 -0
  285. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts +2 -1
  286. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts.map +1 -0
  287. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js +2 -0
  288. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js.map +1 -0
  289. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts +2 -1
  290. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts.map +1 -0
  291. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js +2 -1
  292. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js.map +1 -0
  293. package/dist/shared/services/restart/restart-coordinator.service.d.ts +2 -1
  294. package/dist/shared/services/restart/restart-coordinator.service.d.ts.map +1 -0
  295. package/dist/shared/services/restart/restart-coordinator.service.js +2 -0
  296. package/dist/shared/services/restart/restart-coordinator.service.js.map +1 -0
  297. package/dist/shared/services/restart/restart-sentinel.service.d.ts +2 -1
  298. package/dist/shared/services/restart/restart-sentinel.service.d.ts.map +1 -0
  299. package/dist/shared/services/restart/restart-sentinel.service.js +2 -0
  300. package/dist/shared/services/restart/restart-sentinel.service.js.map +1 -0
  301. package/dist/shared/services/restart/runtime-restart-request.service.d.ts +2 -1
  302. package/dist/shared/services/restart/runtime-restart-request.service.d.ts.map +1 -0
  303. package/dist/shared/services/restart/runtime-restart-request.service.js +2 -0
  304. package/dist/shared/services/restart/runtime-restart-request.service.js.map +1 -0
  305. package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts +85 -0
  306. package/dist/shared/services/runtime/managed-service-supervisor.service.d.ts.map +1 -0
  307. package/dist/shared/services/runtime/managed-service-supervisor.service.js +271 -0
  308. package/dist/shared/services/runtime/managed-service-supervisor.service.js.map +1 -0
  309. package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts +2 -1
  310. package/dist/shared/services/runtime/nextclaw-distribution.service.d.ts.map +1 -0
  311. package/dist/shared/services/runtime/nextclaw-distribution.service.js +2 -0
  312. package/dist/shared/services/runtime/nextclaw-distribution.service.js.map +1 -0
  313. package/dist/shared/services/runtime/runtime-command.service.d.ts +3 -1
  314. package/dist/shared/services/runtime/runtime-command.service.d.ts.map +1 -0
  315. package/dist/shared/services/runtime/runtime-command.service.js +5 -0
  316. package/dist/shared/services/runtime/runtime-command.service.js.map +1 -0
  317. package/dist/shared/services/runtime/runtime-config-init.service.d.ts +2 -1
  318. package/dist/shared/services/runtime/runtime-config-init.service.d.ts.map +1 -0
  319. package/dist/shared/services/runtime/runtime-config-init.service.js +2 -0
  320. package/dist/shared/services/runtime/runtime-config-init.service.js.map +1 -0
  321. package/dist/shared/services/runtime/service-managed-startup.service.d.ts +4 -32
  322. package/dist/shared/services/runtime/service-managed-startup.service.d.ts.map +1 -0
  323. package/dist/shared/services/runtime/service-managed-startup.service.js +10 -92
  324. package/dist/shared/services/runtime/service-managed-startup.service.js.map +1 -0
  325. package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts +2 -1
  326. package/dist/shared/services/runtime/utils/managed-service-routing.utils.d.ts.map +1 -0
  327. package/dist/shared/services/runtime/utils/managed-service-routing.utils.js +2 -0
  328. package/dist/shared/services/runtime/utils/managed-service-routing.utils.js.map +1 -0
  329. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts +5 -2
  330. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.d.ts.map +1 -0
  331. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js +23 -17
  332. package/dist/shared/services/runtime/utils/service-remote-runtime.utils.js.map +1 -0
  333. package/dist/shared/services/ui/companion-runtime.service.d.ts +2 -1
  334. package/dist/shared/services/ui/companion-runtime.service.d.ts.map +1 -0
  335. package/dist/shared/services/ui/companion-runtime.service.js +2 -0
  336. package/dist/shared/services/ui/companion-runtime.service.js.map +1 -0
  337. package/dist/shared/services/ui/local-ui-discovery.service.d.ts +2 -1
  338. package/dist/shared/services/ui/local-ui-discovery.service.d.ts.map +1 -0
  339. package/dist/shared/services/ui/local-ui-discovery.service.js +2 -0
  340. package/dist/shared/services/ui/local-ui-discovery.service.js.map +1 -0
  341. package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts +2 -1
  342. package/dist/shared/services/ui/npm-runtime-update-host.service.d.ts.map +1 -0
  343. package/dist/shared/services/ui/npm-runtime-update-host.service.js +2 -0
  344. package/dist/shared/services/ui/npm-runtime-update-host.service.js.map +1 -0
  345. package/dist/shared/services/ui/runtime-control-host.service.d.ts +2 -1
  346. package/dist/shared/services/ui/runtime-control-host.service.d.ts.map +1 -0
  347. package/dist/shared/services/ui/runtime-control-host.service.js +2 -0
  348. package/dist/shared/services/ui/runtime-control-host.service.js.map +1 -0
  349. package/dist/shared/services/ui/service-remote-access.service.d.ts +2 -1
  350. package/dist/shared/services/ui/service-remote-access.service.d.ts.map +1 -0
  351. package/dist/shared/services/ui/service-remote-access.service.js +2 -0
  352. package/dist/shared/services/ui/service-remote-access.service.js.map +1 -0
  353. package/dist/shared/services/ui/ui-bridge-api.service.d.ts +2 -1
  354. package/dist/shared/services/ui/ui-bridge-api.service.d.ts.map +1 -0
  355. package/dist/shared/services/ui/ui-bridge-api.service.js +2 -0
  356. package/dist/shared/services/ui/ui-bridge-api.service.js.map +1 -0
  357. package/dist/shared/services/workspace/workspace-manager.service.d.ts +2 -1
  358. package/dist/shared/services/workspace/workspace-manager.service.d.ts.map +1 -0
  359. package/dist/shared/services/workspace/workspace-manager.service.js +2 -0
  360. package/dist/shared/services/workspace/workspace-manager.service.js.map +1 -0
  361. package/dist/shared/stores/companion-runtime.store.d.ts +2 -1
  362. package/dist/shared/stores/companion-runtime.store.d.ts.map +1 -0
  363. package/dist/shared/stores/companion-runtime.store.js +2 -0
  364. package/dist/shared/stores/companion-runtime.store.js.map +1 -0
  365. package/dist/shared/stores/local-ui-runtime.store.d.ts +2 -1
  366. package/dist/shared/stores/local-ui-runtime.store.d.ts.map +1 -0
  367. package/dist/shared/stores/local-ui-runtime.store.js +2 -0
  368. package/dist/shared/stores/local-ui-runtime.store.js.map +1 -0
  369. package/dist/shared/stores/managed-service-state.store.d.ts +19 -1
  370. package/dist/shared/stores/managed-service-state.store.d.ts.map +1 -0
  371. package/dist/shared/stores/managed-service-state.store.js +2 -0
  372. package/dist/shared/stores/managed-service-state.store.js.map +1 -0
  373. package/dist/shared/stores/pending-restart.store.d.ts +2 -1
  374. package/dist/shared/stores/pending-restart.store.d.ts.map +1 -0
  375. package/dist/shared/stores/pending-restart.store.js +2 -0
  376. package/dist/shared/stores/pending-restart.store.js.map +1 -0
  377. package/dist/shared/types/cli.types.d.ts +16 -1
  378. package/dist/shared/types/cli.types.d.ts.map +1 -0
  379. package/dist/shared/types/distribution.types.d.ts +2 -1
  380. package/dist/shared/types/distribution.types.d.ts.map +1 -0
  381. package/dist/shared/utils/cli.utils.d.ts +2 -1
  382. package/dist/shared/utils/cli.utils.d.ts.map +1 -0
  383. package/dist/shared/utils/cli.utils.js +2 -0
  384. package/dist/shared/utils/cli.utils.js.map +1 -0
  385. package/dist/shared/utils/config-path.d.ts +2 -1
  386. package/dist/shared/utils/config-path.d.ts.map +1 -0
  387. package/dist/shared/utils/config-path.js +2 -0
  388. package/dist/shared/utils/config-path.js.map +1 -0
  389. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts +2 -1
  390. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.d.ts.map +1 -0
  391. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js +2 -0
  392. package/dist/shared/utils/marketplace/cli-subcommand-launch.utils.js.map +1 -0
  393. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts +2 -1
  394. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts.map +1 -0
  395. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js +2 -0
  396. package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js.map +1 -0
  397. package/dist/shared/utils/package/package-manifest.utils.d.ts +2 -1
  398. package/dist/shared/utils/package/package-manifest.utils.d.ts.map +1 -0
  399. package/dist/shared/utils/package/package-manifest.utils.js +2 -0
  400. package/dist/shared/utils/package/package-manifest.utils.js.map +1 -0
  401. package/dist/shared/utils/runtime-helpers.d.ts +2 -1
  402. package/dist/shared/utils/runtime-helpers.d.ts.map +1 -0
  403. package/dist/shared/utils/runtime-helpers.js +2 -0
  404. package/dist/shared/utils/runtime-helpers.js.map +1 -0
  405. package/dist/shared/utils/service-port-probe.utils.d.ts +2 -1
  406. package/dist/shared/utils/service-port-probe.utils.d.ts.map +1 -0
  407. package/dist/shared/utils/service-port-probe.utils.js +2 -0
  408. package/dist/shared/utils/service-port-probe.utils.js.map +1 -0
  409. package/dist/shared/utils/startup-trace.d.ts +2 -1
  410. package/dist/shared/utils/startup-trace.d.ts.map +1 -0
  411. package/dist/shared/utils/startup-trace.js +2 -0
  412. package/dist/shared/utils/startup-trace.js.map +1 -0
  413. package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts +2 -1
  414. package/dist/shared/utils/top-level-nextclaw-command-env.utils.d.ts.map +1 -0
  415. package/dist/shared/utils/top-level-nextclaw-command-env.utils.js +2 -0
  416. package/dist/shared/utils/top-level-nextclaw-command-env.utils.js.map +1 -0
  417. package/package.json +20 -20
@@ -11,4 +11,5 @@ declare class UiCommands {
11
11
  run: (opts: UiCommandOptions) => Promise<void>;
12
12
  }
13
13
  //#endregion
14
- export { UiCommands };
14
+ export { UiCommands };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/ui/index.ts"],"mappings":";;;;cAIa,UAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,EAAuB,qBAAA;IACvB,gBAAA;EAAA;EAIJ,GAAA,GAAa,IAAA,EAAM,gBAAA,KAAmB,OAAA;AAAA"}
@@ -15,3 +15,5 @@ var UiCommands = class {
15
15
  };
16
16
  //#endregion
17
17
  export { UiCommands };
18
+
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/ui/index.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport type { UiCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport type { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\n\nexport class UiCommands {\n constructor(\n private readonly deps: {\n runtimeCommandService: RuntimeCommandService;\n forcedPublicHost: string;\n }\n ) {}\n\n run = async (opts: UiCommandOptions): Promise<void> => {\n const uiOverrides: Partial<Config[\"ui\"]> = {\n enabled: true,\n host: this.deps.forcedPublicHost,\n open: Boolean(opts.open),\n };\n if (opts.port) {\n uiOverrides.port = Number(opts.port);\n }\n await this.deps.runtimeCommandService.startGateway({\n uiOverrides,\n });\n };\n}\n"],"mappings":";AAIA,IAAa,aAAb,MAAwB;CACtB,YACE,MAIA;AAJiB,OAAA,OAAA;;CAMnB,MAAM,OAAO,SAA0C;EACrD,MAAM,cAAqC;GACzC,SAAS;GACT,MAAM,KAAK,KAAK;GAChB,MAAM,QAAQ,KAAK,KAAK;GACzB;AACD,MAAI,KAAK,KACP,aAAY,OAAO,OAAO,KAAK,KAAK;AAEtC,QAAM,KAAK,KAAK,sBAAsB,aAAa,EACjD,aACD,CAAC"}
@@ -17,4 +17,5 @@ declare class LlmUsageCommandService {
17
17
  private readonly toPercent;
18
18
  }
19
19
  //#endregion
20
- export { LlmUsageCommandService };
20
+ export { LlmUsageCommandService };
21
+ //# sourceMappingURL=llm-usage-command.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-usage-command.service.d.ts","names":[],"sources":["../../../../../src/cli/commands/usage/services/llm-usage-command.service.ts"],"mappings":";;;;cAMa,sBAAA;EAAA,iBACM,YAAA;cAEL,IAAA;IACV,YAAA,GAAe,eAAA;EAAA;EAAA,SAKR,IAAA,GAAc,IAAA,GAAM,mBAAA,KAA2B,OAAA;EAAA,iBAiBvC,YAAA;EAAA,iBAoBA,WAAA;EAAA,iBA0BA,SAAA;EAAA,iBAoBA,cAAA;EAAA,iBAsBA,aAAA;EAAA,iBAeA,WAAA;EAAA,iBA0BA,SAAA;AAAA"}
@@ -148,3 +148,5 @@ var LlmUsageCommandService = class {
148
148
  };
149
149
  //#endregion
150
150
  export { LlmUsageCommandService };
151
+
152
+ //# sourceMappingURL=llm-usage-command.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-usage-command.service.js","names":[],"sources":["../../../../../src/cli/commands/usage/services/llm-usage-command.service.ts"],"sourcesContent":["import type { UsageCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport {\n LlmUsageManager,\n type LlmUsageStats,\n} from \"@nextclaw/kernel\";\n\nexport class LlmUsageCommandService {\n private readonly usageManager: LlmUsageManager;\n\n constructor(deps: {\n usageManager?: LlmUsageManager;\n } = {}) {\n this.usageManager = deps.usageManager ?? new LlmUsageManager();\n }\n\n readonly show = async (opts: UsageCommandOptions = {}): Promise<void> => {\n if (opts.history && opts.stats) {\n console.error(\"Choose only one usage mode: `--history` or `--stats`.\");\n process.exitCode = 1;\n return;\n }\n if (opts.history) {\n this.showHistory(opts);\n return;\n }\n if (opts.stats) {\n this.showStats(opts);\n return;\n }\n this.showSnapshot(opts);\n };\n\n private readonly showSnapshot = (opts: UsageCommandOptions): void => {\n const snapshot = this.usageManager.getSnapshot();\n if (opts.json) {\n console.log(JSON.stringify({ ok: Boolean(snapshot), mode: \"snapshot\", path: this.usageManager.snapshotPath, snapshot }, null, 2));\n process.exitCode = 0;\n return;\n }\n if (!snapshot) {\n console.log([\n \"No LLM usage snapshot recorded yet.\",\n `Snapshot path: ${this.usageManager.snapshotPath}`,\n \"Run `nextclaw agent -m \\\"ping\\\"` or use the local UI once, then retry `nextclaw usage`.\",\n ].join(\"\\n\"));\n process.exitCode = 0;\n return;\n }\n console.log(this.renderSnapshot(snapshot));\n process.exitCode = 0;\n };\n\n private readonly showHistory = (opts: UsageCommandOptions): void => {\n const records = this.usageManager.getHistory(opts.limit);\n if (opts.json) {\n console.log(JSON.stringify({\n ok: records.length > 0,\n mode: \"history\",\n path: this.usageManager.historyPath,\n limit: this.usageManager.resolveHistoryLimit(opts.limit),\n records,\n }, null, 2));\n process.exitCode = 0;\n return;\n }\n if (records.length === 0) {\n console.log([\n \"No LLM usage history recorded yet.\",\n `History path: ${this.usageManager.historyPath}`,\n \"Run `nextclaw agent -m \\\"ping\\\"` or use the local UI once, then retry `nextclaw usage --history`.\",\n ].join(\"\\n\"));\n process.exitCode = 0;\n return;\n }\n console.log(this.renderHistory(records));\n process.exitCode = 0;\n };\n\n private readonly showStats = (opts: UsageCommandOptions): void => {\n const stats = this.usageManager.getStats();\n if (opts.json) {\n console.log(JSON.stringify({ ok: stats.totalRecords > 0, mode: \"stats\", path: this.usageManager.historyPath, stats }, null, 2));\n process.exitCode = 0;\n return;\n }\n if (stats.totalRecords === 0) {\n console.log([\n \"No LLM usage history recorded yet.\",\n `History path: ${this.usageManager.historyPath}`,\n \"Run `nextclaw agent -m \\\"ping\\\"` or use the local UI once, then retry `nextclaw usage --stats`.\",\n ].join(\"\\n\"));\n process.exitCode = 0;\n return;\n }\n console.log(this.renderStats(stats));\n process.exitCode = 0;\n };\n\n private readonly renderSnapshot = (snapshot: NonNullable<ReturnType<LlmUsageManager[\"getSnapshot\"]>>): string => {\n const lines = [\n \"Latest LLM usage snapshot\",\n `Observed at: ${snapshot.observedAt}`,\n `Source: ${snapshot.source}`,\n `Model: ${snapshot.model ?? \"unknown\"}`,\n `Prompt tokens: ${snapshot.summary.promptTokens}`,\n `Completion tokens: ${snapshot.summary.completionTokens}`,\n `Total tokens: ${snapshot.summary.totalTokens}`,\n `Cached tokens: ${snapshot.summary.cachedTokens}`,\n `Cache hit: ${snapshot.summary.cacheHit ? \"yes\" : \"no\"}`,\n `Snapshot path: ${this.usageManager.snapshotPath}`,\n ];\n if (snapshot.summary.cacheMetricKeys.length > 0) {\n lines.push(`Cache metric keys: ${snapshot.summary.cacheMetricKeys.join(\", \")}`);\n }\n if (Object.keys(snapshot.usage).length > 0) {\n lines.push(\"\", \"Raw usage:\", JSON.stringify(snapshot.usage, null, 2));\n }\n return lines.join(\"\\n\");\n };\n\n private readonly renderHistory = (records: ReturnType<LlmUsageManager[\"getHistory\"]>): string => {\n const lines = [\n \"Recent LLM usage history\",\n `History path: ${this.usageManager.historyPath}`,\n `Showing: ${records.length} record(s)`,\n \"\",\n ];\n for (const [index, record] of records.entries()) {\n lines.push(\n `${index + 1}. ${record.observedAt} | source=${record.source} | model=${record.model ?? \"unknown\"} | total=${record.summary.totalTokens} | cached=${record.summary.cachedTokens} | cache-hit=${record.summary.cacheHit ? \"yes\" : \"no\"}`\n );\n }\n return lines.join(\"\\n\");\n };\n\n private readonly renderStats = (stats: LlmUsageStats): string => {\n const lines = [\n \"LLM usage history stats\",\n `History path: ${this.usageManager.historyPath}`,\n `Records: ${stats.totalRecords}`,\n `Usage records: ${stats.usageRecordCount}`,\n `Empty usage records: ${stats.emptyUsageRecordCount}`,\n `Prompt-bearing records: ${stats.promptTokenRecordCount}`,\n `Oldest observed at: ${stats.oldestObservedAt ?? \"n/a\"}`,\n `Latest observed at: ${stats.latestObservedAt ?? \"n/a\"}`,\n `Prompt tokens: ${stats.totalPromptTokens}`,\n `Completion tokens: ${stats.totalCompletionTokens}`,\n `Total tokens: ${stats.totalTokens}`,\n `Cached tokens: ${stats.totalCachedTokens}`,\n `Cache hit records: ${stats.cacheHitRecords}/${stats.promptTokenRecordCount} (${this.toPercent(stats.cacheHitRate)})`,\n `Cache token rate: ${this.toPercent(stats.tokenCacheRate)}`,\n ];\n if (stats.sources.length > 0) {\n lines.push(`Sources: ${stats.sources.map((item) => `${item.value}=${item.count}`).join(\", \")}`);\n }\n if (stats.models.length > 0) {\n lines.push(`Models: ${stats.models.map((item) => `${item.value}=${item.count}`).join(\", \")}`);\n }\n return lines.join(\"\\n\");\n };\n\n private readonly toPercent = (value: number): string => {\n return `${(value * 100).toFixed(1)}%`;\n };\n}\n"],"mappings":"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"}
@@ -4,4 +4,5 @@ import { PluginChannelBinding } from "@nextclaw/openclaw-compat";
4
4
  //#region src/commands/channel/channel-config-view.d.ts
5
5
  declare function resolveChannelConfigView(config: Config, bindings: PluginChannelBinding[]): Config;
6
6
  //#endregion
7
- export { resolveChannelConfigView };
7
+ export { resolveChannelConfigView };
8
+ //# sourceMappingURL=channel-config-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-config-view.d.ts","names":[],"sources":["../../../src/commands/channel/channel-config-view.ts"],"mappings":";;;;iBAGgB,wBAAA,CAAyB,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,oBAAA,KAAyB,MAAA"}
@@ -5,3 +5,5 @@ function resolveChannelConfigView(config, bindings) {
5
5
  }
6
6
  //#endregion
7
7
  export { resolveChannelConfigView };
8
+
9
+ //# sourceMappingURL=channel-config-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-config-view.js","names":[],"sources":["../../../src/commands/channel/channel-config-view.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport { toPluginConfigView, type PluginChannelBinding } from \"@nextclaw/openclaw-compat\";\n\nexport function resolveChannelConfigView(config: Config, bindings: PluginChannelBinding[]): Config {\n return toPluginConfigView(config, bindings) as Config;\n}\n"],"mappings":";;AAGA,SAAgB,yBAAyB,QAAgB,UAA0C;AACjG,QAAO,mBAAmB,QAAQ,SAAS"}
@@ -29,4 +29,5 @@ declare class ChannelListViewService {
29
29
  private resolveDefaultAccountId;
30
30
  }
31
31
  //#endregion
32
- export { ChannelListAccount, ChannelListEntry, ChannelListOutput, ChannelListViewService };
32
+ export { ChannelListAccount, ChannelListEntry, ChannelListOutput, ChannelListViewService };
33
+ //# sourceMappingURL=channel-list-view.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-list-view.service.d.ts","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"mappings":";;;;KAKY,gBAAA;EACV,EAAA;EACA,OAAA;EACA,gBAAA;EACA,QAAA,GAAW,kBAAA;AAAA;AAAA,KAGD,kBAAA;EACV,EAAA;EACA,MAAA;AAAA;AAAA,KAGU,iBAAA;EACV,QAAA,EAAU,gBAAA;AAAA;AAAA,cAmBC,sBAAA;EACX,KAAA,GAAS,MAAA;IACP,MAAA,EAAQ,MAAA;IACR,YAAA;IACA,cAAA,EAAgB,oBAAA;EAAA,MACd,iBAAA;EAAA,QAkBI,wBAAA;EAAA,QAGA,qBAAA;EAAA,QAKA,kBAAA;EAAA,QAYA,eAAA;EAAA,QAiBA,mBAAA;EAAA,QAWA,uBAAA;AAAA"}
@@ -62,3 +62,5 @@ var ChannelListViewService = class {
62
62
  };
63
63
  //#endregion
64
64
  export { ChannelListViewService };
65
+
66
+ //# sourceMappingURL=channel-list-view.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-list-view.service.js","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport type { PluginChannelBinding } from \"@nextclaw/openclaw-compat\";\nimport { resolveChannelConfigView } from \"./channel-config-view.js\";\nimport { listExtensionChannelIds } from \"@nextclaw/kernel\";\n\nexport type ChannelListEntry = {\n id: string;\n enabled: boolean;\n defaultAccountId?: string;\n accounts?: ChannelListAccount[];\n};\n\nexport type ChannelListAccount = {\n id: string;\n userId?: string;\n};\n\nexport type ChannelListOutput = {\n channels: ChannelListEntry[];\n};\n\ntype ChannelListSource = {\n id: string;\n resolveDefaultAccountId?: (channelConfig: Record<string, unknown> | undefined) => string | undefined;\n};\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport class ChannelListViewService {\n build = (params: {\n config: Config;\n workspaceDir: string;\n pluginBindings: PluginChannelBinding[];\n }): ChannelListOutput => {\n const { config, pluginBindings, workspaceDir } = params;\n const sources = this.mergeChannelSources(\n pluginBindings.map(this.toPluginChannelSource),\n this.toManifestChannelSources(listExtensionChannelIds({\n config,\n workspace: workspaceDir,\n })),\n );\n const channelConfig = resolveChannelConfigView(config, pluginBindings);\n const channelConfigs = readRecord(channelConfig.channels) ?? {};\n return {\n channels: sources\n .map((source) => this.toChannelListEntry(source, channelConfigs[source.id]))\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n };\n\n private toManifestChannelSources = (channelIds: string[]): ChannelListSource[] =>\n channelIds.map((id) => ({ id }));\n\n private toPluginChannelSource = (binding: PluginChannelBinding): ChannelListSource => ({\n id: binding.channelId,\n resolveDefaultAccountId: (channelConfig) => this.resolveDefaultAccountId(binding, channelConfig),\n });\n\n private toChannelListEntry = (source: ChannelListSource, rawChannelConfig: unknown): ChannelListEntry => {\n const channelConfig = readRecord(rawChannelConfig);\n const defaultAccountId = readString(channelConfig?.defaultAccountId) ?? source.resolveDefaultAccountId?.(channelConfig);\n const accounts = this.resolveAccounts(channelConfig);\n return {\n id: source.id,\n enabled: channelConfig?.enabled === true,\n ...(defaultAccountId ? { defaultAccountId } : {}),\n ...(accounts.length > 0 ? { accounts } : {})\n };\n };\n\n private resolveAccounts = (channelConfig: Record<string, unknown> | undefined): ChannelListAccount[] => {\n const accounts = readRecord(channelConfig?.accounts);\n if (!accounts) {\n return [];\n }\n return Object.entries(accounts)\n .map(([id, rawAccount]) => {\n const accountConfig = readRecord(rawAccount);\n const userId = readString(accountConfig?.userId);\n return {\n id,\n ...(userId ? { userId } : {})\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n };\n\n private mergeChannelSources = (\n pluginSources: ChannelListSource[],\n extensionSources: ChannelListSource[],\n ): ChannelListSource[] => {\n const sourcesByChannelId = new Map<string, ChannelListSource>();\n for (const source of [...pluginSources, ...extensionSources]) {\n sourcesByChannelId.set(source.id, source);\n }\n return [...sourcesByChannelId.values()];\n };\n\n private resolveDefaultAccountId = (\n binding: PluginChannelBinding,\n channelConfig: Record<string, unknown> | undefined,\n ): string | undefined => {\n const configAdapter = binding.channel.config?.defaultAccountId;\n if (!configAdapter) {\n return undefined;\n }\n try {\n return readString(configAdapter({ channels: { [binding.channelId]: channelConfig ?? {} } }));\n } catch {\n return undefined;\n }\n };\n}\n"],"mappings":";;;AA0BA,SAAS,WAAW,OAAqD;AACvE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;AAEF,QAAO;;AAGT,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,MAAM,GAAG,KAAA;;AAG/E,IAAa,yBAAb,MAAoC;CAClC,SAAS,WAIgB;EACvB,MAAM,EAAE,QAAQ,gBAAgB,iBAAiB;EACjD,MAAM,UAAU,KAAK,oBACnB,eAAe,IAAI,KAAK,sBAAsB,EAC9C,KAAK,yBAAyB,wBAAwB;GACpD;GACA,WAAW;GACZ,CAAC,CAAC,CACJ;EAED,MAAM,iBAAiB,WADD,yBAAyB,QAAQ,eAAe,CACtB,SAAS,IAAI,EAAE;AAC/D,SAAO,EACL,UAAU,QACP,KAAK,WAAW,KAAK,mBAAmB,QAAQ,eAAe,OAAO,IAAI,CAAC,CAC3E,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC,EAC1D;;CAGH,4BAAoC,eAClC,WAAW,KAAK,QAAQ,EAAE,IAAI,EAAE;CAElC,yBAAiC,aAAsD;EACrF,IAAI,QAAQ;EACZ,0BAA0B,kBAAkB,KAAK,wBAAwB,SAAS,cAAc;EACjG;CAED,sBAA8B,QAA2B,qBAAgD;EACvG,MAAM,gBAAgB,WAAW,iBAAiB;EAClD,MAAM,mBAAmB,WAAW,eAAe,iBAAiB,IAAI,OAAO,0BAA0B,cAAc;EACvH,MAAM,WAAW,KAAK,gBAAgB,cAAc;AACpD,SAAO;GACL,IAAI,OAAO;GACX,SAAS,eAAe,YAAY;GACpC,GAAI,mBAAmB,EAAE,kBAAkB,GAAG,EAAE;GAChD,GAAI,SAAS,SAAS,IAAI,EAAE,UAAU,GAAG,EAAE;GAC5C;;CAGH,mBAA2B,kBAA6E;EACtG,MAAM,WAAW,WAAW,eAAe,SAAS;AACpD,MAAI,CAAC,SACH,QAAO,EAAE;AAEX,SAAO,OAAO,QAAQ,SAAS,CAC5B,KAAK,CAAC,IAAI,gBAAgB;GAEzB,MAAM,SAAS,WADO,WAAW,WAAW,EACH,OAAO;AAChD,UAAO;IACL;IACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC7B;IACD,CACD,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC;;CAG3D,uBACE,eACA,qBACwB;EACxB,MAAM,qCAAqB,IAAI,KAAgC;AAC/D,OAAK,MAAM,UAAU,CAAC,GAAG,eAAe,GAAG,iBAAiB,CAC1D,oBAAmB,IAAI,OAAO,IAAI,OAAO;AAE3C,SAAO,CAAC,GAAG,mBAAmB,QAAQ,CAAC;;CAGzC,2BACE,SACA,kBACuB;EACvB,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ;AAC9C,MAAI,CAAC,cACH;AAEF,MAAI;AACF,UAAO,WAAW,cAAc,EAAE,UAAU,GAAG,QAAQ,YAAY,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;UACtF;AACN"}
@@ -28,4 +28,5 @@ declare class ChannelCommands {
28
28
  private buildChannelSetupInput;
29
29
  }
30
30
  //#endregion
31
- export { ChannelCommands, resolveChannelConfigView };
31
+ export { ChannelCommands, resolveChannelConfigView };
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/commands/channel/index.ts"],"mappings":";;;;cA4Ca,eAAA;EAAA,QAID,IAAA;EAAA,iBAHO,eAAA;cAGP,IAAA;IACN,IAAA;IACA,YAAA;IACA,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,MAAA;EA+BA,IAAA,GAAQ,IAAA,GAAM,mBAAA;EAiBd,KAAA,GAAe,IAAA,GAAM,oBAAA,KAA4B,OAAA;EAAA,QA4BzC,oBAAA;EAAA,QAUA,2BAAA;EAAA,QAWA,sBAAA;EAAA,QAWA,kBAAA;EAAA,QA8BA,iBAAA;EAAA,QAOA,4BAAA;EAAA,QAYA,gCAAA;EAAA,QAeA,6BAAA;EAUR,GAAA,GAAa,IAAA,EAAM,kBAAA,KAAqB,OAAA;EAAA,QA6ChC,gBAAA;EAAA,QASA,6BAAA;EAAA,QAaA,2BAAA;EAAA,QASA,sBAAA;AAAA"}
@@ -245,3 +245,5 @@ var ChannelCommands = class {
245
245
  };
246
246
  //#endregion
247
247
  export { ChannelCommands, resolveChannelConfigView };
248
+
249
+ //# sourceMappingURL=index.js.map
@@ -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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"}
@@ -9,4 +9,5 @@ declare function buildReservedPluginLoadOptions(): {
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