@aigne/cli 1.60.0-beta → 1.74.0-beta

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 (360) hide show
  1. package/README.md +12 -12
  2. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  3. package/dist/bunwrapper.cjs +22 -0
  4. package/dist/bunwrapper.d.cts +1 -0
  5. package/dist/bunwrapper.d.mts +1 -0
  6. package/dist/bunwrapper.mjs +23 -0
  7. package/dist/bunwrapper.mjs.map +1 -0
  8. package/dist/cli.cjs +42 -0
  9. package/dist/cli.d.cts +9 -0
  10. package/dist/cli.d.cts.map +1 -0
  11. package/dist/cli.d.mts +10 -0
  12. package/dist/cli.d.mts.map +1 -0
  13. package/dist/cli.mjs +41 -0
  14. package/dist/cli.mjs.map +1 -0
  15. package/dist/commands/aigne.cjs +23 -0
  16. package/dist/commands/aigne.mjs +22 -0
  17. package/dist/commands/aigne.mjs.map +1 -0
  18. package/dist/commands/app/agent.cjs +117 -0
  19. package/dist/commands/app/agent.mjs +113 -0
  20. package/dist/commands/app/agent.mjs.map +1 -0
  21. package/dist/commands/app/app.cjs +92 -0
  22. package/dist/commands/app/app.mjs +90 -0
  23. package/dist/commands/app/app.mjs.map +1 -0
  24. package/dist/commands/app/cli.cjs +6 -0
  25. package/dist/commands/app/cli.d.cts +1 -0
  26. package/dist/commands/app/cli.d.mts +1 -0
  27. package/dist/commands/app/cli.mjs +8 -0
  28. package/dist/commands/app/cli.mjs.map +1 -0
  29. package/dist/commands/app/upgrade.cjs +243 -0
  30. package/dist/commands/app/upgrade.mjs +240 -0
  31. package/dist/commands/app/upgrade.mjs.map +1 -0
  32. package/dist/commands/app.cjs +53 -0
  33. package/dist/commands/app.mjs +53 -0
  34. package/dist/commands/app.mjs.map +1 -0
  35. package/dist/commands/create.cjs +66 -0
  36. package/dist/commands/create.mjs +65 -0
  37. package/dist/commands/create.mjs.map +1 -0
  38. package/dist/commands/deploy.cjs +237 -0
  39. package/dist/commands/deploy.mjs +237 -0
  40. package/dist/commands/deploy.mjs.map +1 -0
  41. package/dist/commands/eval.cjs +88 -0
  42. package/dist/commands/eval.mjs +88 -0
  43. package/dist/commands/eval.mjs.map +1 -0
  44. package/dist/commands/hub.cjs +297 -0
  45. package/dist/commands/hub.mjs +294 -0
  46. package/dist/commands/hub.mjs.map +1 -0
  47. package/dist/commands/observe.cjs +49 -0
  48. package/dist/commands/observe.mjs +46 -0
  49. package/dist/commands/observe.mjs.map +1 -0
  50. package/dist/commands/run-skill.cjs +84 -0
  51. package/dist/commands/run-skill.mjs +81 -0
  52. package/dist/commands/run-skill.mjs.map +1 -0
  53. package/dist/commands/run.cjs +172 -0
  54. package/dist/commands/run.mjs +171 -0
  55. package/dist/commands/run.mjs.map +1 -0
  56. package/dist/commands/serve-mcp.cjs +68 -0
  57. package/dist/commands/serve-mcp.mjs +67 -0
  58. package/dist/commands/serve-mcp.mjs.map +1 -0
  59. package/dist/commands/test.cjs +40 -0
  60. package/dist/commands/test.mjs +39 -0
  61. package/dist/commands/test.mjs.map +1 -0
  62. package/dist/constants.cjs +28 -0
  63. package/dist/constants.d.cts +9 -0
  64. package/dist/constants.d.cts.map +1 -0
  65. package/dist/constants.d.mts +9 -0
  66. package/dist/constants.d.mts.map +1 -0
  67. package/dist/constants.mjs +24 -0
  68. package/dist/constants.mjs.map +1 -0
  69. package/dist/global.d.cjs +0 -0
  70. package/dist/global.d.cts +6 -0
  71. package/dist/global.d.cts.map +1 -0
  72. package/dist/global.d.mts +6 -0
  73. package/dist/global.d.mts.map +1 -0
  74. package/dist/index.cjs +0 -0
  75. package/dist/index.d.cts +2 -0
  76. package/dist/index.d.mts +2 -0
  77. package/dist/index.mjs +1 -0
  78. package/dist/tracer/terminal.cjs +336 -0
  79. package/dist/tracer/terminal.mjs +332 -0
  80. package/dist/tracer/terminal.mjs.map +1 -0
  81. package/dist/type.cjs +0 -0
  82. package/dist/type.d.cts +10 -0
  83. package/dist/type.d.cts.map +1 -0
  84. package/dist/type.d.mts +10 -0
  85. package/dist/type.d.mts.map +1 -0
  86. package/dist/type.mjs +1 -0
  87. package/dist/ui/utils/terminal-input.cjs +145 -0
  88. package/dist/ui/utils/terminal-input.mjs +144 -0
  89. package/dist/ui/utils/terminal-input.mjs.map +1 -0
  90. package/dist/ui/utils/text-buffer.cjs +865 -0
  91. package/dist/ui/utils/text-buffer.mjs +865 -0
  92. package/dist/ui/utils/text-buffer.mjs.map +1 -0
  93. package/dist/ui/utils/text-utils.cjs +85 -0
  94. package/dist/ui/utils/text-utils.mjs +78 -0
  95. package/dist/ui/utils/text-utils.mjs.map +1 -0
  96. package/dist/utils/agent-v1.cjs +180 -0
  97. package/dist/utils/agent-v1.d.cts +138 -0
  98. package/dist/utils/agent-v1.d.cts.map +1 -0
  99. package/dist/utils/agent-v1.d.mts +138 -0
  100. package/dist/utils/agent-v1.d.mts.map +1 -0
  101. package/dist/utils/agent-v1.mjs +179 -0
  102. package/dist/utils/agent-v1.mjs.map +1 -0
  103. package/dist/utils/aigne-hub/constants.cjs +22 -0
  104. package/dist/utils/aigne-hub/constants.mjs +18 -0
  105. package/dist/utils/aigne-hub/constants.mjs.map +1 -0
  106. package/dist/utils/aigne-hub/credential.cjs +179 -0
  107. package/dist/utils/aigne-hub/credential.mjs +175 -0
  108. package/dist/utils/aigne-hub/credential.mjs.map +1 -0
  109. package/dist/utils/aigne-hub/crypto.cjs +41 -0
  110. package/dist/utils/aigne-hub/crypto.mjs +33 -0
  111. package/dist/utils/aigne-hub/crypto.mjs.map +1 -0
  112. package/dist/utils/aigne-hub/model.cjs +112 -0
  113. package/dist/utils/aigne-hub/model.d.cts +19 -0
  114. package/dist/utils/aigne-hub/model.d.cts.map +1 -0
  115. package/dist/utils/aigne-hub/model.d.mts +19 -0
  116. package/dist/utils/aigne-hub/model.d.mts.map +1 -0
  117. package/dist/utils/aigne-hub/model.mjs +106 -0
  118. package/dist/utils/aigne-hub/model.mjs.map +1 -0
  119. package/dist/utils/aigne-hub/store/file.cjs +64 -0
  120. package/dist/utils/aigne-hub/store/file.mjs +64 -0
  121. package/dist/utils/aigne-hub/store/file.mjs.map +1 -0
  122. package/dist/utils/aigne-hub/store/index.cjs +37 -0
  123. package/dist/utils/aigne-hub/store/index.mjs +37 -0
  124. package/dist/utils/aigne-hub/store/index.mjs.map +1 -0
  125. package/dist/utils/aigne-hub/store/keytar.cjs +61 -0
  126. package/dist/utils/aigne-hub/store/keytar.mjs +61 -0
  127. package/dist/utils/aigne-hub/store/keytar.mjs.map +1 -0
  128. package/dist/utils/aigne-hub/store/migrate.cjs +46 -0
  129. package/dist/utils/aigne-hub/store/migrate.mjs +45 -0
  130. package/dist/utils/aigne-hub/store/migrate.mjs.map +1 -0
  131. package/dist/utils/aigne-hub/type.d.cts +18 -0
  132. package/dist/utils/aigne-hub/type.d.cts.map +1 -0
  133. package/dist/utils/aigne-hub/type.d.mts +18 -0
  134. package/dist/utils/aigne-hub/type.d.mts.map +1 -0
  135. package/dist/utils/aigne-hub-user.cjs +11 -0
  136. package/dist/utils/aigne-hub-user.d.cts +23 -0
  137. package/dist/utils/aigne-hub-user.d.cts.map +1 -0
  138. package/dist/utils/aigne-hub-user.d.mts +23 -0
  139. package/dist/utils/aigne-hub-user.d.mts.map +1 -0
  140. package/dist/utils/aigne-hub-user.mjs +11 -0
  141. package/dist/utils/aigne-hub-user.mjs.map +1 -0
  142. package/dist/utils/ascii-logo.cjs +30 -0
  143. package/dist/utils/ascii-logo.d.cts +5 -0
  144. package/dist/utils/ascii-logo.d.cts.map +1 -0
  145. package/dist/utils/ascii-logo.d.mts +5 -0
  146. package/dist/utils/ascii-logo.d.mts.map +1 -0
  147. package/dist/utils/{ascii-logo.js → ascii-logo.mjs} +13 -3
  148. package/dist/utils/ascii-logo.mjs.map +1 -0
  149. package/dist/utils/download.cjs +25 -0
  150. package/dist/utils/download.d.cts +7 -0
  151. package/dist/utils/download.d.cts.map +1 -0
  152. package/dist/utils/download.d.mts +7 -0
  153. package/dist/utils/download.d.mts.map +1 -0
  154. package/dist/utils/download.mjs +25 -0
  155. package/dist/utils/download.mjs.map +1 -0
  156. package/dist/utils/evaluation/core.cjs +84 -0
  157. package/dist/utils/evaluation/core.mjs +84 -0
  158. package/dist/utils/evaluation/core.mjs.map +1 -0
  159. package/dist/utils/evaluation/dataset.cjs +47 -0
  160. package/dist/utils/evaluation/dataset.mjs +46 -0
  161. package/dist/utils/evaluation/dataset.mjs.map +1 -0
  162. package/dist/utils/evaluation/evaluator.cjs +109 -0
  163. package/dist/utils/evaluation/{evaluator.js → evaluator.mjs} +48 -45
  164. package/dist/utils/evaluation/evaluator.mjs.map +1 -0
  165. package/dist/utils/evaluation/reporter.cjs +225 -0
  166. package/dist/utils/evaluation/reporter.mjs +220 -0
  167. package/dist/utils/evaluation/reporter.mjs.map +1 -0
  168. package/dist/utils/evaluation/runner.cjs +85 -0
  169. package/dist/utils/evaluation/runner.mjs +85 -0
  170. package/dist/utils/evaluation/runner.mjs.map +1 -0
  171. package/dist/utils/get-url-origin.cjs +12 -0
  172. package/dist/utils/get-url-origin.d.cts +5 -0
  173. package/dist/utils/get-url-origin.d.cts.map +1 -0
  174. package/dist/utils/get-url-origin.d.mts +5 -0
  175. package/dist/utils/get-url-origin.d.mts.map +1 -0
  176. package/dist/utils/get-url-origin.mjs +12 -0
  177. package/dist/utils/get-url-origin.mjs.map +1 -0
  178. package/dist/utils/inquirer/checkbox.cjs +265 -0
  179. package/dist/utils/inquirer/checkbox.mjs +262 -0
  180. package/dist/utils/inquirer/checkbox.mjs.map +1 -0
  181. package/dist/utils/listr.cjs +226 -0
  182. package/dist/utils/listr.d.cts +71 -0
  183. package/dist/utils/listr.d.cts.map +1 -0
  184. package/dist/utils/listr.d.mts +71 -0
  185. package/dist/utils/listr.d.mts.map +1 -0
  186. package/dist/utils/listr.mjs +222 -0
  187. package/dist/utils/listr.mjs.map +1 -0
  188. package/dist/utils/load-aigne.cjs +77 -0
  189. package/dist/utils/load-aigne.d.cts +29 -0
  190. package/dist/utils/load-aigne.d.cts.map +1 -0
  191. package/dist/utils/load-aigne.d.mts +29 -0
  192. package/dist/utils/load-aigne.d.mts.map +1 -0
  193. package/dist/utils/load-aigne.mjs +74 -0
  194. package/dist/utils/load-aigne.mjs.map +1 -0
  195. package/dist/utils/run-chat-loop.cjs +90 -0
  196. package/dist/utils/run-chat-loop.d.cts +20 -0
  197. package/dist/utils/run-chat-loop.d.cts.map +1 -0
  198. package/dist/utils/run-chat-loop.d.mts +20 -0
  199. package/dist/utils/run-chat-loop.d.mts.map +1 -0
  200. package/dist/utils/run-chat-loop.mjs +89 -0
  201. package/dist/utils/run-chat-loop.mjs.map +1 -0
  202. package/dist/utils/run-with-aigne.cjs +131 -0
  203. package/dist/utils/run-with-aigne.d.cts +46 -0
  204. package/dist/utils/run-with-aigne.d.cts.map +1 -0
  205. package/dist/utils/run-with-aigne.d.mts +46 -0
  206. package/dist/utils/run-with-aigne.d.mts.map +1 -0
  207. package/dist/utils/run-with-aigne.mjs +126 -0
  208. package/dist/utils/run-with-aigne.mjs.map +1 -0
  209. package/dist/utils/serve-mcp.cjs +91 -0
  210. package/dist/utils/serve-mcp.d.cts +20 -0
  211. package/dist/utils/serve-mcp.d.cts.map +1 -0
  212. package/dist/utils/serve-mcp.d.mts +20 -0
  213. package/dist/utils/serve-mcp.d.mts.map +1 -0
  214. package/dist/utils/serve-mcp.mjs +89 -0
  215. package/dist/utils/serve-mcp.mjs.map +1 -0
  216. package/dist/utils/spinner.cjs +19 -0
  217. package/dist/utils/spinner.d.cts +5 -0
  218. package/dist/utils/spinner.d.cts.map +1 -0
  219. package/dist/utils/spinner.d.mts +5 -0
  220. package/dist/utils/spinner.d.mts.map +1 -0
  221. package/dist/utils/spinner.mjs +19 -0
  222. package/dist/utils/spinner.mjs.map +1 -0
  223. package/dist/utils/string-utils.cjs +11 -0
  224. package/dist/utils/string-utils.d.cts +5 -0
  225. package/dist/utils/string-utils.d.cts.map +1 -0
  226. package/dist/utils/string-utils.d.mts +5 -0
  227. package/dist/utils/string-utils.d.mts.map +1 -0
  228. package/dist/utils/string-utils.mjs +10 -0
  229. package/dist/utils/string-utils.mjs.map +1 -0
  230. package/dist/utils/time.cjs +14 -0
  231. package/dist/utils/time.d.cts +5 -0
  232. package/dist/utils/time.d.cts.map +1 -0
  233. package/dist/utils/time.d.mts +5 -0
  234. package/dist/utils/time.d.mts.map +1 -0
  235. package/dist/utils/time.mjs +14 -0
  236. package/dist/utils/time.mjs.map +1 -0
  237. package/dist/utils/url.cjs +8 -0
  238. package/dist/utils/url.d.cts +5 -0
  239. package/dist/utils/url.d.cts.map +1 -0
  240. package/dist/utils/url.d.mts +5 -0
  241. package/dist/utils/url.d.mts.map +1 -0
  242. package/dist/utils/url.mjs +8 -0
  243. package/dist/utils/url.mjs.map +1 -0
  244. package/dist/utils/yargs.cjs +191 -0
  245. package/dist/utils/yargs.d.cts +96 -0
  246. package/dist/utils/yargs.d.cts.map +1 -0
  247. package/dist/utils/yargs.d.mts +96 -0
  248. package/dist/utils/yargs.d.mts.map +1 -0
  249. package/dist/utils/yargs.mjs +186 -0
  250. package/dist/utils/yargs.mjs.map +1 -0
  251. package/package.json +122 -45
  252. package/CHANGELOG.md +0 -5019
  253. package/dist/bunwrapper.d.ts +0 -2
  254. package/dist/bunwrapper.js +0 -18
  255. package/dist/cli.d.ts +0 -7
  256. package/dist/cli.js +0 -42
  257. package/dist/commands/aigne.d.ts +0 -4
  258. package/dist/commands/aigne.js +0 -35
  259. package/dist/commands/app/agent.d.ts +0 -26
  260. package/dist/commands/app/agent.js +0 -122
  261. package/dist/commands/app/app.d.ts +0 -7
  262. package/dist/commands/app/app.js +0 -92
  263. package/dist/commands/app/cli.d.ts +0 -1
  264. package/dist/commands/app/cli.js +0 -2
  265. package/dist/commands/app/upgrade.d.ts +0 -54
  266. package/dist/commands/app/upgrade.js +0 -236
  267. package/dist/commands/app.d.ts +0 -4
  268. package/dist/commands/app.js +0 -54
  269. package/dist/commands/create.d.ts +0 -6
  270. package/dist/commands/create.js +0 -74
  271. package/dist/commands/deploy.d.ts +0 -11
  272. package/dist/commands/deploy.js +0 -255
  273. package/dist/commands/eval.d.ts +0 -11
  274. package/dist/commands/eval.js +0 -110
  275. package/dist/commands/hub.d.ts +0 -3
  276. package/dist/commands/hub.js +0 -323
  277. package/dist/commands/observe.d.ts +0 -7
  278. package/dist/commands/observe.js +0 -41
  279. package/dist/commands/run-skill.d.ts +0 -6
  280. package/dist/commands/run-skill.js +0 -102
  281. package/dist/commands/run.d.ts +0 -9
  282. package/dist/commands/run.js +0 -187
  283. package/dist/commands/serve-mcp.d.ts +0 -20
  284. package/dist/commands/serve-mcp.js +0 -67
  285. package/dist/commands/test.d.ts +0 -9
  286. package/dist/commands/test.js +0 -33
  287. package/dist/constants.d.ts +0 -7
  288. package/dist/constants.js +0 -21
  289. package/dist/index.d.ts +0 -1
  290. package/dist/index.js +0 -1
  291. package/dist/tracer/terminal.d.ts +0 -62
  292. package/dist/tracer/terminal.js +0 -404
  293. package/dist/type.d.ts +0 -5
  294. package/dist/type.js +0 -1
  295. package/dist/ui/utils/terminal-input.d.ts +0 -19
  296. package/dist/ui/utils/terminal-input.js +0 -123
  297. package/dist/ui/utils/text-buffer.d.ts +0 -87
  298. package/dist/ui/utils/text-buffer.js +0 -1059
  299. package/dist/ui/utils/text-utils.d.ts +0 -37
  300. package/dist/ui/utils/text-utils.js +0 -185
  301. package/dist/utils/agent-v1.d.ts +0 -134
  302. package/dist/utils/agent-v1.js +0 -213
  303. package/dist/utils/aigne-hub/constants.d.ts +0 -6
  304. package/dist/utils/aigne-hub/constants.js +0 -12
  305. package/dist/utils/aigne-hub/credential.d.ts +0 -20
  306. package/dist/utils/aigne-hub/credential.js +0 -182
  307. package/dist/utils/aigne-hub/crypto.d.ts +0 -4
  308. package/dist/utils/aigne-hub/crypto.js +0 -30
  309. package/dist/utils/aigne-hub/model.d.ts +0 -13
  310. package/dist/utils/aigne-hub/model.js +0 -122
  311. package/dist/utils/aigne-hub/store/file.d.ts +0 -15
  312. package/dist/utils/aigne-hub/store/file.js +0 -69
  313. package/dist/utils/aigne-hub/store/index.d.ts +0 -5
  314. package/dist/utils/aigne-hub/store/index.js +0 -43
  315. package/dist/utils/aigne-hub/store/keytar.d.ts +0 -15
  316. package/dist/utils/aigne-hub/store/keytar.js +0 -67
  317. package/dist/utils/aigne-hub/store/migrate.d.ts +0 -2
  318. package/dist/utils/aigne-hub/store/migrate.js +0 -57
  319. package/dist/utils/aigne-hub/type.d.ts +0 -38
  320. package/dist/utils/aigne-hub/type.js +0 -1
  321. package/dist/utils/aigne-hub-user.d.ts +0 -16
  322. package/dist/utils/aigne-hub-user.js +0 -10
  323. package/dist/utils/ascii-logo.d.ts +0 -1
  324. package/dist/utils/download.d.ts +0 -3
  325. package/dist/utils/download.js +0 -19
  326. package/dist/utils/evaluation/core.d.ts +0 -8
  327. package/dist/utils/evaluation/core.js +0 -83
  328. package/dist/utils/evaluation/dataset.d.ts +0 -15
  329. package/dist/utils/evaluation/dataset.js +0 -61
  330. package/dist/utils/evaluation/evaluator.d.ts +0 -9
  331. package/dist/utils/evaluation/reporter.d.ts +0 -28
  332. package/dist/utils/evaluation/reporter.js +0 -221
  333. package/dist/utils/evaluation/runner.d.ts +0 -16
  334. package/dist/utils/evaluation/runner.js +0 -129
  335. package/dist/utils/evaluation/type.d.ts +0 -69
  336. package/dist/utils/evaluation/type.js +0 -1
  337. package/dist/utils/get-url-origin.d.ts +0 -1
  338. package/dist/utils/get-url-origin.js +0 -8
  339. package/dist/utils/inquirer/checkbox.d.ts +0 -55
  340. package/dist/utils/inquirer/checkbox.js +0 -319
  341. package/dist/utils/listr.d.ts +0 -64
  342. package/dist/utils/listr.js +0 -265
  343. package/dist/utils/load-aigne.d.ts +0 -18
  344. package/dist/utils/load-aigne.js +0 -80
  345. package/dist/utils/run-chat-loop.d.ts +0 -15
  346. package/dist/utils/run-chat-loop.js +0 -87
  347. package/dist/utils/run-with-aigne.d.ts +0 -27
  348. package/dist/utils/run-with-aigne.js +0 -157
  349. package/dist/utils/serve-mcp.d.ts +0 -9
  350. package/dist/utils/serve-mcp.js +0 -93
  351. package/dist/utils/spinner.d.ts +0 -1
  352. package/dist/utils/spinner.js +0 -14
  353. package/dist/utils/string-utils.d.ts +0 -1
  354. package/dist/utils/string-utils.js +0 -4
  355. package/dist/utils/time.d.ts +0 -1
  356. package/dist/utils/time.js +0 -12
  357. package/dist/utils/url.d.ts +0 -1
  358. package/dist/utils/url.js +0 -3
  359. package/dist/utils/yargs.d.ts +0 -94
  360. package/dist/utils/yargs.js +0 -210
@@ -0,0 +1,90 @@
1
+ import { CHAT_MODEL_OPTIONS } from "../../constants.mjs";
2
+ import { NeedReinstallBetaError, NeedReinstallError, loadApplication, upgradeCommandModule } from "./upgrade.mjs";
3
+ import { withRunAgentCommonOptions } from "../../utils/yargs.mjs";
4
+ import { highlightUrl } from "../../utils/string-utils.mjs";
5
+ import { agentCommandModule, cliAgentCommandModule, serveMcpCommandModule } from "./agent.mjs";
6
+ import { LogLevel, logger } from "@aigne/core/utils/logger";
7
+ import chalk from "chalk";
8
+ import yargs from "yargs";
9
+ import { join } from "node:path";
10
+ import { pick } from "@aigne/core/utils/type-utils";
11
+ import { homedir } from "node:os";
12
+ import { hideBin } from "yargs/helpers";
13
+
14
+ //#region src/commands/app/app.ts
15
+ async function runAppCLI({ appName = process.env.AIGNE_APP_NAME, appPackageName = process.env.AIGNE_APP_PACKAGE_NAME, appDescription = process.env.AIGNE_APP_DESCRIPTION, appUseBetaVersion = process.env.AIGNE_APP_USE_BETA_APPS === "1" ? true : void 0, ...options } = {}) {
16
+ const [scriptName, ...argv] = options.argv || hideBin(process.argv);
17
+ if (!appName || !appPackageName) throw new Error("AIGNE_APP_NAME or AIGNE_APP_PACKAGE_NAME is not defined");
18
+ try {
19
+ const options$1 = withRunAgentCommonOptions(yargs(argv).help(false).version(false).strict(false)).parseSync();
20
+ logger.level = options$1.logLevel;
21
+ const dir = join(homedir(), ".aigne", "registry.npmjs.org", appPackageName);
22
+ const y = yargs().scriptName(`aigne ${scriptName}`).usage(`aigne ${scriptName}\n\n${appDescription || ""}`).command(upgradeCommandModule({
23
+ packageName: appPackageName,
24
+ dir
25
+ }));
26
+ if (!isUpgradeCommand(argv)) {
27
+ const { aigne, version } = await loadApplication({
28
+ packageName: appPackageName,
29
+ beta: appUseBetaVersion,
30
+ dir,
31
+ install: true,
32
+ modelOptions: pick(options$1, CHAT_MODEL_OPTIONS),
33
+ imageModelOptions: { model: options$1.imageModel },
34
+ skipModelLoading: (options$1.help || options$1.h || options$1.version || options$1.v) === true
35
+ });
36
+ if (aigne.cli?.chat) y.command({
37
+ ...agentCommandModule({
38
+ aigne,
39
+ agent: aigne.cli.chat,
40
+ interactive: true
41
+ }),
42
+ command: "$0"
43
+ });
44
+ for (const cliAgent of aigne.cli?.agents ?? []) y.command(cliAgentCommandModule({
45
+ aigne,
46
+ cliAgent
47
+ }));
48
+ y.option("model", {
49
+ type: "string",
50
+ description: "Model to use for the application, example: openai:gpt-4.1 or google:gemini-2.5-flash"
51
+ }).command(serveMcpCommandModule({
52
+ aigne,
53
+ name: appName
54
+ }));
55
+ y.version(`${appName} v${version}`);
56
+ }
57
+ await y.alias("v", "version").alias("h", "help").demandCommand().fail((message, error, yargs$1) => {
58
+ if (!error) {
59
+ yargs$1.showHelp();
60
+ console.error(`\n${message}`);
61
+ process.exit(1);
62
+ }
63
+ }).parseAsync(argv);
64
+ process.exit(0);
65
+ } catch (error) {
66
+ if (error instanceof NeedReinstallError || error instanceof NeedReinstallBetaError) {
67
+ logger.warn(error.message);
68
+ process.exit(error instanceof NeedReinstallBetaError ? NeedReinstallBetaError.code : NeedReinstallError.code);
69
+ }
70
+ if (error.name !== "ExitPromptError") {
71
+ console.log("");
72
+ if (logger.enabled(LogLevel.ERROR)) console.error(chalk.red(error.stack));
73
+ else console.error(`${chalk.red("Error:")} ${highlightUrl(error.message)}`);
74
+ }
75
+ process.exit(1);
76
+ }
77
+ }
78
+ function isUpgradeCommand(argv) {
79
+ const skipGlobalOptions = [
80
+ "-v",
81
+ "--version",
82
+ "-h",
83
+ "--help"
84
+ ];
85
+ return argv[0] === "upgrade" && !argv.some((arg) => skipGlobalOptions.includes(arg));
86
+ }
87
+
88
+ //#endregion
89
+ export { runAppCLI };
90
+ //# sourceMappingURL=app.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.mjs","names":["options"],"sources":["../../../src/commands/app/app.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { CHAT_MODEL_OPTIONS } from \"@aigne/cli/constants.js\";\nimport { LogLevel, logger } from \"@aigne/core/utils/logger\";\nimport { pick } from \"@aigne/core/utils/type-utils\";\nimport chalk from \"chalk\";\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { highlightUrl } from \"../../utils/string-utils.js\";\nimport { withRunAgentCommonOptions } from \"../../utils/yargs.js\";\nimport { agentCommandModule, cliAgentCommandModule, serveMcpCommandModule } from \"./agent.js\";\nimport {\n loadApplication,\n NeedReinstallBetaError,\n NeedReinstallError,\n upgradeCommandModule,\n} from \"./upgrade.js\";\n\nexport async function runAppCLI({\n appName = process.env.AIGNE_APP_NAME,\n appPackageName = process.env.AIGNE_APP_PACKAGE_NAME,\n appDescription = process.env.AIGNE_APP_DESCRIPTION,\n appUseBetaVersion = process.env.AIGNE_APP_USE_BETA_APPS === \"1\" ? true : undefined,\n ...options\n}: {\n argv?: string[];\n appName?: string;\n appPackageName?: string;\n appDescription?: string;\n appUseBetaVersion?: boolean;\n} = {}) {\n const [scriptName, ...argv] = options.argv || hideBin(process.argv);\n if (!appName || !appPackageName)\n throw new Error(\"AIGNE_APP_NAME or AIGNE_APP_PACKAGE_NAME is not defined\");\n\n try {\n // Parse model options for loading application\n const options = withRunAgentCommonOptions(\n yargs(argv).help(false).version(false).strict(false),\n ).parseSync();\n logger.level = options.logLevel;\n\n const dir = join(homedir(), \".aigne\", \"registry.npmjs.org\", appPackageName);\n\n const y = yargs()\n .scriptName(`aigne ${scriptName}`)\n .usage(`aigne ${scriptName}\\n\\n${appDescription || \"\"}`)\n .command(upgradeCommandModule({ packageName: appPackageName, dir }));\n\n if (!isUpgradeCommand(argv)) {\n const { aigne, version } = await loadApplication({\n packageName: appPackageName,\n beta: appUseBetaVersion,\n dir,\n install: true,\n modelOptions: pick(options, CHAT_MODEL_OPTIONS),\n imageModelOptions: { model: options.imageModel },\n skipModelLoading: (options.help || options.h || options.version || options.v) === true,\n });\n\n if (aigne.cli?.chat) {\n y.command({\n ...agentCommandModule({\n aigne,\n agent: aigne.cli.chat,\n interactive: true,\n }),\n command: \"$0\",\n });\n }\n\n for (const cliAgent of aigne.cli?.agents ?? []) {\n y.command(cliAgentCommandModule({ aigne, cliAgent }));\n }\n\n y.option(\"model\", {\n type: \"string\",\n description:\n \"Model to use for the application, example: openai:gpt-4.1 or google:gemini-2.5-flash\",\n }).command(serveMcpCommandModule({ aigne, name: appName }));\n\n y.version(`${appName} v${version}`);\n }\n\n await y\n .alias(\"v\", \"version\")\n .alias(\"h\", \"help\")\n .demandCommand()\n .fail((message, error, yargs) => {\n // We catch all errors below, here just print the help message non-error case like demandCommand\n if (!error) {\n yargs.showHelp();\n\n console.error(`\\n${message}`);\n process.exit(1);\n }\n })\n .parseAsync(argv);\n\n process.exit(0);\n } catch (error) {\n if (error instanceof NeedReinstallError || error instanceof NeedReinstallBetaError) {\n logger.warn(error.message);\n process.exit(\n error instanceof NeedReinstallBetaError\n ? NeedReinstallBetaError.code\n : NeedReinstallError.code,\n );\n }\n\n if (error.name !== \"ExitPromptError\") {\n console.log(\"\"); // Add an empty line for better readability\n\n if (logger.enabled(LogLevel.ERROR)) {\n console.error(chalk.red(error.stack));\n } else {\n console.error(`${chalk.red(\"Error:\")} ${highlightUrl(error.message)}`);\n }\n }\n\n process.exit(1);\n }\n}\n\nfunction isUpgradeCommand(argv: string[]): boolean {\n const skipGlobalOptions = [\"-v\", \"--version\", \"-h\", \"--help\"];\n return argv[0] === \"upgrade\" && !argv.some((arg) => skipGlobalOptions.includes(arg));\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,eAAsB,UAAU,EAC9B,UAAU,QAAQ,IAAI,gBACtB,iBAAiB,QAAQ,IAAI,wBAC7B,iBAAiB,QAAQ,IAAI,uBAC7B,oBAAoB,QAAQ,IAAI,4BAA4B,MAAM,OAAO,QACzE,GAAG,YAOD,EAAE,EAAE;CACN,MAAM,CAAC,YAAY,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;AACnE,KAAI,CAAC,WAAW,CAAC,eACf,OAAM,IAAI,MAAM,0DAA0D;AAE5E,KAAI;EAEF,MAAMA,YAAU,0BACd,MAAM,KAAK,CAAC,KAAK,MAAM,CAAC,QAAQ,MAAM,CAAC,OAAO,MAAM,CACrD,CAAC,WAAW;AACb,SAAO,QAAQA,UAAQ;EAEvB,MAAM,MAAM,KAAK,SAAS,EAAE,UAAU,sBAAsB,eAAe;EAE3E,MAAM,IAAI,OAAO,CACd,WAAW,SAAS,aAAa,CACjC,MAAM,SAAS,WAAW,MAAM,kBAAkB,KAAK,CACvD,QAAQ,qBAAqB;GAAE,aAAa;GAAgB;GAAK,CAAC,CAAC;AAEtE,MAAI,CAAC,iBAAiB,KAAK,EAAE;GAC3B,MAAM,EAAE,OAAO,YAAY,MAAM,gBAAgB;IAC/C,aAAa;IACb,MAAM;IACN;IACA,SAAS;IACT,cAAc,KAAKA,WAAS,mBAAmB;IAC/C,mBAAmB,EAAE,OAAOA,UAAQ,YAAY;IAChD,mBAAmBA,UAAQ,QAAQA,UAAQ,KAAKA,UAAQ,WAAWA,UAAQ,OAAO;IACnF,CAAC;AAEF,OAAI,MAAM,KAAK,KACb,GAAE,QAAQ;IACR,GAAG,mBAAmB;KACpB;KACA,OAAO,MAAM,IAAI;KACjB,aAAa;KACd,CAAC;IACF,SAAS;IACV,CAAC;AAGJ,QAAK,MAAM,YAAY,MAAM,KAAK,UAAU,EAAE,CAC5C,GAAE,QAAQ,sBAAsB;IAAE;IAAO;IAAU,CAAC,CAAC;AAGvD,KAAE,OAAO,SAAS;IAChB,MAAM;IACN,aACE;IACH,CAAC,CAAC,QAAQ,sBAAsB;IAAE;IAAO,MAAM;IAAS,CAAC,CAAC;AAE3D,KAAE,QAAQ,GAAG,QAAQ,IAAI,UAAU;;AAGrC,QAAM,EACH,MAAM,KAAK,UAAU,CACrB,MAAM,KAAK,OAAO,CAClB,eAAe,CACf,MAAM,SAAS,OAAO,YAAU;AAE/B,OAAI,CAAC,OAAO;AACV,YAAM,UAAU;AAEhB,YAAQ,MAAM,KAAK,UAAU;AAC7B,YAAQ,KAAK,EAAE;;IAEjB,CACD,WAAW,KAAK;AAEnB,UAAQ,KAAK,EAAE;UACR,OAAO;AACd,MAAI,iBAAiB,sBAAsB,iBAAiB,wBAAwB;AAClF,UAAO,KAAK,MAAM,QAAQ;AAC1B,WAAQ,KACN,iBAAiB,yBACb,uBAAuB,OACvB,mBAAmB,KACxB;;AAGH,MAAI,MAAM,SAAS,mBAAmB;AACpC,WAAQ,IAAI,GAAG;AAEf,OAAI,OAAO,QAAQ,SAAS,MAAM,CAChC,SAAQ,MAAM,MAAM,IAAI,MAAM,MAAM,CAAC;OAErC,SAAQ,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC,GAAG,aAAa,MAAM,QAAQ,GAAG;;AAI1E,UAAQ,KAAK,EAAE;;;AAInB,SAAS,iBAAiB,MAAyB;CACjD,MAAM,oBAAoB;EAAC;EAAM;EAAa;EAAM;EAAS;AAC7D,QAAO,KAAK,OAAO,aAAa,CAAC,KAAK,MAAM,QAAQ,kBAAkB,SAAS,IAAI,CAAC"}
@@ -0,0 +1,6 @@
1
+ const require_app = require('./app.cjs');
2
+
3
+ //#region src/commands/app/cli.ts
4
+ require_app.runAppCLI();
5
+
6
+ //#endregion
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,8 @@
1
+ import { runAppCLI } from "./app.mjs";
2
+
3
+ //#region src/commands/app/cli.ts
4
+ runAppCLI();
5
+
6
+ //#endregion
7
+ export { };
8
+ //# sourceMappingURL=cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../../src/commands/app/cli.ts"],"sourcesContent":["import { runAppCLI } from \"./app.js\";\n\nrunAppCLI();\n"],"mappings":";;;AAEA,WAAW"}
@@ -0,0 +1,243 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_utils_download = require('../../utils/download.cjs');
3
+ const require_utils_load_aigne = require('../../utils/load-aigne.cjs');
4
+ const require_utils_spinner = require('../../utils/spinner.cjs');
5
+ let node_child_process = require("node:child_process");
6
+ let node_path = require("node:path");
7
+ let node_fs_promises = require("node:fs/promises");
8
+ let _aigne_core_loader_error = require("@aigne/core/loader/error");
9
+ let _aigne_core_utils_fetch = require("@aigne/core/utils/fetch");
10
+ let _aigne_listr2 = require("@aigne/listr2");
11
+ let ufo = require("ufo");
12
+
13
+ //#region src/commands/app/upgrade.ts
14
+ const NPM_PACKAGE_CACHE_TIME_MS = 1e3 * 60 * 60 * 24;
15
+ /**
16
+ * Check if beta applications should be used based on environment variables
17
+ */
18
+ function shouldUseBetaApps() {
19
+ const envVar = process.env.AIGNE_USE_BETA_APPS;
20
+ return envVar === "true" || envVar === "1";
21
+ }
22
+ const upgradeCommandModule = ({ packageName, dir }) => ({
23
+ command: "upgrade",
24
+ describe: `Upgrade ${packageName} to the latest version`,
25
+ builder: (yargs) => {
26
+ return yargs.option("beta", {
27
+ type: "boolean",
28
+ describe: "Use beta versions if available"
29
+ }).option("target-version", {
30
+ type: "string",
31
+ describe: "Specify a version to upgrade to (default is latest)",
32
+ alias: ["to", "target"]
33
+ }).option("force", {
34
+ type: "boolean",
35
+ describe: "Force upgrade even if already at latest version",
36
+ default: false
37
+ });
38
+ },
39
+ handler: async ({ beta, targetVersion, force }) => {
40
+ beta ??= shouldUseBetaApps();
41
+ const npm = await require_utils_spinner.withSpinner("", async () => {
42
+ if (force) await (0, node_fs_promises.rm)(dir, {
43
+ force: true,
44
+ recursive: true
45
+ });
46
+ return await getNpmTgzInfo(packageName, {
47
+ beta,
48
+ version: targetVersion
49
+ });
50
+ });
51
+ const check = await checkInstallation(dir);
52
+ if (force || !check || npm.version !== check.version) await installApp({
53
+ packageName,
54
+ dir,
55
+ beta,
56
+ version: targetVersion
57
+ });
58
+ const app = await loadApplication({
59
+ dir,
60
+ packageName,
61
+ install: true,
62
+ skipModelLoading: true
63
+ });
64
+ if (force || check?.version !== app.version) console.log(`\n✅ Upgraded ${packageName} to version ${app.version}`);
65
+ else console.log(`\n✅ ${packageName} is already at the latest version (${app.version})`);
66
+ }
67
+ });
68
+ var NeedReinstallError = class extends Error {
69
+ static code = 244;
70
+ };
71
+ var NeedReinstallBetaError = class extends Error {
72
+ static code = 245;
73
+ };
74
+ async function loadApplication(options) {
75
+ const { dir, packageName } = options;
76
+ const check = await checkInstallation(dir);
77
+ const beta = options.beta ?? check?.version?.includes("beta");
78
+ if (check) {
79
+ let needUpdate = check.expired;
80
+ if (check.expired) await require_utils_spinner.withSpinner("Checking updates...", async () => {
81
+ if ((await getNpmTgzInfo(packageName, { beta })).version === check.version) {
82
+ await writeInstallationMetadata(dir, { installedAt: Date.now() });
83
+ needUpdate = false;
84
+ }
85
+ });
86
+ if (!needUpdate) {
87
+ const aigne = await require_utils_load_aigne.loadAIGNE({
88
+ ...options,
89
+ path: dir,
90
+ metadata: {
91
+ appName: packageName,
92
+ appVersion: check?.version
93
+ }
94
+ }).catch(async (error) => {
95
+ if (error instanceof _aigne_core_loader_error.LoadJsAgentError) {
96
+ await require_utils_spinner.withSpinner("", async () => {
97
+ await (0, node_fs_promises.rm)(options.dir, {
98
+ recursive: true,
99
+ force: true
100
+ });
101
+ await (0, node_fs_promises.mkdir)(options.dir, { recursive: true });
102
+ });
103
+ const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;
104
+ throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);
105
+ }
106
+ throw error;
107
+ });
108
+ if (aigne) return {
109
+ aigne,
110
+ version: check.version,
111
+ isCache: true
112
+ };
113
+ }
114
+ }
115
+ if (!options.install) return null;
116
+ const result = await installApp({
117
+ dir,
118
+ packageName,
119
+ beta
120
+ });
121
+ return {
122
+ aigne: await require_utils_load_aigne.loadAIGNE({
123
+ ...options,
124
+ path: dir,
125
+ metadata: {
126
+ appName: packageName,
127
+ appVersion: result.version
128
+ }
129
+ }),
130
+ version: result.version
131
+ };
132
+ }
133
+ async function getNpmTgzInfo(name, { version, beta } = {}) {
134
+ const data = await (await (0, _aigne_core_utils_fetch.fetch)((0, ufo.joinURL)("https://registry.npmjs.org", name))).json();
135
+ let targetVersion;
136
+ if (version) {
137
+ if (!data.versions[version]) throw new Error(`Version ${version} of package ${name} not found`);
138
+ targetVersion = version;
139
+ } else if (beta && data["dist-tags"].beta) targetVersion = data["dist-tags"].beta;
140
+ else targetVersion = data["dist-tags"].latest;
141
+ const url = data.versions[targetVersion].dist.tarball;
142
+ return {
143
+ version: targetVersion,
144
+ url
145
+ };
146
+ }
147
+ async function readInstallationMetadata(dir) {
148
+ return safeParseJSON(await (0, node_fs_promises.readFile)((0, node_path.join)(dir, ".aigne-cli.json"), "utf-8").catch(() => "{}"));
149
+ }
150
+ async function writeInstallationMetadata(dir, metadata) {
151
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(dir, ".aigne-cli.json"), JSON.stringify(metadata, null, 2));
152
+ }
153
+ async function checkInstallation(dir, { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS } = {}) {
154
+ if (!await (0, node_fs_promises.stat)((0, node_path.join)(dir, "package.json")).catch(() => null)) return null;
155
+ const version = safeParseJSON(await (0, node_fs_promises.readFile)((0, node_path.join)(dir, "package.json"), "utf-8"))?.version;
156
+ if (!version) return null;
157
+ const installedAt = (await readInstallationMetadata(dir))?.installedAt;
158
+ if (!installedAt) return null;
159
+ return {
160
+ version,
161
+ expired: Date.now() - installedAt > cacheTimeMs
162
+ };
163
+ }
164
+ async function installApp({ dir, packageName, beta, version }) {
165
+ return await new _aigne_listr2.Listr([
166
+ {
167
+ title: `Fetching ${packageName} metadata`,
168
+ task: async (ctx, task) => {
169
+ if (beta) task.title = `Fetching ${packageName} metadata (using beta version)`;
170
+ const info = await getNpmTgzInfo(packageName, {
171
+ beta,
172
+ version
173
+ });
174
+ Object.assign(ctx, info);
175
+ }
176
+ },
177
+ {
178
+ title: `Downloading ${packageName}`,
179
+ task: async (ctx, task) => {
180
+ task.title = `Downloading ${packageName} (v${ctx.version})`;
181
+ await (0, node_fs_promises.mkdir)(dir, { recursive: true });
182
+ await require_utils_download.downloadAndExtract(ctx.url, dir, { strip: 1 });
183
+ }
184
+ },
185
+ {
186
+ title: "Installing dependencies",
187
+ task: async (_, task) => {
188
+ await installDependencies(dir, { log: (log) => {
189
+ const last = log.split("\n").findLast((i) => !!i);
190
+ if (last) task.output = last;
191
+ } });
192
+ await writeInstallationMetadata(dir, { installedAt: Date.now() });
193
+ }
194
+ }
195
+ ], { rendererOptions: {
196
+ collapseSubtasks: false,
197
+ showErrorMessage: false,
198
+ timer: _aigne_listr2.PRESET_TIMER
199
+ } }).run();
200
+ }
201
+ async function installDependencies(dir, { log } = {}) {
202
+ await new Promise((resolve, reject) => {
203
+ const child = (0, node_child_process.spawn)("npm", [
204
+ "install",
205
+ "--omit",
206
+ "dev",
207
+ "--verbose",
208
+ "--legacy-peer-deps"
209
+ ], {
210
+ cwd: dir,
211
+ stdio: "pipe",
212
+ shell: process.platform === "win32"
213
+ });
214
+ child.stdout.on("data", (data) => {
215
+ log?.(data.toString());
216
+ });
217
+ let stderr = "";
218
+ child.stderr.on("data", (data) => {
219
+ const str = data.toString();
220
+ log?.(str);
221
+ stderr += str;
222
+ });
223
+ child.on("error", (error) => reject(error));
224
+ child.on("exit", (code) => {
225
+ if (code === 0) resolve();
226
+ else {
227
+ console.error(stderr);
228
+ reject(/* @__PURE__ */ new Error(`npm install failed with code ${code}`));
229
+ }
230
+ });
231
+ });
232
+ }
233
+ function safeParseJSON(raw) {
234
+ try {
235
+ return JSON.parse(raw);
236
+ } catch {}
237
+ }
238
+
239
+ //#endregion
240
+ exports.NeedReinstallBetaError = NeedReinstallBetaError;
241
+ exports.NeedReinstallError = NeedReinstallError;
242
+ exports.loadApplication = loadApplication;
243
+ exports.upgradeCommandModule = upgradeCommandModule;
@@ -0,0 +1,240 @@
1
+ import { downloadAndExtract } from "../../utils/download.mjs";
2
+ import { loadAIGNE } from "../../utils/load-aigne.mjs";
3
+ import { withSpinner } from "../../utils/spinner.mjs";
4
+ import { spawn } from "node:child_process";
5
+ import { join } from "node:path";
6
+ import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
7
+ import { LoadJsAgentError } from "@aigne/core/loader/error";
8
+ import { fetch } from "@aigne/core/utils/fetch";
9
+ import { Listr, PRESET_TIMER } from "@aigne/listr2";
10
+ import { joinURL } from "ufo";
11
+
12
+ //#region src/commands/app/upgrade.ts
13
+ const NPM_PACKAGE_CACHE_TIME_MS = 1e3 * 60 * 60 * 24;
14
+ /**
15
+ * Check if beta applications should be used based on environment variables
16
+ */
17
+ function shouldUseBetaApps() {
18
+ const envVar = process.env.AIGNE_USE_BETA_APPS;
19
+ return envVar === "true" || envVar === "1";
20
+ }
21
+ const upgradeCommandModule = ({ packageName, dir }) => ({
22
+ command: "upgrade",
23
+ describe: `Upgrade ${packageName} to the latest version`,
24
+ builder: (yargs) => {
25
+ return yargs.option("beta", {
26
+ type: "boolean",
27
+ describe: "Use beta versions if available"
28
+ }).option("target-version", {
29
+ type: "string",
30
+ describe: "Specify a version to upgrade to (default is latest)",
31
+ alias: ["to", "target"]
32
+ }).option("force", {
33
+ type: "boolean",
34
+ describe: "Force upgrade even if already at latest version",
35
+ default: false
36
+ });
37
+ },
38
+ handler: async ({ beta, targetVersion, force }) => {
39
+ beta ??= shouldUseBetaApps();
40
+ const npm = await withSpinner("", async () => {
41
+ if (force) await rm(dir, {
42
+ force: true,
43
+ recursive: true
44
+ });
45
+ return await getNpmTgzInfo(packageName, {
46
+ beta,
47
+ version: targetVersion
48
+ });
49
+ });
50
+ const check = await checkInstallation(dir);
51
+ if (force || !check || npm.version !== check.version) await installApp({
52
+ packageName,
53
+ dir,
54
+ beta,
55
+ version: targetVersion
56
+ });
57
+ const app = await loadApplication({
58
+ dir,
59
+ packageName,
60
+ install: true,
61
+ skipModelLoading: true
62
+ });
63
+ if (force || check?.version !== app.version) console.log(`\n✅ Upgraded ${packageName} to version ${app.version}`);
64
+ else console.log(`\n✅ ${packageName} is already at the latest version (${app.version})`);
65
+ }
66
+ });
67
+ var NeedReinstallError = class extends Error {
68
+ static code = 244;
69
+ };
70
+ var NeedReinstallBetaError = class extends Error {
71
+ static code = 245;
72
+ };
73
+ async function loadApplication(options) {
74
+ const { dir, packageName } = options;
75
+ const check = await checkInstallation(dir);
76
+ const beta = options.beta ?? check?.version?.includes("beta");
77
+ if (check) {
78
+ let needUpdate = check.expired;
79
+ if (check.expired) await withSpinner("Checking updates...", async () => {
80
+ if ((await getNpmTgzInfo(packageName, { beta })).version === check.version) {
81
+ await writeInstallationMetadata(dir, { installedAt: Date.now() });
82
+ needUpdate = false;
83
+ }
84
+ });
85
+ if (!needUpdate) {
86
+ const aigne = await loadAIGNE({
87
+ ...options,
88
+ path: dir,
89
+ metadata: {
90
+ appName: packageName,
91
+ appVersion: check?.version
92
+ }
93
+ }).catch(async (error) => {
94
+ if (error instanceof LoadJsAgentError) {
95
+ await withSpinner("", async () => {
96
+ await rm(options.dir, {
97
+ recursive: true,
98
+ force: true
99
+ });
100
+ await mkdir(options.dir, { recursive: true });
101
+ });
102
+ const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;
103
+ throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);
104
+ }
105
+ throw error;
106
+ });
107
+ if (aigne) return {
108
+ aigne,
109
+ version: check.version,
110
+ isCache: true
111
+ };
112
+ }
113
+ }
114
+ if (!options.install) return null;
115
+ const result = await installApp({
116
+ dir,
117
+ packageName,
118
+ beta
119
+ });
120
+ return {
121
+ aigne: await loadAIGNE({
122
+ ...options,
123
+ path: dir,
124
+ metadata: {
125
+ appName: packageName,
126
+ appVersion: result.version
127
+ }
128
+ }),
129
+ version: result.version
130
+ };
131
+ }
132
+ async function getNpmTgzInfo(name, { version, beta } = {}) {
133
+ const data = await (await fetch(joinURL("https://registry.npmjs.org", name))).json();
134
+ let targetVersion;
135
+ if (version) {
136
+ if (!data.versions[version]) throw new Error(`Version ${version} of package ${name} not found`);
137
+ targetVersion = version;
138
+ } else if (beta && data["dist-tags"].beta) targetVersion = data["dist-tags"].beta;
139
+ else targetVersion = data["dist-tags"].latest;
140
+ const url = data.versions[targetVersion].dist.tarball;
141
+ return {
142
+ version: targetVersion,
143
+ url
144
+ };
145
+ }
146
+ async function readInstallationMetadata(dir) {
147
+ return safeParseJSON(await readFile(join(dir, ".aigne-cli.json"), "utf-8").catch(() => "{}"));
148
+ }
149
+ async function writeInstallationMetadata(dir, metadata) {
150
+ await writeFile(join(dir, ".aigne-cli.json"), JSON.stringify(metadata, null, 2));
151
+ }
152
+ async function checkInstallation(dir, { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS } = {}) {
153
+ if (!await stat(join(dir, "package.json")).catch(() => null)) return null;
154
+ const version = safeParseJSON(await readFile(join(dir, "package.json"), "utf-8"))?.version;
155
+ if (!version) return null;
156
+ const installedAt = (await readInstallationMetadata(dir))?.installedAt;
157
+ if (!installedAt) return null;
158
+ return {
159
+ version,
160
+ expired: Date.now() - installedAt > cacheTimeMs
161
+ };
162
+ }
163
+ async function installApp({ dir, packageName, beta, version }) {
164
+ return await new Listr([
165
+ {
166
+ title: `Fetching ${packageName} metadata`,
167
+ task: async (ctx, task) => {
168
+ if (beta) task.title = `Fetching ${packageName} metadata (using beta version)`;
169
+ const info = await getNpmTgzInfo(packageName, {
170
+ beta,
171
+ version
172
+ });
173
+ Object.assign(ctx, info);
174
+ }
175
+ },
176
+ {
177
+ title: `Downloading ${packageName}`,
178
+ task: async (ctx, task) => {
179
+ task.title = `Downloading ${packageName} (v${ctx.version})`;
180
+ await mkdir(dir, { recursive: true });
181
+ await downloadAndExtract(ctx.url, dir, { strip: 1 });
182
+ }
183
+ },
184
+ {
185
+ title: "Installing dependencies",
186
+ task: async (_, task) => {
187
+ await installDependencies(dir, { log: (log) => {
188
+ const last = log.split("\n").findLast((i) => !!i);
189
+ if (last) task.output = last;
190
+ } });
191
+ await writeInstallationMetadata(dir, { installedAt: Date.now() });
192
+ }
193
+ }
194
+ ], { rendererOptions: {
195
+ collapseSubtasks: false,
196
+ showErrorMessage: false,
197
+ timer: PRESET_TIMER
198
+ } }).run();
199
+ }
200
+ async function installDependencies(dir, { log } = {}) {
201
+ await new Promise((resolve$1, reject) => {
202
+ const child = spawn("npm", [
203
+ "install",
204
+ "--omit",
205
+ "dev",
206
+ "--verbose",
207
+ "--legacy-peer-deps"
208
+ ], {
209
+ cwd: dir,
210
+ stdio: "pipe",
211
+ shell: process.platform === "win32"
212
+ });
213
+ child.stdout.on("data", (data) => {
214
+ log?.(data.toString());
215
+ });
216
+ let stderr = "";
217
+ child.stderr.on("data", (data) => {
218
+ const str = data.toString();
219
+ log?.(str);
220
+ stderr += str;
221
+ });
222
+ child.on("error", (error) => reject(error));
223
+ child.on("exit", (code) => {
224
+ if (code === 0) resolve$1();
225
+ else {
226
+ console.error(stderr);
227
+ reject(/* @__PURE__ */ new Error(`npm install failed with code ${code}`));
228
+ }
229
+ });
230
+ });
231
+ }
232
+ function safeParseJSON(raw) {
233
+ try {
234
+ return JSON.parse(raw);
235
+ } catch {}
236
+ }
237
+
238
+ //#endregion
239
+ export { NeedReinstallBetaError, NeedReinstallError, loadApplication, upgradeCommandModule };
240
+ //# sourceMappingURL=upgrade.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.mjs","names":[],"sources":["../../../src/commands/app/upgrade.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { LoadCredentialOptions } from \"@aigne/cli/utils/aigne-hub/type.js\";\nimport type { AIGNE, ChatModelInputOptions, ImageModelInputOptions } from \"@aigne/core\";\nimport { LoadJsAgentError } from \"@aigne/core/loader/error\";\nimport { fetch } from \"@aigne/core/utils/fetch\";\nimport { Listr, PRESET_TIMER } from \"@aigne/listr2\";\nimport { joinURL } from \"ufo\";\nimport type { CommandModule } from \"yargs\";\nimport { downloadAndExtract } from \"../../utils/download.js\";\nimport { loadAIGNE } from \"../../utils/load-aigne.js\";\nimport { withSpinner } from \"../../utils/spinner.js\";\n\nconst NPM_PACKAGE_CACHE_TIME_MS = 1000 * 60 * 60 * 24; // 1 day\n\n/**\n * Check if beta applications should be used based on environment variables\n */\nfunction shouldUseBetaApps(): boolean {\n const envVar = process.env.AIGNE_USE_BETA_APPS;\n return envVar === \"true\" || envVar === \"1\";\n}\n\nexport const upgradeCommandModule = ({\n packageName,\n dir,\n}: {\n packageName: string;\n dir: string;\n}): CommandModule<\n unknown,\n {\n beta?: boolean;\n targetVersion?: string;\n force?: boolean;\n }\n> => ({\n command: \"upgrade\",\n describe: `Upgrade ${packageName} to the latest version`,\n builder: (yargs) => {\n return yargs\n .option(\"beta\", {\n type: \"boolean\",\n describe: \"Use beta versions if available\",\n })\n .option(\"target-version\", {\n type: \"string\",\n describe: \"Specify a version to upgrade to (default is latest)\",\n alias: [\"to\", \"target\"],\n })\n .option(\"force\", {\n type: \"boolean\",\n describe: \"Force upgrade even if already at latest version\",\n default: false,\n });\n },\n handler: async ({ beta, targetVersion, force }) => {\n beta ??= shouldUseBetaApps();\n\n const npm = await withSpinner(\"\", async () => {\n if (force) await rm(dir, { force: true, recursive: true });\n return await getNpmTgzInfo(packageName, { beta, version: targetVersion });\n });\n\n const check = await checkInstallation(dir);\n\n if (force || !check || npm.version !== check.version) {\n await installApp({ packageName, dir, beta, version: targetVersion });\n }\n\n const app = await loadApplication({ dir, packageName, install: true, skipModelLoading: true });\n\n if (force || check?.version !== app.version) {\n console.log(`\\n✅ Upgraded ${packageName} to version ${app.version}`);\n } else {\n console.log(`\\n✅ ${packageName} is already at the latest version (${app.version})`);\n }\n },\n});\n\ninterface LoadApplicationOptions {\n packageName: string;\n dir: string;\n install?: boolean;\n skipModelLoading?: boolean;\n modelOptions?: ChatModelInputOptions & LoadCredentialOptions;\n imageModelOptions?: ImageModelInputOptions & LoadCredentialOptions;\n beta?: boolean;\n}\n\ninterface LoadApplicationResult {\n aigne: AIGNE;\n version: string;\n isCache?: boolean;\n}\n\nexport class NeedReinstallError extends Error {\n static code = 244;\n}\n\nexport class NeedReinstallBetaError extends Error {\n static code = 245;\n}\n\nexport async function loadApplication(\n options: LoadApplicationOptions & { install: true },\n): Promise<LoadApplicationResult>;\nexport async function loadApplication(\n options: LoadApplicationOptions & { install?: false },\n): Promise<LoadApplicationResult | null>;\nexport async function loadApplication(\n options: LoadApplicationOptions,\n): Promise<LoadApplicationResult | null> {\n const { dir, packageName } = options;\n\n const check = await checkInstallation(dir);\n\n const beta = options.beta ?? check?.version?.includes(\"beta\");\n\n if (check) {\n let needUpdate = check.expired;\n\n if (check.expired) {\n await withSpinner(\"Checking updates...\", async () => {\n const tgz = await getNpmTgzInfo(packageName, { beta });\n if (tgz.version === check.version) {\n await writeInstallationMetadata(dir, { installedAt: Date.now() });\n needUpdate = false;\n }\n });\n }\n\n if (!needUpdate) {\n const aigne = await loadAIGNE({\n ...options,\n path: dir,\n metadata: {\n appName: packageName,\n appVersion: check?.version,\n },\n }).catch(async (error) => {\n if (error instanceof LoadJsAgentError) {\n await withSpinner(\"\", async () => {\n await rm(options.dir, { recursive: true, force: true });\n await mkdir(options.dir, { recursive: true });\n });\n\n const message = `⚠️ Failed to load ${packageName}, trying to reinstall: ${error.message}`;\n\n throw beta ? new NeedReinstallBetaError(message) : new NeedReinstallError(message);\n }\n\n throw error;\n });\n\n if (aigne) {\n return { aigne, version: check.version, isCache: true };\n }\n }\n }\n\n if (!options.install) return null;\n\n const result = await installApp({ dir, packageName, beta });\n\n return {\n aigne: await loadAIGNE({\n ...options,\n path: dir,\n metadata: {\n appName: packageName,\n appVersion: result.version,\n },\n }),\n version: result.version,\n };\n}\n\nexport async function getNpmTgzInfo(\n name: string,\n { version, beta }: { version?: string; beta?: boolean } = {},\n): Promise<{ version: string; url: string }> {\n const res = await fetch(joinURL(\"https://registry.npmjs.org\", name));\n const data = await res.json();\n\n let targetVersion: string;\n\n if (version) {\n if (!data.versions[version]) {\n throw new Error(`Version ${version} of package ${name} not found`);\n }\n targetVersion = version;\n } else if (beta && data[\"dist-tags\"].beta) {\n // Use beta version if available and beta flag is set\n targetVersion = data[\"dist-tags\"].beta;\n } else {\n // Fall back to latest version\n targetVersion = data[\"dist-tags\"].latest;\n }\n\n const url = data.versions[targetVersion].dist.tarball;\n\n return {\n version: targetVersion,\n url,\n };\n}\n\ninterface InstallationMetadata {\n installedAt?: number;\n}\n\nasync function readInstallationMetadata(dir: string): Promise<InstallationMetadata | undefined> {\n return safeParseJSON<InstallationMetadata>(\n await readFile(join(dir, \".aigne-cli.json\"), \"utf-8\").catch(() => \"{}\"),\n );\n}\n\nasync function writeInstallationMetadata(dir: string, metadata: InstallationMetadata) {\n await writeFile(join(dir, \".aigne-cli.json\"), JSON.stringify(metadata, null, 2));\n}\n\nasync function checkInstallation(\n dir: string,\n { cacheTimeMs = NPM_PACKAGE_CACHE_TIME_MS }: { cacheTimeMs?: number } = {},\n): Promise<{ version: string; expired: boolean } | null> {\n const s = await stat(join(dir, \"package.json\")).catch(() => null);\n\n if (!s) return null;\n\n const version = safeParseJSON<{ version: string }>(\n await readFile(join(dir, \"package.json\"), \"utf-8\"),\n )?.version;\n if (!version) return null;\n\n const installedAt = (await readInstallationMetadata(dir))?.installedAt;\n\n if (!installedAt) return null;\n\n const now = Date.now();\n const expired = now - installedAt > cacheTimeMs;\n\n return { version, expired };\n}\n\nexport async function installApp({\n dir,\n packageName,\n beta,\n version,\n}: {\n dir: string;\n packageName: string;\n beta?: boolean;\n version?: string;\n}) {\n return await new Listr<{ url: string; version: string }>(\n [\n {\n title: `Fetching ${packageName} metadata`,\n task: async (ctx, task) => {\n if (beta) {\n task.title = `Fetching ${packageName} metadata (using beta version)`;\n }\n\n const info = await getNpmTgzInfo(packageName, { beta, version });\n Object.assign(ctx, info);\n },\n },\n {\n title: `Downloading ${packageName}`,\n task: async (ctx, task) => {\n task.title = `Downloading ${packageName} (v${ctx.version})`;\n\n await mkdir(dir, { recursive: true });\n\n await downloadAndExtract(ctx.url, dir, { strip: 1 });\n },\n },\n {\n title: \"Installing dependencies\",\n task: async (_, task) => {\n await installDependencies(dir, {\n log: (log) => {\n const last = log.split(\"\\n\").findLast((i) => !!i);\n if (last) task.output = last;\n },\n });\n\n await writeInstallationMetadata(dir, { installedAt: Date.now() });\n },\n },\n ],\n {\n rendererOptions: {\n collapseSubtasks: false,\n showErrorMessage: false,\n timer: PRESET_TIMER,\n },\n },\n ).run();\n}\n\nasync function installDependencies(dir: string, { log }: { log?: (log: string) => void } = {}) {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"npm\", [\"install\", \"--omit\", \"dev\", \"--verbose\", \"--legacy-peer-deps\"], {\n cwd: dir,\n stdio: \"pipe\",\n shell: process.platform === \"win32\",\n });\n\n child.stdout.on(\"data\", (data) => {\n log?.(data.toString());\n });\n\n let stderr = \"\";\n child.stderr.on(\"data\", (data) => {\n const str = data.toString();\n log?.(str);\n stderr += str;\n });\n\n child.on(\"error\", (error) => reject(error));\n\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else {\n console.error(stderr);\n reject(new Error(`npm install failed with code ${code}`));\n }\n });\n });\n}\n\nfunction safeParseJSON<T>(raw: string): T | undefined {\n try {\n return JSON.parse(raw) as T;\n } catch {}\n}\n"],"mappings":"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"}