nextclaw 0.48.2 → 0.49.0

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 (205) hide show
  1. package/dist/cli/app/index.js +1 -1
  2. package/dist/{nextclaw-cli-app-C1L77sjJ.js → nextclaw-cli-app-CjtgVEdo.js} +300 -3
  3. package/dist/nextclaw-cli-app-CjtgVEdo.js.map +1 -0
  4. package/package.json +17 -17
  5. package/resources/USAGE.md +33 -85
  6. package/ui-dist/.vite/manifest.json +538 -525
  7. package/ui-dist/.vite/manifest.json.gz +0 -0
  8. package/ui-dist/assets/{account-panel-BxMlLXYH.js → account-panel-UvHFa8Kl.js} +1 -1
  9. package/ui-dist/assets/account-panel-UvHFa8Kl.js.gz +0 -0
  10. package/ui-dist/assets/{api-Utt-xzrT.js → api-Dffeij78.js} +5 -5
  11. package/ui-dist/assets/api-Dffeij78.js.gz +0 -0
  12. package/ui-dist/assets/{app-data-DYXDL6X2.js → app-data-DzaIMy4D.js} +1 -1
  13. package/ui-dist/assets/app-data-DzaIMy4D.js.gz +0 -0
  14. package/ui-dist/assets/app-presenter-provider-O2tUKKGf.js +109 -0
  15. package/ui-dist/assets/app-presenter-provider-O2tUKKGf.js.gz +0 -0
  16. package/ui-dist/assets/{appearance-settings-page-BfYznAK5.js → appearance-settings-page-D8cWniw-.js} +1 -1
  17. package/ui-dist/assets/appearance-settings-page-D8cWniw-.js.gz +0 -0
  18. package/ui-dist/assets/{book-open-DDW_3XpM.js → book-open-xqEj1OLE.js} +1 -1
  19. package/ui-dist/assets/{boxes-DwJeuK_h.js → boxes-D6uPnkGo.js} +1 -1
  20. package/ui-dist/assets/{card-IevY2nm-.js → card-CS8su2Zh.js} +1 -1
  21. package/ui-dist/assets/card-CS8su2Zh.js.gz +0 -0
  22. package/ui-dist/assets/{channels-list-page-DitnqbMR.js → channels-list-page-B_fYP1Pn.js} +1 -1
  23. package/ui-dist/assets/channels-list-page-B_fYP1Pn.js.gz +0 -0
  24. package/ui-dist/assets/{chevron-down-An7Km-t4.js → chevron-down-BL-yMYcX.js} +1 -1
  25. package/ui-dist/assets/{circle-alert-CDXqELuo.js → circle-alert-lSa3LRvS.js} +1 -1
  26. package/ui-dist/assets/{circle-dashed-CapXEpiV.js → circle-dashed-CU3yApvP.js} +1 -1
  27. package/ui-dist/assets/{client-B0krol7A.js → client-BtGBwLTs.js} +1 -1
  28. package/ui-dist/assets/{config-split-page-BtnkqWVp.js → config-split-page-6hHiiapl.js} +1 -1
  29. package/ui-dist/assets/config-split-page-6hHiiapl.js.gz +0 -0
  30. package/ui-dist/assets/{confirm-dialog-DFt4jpN7.js → confirm-dialog-ClT6iaj8.js} +1 -1
  31. package/ui-dist/assets/confirm-dialog-ClT6iaj8.js.gz +0 -0
  32. package/ui-dist/assets/{createLucideIcon-BTHK0Ot9.js → createLucideIcon-BNKf0_kc.js} +1 -1
  33. package/ui-dist/assets/{desktop-capabilities-page-CCf14WId.js → desktop-capabilities-page-CB5pniTx.js} +1 -1
  34. package/ui-dist/assets/desktop-capabilities-page-CB5pniTx.js.gz +0 -0
  35. package/ui-dist/assets/{desktop-update-config-DVoVgfFi.js → desktop-update-config-OuQV73gg.js} +1 -1
  36. package/ui-dist/assets/desktop-update-config-OuQV73gg.js.gz +0 -0
  37. package/ui-dist/assets/{dialog-BFN_1DBH.js → dialog-Xe73hpQz.js} +1 -1
  38. package/ui-dist/assets/dialog-Xe73hpQz.js.gz +0 -0
  39. package/ui-dist/assets/{dist-Bc9hOVNN.js → dist-BiIcnf9j.js} +1 -1
  40. package/ui-dist/assets/dist-BiIcnf9j.js.gz +0 -0
  41. package/ui-dist/assets/{dist-CEhIDAnr.js → dist-C5I0v8Qn.js} +1 -1
  42. package/ui-dist/assets/dist-C5I0v8Qn.js.gz +0 -0
  43. package/ui-dist/assets/{dist-hkVPP1th.js → dist-czPa8xFO.js} +1 -1
  44. package/ui-dist/assets/dist-czPa8xFO.js.gz +0 -0
  45. package/ui-dist/assets/doc-browser-BFkslEzY.js +1 -0
  46. package/ui-dist/assets/{doc-browser-BNUxmwD6.js → doc-browser-Cu58uiEg.js} +1 -1
  47. package/ui-dist/assets/doc-browser-Cu58uiEg.js.gz +0 -0
  48. package/ui-dist/assets/{doc-browser-context-C4yQrKrH.js → doc-browser-context-CekJxJFm.js} +1 -1
  49. package/ui-dist/assets/doc-browser-context-CekJxJFm.js.gz +0 -0
  50. package/ui-dist/assets/{ellipsis-BRI6ROeu.js → ellipsis-C5YXdOUx.js} +1 -1
  51. package/ui-dist/assets/{es2015-MOCbM0Eu.js → es2015-cuwbYI-l.js} +1 -1
  52. package/ui-dist/assets/es2015-cuwbYI-l.js.gz +0 -0
  53. package/ui-dist/assets/{extensions-DxUBMtHW.js → extensions-B5r-0jCq.js} +1 -1
  54. package/ui-dist/assets/extensions-B5r-0jCq.js.gz +0 -0
  55. package/ui-dist/assets/{eye-cnynUDGt.js → eye-C84inPcV.js} +1 -1
  56. package/ui-dist/assets/{form-actions-gQ0JEUwB.js → form-actions-AIdXOoCL.js} +1 -1
  57. package/ui-dist/assets/{i18n-B9yXA8KO.js → i18n-CPjq_hQX.js} +2 -2
  58. package/ui-dist/assets/i18n-CPjq_hQX.js.gz +0 -0
  59. package/ui-dist/assets/{i18n-provider-BYBJua91.js → i18n-provider-BYO9AhFy.js} +1 -1
  60. package/ui-dist/assets/keyboard-shortcuts-settings-page-1efEkGwq.js +1 -0
  61. package/ui-dist/assets/loader-circle-K1BDdHR5.js +1 -0
  62. package/ui-dist/assets/{login-page-CqrHhzaN.js → login-page-DBqkVTVD.js} +1 -1
  63. package/ui-dist/assets/login-page-DBqkVTVD.js.gz +0 -0
  64. package/ui-dist/assets/login-page-DjcRQLQe.js +1 -0
  65. package/ui-dist/assets/{logo-badge-Cr03YceJ.js → logo-badge-C-5-zim6.js} +1 -1
  66. package/ui-dist/assets/logo-badge-C-5-zim6.js.gz +0 -0
  67. package/ui-dist/assets/main-CLwCjK9U.css +1 -0
  68. package/ui-dist/assets/main-CLwCjK9U.css.gz +0 -0
  69. package/ui-dist/assets/main-CQ6GUYdX.js +2 -0
  70. package/ui-dist/assets/main-CQ6GUYdX.js.gz +0 -0
  71. package/ui-dist/assets/main-i18n-catalog.config-QB4DfJRJ.js +1 -0
  72. package/ui-dist/assets/main-i18n-catalog.config-QB4DfJRJ.js.gz +0 -0
  73. package/ui-dist/assets/{mcp-marketplace-page-CifiVgFD.js → mcp-marketplace-page-CWAxBNaS.js} +1 -1
  74. package/ui-dist/assets/mcp-marketplace-page-CWAxBNaS.js.gz +0 -0
  75. package/ui-dist/assets/mcp-marketplace-page-Ct090ceA.js +1 -0
  76. package/ui-dist/assets/{model-config-page-C6jVNbSj.js → model-config-page-DBcuZyRC.js} +1 -1
  77. package/ui-dist/assets/model-config-page-DBcuZyRC.js.gz +0 -0
  78. package/ui-dist/assets/{navigation-link-kbCLRSr_.js → navigation-link-BAQjgx2F.js} +1 -1
  79. package/ui-dist/assets/navigation-link-BAQjgx2F.js.gz +0 -0
  80. package/ui-dist/assets/panel-app-i18n-catalog.config-CQFujXqt.js +1 -0
  81. package/ui-dist/assets/panel-app-maumVhbl.js +1 -0
  82. package/ui-dist/assets/panel-app-maumVhbl.js.gz +0 -0
  83. package/ui-dist/assets/{panelStandalone-DMBnYyTw.js → panelStandalone-BGA1s7JG.js} +2 -2
  84. package/ui-dist/assets/panelStandalone-BGA1s7JG.js.gz +0 -0
  85. package/ui-dist/assets/plus-LA8-jpxP.js +1 -0
  86. package/ui-dist/assets/{popover-XVDgjxcl.js → popover-NkrFlWHp.js} +1 -1
  87. package/ui-dist/assets/popover-NkrFlWHp.js.gz +0 -0
  88. package/ui-dist/assets/{privacy-settings-page-BN27MBVA.js → privacy-settings-page-DVC-aq1v.js} +1 -1
  89. package/ui-dist/assets/privacy-settings-page-DVC-aq1v.js.gz +0 -0
  90. package/ui-dist/assets/projects-Cq0E3c7N.js +1 -0
  91. package/ui-dist/assets/projects-Cq0E3c7N.js.gz +0 -0
  92. package/ui-dist/assets/{provider-scoped-model-input-BGZMCThn.js → provider-scoped-model-input-BGdZMWWa.js} +1 -1
  93. package/ui-dist/assets/provider-scoped-model-input-BGdZMWWa.js.gz +0 -0
  94. package/ui-dist/assets/{providers-config-page-D5aBwbOD.js → providers-config-page-B-IhHl6x.js} +1 -1
  95. package/ui-dist/assets/providers-config-page-B-IhHl6x.js.gz +0 -0
  96. package/ui-dist/assets/{puzzle-D5Dhacmb.js → puzzle-D6gulz7u.js} +1 -1
  97. package/ui-dist/assets/{pwa-ClQK56Qe.js → pwa-C3kR9mdy.js} +1 -1
  98. package/ui-dist/assets/pwa-C3kR9mdy.js.gz +0 -0
  99. package/ui-dist/assets/{refresh-cw-Bw5BY7vp.js → refresh-cw-h9Xq3LY3.js} +1 -1
  100. package/ui-dist/assets/remote-Cnawibbg.js +1 -0
  101. package/ui-dist/assets/{rotate-cw-BksCLAeE.js → rotate-cw-B6xm41Wn.js} +1 -1
  102. package/ui-dist/assets/runtime-config-page-LmrB2q65.js +1 -0
  103. package/ui-dist/assets/runtime-config-page-LmrB2q65.js.gz +0 -0
  104. package/ui-dist/assets/{save-CVi8VWzb.js → save-fff_WpY2.js} +1 -1
  105. package/ui-dist/assets/{search-DN-f7IIC.js → search-CUe41wjm.js} +1 -1
  106. package/ui-dist/assets/{search-config-page-BmuZTVxs.js → search-config-page-BIXmv5FY.js} +1 -1
  107. package/ui-dist/assets/search-config-page-BIXmv5FY.js.gz +0 -0
  108. package/ui-dist/assets/{secrets-config-page-NPHpg9sb.js → secrets-config-page-DU3fadrq.js} +1 -1
  109. package/ui-dist/assets/secrets-config-page-DU3fadrq.js.gz +0 -0
  110. package/ui-dist/assets/security-config-9s0i0I4N.js +1 -0
  111. package/ui-dist/assets/{select-CmDTqk2C.js → select-CG5YWnwe.js} +1 -1
  112. package/ui-dist/assets/select-CG5YWnwe.js.gz +0 -0
  113. package/ui-dist/assets/{service-apps-panel-BYGJ9_pO.js → service-apps-panel-Bshf3Wmq.js} +1 -1
  114. package/ui-dist/assets/service-apps-panel-Bshf3Wmq.js.gz +0 -0
  115. package/ui-dist/assets/{settings-2-B62YtZon.js → settings-2-CE3ELQyk.js} +1 -1
  116. package/ui-dist/assets/skeleton-BL9h32W7.js +1 -0
  117. package/ui-dist/assets/{tabs-Bk_mG7ql.js → tabs-BuE0qKMh.js} +1 -1
  118. package/ui-dist/assets/tabs-BuE0qKMh.js.gz +0 -0
  119. package/ui-dist/assets/{tag-chip-DgqKlI5D.js → tag-chip-gAH1IOsZ.js} +1 -1
  120. package/ui-dist/assets/{theme-provider-CeBY2pyu.js → theme-provider-DE7m9jvf.js} +1 -1
  121. package/ui-dist/assets/theme-provider-DE7m9jvf.js.gz +0 -0
  122. package/ui-dist/assets/{tooltip-CgGbBdYf.js → tooltip-DYcuWhuP.js} +1 -1
  123. package/ui-dist/assets/tooltip-DYcuWhuP.js.gz +0 -0
  124. package/ui-dist/assets/{trash-2-CVOev8yc.js → trash-2-BPPYt2NV.js} +1 -1
  125. package/ui-dist/assets/{use-config-b2DN67gs.js → use-config-Cyiw06-j.js} +1 -1
  126. package/ui-dist/assets/use-config-Cyiw06-j.js.gz +0 -0
  127. package/ui-dist/assets/{use-desktop-capabilities-B3tLU1yl.js → use-desktop-capabilities-OKG96v4y.js} +1 -1
  128. package/ui-dist/assets/use-desktop-capabilities-OKG96v4y.js.gz +0 -0
  129. package/ui-dist/assets/{use-panel-app-scroll-restoration-BekzoX6z.js → use-panel-app-scroll-restoration-DsV1IJx-.js} +1 -1
  130. package/ui-dist/assets/use-panel-app-scroll-restoration-DsV1IJx-.js.gz +0 -0
  131. package/ui-dist/assets/{use-viewport-layout-CUA3jQsA.js → use-viewport-layout-BS18drMT.js} +1 -1
  132. package/ui-dist/assets/use-viewport-layout-BS18drMT.js.gz +0 -0
  133. package/ui-dist/assets/{utils-UBHTdG5Q.js → utils-CBZPzC_b.js} +1 -1
  134. package/ui-dist/assets/{utils-UBHTdG5Q.js.gz → utils-CBZPzC_b.js.gz} +0 -0
  135. package/ui-dist/assets/x-DdXOqLnX.js +1 -0
  136. package/ui-dist/index.html +50 -50
  137. package/ui-dist/index.html.gz +0 -0
  138. package/ui-dist/panel-standalone.html +15 -15
  139. package/ui-dist/panel-standalone.html.gz +0 -0
  140. package/dist/nextclaw-cli-app-C1L77sjJ.js.map +0 -1
  141. package/ui-dist/assets/account-panel-BxMlLXYH.js.gz +0 -0
  142. package/ui-dist/assets/api-Utt-xzrT.js.gz +0 -0
  143. package/ui-dist/assets/app-data-DYXDL6X2.js.gz +0 -0
  144. package/ui-dist/assets/app-presenter-provider-CLsFiXvV.js +0 -109
  145. package/ui-dist/assets/app-presenter-provider-CLsFiXvV.js.gz +0 -0
  146. package/ui-dist/assets/appearance-settings-page-BfYznAK5.js.gz +0 -0
  147. package/ui-dist/assets/card-IevY2nm-.js.gz +0 -0
  148. package/ui-dist/assets/channels-list-page-DitnqbMR.js.gz +0 -0
  149. package/ui-dist/assets/config-split-page-BtnkqWVp.js.gz +0 -0
  150. package/ui-dist/assets/confirm-dialog-DFt4jpN7.js.gz +0 -0
  151. package/ui-dist/assets/desktop-capabilities-page-CCf14WId.js.gz +0 -0
  152. package/ui-dist/assets/desktop-update-config-DVoVgfFi.js.gz +0 -0
  153. package/ui-dist/assets/dialog-BFN_1DBH.js.gz +0 -0
  154. package/ui-dist/assets/dist-Bc9hOVNN.js.gz +0 -0
  155. package/ui-dist/assets/dist-CEhIDAnr.js.gz +0 -0
  156. package/ui-dist/assets/dist-hkVPP1th.js.gz +0 -0
  157. package/ui-dist/assets/doc-browser-BNUxmwD6.js.gz +0 -0
  158. package/ui-dist/assets/doc-browser-context-C4yQrKrH.js.gz +0 -0
  159. package/ui-dist/assets/doc-browser-w4eGZXLu.js +0 -1
  160. package/ui-dist/assets/es2015-MOCbM0Eu.js.gz +0 -0
  161. package/ui-dist/assets/extensions-DxUBMtHW.js.gz +0 -0
  162. package/ui-dist/assets/i18n-B9yXA8KO.js.gz +0 -0
  163. package/ui-dist/assets/loader-circle-rWr5Yo0E.js +0 -1
  164. package/ui-dist/assets/login-page-CfMSkOsg.js +0 -1
  165. package/ui-dist/assets/login-page-CqrHhzaN.js.gz +0 -0
  166. package/ui-dist/assets/logo-badge-Cr03YceJ.js.gz +0 -0
  167. package/ui-dist/assets/main-8cVkMfgE.css +0 -1
  168. package/ui-dist/assets/main-8cVkMfgE.css.gz +0 -0
  169. package/ui-dist/assets/main-Bys58GxY.js +0 -2
  170. package/ui-dist/assets/main-Bys58GxY.js.gz +0 -0
  171. package/ui-dist/assets/main-i18n-catalog.config-BSq9yiUQ.js +0 -1
  172. package/ui-dist/assets/main-i18n-catalog.config-BSq9yiUQ.js.gz +0 -0
  173. package/ui-dist/assets/mcp-marketplace-page-CifiVgFD.js.gz +0 -0
  174. package/ui-dist/assets/mcp-marketplace-page-DX5VE3mU.js +0 -1
  175. package/ui-dist/assets/model-config-page-C6jVNbSj.js.gz +0 -0
  176. package/ui-dist/assets/navigation-link-kbCLRSr_.js.gz +0 -0
  177. package/ui-dist/assets/panel-app-BUUle0gP.js +0 -1
  178. package/ui-dist/assets/panel-app-BUUle0gP.js.gz +0 -0
  179. package/ui-dist/assets/panel-app-i18n-catalog.config-C2St67SP.js +0 -1
  180. package/ui-dist/assets/panelStandalone-DMBnYyTw.js.gz +0 -0
  181. package/ui-dist/assets/plus-BHnKwuPq.js +0 -1
  182. package/ui-dist/assets/popover-XVDgjxcl.js.gz +0 -0
  183. package/ui-dist/assets/privacy-settings-page-BN27MBVA.js.gz +0 -0
  184. package/ui-dist/assets/projects-DV3UuJMS.js +0 -1
  185. package/ui-dist/assets/projects-DV3UuJMS.js.gz +0 -0
  186. package/ui-dist/assets/provider-scoped-model-input-BGZMCThn.js.gz +0 -0
  187. package/ui-dist/assets/providers-config-page-D5aBwbOD.js.gz +0 -0
  188. package/ui-dist/assets/pwa-ClQK56Qe.js.gz +0 -0
  189. package/ui-dist/assets/remote-Bl005fzu.js +0 -1
  190. package/ui-dist/assets/runtime-config-page-CmktQcMW.js +0 -1
  191. package/ui-dist/assets/runtime-config-page-CmktQcMW.js.gz +0 -0
  192. package/ui-dist/assets/search-config-page-BmuZTVxs.js.gz +0 -0
  193. package/ui-dist/assets/secrets-config-page-NPHpg9sb.js.gz +0 -0
  194. package/ui-dist/assets/security-config-Djptuyf2.js +0 -1
  195. package/ui-dist/assets/select-CmDTqk2C.js.gz +0 -0
  196. package/ui-dist/assets/service-apps-panel-BYGJ9_pO.js.gz +0 -0
  197. package/ui-dist/assets/skeleton-Eh64l4T2.js +0 -1
  198. package/ui-dist/assets/tabs-Bk_mG7ql.js.gz +0 -0
  199. package/ui-dist/assets/theme-provider-CeBY2pyu.js.gz +0 -0
  200. package/ui-dist/assets/tooltip-CgGbBdYf.js.gz +0 -0
  201. package/ui-dist/assets/use-config-b2DN67gs.js.gz +0 -0
  202. package/ui-dist/assets/use-desktop-capabilities-B3tLU1yl.js.gz +0 -0
  203. package/ui-dist/assets/use-panel-app-scroll-restoration-BekzoX6z.js.gz +0 -0
  204. package/ui-dist/assets/use-viewport-layout-CUA3jQsA.js.gz +0 -0
  205. package/ui-dist/assets/x-C0iaOsRW.js +0 -1
@@ -5,7 +5,7 @@ import { NextclawDistributionService } from "@nextclaw/service";
5
5
  const distribution = createNextclawDistribution(import.meta.url);
6
6
  repairPackagedPortableRunnerPermissions(distribution);
7
7
  NextclawDistributionService.configureRuntime(distribution);
8
- const { nextclawCliProgram } = await import("../../nextclaw-cli-app-C1L77sjJ.js");
8
+ const { nextclawCliProgram } = await import("../../nextclaw-cli-app-CjtgVEdo.js");
9
9
  await nextclawCliProgram.parseAsync(process.argv);
10
10
  //#endregion
11
11
  export {};
@@ -3,7 +3,7 @@ import { APP_NAME, APP_TAGLINE, getConfigPath, getDataDir, getRunPath, loadConfi
3
3
  import { NextclawDistributionService, NextclawServiceRuntime, readLearningLoopRuntimeConfig } from "@nextclaw/service";
4
4
  import { constants, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
5
  import path, { join, resolve } from "node:path";
6
- import { Command, InvalidArgumentError } from "commander";
6
+ import { Argument, Command, InvalidArgumentError, Option } from "commander";
7
7
  import { createHash, randomBytes } from "node:crypto";
8
8
  import { execFile } from "node:child_process";
9
9
  import { tmpdir } from "node:os";
@@ -5918,7 +5918,6 @@ function registerProjectCommands(program, nextclaw) {
5918
5918
  const projects = program.command("projects").description("Manage projects");
5919
5919
  projects.command("list").description("List registered projects, including projects without sessions").option("--json", "Output JSON", false).action((options) => commands.list(options));
5920
5920
  projects.command("templates").description("List built-in project templates").option("--json", "Output JSON", false).action((options) => commands.templates(options));
5921
- projects.command("observe <root-path>").description("Observe a registered project without changing project data").option("--json", "Output JSON", false).action((rootPath, options) => commands.observe(rootPath, options));
5922
5921
  projects.command("create <name>").description("Create and register a project").option("--path <directory>", "Target directory").option("--template <template>", "Project template: empty or knowledge-base", "empty").option("--json", "Output JSON", false).action((name, options) => commands.create(name, options));
5923
5922
  projects.command("remove <project-id>").description("Remove a project from the project list without deleting files or sessions").requiredOption("--confirm <project-id>", "Confirm the exact project id").option("--json", "Output JSON", false).action((projectId, options) => commands.remove(projectId, options));
5924
5923
  registerProjectWorkCommands(projects, commands);
@@ -6128,6 +6127,302 @@ function registerExecCommand(program, nextclaw) {
6128
6127
  });
6129
6128
  }
6130
6129
  //#endregion
6130
+ //#region src/cli/app/utils/config-command-options.utils.ts
6131
+ function requireConfigApiClient() {
6132
+ const client = createLocalUiApiClient();
6133
+ if (!client) throw new Error("NextClaw is not running. Run nextclaw start before managing providers, models or search.");
6134
+ return client;
6135
+ }
6136
+ function printConfigResult(value) {
6137
+ process.stdout.write(`${JSON.stringify(value, (key, item) => {
6138
+ if (key === "extraHeaders" && item && typeof item === "object") return Object.fromEntries(Object.keys(item).map((name) => [name, "[redacted]"]));
6139
+ return item;
6140
+ }, 2)}\n`);
6141
+ }
6142
+ function parseConfigBoolean(value) {
6143
+ if (value === "true") return true;
6144
+ if (value === "false") return false;
6145
+ throw new InvalidArgumentError("Expected true or false.");
6146
+ }
6147
+ function collectConfigOption(value, previous = []) {
6148
+ return [...previous, value];
6149
+ }
6150
+ function parseConfigAssignment(value) {
6151
+ const separator = value.indexOf("=");
6152
+ if (separator < 1 || !value.slice(0, separator).trim() || separator === value.length - 1) throw new InvalidArgumentError("Expected name=value.");
6153
+ return [value.slice(0, separator).trim(), value.slice(separator + 1)];
6154
+ }
6155
+ function readConfigApiKey(options) {
6156
+ const { apiKeyEnv, clearApiKey } = options;
6157
+ if (apiKeyEnv && clearApiKey) throw new Error("Choose --api-key-env or --clear-api-key, not both.");
6158
+ if (clearApiKey) return null;
6159
+ if (!apiKeyEnv) return void 0;
6160
+ const value = process.env[apiKeyEnv];
6161
+ if (!value?.trim()) throw new Error(`Environment variable ${apiKeyEnv} is empty or missing.`);
6162
+ return value;
6163
+ }
6164
+ function requireConfigChange(patch) {
6165
+ if (Object.keys(patch).length === 0) throw new Error("No changes specified. See command --help for supported options.");
6166
+ }
6167
+ //#endregion
6168
+ //#region src/cli/app/controllers/config/provider-command.controller.ts
6169
+ const thinkingLevels = [
6170
+ "off",
6171
+ "minimal",
6172
+ "low",
6173
+ "medium",
6174
+ "high",
6175
+ "adaptive",
6176
+ "xhigh"
6177
+ ];
6178
+ var ProviderCommandController = class {
6179
+ constructor(createApi = requireConfigApiClient) {
6180
+ this.createApi = createApi;
6181
+ }
6182
+ path = (id) => `/api/providers/${encodeURIComponent(id)}`;
6183
+ showRequest = async (path, method = "GET", body) => {
6184
+ printConfigResult(await this.createApi().request({
6185
+ path,
6186
+ method,
6187
+ body
6188
+ }));
6189
+ };
6190
+ list = async () => this.showRequest("/api/providers");
6191
+ templates = async () => this.showRequest("/api/provider-templates");
6192
+ show = async (id) => {
6193
+ const result = await this.createApi().request({ path: "/api/providers" });
6194
+ if (!Object.hasOwn(result.providers, id)) throw new Error(`Unknown provider: ${id}`);
6195
+ printConfigResult(result.providers[id]);
6196
+ };
6197
+ add = async (id, options) => {
6198
+ if (!id.trim() || id.includes("/")) throw new Error("Provider id must be non-empty and cannot contain '/'.");
6199
+ const patch = this.providerPatch(options);
6200
+ await this.validateTemplate(patch.providerType);
6201
+ await this.showRequest("/api/providers", "POST", {
6202
+ providerId: id,
6203
+ ...patch
6204
+ });
6205
+ };
6206
+ update = async (id, options) => {
6207
+ const patch = this.providerPatch(options);
6208
+ requireConfigChange(patch);
6209
+ await this.validateTemplate(patch.providerType);
6210
+ await this.showRequest(this.path(id), "PUT", patch);
6211
+ };
6212
+ remove = async (id) => this.showRequest(this.path(id), "DELETE");
6213
+ enabled = async (id, enabled) => this.showRequest(this.path(id), "PUT", { enabled });
6214
+ models = async (id) => {
6215
+ const result = await this.createApi().request({ path: "/api/providers" });
6216
+ if (!Object.hasOwn(result.providers, id)) throw new Error(`Unknown provider: ${id}`);
6217
+ const provider = result.providers[id];
6218
+ printConfigResult({
6219
+ providerId: id,
6220
+ models: provider.models ?? [],
6221
+ modelConfig: provider.modelConfig ?? {}
6222
+ });
6223
+ };
6224
+ discover = async (id) => this.showRequest(`${this.path(id)}/models/discover`, "POST", {});
6225
+ setModels = async (id, models) => this.showRequest(this.path(id), "PUT", { models });
6226
+ configureModels = async (id, options) => {
6227
+ const { vision = [], thinking = [], thinkingDefault = [], clear } = options;
6228
+ const entries = [
6229
+ ...vision,
6230
+ ...thinking,
6231
+ ...thinkingDefault
6232
+ ];
6233
+ if (clear && entries.length) throw new Error("--clear cannot be combined with model capability options.");
6234
+ if (!clear && !entries.length) throw new Error("Specify model capabilities or --clear.");
6235
+ const modelConfig = Object.create(null);
6236
+ for (const entry of vision) {
6237
+ const [model, value] = parseConfigAssignment(entry);
6238
+ (modelConfig[model] ??= {}).vision = parseConfigBoolean(value);
6239
+ }
6240
+ for (const entry of thinking) {
6241
+ const [model, value] = parseConfigAssignment(entry);
6242
+ (modelConfig[model] ??= {}).thinking = { supported: value.split(",").map(parseThinkingLevel) };
6243
+ }
6244
+ for (const entry of thinkingDefault) {
6245
+ const [model, value] = parseConfigAssignment(entry);
6246
+ const config = modelConfig[model] ??= {};
6247
+ const level = parseThinkingLevel(value);
6248
+ if (!config.thinking?.supported?.includes(level)) throw new Error(`Default thinking level for ${model} must be included in --thinking for that model.`);
6249
+ config.thinking.default = level;
6250
+ }
6251
+ await this.showRequest(this.path(id), "PUT", { modelConfig });
6252
+ };
6253
+ test = async (id, options) => {
6254
+ const result = await this.createApi().request({
6255
+ path: `${this.path(id)}/test`,
6256
+ method: "POST",
6257
+ body: { model: options.model }
6258
+ });
6259
+ printConfigResult(result);
6260
+ if (!result.success) process.exitCode = 1;
6261
+ };
6262
+ startAuth = async (id, options) => this.showRequest(`${this.path(id)}/auth/start`, "POST", { methodId: options.method });
6263
+ pollAuth = async (id, sessionId) => {
6264
+ const result = await this.createApi().request({
6265
+ path: `${this.path(id)}/auth/poll`,
6266
+ method: "POST",
6267
+ body: { sessionId }
6268
+ });
6269
+ printConfigResult(result);
6270
+ if ([
6271
+ "denied",
6272
+ "expired",
6273
+ "error"
6274
+ ].includes(result.status)) process.exitCode = 1;
6275
+ };
6276
+ importAuth = async (id) => this.showRequest(`${this.path(id)}/auth/import-cli`, "POST", {});
6277
+ validateTemplate = async (type) => {
6278
+ if (type == null) return;
6279
+ const { providerTemplates } = await this.createApi().request({ path: "/api/provider-templates" });
6280
+ if (!providerTemplates.some((template) => template.id === type)) throw new Error(`Unknown provider type: ${type}. Use providers templates or --type custom.`);
6281
+ };
6282
+ providerPatch = (options) => {
6283
+ const { type, name, apiBase, wireApi, header, clearHeaders } = options;
6284
+ const patch = {};
6285
+ if (type !== void 0) patch.providerType = type === "custom" ? null : type;
6286
+ if (name !== void 0) patch.displayName = name;
6287
+ if (apiBase !== void 0) patch.apiBase = apiBase || null;
6288
+ if (wireApi !== void 0) patch.wireApi = wireApi;
6289
+ const key = readConfigApiKey(options);
6290
+ if (key !== void 0) patch.apiKey = key;
6291
+ if (header && clearHeaders) throw new Error("Choose --header or --clear-headers, not both.");
6292
+ if (header) patch.extraHeaders = Object.fromEntries(header.map(parseConfigAssignment));
6293
+ if (clearHeaders) patch.extraHeaders = null;
6294
+ return patch;
6295
+ };
6296
+ };
6297
+ function parseThinkingLevel(value) {
6298
+ const level = thinkingLevels.find((item) => item === value);
6299
+ if (!level) throw new Error(`Unknown thinking level: ${value}. Choose ${thinkingLevels.join(", ")}.`);
6300
+ return level;
6301
+ }
6302
+ //#endregion
6303
+ //#region src/cli/app/commands/provider-command-registration.utils.ts
6304
+ function registerProviderCommands(program, controller = new ProviderCommandController()) {
6305
+ const providers = program.command("providers").description("Manage model providers through the running NextClaw host");
6306
+ const output = (command) => command.option("--json", "Output JSON (also the default)");
6307
+ output(providers.command("list").description("List providers without exposing credentials")).action(controller.list);
6308
+ output(providers.command("templates").description("List provider templates and authorization methods")).action(controller.templates);
6309
+ output(providers.command("show <provider-id>").description("Show one provider")).action(controller.show);
6310
+ output(providerOptions(providers.command("add <provider-id>").description("Create a provider instance"))).action(controller.add);
6311
+ output(providerOptions(providers.command("update <provider-id>").description("Update specified provider settings"))).action(controller.update);
6312
+ output(providers.command("remove <provider-id>").description("Remove a provider and its secret references")).action(controller.remove);
6313
+ output(providers.command("enable <provider-id>").description("Enable a provider")).action(async (id) => controller.enabled(id, true));
6314
+ output(providers.command("disable <provider-id>").description("Disable a provider")).action(async (id) => controller.enabled(id, false));
6315
+ output(providers.command("test <provider-id>").description("Test a provider connection; failure exits non-zero").option("--model <model>", "Model to test")).action(controller.test);
6316
+ const models = providers.command("models").description("Manage a provider's models");
6317
+ output(models.command("list <provider-id>").description("Show configured models and capability overrides")).action(controller.models);
6318
+ output(models.command("discover <provider-id>").description("Discover available models without changing configuration")).action(controller.discover);
6319
+ output(models.command("set <provider-id> [models...]").description("Replace the configured model list; omit models to clear it")).action(controller.setModels);
6320
+ output(models.command("configure <provider-id>").description("Replace all model capability overrides (model list is unchanged)").option("--vision <model=true|false>", "Vision capability (repeatable)", collectConfigOption).option("--thinking <model=levels>", "Comma-separated supported thinking levels (repeatable)", collectConfigOption).option("--thinking-default <model=level>", "Default thinking level (repeatable)", collectConfigOption).option("--clear", "Clear all model capability overrides")).action(controller.configureModels);
6321
+ const auth = providers.command("auth").description("Authorize a provider");
6322
+ output(auth.command("start <provider-id>").description("Start authorization; returns verification URI, user code and session id").option("--method <id>", "Authorization method from providers templates")).action(controller.startAuth);
6323
+ output(auth.command("poll <provider-id> <session-id>").description("Poll once; respect the returned nextPollMs before polling again")).action(controller.pollAuth);
6324
+ output(auth.command("import <provider-id>").description("Import credentials from a supported provider CLI")).action(controller.importAuth);
6325
+ }
6326
+ function providerOptions(command) {
6327
+ return command.option("--type <type>", "Template type from providers templates, or custom").option("--name <name>", "Display name").option("--api-base <url>", "API base URL; empty string resets it").option("--api-key-env <name>", "Read the API key from an environment variable").option("--clear-api-key", "Clear the stored API key and its secret reference").addOption(new Option("--wire-api <protocol>", "API protocol").choices([
6328
+ "auto",
6329
+ "chat",
6330
+ "responses"
6331
+ ])).option("--header <name=value>", "Replace custom headers with the supplied entries (repeatable)", collectConfigOption).option("--clear-headers", "Clear custom headers");
6332
+ }
6333
+ //#endregion
6334
+ //#region src/cli/app/controllers/config/model-search-command.controller.ts
6335
+ var ModelSearchCommandController = class {
6336
+ constructor(createApi = requireConfigApiClient) {
6337
+ this.createApi = createApi;
6338
+ }
6339
+ listModels = async () => {
6340
+ printConfigResult(await this.createApi().request({ path: "/api/provider-model-catalog" }));
6341
+ };
6342
+ showModel = async () => {
6343
+ printConfigResult({ model: (await this.createApi().request({ path: "/api/config" })).agents.defaults.model });
6344
+ };
6345
+ setModel = async (model) => {
6346
+ if (!model.trim()) throw new Error("Model must not be empty.");
6347
+ printConfigResult(await this.createApi().request({
6348
+ path: "/api/config/model",
6349
+ method: "PUT",
6350
+ body: { model }
6351
+ }));
6352
+ };
6353
+ showSearch = async () => {
6354
+ printConfigResult((await this.createApi().request({ path: "/api/config" })).search);
6355
+ };
6356
+ configureSearch = async (options) => {
6357
+ const { provider, enabledProvider, clearEnabledProviders, maxResults } = options;
6358
+ const patch = {};
6359
+ if (provider !== void 0) patch.provider = provider;
6360
+ if (enabledProvider !== void 0) patch.enabledProviders = enabledProvider;
6361
+ if (clearEnabledProviders) {
6362
+ if (enabledProvider) throw new Error("Choose --enabled-provider or --clear-enabled-providers, not both.");
6363
+ patch.enabledProviders = [];
6364
+ }
6365
+ if (maxResults !== void 0) patch.defaults = { maxResults };
6366
+ await this.updateSearch(patch);
6367
+ };
6368
+ configureSearchProvider = async (provider, options) => {
6369
+ const patch = {};
6370
+ const apiKey = readConfigApiKey(options);
6371
+ if (apiKey !== void 0) patch.apiKey = apiKey;
6372
+ if (options.baseUrl !== void 0) patch.baseUrl = options.baseUrl || null;
6373
+ const bochaFields = [
6374
+ "docsUrl",
6375
+ "summary",
6376
+ "freshness"
6377
+ ];
6378
+ const tavilyFields = ["searchDepth", "includeAnswer"];
6379
+ for (const field of bochaFields) {
6380
+ if (options[field] === void 0) continue;
6381
+ if (provider !== "bocha") throw new Error(`${field} is only supported by bocha.`);
6382
+ patch[field] = options[field];
6383
+ }
6384
+ for (const field of tavilyFields) {
6385
+ if (options[field] === void 0) continue;
6386
+ if (provider !== "tavily") throw new Error(`${field} is only supported by tavily.`);
6387
+ patch[field] = options[field];
6388
+ }
6389
+ requireConfigChange(patch);
6390
+ await this.updateSearch({ providers: { [provider]: patch } });
6391
+ };
6392
+ updateSearch = async (patch) => {
6393
+ requireConfigChange(patch);
6394
+ printConfigResult(await this.createApi().request({
6395
+ path: "/api/config/search",
6396
+ method: "PUT",
6397
+ body: patch
6398
+ }));
6399
+ };
6400
+ };
6401
+ //#endregion
6402
+ //#region src/cli/app/commands/model-search-command-registration.utils.ts
6403
+ const searchProviders = [
6404
+ "bocha",
6405
+ "tavily",
6406
+ "brave",
6407
+ "exa"
6408
+ ];
6409
+ function registerModelSearchCommands(program, controller = new ModelSearchCommandController()) {
6410
+ const output = (command) => command.option("--json", "Output JSON (also the default)");
6411
+ const models = program.command("models").description("Inspect available models and manage the default model");
6412
+ output(models.command("list").description("Show the runtime model catalog and discovery status")).action(controller.listModels);
6413
+ output(models.command("show").description("Show the default model")).action(controller.showModel);
6414
+ output(models.command("set <model>").description("Set the default model using a provider-scoped model id")).action(controller.setModel);
6415
+ const search = program.command("search").description("Manage web search settings through the running host");
6416
+ output(search.command("show").description("Show search settings without exposing credentials")).action(controller.showSearch);
6417
+ output(search.command("configure").description("Configure default search provider, enabled providers and result count").addOption(new Option("--provider <provider>", "Default search provider").choices(searchProviders)).addOption(new Option("--enabled-provider <providers...>", "Replace enabled search providers").choices(searchProviders)).option("--clear-enabled-providers", "Disable all search providers").option("--max-results <count>", "Default result count (1-50)", parseResultCount)).action(controller.configureSearch);
6418
+ output(search.command("provider").description("Update one search provider's credentials and supported options").addArgument(new Argument("<provider>").choices(searchProviders)).option("--api-key-env <name>", "Read the API key from an environment variable").option("--clear-api-key", "Clear the stored API key and its secret reference").option("--base-url <url>", "Search API base URL; empty string resets it").option("--docs-url <url>", "Bocha documentation URL").option("--summary <boolean>", "Bocha summary", parseConfigBoolean).option("--freshness <value>", "Bocha freshness").addOption(new Option("--search-depth <depth>", "Tavily search depth").choices(["basic", "advanced"])).option("--include-answer <boolean>", "Tavily synthesized answer", parseConfigBoolean)).action(controller.configureSearchProvider);
6419
+ }
6420
+ function parseResultCount(value) {
6421
+ const count = Number(value);
6422
+ if (!Number.isInteger(count) || count < 1 || count > 50) throw new InvalidArgumentError("Expected an integer from 1 to 50.");
6423
+ return count;
6424
+ }
6425
+ //#endregion
6131
6426
  //#region src/cli/app/nextclaw-cli-app.ts
6132
6427
  const LOGO = "🤖";
6133
6428
  const program = new Command();
@@ -6163,6 +6458,8 @@ registerSessionCommands(program, runtime);
6163
6458
  registerExecCommand(program, runtime);
6164
6459
  registerAppCommands(program, { portableServiceRunnerPath: NextclawDistributionService.get().portableServiceRunnerPath });
6165
6460
  const config = program.command("config").description("Manage config values");
6461
+ registerProviderCommands(program);
6462
+ registerModelSearchCommands(program);
6166
6463
  config.command("get <path>").description("Get a config value by dot path").option("--json", "Output JSON", false).action((path, opts) => runtime.commands.config.get(path, opts));
6167
6464
  config.command("set <path> <value>").description("Set a config value by dot path").option("--json", "Parse value as JSON", false).action((path, value, opts) => runtime.commands.config.set(path, value, opts));
6168
6465
  config.command("unset <path>").description("Remove a config value by dot path").action((path) => runtime.commands.config.unset(path));
@@ -6201,4 +6498,4 @@ program.command("usage").description("Show observed LLM usage snapshots, history
6201
6498
  //#endregion
6202
6499
  export { program as nextclawCliProgram };
6203
6500
 
6204
- //# sourceMappingURL=nextclaw-cli-app-C1L77sjJ.js.map
6501
+ //# sourceMappingURL=nextclaw-cli-app-CjtgVEdo.js.map