@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 McpCommands {
11
11
  private toggleEnabled;
12
12
  }
13
13
  //#endregion
14
- export { McpCommands };
14
+ export { McpCommands };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/mcp/index.ts"],"mappings":";;;cA4Ia,WAAA;EACX,IAAA,GAAQ,IAAA,GAAM,cAAA;EA+Bd,GAAA,GAAa,IAAA,UAAc,OAAA,YAAmB,IAAA,EAAM,oBAAA,KAAuB,OAAA;EAa3E,MAAA,GAAgB,IAAA,aAAe,OAAA;EAa/B,MAAA,GAAgB,IAAA,aAAe,OAAA;EAI/B,OAAA,GAAiB,IAAA,aAAe,OAAA;EAIhC,MAAA,GAAgB,IAAA,WAAe,IAAA,GAAM,gBAAA,KAAwB,OAAA;EAAA,QAiCrD,aAAA;AAAA"}
@@ -191,3 +191,5 @@ function reportUserInputIssue(message) {
191
191
  }
192
192
  //#endregion
193
193
  export { McpCommands };
194
+
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/mcp/index.ts"],"sourcesContent":["import { loadConfig, saveConfig, type McpServerDefinition } from \"@nextclaw/core\";\nimport {\n McpDoctorFacade,\n McpMutationService,\n McpRegistryService\n} from \"@nextclaw/mcp\";\nimport type { McpAddCommandOptions, McpDoctorOptions, McpListOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction parsePairs(values: string[] | undefined, label: string): Record<string, string> {\n const output: Record<string, string> = {};\n for (const raw of values ?? []) {\n const index = raw.indexOf(\"=\");\n if (index <= 0) {\n throw new Error(`Invalid ${label} entry: ${raw}. Expected key=value.`);\n }\n const key = raw.slice(0, index).trim();\n const value = raw.slice(index + 1);\n if (!key) {\n throw new Error(`Invalid ${label} entry: ${raw}. Expected key=value.`);\n }\n output[key] = value;\n }\n return output;\n}\n\nfunction parseTimeoutMs(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid timeout: ${String(value)}`);\n }\n return Math.trunc(parsed);\n}\n\nfunction buildMcpServerDefinition(command: string[], opts: McpAddCommandOptions): McpServerDefinition {\n const transport = (normalizeOptionalString(opts.transport) ?? \"stdio\").toLowerCase();\n const disabled = Boolean(opts.disabled);\n const explicitAgents = Array.from(\n new Set(\n (opts.agent ?? [])\n .map((agentId) => normalizeOptionalString(agentId))\n .filter((agentId): agentId is string => Boolean(agentId))\n )\n );\n const allAgents = explicitAgents.length === 0 ? true : Boolean(opts.allAgents);\n\n if (transport === \"stdio\") {\n if (command.length === 0) {\n throw new Error(\"stdio transport requires a command after --\");\n }\n return {\n enabled: !disabled,\n transport: {\n type: \"stdio\",\n command: command[0],\n args: command.slice(1),\n cwd: normalizeOptionalString(opts.cwd),\n env: parsePairs(opts.env, \"env\"),\n stderr: (normalizeOptionalString(opts.stderr) ?? \"pipe\") as \"inherit\" | \"pipe\" | \"ignore\"\n },\n scope: {\n allAgents,\n agents: allAgents ? [] : explicitAgents\n },\n policy: {\n trust: \"explicit\",\n start: \"eager\"\n },\n metadata: {\n source: \"manual\",\n installedAt: new Date().toISOString()\n }\n };\n }\n\n const url = normalizeOptionalString(opts.url);\n if (!url) {\n throw new Error(`${transport} transport requires --url`);\n }\n const timeoutMs = parseTimeoutMs(opts.timeoutMs);\n const shared = {\n enabled: !disabled,\n scope: {\n allAgents,\n agents: allAgents ? [] : explicitAgents\n },\n policy: {\n trust: \"explicit\" as const,\n start: \"eager\" as const\n },\n metadata: {\n source: \"manual\" as const,\n installedAt: new Date().toISOString()\n }\n };\n\n if (transport === \"http\") {\n return {\n ...shared,\n transport: {\n type: \"http\",\n url,\n headers: parsePairs(opts.header, \"header\"),\n timeoutMs: timeoutMs ?? 15000,\n verifyTls: !opts.insecure\n }\n };\n }\n\n if (transport === \"sse\") {\n return {\n ...shared,\n transport: {\n type: \"sse\",\n url,\n headers: parsePairs(opts.header, \"header\"),\n timeoutMs: timeoutMs ?? 15000,\n verifyTls: !opts.insecure,\n reconnect: {\n enabled: true,\n initialDelayMs: 1000,\n maxDelayMs: 30000\n }\n }\n };\n }\n\n throw new Error(`Unsupported MCP transport: ${transport}`);\n}\n\nexport class McpCommands {\n list = (opts: McpListOptions = {}): void => {\n const registry = new McpRegistryService({\n getConfig: () => loadConfig()\n });\n const servers = registry.listServers().map((server) => ({\n name: server.name,\n enabled: server.definition.enabled,\n transport: server.definition.transport.type,\n scope: server.definition.scope\n }));\n\n if (opts.json) {\n console.log(JSON.stringify({ servers }, null, 2));\n return;\n }\n\n if (servers.length === 0) {\n console.log(\"No MCP servers configured.\");\n return;\n }\n\n for (const server of servers) {\n const scope = server.scope.allAgents\n ? \"all-agents\"\n : server.scope.agents.length > 0\n ? `agents=${server.scope.agents.join(\",\")}`\n : \"default-agent\";\n console.log(`${server.enabled ? \"ENABLED \" : \"DISABLED\"} ${server.name} (${server.transport}, ${scope})`);\n }\n };\n\n add = async (name: string, command: string[], opts: McpAddCommandOptions): Promise<void> => {\n const mutation = new McpMutationService({\n getConfig: () => loadConfig(),\n saveConfig: (config) => saveConfig(config)\n });\n const result = mutation.addServer(name, buildMcpServerDefinition(command, opts));\n if (!result.changed) {\n reportUserInputIssue(result.message);\n return;\n }\n console.log(result.message);\n };\n\n remove = async (name: string): Promise<void> => {\n const mutation = new McpMutationService({\n getConfig: () => loadConfig(),\n saveConfig: (config) => saveConfig(config)\n });\n const result = mutation.removeServer(name);\n if (!result.changed) {\n reportUserInputIssue(result.message);\n return;\n }\n console.log(result.message);\n };\n\n enable = async (name: string): Promise<void> => {\n await this.toggleEnabled(name, true);\n };\n\n disable = async (name: string): Promise<void> => {\n await this.toggleEnabled(name, false);\n };\n\n doctor = async (name?: string, opts: McpDoctorOptions = {}): Promise<void> => {\n const registry = new McpRegistryService({\n getConfig: () => loadConfig()\n });\n const doctor = new McpDoctorFacade({\n getConfig: () => loadConfig(),\n registryService: registry\n });\n\n try {\n const reports = await doctor.inspect(name);\n if (opts.json) {\n console.log(JSON.stringify({ reports }, null, 2));\n return;\n }\n\n if (reports.length === 0) {\n console.log(\"No MCP servers matched.\");\n return;\n }\n\n for (const report of reports) {\n const status = report.error ? \"ERROR\" : \"OK\";\n const detail = report.error ? ` (${report.error})` : \"\";\n console.log(\n `[${status}] ${report.name} enabled=${report.enabled} transport=${report.transport} tools=${report.toolCount}${detail}`\n );\n }\n } finally {\n await registry.close();\n }\n };\n\n private toggleEnabled = async (name: string, enabled: boolean): Promise<void> => {\n const mutation = new McpMutationService({\n getConfig: () => loadConfig(),\n saveConfig: (config) => saveConfig(config)\n });\n const result = mutation.toggleEnabled(name, enabled);\n if (!result.changed) {\n reportUserInputIssue(result.message);\n return;\n }\n console.log(result.message);\n };\n}\n\nfunction reportUserInputIssue(message: string): void {\n console.error(message);\n process.exitCode = 1;\n}\n"],"mappings":"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"}
@@ -17,4 +17,5 @@ declare class RestartCommands {
17
17
  private isAdoptableNextclawRuntimeCommand;
18
18
  }
19
19
  //#endregion
20
- export { RestartCommands };
20
+ export { RestartCommands };
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/restart/index.ts"],"mappings":";;;;;cAUa,eAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,gBAAA;IACA,mCAAA,GAAsC,MAAA,aAAmB,OAAA;EAAA;EAI7D,GAAA,GAAa,IAAA,EAAM,mBAAA,KAAsB,OAAA;EAAA,QAuDjC,wBAAA;EAAA,QA6BA,oCAAA;EAAA,QAQA,iCAAA;AAAA"}
@@ -86,3 +86,5 @@ var RestartCommands = class {
86
86
  };
87
87
  //#endregion
88
88
  export { RestartCommands };
89
+
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/restart/index.ts"],"sourcesContent":["import { APP_NAME, loadConfig } from \"@nextclaw/core\";\nimport { managedServiceStateStore } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport { localUiRuntimeStore } from \"@nextclaw-service/shared/stores/local-ui-runtime.store.js\";\nimport { findListeningProcessByPort, isProcessRunning, resolveUiConfig, waitForExit } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { resolveManagedServiceUiOverrides } from \"@nextclaw-service/shared/utils/runtime-helpers.js\";\nimport { describeUnmanagedHealthyTargetMessage } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport type { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport type { StartCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport type { StartCommands } from \"@nextclaw-service/cli/commands/start/index.js\";\n\nexport class RestartCommands {\n constructor(\n private readonly deps: {\n runtimeCommandService: RuntimeCommandService;\n startCommands: StartCommands;\n forcedPublicHost: string;\n writeRestartSentinelFromExecContext: (reason: string) => Promise<void>;\n }\n ) {}\n\n run = async (opts: StartCommandOptions): Promise<void> => {\n await this.deps.writeRestartSentinelFromExecContext(\"cli.restart\");\n const uiOverrides = resolveManagedServiceUiOverrides({\n uiPort: opts.uiPort,\n forcedPublicHost: this.deps.forcedPublicHost\n });\n const targetUi = resolveUiConfig(loadConfig(), uiOverrides);\n\n const state = managedServiceStateStore.read();\n if (state && isProcessRunning(state.pid)) {\n console.log(`Restarting ${APP_NAME}...`);\n await this.deps.runtimeCommandService.stopService();\n } else {\n const foregroundRuntime = localUiRuntimeStore.read();\n const foregroundMatchesTarget = Boolean(\n foregroundRuntime &&\n isProcessRunning(foregroundRuntime.pid) &&\n foregroundRuntime.uiPort === targetUi.port\n );\n if (foregroundRuntime && foregroundMatchesTarget) {\n const restarted = await this.restartForegroundRuntime(foregroundRuntime.pid);\n if (!restarted) {\n return;\n }\n await this.deps.startCommands.run(opts);\n return;\n }\n if (state) {\n managedServiceStateStore.clear();\n console.log(\"Service state was stale and has been cleaned up.\");\n }\n\n const unmanagedHealthyServiceMessage = await describeUnmanagedHealthyTargetMessage({ uiOverrides });\n if (unmanagedHealthyServiceMessage) {\n const adoptedRuntimePid = this.resolveAdoptableForegroundRuntimePid(targetUi.port);\n if (adoptedRuntimePid) {\n const restarted = await this.restartForegroundRuntime(adoptedRuntimePid);\n if (!restarted) {\n return;\n }\n await this.deps.startCommands.run(opts);\n return;\n }\n console.error(`Error: Cannot restart ${APP_NAME} because the target UI/API port is already served by a healthy unmanaged instance.`);\n console.error(unmanagedHealthyServiceMessage);\n return;\n }\n if (!state) {\n console.log(\"No running service found. Starting a new service.\");\n }\n }\n\n await this.deps.startCommands.run(opts);\n };\n\n private restartForegroundRuntime = async (pid: number): Promise<boolean> => {\n console.log(`Restarting ${APP_NAME} foreground runtime (PID ${pid})...`);\n try {\n process.kill(pid, \"SIGTERM\");\n } catch (error) {\n console.error(`Failed to stop foreground runtime: ${String(error)}`);\n return false;\n }\n\n const stopped = await waitForExit(pid, 3000);\n if (!stopped) {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch (error) {\n console.error(`Failed to force stop foreground runtime: ${String(error)}`);\n return false;\n }\n const forcedStopped = await waitForExit(pid, 2000);\n if (!forcedStopped) {\n console.error(`Failed to stop foreground runtime PID ${pid}.`);\n return false;\n }\n }\n\n localUiRuntimeStore.clearIfOwnedByProcess(pid);\n console.log(`✓ ${APP_NAME} foreground runtime stopped`);\n return true;\n };\n\n private resolveAdoptableForegroundRuntimePid = (port: number): number | null => {\n const listeningProcess = findListeningProcessByPort(port);\n if (!listeningProcess || !isProcessRunning(listeningProcess.pid)) {\n return null;\n }\n return this.isAdoptableNextclawRuntimeCommand(listeningProcess.command) ? listeningProcess.pid : null;\n };\n\n private isAdoptableNextclawRuntimeCommand = (command: string | null): boolean => {\n const normalized = command?.trim() ?? \"\";\n if (!normalized) {\n return false;\n }\n return (\n /\\bserve\\b/.test(normalized) &&\n (\n normalized.includes(\"/dist/cli/app/index.js\") ||\n normalized.includes(\"/src/cli/app/index.js\") ||\n normalized.includes(\"/runtime/dist/cli/app/index.js\")\n )\n );\n };\n}\n"],"mappings":";;;;;;;;AAUA,IAAa,kBAAb,MAA6B;CAC3B,YACE,MAMA;AANiB,OAAA,OAAA;;CAQnB,MAAM,OAAO,SAA6C;AACxD,QAAM,KAAK,KAAK,oCAAoC,cAAc;EAClE,MAAM,cAAc,iCAAiC;GACnD,QAAQ,KAAK;GACb,kBAAkB,KAAK,KAAK;GAC7B,CAAC;EACF,MAAM,WAAW,gBAAgB,YAAY,EAAE,YAAY;EAE3D,MAAM,QAAQ,yBAAyB,MAAM;AAC7C,MAAI,SAAS,iBAAiB,MAAM,IAAI,EAAE;AACxC,WAAQ,IAAI,cAAc,SAAS,KAAK;AACxC,SAAM,KAAK,KAAK,sBAAsB,aAAa;SAC9C;GACL,MAAM,oBAAoB,oBAAoB,MAAM;GACpD,MAAM,0BAA0B,QAC9B,qBACA,iBAAiB,kBAAkB,IAAI,IACvC,kBAAkB,WAAW,SAAS,KACvC;AACD,OAAI,qBAAqB,yBAAyB;AAEhD,QAAI,CADc,MAAM,KAAK,yBAAyB,kBAAkB,IAAI,CAE1E;AAEF,UAAM,KAAK,KAAK,cAAc,IAAI,KAAK;AACvC;;AAEF,OAAI,OAAO;AACT,6BAAyB,OAAO;AAChC,YAAQ,IAAI,mDAAmD;;GAGjE,MAAM,iCAAiC,MAAM,sCAAsC,EAAE,aAAa,CAAC;AACnG,OAAI,gCAAgC;IAClC,MAAM,oBAAoB,KAAK,qCAAqC,SAAS,KAAK;AAClF,QAAI,mBAAmB;AAErB,SAAI,CADc,MAAM,KAAK,yBAAyB,kBAAkB,CAEtE;AAEF,WAAM,KAAK,KAAK,cAAc,IAAI,KAAK;AACvC;;AAEF,YAAQ,MAAM,yBAAyB,SAAS,oFAAoF;AACpI,YAAQ,MAAM,+BAA+B;AAC7C;;AAEF,OAAI,CAAC,MACH,SAAQ,IAAI,oDAAoD;;AAIpE,QAAM,KAAK,KAAK,cAAc,IAAI,KAAK;;CAGzC,2BAAmC,OAAO,QAAkC;AAC1E,UAAQ,IAAI,cAAc,SAAS,2BAA2B,IAAI,MAAM;AACxE,MAAI;AACF,WAAQ,KAAK,KAAK,UAAU;WACrB,OAAO;AACd,WAAQ,MAAM,sCAAsC,OAAO,MAAM,GAAG;AACpE,UAAO;;AAIT,MAAI,CADY,MAAM,YAAY,KAAK,IAAK,EAC9B;AACZ,OAAI;AACF,YAAQ,KAAK,KAAK,UAAU;YACrB,OAAO;AACd,YAAQ,MAAM,4CAA4C,OAAO,MAAM,GAAG;AAC1E,WAAO;;AAGT,OAAI,CADkB,MAAM,YAAY,KAAK,IAAK,EAC9B;AAClB,YAAQ,MAAM,yCAAyC,IAAI,GAAG;AAC9D,WAAO;;;AAIX,sBAAoB,sBAAsB,IAAI;AAC9C,UAAQ,IAAI,KAAK,SAAS,6BAA6B;AACvD,SAAO;;CAGT,wCAAgD,SAAgC;EAC9E,MAAM,mBAAmB,2BAA2B,KAAK;AACzD,MAAI,CAAC,oBAAoB,CAAC,iBAAiB,iBAAiB,IAAI,CAC9D,QAAO;AAET,SAAO,KAAK,kCAAkC,iBAAiB,QAAQ,GAAG,iBAAiB,MAAM;;CAGnG,qCAA6C,YAAoC;EAC/E,MAAM,aAAa,SAAS,MAAM,IAAI;AACtC,MAAI,CAAC,WACH,QAAO;AAET,SACE,YAAY,KAAK,WAAW,KAE1B,WAAW,SAAS,yBAAyB,IAC7C,WAAW,SAAS,wBAAwB,IAC5C,WAAW,SAAS,iCAAiC"}
@@ -19,4 +19,5 @@ declare class SecretsCommands {
19
19
  private requestRestartForConfigDiff;
20
20
  }
21
21
  //#endregion
22
- export { SecretsCommands };
22
+ export { SecretsCommands };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/secrets/index.ts"],"mappings":";;;cAqIa,eAAA;EAAA,QAED,IAAA;cAAA,IAAA;IACN,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,KAAA,GAAS,IAAA,GAAM,mBAAA;EAwEf,SAAA,GAAmB,IAAA,EAAM,uBAAA,KAA0B,OAAA;EAgCnD,KAAA,GAAe,IAAA,EAAM,mBAAA,KAAsB,OAAA;EAwB3C,MAAA,GAAgB,IAAA,GAAM,oBAAA,KAA4B,OAAA;EAAA,QAa1C,cAAA;EAAA,QASA,iBAAA;EAAA,QAWA,mBAAA;EAAA,QA2BA,iBAAA;EAAA,QAUA,cAAA;EAAA,QAUA,mBAAA;EAAA,QA4BA,2BAAA;AAAA"}
@@ -278,3 +278,5 @@ var SecretsCommands = class {
278
278
  };
279
279
  //#endregion
280
280
  export { SecretsCommands };
281
+
282
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/secrets/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport {\n buildReloadPlan,\n diffConfigPaths,\n getConfigPath,\n loadConfig,\n resolveConfigSecrets,\n saveConfig,\n type Config,\n type SecretRef,\n type SecretSource\n} from \"@nextclaw/core\";\nimport { getAtConfigPath, parseRequiredConfigPath } from \"@nextclaw-service/shared/utils/config-path.js\";\nimport type { RequestRestartParams, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\n\ntype AuditItem = {\n path: string;\n source: SecretSource;\n provider: string;\n id: string;\n ok: boolean;\n detail: string;\n};\n\nconst SECRET_SOURCES: SecretSource[] = [\"env\", \"file\", \"exec\"];\n\nfunction normalizeSecretSource(value: unknown): SecretSource | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n return SECRET_SOURCES.includes(normalized as SecretSource) ? (normalized as SecretSource) : null;\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 || undefined;\n}\n\nfunction parseTimeoutMs(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`invalid timeout: ${String(value)}`);\n }\n return Math.trunc(parsed);\n}\n\nfunction inferProviderAlias(config: Config, ref: SecretRef): string {\n const explicit = normalizeOptionalString(ref.provider);\n if (explicit) {\n return explicit;\n }\n const defaultAlias = normalizeOptionalString(config.secrets.defaults[ref.source]);\n if (defaultAlias) {\n return defaultAlias;\n }\n return ref.source;\n}\n\nfunction summarizeAudit(items: AuditItem[]): { total: number; ok: number; failed: number } {\n const ok = items.filter((item) => item.ok).length;\n return {\n total: items.length,\n ok,\n failed: items.length - ok\n };\n}\n\nfunction parseRefsPatch(raw: unknown): Record<string, SecretRef> {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\"refs patch must be an object\");\n }\n\n const output: Record<string, SecretRef> = {};\n for (const [path, value] of Object.entries(raw as Record<string, unknown>)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`invalid ref for ${path}`);\n }\n const source = normalizeSecretSource((value as Record<string, unknown>).source);\n const id = normalizeOptionalString((value as Record<string, unknown>).id);\n const provider = normalizeOptionalString((value as Record<string, unknown>).provider);\n if (!source || !id) {\n throw new Error(`invalid ref for ${path}: source/id is required`);\n }\n output[path] = { source, ...(provider ? { provider } : {}), id };\n }\n return output;\n}\n\nfunction parseApplyFile(raw: string): {\n enabled?: boolean;\n defaults?: Config[\"secrets\"][\"defaults\"];\n providers?: Config[\"secrets\"][\"providers\"];\n refs?: Record<string, SecretRef>;\n} {\n const data = JSON.parse(raw) as unknown;\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\n throw new Error(\"apply file must be an object\");\n }\n const record = data as Record<string, unknown>;\n\n if (record.refs || record.providers || record.defaults || Object.prototype.hasOwnProperty.call(record, \"enabled\")) {\n const patch: {\n enabled?: boolean;\n defaults?: Config[\"secrets\"][\"defaults\"];\n providers?: Config[\"secrets\"][\"providers\"];\n refs?: Record<string, SecretRef>;\n } = {};\n\n if (Object.prototype.hasOwnProperty.call(record, \"enabled\")) {\n patch.enabled = Boolean(record.enabled);\n }\n if (record.defaults && typeof record.defaults === \"object\" && !Array.isArray(record.defaults)) {\n patch.defaults = record.defaults as Config[\"secrets\"][\"defaults\"];\n }\n if (record.providers && typeof record.providers === \"object\" && !Array.isArray(record.providers)) {\n patch.providers = record.providers as Config[\"secrets\"][\"providers\"];\n }\n if (record.refs) {\n patch.refs = parseRefsPatch(record.refs);\n }\n return patch;\n }\n\n return { refs: parseRefsPatch(record) };\n}\n\nexport class SecretsCommands {\n constructor(\n private deps: {\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n audit = (opts: SecretsAuditOptions = {}): void => {\n const config = loadConfig();\n const configPath = getConfigPath();\n const refs = config.secrets.refs;\n const items: AuditItem[] = [];\n\n for (const [path, ref] of Object.entries(refs)) {\n const provider = inferProviderAlias(config, ref);\n const scopedConfig = structuredClone(config);\n scopedConfig.secrets.refs = { [path]: ref };\n\n try {\n const resolved = resolveConfigSecrets(scopedConfig, { configPath });\n const parsedPath = parseRequiredConfigPath(path);\n const target = getAtConfigPath(resolved as unknown as Record<string, unknown>, parsedPath);\n if (!target.found) {\n items.push({\n path,\n source: ref.source,\n provider,\n id: ref.id,\n ok: false,\n detail: \"resolved but path not found\"\n });\n continue;\n }\n const resolvedValue = target.value;\n const detail =\n typeof resolvedValue === \"string\"\n ? `resolved (length=${resolvedValue.length})`\n : `resolved (${typeof resolvedValue})`;\n items.push({\n path,\n source: ref.source,\n provider,\n id: ref.id,\n ok: true,\n detail\n });\n } catch (error) {\n items.push({\n path,\n source: ref.source,\n provider,\n id: ref.id,\n ok: false,\n detail: String(error)\n });\n }\n }\n\n const summary = summarizeAudit(items);\n if (opts.json) {\n console.log(JSON.stringify({ summary, items }, null, 2));\n } else if (!items.length) {\n console.log(\"No secret refs configured.\");\n } else {\n for (const item of items) {\n const status = item.ok ? \"OK\" : \"ERROR\";\n console.log(\n `[${status}] ${item.path} <- ${item.source}:${item.provider}:${item.id} (${item.detail})`\n );\n }\n console.log(`Summary: total=${summary.total}, ok=${summary.ok}, failed=${summary.failed}`);\n }\n\n const strict = Boolean(opts.strict);\n if (strict && summary.failed > 0) {\n process.exitCode = 1;\n }\n };\n\n configure = async (opts: SecretsConfigureOptions): Promise<void> => {\n const alias = normalizeOptionalString(opts.provider);\n if (!alias) {\n throw new Error(\"provider alias is required\");\n }\n\n const prevConfig = loadConfig();\n const nextConfig = structuredClone(prevConfig);\n const remove = Boolean(opts.remove);\n\n if (remove) {\n this.removeProvider(nextConfig, alias);\n } else {\n this.configureProvider(nextConfig, alias, opts);\n }\n\n resolveConfigSecrets(nextConfig, { configPath: getConfigPath() });\n saveConfig(nextConfig);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig,\n reason: `secrets.configure ${alias}`,\n manualMessage: \"Secrets provider updated. Restart the gateway if required.\"\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, providers: nextConfig.secrets.providers, defaults: nextConfig.secrets.defaults }, null, 2));\n return;\n }\n console.log(`Secrets provider ${remove ? \"removed\" : \"configured\"}: ${alias}`);\n };\n\n apply = async (opts: SecretsApplyOptions): Promise<void> => {\n const prevConfig = loadConfig();\n const nextConfig = structuredClone(prevConfig);\n\n this.applyEnabledPatch(nextConfig, opts);\n this.applyFilePatch(nextConfig, opts);\n this.applySingleRefPatch(nextConfig, opts);\n\n resolveConfigSecrets(nextConfig, { configPath: getConfigPath() });\n saveConfig(nextConfig);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig,\n reason: \"secrets.apply\",\n manualMessage: \"Secrets updated. Restart the gateway if required.\"\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, secrets: nextConfig.secrets }, null, 2));\n return;\n }\n console.log(\"Secrets applied.\");\n };\n\n reload = async (opts: SecretsReloadOptions = {}): Promise<void> => {\n const config = loadConfig();\n const configPath = getConfigPath();\n resolveConfigSecrets(config, { configPath });\n saveConfig(config);\n\n if (opts.json) {\n console.log(JSON.stringify({ ok: true, message: \"secrets reload signal emitted\" }, null, 2));\n return;\n }\n console.log(\"Secrets reload signal emitted.\");\n };\n\n private removeProvider = (config: Config, alias: string): void => {\n delete config.secrets.providers[alias];\n for (const source of SECRET_SOURCES) {\n if (config.secrets.defaults[source] === alias) {\n delete config.secrets.defaults[source];\n }\n }\n };\n\n private configureProvider = (config: Config, alias: string, opts: SecretsConfigureOptions): void => {\n const source = normalizeSecretSource(opts.source);\n if (!source) {\n throw new Error(\"source is required and must be one of env/file/exec\");\n }\n config.secrets.providers[alias] = this.buildProviderConfig(source, opts);\n if (opts.setDefault) {\n config.secrets.defaults[source] = alias;\n }\n };\n\n private buildProviderConfig = (source: SecretSource, opts: SecretsConfigureOptions): Config[\"secrets\"][\"providers\"][string] => {\n if (source === \"env\") {\n return {\n source,\n ...(normalizeOptionalString(opts.prefix) ? { prefix: normalizeOptionalString(opts.prefix) } : {})\n };\n }\n if (source === \"file\") {\n const path = normalizeOptionalString(opts.path);\n if (!path) {\n throw new Error(\"file source requires --path\");\n }\n return { source, path, format: \"json\" };\n }\n const command = normalizeOptionalString(opts.command);\n if (!command) {\n throw new Error(\"exec source requires --command\");\n }\n return {\n source,\n command,\n args: Array.isArray(opts.arg) ? opts.arg : [],\n ...(normalizeOptionalString(opts.cwd) ? { cwd: normalizeOptionalString(opts.cwd) } : {}),\n timeoutMs: parseTimeoutMs(opts.timeoutMs) ?? 5000\n };\n };\n\n private applyEnabledPatch = (config: Config, opts: SecretsApplyOptions): void => {\n const { disable, enable } = opts;\n if (enable && disable) {\n throw new Error(\"cannot set --enable and --disable at the same time\");\n }\n if (enable || disable) {\n config.secrets.enabled = Boolean(enable);\n }\n };\n\n private applyFilePatch = (config: Config, opts: SecretsApplyOptions): void => {\n if (!opts.file) {\n return;\n }\n const { defaults, providers, refs } = parseApplyFile(readFileSync(opts.file, \"utf-8\"));\n if (defaults) config.secrets.defaults = defaults;\n if (providers) config.secrets.providers = providers;\n if (refs) config.secrets.refs = { ...config.secrets.refs, ...refs };\n };\n\n private applySingleRefPatch = (config: Config, opts: SecretsApplyOptions): void => {\n if (!opts.path) {\n if (opts.remove && !opts.file) {\n throw new Error(\"--remove requires --path\");\n }\n return;\n }\n const path = opts.path.trim();\n if (!path) {\n throw new Error(\"path is empty\");\n }\n if (opts.remove) {\n delete config.secrets.refs[path];\n return;\n }\n const source = normalizeSecretSource(opts.source);\n const id = normalizeOptionalString(opts.id);\n if (!source || !id) {\n throw new Error(\"apply single ref requires --source and --id\");\n }\n const provider = normalizeOptionalString(opts.provider);\n config.secrets.refs[path] = {\n source,\n id,\n ...(provider ? { provider } : {})\n };\n };\n\n private requestRestartForConfigDiff = async (params: {\n prevConfig: Config;\n nextConfig: Config;\n reason: string;\n manualMessage: string;\n }): Promise<void> => {\n const { manualMessage, nextConfig, prevConfig, reason } = params;\n const changedPaths = diffConfigPaths(prevConfig, nextConfig);\n if (!changedPaths.length) {\n return;\n }\n const plan = buildReloadPlan(changedPaths);\n if (plan.restartRequired.length === 0) {\n return;\n }\n await this.deps.requestRestart({\n changedPaths: plan.restartRequired,\n mode: \"notify\",\n reason: `${reason} (${plan.restartRequired.join(\", \")})`,\n manualMessage\n });\n };\n}\n"],"mappings":"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"}
@@ -11,4 +11,5 @@ declare class ServeCommands {
11
11
  run: (opts: StartCommandOptions) => Promise<void>;
12
12
  }
13
13
  //#endregion
14
- export { ServeCommands };
14
+ export { ServeCommands };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/serve/index.ts"],"mappings":";;;;cAIa,aAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,EAAuB,qBAAA;IACvB,gBAAA;EAAA;EAIJ,GAAA,GAAa,IAAA,EAAM,mBAAA,KAAsB,OAAA;AAAA"}
@@ -17,3 +17,5 @@ var ServeCommands = class {
17
17
  };
18
18
  //#endregion
19
19
  export { ServeCommands };
20
+
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/serve/index.ts"],"sourcesContent":["import { resolveManagedServiceUiOverrides } from \"@nextclaw-service/shared/utils/runtime-helpers.js\";\nimport type { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport type { StartCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nexport class ServeCommands {\n constructor(\n private readonly deps: {\n runtimeCommandService: RuntimeCommandService;\n forcedPublicHost: string;\n }\n ) {}\n\n run = async (opts: StartCommandOptions): Promise<void> => {\n const uiOverrides = resolveManagedServiceUiOverrides({\n uiPort: opts.uiPort,\n forcedPublicHost: this.deps.forcedPublicHost\n });\n\n await this.deps.runtimeCommandService.runForeground({\n uiOverrides,\n open: Boolean(opts.open),\n });\n };\n}\n"],"mappings":";;AAIA,IAAa,gBAAb,MAA2B;CACzB,YACE,MAIA;AAJiB,OAAA,OAAA;;CAMnB,MAAM,OAAO,SAA6C;EACxD,MAAM,cAAc,iCAAiC;GACnD,QAAQ,KAAK;GACb,kBAAkB,KAAK,KAAK;GAC7B,CAAC;AAEF,QAAM,KAAK,KAAK,sBAAsB,cAAc;GAClD;GACA,MAAM,QAAQ,KAAK,KAAK;GACzB,CAAC"}
@@ -23,4 +23,5 @@ declare class SkillsCommands {
23
23
  update: (options: Omit<MarketplacePublishCommandOptions, "publishedAt">) => Promise<void>;
24
24
  }
25
25
  //#endregion
26
- export { SkillsCommands };
26
+ export { SkillsCommands };
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/index.ts"],"mappings":";;;;cAWa,cAAA;EAAA,iBACM,kBAAA;EAEjB,SAAA,GAAmB,OAAA,GAAS,6BAAA,KAAqC,OAAA;EAiCjE,IAAA,GAAc,QAAA,UAAkB,OAAA,GAAS,wBAAA,KAAgC,OAAA;EA0BzE,OAAA,GAAiB,OAAA;IACf,IAAA;IACA,OAAA;IACA,GAAA;IACA,KAAA;IACA,UAAA;EAAA,MACE,OAAA;EAuBJ,iBAAA,GAA2B,OAAA,GAAS,qCAAA,KAA6C,OAAA;EA6BjF,eAAA,GAAyB,IAAA,UAAc,OAAA;IAAW,OAAA;IAAkB,IAAA;EAAA,MAAwB,OAAA;EAyB5F,oBAAA,GAA8B,OAAA,GAAS,wCAAA,KAAgD,OAAA;EAqBvF,OAAA,GAAiB,OAAA,EAAS,gCAAA,KAAmC,OAAA;EAK7D,MAAA,GAAgB,OAAA,EAAS,IAAA,CAAK,gCAAA,qBAAmD,OAAA;AAAA"}
@@ -145,3 +145,5 @@ var SkillsCommands = class {
145
145
  };
146
146
  //#endregion
147
147
  export { SkillsCommands };
148
+
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/skills/index.ts"],"sourcesContent":["import { loadConfig } from \"@nextclaw/core\";\nimport { resolveSkillsInstallWorkdir } from \"@nextclaw-service/shared/utils/runtime-helpers.js\";\nimport {\n buildMarketplacePublishOptions,\n buildMarketplaceUpdateOptions,\n type MarketplacePublishCommandOptions,\n} from \"./marketplace-command-options.utils.js\";\nimport { installMarketplaceSkill, publishMarketplaceSkill } from \"./marketplace.utils.js\";\nimport { SkillsQueryService } from \"./skills-query.service.js\";\nimport type { MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nexport class SkillsCommands {\n private readonly skillsQueryService = new SkillsQueryService();\n\n installed = async (options: SkillsInstalledCommandOptions = {}): Promise<void> => {\n const config = loadConfig();\n const workdir = resolveSkillsInstallWorkdir({\n explicitWorkdir: options.workdir,\n configuredWorkspace: config.agents.defaults.workspace,\n });\n const result = this.skillsQueryService.listInstalled({\n workdir,\n scope: options.scope,\n query: options.query,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.skills.length === 0) {\n console.log(\"No installed skills found.\");\n return;\n }\n\n for (const skill of result.skills) {\n console.log(`${skill.name} (${skill.scope})`);\n console.log(` ref: ${skill.ref}`);\n console.log(` path: ${skill.path}`);\n console.log(` summary: ${skill.summary ?? \"-\"}`);\n console.log(` description: ${skill.description ?? \"-\"}`);\n console.log(` tags: ${skill.tags.join(\", \") || \"-\"}`);\n console.log(` always: ${skill.always ? \"yes\" : \"no\"}`);\n }\n };\n\n info = async (selector: string, options: SkillsInfoCommandOptions = {}): Promise<void> => {\n const config = loadConfig();\n const workdir = resolveSkillsInstallWorkdir({\n explicitWorkdir: options.workdir,\n configuredWorkspace: config.agents.defaults.workspace,\n });\n const result = this.skillsQueryService.getInstalledInfo({\n workdir,\n selector,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`${result.name} (${result.scope})`);\n console.log(` ref: ${result.ref}`);\n console.log(` path: ${result.path}`);\n console.log(` summary: ${result.summary ?? \"-\"}`);\n console.log(` description: ${result.description ?? \"-\"}`);\n console.log(` author: ${result.author ?? \"-\"}`);\n console.log(` tags: ${result.tags.join(\", \") || \"-\"}`);\n console.log(` always: ${result.always ? \"yes\" : \"no\"}`);\n };\n\n install = async (options: {\n slug: string;\n workdir?: string;\n dir?: string;\n force?: boolean;\n apiBaseUrl?: string;\n }): Promise<void> => {\n const { apiBaseUrl, dir, force, slug, workdir: explicitWorkdir } = options;\n const config = loadConfig();\n const workdir = resolveSkillsInstallWorkdir({\n explicitWorkdir,\n configuredWorkspace: config.agents.defaults.workspace,\n });\n const result = await installMarketplaceSkill({\n slug,\n workdir,\n dir,\n force,\n apiBaseUrl,\n });\n\n if (result.alreadyInstalled) {\n console.log(`✓ ${result.slug} is already installed`);\n } else {\n console.log(`✓ Installed ${result.slug} (${result.source})`);\n }\n console.log(` Path: ${result.destinationDir}`);\n };\n\n marketplaceSearch = async (options: MarketplaceSkillsSearchCommandOptions = {}): Promise<void> => {\n const result = await this.skillsQueryService.searchMarketplaceSkills({\n apiBaseUrl: options.apiBase,\n query: options.query,\n tag: options.tag,\n sort: options.sort,\n page: options.page,\n pageSize: options.pageSize,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.items.length === 0) {\n console.log(\"No marketplace skills found.\");\n return;\n }\n\n for (const item of result.items) {\n console.log(`${item.name} (${item.slug})`);\n console.log(` summary: ${item.summary}`);\n console.log(` author: ${item.author}`);\n console.log(` tags: ${item.tags.join(\", \") || \"-\"}`);\n console.log(` install: ${item.install.command}`);\n }\n };\n\n marketplaceInfo = async (slug: string, options: { apiBase?: string; json?: boolean } = {}): Promise<void> => {\n const result = await this.skillsQueryService.getMarketplaceSkillInfo({\n apiBaseUrl: options.apiBase,\n slug,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`${result.item.name} (${result.item.slug})`);\n console.log(` summary: ${result.item.summary}`);\n console.log(` description: ${result.item.description ?? \"-\"}`);\n console.log(` author: ${result.item.author}`);\n console.log(` tags: ${result.item.tags.join(\", \") || \"-\"}`);\n console.log(` install: ${result.item.install.command}`);\n console.log(` content: ${result.content ? \"available\" : \"unavailable\"}`);\n if (result.content) {\n console.log(` source: ${result.content.source}`);\n } else if (result.contentUnavailableReason) {\n console.log(` reason: ${result.contentUnavailableReason}`);\n }\n };\n\n marketplaceRecommend = async (options: MarketplaceSkillsRecommendCommandOptions = {}): Promise<void> => {\n const result = await this.skillsQueryService.recommendMarketplaceSkills({\n apiBaseUrl: options.apiBase,\n scene: options.scene,\n limit: options.limit,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log(`${result.title} (${result.sceneId})`);\n if (result.description) {\n console.log(` ${result.description}`);\n }\n for (const item of result.items) {\n console.log(`- ${item.name} (${item.slug})`);\n }\n };\n\n publish = async (options: MarketplacePublishCommandOptions): Promise<void> => {\n const result = await publishMarketplaceSkill(buildMarketplacePublishOptions(options));\n console.log(`${result.created ? `✓ Published new skill: ${result.packageName}` : `✓ Updated skill: ${result.packageName}`}\\n Alias: ${result.slug}\\n Files: ${result.fileCount}`);\n };\n\n update = async (options: Omit<MarketplacePublishCommandOptions, \"publishedAt\">): Promise<void> => {\n const result = await publishMarketplaceSkill(buildMarketplaceUpdateOptions(options));\n console.log(`✓ Updated skill: ${result.packageName}`);\n console.log(` Alias: ${result.slug}`);\n console.log(` Files: ${result.fileCount}`);\n };\n}\n"],"mappings":";;;;;;AAWA,IAAa,iBAAb,MAA4B;CAC1B,qBAAsC,IAAI,oBAAoB;CAE9D,YAAY,OAAO,UAAyC,EAAE,KAAoB;EAChF,MAAM,SAAS,YAAY;EAC3B,MAAM,UAAU,4BAA4B;GAC1C,iBAAiB,QAAQ;GACzB,qBAAqB,OAAO,OAAO,SAAS;GAC7C,CAAC;EACF,MAAM,SAAS,KAAK,mBAAmB,cAAc;GACnD;GACA,OAAO,QAAQ;GACf,OAAO,QAAQ;GAChB,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,MAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAQ,IAAI,6BAA6B;AACzC;;AAGF,OAAK,MAAM,SAAS,OAAO,QAAQ;AACjC,WAAQ,IAAI,GAAG,MAAM,KAAK,IAAI,MAAM,MAAM,GAAG;AAC7C,WAAQ,IAAI,UAAU,MAAM,MAAM;AAClC,WAAQ,IAAI,WAAW,MAAM,OAAO;AACpC,WAAQ,IAAI,cAAc,MAAM,WAAW,MAAM;AACjD,WAAQ,IAAI,kBAAkB,MAAM,eAAe,MAAM;AACzD,WAAQ,IAAI,WAAW,MAAM,KAAK,KAAK,KAAK,IAAI,MAAM;AACtD,WAAQ,IAAI,aAAa,MAAM,SAAS,QAAQ,OAAO;;;CAI3D,OAAO,OAAO,UAAkB,UAAoC,EAAE,KAAoB;EACxF,MAAM,SAAS,YAAY;EAC3B,MAAM,UAAU,4BAA4B;GAC1C,iBAAiB,QAAQ;GACzB,qBAAqB,OAAO,OAAO,SAAS;GAC7C,CAAC;EACF,MAAM,SAAS,KAAK,mBAAmB,iBAAiB;GACtD;GACA;GACD,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,UAAQ,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG;AAC/C,UAAQ,IAAI,UAAU,OAAO,MAAM;AACnC,UAAQ,IAAI,WAAW,OAAO,OAAO;AACrC,UAAQ,IAAI,cAAc,OAAO,WAAW,MAAM;AAClD,UAAQ,IAAI,kBAAkB,OAAO,eAAe,MAAM;AAC1D,UAAQ,IAAI,aAAa,OAAO,UAAU,MAAM;AAChD,UAAQ,IAAI,WAAW,OAAO,KAAK,KAAK,KAAK,IAAI,MAAM;AACvD,UAAQ,IAAI,aAAa,OAAO,SAAS,QAAQ,OAAO;;CAG1D,UAAU,OAAO,YAMI;EACnB,MAAM,EAAE,YAAY,KAAK,OAAO,MAAM,SAAS,oBAAoB;EAMnE,MAAM,SAAS,MAAM,wBAAwB;GAC3C;GACA,SANc,4BAA4B;IAC1C;IACA,qBAHa,YAAY,CAGG,OAAO,SAAS;IAC7C,CAAC;GAIA;GACA;GACA;GACD,CAAC;AAEF,MAAI,OAAO,iBACT,SAAQ,IAAI,KAAK,OAAO,KAAK,uBAAuB;MAEpD,SAAQ,IAAI,eAAe,OAAO,KAAK,IAAI,OAAO,OAAO,GAAG;AAE9D,UAAQ,IAAI,WAAW,OAAO,iBAAiB;;CAGjD,oBAAoB,OAAO,UAAiD,EAAE,KAAoB;EAChG,MAAM,SAAS,MAAM,KAAK,mBAAmB,wBAAwB;GACnE,YAAY,QAAQ;GACpB,OAAO,QAAQ;GACf,KAAK,QAAQ;GACb,MAAM,QAAQ;GACd,MAAM,QAAQ;GACd,UAAU,QAAQ;GACnB,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,MAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,WAAQ,IAAI,+BAA+B;AAC3C;;AAGF,OAAK,MAAM,QAAQ,OAAO,OAAO;AAC/B,WAAQ,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG;AAC1C,WAAQ,IAAI,cAAc,KAAK,UAAU;AACzC,WAAQ,IAAI,aAAa,KAAK,SAAS;AACvC,WAAQ,IAAI,WAAW,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM;AACrD,WAAQ,IAAI,cAAc,KAAK,QAAQ,UAAU;;;CAIrD,kBAAkB,OAAO,MAAc,UAAgD,EAAE,KAAoB;EAC3G,MAAM,SAAS,MAAM,KAAK,mBAAmB,wBAAwB;GACnE,YAAY,QAAQ;GACpB;GACD,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,UAAQ,IAAI,GAAG,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,GAAG;AACxD,UAAQ,IAAI,cAAc,OAAO,KAAK,UAAU;AAChD,UAAQ,IAAI,kBAAkB,OAAO,KAAK,eAAe,MAAM;AAC/D,UAAQ,IAAI,aAAa,OAAO,KAAK,SAAS;AAC9C,UAAQ,IAAI,WAAW,OAAO,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM;AAC5D,UAAQ,IAAI,cAAc,OAAO,KAAK,QAAQ,UAAU;AACxD,UAAQ,IAAI,cAAc,OAAO,UAAU,cAAc,gBAAgB;AACzE,MAAI,OAAO,QACT,SAAQ,IAAI,aAAa,OAAO,QAAQ,SAAS;WACxC,OAAO,yBAChB,SAAQ,IAAI,aAAa,OAAO,2BAA2B;;CAI/D,uBAAuB,OAAO,UAAoD,EAAE,KAAoB;EACtG,MAAM,SAAS,MAAM,KAAK,mBAAmB,2BAA2B;GACtE,YAAY,QAAQ;GACpB,OAAO,QAAQ;GACf,OAAO,QAAQ;GAChB,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,UAAQ,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,QAAQ,GAAG;AAClD,MAAI,OAAO,YACT,SAAQ,IAAI,KAAK,OAAO,cAAc;AAExC,OAAK,MAAM,QAAQ,OAAO,MACxB,SAAQ,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG;;CAIhD,UAAU,OAAO,YAA6D;EAC5E,MAAM,SAAS,MAAM,wBAAwB,+BAA+B,QAAQ,CAAC;AACrF,UAAQ,IAAI,GAAG,OAAO,UAAU,0BAA0B,OAAO,gBAAgB,oBAAoB,OAAO,cAAc,aAAa,OAAO,KAAK,aAAa,OAAO,YAAY;;CAGrL,SAAS,OAAO,YAAkF;EAChG,MAAM,SAAS,MAAM,wBAAwB,8BAA8B,QAAQ,CAAC;AACpF,UAAQ,IAAI,oBAAoB,OAAO,cAAc;AACrD,UAAQ,IAAI,YAAY,OAAO,OAAO;AACtC,UAAQ,IAAI,YAAY,OAAO,YAAY"}
@@ -38,4 +38,5 @@ declare function writeMarketplaceSkillFiles(params: {
38
38
  }): Promise<void>;
39
39
  declare function readMarketplaceEnvelope<T>(response: Response): Promise<MarketplaceEnvelope<T>>;
40
40
  //#endregion
41
- export { MarketplaceSkillFileManifestEntry, collectMarketplaceSkillFiles, fetchMarketplaceSkillFileBlob, fetchMarketplaceSkillFiles, fetchMarketplaceSkillItem, readMarketplaceEnvelope, resolveMarketplaceAdminToken, resolveMarketplaceApiBase, writeMarketplaceSkillFiles };
41
+ export { MarketplaceSkillFileManifestEntry, collectMarketplaceSkillFiles, fetchMarketplaceSkillFileBlob, fetchMarketplaceSkillFiles, fetchMarketplaceSkillItem, readMarketplaceEnvelope, resolveMarketplaceAdminToken, resolveMarketplaceApiBase, writeMarketplaceSkillFiles };
42
+ //# sourceMappingURL=marketplace-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-client.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-client.ts"],"mappings":";KAMK,mBAAA;EACH,EAAA;EACA,IAAA,GAAO,CAAA;EACP,KAAA;IACE,IAAA;IACA,OAAA;EAAA;AAAA;AAAA,KAIC,2BAAA;AAAA,KAEO,iCAAA;EACV,IAAA;EACA,YAAA;EACA,aAAA;AAAA;AAAA,iBAGc,yBAAA,CAA0B,YAAA;AAAA,iBAO1B,4BAAA,CAA6B,aAAA;AAAA,iBAKvB,yBAAA,CACpB,OAAA,UACA,IAAA,WACC,OAAA;EAAU,IAAA;EAAc,WAAA;EAAsB,OAAA;IAAW,IAAA,EAAM,2BAAA;EAAA;AAAA;AAAA,iBAqC5C,0BAAA,CACpB,OAAA,UACA,IAAA,WACC,OAAA;EAAU,KAAA,EAAO,iCAAA;AAAA;AAAA,iBAsCE,6BAAA,CACpB,OAAA,UACA,IAAA,UACA,IAAA,EAAM,iCAAA,GACL,OAAA,CAAQ,MAAA;AAAA,iBAiBK,4BAAA,CAA6B,OAAA,WAAkB,KAAA;EAAQ,IAAA;EAAc,aAAA;AAAA;AAAA,iBA0B/D,0BAAA,CAA2B,MAAA;EAC/C,cAAA;EACA,KAAA,EAAO,iCAAA;EACP,OAAA;EACA,IAAA;AAAA,IACE,OAAA;AAAA,iBAiBkB,uBAAA,GAAA,CAA2B,QAAA,EAAU,QAAA,GAAW,OAAA,CAAQ,mBAAA,CAAoB,CAAA"}
@@ -120,3 +120,5 @@ function isRecord(value) {
120
120
  }
121
121
  //#endregion
122
122
  export { collectMarketplaceSkillFiles, fetchMarketplaceSkillFileBlob, fetchMarketplaceSkillFiles, fetchMarketplaceSkillItem, readMarketplaceEnvelope, resolveMarketplaceAdminToken, resolveMarketplaceApiBase, writeMarketplaceSkillFiles };
123
+
124
+ //# sourceMappingURL=marketplace-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-client.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-client.ts"],"sourcesContent":["import { mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { runWithMarketplaceNetworkRetry } from \"./marketplace-network-retry.js\";\n\nconst DEFAULT_MARKETPLACE_API_BASE = \"https://marketplace-api.nextclaw.io\";\n\ntype MarketplaceEnvelope<T> = {\n ok: boolean;\n data?: T;\n error?: {\n code?: string;\n message?: string;\n };\n};\n\ntype MarketplaceSkillInstallKind = \"builtin\" | \"marketplace\";\n\nexport type MarketplaceSkillFileManifestEntry = {\n path: string;\n downloadPath?: string;\n contentBase64?: string;\n};\n\nexport function resolveMarketplaceApiBase(explicitBase: string | undefined): string {\n const raw = explicitBase?.trim()\n || process.env.NEXTCLAW_MARKETPLACE_API_BASE?.trim()\n || DEFAULT_MARKETPLACE_API_BASE;\n return raw.replace(/\\/+$/, \"\");\n}\n\nexport function resolveMarketplaceAdminToken(explicitToken: string | undefined): string | undefined {\n const token = explicitToken?.trim() || process.env.NEXTCLAW_MARKETPLACE_ADMIN_TOKEN?.trim();\n return token && token.length > 0 ? token : undefined;\n}\n\nexport async function fetchMarketplaceSkillItem(\n apiBase: string,\n slug: string\n): Promise<{ slug: string; packageName?: string; install: { kind: MarketplaceSkillInstallKind } }> {\n return runWithMarketplaceNetworkRetry(async () => {\n const response = await fetch(`${apiBase}/api/v1/skills/items/${encodeURIComponent(slug)}`, {\n headers: {\n Accept: \"application/json\"\n }\n });\n const payload = await readMarketplaceEnvelope<{\n slug?: string;\n packageName?: string;\n install: { kind: MarketplaceSkillInstallKind | string };\n }>(response);\n\n if (!payload.ok || !payload.data) {\n const message = payload.error?.message || `marketplace skill fetch failed: ${response.status}`;\n throw new Error(message);\n }\n\n const kind = payload.data.install?.kind;\n if (kind !== \"builtin\" && kind !== \"marketplace\") {\n throw new Error(`Unsupported skill install kind from marketplace: ${String(kind)}`);\n }\n\n return {\n slug: typeof payload.data.slug === \"string\" && payload.data.slug.trim()\n ? payload.data.slug.trim()\n : slug,\n packageName: typeof payload.data.packageName === \"string\" && payload.data.packageName.trim()\n ? payload.data.packageName.trim()\n : undefined,\n install: {\n kind\n }\n };\n });\n}\n\nexport async function fetchMarketplaceSkillFiles(\n apiBase: string,\n slug: string\n): Promise<{ files: MarketplaceSkillFileManifestEntry[] }> {\n return runWithMarketplaceNetworkRetry(async () => {\n const response = await fetch(`${apiBase}/api/v1/skills/items/${encodeURIComponent(slug)}/files`, {\n headers: {\n Accept: \"application/json\"\n }\n });\n\n const payload = await readMarketplaceEnvelope<{ files: unknown }>(response);\n if (!payload.ok || !payload.data) {\n const message = payload.error?.message || `marketplace skill file fetch failed: ${response.status}`;\n throw new Error(message);\n }\n\n if (!isRecord(payload.data) || !Array.isArray(payload.data.files)) {\n throw new Error(\"Invalid marketplace skill file manifest response\");\n }\n\n const files = payload.data.files.map((entry, index) => {\n if (!isRecord(entry) || typeof entry.path !== \"string\" || entry.path.trim().length === 0) {\n throw new Error(`Invalid marketplace skill file manifest at index ${index}`);\n }\n const normalized: MarketplaceSkillFileManifestEntry = {\n path: entry.path.trim()\n };\n if (typeof entry.downloadPath === \"string\" && entry.downloadPath.trim().length > 0) {\n normalized.downloadPath = entry.downloadPath.trim();\n }\n if (typeof entry.contentBase64 === \"string\" && entry.contentBase64.trim().length > 0) {\n normalized.contentBase64 = entry.contentBase64.trim();\n }\n return normalized;\n });\n\n return { files };\n });\n}\n\nexport async function fetchMarketplaceSkillFileBlob(\n apiBase: string,\n slug: string,\n file: MarketplaceSkillFileManifestEntry\n): Promise<Buffer> {\n const downloadUrl = resolveSkillFileDownloadUrl(apiBase, slug, file);\n return runWithMarketplaceNetworkRetry(async () => {\n const response = await fetch(downloadUrl, {\n headers: {\n Accept: \"application/octet-stream\"\n }\n });\n if (!response.ok) {\n const message = extractMarketplaceErrorMessage(await response.text(), response.status)\n || `marketplace skill file download failed: ${response.status}`;\n throw new Error(message);\n }\n return Buffer.from(await response.arrayBuffer());\n });\n}\n\nexport function collectMarketplaceSkillFiles(rootDir: string): Array<{ path: string; contentBase64: string }> {\n const output: Array<{ path: string; contentBase64: string }> = [];\n\n const walk = (dir: string, prefix: string): void => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const absolute = join(dir, entry.name);\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(absolute, relativePath);\n continue;\n }\n if (!entry.isFile()) {\n continue;\n }\n output.push({\n path: relativePath,\n contentBase64: readFileSync(absolute).toString(\"base64\"),\n });\n }\n };\n\n walk(rootDir, \"\");\n return output;\n}\n\nexport async function writeMarketplaceSkillFiles(params: {\n destinationDir: string;\n files: MarketplaceSkillFileManifestEntry[];\n apiBase: string;\n slug: string;\n}): Promise<void> {\n const { destinationDir, files, apiBase, slug } = params;\n for (const file of files) {\n const targetPath = resolve(destinationDir, ...file.path.split(\"/\"));\n const rel = relative(destinationDir, targetPath);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(`Invalid marketplace file path: ${file.path}`);\n }\n\n mkdirSync(dirname(targetPath), { recursive: true });\n const bytes = file.contentBase64\n ? decodeMarketplaceFileContent(file.path, file.contentBase64)\n : await fetchMarketplaceSkillFileBlob(apiBase, slug, file);\n writeFileSync(targetPath, bytes);\n }\n}\n\nexport async function readMarketplaceEnvelope<T>(response: Response): Promise<MarketplaceEnvelope<T>> {\n const raw = await response.text();\n let payload: unknown;\n try {\n payload = raw.length > 0 ? JSON.parse(raw) : null;\n } catch {\n throw new Error(`Invalid marketplace response: ${response.status}`);\n }\n\n if (!isRecord(payload) || typeof payload.ok !== \"boolean\") {\n throw new Error(`Invalid marketplace response shape: ${response.status}`);\n }\n\n return payload as MarketplaceEnvelope<T>;\n}\n\nfunction resolveSkillFileDownloadUrl(\n apiBase: string,\n slug: string,\n file: MarketplaceSkillFileManifestEntry\n): string {\n if (file.downloadPath) {\n return file.downloadPath.startsWith(\"http://\") || file.downloadPath.startsWith(\"https://\")\n ? file.downloadPath\n : `${apiBase}${file.downloadPath}`;\n }\n return `${apiBase}/api/v1/skills/items/${encodeURIComponent(slug)}/files/blob?path=${encodeURIComponent(file.path)}`;\n}\n\nfunction extractMarketplaceErrorMessage(raw: string, fallbackStatus: number): string | undefined {\n if (!raw) {\n return undefined;\n }\n try {\n const payload = JSON.parse(raw) as MarketplaceEnvelope<unknown>;\n return payload.error?.message;\n } catch {\n return raw || `Request failed (${fallbackStatus})`;\n }\n}\n\nfunction decodeMarketplaceFileContent(path: string, contentBase64: string): Buffer {\n const normalized = contentBase64.replace(/\\s+/g, \"\");\n if (!normalized || normalized.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(normalized)) {\n throw new Error(`Invalid marketplace file contentBase64 for path: ${path}`);\n }\n return Buffer.from(normalized, \"base64\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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"}
@@ -22,4 +22,5 @@ type MarketplacePublishCommandOptions = {
22
22
  declare function buildMarketplacePublishOptions(options: MarketplacePublishCommandOptions): MarketplaceSkillPublishOptions;
23
23
  declare function buildMarketplaceUpdateOptions(options: Omit<MarketplacePublishCommandOptions, "publishedAt">): MarketplaceSkillPublishOptions;
24
24
  //#endregion
25
- export { MarketplacePublishCommandOptions, buildMarketplacePublishOptions, buildMarketplaceUpdateOptions };
25
+ export { MarketplacePublishCommandOptions, buildMarketplacePublishOptions, buildMarketplaceUpdateOptions };
26
+ //# sourceMappingURL=marketplace-command-options.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-command-options.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-command-options.utils.ts"],"mappings":";;;KAGY,gCAAA;EACV,GAAA;EACA,IAAA;EACA,IAAA;EACA,WAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,MAAA;EACA,GAAA;EACA,UAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,8BAAA,CAA+B,OAAA,EAAS,gCAAA,GAAmC,8BAAA;AAAA,iBAuC3E,6BAAA,CACd,OAAA,EAAS,IAAA,CAAK,gCAAA,mBACb,8BAAA"}
@@ -29,3 +29,5 @@ function buildMarketplaceUpdateOptions(options) {
29
29
  }
30
30
  //#endregion
31
31
  export { buildMarketplacePublishOptions, buildMarketplaceUpdateOptions };
32
+
33
+ //# sourceMappingURL=marketplace-command-options.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-command-options.utils.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-command-options.utils.ts"],"sourcesContent":["import { expandHome } from \"@nextclaw/core\";\nimport type { MarketplaceSkillPublishOptions } from \"./marketplace.utils.js\";\n\nexport type MarketplacePublishCommandOptions = {\n dir: string;\n meta?: string;\n slug?: string;\n packageName?: string;\n scope?: string;\n name?: string;\n summary?: string;\n description?: string;\n author?: string;\n tag?: string[];\n sourceRepo?: string;\n homepage?: string;\n publishedAt?: string;\n updatedAt?: string;\n apiBaseUrl?: string;\n token?: string;\n};\n\nexport function buildMarketplacePublishOptions(options: MarketplacePublishCommandOptions): MarketplaceSkillPublishOptions {\n const {\n apiBaseUrl,\n author,\n description,\n dir,\n homepage,\n meta,\n name,\n packageName,\n publishedAt,\n scope,\n slug,\n sourceRepo,\n summary,\n tag,\n token,\n updatedAt\n } = options;\n return {\n skillDir: expandHome(dir),\n metaFile: meta ? expandHome(meta) : undefined,\n slug,\n packageName,\n scope,\n name,\n summary,\n description,\n author,\n tags: tag,\n sourceRepo,\n homepage,\n publishedAt,\n updatedAt,\n apiBaseUrl,\n token\n };\n}\n\nexport function buildMarketplaceUpdateOptions(\n options: Omit<MarketplacePublishCommandOptions, \"publishedAt\">\n): MarketplaceSkillPublishOptions {\n return {\n ...buildMarketplacePublishOptions(options),\n requireExisting: true\n };\n}\n"],"mappings":";;AAsBA,SAAgB,+BAA+B,SAA2E;CACxH,MAAM,EACJ,YACA,QACA,aACA,KACA,UACA,MACA,MACA,aACA,aACA,OACA,MACA,YACA,SACA,KACA,OACA,cACE;AACJ,QAAO;EACL,UAAU,WAAW,IAAI;EACzB,UAAU,OAAO,WAAW,KAAK,GAAG,KAAA;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,8BACd,SACgC;AAChC,QAAO;EACL,GAAG,+BAA+B,QAAQ;EAC1C,iBAAiB;EAClB"}
@@ -11,4 +11,5 @@ declare function validateSkillSlug(raw: string, fieldName: string): string;
11
11
  declare function validateSkillSelector(raw: string, fieldName: string): string;
12
12
  declare function normalizeTags(rawTags: string[] | undefined): string[];
13
13
  //#endregion
14
- export { normalizeTags, resolvePublishPackageName, validateSkillSelector, validateSkillSlug };
14
+ export { normalizeTags, resolvePublishPackageName, validateSkillSelector, validateSkillSlug };
15
+ //# sourceMappingURL=marketplace-identity.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-identity.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-identity.utils.ts"],"mappings":";;iBAEgB,yBAAA,CAA0B,MAAA;EACxC,mBAAA;EACA,aAAA;EACA,IAAA;EACA,iBAAA;EACA,WAAA,EAAa,gBAAA;AAAA;AAAA,iBA8DC,iBAAA,CAAkB,GAAA,UAAa,SAAA;AAAA,iBAO/B,qBAAA,CAAsB,GAAA,UAAa,SAAA;AAAA,iBAQnC,aAAA,CAAc,OAAA"}
@@ -75,3 +75,5 @@ function parsePackageName(raw, fieldName) {
75
75
  }
76
76
  //#endregion
77
77
  export { normalizeTags, resolvePublishPackageName, validateSkillSelector, validateSkillSlug };
78
+
79
+ //# sourceMappingURL=marketplace-identity.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-identity.utils.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-identity.utils.ts"],"sourcesContent":["import type { PlatformMeResult } from \"@nextclaw-service/commands/platform-auth/index.js\";\n\nexport function resolvePublishPackageName(params: {\n explicitPackageName?: string;\n explicitScope?: string;\n slug: string;\n adminTokenPresent: boolean;\n currentUser: PlatformMeResult | null;\n}): string {\n const {\n explicitPackageName,\n explicitScope,\n slug,\n adminTokenPresent,\n currentUser\n } = params;\n const normalizedExplicitPackageName = explicitPackageName?.trim();\n if (normalizedExplicitPackageName) {\n return resolveExplicitPackageName(normalizedExplicitPackageName, adminTokenPresent, currentUser);\n }\n\n const normalizedScope = explicitScope?.trim().toLowerCase();\n if (normalizedScope) {\n return resolveScopedPackageName(normalizedScope, slug, adminTokenPresent, currentUser);\n }\n\n return resolveDefaultPackageName(slug, adminTokenPresent, currentUser);\n}\n\nfunction resolveExplicitPackageName(\n packageName: string,\n adminTokenPresent: boolean,\n currentUser: PlatformMeResult | null\n): string {\n const parsed = parsePackageName(packageName, \"packageName\");\n if (parsed.scope === \"nextclaw\") {\n assertOfficialScopeAllowed(adminTokenPresent, currentUser);\n return packageName;\n }\n assertPersonalScopeAllowed(parsed.scope, currentUser);\n return packageName;\n}\n\nfunction resolveScopedPackageName(\n scope: string,\n slug: string,\n adminTokenPresent: boolean,\n currentUser: PlatformMeResult | null\n): string {\n if (scope === \"nextclaw\") {\n assertOfficialScopeAllowed(adminTokenPresent, currentUser);\n return `@nextclaw/${slug}`;\n }\n assertPersonalScopeAllowed(scope, currentUser);\n return `@${scope}/${slug}`;\n}\n\nfunction resolveDefaultPackageName(\n slug: string,\n adminTokenPresent: boolean,\n currentUser: PlatformMeResult | null\n): string {\n if (adminTokenPresent) {\n return `@nextclaw/${slug}`;\n }\n const username = requirePlatformUsername(currentUser);\n return `@${username}/${slug}`;\n}\n\nexport function validateSkillSlug(raw: string, fieldName: string): string {\n if (!/^[A-Za-z0-9._-]+$/.test(raw)) {\n throw new Error(`Invalid ${fieldName}: ${raw}`);\n }\n return raw;\n}\n\nexport function validateSkillSelector(raw: string, fieldName: string): string {\n if (raw.startsWith(\"@\")) {\n parsePackageName(raw, fieldName);\n return raw;\n }\n return validateSkillSlug(raw, fieldName);\n}\n\nexport function normalizeTags(rawTags: string[] | undefined): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const rawTag of rawTags ?? []) {\n const tag = rawTag.trim();\n if (!tag || seen.has(tag)) {\n continue;\n }\n seen.add(tag);\n output.push(tag);\n }\n return output.length > 0 ? output : [\"skill\"];\n}\n\nfunction canPublishOfficialScope(\n adminTokenPresent: boolean,\n currentUser: PlatformMeResult | null\n): boolean {\n return adminTokenPresent || currentUser?.user.role === \"admin\";\n}\n\nfunction assertOfficialScopeAllowed(adminTokenPresent: boolean, currentUser: PlatformMeResult | null): void {\n if (!canPublishOfficialScope(adminTokenPresent, currentUser)) {\n throw new Error(\"Publishing to @nextclaw/* requires admin permission.\");\n }\n}\n\nfunction assertPersonalScopeAllowed(scope: string, currentUser: PlatformMeResult | null): void {\n const username = requirePlatformUsername(currentUser);\n if (scope !== username) {\n throw new Error(`Personal publish scope must match your username: @${username}/*`);\n }\n}\n\nfunction requirePlatformUsername(currentUser: PlatformMeResult | null): string {\n const username = currentUser?.user.username;\n if (!username) {\n throw new Error(\n \"Set your NextClaw username before publishing personal skills. \"\n + \"Open NextClaw Web account settings: https://platform.nextclaw.io/account \"\n + \"or run `nextclaw account set-username <username>`.\"\n );\n }\n return username;\n}\n\nfunction parsePackageName(raw: string, fieldName: string): { scope: string; name: string } {\n const match = raw.match(/^@([a-z0-9](?:[a-z0-9-]{1,30}[a-z0-9])?)\\/([A-Za-z0-9._-]+)$/);\n if (!match) {\n throw new Error(`Invalid ${fieldName}: ${raw}`);\n }\n return {\n scope: match[1],\n name: match[2]\n };\n}\n"],"mappings":";AAEA,SAAgB,0BAA0B,QAM/B;CACT,MAAM,EACJ,qBACA,eACA,MACA,mBACA,gBACE;CACJ,MAAM,gCAAgC,qBAAqB,MAAM;AACjE,KAAI,8BACF,QAAO,2BAA2B,+BAA+B,mBAAmB,YAAY;CAGlG,MAAM,kBAAkB,eAAe,MAAM,CAAC,aAAa;AAC3D,KAAI,gBACF,QAAO,yBAAyB,iBAAiB,MAAM,mBAAmB,YAAY;AAGxF,QAAO,0BAA0B,MAAM,mBAAmB,YAAY;;AAGxE,SAAS,2BACP,aACA,mBACA,aACQ;CACR,MAAM,SAAS,iBAAiB,aAAa,cAAc;AAC3D,KAAI,OAAO,UAAU,YAAY;AAC/B,6BAA2B,mBAAmB,YAAY;AAC1D,SAAO;;AAET,4BAA2B,OAAO,OAAO,YAAY;AACrD,QAAO;;AAGT,SAAS,yBACP,OACA,MACA,mBACA,aACQ;AACR,KAAI,UAAU,YAAY;AACxB,6BAA2B,mBAAmB,YAAY;AAC1D,SAAO,aAAa;;AAEtB,4BAA2B,OAAO,YAAY;AAC9C,QAAO,IAAI,MAAM,GAAG;;AAGtB,SAAS,0BACP,MACA,mBACA,aACQ;AACR,KAAI,kBACF,QAAO,aAAa;AAGtB,QAAO,IADU,wBAAwB,YAAY,CACjC,GAAG;;AAGzB,SAAgB,kBAAkB,KAAa,WAA2B;AACxE,KAAI,CAAC,oBAAoB,KAAK,IAAI,CAChC,OAAM,IAAI,MAAM,WAAW,UAAU,IAAI,MAAM;AAEjD,QAAO;;AAGT,SAAgB,sBAAsB,KAAa,WAA2B;AAC5E,KAAI,IAAI,WAAW,IAAI,EAAE;AACvB,mBAAiB,KAAK,UAAU;AAChC,SAAO;;AAET,QAAO,kBAAkB,KAAK,UAAU;;AAG1C,SAAgB,cAAc,SAAyC;CACrE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,SAAmB,EAAE;AAC3B,MAAK,MAAM,UAAU,WAAW,EAAE,EAAE;EAClC,MAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CACvB;AAEF,OAAK,IAAI,IAAI;AACb,SAAO,KAAK,IAAI;;AAElB,QAAO,OAAO,SAAS,IAAI,SAAS,CAAC,QAAQ;;AAG/C,SAAS,wBACP,mBACA,aACS;AACT,QAAO,qBAAqB,aAAa,KAAK,SAAS;;AAGzD,SAAS,2BAA2B,mBAA4B,aAA4C;AAC1G,KAAI,CAAC,wBAAwB,mBAAmB,YAAY,CAC1D,OAAM,IAAI,MAAM,uDAAuD;;AAI3E,SAAS,2BAA2B,OAAe,aAA4C;CAC7F,MAAM,WAAW,wBAAwB,YAAY;AACrD,KAAI,UAAU,SACZ,OAAM,IAAI,MAAM,qDAAqD,SAAS,IAAI;;AAItF,SAAS,wBAAwB,aAA8C;CAC7E,MAAM,WAAW,aAAa,KAAK;AACnC,KAAI,CAAC,SACH,OAAM,IAAI,MACR,4LAGD;AAEH,QAAO;;AAGT,SAAS,iBAAiB,KAAa,WAAoD;CACzF,MAAM,QAAQ,IAAI,MAAM,+DAA+D;AACvF,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,WAAW,UAAU,IAAI,MAAM;AAEjD,QAAO;EACL,OAAO,MAAM;EACb,MAAM,MAAM;EACb"}
@@ -1,4 +1,5 @@
1
1
  //#region src/cli/commands/skills/marketplace-network-retry.d.ts
2
2
  declare function runWithMarketplaceNetworkRetry<T>(action: () => Promise<T>): Promise<T>;
3
3
  //#endregion
4
- export { runWithMarketplaceNetworkRetry };
4
+ export { runWithMarketplaceNetworkRetry };
5
+ //# sourceMappingURL=marketplace-network-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-network-retry.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-network-retry.ts"],"mappings":";iBAoCsB,8BAAA,GAAA,CAAkC,MAAA,QAAc,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA"}
@@ -30,3 +30,5 @@ async function runWithMarketplaceNetworkRetry(action) {
30
30
  }
31
31
  //#endregion
32
32
  export { runWithMarketplaceNetworkRetry };
33
+
34
+ //# sourceMappingURL=marketplace-network-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-network-retry.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace-network-retry.ts"],"sourcesContent":["const MARKETPLACE_NETWORK_RETRY_ATTEMPTS = 5;\nconst MARKETPLACE_NETWORK_RETRY_BASE_MS = 350;\n\nfunction sleepMs(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction isRetryableMarketplaceNetworkError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n if (error.name === \"AbortError\") {\n return false;\n }\n const cause = (error as Error & { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\" && cause !== null && \"code\" in cause) {\n const code = (cause as { code?: unknown }).code;\n if (\n code === \"ECONNRESET\"\n || code === \"ECONNREFUSED\"\n || code === \"ETIMEDOUT\"\n || code === \"EPIPE\"\n || code === \"ENOTFOUND\"\n || code === \"EAI_AGAIN\"\n ) {\n return true;\n }\n }\n if (error instanceof TypeError && error.message === \"fetch failed\") {\n return true;\n }\n return false;\n}\n\nexport async function runWithMarketplaceNetworkRetry<T>(action: () => Promise<T>): Promise<T> {\n let last: unknown;\n for (let attempt = 1; attempt <= MARKETPLACE_NETWORK_RETRY_ATTEMPTS; attempt++) {\n try {\n return await action();\n } catch (error) {\n last = error;\n if (attempt === MARKETPLACE_NETWORK_RETRY_ATTEMPTS || !isRetryableMarketplaceNetworkError(error)) {\n throw error;\n }\n await sleepMs(MARKETPLACE_NETWORK_RETRY_BASE_MS * 2 ** (attempt - 1));\n }\n }\n throw last;\n}\n"],"mappings":";AAAA,MAAM,qCAAqC;AAC3C,MAAM,oCAAoC;AAE1C,SAAS,QAAQ,IAA2B;AAC1C,QAAO,IAAI,SAAS,YAAY;AAC9B,aAAW,SAAS,GAAG;GACvB;;AAGJ,SAAS,mCAAmC,OAAyB;AACnE,KAAI,EAAE,iBAAiB,OACrB,QAAO;AAET,KAAI,MAAM,SAAS,aACjB,QAAO;CAET,MAAM,QAAS,MAAsC;AACrD,KAAI,SAAS,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,OAAO;EAC3E,MAAM,OAAQ,MAA6B;AAC3C,MACE,SAAS,gBACN,SAAS,kBACT,SAAS,eACT,SAAS,WACT,SAAS,eACT,SAAS,YAEZ,QAAO;;AAGX,KAAI,iBAAiB,aAAa,MAAM,YAAY,eAClD,QAAO;AAET,QAAO;;AAGT,eAAsB,+BAAkC,QAAsC;CAC5F,IAAI;AACJ,MAAK,IAAI,UAAU,GAAG,WAAW,oCAAoC,UACnE,KAAI;AACF,SAAO,MAAM,QAAQ;UACd,OAAO;AACd,SAAO;AACP,MAAI,YAAY,sCAAsC,CAAC,mCAAmC,MAAM,CAC9F,OAAM;AAER,QAAM,QAAQ,oCAAoC,MAAM,UAAU,GAAG;;AAGzE,OAAM"}
@@ -17,4 +17,5 @@ type MarketplaceSkillPublishMetadata = {
17
17
  };
18
18
  declare function readMarketplaceMetadataFile(skillDir: string, explicitMetaFile?: string): MarketplaceSkillPublishMetadata;
19
19
  //#endregion
20
- export { type LocalizedTextMap, MarketplaceSkillPublishMetadata, buildLocalizedTextMap, parseSkillFrontmatter, readMarketplaceMetadataFile };
20
+ export { type LocalizedTextMap, MarketplaceSkillPublishMetadata, buildLocalizedTextMap, parseSkillFrontmatter, readMarketplaceMetadataFile };
21
+ //# sourceMappingURL=marketplace.metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.metadata.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace.metadata.ts"],"mappings":";;;KAgBY,+BAAA;EACV,IAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA,GAAc,gBAAA;EACd,WAAA;EACA,eAAA,GAAkB,gBAAA;EAClB,MAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,iBAGc,2BAAA,CACd,QAAA,UACA,gBAAA,YACC,+BAAA"}
@@ -70,3 +70,5 @@ function isRecord(value) {
70
70
  }
71
71
  //#endregion
72
72
  export { buildLocalizedTextMap, parseSkillFrontmatter, readMarketplaceMetadataFile };
73
+
74
+ //# sourceMappingURL=marketplace.metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.metadata.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace.metadata.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n buildLocalizedTextMap,\n parseSkillFrontmatter,\n type LocalizedTextMap,\n} from \"@nextclaw/kernel\";\n\nconst DEFAULT_MARKETPLACE_META_FILENAME = \"marketplace.json\";\n\nexport {\n buildLocalizedTextMap,\n parseSkillFrontmatter,\n type LocalizedTextMap,\n};\n\nexport type MarketplaceSkillPublishMetadata = {\n slug?: string;\n name?: string;\n summary?: string;\n summaryI18n?: LocalizedTextMap;\n description?: string;\n descriptionI18n?: LocalizedTextMap;\n author?: string;\n tags?: string[];\n sourceRepo?: string;\n homepage?: string;\n publishedAt?: string;\n updatedAt?: string;\n};\n\nexport function readMarketplaceMetadataFile(\n skillDir: string,\n explicitMetaFile?: string\n): MarketplaceSkillPublishMetadata {\n const metadataPath = resolveMarketplaceMetadataPath(skillDir, explicitMetaFile);\n if (!metadataPath) {\n return {};\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(metadataPath, \"utf8\"));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid marketplace metadata file: ${metadataPath} (${message})`);\n }\n\n if (!isRecord(parsed)) {\n throw new Error(`Invalid marketplace metadata file: ${metadataPath} (root must be an object)`);\n }\n\n return {\n slug: readMetadataString(parsed, \"slug\"),\n name: readMetadataString(parsed, \"name\"),\n summary: readMetadataString(parsed, \"summary\"),\n summaryI18n: readMetadataLocalizedTextMap(parsed, \"summaryI18n\"),\n description: readMetadataString(parsed, \"description\"),\n descriptionI18n: readMetadataLocalizedTextMap(parsed, \"descriptionI18n\"),\n author: readMetadataString(parsed, \"author\"),\n tags: readMetadataStringArray(parsed, \"tags\"),\n sourceRepo: readMetadataString(parsed, \"sourceRepo\"),\n homepage: readMetadataString(parsed, \"homepage\"),\n publishedAt: readMetadataString(parsed, \"publishedAt\"),\n updatedAt: readMetadataString(parsed, \"updatedAt\")\n };\n}\n\nfunction resolveMarketplaceMetadataPath(skillDir: string, explicitMetaFile?: string): string | undefined {\n const resolved = explicitMetaFile?.trim()\n ? resolve(explicitMetaFile)\n : resolve(skillDir, DEFAULT_MARKETPLACE_META_FILENAME);\n return existsSync(resolved) ? resolved : undefined;\n}\n\nfunction readMetadataString(record: Record<string, unknown>, fieldName: string): string | undefined {\n const value = record[fieldName];\n if (value == null) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(`Invalid marketplace metadata field: ${fieldName} must be a string`);\n }\n const normalized = value.trim();\n return normalized || undefined;\n}\n\nfunction readMetadataStringArray(record: Record<string, unknown>, fieldName: string): string[] | undefined {\n const value = record[fieldName];\n if (value == null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(`Invalid marketplace metadata field: ${fieldName} must be an array`);\n }\n const tags = value.map((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`Invalid marketplace metadata field: ${fieldName}[${index}] must be a string`);\n }\n return entry.trim();\n }).filter(Boolean);\n return tags.length > 0 ? tags : undefined;\n}\n\nfunction readMetadataLocalizedTextMap(record: Record<string, unknown>, fieldName: string): LocalizedTextMap | undefined {\n const value = record[fieldName];\n if (value == null) {\n return undefined;\n }\n if (!isRecord(value)) {\n throw new Error(`Invalid marketplace metadata field: ${fieldName} must be an object`);\n }\n const localized: LocalizedTextMap = {};\n for (const [locale, text] of Object.entries(value)) {\n if (typeof text !== \"string\") {\n throw new Error(`Invalid marketplace metadata field: ${fieldName}.${locale} must be a string`);\n }\n const normalized = text.trim();\n if (!normalized) {\n continue;\n }\n localized[normalizeLocaleTag(locale)] = normalized;\n }\n return Object.keys(localized).length > 0 ? localized : undefined;\n}\n\nfunction normalizeLocaleTag(raw: string): string {\n return raw.trim().toLowerCase();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;AAQA,MAAM,oCAAoC;AAuB1C,SAAgB,4BACd,UACA,kBACiC;CACjC,MAAM,eAAe,+BAA+B,UAAU,iBAAiB;AAC/E,KAAI,CAAC,aACH,QAAO,EAAE;CAGX,IAAI;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;UAChD,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,QAAM,IAAI,MAAM,sCAAsC,aAAa,IAAI,QAAQ,GAAG;;AAGpF,KAAI,CAAC,SAAS,OAAO,CACnB,OAAM,IAAI,MAAM,sCAAsC,aAAa,2BAA2B;AAGhG,QAAO;EACL,MAAM,mBAAmB,QAAQ,OAAO;EACxC,MAAM,mBAAmB,QAAQ,OAAO;EACxC,SAAS,mBAAmB,QAAQ,UAAU;EAC9C,aAAa,6BAA6B,QAAQ,cAAc;EAChE,aAAa,mBAAmB,QAAQ,cAAc;EACtD,iBAAiB,6BAA6B,QAAQ,kBAAkB;EACxE,QAAQ,mBAAmB,QAAQ,SAAS;EAC5C,MAAM,wBAAwB,QAAQ,OAAO;EAC7C,YAAY,mBAAmB,QAAQ,aAAa;EACpD,UAAU,mBAAmB,QAAQ,WAAW;EAChD,aAAa,mBAAmB,QAAQ,cAAc;EACtD,WAAW,mBAAmB,QAAQ,YAAY;EACnD;;AAGH,SAAS,+BAA+B,UAAkB,kBAA+C;CACvG,MAAM,WAAW,kBAAkB,MAAM,GACrC,QAAQ,iBAAiB,GACzB,QAAQ,UAAU,kCAAkC;AACxD,QAAO,WAAW,SAAS,GAAG,WAAW,KAAA;;AAG3C,SAAS,mBAAmB,QAAiC,WAAuC;CAClG,MAAM,QAAQ,OAAO;AACrB,KAAI,SAAS,KACX;AAEF,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,uCAAuC,UAAU,mBAAmB;AAGtF,QADmB,MAAM,MAAM,IACV,KAAA;;AAGvB,SAAS,wBAAwB,QAAiC,WAAyC;CACzG,MAAM,QAAQ,OAAO;AACrB,KAAI,SAAS,KACX;AAEF,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,OAAM,IAAI,MAAM,uCAAuC,UAAU,mBAAmB;CAEtF,MAAM,OAAO,MAAM,KAAK,OAAO,UAAU;AACvC,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM,uCAAuC,UAAU,GAAG,MAAM,oBAAoB;AAEhG,SAAO,MAAM,MAAM;GACnB,CAAC,OAAO,QAAQ;AAClB,QAAO,KAAK,SAAS,IAAI,OAAO,KAAA;;AAGlC,SAAS,6BAA6B,QAAiC,WAAiD;CACtH,MAAM,QAAQ,OAAO;AACrB,KAAI,SAAS,KACX;AAEF,KAAI,CAAC,SAAS,MAAM,CAClB,OAAM,IAAI,MAAM,uCAAuC,UAAU,oBAAoB;CAEvF,MAAM,YAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,QAAQ,SAAS,OAAO,QAAQ,MAAM,EAAE;AAClD,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,MAAM,uCAAuC,UAAU,GAAG,OAAO,mBAAmB;EAEhG,MAAM,aAAa,KAAK,MAAM;AAC9B,MAAI,CAAC,WACH;AAEF,YAAU,mBAAmB,OAAO,IAAI;;AAE1C,QAAO,OAAO,KAAK,UAAU,CAAC,SAAS,IAAI,YAAY,KAAA;;AAGzD,SAAS,mBAAmB,KAAqB;AAC/C,QAAO,IAAI,MAAM,CAAC,aAAa;;AAGjC,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"}
@@ -43,4 +43,5 @@ declare function publishMarketplaceSkill(options: MarketplaceSkillPublishOptions
43
43
  fileCount: number;
44
44
  }>;
45
45
  //#endregion
46
- export { MarketplaceSkillInstallOptions, MarketplaceSkillPublishOptions, installMarketplaceSkill, publishMarketplaceSkill };
46
+ export { MarketplaceSkillInstallOptions, MarketplaceSkillPublishOptions, installMarketplaceSkill, publishMarketplaceSkill };
47
+ //# sourceMappingURL=marketplace.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/marketplace.utils.ts"],"mappings":";;;KA6BK,2BAAA;AAAA,KAEO,8BAAA;EACV,IAAA;EACA,OAAA;EACA,GAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,KAGU,8BAAA;EACV,QAAA;EACA,QAAA;EACA,IAAA;EACA,WAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA,GAAc,gBAAA;EACd,WAAA;EACA,eAAA,GAAkB,gBAAA;EAClB,MAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;EACA,eAAA;AAAA;AAAA,iBAGoB,uBAAA,CAAwB,OAAA,EAAS,8BAAA,GAAiC,OAAA;EACtF,IAAA;EACA,cAAA;EACA,gBAAA;EACA,MAAA,EAAQ,2BAAA;AAAA;AAAA,iBA4LY,uBAAA,CAAwB,OAAA,EAAS,8BAAA,GAAiC,OAAA;EACtF,OAAA;EACA,IAAA;EACA,WAAA;EACA,SAAA;AAAA"}
@@ -200,3 +200,5 @@ function resolveBuiltinSkillDir(workdir, skillName) {
200
200
  }
201
201
  //#endregion
202
202
  export { installMarketplaceSkill, publishMarketplaceSkill };
203
+
204
+ //# sourceMappingURL=marketplace.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.utils.js","names":[],"sources":["../../../../src/cli/commands/skills/marketplace.utils.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from \"node:fs\";\nimport { basename, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { DEFAULT_SKILLS_DIR } from \"@nextclaw/core\";\nimport { SkillManager } from \"@nextclaw/kernel\";\nimport {\n buildLocalizedTextMap,\n parseSkillFrontmatter,\n readMarketplaceMetadataFile,\n type LocalizedTextMap\n} from \"./marketplace.metadata.js\";\nimport { PlatformAuthCommands } from \"@nextclaw-service/commands/platform-auth/index.js\";\nimport {\n fetchMarketplaceSkillFiles,\n fetchMarketplaceSkillItem,\n collectMarketplaceSkillFiles,\n type MarketplaceSkillFileManifestEntry,\n readMarketplaceEnvelope,\n resolveMarketplaceAdminToken,\n resolveMarketplaceApiBase,\n writeMarketplaceSkillFiles\n} from \"./marketplace-client.js\";\nimport {\n normalizeTags,\n resolvePublishPackageName,\n validateSkillSelector,\n validateSkillSlug\n} from \"./marketplace-identity.utils.js\";\nimport { runWithMarketplaceNetworkRetry } from \"./marketplace-network-retry.js\";\n\ntype MarketplaceSkillInstallKind = \"builtin\" | \"marketplace\";\n\nexport type MarketplaceSkillInstallOptions = {\n slug: string;\n workdir: string;\n dir?: string;\n force?: boolean;\n apiBaseUrl?: string;\n};\n\nexport type MarketplaceSkillPublishOptions = {\n skillDir: string;\n metaFile?: string;\n slug?: string;\n packageName?: string;\n scope?: string;\n name?: string;\n summary?: string;\n summaryI18n?: LocalizedTextMap;\n description?: string;\n descriptionI18n?: LocalizedTextMap;\n author?: string;\n tags?: string[];\n sourceRepo?: string;\n homepage?: string;\n publishedAt?: string;\n updatedAt?: string;\n apiBaseUrl?: string;\n token?: string;\n requireExisting?: boolean;\n};\n\nexport async function installMarketplaceSkill(options: MarketplaceSkillInstallOptions): Promise<{\n slug: string;\n destinationDir: string;\n alreadyInstalled?: boolean;\n source: MarketplaceSkillInstallKind;\n}> {\n const { slug, workdir: rawWorkdir, dir, force, apiBaseUrl } = options;\n const selector = validateSkillSelector(slug.trim(), \"slug\");\n const workdir = resolve(rawWorkdir);\n if (!existsSync(workdir)) {\n throw new Error(`Workdir does not exist: ${workdir}`);\n }\n\n const apiBase = resolveMarketplaceApiBase(apiBaseUrl);\n const item = await fetchMarketplaceSkillItem(apiBase, selector);\n const installSlug = item.slug;\n const resolvedSlug = item.packageName || item.slug;\n const destinationDir = resolveMarketplaceSkillDestinationDir({\n workdir,\n slug: installSlug,\n dir,\n });\n\n if (item.install.kind === \"builtin\") {\n const builtinResult = resolveBuiltinMarketplaceInstallResult({\n workdir,\n slug: installSlug,\n });\n builtinResult.slug = resolvedSlug;\n return builtinResult;\n }\n\n const filesPayload = await fetchMarketplaceSkillFiles(apiBase, selector);\n const existingInstall = prepareMarketplaceSkillDestinationDir({\n destinationDir,\n files: filesPayload.files,\n force,\n slug: installSlug,\n });\n if (existingInstall) {\n existingInstall.slug = resolvedSlug;\n return existingInstall;\n }\n await writeMarketplaceSkillFiles({\n destinationDir,\n files: filesPayload.files,\n apiBase,\n slug: selector,\n });\n ensureInstalledMarketplaceSkill(destinationDir, installSlug);\n return buildMarketplaceInstallResult(resolvedSlug, destinationDir);\n}\n\nfunction resolveMarketplaceSkillDestinationDir(params: {\n workdir: string;\n slug: string;\n dir?: string;\n}): string {\n const { workdir, slug, dir } = params;\n const dirName = dir?.trim() || DEFAULT_SKILLS_DIR;\n return isAbsolute(dirName)\n ? resolve(dirName, slug)\n : resolve(workdir, dirName, slug);\n}\n\nfunction resolveBuiltinMarketplaceInstallResult(params: {\n workdir: string;\n slug: string;\n}): {\n slug: string;\n destinationDir: string;\n alreadyInstalled: true;\n source: \"builtin\";\n} {\n return {\n slug: params.slug,\n destinationDir: resolveBuiltinSkillDir(params.workdir, params.slug),\n alreadyInstalled: true,\n source: \"builtin\",\n };\n}\n\nfunction prepareMarketplaceSkillDestinationDir(params: {\n destinationDir: string;\n files: MarketplaceSkillFileManifestEntry[];\n force?: boolean;\n slug: string;\n}): {\n slug: string;\n destinationDir: string;\n alreadyInstalled: true;\n source: \"marketplace\";\n} | null {\n const { destinationDir, files, force, slug } = params;\n if (!force && existsSync(destinationDir)) {\n const existingDirState = inspectMarketplaceSkillDirectory(destinationDir, files);\n if (existingDirState === \"installed\") {\n return {\n slug,\n destinationDir,\n alreadyInstalled: true,\n source: \"marketplace\",\n };\n }\n if (existingDirState !== \"recoverable\") {\n throw new Error(`Skill directory already exists: ${destinationDir} (use --force)`);\n }\n rmSync(destinationDir, { recursive: true, force: true });\n }\n\n if (force && existsSync(destinationDir)) {\n rmSync(destinationDir, { recursive: true, force: true });\n }\n\n mkdirSync(destinationDir, { recursive: true });\n return null;\n}\n\nfunction ensureInstalledMarketplaceSkill(destinationDir: string, slug: string): void {\n if (!existsSync(join(destinationDir, \"SKILL.md\"))) {\n throw new Error(`Marketplace skill ${slug} does not include SKILL.md`);\n }\n}\n\nfunction buildMarketplaceInstallResult(slug: string, destinationDir: string): {\n slug: string;\n destinationDir: string;\n source: \"marketplace\";\n} {\n return {\n slug,\n destinationDir,\n source: \"marketplace\",\n };\n}\n\nfunction inspectMarketplaceSkillDirectory(\n destinationDir: string,\n files: MarketplaceSkillFileManifestEntry[]\n): \"installed\" | \"recoverable\" | \"conflict\" {\n if (existsSync(join(destinationDir, \"SKILL.md\"))) {\n return \"installed\";\n }\n\n const discoveredFiles = collectRelativeFiles(destinationDir);\n if (discoveredFiles === null) {\n return \"conflict\";\n }\n\n const relevantFiles = discoveredFiles.filter((file) => !isIgnorableMarketplaceResidue(file));\n if (relevantFiles.length === 0) {\n return \"recoverable\";\n }\n\n const manifestPaths = new Set(files.map((file) => normalizeMarketplaceRelativePath(file.path)));\n return relevantFiles.every((file) => manifestPaths.has(normalizeMarketplaceRelativePath(file)))\n ? \"recoverable\"\n : \"conflict\";\n}\n\nfunction collectRelativeFiles(rootDir: string): string[] | null {\n const output: string[] = [];\n const walk = (dir: string): boolean => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const absolute = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!walk(absolute)) {\n return false;\n }\n continue;\n }\n if (!entry.isFile()) {\n return false;\n }\n const relativePath = relative(rootDir, absolute);\n output.push(normalizeMarketplaceRelativePath(relativePath));\n }\n return true;\n };\n\n return walk(rootDir) ? output : null;\n}\n\nfunction normalizeMarketplaceRelativePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction isIgnorableMarketplaceResidue(path: string): boolean {\n return path === \".DS_Store\";\n}\n\nexport async function publishMarketplaceSkill(options: MarketplaceSkillPublishOptions): Promise<{\n created: boolean;\n slug: string;\n packageName: string;\n fileCount: number;\n}> {\n const {\n skillDir: rawSkillDir,\n slug: explicitSlug,\n metaFile,\n packageName: explicitPackageName,\n scope: explicitScope,\n name: explicitName,\n summary: explicitSummary,\n summaryI18n: explicitSummaryI18n,\n description: explicitDescription,\n descriptionI18n: explicitDescriptionI18n,\n tags: explicitTags,\n sourceRepo: explicitSourceRepo,\n homepage: explicitHomepage,\n publishedAt: explicitPublishedAt,\n updatedAt: explicitUpdatedAt,\n apiBaseUrl,\n token: explicitToken,\n requireExisting\n } = options;\n const skillDir = resolve(rawSkillDir);\n if (!existsSync(skillDir)) {\n throw new Error(`Skill directory not found: ${skillDir}`);\n }\n\n const files = collectMarketplaceSkillFiles(skillDir);\n if (!files.some((file) => file.path === \"SKILL.md\")) {\n throw new Error(`Skill directory must include SKILL.md: ${skillDir}`);\n }\n\n const parsedFrontmatter = parseSkillFrontmatter(readFileSync(join(skillDir, \"SKILL.md\"), \"utf8\"));\n const metadata = readMarketplaceMetadataFile(skillDir, metaFile);\n const slug = validateSkillSlug(explicitSlug?.trim() || metadata.slug || basename(skillDir), \"slug\");\n const name = explicitName?.trim() || metadata.name || parsedFrontmatter.name || slug;\n const description = explicitDescription?.trim()\n || metadata.description\n || metadata.descriptionI18n?.en\n || parsedFrontmatter.description;\n const summary = explicitSummary?.trim()\n || metadata.summary\n || metadata.summaryI18n?.en\n || parsedFrontmatter.summary\n || description\n || `${slug} skill`;\n const summaryI18n = buildLocalizedTextMap(summary, parsedFrontmatter.summaryI18n, metadata.summaryI18n, explicitSummaryI18n);\n const descriptionI18n = description\n ? buildLocalizedTextMap(description, parsedFrontmatter.descriptionI18n, metadata.descriptionI18n, explicitDescriptionI18n)\n : undefined;\n const tags = normalizeTags(explicitTags && explicitTags.length > 0 ? explicitTags : (metadata.tags ?? parsedFrontmatter.tags));\n\n const apiBase = resolveMarketplaceApiBase(apiBaseUrl);\n const adminToken = resolveMarketplaceAdminToken(explicitToken);\n const platformAuth = new PlatformAuthCommands();\n const currentUser = adminToken ? null : await platformAuth.me();\n const packageName = resolvePublishPackageName({\n explicitPackageName,\n explicitScope,\n slug,\n adminTokenPresent: Boolean(adminToken),\n currentUser\n });\n const authToken = adminToken ?? currentUser?.token;\n if (!authToken) {\n throw new Error(\"Publishing requires either a marketplace admin token or an active NextClaw platform login.\");\n }\n\n const response = await runWithMarketplaceNetworkRetry(() =>\n fetch(`${apiBase}/api/v1/skills/publish`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${authToken}`\n },\n body: JSON.stringify({\n slug,\n packageName,\n name,\n summary,\n summaryI18n,\n description,\n descriptionI18n,\n tags,\n sourceRepo: explicitSourceRepo?.trim() || metadata.sourceRepo,\n homepage: explicitHomepage?.trim() || metadata.homepage,\n publishedAt: explicitPublishedAt?.trim() || metadata.publishedAt,\n updatedAt: explicitUpdatedAt?.trim() || metadata.updatedAt,\n requireExisting,\n files\n })\n })\n );\n\n const payload = await readMarketplaceEnvelope<{\n created: boolean;\n fileCount: number;\n item?: {\n slug?: string;\n packageName?: string;\n };\n }>(response);\n\n if (!payload.ok || !payload.data) {\n const message = payload.error?.message || `marketplace publish failed: HTTP ${response.status}`;\n throw new Error(message);\n }\n\n return {\n created: payload.data.created,\n slug: payload.data.item?.slug || slug,\n packageName: payload.data.item?.packageName || packageName,\n fileCount: payload.data.fileCount\n };\n}\n\nfunction resolveBuiltinSkillDir(workdir: string, skillName: string): string {\n const skillDir = new SkillManager({ workspace: workdir }).resolveBuiltinSkillDir(skillName);\n if (!skillDir) {\n throw new Error(`Built-in skill not found in local installation: ${skillName}`);\n }\n return skillDir;\n}\n"],"mappings":"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"}
@@ -106,4 +106,5 @@ declare class SkillsQueryService {
106
106
  private fetchMarketplaceView;
107
107
  }
108
108
  //#endregion
109
- export { MarketplaceSkillInfoView, MarketplaceSkillsRecommendationResultView, MarketplaceSkillsSearchView, SkillsQueryService };
109
+ export { MarketplaceSkillInfoView, MarketplaceSkillsRecommendationResultView, MarketplaceSkillsSearchView, SkillsQueryService };
110
+ //# sourceMappingURL=skills-query.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-query.service.d.ts","names":[],"sources":["../../../../src/cli/commands/skills/skills-query.service.ts"],"mappings":";;;;KAQK,oBAAA;AAAA,KACA,2BAAA;AAAA,KAEA,sBAAA;EACH,IAAA,EAAM,2BAAA;EACN,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,2BAAA;EACH,EAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA,EAAa,gBAAA;EACb,IAAA;EACA,MAAA;EACA,OAAA,EAAS,sBAAA;EACT,SAAA;AAAA;AAAA,KAGG,wBAAA,GAA2B,2BAAA;EAC9B,WAAA;EACA,eAAA,GAAkB,gBAAA;EAClB,UAAA;EACA,QAAA;EACA,WAAA;AAAA;AAAA,KAGG,2BAAA;EACH,IAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA,EAAS,sBAAA;EACT,MAAA;EACA,GAAA;EACA,WAAA;EACA,OAAA;EACA,SAAA;AAAA;AAAA,KAGG,wBAAA;EACH,KAAA;EACA,IAAA;EACA,QAAA;EACA,UAAA;EACA,IAAA,EAAM,oBAAA;EACN,KAAA;EACA,KAAA,EAAO,2BAAA;AAAA;AAAA,KAGJ,kCAAA;EACH,IAAA;EACA,OAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;EACA,KAAA,EAAO,2BAAA;AAAA;AAAA,KAGG,2BAAA,GAA8B,wBAAA;EACxC,UAAA;AAAA;AAAA,KAGU,wBAAA;EACV,UAAA;EACA,IAAA,EAAM,wBAAA;EACN,OAAA,EAAS,2BAAA;EACT,wBAAA;AAAA;AAAA,KAGU,yCAAA,GAA4C,kCAAA;EACtD,UAAA;AAAA;AAAA,cAGW,kBAAA;EACX,aAAA,GAAiB,MAAA;IACf,OAAA;IACA,KAAA;IACA,KAAA;EAAA,MAJ2B,mBAAA,CAK5B,mBAAA;EAOD,gBAAA,GAAoB,MAAA;IAClB,OAAA;IACA,QAAA;EAAA,MATD,mBAAA,CAUA,oBAAA;EASD,uBAAA,GAAiC,MAAA;IAC/B,UAAA;IACA,KAAA;IACA,GAAA;IACA,IAAA;IACA,IAAA;IACA,QAAA;EAAA,MACE,OAAA,CAAQ,2BAAA;EAsBZ,uBAAA,GAAiC,MAAA;IAC/B,UAAA;IACA,IAAA;EAAA,MACE,OAAA,CAAQ,wBAAA;EA6BZ,0BAAA,GAAoC,MAAA;IAClC,UAAA;IACA,KAAA;IACA,KAAA;EAAA,MACE,OAAA,CAAQ,yCAAA;EAAA,QAkBJ,2BAAA;EAAA,QAOA,wBAAA;EAAA,QAOA,2BAAA;EAAA,QAOA,+BAAA;EAAA,QAQA,wBAAA;EAAA,QAWA,wBAAA;EAAA,QAWA,uBAAA;EAAA,QAQA,uBAAA;EAAA,QAQA,oBAAA;AAAA"}
@@ -128,3 +128,5 @@ var SkillsQueryService = class {
128
128
  };
129
129
  //#endregion
130
130
  export { SkillsQueryService };
131
+
132
+ //# sourceMappingURL=skills-query.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-query.service.js","names":[],"sources":["../../../../src/cli/commands/skills/skills-query.service.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport {\n SkillManager,\n type LocalizedTextMap,\n} from \"@nextclaw/kernel\";\nimport { readMarketplaceEnvelope, resolveMarketplaceApiBase } from \"./marketplace-client.js\";\nimport { runWithMarketplaceNetworkRetry } from \"./marketplace-network-retry.js\";\n\ntype MarketplaceSkillSort = \"relevance\" | \"updated\";\ntype MarketplaceSkillInstallKind = \"builtin\" | \"marketplace\";\n\ntype MarketplaceInstallSpec = {\n kind: MarketplaceSkillInstallKind;\n spec: string;\n command: string;\n};\n\ntype MarketplaceSkillItemSummary = {\n id: string;\n slug: string;\n type: \"skill\";\n name: string;\n summary: string;\n summaryI18n: LocalizedTextMap;\n tags: string[];\n author: string;\n install: MarketplaceInstallSpec;\n updatedAt: string;\n};\n\ntype MarketplaceSkillItemView = MarketplaceSkillItemSummary & {\n description?: string;\n descriptionI18n?: LocalizedTextMap;\n sourceRepo?: string;\n homepage?: string;\n publishedAt: string;\n};\n\ntype MarketplaceSkillContentView = {\n type: \"skill\";\n slug: string;\n name: string;\n install: MarketplaceInstallSpec;\n source: \"builtin\" | \"marketplace\" | \"remote\";\n raw: string;\n metadataRaw?: string;\n bodyRaw: string;\n sourceUrl?: string;\n};\n\ntype MarketplaceSkillListView = {\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n sort: MarketplaceSkillSort;\n query?: string;\n items: MarketplaceSkillItemSummary[];\n};\n\ntype MarketplaceSkillRecommendationView = {\n type: \"skill\";\n sceneId: string;\n title: string;\n description?: string;\n total: number;\n items: MarketplaceSkillItemSummary[];\n};\n\nexport type MarketplaceSkillsSearchView = MarketplaceSkillListView & {\n apiBaseUrl: string;\n};\n\nexport type MarketplaceSkillInfoView = {\n apiBaseUrl: string;\n item: MarketplaceSkillItemView;\n content: MarketplaceSkillContentView | null;\n contentUnavailableReason: string | null;\n};\n\nexport type MarketplaceSkillsRecommendationResultView = MarketplaceSkillRecommendationView & {\n apiBaseUrl: string;\n};\n\nexport class SkillsQueryService {\n listInstalled = (params: {\n workdir: string;\n query?: string;\n scope?: string;\n }) => {\n return new SkillManager({ workspace: resolve(params.workdir) }).listInstalledSkills({\n scope: params.scope,\n query: params.query,\n });\n };\n\n getInstalledInfo = (params: {\n workdir: string;\n selector: string;\n }) => {\n const skillManager = new SkillManager({ workspace: resolve(params.workdir) });\n const detail = skillManager.getInstalledSkillDetail(params.selector);\n if (!detail) {\n throw new Error(`Installed skill not found: ${params.selector}`);\n }\n return detail;\n };\n\n searchMarketplaceSkills = async (params: {\n apiBaseUrl?: string;\n query?: string;\n tag?: string;\n sort?: string;\n page?: string | number;\n pageSize?: string | number;\n }): Promise<MarketplaceSkillsSearchView> => {\n const { apiBaseUrl: rawApiBaseUrl, page, pageSize, query, sort, tag } = params;\n const apiBaseUrl = resolveMarketplaceApiBase(rawApiBaseUrl);\n const result = await this.fetchMarketplaceView<MarketplaceSkillListView>({\n apiBaseUrl,\n path: \"/api/v1/skills/items\",\n query: {\n q: this.normalizeOptionalString(query) ?? undefined,\n tag: this.normalizeOptionalString(tag) ?? undefined,\n sort: this.normalizeMarketplaceSort(sort),\n page: this.normalizePositiveInteger(page),\n pageSize: this.normalizePositiveInteger(pageSize),\n },\n });\n\n return {\n apiBaseUrl,\n ...result,\n items: result.items.map((item) => this.normalizeMarketplaceSummary(item)),\n };\n };\n\n getMarketplaceSkillInfo = async (params: {\n apiBaseUrl?: string;\n slug: string;\n }): Promise<MarketplaceSkillInfoView> => {\n const slug = this.normalizeRequiredString(params.slug, \"skill slug\");\n const apiBaseUrl = resolveMarketplaceApiBase(params.apiBaseUrl);\n const encodedSlug = encodeURIComponent(slug);\n\n const item = await this.fetchMarketplaceView<MarketplaceSkillItemView>({\n apiBaseUrl,\n path: `/api/v1/skills/items/${encodedSlug}`,\n });\n\n let content: MarketplaceSkillContentView | null = null;\n let contentUnavailableReason: string | null = null;\n try {\n content = this.normalizeMarketplaceContent(await this.fetchMarketplaceView<MarketplaceSkillContentView>({\n apiBaseUrl,\n path: `/api/v1/skills/items/${encodedSlug}/content`,\n }));\n } catch (error) {\n contentUnavailableReason = error instanceof Error ? error.message : String(error);\n }\n\n return {\n apiBaseUrl,\n item: this.normalizeMarketplaceItem(item),\n content,\n contentUnavailableReason,\n };\n };\n\n recommendMarketplaceSkills = async (params: {\n apiBaseUrl?: string;\n scene?: string;\n limit?: string | number;\n }): Promise<MarketplaceSkillsRecommendationResultView> => {\n const apiBaseUrl = resolveMarketplaceApiBase(params.apiBaseUrl);\n const result = await this.fetchMarketplaceView<MarketplaceSkillRecommendationView>({\n apiBaseUrl,\n path: \"/api/v1/skills/recommendations\",\n query: {\n scene: this.normalizeOptionalString(params.scene) ?? undefined,\n limit: this.normalizePositiveInteger(params.limit),\n },\n });\n\n return {\n apiBaseUrl,\n ...result,\n items: result.items.map((item) => this.normalizeMarketplaceSummary(item)),\n };\n };\n\n private normalizeMarketplaceSummary = (\n item: MarketplaceSkillItemSummary,\n ): MarketplaceSkillItemSummary => ({\n ...item,\n install: this.normalizeMarketplaceInstallSpec(item.install, item.slug),\n });\n\n private normalizeMarketplaceItem = (\n item: MarketplaceSkillItemView,\n ): MarketplaceSkillItemView => ({\n ...item,\n install: this.normalizeMarketplaceInstallSpec(item.install, item.slug),\n });\n\n private normalizeMarketplaceContent = (\n content: MarketplaceSkillContentView,\n ): MarketplaceSkillContentView => ({\n ...content,\n install: this.normalizeMarketplaceInstallSpec(content.install, content.slug),\n });\n\n private normalizeMarketplaceInstallSpec = (\n install: MarketplaceInstallSpec,\n slug: string,\n ): MarketplaceInstallSpec => ({\n ...install,\n command: `nextclaw marketplace skills install ${slug}`,\n });\n\n private normalizeMarketplaceSort = (value: string | undefined): MarketplaceSkillSort | undefined => {\n const normalized = this.normalizeOptionalString(value);\n if (!normalized) {\n return undefined;\n }\n if (normalized === \"relevance\" || normalized === \"updated\") {\n return normalized;\n }\n throw new Error(`Invalid marketplace sort: ${value}. Expected relevance or updated.`);\n };\n\n private normalizePositiveInteger = (value: string | number | undefined): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Expected a positive integer, received: ${String(value)}`);\n }\n return String(Math.floor(parsed));\n };\n\n private normalizeRequiredString = (value: string, label: string): string => {\n const normalized = this.normalizeOptionalString(value);\n if (!normalized) {\n throw new Error(`Missing ${label}`);\n }\n return normalized;\n };\n\n private normalizeOptionalString = (value: string | undefined): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n };\n\n private fetchMarketplaceView = async <T>(params: {\n apiBaseUrl: string;\n path: string;\n query?: Record<string, string | undefined>;\n }): Promise<T> => {\n const url = new URL(params.path, `${params.apiBaseUrl}/`);\n for (const [key, value] of Object.entries(params.query ?? {})) {\n if (typeof value === \"string\" && value.length > 0) {\n url.searchParams.set(key, value);\n }\n }\n\n const response = await runWithMarketplaceNetworkRetry(async () =>\n await fetch(url.toString(), {\n headers: {\n Accept: \"application/json\",\n },\n })\n );\n\n const payload = await readMarketplaceEnvelope<T>(response);\n if (!payload.ok || !payload.data) {\n const message = payload.error?.message || `marketplace request failed: ${response.status}`;\n throw new Error(message);\n }\n\n return payload.data;\n };\n}\n"],"mappings":"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"}
@@ -15,4 +15,5 @@ declare class StartCommands {
15
15
  run: (opts: StartCommandOptions) => Promise<void>;
16
16
  }
17
17
  //#endregion
18
- export { StartCommands };
18
+ export { StartCommands };
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/start/index.ts"],"mappings":";;;;cAIa,aAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,EAAuB,qBAAA;IACvB,gBAAA;IACA,IAAA,GAAO,MAAA;MAAU,MAAA;MAAgB,IAAA;IAAA,MAAoB,OAAA;EAAA;EAIzD,GAAA,GAAa,IAAA,EAAM,mBAAA,KAAsB,OAAA;AAAA"}
@@ -23,3 +23,5 @@ var StartCommands = class {
23
23
  };
24
24
  //#endregion
25
25
  export { StartCommands };
26
+
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/start/index.ts"],"sourcesContent":["import { parseStartTimeoutMs, resolveManagedServiceUiOverrides } from \"@nextclaw-service/shared/utils/runtime-helpers.js\";\nimport type { StartCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport type { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\n\nexport class StartCommands {\n constructor(\n private readonly deps: {\n runtimeCommandService: RuntimeCommandService;\n forcedPublicHost: string;\n init: (params: { source: string; auto: boolean }) => Promise<void>;\n }\n ) {}\n\n run = async (opts: StartCommandOptions): Promise<void> => {\n const startupTimeoutMs = parseStartTimeoutMs(opts.startTimeout);\n await this.deps.init({ source: \"start\", auto: true });\n const uiOverrides = resolveManagedServiceUiOverrides({\n uiPort: opts.uiPort,\n forcedPublicHost: this.deps.forcedPublicHost\n });\n\n await this.deps.runtimeCommandService.startService({\n uiOverrides,\n open: Boolean(opts.open),\n startupTimeoutMs,\n });\n };\n}\n"],"mappings":";;AAIA,IAAa,gBAAb,MAA2B;CACzB,YACE,MAKA;AALiB,OAAA,OAAA;;CAOnB,MAAM,OAAO,SAA6C;EACxD,MAAM,mBAAmB,oBAAoB,KAAK,aAAa;AAC/D,QAAM,KAAK,KAAK,KAAK;GAAE,QAAQ;GAAS,MAAM;GAAM,CAAC;EACrD,MAAM,cAAc,iCAAiC;GACnD,QAAQ,KAAK;GACb,kBAAkB,KAAK,KAAK;GAC7B,CAAC;AAEF,QAAM,KAAK,KAAK,sBAAsB,aAAa;GACjD;GACA,MAAM,QAAQ,KAAK,KAAK;GACxB;GACD,CAAC"}
@@ -9,4 +9,5 @@ declare class StopCommands {
9
9
  run: () => Promise<void>;
10
10
  }
11
11
  //#endregion
12
- export { StopCommands };
12
+ export { StopCommands };
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/cli/commands/stop/index.ts"],"mappings":";;;cAEa,YAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,EAAuB,qBAAA;EAAA;EAI3B,GAAA,QAAgB,OAAA;AAAA"}
@@ -9,3 +9,5 @@ var StopCommands = class {
9
9
  };
10
10
  //#endregion
11
11
  export { StopCommands };
12
+
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/cli/commands/stop/index.ts"],"sourcesContent":["import type { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\n\nexport class StopCommands {\n constructor(\n private readonly deps: {\n runtimeCommandService: RuntimeCommandService;\n }\n ) {}\n\n run = async (): Promise<void> => {\n await this.deps.runtimeCommandService.stopService();\n };\n}\n"],"mappings":";AAEA,IAAa,eAAb,MAA0B;CACxB,YACE,MAGA;AAHiB,OAAA,OAAA;;CAKnB,MAAM,YAA2B;AAC/B,QAAM,KAAK,KAAK,sBAAsB,aAAa"}