@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,332 @@
1
+ import { AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE } from "../constants.mjs";
2
+ import { terminalInput } from "../ui/utils/terminal-input.mjs";
3
+ import checkbox_default from "../utils/inquirer/checkbox.mjs";
4
+ import { AIGNEListr, AIGNEListrRenderer } from "../utils/listr.mjs";
5
+ import { highlightUrl } from "../utils/string-utils.mjs";
6
+ import { parseDuration } from "../utils/time.mjs";
7
+ import chalk from "chalk";
8
+ import { figures } from "@aigne/listr2";
9
+ import { withProtocol } from "ufo";
10
+ import { AIAgent, ChatModel, DEFAULT_OUTPUT_FILE_KEY, DEFAULT_OUTPUT_KEY, UserAgent, mergeContextUsage, newEmptyContextUsage } from "@aigne/core";
11
+ import { flat, omit } from "@aigne/core/utils/type-utils";
12
+ import { EOL } from "node:os";
13
+ import * as prompts from "@inquirer/prompts";
14
+ import { inspect } from "node:util";
15
+ import { promiseWithResolvers } from "@aigne/core/utils/promise";
16
+ import { markedTerminal } from "@aigne/marked-terminal";
17
+ import { Marked } from "marked";
18
+ import terminalImage from "terminal-image";
19
+ import terminalLink from "terminal-link";
20
+
21
+ //#region src/tracer/terminal.ts
22
+ const CREDITS_ERROR_PROCESSED_FLAG = "$credits_error_processed";
23
+ var TerminalTracer = class {
24
+ constructor(context, options = {}) {
25
+ this.context = context;
26
+ this.options = options;
27
+ }
28
+ tasks = {};
29
+ async run(agent, input$1, options) {
30
+ await this.context.observer?.serve();
31
+ const context = this.context.newContext({ reset: true });
32
+ const listr = new AIGNEListr({
33
+ formatRequest: (options$1) => this.formatRequest(agent, context, input$1, options$1),
34
+ formatResult: (result, options$1) => this.formatResult(agent, context, result, options$1)
35
+ }, [], {
36
+ concurrent: true,
37
+ exitOnError: false,
38
+ registerSignalListeners: false
39
+ });
40
+ this.listr = listr;
41
+ const collapsedMap = /* @__PURE__ */ new Map();
42
+ const hideContextIds = /* @__PURE__ */ new Set();
43
+ const onStart = async ({ context: context$1, agent: agent$1, ...event }) => {
44
+ const result = { options: { prompts: this.proxiedPrompts } };
45
+ if (agent$1 instanceof UserAgent) return result;
46
+ if (agent$1.taskRenderMode === "hide") {
47
+ hideContextIds.add(context$1.id);
48
+ return result;
49
+ }
50
+ if (agent$1.taskRenderMode === "collapse") collapsedMap.set(context$1.id, {
51
+ ancestor: { contextId: context$1.id },
52
+ usage: newEmptyContextUsage(),
53
+ models: /* @__PURE__ */ new Set()
54
+ });
55
+ if (context$1.parentId) {
56
+ if (hideContextIds.has(context$1.parentId)) {
57
+ hideContextIds.add(context$1.id);
58
+ return result;
59
+ }
60
+ const collapsed = collapsedMap.get(context$1.parentId);
61
+ if (collapsed) {
62
+ collapsedMap.set(context$1.id, collapsed);
63
+ return result;
64
+ }
65
+ }
66
+ const contextId = context$1.id;
67
+ const parentContextId = context$1.parentId;
68
+ const task = {
69
+ ...promiseWithResolvers(),
70
+ agent: agent$1,
71
+ input: event.input,
72
+ listr: promiseWithResolvers(),
73
+ startTime: Date.now()
74
+ };
75
+ this.tasks[contextId] = task;
76
+ const listrTask = {
77
+ title: await this.formatTaskTitle(agent$1, { ...event }),
78
+ task: (ctx, taskWrapper) => {
79
+ const subtask = taskWrapper.newListr([{ task: () => task.promise }]);
80
+ task.listr.resolve({
81
+ subtask,
82
+ taskWrapper,
83
+ ctx
84
+ });
85
+ return subtask;
86
+ },
87
+ rendererOptions: {
88
+ persistentOutput: true,
89
+ outputBar: Number.POSITIVE_INFINITY,
90
+ bottomBar: Number.POSITIVE_INFINITY
91
+ }
92
+ };
93
+ const parentTask = parentContextId ? this.tasks[parentContextId] : void 0;
94
+ if (parentTask) parentTask.listr.promise.then(({ subtask }) => {
95
+ subtask.add(listrTask);
96
+ });
97
+ else listr.add(listrTask);
98
+ return result;
99
+ };
100
+ const onSuccess = async ({ context: context$1, agent: agent$1, output, ...event }) => {
101
+ const contextId = context$1.id;
102
+ const parentContextId = context$1.parentId;
103
+ const collapsed = collapsedMap.get(contextId);
104
+ if (collapsed) {
105
+ if (agent$1 instanceof ChatModel) {
106
+ const { usage, model } = output;
107
+ if (usage) mergeContextUsage(collapsed.usage, usage);
108
+ if (model) collapsed.models.add(model);
109
+ }
110
+ const task$1 = this.tasks[collapsed.ancestor.contextId];
111
+ if (task$1) {
112
+ task$1.usage = collapsed.usage;
113
+ task$1.extraTitleMetadata ??= {};
114
+ if (collapsed.models.size) task$1.extraTitleMetadata.model = [...collapsed.models].join(",");
115
+ const { taskWrapper: taskWrapper$1 } = await task$1.listr.promise;
116
+ taskWrapper$1.title = await this.formatTaskTitle(task$1.agent, {
117
+ input: task$1.input,
118
+ task: task$1,
119
+ usage: Boolean(task$1.usage.inputTokens || task$1.usage.outputTokens || task$1.usage.aigneHubCredits || task$1.usage.cacheCreationInputTokens || task$1.usage.cacheReadInputTokens),
120
+ time: context$1.id === collapsed.ancestor.contextId
121
+ });
122
+ if (context$1.id === collapsed.ancestor.contextId) task$1?.resolve();
123
+ return;
124
+ }
125
+ }
126
+ const task = this.tasks[contextId];
127
+ if (!task) return;
128
+ task.endTime = Date.now();
129
+ const { taskWrapper, ctx } = await task.listr.promise;
130
+ if (agent$1 instanceof ChatModel) {
131
+ const { usage, model } = output;
132
+ task.usage = usage;
133
+ task.extraTitleMetadata ??= {};
134
+ if (model) task.extraTitleMetadata.model = model;
135
+ }
136
+ taskWrapper.title = await this.formatTaskTitle(agent$1, {
137
+ ...event,
138
+ task,
139
+ usage: true,
140
+ time: true
141
+ });
142
+ if (!parentContextId || !this.tasks[parentContextId]) Object.assign(ctx, output);
143
+ task.resolve();
144
+ };
145
+ let retryPromptPromise;
146
+ const onError = async ({ context: context$1, agent: agent$1, error, ...event }) => {
147
+ if ("type" in error && error.type === AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE) {
148
+ if (!Object.hasOwn(error, CREDITS_ERROR_PROCESSED_FLAG)) {
149
+ Object.defineProperty(error, CREDITS_ERROR_PROCESSED_FLAG, {
150
+ value: true,
151
+ enumerable: false
152
+ });
153
+ const retry = await this.promptBuyCredits(error);
154
+ console.log("");
155
+ if (retry === "retry") return { retry: true };
156
+ }
157
+ }
158
+ if (agent$1 instanceof ChatModel) {
159
+ retryPromptPromise ??= this.proxiedPrompts.select({
160
+ message: chalk.red(`Error: ${error.message}`),
161
+ choices: [{
162
+ value: "retry",
163
+ name: "Retry"
164
+ }, {
165
+ value: "exit",
166
+ name: "Exit"
167
+ }]
168
+ }).then((result) => ({ retry: result === "retry" })).finally(() => {
169
+ retryPromptPromise = void 0;
170
+ });
171
+ const { retry } = await retryPromptPromise;
172
+ if (retry) return { retry: true };
173
+ }
174
+ const contextId = context$1.id;
175
+ const task = this.tasks[contextId];
176
+ if (!task) return;
177
+ task.endTime = Date.now();
178
+ const { taskWrapper } = await task.listr.promise;
179
+ taskWrapper.title = await this.formatTaskTitle(agent$1, {
180
+ ...event,
181
+ task,
182
+ usage: true,
183
+ time: true
184
+ });
185
+ task.reject(error);
186
+ };
187
+ return {
188
+ result: await listr.run(() => context.invoke(agent, input$1, {
189
+ ...options,
190
+ hooks: flat({
191
+ priority: "high",
192
+ onStart,
193
+ onSuccess,
194
+ onError
195
+ }, options?.hooks),
196
+ streaming: true,
197
+ newContext: false
198
+ })),
199
+ context
200
+ };
201
+ }
202
+ listr;
203
+ proxiedPrompts = new Proxy({}, { get: (_target, prop) => {
204
+ const method = prop === "checkbox" ? checkbox_default : prop === "input" ? terminalInput : prompts[prop];
205
+ if (typeof method !== "function") throw new Error(`Unsupported prompt method ${String(prop)}`);
206
+ return async (config) => {
207
+ const renderer = this.listr?.["renderer"] instanceof AIGNEListrRenderer ? this.listr["renderer"] : void 0;
208
+ await renderer?.pause();
209
+ try {
210
+ return await method({ ...config });
211
+ } finally {
212
+ await renderer?.resume();
213
+ }
214
+ };
215
+ } });
216
+ buyCreditsPromptPromise;
217
+ async promptBuyCredits(error) {
218
+ this.buyCreditsPromptPromise ??= (async () => {
219
+ return await this.proxiedPrompts.select({
220
+ message: highlightUrl(error.message),
221
+ choices: [{
222
+ name: "I have bought some credits, try again",
223
+ value: "retry"
224
+ }, {
225
+ name: "Exit",
226
+ value: "exit"
227
+ }]
228
+ });
229
+ })();
230
+ return this.buyCreditsPromptPromise.catch(() => "exit").finally(() => {
231
+ this.buyCreditsPromptPromise = void 0;
232
+ });
233
+ }
234
+ formatAigneHubCredits(credits, creditPrefix) {
235
+ const formattedCredits = credits % 1 !== 0 ? parseFloat(credits.toFixed(6)).toString() : credits.toFixed();
236
+ if (creditPrefix) return [chalk.grey("cost:"), chalk.blue(`${creditPrefix}${formattedCredits}`)];
237
+ return [chalk.blue(formattedCredits), chalk.grey("AIGNE Hub credits")];
238
+ }
239
+ formatTokenUsage(usage, extra) {
240
+ const content = [
241
+ [chalk.yellow(usage.inputTokens), chalk.grey("input tokens")],
242
+ usage.cacheReadInputTokens ? [chalk.green(usage.cacheReadInputTokens), chalk.grey("cached")] : void 0,
243
+ usage.cacheCreationInputTokens ? [chalk.yellow(usage.cacheCreationInputTokens), chalk.grey("cache write")] : void 0,
244
+ [chalk.cyan(usage.outputTokens), chalk.grey("output tokens")],
245
+ usage.aigneHubCredits ? this.formatAigneHubCredits(usage.aigneHubCredits, usage.creditPrefix) : void 0,
246
+ usage.agentCalls ? [chalk.magenta(usage.agentCalls), chalk.grey("agent calls")] : void 0
247
+ ].filter((i) => !!i).map((i) => i.join(" "));
248
+ if (extra) content.unshift(...Object.entries(extra).filter(([k, v]) => k && v).map(([k, v]) => `${chalk.grey(k)}: ${v}`));
249
+ return `${chalk.grey("(")}${content.join(chalk.green(", "))}${chalk.grey(")")}`;
250
+ }
251
+ formatTimeUsage(startTime, endTime) {
252
+ const duration = endTime - startTime;
253
+ return chalk.grey(`[${parseDuration(duration)}]`);
254
+ }
255
+ async formatTaskTitle(agent, { task, usage, time, input: input$1 }) {
256
+ let title = agent.name;
257
+ if (agent.taskTitle) title += ` ${chalk.cyan(await agent.renderTaskTitle(input$1))}`;
258
+ if (usage && task?.usage) title += ` ${this.formatTokenUsage(task.usage, task.extraTitleMetadata)}`;
259
+ if (time && task?.startTime && task.endTime) title += ` ${this.formatTimeUsage(task.startTime, task.endTime)}`;
260
+ return title;
261
+ }
262
+ marked = new Marked().use({ walkTokens: (token) => {
263
+ if (token.type === "code") {
264
+ if (typeof token.lang === "string") token.lang = token.lang.trim().split(/\s+/)[0];
265
+ }
266
+ } }, markedTerminal({ forceHyperLink: false }, { theme: { string: chalk.green } }));
267
+ get outputKey() {
268
+ return this.options.outputKey || DEFAULT_OUTPUT_KEY;
269
+ }
270
+ get outputFileKey() {
271
+ return this.options.outputFileKey || DEFAULT_OUTPUT_FILE_KEY;
272
+ }
273
+ formatRequest(agent, _context, m = {}, { running = false } = {}) {
274
+ const prefix = `${chalk.grey(figures.pointer)} 💬 `;
275
+ const inputKey = agent instanceof AIAgent ? agent.inputKey : void 0;
276
+ const msg = inputKey ? m[inputKey] : void 0;
277
+ const message = inputKey ? omit(m, inputKey) : m;
278
+ const r = [msg && typeof msg === "string" ? this.marked.parse(msg, { async: false }).trim() : void 0, Object.keys(message).length > 0 ? inspect(message, {
279
+ colors: true,
280
+ ...running ? this.runningInspectOptions : void 0
281
+ }) : void 0].filter(Boolean).join(EOL).trim();
282
+ if (!r) return void 0;
283
+ return `${prefix}${r}`;
284
+ }
285
+ formatResult(agent, context, m = {}, { running = false, renderImage = false } = {}) {
286
+ const { isTTY } = process.stdout;
287
+ const outputKey = this.outputKey || (agent instanceof AIAgent ? agent.outputKey : void 0);
288
+ const prefix = `${chalk.grey(figures.tick)} 🤖 ${this.formatTokenUsage(context.usage)}`;
289
+ const msg = outputKey ? m[outputKey] : void 0;
290
+ const message = outputKey ? omit(m, outputKey, this.outputFileKey) : m;
291
+ const text = msg && typeof msg === "string" ? isTTY ? this.marked.parse(msg, { async: false }).trim() : msg : void 0;
292
+ const json = Object.keys(message).length > 0 ? inspect(message, {
293
+ colors: isTTY,
294
+ ...running ? this.runningInspectOptions : void 0
295
+ }) : void 0;
296
+ if (renderImage) return this.formatResultData(m).then((images) => {
297
+ return [
298
+ prefix,
299
+ text,
300
+ images,
301
+ json
302
+ ].filter(Boolean).join(EOL.repeat(2));
303
+ });
304
+ return [
305
+ prefix,
306
+ text,
307
+ json
308
+ ].filter(Boolean).join(EOL.repeat(2));
309
+ }
310
+ async formatResultData(output) {
311
+ const files = output[this.outputFileKey];
312
+ if (!Array.isArray(files)) return;
313
+ const options = { height: 30 };
314
+ return (await Promise.all(files.map(async (item) => {
315
+ const image = item.type === "local" ? await terminalImage.file(item.path, options) : item.type === "file" ? await terminalImage.buffer(Buffer.from(item.data, "base64"), options) : void 0;
316
+ const link = item.type === "local" ? withProtocol(item.path, "file://") : item.type === "url" ? item.url : void 0;
317
+ return [image, [
318
+ link ? chalk.cyan(terminalLink(link, link)) : void 0,
319
+ item.filename,
320
+ item.mimeType ? chalk.gray(item.mimeType) : void 0
321
+ ].filter(Boolean).join(" ")].filter(Boolean).join(EOL);
322
+ }))).filter(Boolean).join(EOL);
323
+ }
324
+ runningInspectOptions = {
325
+ maxArrayLength: 3,
326
+ maxStringLength: 200
327
+ };
328
+ };
329
+
330
+ //#endregion
331
+ export { TerminalTracer };
332
+ //# sourceMappingURL=terminal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.mjs","names":["input","options","agent","context","task","checkbox"],"sources":["../../src/tracer/terminal.ts"],"sourcesContent":["import { EOL } from \"node:os\";\nimport { type InspectOptions, inspect } from \"node:util\";\nimport {\n type Agent,\n type AgentHooks,\n AIAgent,\n ChatModel,\n type ChatModelOutput,\n type Context,\n type ContextUsage,\n DEFAULT_OUTPUT_FILE_KEY,\n DEFAULT_OUTPUT_KEY,\n type FileUnionContent,\n type InvokeOptions,\n type Message,\n mergeContextUsage,\n newEmptyContextUsage,\n UserAgent,\n} from \"@aigne/core\";\nimport { promiseWithResolvers } from \"@aigne/core/utils/promise\";\nimport { flat, omit } from \"@aigne/core/utils/type-utils\";\nimport { figures, type Listr } from \"@aigne/listr2\";\nimport { markedTerminal } from \"@aigne/marked-terminal\";\nimport * as prompts from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { Marked } from \"marked\";\nimport terminalImage from \"terminal-image\";\nimport terminalLink from \"terminal-link\";\nimport { withProtocol } from \"ufo\";\nimport { AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE } from \"../constants.js\";\nimport { terminalInput } from \"../ui/utils/terminal-input.js\";\nimport checkbox from \"../utils/inquirer/checkbox.js\";\nimport { AIGNEListr, AIGNEListrRenderer, type AIGNEListrTaskWrapper } from \"../utils/listr.js\";\nimport { highlightUrl } from \"../utils/string-utils.js\";\nimport { parseDuration } from \"../utils/time.js\";\n\nconst CREDITS_ERROR_PROCESSED_FLAG = \"$credits_error_processed\";\n\nexport interface TerminalTracerOptions {\n outputKey?: string;\n outputFileKey?: string;\n}\n\nexport class TerminalTracer {\n constructor(\n public readonly context: Context,\n public readonly options: TerminalTracerOptions = {},\n ) {}\n\n private tasks: { [callId: string]: Task } = {};\n\n async run(agent: Agent, input: Message, options?: InvokeOptions) {\n await this.context.observer?.serve();\n\n const context = this.context.newContext({ reset: true });\n\n const listr = new AIGNEListr(\n {\n formatRequest: (options?: { running?: boolean }) =>\n this.formatRequest(agent, context, input, options),\n formatResult: (result, options?: { running?: boolean; renderImage?: boolean }) =>\n this.formatResult(agent, context, result, options),\n },\n [],\n { concurrent: true, exitOnError: false, registerSignalListeners: false },\n );\n this.listr = listr;\n\n const collapsedMap = new Map<\n string,\n { ancestor: { contextId: string }; usage: ContextUsage; models: Set<string> }\n >();\n const hideContextIds = new Set<string>();\n\n const onStart: AgentHooks[\"onStart\"] = async ({ context, agent, ...event }) => {\n const result = { options: { prompts: this.proxiedPrompts } };\n\n if (agent instanceof UserAgent) return result;\n\n if (agent.taskRenderMode === \"hide\") {\n hideContextIds.add(context.id);\n return result;\n }\n\n if (agent.taskRenderMode === \"collapse\") {\n collapsedMap.set(context.id, {\n ancestor: { contextId: context.id },\n usage: newEmptyContextUsage(),\n models: new Set(),\n });\n }\n\n if (context.parentId) {\n if (hideContextIds.has(context.parentId)) {\n hideContextIds.add(context.id);\n return result;\n }\n\n const collapsed = collapsedMap.get(context.parentId);\n if (collapsed) {\n collapsedMap.set(context.id, collapsed);\n return result;\n }\n }\n\n const contextId = context.id;\n const parentContextId = context.parentId;\n\n const task: Task = {\n ...promiseWithResolvers(),\n agent,\n input: event.input,\n listr: promiseWithResolvers(),\n startTime: Date.now(),\n };\n this.tasks[contextId] = task;\n\n const listrTask: Parameters<typeof listr.add>[0] = {\n title: await this.formatTaskTitle(agent, { ...event }),\n task: (ctx, taskWrapper) => {\n const subtask = taskWrapper.newListr([{ task: () => task.promise }]);\n task.listr.resolve({ subtask, taskWrapper, ctx });\n return subtask;\n },\n rendererOptions: {\n persistentOutput: true,\n outputBar: Number.POSITIVE_INFINITY,\n bottomBar: Number.POSITIVE_INFINITY,\n },\n };\n\n const parentTask = parentContextId ? this.tasks[parentContextId] : undefined;\n if (parentTask) {\n parentTask.listr.promise.then(({ subtask }) => {\n subtask.add(listrTask);\n });\n } else {\n listr.add(listrTask);\n }\n\n return result;\n };\n\n const onSuccess: AgentHooks[\"onSuccess\"] = async ({ context, agent, output, ...event }) => {\n const contextId = context.id;\n const parentContextId = context.parentId;\n\n const collapsed = collapsedMap.get(contextId);\n if (collapsed) {\n if (agent instanceof ChatModel) {\n const { usage, model } = output as ChatModelOutput;\n if (usage) mergeContextUsage(collapsed.usage, usage);\n if (model) collapsed.models.add(model);\n }\n\n const task = this.tasks[collapsed.ancestor.contextId];\n if (task) {\n task.usage = collapsed.usage;\n task.extraTitleMetadata ??= {};\n if (collapsed.models.size)\n task.extraTitleMetadata.model = [...collapsed.models].join(\",\");\n\n const { taskWrapper } = await task.listr.promise;\n\n taskWrapper.title = await this.formatTaskTitle(task.agent, {\n input: task.input,\n task,\n usage: Boolean(\n task.usage.inputTokens ||\n task.usage.outputTokens ||\n task.usage.aigneHubCredits ||\n task.usage.cacheCreationInputTokens ||\n task.usage.cacheReadInputTokens,\n ),\n time: context.id === collapsed.ancestor.contextId,\n });\n\n if (context.id === collapsed.ancestor.contextId) {\n task?.resolve();\n }\n return;\n }\n }\n\n const task = this.tasks[contextId];\n if (!task) return;\n\n task.endTime = Date.now();\n\n const { taskWrapper, ctx } = await task.listr.promise;\n\n if (agent instanceof ChatModel) {\n const { usage, model } = output as ChatModelOutput;\n task.usage = usage;\n task.extraTitleMetadata ??= {};\n if (model) task.extraTitleMetadata.model = model;\n }\n\n taskWrapper.title = await this.formatTaskTitle(agent, {\n ...event,\n task,\n usage: true,\n time: true,\n });\n\n if (!parentContextId || !this.tasks[parentContextId]) {\n Object.assign(ctx, output);\n }\n\n task.resolve();\n };\n\n let retryPromptPromise: Promise<{ retry?: boolean }> | undefined;\n\n const onError: AgentHooks[\"onError\"] = async ({ context, agent, error, ...event }) => {\n if (\"type\" in error && error.type === AIGNE_HUB_CREDITS_NOT_ENOUGH_ERROR_TYPE) {\n if (!Object.hasOwn(error, CREDITS_ERROR_PROCESSED_FLAG)) {\n Object.defineProperty(error, CREDITS_ERROR_PROCESSED_FLAG, {\n value: true,\n enumerable: false,\n });\n\n const retry = await this.promptBuyCredits(error);\n\n console.log(\"\");\n\n if (retry === \"retry\") {\n return { retry: true };\n }\n }\n }\n\n if (agent instanceof ChatModel) {\n retryPromptPromise ??= this.proxiedPrompts\n .select({\n message: chalk.red(`Error: ${error.message}`),\n choices: [\n { value: \"retry\", name: \"Retry\" },\n { value: \"exit\", name: \"Exit\" },\n ],\n })\n .then((result) => ({ retry: result === \"retry\" }))\n .finally(() => {\n retryPromptPromise = undefined;\n });\n\n const { retry } = await retryPromptPromise;\n if (retry) return { retry: true };\n }\n\n const contextId = context.id;\n\n const task = this.tasks[contextId];\n if (!task) return;\n\n task.endTime = Date.now();\n\n const { taskWrapper } = await task.listr.promise;\n taskWrapper.title = await this.formatTaskTitle(agent, {\n ...event,\n task,\n usage: true,\n time: true,\n });\n\n task.reject(error);\n };\n\n const result = await listr.run(() =>\n context.invoke(agent, input, {\n ...options,\n hooks: flat(\n {\n priority: \"high\",\n onStart,\n onSuccess,\n onError,\n },\n options?.hooks,\n ),\n streaming: true,\n newContext: false,\n }),\n );\n\n return { result, context };\n }\n\n private listr?: AIGNEListr;\n\n private proxiedPrompts = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method =\n prop === \"checkbox\"\n ? checkbox\n : prop === \"input\"\n ? terminalInput\n : // biome-ignore lint/performance/noDynamicNamespaceImportAccess: we need to access prompts dynamically\n (prompts[prop as keyof typeof prompts] as (...args: any[]) => any);\n if (typeof method !== \"function\")\n throw new Error(`Unsupported prompt method ${String(prop)}`);\n\n return async (config: any) => {\n const renderer =\n this.listr?.[\"renderer\"] instanceof AIGNEListrRenderer\n ? this.listr[\"renderer\"]\n : undefined;\n await renderer?.pause();\n\n try {\n return await method({ ...config });\n } finally {\n await renderer?.resume();\n }\n };\n },\n },\n ) as typeof prompts;\n\n private buyCreditsPromptPromise: Promise<\"retry\" | \"exit\"> | undefined;\n\n private async promptBuyCredits(error: Error) {\n // Avoid multiple agents asking for credits, we will only show the prompt once\n this.buyCreditsPromptPromise ??= (async () => {\n const retry = await this.proxiedPrompts.select({\n message: highlightUrl(error.message),\n choices: [\n {\n name: \"I have bought some credits, try again\",\n value: \"retry\" as const,\n },\n {\n name: \"Exit\",\n value: \"exit\" as const,\n },\n ],\n });\n\n return retry;\n })();\n\n return this.buyCreditsPromptPromise\n .catch(() => \"exit\")\n .finally(() => {\n // Clear the promise so that we can show the prompt again if needed\n this.buyCreditsPromptPromise = undefined;\n });\n }\n\n formatAigneHubCredits(credits: number, creditPrefix?: string): [string, string] {\n const hasDecimal = credits % 1 !== 0;\n const formattedCredits = hasDecimal\n ? parseFloat(credits.toFixed(6)).toString()\n : credits.toFixed();\n\n if (creditPrefix) {\n return [chalk.grey(\"cost:\"), chalk.blue(`${creditPrefix}${formattedCredits}`)];\n }\n\n return [chalk.blue(formattedCredits), chalk.grey(\"AIGNE Hub credits\")];\n }\n\n formatTokenUsage(usage: Partial<ContextUsage>, extra?: { [key: string]: string }) {\n const items = [\n [chalk.yellow(usage.inputTokens), chalk.grey(\"input tokens\")],\n usage.cacheReadInputTokens\n ? [chalk.green(usage.cacheReadInputTokens), chalk.grey(\"cached\")]\n : undefined,\n usage.cacheCreationInputTokens\n ? [chalk.yellow(usage.cacheCreationInputTokens), chalk.grey(\"cache write\")]\n : undefined,\n [chalk.cyan(usage.outputTokens), chalk.grey(\"output tokens\")],\n usage.aigneHubCredits\n ? this.formatAigneHubCredits(usage.aigneHubCredits, usage.creditPrefix)\n : undefined,\n usage.agentCalls ? [chalk.magenta(usage.agentCalls), chalk.grey(\"agent calls\")] : undefined,\n ];\n\n const content = items.filter((i) => !!i).map((i) => i.join(\" \"));\n\n if (extra) {\n content.unshift(\n ...Object.entries(extra)\n .filter(([k, v]) => k && v)\n .map(([k, v]) => `${chalk.grey(k)}: ${v}`),\n );\n }\n\n return `${chalk.grey(\"(\")}${content.join(chalk.green(\", \"))}${chalk.grey(\")\")}`;\n }\n\n formatTimeUsage(startTime: number, endTime: number) {\n const duration = endTime - startTime;\n return chalk.grey(`[${parseDuration(duration)}]`);\n }\n\n async formatTaskTitle(\n agent: Agent,\n { task, usage, time, input }: { task?: Task; usage?: boolean; time?: boolean; input: Message },\n ) {\n let title = agent.name;\n\n if (agent.taskTitle) {\n title += ` ${chalk.cyan(await agent.renderTaskTitle(input))}`;\n }\n\n if (usage && task?.usage)\n title += ` ${this.formatTokenUsage(task.usage, task.extraTitleMetadata)}`;\n if (time && task?.startTime && task.endTime)\n title += ` ${this.formatTimeUsage(task.startTime, task.endTime)}`;\n\n return title;\n }\n\n private marked = new Marked().use(\n {\n // marked-terminal does not support code block meta, so we need to strip it\n walkTokens: (token) => {\n if (token.type === \"code\") {\n if (typeof token.lang === \"string\") {\n token.lang = token.lang.trim().split(/\\s+/)[0];\n }\n }\n },\n },\n markedTerminal(\n { forceHyperLink: false },\n {\n theme: {\n string: chalk.green,\n },\n },\n ),\n );\n\n get outputKey() {\n return this.options.outputKey || DEFAULT_OUTPUT_KEY;\n }\n\n get outputFileKey() {\n return this.options.outputFileKey || DEFAULT_OUTPUT_FILE_KEY;\n }\n\n formatRequest(agent: Agent, _context: Context, m: Message = {}, { running = false } = {}) {\n const prefix = `${chalk.grey(figures.pointer)} 💬 `;\n\n const inputKey = agent instanceof AIAgent ? agent.inputKey : undefined;\n\n const msg = inputKey ? m[inputKey] : undefined;\n const message = inputKey ? omit(m, inputKey) : m;\n\n const text =\n msg && typeof msg === \"string\" ? this.marked.parse(msg, { async: false }).trim() : undefined;\n\n const json =\n Object.keys(message).length > 0\n ? inspect(message, { colors: true, ...(running ? this.runningInspectOptions : undefined) })\n : undefined;\n\n const r = [text, json].filter(Boolean).join(EOL).trim();\n if (!r) return undefined;\n\n return `${prefix}${r}`;\n }\n\n formatResult(\n agent: Agent,\n context: Context,\n m: Message = {},\n { running = false, renderImage = false } = {},\n ): string | Promise<string> {\n const { isTTY } = process.stdout;\n const outputKey = this.outputKey || (agent instanceof AIAgent ? agent.outputKey : undefined);\n\n const prefix = `${chalk.grey(figures.tick)} 🤖 ${this.formatTokenUsage(context.usage)}`;\n\n const msg = outputKey ? m[outputKey] : undefined;\n const message = outputKey ? omit(m, outputKey, this.outputFileKey) : m;\n\n const text =\n msg && typeof msg === \"string\"\n ? isTTY\n ? this.marked.parse(msg, { async: false }).trim()\n : msg\n : undefined;\n\n const json =\n Object.keys(message).length > 0\n ? inspect(message, { colors: isTTY, ...(running ? this.runningInspectOptions : undefined) })\n : undefined;\n\n if (renderImage) {\n return this.formatResultData(m).then((images) => {\n return [prefix, text, images, json].filter(Boolean).join(EOL.repeat(2));\n });\n }\n\n return [prefix, text, json].filter(Boolean).join(EOL.repeat(2));\n }\n\n async formatResultData(output: Message): Promise<string | undefined> {\n const files = output[this.outputFileKey] as FileUnionContent[];\n if (!Array.isArray(files)) return;\n\n const options: Parameters<typeof terminalImage.file>[1] = {\n height: 30,\n };\n\n return (\n await Promise.all(\n files.map(async (item) => {\n const image =\n item.type === \"local\"\n ? await terminalImage.file(item.path, options)\n : item.type === \"file\"\n ? await terminalImage.buffer(Buffer.from(item.data, \"base64\"), options)\n : undefined;\n\n const link =\n item.type === \"local\"\n ? withProtocol(item.path, \"file://\")\n : item.type === \"url\"\n ? item.url\n : undefined;\n const text = [\n link ? chalk.cyan(terminalLink(link, link)) : undefined,\n item.filename,\n item.mimeType ? chalk.gray(item.mimeType) : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return [image, text].filter(Boolean).join(EOL);\n }),\n )\n )\n .filter(Boolean)\n .join(EOL);\n }\n\n protected runningInspectOptions: InspectOptions = {\n maxArrayLength: 3,\n maxStringLength: 200,\n };\n}\n\ntype Task = ReturnType<typeof promiseWithResolvers<void>> & {\n listr: ReturnType<\n typeof promiseWithResolvers<{\n ctx: object;\n subtask: Listr;\n taskWrapper: AIGNEListrTaskWrapper;\n }>\n >;\n agent: Agent;\n input: Message;\n startTime?: number;\n endTime?: number;\n usage?: Partial<ContextUsage>;\n extraTitleMetadata?: { [key: string]: string };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,+BAA+B;AAOrC,IAAa,iBAAb,MAA4B;CAC1B,YACE,AAAgB,SAChB,AAAgB,UAAiC,EAAE,EACnD;EAFgB;EACA;;CAGlB,AAAQ,QAAoC,EAAE;CAE9C,MAAM,IAAI,OAAc,SAAgB,SAAyB;AAC/D,QAAM,KAAK,QAAQ,UAAU,OAAO;EAEpC,MAAM,UAAU,KAAK,QAAQ,WAAW,EAAE,OAAO,MAAM,CAAC;EAExD,MAAM,QAAQ,IAAI,WAChB;GACE,gBAAgB,cACd,KAAK,cAAc,OAAO,SAASA,SAAOC,UAAQ;GACpD,eAAe,QAAQ,cACrB,KAAK,aAAa,OAAO,SAAS,QAAQA,UAAQ;GACrD,EACD,EAAE,EACF;GAAE,YAAY;GAAM,aAAa;GAAO,yBAAyB;GAAO,CACzE;AACD,OAAK,QAAQ;EAEb,MAAM,+BAAe,IAAI,KAGtB;EACH,MAAM,iCAAiB,IAAI,KAAa;EAExC,MAAM,UAAiC,OAAO,EAAE,oBAAS,gBAAO,GAAG,YAAY;GAC7E,MAAM,SAAS,EAAE,SAAS,EAAE,SAAS,KAAK,gBAAgB,EAAE;AAE5D,OAAIC,mBAAiB,UAAW,QAAO;AAEvC,OAAIA,QAAM,mBAAmB,QAAQ;AACnC,mBAAe,IAAIC,UAAQ,GAAG;AAC9B,WAAO;;AAGT,OAAID,QAAM,mBAAmB,WAC3B,cAAa,IAAIC,UAAQ,IAAI;IAC3B,UAAU,EAAE,WAAWA,UAAQ,IAAI;IACnC,OAAO,sBAAsB;IAC7B,wBAAQ,IAAI,KAAK;IAClB,CAAC;AAGJ,OAAIA,UAAQ,UAAU;AACpB,QAAI,eAAe,IAAIA,UAAQ,SAAS,EAAE;AACxC,oBAAe,IAAIA,UAAQ,GAAG;AAC9B,YAAO;;IAGT,MAAM,YAAY,aAAa,IAAIA,UAAQ,SAAS;AACpD,QAAI,WAAW;AACb,kBAAa,IAAIA,UAAQ,IAAI,UAAU;AACvC,YAAO;;;GAIX,MAAM,YAAYA,UAAQ;GAC1B,MAAM,kBAAkBA,UAAQ;GAEhC,MAAM,OAAa;IACjB,GAAG,sBAAsB;IACzB;IACA,OAAO,MAAM;IACb,OAAO,sBAAsB;IAC7B,WAAW,KAAK,KAAK;IACtB;AACD,QAAK,MAAM,aAAa;GAExB,MAAM,YAA6C;IACjD,OAAO,MAAM,KAAK,gBAAgBD,SAAO,EAAE,GAAG,OAAO,CAAC;IACtD,OAAO,KAAK,gBAAgB;KAC1B,MAAM,UAAU,YAAY,SAAS,CAAC,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC;AACpE,UAAK,MAAM,QAAQ;MAAE;MAAS;MAAa;MAAK,CAAC;AACjD,YAAO;;IAET,iBAAiB;KACf,kBAAkB;KAClB,WAAW,OAAO;KAClB,WAAW,OAAO;KACnB;IACF;GAED,MAAM,aAAa,kBAAkB,KAAK,MAAM,mBAAmB;AACnE,OAAI,WACF,YAAW,MAAM,QAAQ,MAAM,EAAE,cAAc;AAC7C,YAAQ,IAAI,UAAU;KACtB;OAEF,OAAM,IAAI,UAAU;AAGtB,UAAO;;EAGT,MAAM,YAAqC,OAAO,EAAE,oBAAS,gBAAO,QAAQ,GAAG,YAAY;GACzF,MAAM,YAAYC,UAAQ;GAC1B,MAAM,kBAAkBA,UAAQ;GAEhC,MAAM,YAAY,aAAa,IAAI,UAAU;AAC7C,OAAI,WAAW;AACb,QAAID,mBAAiB,WAAW;KAC9B,MAAM,EAAE,OAAO,UAAU;AACzB,SAAI,MAAO,mBAAkB,UAAU,OAAO,MAAM;AACpD,SAAI,MAAO,WAAU,OAAO,IAAI,MAAM;;IAGxC,MAAME,SAAO,KAAK,MAAM,UAAU,SAAS;AAC3C,QAAIA,QAAM;AACR,YAAK,QAAQ,UAAU;AACvB,YAAK,uBAAuB,EAAE;AAC9B,SAAI,UAAU,OAAO,KACnB,QAAK,mBAAmB,QAAQ,CAAC,GAAG,UAAU,OAAO,CAAC,KAAK,IAAI;KAEjE,MAAM,EAAE,+BAAgB,MAAMA,OAAK,MAAM;AAEzC,mBAAY,QAAQ,MAAM,KAAK,gBAAgBA,OAAK,OAAO;MACzD,OAAOA,OAAK;MACZ;MACA,OAAO,QACLA,OAAK,MAAM,eACTA,OAAK,MAAM,gBACXA,OAAK,MAAM,mBACXA,OAAK,MAAM,4BACXA,OAAK,MAAM,qBACd;MACD,MAAMD,UAAQ,OAAO,UAAU,SAAS;MACzC,CAAC;AAEF,SAAIA,UAAQ,OAAO,UAAU,SAAS,UACpC,SAAM,SAAS;AAEjB;;;GAIJ,MAAM,OAAO,KAAK,MAAM;AACxB,OAAI,CAAC,KAAM;AAEX,QAAK,UAAU,KAAK,KAAK;GAEzB,MAAM,EAAE,aAAa,QAAQ,MAAM,KAAK,MAAM;AAE9C,OAAID,mBAAiB,WAAW;IAC9B,MAAM,EAAE,OAAO,UAAU;AACzB,SAAK,QAAQ;AACb,SAAK,uBAAuB,EAAE;AAC9B,QAAI,MAAO,MAAK,mBAAmB,QAAQ;;AAG7C,eAAY,QAAQ,MAAM,KAAK,gBAAgBA,SAAO;IACpD,GAAG;IACH;IACA,OAAO;IACP,MAAM;IACP,CAAC;AAEF,OAAI,CAAC,mBAAmB,CAAC,KAAK,MAAM,iBAClC,QAAO,OAAO,KAAK,OAAO;AAG5B,QAAK,SAAS;;EAGhB,IAAI;EAEJ,MAAM,UAAiC,OAAO,EAAE,oBAAS,gBAAO,OAAO,GAAG,YAAY;AACpF,OAAI,UAAU,SAAS,MAAM,SAAS,yCACpC;QAAI,CAAC,OAAO,OAAO,OAAO,6BAA6B,EAAE;AACvD,YAAO,eAAe,OAAO,8BAA8B;MACzD,OAAO;MACP,YAAY;MACb,CAAC;KAEF,MAAM,QAAQ,MAAM,KAAK,iBAAiB,MAAM;AAEhD,aAAQ,IAAI,GAAG;AAEf,SAAI,UAAU,QACZ,QAAO,EAAE,OAAO,MAAM;;;AAK5B,OAAIA,mBAAiB,WAAW;AAC9B,2BAAuB,KAAK,eACzB,OAAO;KACN,SAAS,MAAM,IAAI,UAAU,MAAM,UAAU;KAC7C,SAAS,CACP;MAAE,OAAO;MAAS,MAAM;MAAS,EACjC;MAAE,OAAO;MAAQ,MAAM;MAAQ,CAChC;KACF,CAAC,CACD,MAAM,YAAY,EAAE,OAAO,WAAW,SAAS,EAAE,CACjD,cAAc;AACb,0BAAqB;MACrB;IAEJ,MAAM,EAAE,UAAU,MAAM;AACxB,QAAI,MAAO,QAAO,EAAE,OAAO,MAAM;;GAGnC,MAAM,YAAYC,UAAQ;GAE1B,MAAM,OAAO,KAAK,MAAM;AACxB,OAAI,CAAC,KAAM;AAEX,QAAK,UAAU,KAAK,KAAK;GAEzB,MAAM,EAAE,gBAAgB,MAAM,KAAK,MAAM;AACzC,eAAY,QAAQ,MAAM,KAAK,gBAAgBD,SAAO;IACpD,GAAG;IACH;IACA,OAAO;IACP,MAAM;IACP,CAAC;AAEF,QAAK,OAAO,MAAM;;AAoBpB,SAAO;GAAE,QAjBM,MAAM,MAAM,UACzB,QAAQ,OAAO,OAAOF,SAAO;IAC3B,GAAG;IACH,OAAO,KACL;KACE,UAAU;KACV;KACA;KACA;KACD,EACD,SAAS,MACV;IACD,WAAW;IACX,YAAY;IACb,CAAC,CACH;GAEgB;GAAS;;CAG5B,AAAQ;CAER,AAAQ,iBAAiB,IAAI,MAC3B,EAAE,EACF,EACE,MAAM,SAAS,SAAS;EACtB,MAAM,SACJ,SAAS,aACLK,mBACA,SAAS,UACP,gBAEC,QAAQ;AACjB,MAAI,OAAO,WAAW,WACpB,OAAM,IAAI,MAAM,6BAA6B,OAAO,KAAK,GAAG;AAE9D,SAAO,OAAO,WAAgB;GAC5B,MAAM,WACJ,KAAK,QAAQ,uBAAuB,qBAChC,KAAK,MAAM,cACX;AACN,SAAM,UAAU,OAAO;AAEvB,OAAI;AACF,WAAO,MAAM,OAAO,EAAE,GAAG,QAAQ,CAAC;aAC1B;AACR,UAAM,UAAU,QAAQ;;;IAI/B,CACF;CAED,AAAQ;CAER,MAAc,iBAAiB,OAAc;AAE3C,OAAK,6BAA6B,YAAY;AAe5C,UAdc,MAAM,KAAK,eAAe,OAAO;IAC7C,SAAS,aAAa,MAAM,QAAQ;IACpC,SAAS,CACP;KACE,MAAM;KACN,OAAO;KACR,EACD;KACE,MAAM;KACN,OAAO;KACR,CACF;IACF,CAAC;MAGA;AAEJ,SAAO,KAAK,wBACT,YAAY,OAAO,CACnB,cAAc;AAEb,QAAK,0BAA0B;IAC/B;;CAGN,sBAAsB,SAAiB,cAAyC;EAE9E,MAAM,mBADa,UAAU,MAAM,IAE/B,WAAW,QAAQ,QAAQ,EAAE,CAAC,CAAC,UAAU,GACzC,QAAQ,SAAS;AAErB,MAAI,aACF,QAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,MAAM,KAAK,GAAG,eAAe,mBAAmB,CAAC;AAGhF,SAAO,CAAC,MAAM,KAAK,iBAAiB,EAAE,MAAM,KAAK,oBAAoB,CAAC;;CAGxE,iBAAiB,OAA8B,OAAmC;EAgBhF,MAAM,UAfQ;GACZ,CAAC,MAAM,OAAO,MAAM,YAAY,EAAE,MAAM,KAAK,eAAe,CAAC;GAC7D,MAAM,uBACF,CAAC,MAAM,MAAM,MAAM,qBAAqB,EAAE,MAAM,KAAK,SAAS,CAAC,GAC/D;GACJ,MAAM,2BACF,CAAC,MAAM,OAAO,MAAM,yBAAyB,EAAE,MAAM,KAAK,cAAc,CAAC,GACzE;GACJ,CAAC,MAAM,KAAK,MAAM,aAAa,EAAE,MAAM,KAAK,gBAAgB,CAAC;GAC7D,MAAM,kBACF,KAAK,sBAAsB,MAAM,iBAAiB,MAAM,aAAa,GACrE;GACJ,MAAM,aAAa,CAAC,MAAM,QAAQ,MAAM,WAAW,EAAE,MAAM,KAAK,cAAc,CAAC,GAAG;GACnF,CAEqB,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;AAEhE,MAAI,MACF,SAAQ,QACN,GAAG,OAAO,QAAQ,MAAM,CACrB,QAAQ,CAAC,GAAG,OAAO,KAAK,EAAE,CAC1B,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,IAAI,IAAI,CAC7C;AAGH,SAAO,GAAG,MAAM,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI;;CAG/E,gBAAgB,WAAmB,SAAiB;EAClD,MAAM,WAAW,UAAU;AAC3B,SAAO,MAAM,KAAK,IAAI,cAAc,SAAS,CAAC,GAAG;;CAGnD,MAAM,gBACJ,OACA,EAAE,MAAM,OAAO,MAAM,kBACrB;EACA,IAAI,QAAQ,MAAM;AAElB,MAAI,MAAM,UACR,UAAS,IAAI,MAAM,KAAK,MAAM,MAAM,gBAAgBL,QAAM,CAAC;AAG7D,MAAI,SAAS,MAAM,MACjB,UAAS,IAAI,KAAK,iBAAiB,KAAK,OAAO,KAAK,mBAAmB;AACzE,MAAI,QAAQ,MAAM,aAAa,KAAK,QAClC,UAAS,IAAI,KAAK,gBAAgB,KAAK,WAAW,KAAK,QAAQ;AAEjE,SAAO;;CAGT,AAAQ,SAAS,IAAI,QAAQ,CAAC,IAC5B,EAEE,aAAa,UAAU;AACrB,MAAI,MAAM,SAAS,QACjB;OAAI,OAAO,MAAM,SAAS,SACxB,OAAM,OAAO,MAAM,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC;;IAInD,EACD,eACE,EAAE,gBAAgB,OAAO,EACzB,EACE,OAAO,EACL,QAAQ,MAAM,OACf,EACF,CACF,CACF;CAED,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ,aAAa;;CAGnC,IAAI,gBAAgB;AAClB,SAAO,KAAK,QAAQ,iBAAiB;;CAGvC,cAAc,OAAc,UAAmB,IAAa,EAAE,EAAE,EAAE,UAAU,UAAU,EAAE,EAAE;EACxF,MAAM,SAAS,GAAG,MAAM,KAAK,QAAQ,QAAQ,CAAC;EAE9C,MAAM,WAAW,iBAAiB,UAAU,MAAM,WAAW;EAE7D,MAAM,MAAM,WAAW,EAAE,YAAY;EACrC,MAAM,UAAU,WAAW,KAAK,GAAG,SAAS,GAAG;EAU/C,MAAM,IAAI,CAPR,OAAO,OAAO,QAAQ,WAAW,KAAK,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC,MAAM,GAAG,QAGnF,OAAO,KAAK,QAAQ,CAAC,SAAS,IAC1B,QAAQ,SAAS;GAAE,QAAQ;GAAM,GAAI,UAAU,KAAK,wBAAwB;GAAY,CAAC,GACzF,OAEgB,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM;AACvD,MAAI,CAAC,EAAG,QAAO;AAEf,SAAO,GAAG,SAAS;;CAGrB,aACE,OACA,SACA,IAAa,EAAE,EACf,EAAE,UAAU,OAAO,cAAc,UAAU,EAAE,EACnB;EAC1B,MAAM,EAAE,UAAU,QAAQ;EAC1B,MAAM,YAAY,KAAK,cAAc,iBAAiB,UAAU,MAAM,YAAY;EAElF,MAAM,SAAS,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC,MAAM,KAAK,iBAAiB,QAAQ,MAAM;EAErF,MAAM,MAAM,YAAY,EAAE,aAAa;EACvC,MAAM,UAAU,YAAY,KAAK,GAAG,WAAW,KAAK,cAAc,GAAG;EAErE,MAAM,OACJ,OAAO,OAAO,QAAQ,WAClB,QACE,KAAK,OAAO,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,CAAC,MAAM,GAC/C,MACF;EAEN,MAAM,OACJ,OAAO,KAAK,QAAQ,CAAC,SAAS,IAC1B,QAAQ,SAAS;GAAE,QAAQ;GAAO,GAAI,UAAU,KAAK,wBAAwB;GAAY,CAAC,GAC1F;AAEN,MAAI,YACF,QAAO,KAAK,iBAAiB,EAAE,CAAC,MAAM,WAAW;AAC/C,UAAO;IAAC;IAAQ;IAAM;IAAQ;IAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;IACvE;AAGJ,SAAO;GAAC;GAAQ;GAAM;GAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;;CAGjE,MAAM,iBAAiB,QAA8C;EACnE,MAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,MAAM,QAAQ,MAAM,CAAE;EAE3B,MAAM,UAAoD,EACxD,QAAQ,IACT;AAED,UACE,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;GACxB,MAAM,QACJ,KAAK,SAAS,UACV,MAAM,cAAc,KAAK,KAAK,MAAM,QAAQ,GAC5C,KAAK,SAAS,SACZ,MAAM,cAAc,OAAO,OAAO,KAAK,KAAK,MAAM,SAAS,EAAE,QAAQ,GACrE;GAER,MAAM,OACJ,KAAK,SAAS,UACV,aAAa,KAAK,MAAM,UAAU,GAClC,KAAK,SAAS,QACZ,KAAK,MACL;AASR,UAAO,CAAC,OARK;IACX,OAAO,MAAM,KAAK,aAAa,MAAM,KAAK,CAAC,GAAG;IAC9C,KAAK;IACL,KAAK,WAAW,MAAM,KAAK,KAAK,SAAS,GAAG;IAC7C,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CAEQ,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;IAC9C,CACH,EAEA,OAAO,QAAQ,CACf,KAAK,IAAI;;CAGd,AAAU,wBAAwC;EAChD,gBAAgB;EAChB,iBAAiB;EAClB"}
package/dist/type.cjs ADDED
File without changes
@@ -0,0 +1,10 @@
1
+ import { AgentInvokeOptions as AgentInvokeOptions$1, UserContext } from "@aigne/core";
2
+ import * as prompts from "@inquirer/prompts";
3
+
4
+ //#region src/type.d.ts
5
+ interface AgentInvokeOptions<U extends UserContext = UserContext> extends AgentInvokeOptions$1<U> {
6
+ prompts: typeof prompts;
7
+ }
8
+ //#endregion
9
+ export { AgentInvokeOptions };
10
+ //# sourceMappingURL=type.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.cts","names":[],"sources":["../src/type.ts"],"mappings":";;;;UAGiB,kBAAA,WAA6B,WAAA,GAAc,WAAA,UAClD,oBAAA,CAAoB,CAAA;EAAA,OAAA,SACZ,OAAA;AAAA"}
@@ -0,0 +1,10 @@
1
+ import { AgentInvokeOptions as AgentInvokeOptions$1, UserContext } from "@aigne/core";
2
+ import * as prompts from "@inquirer/prompts";
3
+
4
+ //#region src/type.d.ts
5
+ interface AgentInvokeOptions<U extends UserContext = UserContext> extends AgentInvokeOptions$1<U> {
6
+ prompts: typeof prompts;
7
+ }
8
+ //#endregion
9
+ export { AgentInvokeOptions };
10
+ //# sourceMappingURL=type.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.mts","names":[],"sources":["../src/type.ts"],"mappings":";;;;UAGiB,kBAAA,WAA6B,WAAA,GAAc,WAAA,UAClD,oBAAA,CAAoB,CAAA;EAAA,OAAA,SACZ,OAAA;AAAA"}
package/dist/type.mjs ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,145 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_text_buffer = require('./text-buffer.cjs');
3
+ let chalk = require("chalk");
4
+ chalk = require_rolldown_runtime.__toESM(chalk);
5
+ let _inquirer_core = require("@inquirer/core");
6
+ let ink = require("ink");
7
+ let react = require("react");
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
+
10
+ //#region src/ui/utils/terminal-input.tsx
11
+ async function terminalInput({ render: r = ink.render, ...options } = {}) {
12
+ return new Promise((resolve, reject) => {
13
+ const handleSigInt = () => {
14
+ reject(/* @__PURE__ */ new Error("Input aborted"));
15
+ };
16
+ process.addListener("SIGINT", handleSigInt);
17
+ const clean = () => process.removeListener("SIGINT", handleSigInt);
18
+ const app = r(/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TerminalInput, {
19
+ ...options,
20
+ onSubmit: (value) => {
21
+ if (options.clear) app.clear();
22
+ app.unmount();
23
+ resolve(value);
24
+ clean();
25
+ },
26
+ onError: (error) => {
27
+ if (options.clear) app.clear();
28
+ app.unmount();
29
+ reject(error);
30
+ clean();
31
+ }
32
+ }), { exitOnCtrlC: false });
33
+ });
34
+ }
35
+ function TerminalInput(props) {
36
+ const buffer = require_text_buffer.useTextBuffer({
37
+ initialText: props.default || "",
38
+ initialCursorOffset: props.default?.length || 0,
39
+ isValidPath: () => false,
40
+ viewport: {
41
+ width: 80,
42
+ height: 1
43
+ }
44
+ });
45
+ const textRef = (0, react.useRef)(buffer.text);
46
+ textRef.current = buffer.text;
47
+ const [status, setStatus] = (0, react.useState)("input");
48
+ const [errorMessage, setErrorMessage] = (0, react.useState)();
49
+ (0, ink.useInput)((character, key) => {
50
+ if (character === "c" && key.ctrl) {
51
+ setStatus("error");
52
+ setTimeout(() => {
53
+ props.onError(new _inquirer_core.ExitPromptError("Input aborted by user"));
54
+ });
55
+ return;
56
+ }
57
+ if (key.return) {
58
+ const input = textRef.current || props.default || "";
59
+ setStatus("validating");
60
+ setErrorMessage(void 0);
61
+ const validateInput = async () => {
62
+ try {
63
+ if (props.required && !input.trim()) {
64
+ setErrorMessage("You must provide a value");
65
+ setStatus("input");
66
+ return;
67
+ }
68
+ if (props.validate) {
69
+ const result = await props.validate(input);
70
+ if (result !== true) {
71
+ setErrorMessage(typeof result === "string" ? result : "You must provide a valid value");
72
+ setStatus("input");
73
+ return;
74
+ }
75
+ }
76
+ setStatus("success");
77
+ setTimeout(() => {
78
+ props.onSubmit(input);
79
+ });
80
+ } catch (error) {
81
+ setErrorMessage(error instanceof Error ? error.message : "Validation error");
82
+ setStatus("input");
83
+ }
84
+ };
85
+ validateInput();
86
+ return;
87
+ } else if (key.backspace) buffer.backspace();
88
+ else if (key.delete) buffer.backspace();
89
+ else if (key.downArrow) buffer.move("down");
90
+ else if (key.upArrow) buffer.move("up");
91
+ else if (key.leftArrow) buffer.move("left");
92
+ else if (key.rightArrow) buffer.move("right");
93
+ else if (character === "a" && key.ctrl) buffer.move("home");
94
+ else if (character === "e" && key.ctrl) buffer.move("end");
95
+ else {
96
+ buffer.handleInput({
97
+ ...key,
98
+ name: character,
99
+ sequence: character,
100
+ paste: false
101
+ });
102
+ setErrorMessage(void 0);
103
+ }
104
+ });
105
+ const lines = [...buffer.lines];
106
+ if (status === "input") {
107
+ const [row, col] = buffer.cursor;
108
+ const currentLine = lines[row] || "";
109
+ lines[row] = currentLine.slice(0, col) + chalk.default.inverse(currentLine[col] || " ") + currentLine.slice(col + 1);
110
+ }
111
+ const label = props.message && chalk.default.bold(props.message);
112
+ const inline = props.inline !== false;
113
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Box, {
114
+ flexDirection: "column",
115
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Box, {
116
+ flexDirection: inline ? "row" : "column",
117
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Text, { children: [
118
+ PREFIX[status],
119
+ " ",
120
+ !inline && label
121
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Box, {
122
+ flexShrink: 1,
123
+ flexGrow: 1,
124
+ marginLeft: inline ? 0 : 2,
125
+ marginRight: 1,
126
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ink.Text, { children: [!!label && inline && `${label} `, lines.join("\n")] })
127
+ })]
128
+ }), errorMessage && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Box, {
129
+ marginLeft: 2,
130
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ink.Text, {
131
+ color: "red",
132
+ children: errorMessage
133
+ })
134
+ })]
135
+ });
136
+ }
137
+ const PREFIX = {
138
+ input: chalk.default.blue("?"),
139
+ validating: chalk.default.yellow("⋯"),
140
+ success: chalk.default.green("✔"),
141
+ error: chalk.default.red("✘")
142
+ };
143
+
144
+ //#endregion
145
+ exports.terminalInput = terminalInput;