@aigne/afs-cli 1.11.0-beta.1 → 1.11.0-beta.10

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 (348) hide show
  1. package/README.md +262 -15
  2. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  3. package/dist/_virtual/rolldown_runtime.mjs +7 -0
  4. package/dist/cli.cjs +40 -0
  5. package/dist/cli.d.cts +2 -0
  6. package/dist/cli.d.mts +2 -1
  7. package/dist/cli.mjs +36 -24
  8. package/dist/cli.mjs.map +1 -0
  9. package/dist/config/afs-loader.cjs +578 -0
  10. package/dist/config/afs-loader.d.cts +19 -0
  11. package/dist/config/afs-loader.d.cts.map +1 -0
  12. package/dist/config/afs-loader.d.mts +19 -0
  13. package/dist/config/afs-loader.d.mts.map +1 -0
  14. package/dist/config/afs-loader.mjs +576 -0
  15. package/dist/config/afs-loader.mjs.map +1 -0
  16. package/dist/config/env.cjs +46 -0
  17. package/dist/config/env.mjs +46 -0
  18. package/dist/config/env.mjs.map +1 -0
  19. package/dist/config/loader.cjs +219 -0
  20. package/dist/config/loader.mjs +217 -0
  21. package/dist/config/loader.mjs.map +1 -0
  22. package/dist/config/mount-commands.cjs +226 -0
  23. package/dist/config/mount-commands.d.cts +14 -0
  24. package/dist/config/mount-commands.d.cts.map +1 -0
  25. package/dist/config/mount-commands.d.mts +14 -0
  26. package/dist/config/mount-commands.d.mts.map +1 -0
  27. package/dist/config/mount-commands.mjs +220 -0
  28. package/dist/config/mount-commands.mjs.map +1 -0
  29. package/dist/config/schema.cjs +99 -0
  30. package/dist/config/schema.mjs +98 -0
  31. package/dist/config/schema.mjs.map +1 -0
  32. package/dist/core/commands/delete.cjs +41 -0
  33. package/dist/core/commands/delete.d.cts +18 -0
  34. package/dist/core/commands/delete.d.cts.map +1 -0
  35. package/dist/core/commands/delete.d.mts +18 -0
  36. package/dist/core/commands/delete.d.mts.map +1 -0
  37. package/dist/core/commands/delete.mjs +42 -0
  38. package/dist/core/commands/delete.mjs.map +1 -0
  39. package/dist/core/commands/exec.cjs +98 -0
  40. package/dist/core/commands/exec.d.cts +26 -0
  41. package/dist/core/commands/exec.d.cts.map +1 -0
  42. package/dist/core/commands/exec.d.mts +26 -0
  43. package/dist/core/commands/exec.d.mts.map +1 -0
  44. package/dist/core/commands/exec.mjs +99 -0
  45. package/dist/core/commands/exec.mjs.map +1 -0
  46. package/dist/core/commands/explain.cjs +278 -0
  47. package/dist/core/commands/explain.d.cts +25 -0
  48. package/dist/core/commands/explain.d.cts.map +1 -0
  49. package/dist/core/commands/explain.d.mts +25 -0
  50. package/dist/core/commands/explain.d.mts.map +1 -0
  51. package/dist/core/commands/explain.mjs +279 -0
  52. package/dist/core/commands/explain.mjs.map +1 -0
  53. package/dist/core/commands/explore.cjs +30 -0
  54. package/dist/core/commands/explore.d.mts +2 -0
  55. package/dist/core/commands/explore.mjs +31 -0
  56. package/dist/core/commands/explore.mjs.map +1 -0
  57. package/dist/core/commands/index.cjs +36 -0
  58. package/dist/core/commands/index.d.cts +21 -0
  59. package/dist/core/commands/index.d.cts.map +1 -0
  60. package/dist/core/commands/index.d.mts +24 -0
  61. package/dist/core/commands/index.d.mts.map +1 -0
  62. package/dist/core/commands/index.mjs +37 -0
  63. package/dist/core/commands/index.mjs.map +1 -0
  64. package/dist/core/commands/ls.cjs +57 -0
  65. package/dist/core/commands/ls.d.cts +21 -0
  66. package/dist/core/commands/ls.d.cts.map +1 -0
  67. package/dist/core/commands/ls.d.mts +21 -0
  68. package/dist/core/commands/ls.d.mts.map +1 -0
  69. package/dist/core/commands/ls.mjs +58 -0
  70. package/dist/core/commands/ls.mjs.map +1 -0
  71. package/dist/core/commands/mount.cjs +222 -0
  72. package/dist/core/commands/mount.d.cts +35 -0
  73. package/dist/core/commands/mount.d.cts.map +1 -0
  74. package/dist/core/commands/mount.d.mts +35 -0
  75. package/dist/core/commands/mount.d.mts.map +1 -0
  76. package/dist/core/commands/mount.mjs +223 -0
  77. package/dist/core/commands/mount.mjs.map +1 -0
  78. package/dist/core/commands/read.cjs +48 -0
  79. package/dist/core/commands/read.d.cts +17 -0
  80. package/dist/core/commands/read.d.cts.map +1 -0
  81. package/dist/core/commands/read.d.mts +17 -0
  82. package/dist/core/commands/read.d.mts.map +1 -0
  83. package/dist/core/commands/read.mjs +49 -0
  84. package/dist/core/commands/read.mjs.map +1 -0
  85. package/dist/core/commands/search.cjs +40 -0
  86. package/dist/core/commands/search.d.mts +2 -0
  87. package/dist/core/commands/search.mjs +41 -0
  88. package/dist/core/commands/search.mjs.map +1 -0
  89. package/dist/core/commands/serve.cjs +267 -0
  90. package/dist/core/commands/serve.d.mts +2 -0
  91. package/dist/core/commands/serve.mjs +267 -0
  92. package/dist/core/commands/serve.mjs.map +1 -0
  93. package/dist/core/commands/stat.cjs +53 -0
  94. package/dist/core/commands/stat.d.cts +17 -0
  95. package/dist/core/commands/stat.d.cts.map +1 -0
  96. package/dist/core/commands/stat.d.mts +17 -0
  97. package/dist/core/commands/stat.d.mts.map +1 -0
  98. package/dist/core/commands/stat.mjs +54 -0
  99. package/dist/core/commands/stat.mjs.map +1 -0
  100. package/dist/core/commands/types.cjs +18 -0
  101. package/dist/core/commands/types.d.cts +54 -0
  102. package/dist/core/commands/types.d.cts.map +1 -0
  103. package/dist/core/commands/types.d.mts +54 -0
  104. package/dist/core/commands/types.d.mts.map +1 -0
  105. package/dist/core/commands/types.mjs +19 -0
  106. package/dist/core/commands/types.mjs.map +1 -0
  107. package/dist/core/commands/write.cjs +70 -0
  108. package/dist/core/commands/write.d.cts +20 -0
  109. package/dist/core/commands/write.d.cts.map +1 -0
  110. package/dist/core/commands/write.d.mts +20 -0
  111. package/dist/core/commands/write.d.mts.map +1 -0
  112. package/dist/core/commands/write.mjs +71 -0
  113. package/dist/core/commands/write.mjs.map +1 -0
  114. package/dist/core/executor/index.cjs +196 -0
  115. package/dist/core/executor/index.d.cts +77 -0
  116. package/dist/core/executor/index.d.cts.map +1 -0
  117. package/dist/core/executor/index.d.mts +77 -0
  118. package/dist/core/executor/index.d.mts.map +1 -0
  119. package/dist/core/executor/index.mjs +195 -0
  120. package/dist/core/executor/index.mjs.map +1 -0
  121. package/dist/core/formatters/delete.cjs +37 -0
  122. package/dist/core/formatters/delete.d.cts +18 -0
  123. package/dist/core/formatters/delete.d.cts.map +1 -0
  124. package/dist/core/formatters/delete.d.mts +18 -0
  125. package/dist/core/formatters/delete.d.mts.map +1 -0
  126. package/dist/core/formatters/delete.mjs +37 -0
  127. package/dist/core/formatters/delete.mjs.map +1 -0
  128. package/dist/core/formatters/exec.cjs +60 -0
  129. package/dist/core/formatters/exec.d.cts +18 -0
  130. package/dist/core/formatters/exec.d.cts.map +1 -0
  131. package/dist/core/formatters/exec.d.mts +18 -0
  132. package/dist/core/formatters/exec.d.mts.map +1 -0
  133. package/dist/core/formatters/exec.mjs +60 -0
  134. package/dist/core/formatters/exec.mjs.map +1 -0
  135. package/dist/core/formatters/explain.cjs +99 -0
  136. package/dist/core/formatters/explain.d.cts +11 -0
  137. package/dist/core/formatters/explain.d.cts.map +1 -0
  138. package/dist/core/formatters/explain.d.mts +11 -0
  139. package/dist/core/formatters/explain.d.mts.map +1 -0
  140. package/dist/core/formatters/explain.mjs +98 -0
  141. package/dist/core/formatters/explain.mjs.map +1 -0
  142. package/dist/core/formatters/index.d.mts +9 -0
  143. package/dist/core/formatters/ls.cjs +179 -0
  144. package/dist/core/formatters/ls.d.cts +20 -0
  145. package/dist/core/formatters/ls.d.cts.map +1 -0
  146. package/dist/core/formatters/ls.d.mts +20 -0
  147. package/dist/core/formatters/ls.d.mts.map +1 -0
  148. package/dist/core/formatters/ls.mjs +179 -0
  149. package/dist/core/formatters/ls.mjs.map +1 -0
  150. package/dist/core/formatters/mount.cjs +55 -0
  151. package/dist/core/formatters/mount.d.cts +15 -0
  152. package/dist/core/formatters/mount.d.cts.map +1 -0
  153. package/dist/core/formatters/mount.d.mts +15 -0
  154. package/dist/core/formatters/mount.d.mts.map +1 -0
  155. package/dist/core/formatters/mount.mjs +55 -0
  156. package/dist/core/formatters/mount.mjs.map +1 -0
  157. package/dist/core/formatters/read.cjs +100 -0
  158. package/dist/core/formatters/read.d.cts +22 -0
  159. package/dist/core/formatters/read.d.cts.map +1 -0
  160. package/dist/core/formatters/read.d.mts +22 -0
  161. package/dist/core/formatters/read.d.mts.map +1 -0
  162. package/dist/core/formatters/read.mjs +100 -0
  163. package/dist/core/formatters/read.mjs.map +1 -0
  164. package/dist/core/formatters/search.cjs +44 -0
  165. package/dist/core/formatters/search.d.mts +1 -0
  166. package/dist/core/formatters/search.mjs +44 -0
  167. package/dist/core/formatters/search.mjs.map +1 -0
  168. package/dist/core/formatters/stat.cjs +155 -0
  169. package/dist/core/formatters/stat.d.cts +15 -0
  170. package/dist/core/formatters/stat.d.cts.map +1 -0
  171. package/dist/core/formatters/stat.d.mts +15 -0
  172. package/dist/core/formatters/stat.d.mts.map +1 -0
  173. package/dist/core/formatters/stat.mjs +155 -0
  174. package/dist/core/formatters/stat.mjs.map +1 -0
  175. package/dist/core/formatters/write.cjs +51 -0
  176. package/dist/core/formatters/write.d.cts +22 -0
  177. package/dist/core/formatters/write.d.cts.map +1 -0
  178. package/dist/core/formatters/write.d.mts +22 -0
  179. package/dist/core/formatters/write.d.mts.map +1 -0
  180. package/dist/core/formatters/write.mjs +51 -0
  181. package/dist/core/formatters/write.mjs.map +1 -0
  182. package/dist/core/helpers/exec-args.cjs +142 -0
  183. package/dist/core/helpers/exec-args.d.cts +46 -0
  184. package/dist/core/helpers/exec-args.d.cts.map +1 -0
  185. package/dist/core/helpers/exec-args.d.mts +46 -0
  186. package/dist/core/helpers/exec-args.d.mts.map +1 -0
  187. package/dist/core/helpers/exec-args.mjs +139 -0
  188. package/dist/core/helpers/exec-args.mjs.map +1 -0
  189. package/dist/core/helpers/stdin.cjs +41 -0
  190. package/dist/core/helpers/stdin.d.cts +15 -0
  191. package/dist/core/helpers/stdin.d.cts.map +1 -0
  192. package/dist/core/helpers/stdin.d.mts +15 -0
  193. package/dist/core/helpers/stdin.d.mts.map +1 -0
  194. package/dist/core/helpers/stdin.mjs +41 -0
  195. package/dist/core/helpers/stdin.mjs.map +1 -0
  196. package/dist/core/index.cjs +49 -0
  197. package/dist/core/index.d.cts +24 -0
  198. package/dist/core/index.d.mts +25 -0
  199. package/dist/core/index.mjs +24 -0
  200. package/dist/core/path-utils.cjs +1 -0
  201. package/dist/core/path-utils.mjs +3 -0
  202. package/dist/core/types.d.cts +24 -0
  203. package/dist/core/types.d.cts.map +1 -0
  204. package/dist/core/types.d.mts +24 -0
  205. package/dist/core/types.d.mts.map +1 -0
  206. package/dist/credential/auth-server.cjs +247 -0
  207. package/dist/credential/auth-server.mjs +247 -0
  208. package/dist/credential/auth-server.mjs.map +1 -0
  209. package/dist/credential/cli-auth-context.cjs +86 -0
  210. package/dist/credential/cli-auth-context.d.mts +1 -0
  211. package/dist/credential/cli-auth-context.mjs +86 -0
  212. package/dist/credential/cli-auth-context.mjs.map +1 -0
  213. package/dist/credential/index.cjs +5 -0
  214. package/dist/credential/index.d.mts +4 -0
  215. package/dist/credential/index.mjs +7 -0
  216. package/dist/credential/mcp-auth-context.cjs +186 -0
  217. package/dist/credential/mcp-auth-context.d.mts +1 -0
  218. package/dist/credential/mcp-auth-context.mjs +186 -0
  219. package/dist/credential/mcp-auth-context.mjs.map +1 -0
  220. package/dist/credential/resolver.cjs +127 -0
  221. package/dist/credential/resolver.d.mts +1 -0
  222. package/dist/credential/resolver.mjs +127 -0
  223. package/dist/credential/resolver.mjs.map +1 -0
  224. package/dist/credential/store.cjs +106 -0
  225. package/dist/credential/store.d.cts +30 -0
  226. package/dist/credential/store.d.cts.map +1 -0
  227. package/dist/credential/store.d.mts +30 -0
  228. package/dist/credential/store.d.mts.map +1 -0
  229. package/dist/credential/store.mjs +106 -0
  230. package/dist/credential/store.mjs.map +1 -0
  231. package/dist/errors.cjs +18 -0
  232. package/dist/errors.mjs +18 -0
  233. package/dist/errors.mjs.map +1 -0
  234. package/dist/explorer/actions.cjs +311 -0
  235. package/dist/explorer/actions.mjs +305 -0
  236. package/dist/explorer/actions.mjs.map +1 -0
  237. package/dist/explorer/components/dialog.cjs +508 -0
  238. package/dist/explorer/components/dialog.mjs +509 -0
  239. package/dist/explorer/components/dialog.mjs.map +1 -0
  240. package/dist/explorer/components/file-list.cjs +107 -0
  241. package/dist/explorer/components/file-list.mjs +107 -0
  242. package/dist/explorer/components/file-list.mjs.map +1 -0
  243. package/dist/explorer/components/function-bar.cjs +55 -0
  244. package/dist/explorer/components/function-bar.mjs +55 -0
  245. package/dist/explorer/components/function-bar.mjs.map +1 -0
  246. package/dist/explorer/components/index.cjs +5 -0
  247. package/dist/explorer/components/index.mjs +7 -0
  248. package/dist/explorer/components/metadata-panel.cjs +219 -0
  249. package/dist/explorer/components/metadata-panel.mjs +219 -0
  250. package/dist/explorer/components/metadata-panel.mjs.map +1 -0
  251. package/dist/explorer/components/status-bar.cjs +53 -0
  252. package/dist/explorer/components/status-bar.mjs +54 -0
  253. package/dist/explorer/components/status-bar.mjs.map +1 -0
  254. package/dist/explorer/keybindings.cjs +214 -0
  255. package/dist/explorer/keybindings.mjs +213 -0
  256. package/dist/explorer/keybindings.mjs.map +1 -0
  257. package/dist/explorer/screen.cjs +251 -0
  258. package/dist/explorer/screen.d.cts +23 -0
  259. package/dist/explorer/screen.d.cts.map +1 -0
  260. package/dist/explorer/screen.d.mts +23 -0
  261. package/dist/explorer/screen.d.mts.map +1 -0
  262. package/dist/explorer/screen.mjs +250 -0
  263. package/dist/explorer/screen.mjs.map +1 -0
  264. package/dist/explorer/state.cjs +53 -0
  265. package/dist/explorer/state.mjs +53 -0
  266. package/dist/explorer/state.mjs.map +1 -0
  267. package/dist/explorer/theme.cjs +160 -0
  268. package/dist/explorer/theme.mjs +157 -0
  269. package/dist/explorer/theme.mjs.map +1 -0
  270. package/dist/index.cjs +12 -0
  271. package/dist/index.d.cts +6 -0
  272. package/dist/index.d.mts +7 -4
  273. package/dist/index.mjs +7 -2
  274. package/dist/mcp/http-transport.cjs +87 -0
  275. package/dist/mcp/http-transport.mjs +87 -0
  276. package/dist/mcp/http-transport.mjs.map +1 -0
  277. package/dist/mcp/prompts.cjs +48 -0
  278. package/dist/mcp/prompts.mjs +48 -0
  279. package/dist/mcp/prompts.mjs.map +1 -0
  280. package/dist/mcp/resources.cjs +25 -0
  281. package/dist/mcp/resources.mjs +25 -0
  282. package/dist/mcp/resources.mjs.map +1 -0
  283. package/dist/mcp/server.cjs +74 -0
  284. package/dist/mcp/server.mjs +73 -0
  285. package/dist/mcp/server.mjs.map +1 -0
  286. package/dist/mcp/tools.cjs +152 -0
  287. package/dist/mcp/tools.mjs +152 -0
  288. package/dist/mcp/tools.mjs.map +1 -0
  289. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts +10 -0
  290. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts.map +1 -0
  291. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts +10 -0
  292. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts.map +1 -0
  293. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts +46 -0
  294. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts.map +1 -0
  295. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts +46 -0
  296. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts.map +1 -0
  297. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.cjs +902 -0
  298. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs +902 -0
  299. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs.map +1 -0
  300. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.cjs +6 -0
  301. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs +8 -0
  302. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs.map +1 -0
  303. package/dist/path-utils.cjs +105 -0
  304. package/dist/path-utils.d.cts +50 -0
  305. package/dist/path-utils.d.cts.map +1 -0
  306. package/dist/path-utils.d.mts +50 -0
  307. package/dist/path-utils.d.mts.map +1 -0
  308. package/dist/path-utils.mjs +104 -0
  309. package/dist/path-utils.mjs.map +1 -0
  310. package/dist/repl.cjs +491 -0
  311. package/dist/repl.d.cts +15 -0
  312. package/dist/repl.d.cts.map +1 -0
  313. package/dist/repl.d.mts +16 -0
  314. package/dist/repl.d.mts.map +1 -0
  315. package/dist/repl.mjs +491 -0
  316. package/dist/repl.mjs.map +1 -0
  317. package/dist/serve.cjs +146 -0
  318. package/dist/serve.d.cts +41 -0
  319. package/dist/serve.d.cts.map +1 -0
  320. package/dist/serve.d.mts +41 -0
  321. package/dist/serve.d.mts.map +1 -0
  322. package/dist/serve.mjs +146 -0
  323. package/dist/serve.mjs.map +1 -0
  324. package/dist/ui/header.cjs +12 -0
  325. package/dist/ui/header.mjs +13 -0
  326. package/dist/ui/header.mjs.map +1 -0
  327. package/dist/ui/index.cjs +8 -0
  328. package/dist/ui/index.mjs +9 -0
  329. package/dist/ui/index.mjs.map +1 -0
  330. package/dist/ui/terminal.cjs +88 -0
  331. package/dist/ui/terminal.mjs +88 -0
  332. package/dist/ui/terminal.mjs.map +1 -0
  333. package/dist/version.cjs +9 -0
  334. package/dist/version.d.cts +5 -0
  335. package/dist/version.d.cts.map +1 -0
  336. package/dist/version.d.mts +5 -0
  337. package/dist/version.d.mts.map +1 -0
  338. package/dist/version.mjs +9 -0
  339. package/dist/version.mjs.map +1 -0
  340. package/package.json +77 -11
  341. package/.turbo/turbo-build.log +0 -18
  342. package/.turbo/turbo-check-types.log +0 -4
  343. package/dist/version--p6A8sKX.mjs +0 -5
  344. package/src/cli.test.ts +0 -8
  345. package/src/cli.ts +0 -29
  346. package/src/index.ts +0 -7
  347. package/src/version.ts +0 -1
  348. package/tsconfig.json +0 -16
@@ -0,0 +1,98 @@
1
+ import { AFSPathError, validatePath } from "@aigne/afs";
2
+ import { z } from "zod";
3
+
4
+ //#region src/config/schema.ts
5
+ /**
6
+ * Characters forbidden in namespace names (security-sensitive)
7
+ */
8
+ const NAMESPACE_FORBIDDEN_CHARS = [
9
+ "/",
10
+ "\\",
11
+ ":",
12
+ ";",
13
+ "|",
14
+ "&",
15
+ "`",
16
+ "$",
17
+ "(",
18
+ ")",
19
+ ">",
20
+ "<",
21
+ "\n",
22
+ "\r",
23
+ " ",
24
+ "\0"
25
+ ];
26
+ /**
27
+ * Validate namespace name
28
+ */
29
+ function validateNamespace(namespace) {
30
+ if (!namespace || namespace.trim() === "") throw new Error("Namespace cannot be empty or whitespace-only");
31
+ for (const char of NAMESPACE_FORBIDDEN_CHARS) if (namespace.includes(char)) throw new Error(`Namespace contains forbidden character: '${char}'`);
32
+ return namespace;
33
+ }
34
+ /**
35
+ * Mount configuration schema
36
+ */
37
+ const MountSchema = z.object({
38
+ path: z.string().transform((val, ctx) => {
39
+ try {
40
+ return validatePath(val);
41
+ } catch (e) {
42
+ const message = e instanceof AFSPathError ? e.message : "Invalid path";
43
+ ctx.addIssue({
44
+ code: z.ZodIssueCode.custom,
45
+ message
46
+ });
47
+ return z.NEVER;
48
+ }
49
+ }),
50
+ uri: z.string().min(1, "URI is required"),
51
+ namespace: z.string().transform((val, ctx) => {
52
+ try {
53
+ return validateNamespace(val);
54
+ } catch (e) {
55
+ ctx.addIssue({
56
+ code: z.ZodIssueCode.custom,
57
+ message: e instanceof Error ? e.message : "Invalid namespace"
58
+ });
59
+ return z.NEVER;
60
+ }
61
+ }).optional(),
62
+ description: z.string().optional(),
63
+ access_mode: z.enum(["readonly", "readwrite"]).optional(),
64
+ auth: z.string().optional(),
65
+ token: z.string().optional(),
66
+ options: z.record(z.string(), z.unknown()).optional()
67
+ });
68
+ /**
69
+ * Serve configuration schema
70
+ */
71
+ const ServeSchema = z.object({
72
+ host: z.string().default("localhost"),
73
+ port: z.number().int().positive().default(3e3),
74
+ path: z.string().default("/afs"),
75
+ readonly: z.boolean().default(false),
76
+ cors: z.boolean().default(false),
77
+ max_body_size: z.number().int().positive().default(10 * 1024 * 1024),
78
+ token: z.string().optional()
79
+ });
80
+ /**
81
+ * Registry configuration schema
82
+ */
83
+ const RegistrySchema = z.object({
84
+ enabled: z.boolean().default(true),
85
+ providers: z.array(z.record(z.string(), z.unknown())).optional()
86
+ });
87
+ /**
88
+ * Root configuration schema for afs.toml
89
+ */
90
+ const ConfigSchema = z.object({
91
+ mounts: z.array(MountSchema).default([]),
92
+ serve: ServeSchema.optional(),
93
+ registry: RegistrySchema.optional()
94
+ });
95
+
96
+ //#endregion
97
+ export { ConfigSchema, MountSchema };
98
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../../src/config/schema.ts"],"sourcesContent":["import { AFSPathError, validatePath } from \"@aigne/afs\";\nimport { z } from \"zod\";\n\n/**\n * Characters forbidden in namespace names (security-sensitive)\n */\nconst NAMESPACE_FORBIDDEN_CHARS = [\n \"/\", // Path separator\n \"\\\\\", // Windows path separator\n \":\", // Namespace separator\n \";\", // Shell metachar\n \"|\", // Shell pipe\n \"&\", // Shell background\n \"`\", // Shell command substitution\n \"$\", // Shell variable\n \"(\", // Shell subshell\n \")\", // Shell subshell\n \">\", // Shell redirect\n \"<\", // Shell redirect\n \"\\n\", // Newline\n \"\\r\", // Carriage return\n \"\\t\", // Tab\n \"\\x00\", // NUL\n];\n\n/**\n * Validate namespace name\n */\nfunction validateNamespace(namespace: string): string {\n if (!namespace || namespace.trim() === \"\") {\n throw new Error(\"Namespace cannot be empty or whitespace-only\");\n }\n\n for (const char of NAMESPACE_FORBIDDEN_CHARS) {\n if (namespace.includes(char)) {\n throw new Error(`Namespace contains forbidden character: '${char}'`);\n }\n }\n\n return namespace;\n}\n\n/**\n * Mount configuration schema\n */\nexport const MountSchema = z.object({\n /** Mount path (must follow Unix path semantics) */\n path: z.string().transform((val, ctx) => {\n try {\n return validatePath(val);\n } catch (e) {\n const message = e instanceof AFSPathError ? e.message : \"Invalid path\";\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message,\n });\n return z.NEVER;\n }\n }),\n\n /** Provider URI (e.g., fs:///path, git:///repo?branch=main) */\n uri: z.string().min(1, \"URI is required\"),\n\n /** Namespace for this mount (optional, defaults to default namespace) */\n namespace: z\n .string()\n .transform((val, ctx) => {\n try {\n return validateNamespace(val);\n } catch (e) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: e instanceof Error ? e.message : \"Invalid namespace\",\n });\n return z.NEVER;\n }\n })\n .optional(),\n\n /** Human/LLM readable description */\n description: z.string().optional(),\n\n /** Access mode: readonly or readwrite */\n access_mode: z.enum([\"readonly\", \"readwrite\"]).optional(),\n\n /** Authentication string (supports ${ENV_VAR} references) */\n auth: z.string().optional(),\n\n /** Authorization token for HTTP providers (supports ${ENV_VAR} references) */\n token: z.string().optional(),\n\n /** Provider-specific options (passed through to provider) */\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Serve configuration schema\n */\nexport const ServeSchema = z.object({\n /** Host address to listen on */\n host: z.string().default(\"localhost\"),\n\n /** Port to listen on */\n port: z.number().int().positive().default(3000),\n\n /** Base path for the server */\n path: z.string().default(\"/afs\"),\n\n /** Run in readonly mode (disable write operations) */\n readonly: z.boolean().default(false),\n\n /** Enable CORS support */\n cors: z.boolean().default(false),\n\n /** Maximum request body size in bytes */\n max_body_size: z\n .number()\n .int()\n .positive()\n .default(10 * 1024 * 1024), // 10MB\n\n /** Bearer token for authorization (supports ${ENV_VAR} references) */\n token: z.string().optional(),\n});\n\n/**\n * Registry configuration schema\n */\nexport const RegistrySchema = z.object({\n /** Enable/disable auto-mounting the official registry (default: true) */\n enabled: z.boolean().default(true),\n\n /** Static provider manifests (for offline/testing use) */\n providers: z.array(z.record(z.string(), z.unknown())).optional(),\n});\n\n/**\n * Root configuration schema for afs.toml\n */\nexport const ConfigSchema = z.object({\n /** List of mount configurations */\n mounts: z.array(MountSchema).default([]),\n\n /** HTTP server configuration */\n serve: ServeSchema.optional(),\n\n /** Provider registry configuration */\n registry: RegistrySchema.optional(),\n});\n\n/** Type for a single mount configuration */\nexport type MountConfig = z.infer<typeof MountSchema>;\n\n/** Type for serve configuration */\nexport type ServeConfig = z.infer<typeof ServeSchema>;\n\n/** Type for the root AFS configuration */\nexport type AFSConfig = z.infer<typeof ConfigSchema>;\n"],"mappings":";;;;;;;AAMA,MAAM,4BAA4B;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,SAAS,kBAAkB,WAA2B;AACpD,KAAI,CAAC,aAAa,UAAU,MAAM,KAAK,GACrC,OAAM,IAAI,MAAM,+CAA+C;AAGjE,MAAK,MAAM,QAAQ,0BACjB,KAAI,UAAU,SAAS,KAAK,CAC1B,OAAM,IAAI,MAAM,4CAA4C,KAAK,GAAG;AAIxE,QAAO;;;;;AAMT,MAAa,cAAc,EAAE,OAAO;CAElC,MAAM,EAAE,QAAQ,CAAC,WAAW,KAAK,QAAQ;AACvC,MAAI;AACF,UAAO,aAAa,IAAI;WACjB,GAAG;GACV,MAAM,UAAU,aAAa,eAAe,EAAE,UAAU;AACxD,OAAI,SAAS;IACX,MAAM,EAAE,aAAa;IACrB;IACD,CAAC;AACF,UAAO,EAAE;;GAEX;CAGF,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,kBAAkB;CAGzC,WAAW,EACR,QAAQ,CACR,WAAW,KAAK,QAAQ;AACvB,MAAI;AACF,UAAO,kBAAkB,IAAI;WACtB,GAAG;AACV,OAAI,SAAS;IACX,MAAM,EAAE,aAAa;IACrB,SAAS,aAAa,QAAQ,EAAE,UAAU;IAC3C,CAAC;AACF,UAAO,EAAE;;GAEX,CACD,UAAU;CAGb,aAAa,EAAE,QAAQ,CAAC,UAAU;CAGlC,aAAa,EAAE,KAAK,CAAC,YAAY,YAAY,CAAC,CAAC,UAAU;CAGzD,MAAM,EAAE,QAAQ,CAAC,UAAU;CAG3B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAG5B,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,UAAU;CACtD,CAAC;;;;AAKF,MAAa,cAAc,EAAE,OAAO;CAElC,MAAM,EAAE,QAAQ,CAAC,QAAQ,YAAY;CAGrC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,IAAK;CAG/C,MAAM,EAAE,QAAQ,CAAC,QAAQ,OAAO;CAGhC,UAAU,EAAE,SAAS,CAAC,QAAQ,MAAM;CAGpC,MAAM,EAAE,SAAS,CAAC,QAAQ,MAAM;CAGhC,eAAe,EACZ,QAAQ,CACR,KAAK,CACL,UAAU,CACV,QAAQ,KAAK,OAAO,KAAK;CAG5B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;;;;AAKF,MAAa,iBAAiB,EAAE,OAAO;CAErC,SAAS,EAAE,SAAS,CAAC,QAAQ,KAAK;CAGlC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU;CACjE,CAAC;;;;AAKF,MAAa,eAAe,EAAE,OAAO;CAEnC,QAAQ,EAAE,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;CAGxC,OAAO,YAAY,UAAU;CAG7B,UAAU,eAAe,UAAU;CACpC,CAAC"}
@@ -0,0 +1,41 @@
1
+ const require_delete = require('../formatters/delete.cjs');
2
+ const require_path_utils = require('../../path-utils.cjs');
3
+ require('../path-utils.cjs');
4
+ const require_types = require('./types.cjs');
5
+
6
+ //#region src/core/commands/delete.ts
7
+ /**
8
+ * Create delete command factory
9
+ */
10
+ function createDeleteCommand(options) {
11
+ return {
12
+ command: ["delete <path>", "rm <path>"],
13
+ describe: "Delete file or directory",
14
+ builder: {
15
+ path: {
16
+ type: "string",
17
+ demandOption: true,
18
+ description: "Path to delete"
19
+ },
20
+ recursive: {
21
+ alias: "r",
22
+ type: "boolean",
23
+ default: false,
24
+ description: "Delete directory recursively"
25
+ }
26
+ },
27
+ handler: async (argv) => {
28
+ const afs = await require_types.resolveAFS(options);
29
+ const canonicalPath = require_path_utils.cliPathToCanonical(argv.path);
30
+ const result = await afs.delete(canonicalPath, { recursive: argv.recursive });
31
+ options.onResult({
32
+ command: "delete",
33
+ result,
34
+ format: require_delete.formatDeleteOutput
35
+ });
36
+ }
37
+ };
38
+ }
39
+
40
+ //#endregion
41
+ exports.createDeleteCommand = createDeleteCommand;
@@ -0,0 +1,18 @@
1
+ import { CommandFactoryOptions } from "./types.cjs";
2
+ import { CommandModule } from "yargs";
3
+
4
+ //#region src/core/commands/delete.d.ts
5
+ /**
6
+ * Delete command arguments
7
+ */
8
+ interface DeleteArgs {
9
+ path: string;
10
+ recursive: boolean;
11
+ }
12
+ /**
13
+ * Create delete command factory
14
+ */
15
+ declare function createDeleteCommand(options: CommandFactoryOptions): CommandModule<unknown, DeleteArgs>;
16
+ //#endregion
17
+ export { DeleteArgs, createDeleteCommand };
18
+ //# sourceMappingURL=delete.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.cts","names":[],"sources":["../../../src/core/commands/delete.ts"],"mappings":";;;;;AAuBA;;UARiB,UAAA;EACf,IAAA;EACA,SAAA;AAAA;;;;iBAMc,mBAAA,CACd,OAAA,EAAS,qBAAA,GACR,aAAA,UAAuB,UAAA"}
@@ -0,0 +1,18 @@
1
+ import { CommandFactoryOptions } from "./types.mjs";
2
+ import { CommandModule } from "yargs";
3
+
4
+ //#region src/core/commands/delete.d.ts
5
+ /**
6
+ * Delete command arguments
7
+ */
8
+ interface DeleteArgs {
9
+ path: string;
10
+ recursive: boolean;
11
+ }
12
+ /**
13
+ * Create delete command factory
14
+ */
15
+ declare function createDeleteCommand(options: CommandFactoryOptions): CommandModule<unknown, DeleteArgs>;
16
+ //#endregion
17
+ export { DeleteArgs, createDeleteCommand };
18
+ //# sourceMappingURL=delete.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.mts","names":[],"sources":["../../../src/core/commands/delete.ts"],"mappings":";;;;;AAuBA;;UARiB,UAAA;EACf,IAAA;EACA,SAAA;AAAA;;;;iBAMc,mBAAA,CACd,OAAA,EAAS,qBAAA,GACR,aAAA,UAAuB,UAAA"}
@@ -0,0 +1,42 @@
1
+ import { formatDeleteOutput } from "../formatters/delete.mjs";
2
+ import { cliPathToCanonical } from "../../path-utils.mjs";
3
+ import "../path-utils.mjs";
4
+ import { resolveAFS } from "./types.mjs";
5
+
6
+ //#region src/core/commands/delete.ts
7
+ /**
8
+ * Create delete command factory
9
+ */
10
+ function createDeleteCommand(options) {
11
+ return {
12
+ command: ["delete <path>", "rm <path>"],
13
+ describe: "Delete file or directory",
14
+ builder: {
15
+ path: {
16
+ type: "string",
17
+ demandOption: true,
18
+ description: "Path to delete"
19
+ },
20
+ recursive: {
21
+ alias: "r",
22
+ type: "boolean",
23
+ default: false,
24
+ description: "Delete directory recursively"
25
+ }
26
+ },
27
+ handler: async (argv) => {
28
+ const afs = await resolveAFS(options);
29
+ const canonicalPath = cliPathToCanonical(argv.path);
30
+ const result = await afs.delete(canonicalPath, { recursive: argv.recursive });
31
+ options.onResult({
32
+ command: "delete",
33
+ result,
34
+ format: formatDeleteOutput
35
+ });
36
+ }
37
+ };
38
+ }
39
+
40
+ //#endregion
41
+ export { createDeleteCommand };
42
+ //# sourceMappingURL=delete.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.mjs","names":[],"sources":["../../../src/core/commands/delete.ts"],"sourcesContent":["/**\n * delete Command - Core Implementation\n *\n * Deletes files/directories. Accepts AFS instance directly.\n * Returns AFSDeleteResult directly (no custom type).\n */\n\nimport type { CommandModule } from \"yargs\";\nimport { formatDeleteOutput } from \"../formatters/index.js\";\nimport { cliPathToCanonical } from \"../path-utils.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\n/**\n * Delete command arguments\n */\nexport interface DeleteArgs {\n path: string;\n recursive: boolean;\n}\n\n/**\n * Create delete command factory\n */\nexport function createDeleteCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, DeleteArgs> {\n return {\n command: [\"delete <path>\", \"rm <path>\"],\n describe: \"Delete file or directory\",\n builder: {\n path: {\n type: \"string\",\n demandOption: true,\n description: \"Path to delete\",\n },\n recursive: {\n alias: \"r\",\n type: \"boolean\",\n default: false,\n description: \"Delete directory recursively\",\n },\n },\n handler: async (argv) => {\n const afs = await resolveAFS(options);\n const canonicalPath = cliPathToCanonical(argv.path);\n const result = await afs.delete(canonicalPath, { recursive: argv.recursive });\n options.onResult({\n command: \"delete\",\n result,\n format: formatDeleteOutput,\n });\n },\n };\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,oBACd,SACoC;AACpC,QAAO;EACL,SAAS,CAAC,iBAAiB,YAAY;EACvC,UAAU;EACV,SAAS;GACP,MAAM;IACJ,MAAM;IACN,cAAc;IACd,aAAa;IACd;GACD,WAAW;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,aAAa;IACd;GACF;EACD,SAAS,OAAO,SAAS;GACvB,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,gBAAgB,mBAAmB,KAAK,KAAK;GACnD,MAAM,SAAS,MAAM,IAAI,OAAO,eAAe,EAAE,WAAW,KAAK,WAAW,CAAC;AAC7E,WAAQ,SAAS;IACf,SAAS;IACT;IACA,QAAQ;IACT,CAAC;;EAEL"}
@@ -0,0 +1,98 @@
1
+ const require_exec = require('../formatters/exec.cjs');
2
+ const require_path_utils = require('../../path-utils.cjs');
3
+ require('../path-utils.cjs');
4
+ const require_types = require('./types.cjs');
5
+ const require_exec_args = require('../helpers/exec-args.cjs');
6
+
7
+ //#region src/core/commands/exec.ts
8
+ /**
9
+ * Fetch action metadata (description, inputSchema)
10
+ */
11
+ async function fetchActionMeta(afs, path) {
12
+ const canonicalPath = require_path_utils.cliPathToCanonical(path);
13
+ try {
14
+ const readResult = await afs.read(canonicalPath);
15
+ const meta = readResult.data?.meta ?? {};
16
+ const content = readResult.data?.content ?? {};
17
+ const firstAction = readResult.data?.actions?.[0];
18
+ return {
19
+ description: meta.description ?? content.description ?? firstAction?.description ?? readResult.data?.summary,
20
+ inputSchema: meta.inputSchema ?? content.inputSchema ?? firstAction?.inputSchema
21
+ };
22
+ } catch {
23
+ return {};
24
+ }
25
+ }
26
+ /**
27
+ * Create exec command factory
28
+ *
29
+ * This command has special handling:
30
+ * 1. Factory function caches inputSchema
31
+ * 2. Builder pre-parses argv to get action path
32
+ * 3. Dynamically adds options from inputSchema
33
+ */
34
+ function createExecCommand(options) {
35
+ let cachedSchema;
36
+ let resolvedExecAction;
37
+ return {
38
+ command: "exec <executable_path>",
39
+ describe: "Execute an action",
40
+ builder: async (yargs) => {
41
+ const execIndex = options.argv.indexOf("exec");
42
+ const actionArg = execIndex >= 0 ? options.argv[execIndex + 1] : void 0;
43
+ if (actionArg && typeof actionArg === "string" && !actionArg.startsWith("-")) {
44
+ resolvedExecAction = actionArg;
45
+ const actionMeta = await fetchActionMeta(await require_types.resolveAFS(options), actionArg);
46
+ cachedSchema = actionMeta.inputSchema;
47
+ const description = actionMeta.description || "Execute an action";
48
+ yargs.usage(`afs exec ${actionArg}\n\n${description}`);
49
+ const hasArgsOption = options.argv.includes("--args");
50
+ if (cachedSchema?.properties) for (const [name, propSchema] of Object.entries(cachedSchema.properties)) {
51
+ const prop = propSchema;
52
+ let description$1 = prop.description || "";
53
+ if (prop.type === "object" && prop.properties) {
54
+ const subKeys = Object.keys(prop.properties).join(", ");
55
+ description$1 += `${description$1 ? " " : ""}(JSON object with: ${subKeys})`;
56
+ }
57
+ const optConfig = {
58
+ type: require_exec_args.schemaTypeToYargs(prop.type),
59
+ description: description$1 || void 0,
60
+ group: "Action Parameters:"
61
+ };
62
+ if (prop.default !== void 0) optConfig.default = prop.default;
63
+ if (!hasArgsOption && cachedSchema.required?.includes(name)) {
64
+ if (!(prop.sensitive === true || Array.isArray(prop.env))) optConfig.demandOption = true;
65
+ }
66
+ yargs.option(name, optConfig);
67
+ }
68
+ }
69
+ return yargs.positional("executable_path", {
70
+ type: "string",
71
+ demandOption: true,
72
+ description: "Action path to execute"
73
+ }).option("args", {
74
+ type: "string",
75
+ description: "JSON arguments: --args '{\"key\": \"value\"}'"
76
+ }).strict(false);
77
+ },
78
+ handler: async (argv) => {
79
+ const afs = await require_types.resolveAFS(options);
80
+ const execPath = resolvedExecAction ?? argv.executable_path;
81
+ const schema = cachedSchema ?? (await fetchActionMeta(afs, execPath)).inputSchema;
82
+ const argvForParsing = { ...argv };
83
+ delete argvForParsing.executable_path;
84
+ delete argvForParsing.executablePath;
85
+ const execArgs = require_exec_args.parseExecArgs(argvForParsing, schema);
86
+ const canonicalPath = require_path_utils.cliPathToCanonical(execPath);
87
+ const result = await afs.exec(canonicalPath, execArgs, {});
88
+ options.onResult({
89
+ command: "exec",
90
+ result,
91
+ format: require_exec.formatExecOutput
92
+ });
93
+ }
94
+ };
95
+ }
96
+
97
+ //#endregion
98
+ exports.createExecCommand = createExecCommand;
@@ -0,0 +1,26 @@
1
+ import { CommandFactoryOptions } from "./types.cjs";
2
+ import { parseExecArgs, parseValueBySchema } from "../helpers/exec-args.cjs";
3
+ import { CommandModule } from "yargs";
4
+
5
+ //#region src/core/commands/exec.d.ts
6
+ /**
7
+ * Exec command base arguments (known fields)
8
+ * Note: Dynamic options are added from inputSchema at runtime
9
+ */
10
+ interface ExecArgs {
11
+ executable_path: string;
12
+ args?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Create exec command factory
17
+ *
18
+ * This command has special handling:
19
+ * 1. Factory function caches inputSchema
20
+ * 2. Builder pre-parses argv to get action path
21
+ * 3. Dynamically adds options from inputSchema
22
+ */
23
+ declare function createExecCommand(options: CommandFactoryOptions): CommandModule<unknown, ExecArgs>;
24
+ //#endregion
25
+ export { ExecArgs, createExecCommand };
26
+ //# sourceMappingURL=exec.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.cts","names":[],"sources":["../../../src/core/commands/exec.ts"],"mappings":";;;;;AAsEA;;;;AAAA,UA5CiB,QAAA;EACf,eAAA;EACA,IAAA;EAAA,CACC,GAAA;AAAA;;;;;;;;;iBAyCa,iBAAA,CACd,OAAA,EAAS,qBAAA,GACR,aAAA,UAAuB,QAAA"}
@@ -0,0 +1,26 @@
1
+ import { CommandFactoryOptions } from "./types.mjs";
2
+ import { parseExecArgs, parseValueBySchema } from "../helpers/exec-args.mjs";
3
+ import { CommandModule } from "yargs";
4
+
5
+ //#region src/core/commands/exec.d.ts
6
+ /**
7
+ * Exec command base arguments (known fields)
8
+ * Note: Dynamic options are added from inputSchema at runtime
9
+ */
10
+ interface ExecArgs {
11
+ executable_path: string;
12
+ args?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ /**
16
+ * Create exec command factory
17
+ *
18
+ * This command has special handling:
19
+ * 1. Factory function caches inputSchema
20
+ * 2. Builder pre-parses argv to get action path
21
+ * 3. Dynamically adds options from inputSchema
22
+ */
23
+ declare function createExecCommand(options: CommandFactoryOptions): CommandModule<unknown, ExecArgs>;
24
+ //#endregion
25
+ export { ExecArgs, createExecCommand };
26
+ //# sourceMappingURL=exec.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.mts","names":[],"sources":["../../../src/core/commands/exec.ts"],"mappings":";;;;;AAsEA;;;;AAAA,UA5CiB,QAAA;EACf,eAAA;EACA,IAAA;EAAA,CACC,GAAA;AAAA;;;;;;;;;iBAyCa,iBAAA,CACd,OAAA,EAAS,qBAAA,GACR,aAAA,UAAuB,QAAA"}
@@ -0,0 +1,99 @@
1
+ import { formatExecOutput } from "../formatters/exec.mjs";
2
+ import { cliPathToCanonical } from "../../path-utils.mjs";
3
+ import "../path-utils.mjs";
4
+ import { resolveAFS } from "./types.mjs";
5
+ import { parseExecArgs, parseValueBySchema, schemaTypeToYargs } from "../helpers/exec-args.mjs";
6
+
7
+ //#region src/core/commands/exec.ts
8
+ /**
9
+ * Fetch action metadata (description, inputSchema)
10
+ */
11
+ async function fetchActionMeta(afs, path) {
12
+ const canonicalPath = cliPathToCanonical(path);
13
+ try {
14
+ const readResult = await afs.read(canonicalPath);
15
+ const meta = readResult.data?.meta ?? {};
16
+ const content = readResult.data?.content ?? {};
17
+ const firstAction = readResult.data?.actions?.[0];
18
+ return {
19
+ description: meta.description ?? content.description ?? firstAction?.description ?? readResult.data?.summary,
20
+ inputSchema: meta.inputSchema ?? content.inputSchema ?? firstAction?.inputSchema
21
+ };
22
+ } catch {
23
+ return {};
24
+ }
25
+ }
26
+ /**
27
+ * Create exec command factory
28
+ *
29
+ * This command has special handling:
30
+ * 1. Factory function caches inputSchema
31
+ * 2. Builder pre-parses argv to get action path
32
+ * 3. Dynamically adds options from inputSchema
33
+ */
34
+ function createExecCommand(options) {
35
+ let cachedSchema;
36
+ let resolvedExecAction;
37
+ return {
38
+ command: "exec <executable_path>",
39
+ describe: "Execute an action",
40
+ builder: async (yargs) => {
41
+ const execIndex = options.argv.indexOf("exec");
42
+ const actionArg = execIndex >= 0 ? options.argv[execIndex + 1] : void 0;
43
+ if (actionArg && typeof actionArg === "string" && !actionArg.startsWith("-")) {
44
+ resolvedExecAction = actionArg;
45
+ const actionMeta = await fetchActionMeta(await resolveAFS(options), actionArg);
46
+ cachedSchema = actionMeta.inputSchema;
47
+ const description = actionMeta.description || "Execute an action";
48
+ yargs.usage(`afs exec ${actionArg}\n\n${description}`);
49
+ const hasArgsOption = options.argv.includes("--args");
50
+ if (cachedSchema?.properties) for (const [name, propSchema] of Object.entries(cachedSchema.properties)) {
51
+ const prop = propSchema;
52
+ let description$1 = prop.description || "";
53
+ if (prop.type === "object" && prop.properties) {
54
+ const subKeys = Object.keys(prop.properties).join(", ");
55
+ description$1 += `${description$1 ? " " : ""}(JSON object with: ${subKeys})`;
56
+ }
57
+ const optConfig = {
58
+ type: schemaTypeToYargs(prop.type),
59
+ description: description$1 || void 0,
60
+ group: "Action Parameters:"
61
+ };
62
+ if (prop.default !== void 0) optConfig.default = prop.default;
63
+ if (!hasArgsOption && cachedSchema.required?.includes(name)) {
64
+ if (!(prop.sensitive === true || Array.isArray(prop.env))) optConfig.demandOption = true;
65
+ }
66
+ yargs.option(name, optConfig);
67
+ }
68
+ }
69
+ return yargs.positional("executable_path", {
70
+ type: "string",
71
+ demandOption: true,
72
+ description: "Action path to execute"
73
+ }).option("args", {
74
+ type: "string",
75
+ description: "JSON arguments: --args '{\"key\": \"value\"}'"
76
+ }).strict(false);
77
+ },
78
+ handler: async (argv) => {
79
+ const afs = await resolveAFS(options);
80
+ const execPath = resolvedExecAction ?? argv.executable_path;
81
+ const schema = cachedSchema ?? (await fetchActionMeta(afs, execPath)).inputSchema;
82
+ const argvForParsing = { ...argv };
83
+ delete argvForParsing.executable_path;
84
+ delete argvForParsing.executablePath;
85
+ const execArgs = parseExecArgs(argvForParsing, schema);
86
+ const canonicalPath = cliPathToCanonical(execPath);
87
+ const result = await afs.exec(canonicalPath, execArgs, {});
88
+ options.onResult({
89
+ command: "exec",
90
+ result,
91
+ format: formatExecOutput
92
+ });
93
+ }
94
+ };
95
+ }
96
+
97
+ //#endregion
98
+ export { createExecCommand };
99
+ //# sourceMappingURL=exec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.mjs","names":["description"],"sources":["../../../src/core/commands/exec.ts"],"sourcesContent":["/**\n * exec Command - Core Implementation\n *\n * Executes actions on AFS paths. Accepts AFS instance directly.\n * Returns AFSExecResult directly (no custom type).\n *\n * NOTE: The yargs positional is named \"executable_path\" to avoid name collisions\n * with action inputSchema properties. Common schema property names like \"path\",\n * \"action\", \"name\" etc. won't collide with this compound internal name.\n */\n\nimport type { AFS } from \"@aigne/afs\";\nimport type { CommandModule, Options } from \"yargs\";\nimport { formatExecOutput } from \"../formatters/index.js\";\nimport { parseExecArgs, parseValueBySchema, schemaTypeToYargs } from \"../helpers/exec-args.js\";\nimport { cliPathToCanonical } from \"../path-utils.js\";\nimport type { JSONSchema } from \"../types.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\n// Re-export helpers for backward compatibility\nexport { parseExecArgs, parseValueBySchema };\n\n/**\n * Exec command base arguments (known fields)\n * Note: Dynamic options are added from inputSchema at runtime\n */\nexport interface ExecArgs {\n executable_path: string;\n args?: string;\n [key: string]: unknown;\n}\n\n/**\n * Fetch action metadata (description, inputSchema)\n */\nasync function fetchActionMeta(\n afs: AFS,\n path: string,\n): Promise<{ description?: string; inputSchema?: JSONSchema }> {\n const canonicalPath = cliPathToCanonical(path);\n\n try {\n const readResult = await afs.read(canonicalPath);\n const meta = readResult.data?.meta ?? {};\n const content = readResult.data?.content ?? {};\n // Actions list entries may carry inputSchema in the actions array\n const firstAction = readResult.data?.actions?.[0];\n\n return {\n description: (meta.description ??\n content.description ??\n firstAction?.description ??\n readResult.data?.summary) as string | undefined,\n inputSchema: (meta.inputSchema ?? content.inputSchema ?? firstAction?.inputSchema) as\n | JSONSchema\n | undefined,\n };\n } catch {\n return {};\n }\n}\n\n/**\n * Create exec command factory\n *\n * This command has special handling:\n * 1. Factory function caches inputSchema\n * 2. Builder pre-parses argv to get action path\n * 3. Dynamically adds options from inputSchema\n */\nexport function createExecCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, ExecArgs> {\n // Cache schema in closure for reuse between builder and handler\n let cachedSchema: JSONSchema | undefined;\n // Store the pre-parsed exec target path\n let resolvedExecAction: string | undefined;\n\n return {\n command: \"exec <executable_path>\",\n describe: \"Execute an action\",\n builder: async (yargs) => {\n // Pre-parse argv to get the action path (first positional after \"exec\")\n const execIndex = options.argv.indexOf(\"exec\");\n const actionArg = execIndex >= 0 ? options.argv[execIndex + 1] : undefined;\n\n if (actionArg && typeof actionArg === \"string\" && !actionArg.startsWith(\"-\")) {\n resolvedExecAction = actionArg;\n // Fetch action metadata\n const afs = await resolveAFS(options);\n const actionMeta = await fetchActionMeta(afs, actionArg);\n cachedSchema = actionMeta.inputSchema;\n\n // Set custom usage with path and description\n const description = actionMeta.description || \"Execute an action\";\n yargs.usage(`afs exec ${actionArg}\\n\\n${description}`);\n\n // Check if --args is provided - if so, don't require individual options\n const hasArgsOption = options.argv.includes(\"--args\");\n\n if (cachedSchema?.properties) {\n // Add dynamic options from schema\n for (const [name, propSchema] of Object.entries(cachedSchema.properties)) {\n const prop = propSchema as JSONSchema;\n let description = prop.description || \"\";\n\n // For object-type properties with sub-properties, show them in the description\n if (prop.type === \"object\" && prop.properties) {\n const subKeys = Object.keys(prop.properties).join(\", \");\n description += `${description ? \" \" : \"\"}(JSON object with: ${subKeys})`;\n }\n\n const optConfig: Options = {\n type: schemaTypeToYargs(prop.type),\n description: description || undefined,\n group: \"Action Parameters:\",\n };\n\n if (prop.default !== undefined) {\n optConfig.default = prop.default;\n }\n\n // Only require options when --args is not provided.\n // Skip demandOption for fields with sensitive/env metadata — these\n // can be resolved through credential collection (browser, env vars,\n // credential store) rather than CLI args.\n if (!hasArgsOption && cachedSchema.required?.includes(name)) {\n const hasAlternateResolution =\n (prop as Record<string, unknown>).sensitive === true ||\n Array.isArray((prop as Record<string, unknown>).env);\n if (!hasAlternateResolution) {\n optConfig.demandOption = true;\n }\n }\n\n yargs.option(name, optConfig);\n }\n }\n }\n\n return yargs\n .positional(\"executable_path\", {\n type: \"string\",\n demandOption: true,\n description: \"Action path to execute\",\n })\n .option(\"args\", {\n type: \"string\",\n description: 'JSON arguments: --args \\'{\"key\": \"value\"}\\'',\n })\n .strict(false);\n },\n handler: async (argv) => {\n const afs = await resolveAFS(options);\n // Use pre-parsed action path from builder\n const execPath = resolvedExecAction ?? argv.executable_path;\n // Use cached schema or fetch again\n const schema = cachedSchema ?? (await fetchActionMeta(afs, execPath)).inputSchema;\n\n // Strip positional \"executable_path\" from argv before parsing exec args\n const argvForParsing: Record<string, unknown> = { ...argv };\n delete argvForParsing.executable_path;\n // yargs also creates a camelCase alias \"executablePath\" — remove it too\n delete argvForParsing.executablePath;\n\n // Parse exec arguments with schema\n const execArgs = parseExecArgs(argvForParsing, schema);\n\n const canonicalPath = cliPathToCanonical(execPath);\n const result = await afs.exec(canonicalPath, execArgs, {});\n options.onResult({\n command: \"exec\",\n result,\n format: formatExecOutput,\n });\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAmCA,eAAe,gBACb,KACA,MAC6D;CAC7D,MAAM,gBAAgB,mBAAmB,KAAK;AAE9C,KAAI;EACF,MAAM,aAAa,MAAM,IAAI,KAAK,cAAc;EAChD,MAAM,OAAO,WAAW,MAAM,QAAQ,EAAE;EACxC,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE;EAE9C,MAAM,cAAc,WAAW,MAAM,UAAU;AAE/C,SAAO;GACL,aAAc,KAAK,eACjB,QAAQ,eACR,aAAa,eACb,WAAW,MAAM;GACnB,aAAc,KAAK,eAAe,QAAQ,eAAe,aAAa;GAGvE;SACK;AACN,SAAO,EAAE;;;;;;;;;;;AAYb,SAAgB,kBACd,SACkC;CAElC,IAAI;CAEJ,IAAI;AAEJ,QAAO;EACL,SAAS;EACT,UAAU;EACV,SAAS,OAAO,UAAU;GAExB,MAAM,YAAY,QAAQ,KAAK,QAAQ,OAAO;GAC9C,MAAM,YAAY,aAAa,IAAI,QAAQ,KAAK,YAAY,KAAK;AAEjE,OAAI,aAAa,OAAO,cAAc,YAAY,CAAC,UAAU,WAAW,IAAI,EAAE;AAC5E,yBAAqB;IAGrB,MAAM,aAAa,MAAM,gBADb,MAAM,WAAW,QAAQ,EACS,UAAU;AACxD,mBAAe,WAAW;IAG1B,MAAM,cAAc,WAAW,eAAe;AAC9C,UAAM,MAAM,YAAY,UAAU,MAAM,cAAc;IAGtD,MAAM,gBAAgB,QAAQ,KAAK,SAAS,SAAS;AAErD,QAAI,cAAc,WAEhB,MAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,aAAa,WAAW,EAAE;KACxE,MAAM,OAAO;KACb,IAAIA,gBAAc,KAAK,eAAe;AAGtC,SAAI,KAAK,SAAS,YAAY,KAAK,YAAY;MAC7C,MAAM,UAAU,OAAO,KAAK,KAAK,WAAW,CAAC,KAAK,KAAK;AACvD,uBAAe,GAAGA,gBAAc,MAAM,GAAG,qBAAqB,QAAQ;;KAGxE,MAAM,YAAqB;MACzB,MAAM,kBAAkB,KAAK,KAAK;MAClC,aAAaA,iBAAe;MAC5B,OAAO;MACR;AAED,SAAI,KAAK,YAAY,OACnB,WAAU,UAAU,KAAK;AAO3B,SAAI,CAAC,iBAAiB,aAAa,UAAU,SAAS,KAAK,EAIzD;UAAI,EAFD,KAAiC,cAAc,QAChD,MAAM,QAAS,KAAiC,IAAI,EAEpD,WAAU,eAAe;;AAI7B,WAAM,OAAO,MAAM,UAAU;;;AAKnC,UAAO,MACJ,WAAW,mBAAmB;IAC7B,MAAM;IACN,cAAc;IACd,aAAa;IACd,CAAC,CACD,OAAO,QAAQ;IACd,MAAM;IACN,aAAa;IACd,CAAC,CACD,OAAO,MAAM;;EAElB,SAAS,OAAO,SAAS;GACvB,MAAM,MAAM,MAAM,WAAW,QAAQ;GAErC,MAAM,WAAW,sBAAsB,KAAK;GAE5C,MAAM,SAAS,iBAAiB,MAAM,gBAAgB,KAAK,SAAS,EAAE;GAGtE,MAAM,iBAA0C,EAAE,GAAG,MAAM;AAC3D,UAAO,eAAe;AAEtB,UAAO,eAAe;GAGtB,MAAM,WAAW,cAAc,gBAAgB,OAAO;GAEtD,MAAM,gBAAgB,mBAAmB,SAAS;GAClD,MAAM,SAAS,MAAM,IAAI,KAAK,eAAe,UAAU,EAAE,CAAC;AAC1D,WAAQ,SAAS;IACf,SAAS;IACT;IACA,QAAQ;IACT,CAAC;;EAEL"}