@aigne/afs-cli 1.11.0-beta.6 → 1.11.0-beta.8

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 (346) hide show
  1. package/dist/_virtual/rolldown_runtime.mjs +7 -0
  2. package/dist/cli.cjs +27 -353
  3. package/dist/cli.d.cts +2 -1
  4. package/dist/cli.d.mts +2 -1
  5. package/dist/cli.mjs +28 -353
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/config/afs-loader.cjs +567 -0
  8. package/dist/config/afs-loader.d.cts +19 -0
  9. package/dist/config/afs-loader.d.cts.map +1 -0
  10. package/dist/config/afs-loader.d.mts +19 -0
  11. package/dist/config/afs-loader.d.mts.map +1 -0
  12. package/dist/config/afs-loader.mjs +565 -0
  13. package/dist/config/afs-loader.mjs.map +1 -0
  14. package/dist/config/loader.cjs +28 -11
  15. package/dist/config/loader.mjs +28 -11
  16. package/dist/config/loader.mjs.map +1 -1
  17. package/dist/config/mount-commands.cjs +208 -0
  18. package/dist/config/mount-commands.d.cts +14 -0
  19. package/dist/config/mount-commands.d.cts.map +1 -0
  20. package/dist/config/mount-commands.d.mts +14 -0
  21. package/dist/config/mount-commands.d.mts.map +1 -0
  22. package/dist/config/mount-commands.mjs +203 -0
  23. package/dist/config/mount-commands.mjs.map +1 -0
  24. package/dist/config/schema.cjs +10 -2
  25. package/dist/config/schema.mjs +10 -2
  26. package/dist/config/schema.mjs.map +1 -1
  27. package/dist/core/commands/delete.cjs +41 -0
  28. package/dist/core/commands/delete.d.cts +18 -0
  29. package/dist/core/commands/delete.d.cts.map +1 -0
  30. package/dist/core/commands/delete.d.mts +18 -0
  31. package/dist/core/commands/delete.d.mts.map +1 -0
  32. package/dist/core/commands/delete.mjs +42 -0
  33. package/dist/core/commands/delete.mjs.map +1 -0
  34. package/dist/core/commands/exec.cjs +98 -0
  35. package/dist/core/commands/exec.d.cts +26 -0
  36. package/dist/core/commands/exec.d.cts.map +1 -0
  37. package/dist/core/commands/exec.d.mts +26 -0
  38. package/dist/core/commands/exec.d.mts.map +1 -0
  39. package/dist/core/commands/exec.mjs +99 -0
  40. package/dist/core/commands/exec.mjs.map +1 -0
  41. package/dist/core/commands/explain.cjs +254 -0
  42. package/dist/core/commands/explain.d.cts +25 -0
  43. package/dist/core/commands/explain.d.cts.map +1 -0
  44. package/dist/core/commands/explain.d.mts +25 -0
  45. package/dist/core/commands/explain.d.mts.map +1 -0
  46. package/dist/core/commands/explain.mjs +255 -0
  47. package/dist/core/commands/explain.mjs.map +1 -0
  48. package/dist/core/commands/explore.cjs +30 -0
  49. package/dist/core/commands/explore.d.mts +2 -0
  50. package/dist/core/commands/explore.mjs +31 -0
  51. package/dist/core/commands/explore.mjs.map +1 -0
  52. package/dist/core/commands/index.cjs +36 -0
  53. package/dist/core/commands/index.d.cts +21 -0
  54. package/dist/core/commands/index.d.cts.map +1 -0
  55. package/dist/core/commands/index.d.mts +24 -0
  56. package/dist/core/commands/index.d.mts.map +1 -0
  57. package/dist/core/commands/index.mjs +37 -0
  58. package/dist/core/commands/index.mjs.map +1 -0
  59. package/dist/core/commands/ls.cjs +57 -0
  60. package/dist/core/commands/ls.d.cts +21 -0
  61. package/dist/core/commands/ls.d.cts.map +1 -0
  62. package/dist/core/commands/ls.d.mts +21 -0
  63. package/dist/core/commands/ls.d.mts.map +1 -0
  64. package/dist/core/commands/ls.mjs +58 -0
  65. package/dist/core/commands/ls.mjs.map +1 -0
  66. package/dist/core/commands/mount.cjs +222 -0
  67. package/dist/core/commands/mount.d.cts +35 -0
  68. package/dist/core/commands/mount.d.cts.map +1 -0
  69. package/dist/core/commands/mount.d.mts +35 -0
  70. package/dist/core/commands/mount.d.mts.map +1 -0
  71. package/dist/core/commands/mount.mjs +223 -0
  72. package/dist/core/commands/mount.mjs.map +1 -0
  73. package/dist/core/commands/read.cjs +48 -0
  74. package/dist/core/commands/read.d.cts +17 -0
  75. package/dist/core/commands/read.d.cts.map +1 -0
  76. package/dist/core/commands/read.d.mts +17 -0
  77. package/dist/core/commands/read.d.mts.map +1 -0
  78. package/dist/core/commands/read.mjs +49 -0
  79. package/dist/core/commands/read.mjs.map +1 -0
  80. package/dist/core/commands/search.cjs +40 -0
  81. package/dist/core/commands/search.d.mts +2 -0
  82. package/dist/core/commands/search.mjs +41 -0
  83. package/dist/core/commands/search.mjs.map +1 -0
  84. package/dist/core/commands/serve.cjs +267 -0
  85. package/dist/core/commands/serve.d.mts +2 -0
  86. package/dist/core/commands/serve.mjs +267 -0
  87. package/dist/core/commands/serve.mjs.map +1 -0
  88. package/dist/core/commands/stat.cjs +53 -0
  89. package/dist/core/commands/stat.d.cts +17 -0
  90. package/dist/core/commands/stat.d.cts.map +1 -0
  91. package/dist/core/commands/stat.d.mts +17 -0
  92. package/dist/core/commands/stat.d.mts.map +1 -0
  93. package/dist/core/commands/stat.mjs +54 -0
  94. package/dist/core/commands/stat.mjs.map +1 -0
  95. package/dist/core/commands/types.cjs +18 -0
  96. package/dist/core/commands/types.d.cts +54 -0
  97. package/dist/core/commands/types.d.cts.map +1 -0
  98. package/dist/core/commands/types.d.mts +54 -0
  99. package/dist/core/commands/types.d.mts.map +1 -0
  100. package/dist/core/commands/types.mjs +19 -0
  101. package/dist/core/commands/types.mjs.map +1 -0
  102. package/dist/core/commands/write.cjs +70 -0
  103. package/dist/core/commands/write.d.cts +20 -0
  104. package/dist/core/commands/write.d.cts.map +1 -0
  105. package/dist/core/commands/write.d.mts +20 -0
  106. package/dist/core/commands/write.d.mts.map +1 -0
  107. package/dist/core/commands/write.mjs +71 -0
  108. package/dist/core/commands/write.mjs.map +1 -0
  109. package/dist/core/executor/index.cjs +196 -0
  110. package/dist/core/executor/index.d.cts +77 -0
  111. package/dist/core/executor/index.d.cts.map +1 -0
  112. package/dist/core/executor/index.d.mts +77 -0
  113. package/dist/core/executor/index.d.mts.map +1 -0
  114. package/dist/core/executor/index.mjs +195 -0
  115. package/dist/core/executor/index.mjs.map +1 -0
  116. package/dist/core/formatters/delete.cjs +37 -0
  117. package/dist/core/formatters/delete.d.cts +18 -0
  118. package/dist/core/formatters/delete.d.cts.map +1 -0
  119. package/dist/core/formatters/delete.d.mts +18 -0
  120. package/dist/core/formatters/delete.d.mts.map +1 -0
  121. package/dist/core/formatters/delete.mjs +37 -0
  122. package/dist/core/formatters/delete.mjs.map +1 -0
  123. package/dist/core/formatters/exec.cjs +60 -0
  124. package/dist/core/formatters/exec.d.cts +18 -0
  125. package/dist/core/formatters/exec.d.cts.map +1 -0
  126. package/dist/core/formatters/exec.d.mts +18 -0
  127. package/dist/core/formatters/exec.d.mts.map +1 -0
  128. package/dist/core/formatters/exec.mjs +60 -0
  129. package/dist/core/formatters/exec.mjs.map +1 -0
  130. package/dist/core/formatters/explain.cjs +97 -0
  131. package/dist/core/formatters/explain.d.cts +11 -0
  132. package/dist/core/formatters/explain.d.cts.map +1 -0
  133. package/dist/core/formatters/explain.d.mts +11 -0
  134. package/dist/core/formatters/explain.d.mts.map +1 -0
  135. package/dist/core/formatters/explain.mjs +96 -0
  136. package/dist/core/formatters/explain.mjs.map +1 -0
  137. package/dist/core/formatters/index.d.mts +9 -0
  138. package/dist/core/formatters/ls.cjs +179 -0
  139. package/dist/core/formatters/ls.d.cts +20 -0
  140. package/dist/core/formatters/ls.d.cts.map +1 -0
  141. package/dist/core/formatters/ls.d.mts +20 -0
  142. package/dist/core/formatters/ls.d.mts.map +1 -0
  143. package/dist/core/formatters/ls.mjs +179 -0
  144. package/dist/core/formatters/ls.mjs.map +1 -0
  145. package/dist/core/formatters/mount.cjs +55 -0
  146. package/dist/core/formatters/mount.d.cts +15 -0
  147. package/dist/core/formatters/mount.d.cts.map +1 -0
  148. package/dist/core/formatters/mount.d.mts +15 -0
  149. package/dist/core/formatters/mount.d.mts.map +1 -0
  150. package/dist/core/formatters/mount.mjs +55 -0
  151. package/dist/core/formatters/mount.mjs.map +1 -0
  152. package/dist/core/formatters/read.cjs +100 -0
  153. package/dist/core/formatters/read.d.cts +22 -0
  154. package/dist/core/formatters/read.d.cts.map +1 -0
  155. package/dist/core/formatters/read.d.mts +22 -0
  156. package/dist/core/formatters/read.d.mts.map +1 -0
  157. package/dist/core/formatters/read.mjs +100 -0
  158. package/dist/core/formatters/read.mjs.map +1 -0
  159. package/dist/core/formatters/search.cjs +44 -0
  160. package/dist/core/formatters/search.d.mts +1 -0
  161. package/dist/core/formatters/search.mjs +44 -0
  162. package/dist/core/formatters/search.mjs.map +1 -0
  163. package/dist/core/formatters/stat.cjs +155 -0
  164. package/dist/core/formatters/stat.d.cts +15 -0
  165. package/dist/core/formatters/stat.d.cts.map +1 -0
  166. package/dist/core/formatters/stat.d.mts +15 -0
  167. package/dist/core/formatters/stat.d.mts.map +1 -0
  168. package/dist/core/formatters/stat.mjs +155 -0
  169. package/dist/core/formatters/stat.mjs.map +1 -0
  170. package/dist/core/formatters/write.cjs +51 -0
  171. package/dist/core/formatters/write.d.cts +22 -0
  172. package/dist/core/formatters/write.d.cts.map +1 -0
  173. package/dist/core/formatters/write.d.mts +22 -0
  174. package/dist/core/formatters/write.d.mts.map +1 -0
  175. package/dist/core/formatters/write.mjs +51 -0
  176. package/dist/core/formatters/write.mjs.map +1 -0
  177. package/dist/core/helpers/exec-args.cjs +142 -0
  178. package/dist/core/helpers/exec-args.d.cts +46 -0
  179. package/dist/core/helpers/exec-args.d.cts.map +1 -0
  180. package/dist/core/helpers/exec-args.d.mts +46 -0
  181. package/dist/core/helpers/exec-args.d.mts.map +1 -0
  182. package/dist/core/helpers/exec-args.mjs +139 -0
  183. package/dist/core/helpers/exec-args.mjs.map +1 -0
  184. package/dist/core/helpers/stdin.cjs +41 -0
  185. package/dist/core/helpers/stdin.d.cts +15 -0
  186. package/dist/core/helpers/stdin.d.cts.map +1 -0
  187. package/dist/core/helpers/stdin.d.mts +15 -0
  188. package/dist/core/helpers/stdin.d.mts.map +1 -0
  189. package/dist/core/helpers/stdin.mjs +41 -0
  190. package/dist/core/helpers/stdin.mjs.map +1 -0
  191. package/dist/core/index.cjs +49 -0
  192. package/dist/core/index.d.cts +24 -0
  193. package/dist/core/index.d.mts +25 -0
  194. package/dist/core/index.mjs +24 -0
  195. package/dist/core/path-utils.cjs +1 -0
  196. package/dist/core/path-utils.mjs +3 -0
  197. package/dist/core/types.d.cts +24 -0
  198. package/dist/core/types.d.cts.map +1 -0
  199. package/dist/core/types.d.mts +24 -0
  200. package/dist/core/types.d.mts.map +1 -0
  201. package/dist/credential/auth-server.cjs +247 -0
  202. package/dist/credential/auth-server.mjs +247 -0
  203. package/dist/credential/auth-server.mjs.map +1 -0
  204. package/dist/credential/cli-auth-context.cjs +86 -0
  205. package/dist/credential/cli-auth-context.d.mts +1 -0
  206. package/dist/credential/cli-auth-context.mjs +86 -0
  207. package/dist/credential/cli-auth-context.mjs.map +1 -0
  208. package/dist/credential/index.cjs +5 -0
  209. package/dist/credential/index.d.mts +4 -0
  210. package/dist/credential/index.mjs +7 -0
  211. package/dist/credential/mcp-auth-context.cjs +186 -0
  212. package/dist/credential/mcp-auth-context.d.mts +1 -0
  213. package/dist/credential/mcp-auth-context.mjs +186 -0
  214. package/dist/credential/mcp-auth-context.mjs.map +1 -0
  215. package/dist/credential/resolver.cjs +125 -0
  216. package/dist/credential/resolver.d.mts +1 -0
  217. package/dist/credential/resolver.mjs +125 -0
  218. package/dist/credential/resolver.mjs.map +1 -0
  219. package/dist/credential/store.cjs +106 -0
  220. package/dist/credential/store.d.cts +30 -0
  221. package/dist/credential/store.d.cts.map +1 -0
  222. package/dist/credential/store.d.mts +30 -0
  223. package/dist/credential/store.d.mts.map +1 -0
  224. package/dist/credential/store.mjs +106 -0
  225. package/dist/credential/store.mjs.map +1 -0
  226. package/dist/errors.cjs +0 -11
  227. package/dist/errors.mjs +1 -11
  228. package/dist/errors.mjs.map +1 -1
  229. package/dist/explorer/actions.cjs +67 -32
  230. package/dist/explorer/actions.mjs +66 -32
  231. package/dist/explorer/actions.mjs.map +1 -1
  232. package/dist/explorer/components/dialog.cjs +170 -46
  233. package/dist/explorer/components/dialog.mjs +170 -46
  234. package/dist/explorer/components/dialog.mjs.map +1 -1
  235. package/dist/explorer/components/metadata-panel.cjs +86 -3
  236. package/dist/explorer/components/metadata-panel.mjs +86 -3
  237. package/dist/explorer/components/metadata-panel.mjs.map +1 -1
  238. package/dist/explorer/screen.cjs +63 -27
  239. package/dist/explorer/screen.d.cts +23 -0
  240. package/dist/explorer/screen.d.cts.map +1 -0
  241. package/dist/explorer/screen.d.mts +23 -0
  242. package/dist/explorer/screen.d.mts.map +1 -0
  243. package/dist/explorer/screen.mjs +63 -27
  244. package/dist/explorer/screen.mjs.map +1 -1
  245. package/dist/explorer/theme.cjs +1 -1
  246. package/dist/explorer/theme.mjs +1 -1
  247. package/dist/explorer/theme.mjs.map +1 -1
  248. package/dist/index.cjs +10 -1
  249. package/dist/index.d.cts +5 -1
  250. package/dist/index.d.mts +6 -1
  251. package/dist/index.mjs +6 -1
  252. package/dist/mcp/http-transport.cjs +87 -0
  253. package/dist/mcp/http-transport.mjs +87 -0
  254. package/dist/mcp/http-transport.mjs.map +1 -0
  255. package/dist/mcp/prompts.cjs +48 -0
  256. package/dist/mcp/prompts.mjs +48 -0
  257. package/dist/mcp/prompts.mjs.map +1 -0
  258. package/dist/mcp/resources.cjs +25 -0
  259. package/dist/mcp/resources.mjs +25 -0
  260. package/dist/mcp/resources.mjs.map +1 -0
  261. package/dist/mcp/server.cjs +40 -0
  262. package/dist/mcp/server.mjs +39 -0
  263. package/dist/mcp/server.mjs.map +1 -0
  264. package/dist/mcp/tools.cjs +152 -0
  265. package/dist/mcp/tools.mjs +152 -0
  266. package/dist/mcp/tools.mjs.map +1 -0
  267. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts +10 -0
  268. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts.map +1 -0
  269. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts +10 -0
  270. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts.map +1 -0
  271. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts +46 -0
  272. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts.map +1 -0
  273. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts +46 -0
  274. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts.map +1 -0
  275. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.cjs +902 -0
  276. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs +902 -0
  277. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs.map +1 -0
  278. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.cjs +6 -0
  279. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs +8 -0
  280. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs.map +1 -0
  281. package/dist/path-utils.d.cts +50 -0
  282. package/dist/path-utils.d.cts.map +1 -0
  283. package/dist/path-utils.d.mts +50 -0
  284. package/dist/path-utils.d.mts.map +1 -0
  285. package/dist/repl.cjs +491 -0
  286. package/dist/repl.d.cts +15 -0
  287. package/dist/repl.d.cts.map +1 -0
  288. package/dist/repl.d.mts +16 -0
  289. package/dist/repl.d.mts.map +1 -0
  290. package/dist/repl.mjs +491 -0
  291. package/dist/repl.mjs.map +1 -0
  292. package/dist/serve.cjs +146 -0
  293. package/dist/serve.d.cts +41 -0
  294. package/dist/serve.d.cts.map +1 -0
  295. package/dist/serve.d.mts +41 -0
  296. package/dist/serve.d.mts.map +1 -0
  297. package/dist/serve.mjs +146 -0
  298. package/dist/serve.mjs.map +1 -0
  299. package/dist/ui/header.cjs +1 -40
  300. package/dist/ui/header.mjs +1 -39
  301. package/dist/ui/header.mjs.map +1 -1
  302. package/dist/ui/index.cjs +2 -9
  303. package/dist/ui/index.mjs +2 -7
  304. package/dist/ui/index.mjs.map +1 -1
  305. package/dist/ui/terminal.cjs +1 -10
  306. package/dist/ui/terminal.mjs +1 -8
  307. package/dist/ui/terminal.mjs.map +1 -1
  308. package/package.json +30 -17
  309. package/dist/commands/exec.cjs +0 -164
  310. package/dist/commands/exec.mjs +0 -160
  311. package/dist/commands/exec.mjs.map +0 -1
  312. package/dist/commands/explain.cjs +0 -244
  313. package/dist/commands/explain.mjs +0 -242
  314. package/dist/commands/explain.mjs.map +0 -1
  315. package/dist/commands/index.cjs +0 -8
  316. package/dist/commands/index.mjs +0 -10
  317. package/dist/commands/ls.cjs +0 -242
  318. package/dist/commands/ls.mjs +0 -242
  319. package/dist/commands/ls.mjs.map +0 -1
  320. package/dist/commands/mount.cjs +0 -194
  321. package/dist/commands/mount.mjs +0 -190
  322. package/dist/commands/mount.mjs.map +0 -1
  323. package/dist/commands/read.cjs +0 -264
  324. package/dist/commands/read.mjs +0 -263
  325. package/dist/commands/read.mjs.map +0 -1
  326. package/dist/commands/serve.cjs +0 -144
  327. package/dist/commands/serve.mjs +0 -143
  328. package/dist/commands/serve.mjs.map +0 -1
  329. package/dist/commands/stat.cjs +0 -195
  330. package/dist/commands/stat.mjs +0 -195
  331. package/dist/commands/stat.mjs.map +0 -1
  332. package/dist/commands/write.cjs +0 -85
  333. package/dist/commands/write.mjs +0 -85
  334. package/dist/commands/write.mjs.map +0 -1
  335. package/dist/config/provider-factory.cjs +0 -400
  336. package/dist/config/provider-factory.mjs +0 -401
  337. package/dist/config/provider-factory.mjs.map +0 -1
  338. package/dist/config/uri-parser.cjs +0 -285
  339. package/dist/config/uri-parser.mjs +0 -285
  340. package/dist/config/uri-parser.mjs.map +0 -1
  341. package/dist/runtime.cjs +0 -120
  342. package/dist/runtime.mjs +0 -120
  343. package/dist/runtime.mjs.map +0 -1
  344. package/dist/utils/meta.cjs +0 -51
  345. package/dist/utils/meta.mjs +0 -49
  346. package/dist/utils/meta.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"mount.mjs","names":[],"sources":["../../src/commands/mount.ts"],"sourcesContent":["import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\nimport { CONFIG_DIR_NAME, CONFIG_FILE_NAME, ConfigLoader } from \"../config/loader.js\";\nimport { MountSchema } from \"../config/schema.js\";\nimport { colors } from \"../ui/index.js\";\nimport type { ViewType } from \"./ls.js\";\n\nexport interface MountEntry {\n path: string;\n uri: string;\n description?: string;\n access_mode?: \"readonly\" | \"readwrite\";\n auth?: string;\n token?: string;\n options?: Record<string, unknown>;\n}\n\nexport interface MountListResult {\n mounts: MountEntry[];\n}\n\nexport interface MountCommandResult {\n success: boolean;\n message?: string;\n /** The normalized path (for display after successful add) */\n normalizedPath?: string;\n}\n\nexport interface MountValidateResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Check if a path looks like a remote Git URL\n * Matches SSH format (git@host:path) or embedded protocols (https://, http://, ssh://)\n */\nfunction isRemoteGitUrl(path: string): boolean {\n // SSH format: git@github.com:user/repo.git or user@host:path\n if (/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+:/.test(path)) {\n return true;\n }\n // Embedded protocol: https://github.com/user/repo.git\n if (/^(https?|ssh|git):\\/\\//.test(path)) {\n return true;\n }\n return false;\n}\n\n/**\n * Resolve relative paths in URI to absolute paths\n * Supports fs://, git://, sqlite://, json:// schemes\n * Paths without protocol prefix are treated as fs:// paths (unless it's a remote git URL)\n */\nfunction resolveUriPath(uri: string, cwd: string): string {\n const schemeMatch = uri.match(/^([a-z]+):\\/\\//);\n\n // No protocol prefix\n if (!schemeMatch) {\n // Check if it's a remote git URL (SSH format like git@github.com:user/repo.git)\n if (isRemoteGitUrl(uri)) {\n return `git://${uri}`;\n }\n // Treat as local filesystem path\n const absolutePath = isAbsolute(uri) ? uri : resolve(cwd, uri);\n return `fs://${absolutePath}`;\n }\n\n const scheme = schemeMatch[1];\n const pathPart = uri.slice(schemeMatch[0].length);\n\n // Only resolve for local file-based schemes\n if (![\"fs\", \"git\", \"sqlite\", \"json\"].includes(scheme!)) {\n return uri;\n }\n\n // For git:// scheme, check if the path is a remote URL (not a local path)\n if (scheme === \"git\" && isRemoteGitUrl(pathPart)) {\n return uri;\n }\n\n // If path is already absolute, return as-is\n if (isAbsolute(pathPart)) {\n return uri;\n }\n\n // Resolve relative path against cwd\n const absolutePath = resolve(cwd, pathPart);\n return `${scheme}://${absolutePath}`;\n}\n\n/**\n * List all mounts from config (merged from all config layers)\n */\nexport async function mountListCommand(cwd: string): Promise<MountListResult> {\n const loader = new ConfigLoader();\n const config = await loader.load(cwd);\n return {\n mounts: config.mounts as MountEntry[],\n };\n}\n\n/**\n * Add a mount to config\n */\nexport async function mountAddCommand(\n cwd: string,\n path: string,\n uri: string,\n options: { description?: string; token?: string } = {},\n): Promise<MountCommandResult> {\n // Check for empty URI before resolving (resolveUriPath would transform empty string)\n if (!uri || uri.trim() === \"\") {\n return {\n success: false,\n message: \"URI is required\",\n };\n }\n\n // Resolve relative paths in URI to absolute paths\n const resolvedUri = resolveUriPath(uri, cwd);\n\n // Validate and normalize inputs using schema\n // The schema transforms path (normalizes it) and validates all fields\n const validation = MountSchema.safeParse({\n path,\n uri: resolvedUri,\n ...options,\n });\n if (!validation.success) {\n const errors = validation.error.errors.map((e) => e.message).join(\"; \");\n return {\n success: false,\n message: errors,\n };\n }\n\n // Build mount entry with validated/normalized path and resolved URI\n const newMount: MountEntry = {\n path: validation.data.path, // Use normalized path from schema\n uri: validation.data.uri,\n ...(options.description && { description: options.description }),\n ...(options.token && { token: options.token }),\n };\n\n const configDir = join(cwd, CONFIG_DIR_NAME);\n const configPath = join(configDir, CONFIG_FILE_NAME);\n\n // Load existing config or create new\n const config: { mounts: MountEntry[] } = { mounts: [] };\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = parse(content) as { mounts?: MountEntry[] };\n config.mounts = parsed.mounts ?? [];\n } catch {\n // Config doesn't exist, will create\n }\n\n // Check for duplicate path (use normalized path for comparison)\n const normalizedPath = validation.data.path;\n if (config.mounts.some((m) => m.path === normalizedPath)) {\n return {\n success: false,\n message: `Mount path \"${normalizedPath}\" already exists`,\n };\n }\n\n // Add validated mount\n config.mounts.push(newMount);\n\n // Ensure config directory exists\n try {\n await mkdir(configDir, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Write config\n await writeFile(configPath, stringify(config), \"utf-8\");\n\n return {\n success: true,\n normalizedPath,\n };\n}\n\n/**\n * Remove a mount from config\n */\nexport async function mountRemoveCommand(cwd: string, path: string): Promise<MountCommandResult> {\n const configPath = join(cwd, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = parse(content) as { mounts?: MountEntry[] };\n const mounts = config.mounts ?? [];\n\n const index = mounts.findIndex((m) => m.path === path);\n if (index === -1) {\n return {\n success: false,\n message: `Mount path \"${path}\" not found`,\n };\n }\n\n mounts.splice(index, 1);\n config.mounts = mounts;\n\n await writeFile(configPath, stringify(config), \"utf-8\");\n\n return {\n success: true,\n };\n } catch {\n return {\n success: false,\n message: `Mount path \"${path}\" not found`,\n };\n }\n}\n\n/**\n * Validate mount configuration\n */\nexport async function mountValidateCommand(cwd: string): Promise<MountValidateResult> {\n const configPath = join(cwd, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n const errors: string[] = [];\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const config = parse(content) as { mounts?: MountEntry[] };\n const mounts = config.mounts ?? [];\n\n for (const mount of mounts) {\n // Validate mount using schema\n const validation = MountSchema.safeParse(mount);\n if (!validation.success) {\n for (const err of validation.error.errors) {\n errors.push(`Mount \"${mount.path}\": ${err.message}`);\n }\n continue;\n }\n\n // For fs:// URIs, check if target exists\n if (mount.uri.startsWith(\"fs://\")) {\n const targetPath = mount.uri.replace(\"fs://\", \"\");\n try {\n await access(targetPath);\n } catch {\n errors.push(`Mount target \"${targetPath}\" does not exist`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n } catch {\n return {\n valid: true,\n errors: [],\n };\n }\n}\n\n/**\n * Format mount list output for different views\n */\nexport function formatMountListOutput(mounts: MountEntry[], view: ViewType): string {\n switch (view) {\n case \"json\":\n return JSON.stringify({ mounts }, null, 2);\n case \"llm\":\n return formatLlm(mounts);\n case \"human\":\n return formatHuman(mounts);\n default:\n return formatDefault(mounts);\n }\n}\n\nfunction formatDefault(mounts: MountEntry[]): string {\n if (mounts.length === 0) {\n return \"No mounts configured\";\n }\n\n return mounts\n .map((m) => {\n const desc = m.description ? ` (${m.description})` : \"\";\n return `${m.path} → ${m.uri}${desc}`;\n })\n .join(\"\\n\");\n}\n\nfunction formatLlm(mounts: MountEntry[]): string {\n if (mounts.length === 0) {\n return \"NO_MOUNTS\";\n }\n\n return mounts\n .map((m) => {\n const lines = [`MOUNT ${m.path}`, `URI=${m.uri}`];\n if (m.description) {\n lines.push(`DESC=${m.description}`);\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatHuman(mounts: MountEntry[]): string {\n if (mounts.length === 0) {\n return colors.dim(\"No mounts configured.\");\n }\n\n const lines = [colors.bold(\"Configured Mounts:\"), \"\"];\n for (const m of mounts) {\n lines.push(` ${colors.cyan(m.path)}`);\n lines.push(` ${colors.dim(\"URI:\")} ${m.uri}`);\n if (m.description) {\n lines.push(` ${colors.dim(\"Description:\")} ${m.description}`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd();\n}\n"],"mappings":"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"}
@@ -1,264 +0,0 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const require_meta = require('../utils/meta.cjs');
3
- let _aigne_afs = require("@aigne/afs");
4
-
5
- //#region src/commands/read.ts
6
- /**
7
- * Read file content
8
- */
9
- async function readCommand(runtime, path) {
10
- let result;
11
- try {
12
- result = await runtime.read(path);
13
- } catch (error) {
14
- if (error instanceof _aigne_afs.AFSNotFoundError) return {
15
- path,
16
- content: void 0
17
- };
18
- throw error;
19
- }
20
- if (!result.data) return {
21
- path,
22
- content: void 0
23
- };
24
- const entry = result.data;
25
- const isMeta = require_meta.isMetaPath(path);
26
- const isAction = require_meta.isActionsPath(path);
27
- const content = isMeta ? entry.content : typeof entry.content === "string" ? entry.content : entry.content !== void 0 ? JSON.stringify(entry.content) : void 0;
28
- const readResult = {
29
- path: entry.path,
30
- content,
31
- isMeta,
32
- isAction,
33
- size: entry.metadata?.size,
34
- mimeType: entry.metadata?.mimeType,
35
- childrenCount: entry.metadata?.childrenCount
36
- };
37
- if (!isMeta && !isAction) try {
38
- const statResult = await runtime.stat(path);
39
- if (statResult.data?.actions && statResult.data.actions.length > 0) readResult.actions = statResult.data.actions;
40
- } catch {}
41
- const meta = extractMeta(entry.metadata);
42
- if (meta && Object.keys(meta).length > 0) readResult.meta = meta;
43
- return readResult;
44
- }
45
- /**
46
- * Extract meta fields from entry metadata
47
- * Excludes built-in fields that are exposed separately
48
- */
49
- function extractMeta(metadata) {
50
- if (!metadata) return void 0;
51
- const builtInFields = new Set([
52
- "type",
53
- "size",
54
- "mimeType",
55
- "childrenCount"
56
- ]);
57
- const meta = {};
58
- for (const [key, value] of Object.entries(metadata)) if (!builtInFields.has(key) && value !== void 0) meta[key] = value;
59
- return Object.keys(meta).length > 0 ? meta : void 0;
60
- }
61
- /**
62
- * Extract user-defined metadata (excludes system fields)
63
- */
64
- function extractUserMetadata(meta) {
65
- if (!meta) return {};
66
- const systemFields = new Set([
67
- "kind",
68
- "kinds",
69
- "childrenCount",
70
- "inputSchema",
71
- "required",
72
- "description"
73
- ]);
74
- return Object.fromEntries(Object.entries(meta).filter(([k]) => !systemFields.has(k)));
75
- }
76
- /**
77
- * Format params summary: format*,path,limit (* = required)
78
- */
79
- function formatParamsSummary(schema, required = []) {
80
- if (!schema) return "";
81
- const props = schema.properties || schema;
82
- return Object.keys(props).map((name) => required.includes(name) ? `${name}*` : name).join(",");
83
- }
84
- /**
85
- * Check if entry is executable (has afs:executable in kinds)
86
- */
87
- function isExecutable(meta) {
88
- if (!meta?.kinds) return false;
89
- return meta.kinds.includes("afs:executable");
90
- }
91
- /**
92
- * Format read output for different views
93
- */
94
- function formatReadOutput(read, view) {
95
- switch (view) {
96
- case "json": return formatJson(read);
97
- case "llm": return formatLlm(read);
98
- case "human": return formatHuman(read);
99
- default: return formatDefault(read);
100
- }
101
- }
102
- /**
103
- * Default format: Raw content or one-liner summary
104
- * - If content exists: show raw content
105
- * - If no content (directories): show one-liner summary /path kind children=N actions=a,b,c
106
- * - For executables: /path afs:executable params=format*,path,limit
107
- * - For meta paths: raw JSON
108
- */
109
- function formatDefault(read) {
110
- if (read.isMeta && typeof read.content === "object") return JSON.stringify(read.content, null, 2);
111
- if (read.isAction && isExecutable(read.meta)) {
112
- if (read.content !== void 0 && read.content !== null && read.content !== "") return typeof read.content === "string" ? read.content : JSON.stringify(read.content, null, 2);
113
- const parts$1 = [read.path, "afs:executable"];
114
- if (read.meta?.inputSchema) {
115
- const params = formatParamsSummary(read.meta.inputSchema, read.meta.required);
116
- if (params) parts$1.push(`params=${params}`);
117
- }
118
- return parts$1.join(" ");
119
- }
120
- if (read.content !== void 0 && read.content !== null && read.content !== "") return typeof read.content === "string" ? read.content : JSON.stringify(read.content, null, 2);
121
- const parts = [read.path];
122
- if (read.meta?.kind) parts.push(read.meta.kind);
123
- if (read.childrenCount !== void 0) parts.push(`children=${read.childrenCount}`);
124
- if (read.actions && read.actions.length > 0) parts.push(`actions=${read.actions.map((a) => a.name).join(",")}`);
125
- return parts.join(" ");
126
- }
127
- /**
128
- * JSON format (includes meta field for regular files if present)
129
- */
130
- function formatJson(read) {
131
- return JSON.stringify(read, null, 2);
132
- }
133
- /**
134
- * LLM format: Structured text for AI parsing
135
- */
136
- function formatLlm(read) {
137
- const lines = [];
138
- if (read.isMeta) {
139
- lines.push(`META ${read.path}`);
140
- const content = read.content;
141
- if (content?.kind) lines.push(`KIND ${content.kind}`);
142
- lines.push(`CONTENT`);
143
- lines.push(JSON.stringify(content));
144
- return lines.join("\n");
145
- }
146
- if (read.isAction && isExecutable(read.meta)) {
147
- lines.push(`EXECUTABLE ${read.path}`);
148
- if (read.meta?.description) lines.push(`DESCRIPTION "${read.meta.description}"`);
149
- if (read.meta?.inputSchema) {
150
- const props = read.meta.inputSchema.properties || {};
151
- const required = read.meta.required || [];
152
- for (const [name, propDef] of Object.entries(props)) {
153
- const prop = propDef;
154
- const isReq = required.includes(name);
155
- let paramLine = `PARAM ${name} TYPE ${prop.type || "any"}`;
156
- paramLine += isReq ? " REQUIRED" : " OPTIONAL";
157
- if (prop.enum) paramLine += ` CHOICES ${prop.enum.join(",")}`;
158
- if (prop.default !== void 0) paramLine += ` DEFAULT ${prop.default}`;
159
- lines.push(paramLine);
160
- }
161
- }
162
- return lines.join("\n");
163
- }
164
- lines.push(`NODE ${read.path}`);
165
- if (read.meta?.kind) lines.push(`KIND ${read.meta.kind}`);
166
- if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) lines.push(`KINDS ${read.meta.kinds.join(" ")}`);
167
- if (read.childrenCount !== void 0) lines.push(`CHILDREN ${read.childrenCount}`);
168
- if (read.mimeType) lines.push(`MIME ${read.mimeType}`);
169
- if (read.size !== void 0) lines.push(`SIZE ${read.size}`);
170
- const userMeta = extractUserMetadata(read.meta);
171
- if (Object.keys(userMeta).length > 0) {
172
- const metaStr = Object.entries(userMeta).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(" ");
173
- lines.push(`META ${metaStr}`);
174
- }
175
- if (read.actions && read.actions.length > 0) lines.push(`ACTIONS ${read.actions.map((a) => a.name).join(" ")}`);
176
- if (read.content !== void 0 && read.content !== null && read.content !== "") lines.push(`CONTENT ${JSON.stringify(read.content)}`);
177
- return lines.join("\n");
178
- }
179
- /**
180
- * Human format: Formatted display with metadata and actions
181
- */
182
- function formatHuman(read) {
183
- const lines = [];
184
- if (read.isMeta && typeof read.content === "object") {
185
- lines.push(`Metadata for ${read.path.replace(/\/.meta$/, "")}`);
186
- lines.push("");
187
- lines.push(JSON.stringify(read.content, null, 2));
188
- return lines.join("\n");
189
- }
190
- if (read.isAction && isExecutable(read.meta)) {
191
- const actionName = read.path.split("/").pop() || "action";
192
- lines.push(`Action: ${actionName}`);
193
- lines.push(`Path: ${read.path}`);
194
- if (read.meta?.description) {
195
- lines.push("");
196
- lines.push("Description:");
197
- lines.push(` ${read.meta.description}`);
198
- }
199
- if (read.meta?.inputSchema) {
200
- const props = read.meta.inputSchema.properties || {};
201
- const required = read.meta.required || [];
202
- if (Object.keys(props).length > 0) {
203
- lines.push("");
204
- lines.push("Parameters:");
205
- for (const [name, propDef] of Object.entries(props)) {
206
- const prop = propDef;
207
- const isReq = required.includes(name);
208
- const typeStr = `<${prop.type || "any"}>`;
209
- const reqLabel = isReq ? "(required)" : "(optional)";
210
- let line = ` --${name} ${typeStr}`.padEnd(24);
211
- line += prop.description || "";
212
- line += ` ${reqLabel}`;
213
- lines.push(line);
214
- if (prop.enum) lines.push(`${"".padEnd(24)}Choices: ${prop.enum.join(", ")}`);
215
- if (prop.default !== void 0) lines.push(`${"".padEnd(24)}Default: ${prop.default}`);
216
- }
217
- }
218
- }
219
- lines.push("");
220
- lines.push("Usage:");
221
- lines.push(` afs exec ${read.path}`);
222
- return lines.join("\n");
223
- }
224
- lines.push(read.path);
225
- lines.push("");
226
- if (read.meta?.kind) lines.push(`Kind: ${read.meta.kind}`);
227
- if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) lines.push(`Kinds: ${read.meta.kinds.join(" → ")}`);
228
- if (read.childrenCount !== void 0) lines.push(`Children: ${read.childrenCount}`);
229
- const userMeta = extractUserMetadata(read.meta);
230
- if (Object.keys(userMeta).length > 0) {
231
- lines.push("");
232
- lines.push("Metadata:");
233
- for (const [key, value] of Object.entries(userMeta)) lines.push(` ${key.padEnd(12)} ${formatValue(value)}`);
234
- }
235
- if (read.actions && read.actions.length > 0) {
236
- lines.push("");
237
- lines.push(`Actions: ${read.actions.map((a) => a.name).join(", ")}`);
238
- }
239
- if (read.content !== void 0 && read.content !== null && read.content !== "") {
240
- lines.push("");
241
- lines.push("Content:");
242
- lines.push(formatContent(read.content));
243
- } else if (read.childrenCount !== void 0 && read.childrenCount > 0) {
244
- lines.push("");
245
- lines.push("Content:");
246
- lines.push(" (directory - use 'afs ls' to list children)");
247
- }
248
- return lines.join("\n");
249
- }
250
- function formatValue(value) {
251
- if (value === null || value === void 0) return "";
252
- if (typeof value === "string") return value;
253
- if (typeof value === "number" || typeof value === "boolean") return String(value);
254
- if (Array.isArray(value)) return value.join(", ");
255
- return JSON.stringify(value);
256
- }
257
- function formatContent(content) {
258
- if (typeof content === "string") return content.split("\n").map((line) => ` ${line}`).join("\n");
259
- return ` ${JSON.stringify(content, null, 2).split("\n").join("\n ")}`;
260
- }
261
-
262
- //#endregion
263
- exports.formatReadOutput = formatReadOutput;
264
- exports.readCommand = readCommand;
@@ -1,263 +0,0 @@
1
- import { isActionsPath, isMetaPath } from "../utils/meta.mjs";
2
- import { AFSNotFoundError } from "@aigne/afs";
3
-
4
- //#region src/commands/read.ts
5
- /**
6
- * Read file content
7
- */
8
- async function readCommand(runtime, path) {
9
- let result;
10
- try {
11
- result = await runtime.read(path);
12
- } catch (error) {
13
- if (error instanceof AFSNotFoundError) return {
14
- path,
15
- content: void 0
16
- };
17
- throw error;
18
- }
19
- if (!result.data) return {
20
- path,
21
- content: void 0
22
- };
23
- const entry = result.data;
24
- const isMeta = isMetaPath(path);
25
- const isAction = isActionsPath(path);
26
- const content = isMeta ? entry.content : typeof entry.content === "string" ? entry.content : entry.content !== void 0 ? JSON.stringify(entry.content) : void 0;
27
- const readResult = {
28
- path: entry.path,
29
- content,
30
- isMeta,
31
- isAction,
32
- size: entry.metadata?.size,
33
- mimeType: entry.metadata?.mimeType,
34
- childrenCount: entry.metadata?.childrenCount
35
- };
36
- if (!isMeta && !isAction) try {
37
- const statResult = await runtime.stat(path);
38
- if (statResult.data?.actions && statResult.data.actions.length > 0) readResult.actions = statResult.data.actions;
39
- } catch {}
40
- const meta = extractMeta(entry.metadata);
41
- if (meta && Object.keys(meta).length > 0) readResult.meta = meta;
42
- return readResult;
43
- }
44
- /**
45
- * Extract meta fields from entry metadata
46
- * Excludes built-in fields that are exposed separately
47
- */
48
- function extractMeta(metadata) {
49
- if (!metadata) return void 0;
50
- const builtInFields = new Set([
51
- "type",
52
- "size",
53
- "mimeType",
54
- "childrenCount"
55
- ]);
56
- const meta = {};
57
- for (const [key, value] of Object.entries(metadata)) if (!builtInFields.has(key) && value !== void 0) meta[key] = value;
58
- return Object.keys(meta).length > 0 ? meta : void 0;
59
- }
60
- /**
61
- * Extract user-defined metadata (excludes system fields)
62
- */
63
- function extractUserMetadata(meta) {
64
- if (!meta) return {};
65
- const systemFields = new Set([
66
- "kind",
67
- "kinds",
68
- "childrenCount",
69
- "inputSchema",
70
- "required",
71
- "description"
72
- ]);
73
- return Object.fromEntries(Object.entries(meta).filter(([k]) => !systemFields.has(k)));
74
- }
75
- /**
76
- * Format params summary: format*,path,limit (* = required)
77
- */
78
- function formatParamsSummary(schema, required = []) {
79
- if (!schema) return "";
80
- const props = schema.properties || schema;
81
- return Object.keys(props).map((name) => required.includes(name) ? `${name}*` : name).join(",");
82
- }
83
- /**
84
- * Check if entry is executable (has afs:executable in kinds)
85
- */
86
- function isExecutable(meta) {
87
- if (!meta?.kinds) return false;
88
- return meta.kinds.includes("afs:executable");
89
- }
90
- /**
91
- * Format read output for different views
92
- */
93
- function formatReadOutput(read, view) {
94
- switch (view) {
95
- case "json": return formatJson(read);
96
- case "llm": return formatLlm(read);
97
- case "human": return formatHuman(read);
98
- default: return formatDefault(read);
99
- }
100
- }
101
- /**
102
- * Default format: Raw content or one-liner summary
103
- * - If content exists: show raw content
104
- * - If no content (directories): show one-liner summary /path kind children=N actions=a,b,c
105
- * - For executables: /path afs:executable params=format*,path,limit
106
- * - For meta paths: raw JSON
107
- */
108
- function formatDefault(read) {
109
- if (read.isMeta && typeof read.content === "object") return JSON.stringify(read.content, null, 2);
110
- if (read.isAction && isExecutable(read.meta)) {
111
- if (read.content !== void 0 && read.content !== null && read.content !== "") return typeof read.content === "string" ? read.content : JSON.stringify(read.content, null, 2);
112
- const parts$1 = [read.path, "afs:executable"];
113
- if (read.meta?.inputSchema) {
114
- const params = formatParamsSummary(read.meta.inputSchema, read.meta.required);
115
- if (params) parts$1.push(`params=${params}`);
116
- }
117
- return parts$1.join(" ");
118
- }
119
- if (read.content !== void 0 && read.content !== null && read.content !== "") return typeof read.content === "string" ? read.content : JSON.stringify(read.content, null, 2);
120
- const parts = [read.path];
121
- if (read.meta?.kind) parts.push(read.meta.kind);
122
- if (read.childrenCount !== void 0) parts.push(`children=${read.childrenCount}`);
123
- if (read.actions && read.actions.length > 0) parts.push(`actions=${read.actions.map((a) => a.name).join(",")}`);
124
- return parts.join(" ");
125
- }
126
- /**
127
- * JSON format (includes meta field for regular files if present)
128
- */
129
- function formatJson(read) {
130
- return JSON.stringify(read, null, 2);
131
- }
132
- /**
133
- * LLM format: Structured text for AI parsing
134
- */
135
- function formatLlm(read) {
136
- const lines = [];
137
- if (read.isMeta) {
138
- lines.push(`META ${read.path}`);
139
- const content = read.content;
140
- if (content?.kind) lines.push(`KIND ${content.kind}`);
141
- lines.push(`CONTENT`);
142
- lines.push(JSON.stringify(content));
143
- return lines.join("\n");
144
- }
145
- if (read.isAction && isExecutable(read.meta)) {
146
- lines.push(`EXECUTABLE ${read.path}`);
147
- if (read.meta?.description) lines.push(`DESCRIPTION "${read.meta.description}"`);
148
- if (read.meta?.inputSchema) {
149
- const props = read.meta.inputSchema.properties || {};
150
- const required = read.meta.required || [];
151
- for (const [name, propDef] of Object.entries(props)) {
152
- const prop = propDef;
153
- const isReq = required.includes(name);
154
- let paramLine = `PARAM ${name} TYPE ${prop.type || "any"}`;
155
- paramLine += isReq ? " REQUIRED" : " OPTIONAL";
156
- if (prop.enum) paramLine += ` CHOICES ${prop.enum.join(",")}`;
157
- if (prop.default !== void 0) paramLine += ` DEFAULT ${prop.default}`;
158
- lines.push(paramLine);
159
- }
160
- }
161
- return lines.join("\n");
162
- }
163
- lines.push(`NODE ${read.path}`);
164
- if (read.meta?.kind) lines.push(`KIND ${read.meta.kind}`);
165
- if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) lines.push(`KINDS ${read.meta.kinds.join(" ")}`);
166
- if (read.childrenCount !== void 0) lines.push(`CHILDREN ${read.childrenCount}`);
167
- if (read.mimeType) lines.push(`MIME ${read.mimeType}`);
168
- if (read.size !== void 0) lines.push(`SIZE ${read.size}`);
169
- const userMeta = extractUserMetadata(read.meta);
170
- if (Object.keys(userMeta).length > 0) {
171
- const metaStr = Object.entries(userMeta).map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(" ");
172
- lines.push(`META ${metaStr}`);
173
- }
174
- if (read.actions && read.actions.length > 0) lines.push(`ACTIONS ${read.actions.map((a) => a.name).join(" ")}`);
175
- if (read.content !== void 0 && read.content !== null && read.content !== "") lines.push(`CONTENT ${JSON.stringify(read.content)}`);
176
- return lines.join("\n");
177
- }
178
- /**
179
- * Human format: Formatted display with metadata and actions
180
- */
181
- function formatHuman(read) {
182
- const lines = [];
183
- if (read.isMeta && typeof read.content === "object") {
184
- lines.push(`Metadata for ${read.path.replace(/\/.meta$/, "")}`);
185
- lines.push("");
186
- lines.push(JSON.stringify(read.content, null, 2));
187
- return lines.join("\n");
188
- }
189
- if (read.isAction && isExecutable(read.meta)) {
190
- const actionName = read.path.split("/").pop() || "action";
191
- lines.push(`Action: ${actionName}`);
192
- lines.push(`Path: ${read.path}`);
193
- if (read.meta?.description) {
194
- lines.push("");
195
- lines.push("Description:");
196
- lines.push(` ${read.meta.description}`);
197
- }
198
- if (read.meta?.inputSchema) {
199
- const props = read.meta.inputSchema.properties || {};
200
- const required = read.meta.required || [];
201
- if (Object.keys(props).length > 0) {
202
- lines.push("");
203
- lines.push("Parameters:");
204
- for (const [name, propDef] of Object.entries(props)) {
205
- const prop = propDef;
206
- const isReq = required.includes(name);
207
- const typeStr = `<${prop.type || "any"}>`;
208
- const reqLabel = isReq ? "(required)" : "(optional)";
209
- let line = ` --${name} ${typeStr}`.padEnd(24);
210
- line += prop.description || "";
211
- line += ` ${reqLabel}`;
212
- lines.push(line);
213
- if (prop.enum) lines.push(`${"".padEnd(24)}Choices: ${prop.enum.join(", ")}`);
214
- if (prop.default !== void 0) lines.push(`${"".padEnd(24)}Default: ${prop.default}`);
215
- }
216
- }
217
- }
218
- lines.push("");
219
- lines.push("Usage:");
220
- lines.push(` afs exec ${read.path}`);
221
- return lines.join("\n");
222
- }
223
- lines.push(read.path);
224
- lines.push("");
225
- if (read.meta?.kind) lines.push(`Kind: ${read.meta.kind}`);
226
- if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) lines.push(`Kinds: ${read.meta.kinds.join(" → ")}`);
227
- if (read.childrenCount !== void 0) lines.push(`Children: ${read.childrenCount}`);
228
- const userMeta = extractUserMetadata(read.meta);
229
- if (Object.keys(userMeta).length > 0) {
230
- lines.push("");
231
- lines.push("Metadata:");
232
- for (const [key, value] of Object.entries(userMeta)) lines.push(` ${key.padEnd(12)} ${formatValue(value)}`);
233
- }
234
- if (read.actions && read.actions.length > 0) {
235
- lines.push("");
236
- lines.push(`Actions: ${read.actions.map((a) => a.name).join(", ")}`);
237
- }
238
- if (read.content !== void 0 && read.content !== null && read.content !== "") {
239
- lines.push("");
240
- lines.push("Content:");
241
- lines.push(formatContent(read.content));
242
- } else if (read.childrenCount !== void 0 && read.childrenCount > 0) {
243
- lines.push("");
244
- lines.push("Content:");
245
- lines.push(" (directory - use 'afs ls' to list children)");
246
- }
247
- return lines.join("\n");
248
- }
249
- function formatValue(value) {
250
- if (value === null || value === void 0) return "";
251
- if (typeof value === "string") return value;
252
- if (typeof value === "number" || typeof value === "boolean") return String(value);
253
- if (Array.isArray(value)) return value.join(", ");
254
- return JSON.stringify(value);
255
- }
256
- function formatContent(content) {
257
- if (typeof content === "string") return content.split("\n").map((line) => ` ${line}`).join("\n");
258
- return ` ${JSON.stringify(content, null, 2).split("\n").join("\n ")}`;
259
- }
260
-
261
- //#endregion
262
- export { formatReadOutput, readCommand };
263
- //# sourceMappingURL=read.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"read.mjs","names":["parts"],"sources":["../../src/commands/read.ts"],"sourcesContent":["import { type ActionSummary, AFSNotFoundError } from \"@aigne/afs\";\nimport type { AFSRuntime } from \"../runtime.js\";\nimport { isActionsPath, isMetaPath } from \"../utils/meta.js\";\nimport type { ViewType } from \"./ls.js\";\n\nexport interface ReadResult {\n path: string;\n content?: string | object;\n isMeta?: boolean;\n isAction?: boolean;\n size?: number;\n mimeType?: string;\n childrenCount?: number;\n /** Actions available on this node (from stat) */\n actions?: ActionSummary[];\n meta?: {\n kind?: string;\n kinds?: string[];\n description?: string;\n inputSchema?: Record<string, unknown>;\n required?: string[];\n [key: string]: unknown;\n };\n}\n\n/**\n * Read file content\n */\nexport async function readCommand(runtime: AFSRuntime, path: string): Promise<ReadResult> {\n let result: Awaited<ReturnType<typeof runtime.read>>;\n try {\n result = await runtime.read(path);\n } catch (error) {\n if (error instanceof AFSNotFoundError) {\n return { path, content: undefined };\n }\n throw error;\n }\n\n if (!result.data) {\n return {\n path,\n content: undefined,\n };\n }\n\n const entry = result.data;\n const isMeta = isMetaPath(path);\n const isAction = isActionsPath(path);\n\n // For meta paths, content is already an object\n const content = isMeta\n ? entry.content\n : typeof entry.content === \"string\"\n ? entry.content\n : entry.content !== undefined\n ? JSON.stringify(entry.content)\n : undefined;\n\n const readResult: ReadResult = {\n path: entry.path,\n content,\n isMeta,\n isAction,\n size: entry.metadata?.size,\n mimeType: entry.metadata?.mimeType,\n childrenCount: entry.metadata?.childrenCount,\n };\n\n // Try to get actions from stat for non-meta/non-action paths\n if (!isMeta && !isAction) {\n try {\n const statResult = await runtime.stat(path);\n if (statResult.data?.actions && statResult.data.actions.length > 0) {\n readResult.actions = statResult.data.actions;\n }\n } catch {\n // stat not supported, actions will be undefined\n }\n }\n\n // Add meta for all paths (includes kind, kinds, inputSchema for actions)\n const meta = extractMeta(entry.metadata);\n if (meta && Object.keys(meta).length > 0) {\n readResult.meta = meta;\n }\n\n return readResult;\n}\n\n/**\n * Extract meta fields from entry metadata\n * Excludes built-in fields that are exposed separately\n */\nfunction extractMeta(\n metadata: Record<string, unknown> | null | undefined,\n): ReadResult[\"meta\"] | undefined {\n if (!metadata) return undefined;\n\n // Built-in fields that are exposed as separate ReadResult fields\n const builtInFields = new Set([\"type\", \"size\", \"mimeType\", \"childrenCount\"]);\n\n const meta: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n if (!builtInFields.has(key) && value !== undefined) {\n meta[key] = value;\n }\n }\n\n return Object.keys(meta).length > 0 ? (meta as ReadResult[\"meta\"]) : undefined;\n}\n\n/**\n * Extract user-defined metadata (excludes system fields)\n */\nfunction extractUserMetadata(meta: ReadResult[\"meta\"]): Record<string, unknown> {\n if (!meta) return {};\n const systemFields = new Set([\n \"kind\",\n \"kinds\",\n \"childrenCount\",\n \"inputSchema\",\n \"required\",\n \"description\",\n ]);\n return Object.fromEntries(Object.entries(meta).filter(([k]) => !systemFields.has(k)));\n}\n\n/**\n * Format params summary: format*,path,limit (* = required)\n */\nfunction formatParamsSummary(\n schema: Record<string, unknown> | undefined,\n required: string[] = [],\n): string {\n if (!schema) return \"\";\n const props = (schema as { properties?: Record<string, unknown> }).properties || schema;\n return Object.keys(props)\n .map((name) => (required.includes(name) ? `${name}*` : name))\n .join(\",\");\n}\n\n/**\n * Check if entry is executable (has afs:executable in kinds)\n */\nfunction isExecutable(meta: ReadResult[\"meta\"]): boolean {\n if (!meta?.kinds) return false;\n const kinds = meta.kinds as string[];\n return kinds.includes(\"afs:executable\");\n}\n\n/**\n * Format read output for different views\n */\nexport function formatReadOutput(read: ReadResult, view: ViewType): string {\n switch (view) {\n case \"json\":\n return formatJson(read);\n case \"llm\":\n return formatLlm(read);\n case \"human\":\n return formatHuman(read);\n default:\n return formatDefault(read);\n }\n}\n\n/**\n * Default format: Raw content or one-liner summary\n * - If content exists: show raw content\n * - If no content (directories): show one-liner summary /path kind children=N actions=a,b,c\n * - For executables: /path afs:executable params=format*,path,limit\n * - For meta paths: raw JSON\n */\nfunction formatDefault(read: ReadResult): string {\n // For meta paths, show raw JSON\n if (read.isMeta && typeof read.content === \"object\") {\n return JSON.stringify(read.content, null, 2);\n }\n\n // For executables (actions) without content, show one-liner with params\n if (read.isAction && isExecutable(read.meta)) {\n // If there's content, show it\n if (read.content !== undefined && read.content !== null && read.content !== \"\") {\n return typeof read.content === \"string\"\n ? read.content\n : JSON.stringify(read.content, null, 2);\n }\n // Otherwise show one-liner summary\n const parts = [read.path, \"afs:executable\"];\n if (read.meta?.inputSchema) {\n const params = formatParamsSummary(read.meta.inputSchema, read.meta.required as string[]);\n if (params) {\n parts.push(`params=${params}`);\n }\n }\n return parts.join(\" \");\n }\n\n // If there's content, show raw content\n if (read.content !== undefined && read.content !== null && read.content !== \"\") {\n return typeof read.content === \"string\" ? read.content : JSON.stringify(read.content, null, 2);\n }\n\n // For directories (no content), show one-liner summary\n const parts = [read.path];\n\n if (read.meta?.kind) {\n parts.push(read.meta.kind as string);\n }\n\n if (read.childrenCount !== undefined) {\n parts.push(`children=${read.childrenCount}`);\n }\n\n if (read.actions && read.actions.length > 0) {\n parts.push(`actions=${read.actions.map((a) => a.name).join(\",\")}`);\n }\n\n return parts.join(\" \");\n}\n\n/**\n * JSON format (includes meta field for regular files if present)\n */\nfunction formatJson(read: ReadResult): string {\n return JSON.stringify(read, null, 2);\n}\n\n/**\n * LLM format: Structured text for AI parsing\n */\nfunction formatLlm(read: ReadResult): string {\n const lines: string[] = [];\n\n // Use META for meta paths\n if (read.isMeta) {\n lines.push(`META ${read.path}`);\n\n const content = read.content as Record<string, unknown> | undefined;\n if (content?.kind) {\n lines.push(`KIND ${content.kind}`);\n }\n\n lines.push(`CONTENT`);\n lines.push(JSON.stringify(content));\n return lines.join(\"\\n\");\n }\n\n // For action paths (executables), show EXECUTABLE format\n if (read.isAction && isExecutable(read.meta)) {\n lines.push(`EXECUTABLE ${read.path}`);\n\n if (read.meta?.description) {\n lines.push(`DESCRIPTION \"${read.meta.description}\"`);\n }\n\n // Show parameters\n if (read.meta?.inputSchema) {\n const schema = read.meta.inputSchema as { properties?: Record<string, unknown> };\n const props = schema.properties || {};\n const required = (read.meta.required as string[]) || [];\n\n for (const [name, propDef] of Object.entries(props)) {\n const prop = propDef as Record<string, unknown>;\n const isReq = required.includes(name);\n let paramLine = `PARAM ${name} TYPE ${prop.type || \"any\"}`;\n paramLine += isReq ? \" REQUIRED\" : \" OPTIONAL\";\n\n if (prop.enum) {\n paramLine += ` CHOICES ${(prop.enum as string[]).join(\",\")}`;\n }\n if (prop.default !== undefined) {\n paramLine += ` DEFAULT ${prop.default}`;\n }\n lines.push(paramLine);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n // For regular nodes\n lines.push(`NODE ${read.path}`);\n\n if (read.meta?.kind) {\n lines.push(`KIND ${read.meta.kind}`);\n }\n if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) {\n lines.push(`KINDS ${read.meta.kinds.join(\" \")}`);\n }\n\n if (read.childrenCount !== undefined) {\n lines.push(`CHILDREN ${read.childrenCount}`);\n }\n\n if (read.mimeType) {\n lines.push(`MIME ${read.mimeType}`);\n }\n\n if (read.size !== undefined) {\n lines.push(`SIZE ${read.size}`);\n }\n\n // User metadata\n const userMeta = extractUserMetadata(read.meta);\n if (Object.keys(userMeta).length > 0) {\n const metaStr = Object.entries(userMeta)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\" \");\n lines.push(`META ${metaStr}`);\n }\n\n // Actions\n if (read.actions && read.actions.length > 0) {\n lines.push(`ACTIONS ${read.actions.map((a) => a.name).join(\" \")}`);\n }\n\n // Content\n if (read.content !== undefined && read.content !== null && read.content !== \"\") {\n lines.push(`CONTENT ${JSON.stringify(read.content)}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Human format: Formatted display with metadata and actions\n */\nfunction formatHuman(read: ReadResult): string {\n const lines: string[] = [];\n\n // For meta paths, show the content as JSON\n if (read.isMeta && typeof read.content === \"object\") {\n lines.push(`Metadata for ${read.path.replace(/\\/.meta$/, \"\")}`);\n lines.push(\"\");\n lines.push(JSON.stringify(read.content, null, 2));\n return lines.join(\"\\n\");\n }\n\n // For action paths (executables), show action definition\n if (read.isAction && isExecutable(read.meta)) {\n const actionName = read.path.split(\"/\").pop() || \"action\";\n lines.push(`Action: ${actionName}`);\n lines.push(`Path: ${read.path}`);\n\n if (read.meta?.description) {\n lines.push(\"\");\n lines.push(\"Description:\");\n lines.push(` ${read.meta.description}`);\n }\n\n // Show parameters from inputSchema\n if (read.meta?.inputSchema) {\n const schema = read.meta.inputSchema as { properties?: Record<string, unknown> };\n const props = schema.properties || {};\n const required = (read.meta.required as string[]) || [];\n\n if (Object.keys(props).length > 0) {\n lines.push(\"\");\n lines.push(\"Parameters:\");\n for (const [name, propDef] of Object.entries(props)) {\n const prop = propDef as Record<string, unknown>;\n const isReq = required.includes(name);\n const typeStr = `<${prop.type || \"any\"}>`;\n const reqLabel = isReq ? \"(required)\" : \"(optional)\";\n let line = ` --${name} ${typeStr}`.padEnd(24);\n line += prop.description || \"\";\n line += ` ${reqLabel}`;\n lines.push(line);\n\n if (prop.enum) {\n lines.push(`${\"\".padEnd(24)}Choices: ${(prop.enum as string[]).join(\", \")}`);\n }\n if (prop.default !== undefined) {\n lines.push(`${\"\".padEnd(24)}Default: ${prop.default}`);\n }\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\"Usage:\");\n lines.push(` afs exec ${read.path}`);\n\n return lines.join(\"\\n\");\n }\n\n // For regular nodes, show enhanced view\n lines.push(read.path);\n lines.push(\"\");\n\n // Kind info\n if (read.meta?.kind) {\n lines.push(`Kind: ${read.meta.kind}`);\n }\n if (read.meta?.kinds && Array.isArray(read.meta.kinds) && read.meta.kinds.length > 0) {\n lines.push(`Kinds: ${read.meta.kinds.join(\" → \")}`);\n }\n\n // Children\n if (read.childrenCount !== undefined) {\n lines.push(`Children: ${read.childrenCount}`);\n }\n\n // User metadata\n const userMeta = extractUserMetadata(read.meta);\n if (Object.keys(userMeta).length > 0) {\n lines.push(\"\");\n lines.push(\"Metadata:\");\n for (const [key, value] of Object.entries(userMeta)) {\n lines.push(` ${key.padEnd(12)} ${formatValue(value)}`);\n }\n }\n\n // Actions\n if (read.actions && read.actions.length > 0) {\n lines.push(\"\");\n lines.push(`Actions: ${read.actions.map((a) => a.name).join(\", \")}`);\n }\n\n // Content\n if (read.content !== undefined && read.content !== null && read.content !== \"\") {\n lines.push(\"\");\n lines.push(\"Content:\");\n lines.push(formatContent(read.content));\n } else if (read.childrenCount !== undefined && read.childrenCount > 0) {\n lines.push(\"\");\n lines.push(\"Content:\");\n lines.push(\" (directory - use 'afs ls' to list children)\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) return value.join(\", \");\n return JSON.stringify(value);\n}\n\nfunction formatContent(content: unknown): string {\n if (typeof content === \"string\") {\n // Indent content\n return content\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n }\n return ` ${JSON.stringify(content, null, 2).split(\"\\n\").join(\"\\n \")}`;\n}\n"],"mappings":";;;;;;;AA4BA,eAAsB,YAAY,SAAqB,MAAmC;CACxF,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,QAAQ,KAAK,KAAK;UAC1B,OAAO;AACd,MAAI,iBAAiB,iBACnB,QAAO;GAAE;GAAM,SAAS;GAAW;AAErC,QAAM;;AAGR,KAAI,CAAC,OAAO,KACV,QAAO;EACL;EACA,SAAS;EACV;CAGH,MAAM,QAAQ,OAAO;CACrB,MAAM,SAAS,WAAW,KAAK;CAC/B,MAAM,WAAW,cAAc,KAAK;CAGpC,MAAM,UAAU,SACZ,MAAM,UACN,OAAO,MAAM,YAAY,WACvB,MAAM,UACN,MAAM,YAAY,SAChB,KAAK,UAAU,MAAM,QAAQ,GAC7B;CAER,MAAM,aAAyB;EAC7B,MAAM,MAAM;EACZ;EACA;EACA;EACA,MAAM,MAAM,UAAU;EACtB,UAAU,MAAM,UAAU;EAC1B,eAAe,MAAM,UAAU;EAChC;AAGD,KAAI,CAAC,UAAU,CAAC,SACd,KAAI;EACF,MAAM,aAAa,MAAM,QAAQ,KAAK,KAAK;AAC3C,MAAI,WAAW,MAAM,WAAW,WAAW,KAAK,QAAQ,SAAS,EAC/D,YAAW,UAAU,WAAW,KAAK;SAEjC;CAMV,MAAM,OAAO,YAAY,MAAM,SAAS;AACxC,KAAI,QAAQ,OAAO,KAAK,KAAK,CAAC,SAAS,EACrC,YAAW,OAAO;AAGpB,QAAO;;;;;;AAOT,SAAS,YACP,UACgC;AAChC,KAAI,CAAC,SAAU,QAAO;CAGtB,MAAM,gBAAgB,IAAI,IAAI;EAAC;EAAQ;EAAQ;EAAY;EAAgB,CAAC;CAE5E,MAAM,OAAgC,EAAE;AAExC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,CACjD,KAAI,CAAC,cAAc,IAAI,IAAI,IAAI,UAAU,OACvC,MAAK,OAAO;AAIhB,QAAO,OAAO,KAAK,KAAK,CAAC,SAAS,IAAK,OAA8B;;;;;AAMvE,SAAS,oBAAoB,MAAmD;AAC9E,KAAI,CAAC,KAAM,QAAO,EAAE;CACpB,MAAM,eAAe,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AACF,QAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;;;;;AAMvF,SAAS,oBACP,QACA,WAAqB,EAAE,EACf;AACR,KAAI,CAAC,OAAQ,QAAO;CACpB,MAAM,QAAS,OAAoD,cAAc;AACjF,QAAO,OAAO,KAAK,MAAM,CACtB,KAAK,SAAU,SAAS,SAAS,KAAK,GAAG,GAAG,KAAK,KAAK,KAAM,CAC5D,KAAK,IAAI;;;;;AAMd,SAAS,aAAa,MAAmC;AACvD,KAAI,CAAC,MAAM,MAAO,QAAO;AAEzB,QADc,KAAK,MACN,SAAS,iBAAiB;;;;;AAMzC,SAAgB,iBAAiB,MAAkB,MAAwB;AACzE,SAAQ,MAAR;EACE,KAAK,OACH,QAAO,WAAW,KAAK;EACzB,KAAK,MACH,QAAO,UAAU,KAAK;EACxB,KAAK,QACH,QAAO,YAAY,KAAK;EAC1B,QACE,QAAO,cAAc,KAAK;;;;;;;;;;AAWhC,SAAS,cAAc,MAA0B;AAE/C,KAAI,KAAK,UAAU,OAAO,KAAK,YAAY,SACzC,QAAO,KAAK,UAAU,KAAK,SAAS,MAAM,EAAE;AAI9C,KAAI,KAAK,YAAY,aAAa,KAAK,KAAK,EAAE;AAE5C,MAAI,KAAK,YAAY,UAAa,KAAK,YAAY,QAAQ,KAAK,YAAY,GAC1E,QAAO,OAAO,KAAK,YAAY,WAC3B,KAAK,UACL,KAAK,UAAU,KAAK,SAAS,MAAM,EAAE;EAG3C,MAAMA,UAAQ,CAAC,KAAK,MAAM,iBAAiB;AAC3C,MAAI,KAAK,MAAM,aAAa;GAC1B,MAAM,SAAS,oBAAoB,KAAK,KAAK,aAAa,KAAK,KAAK,SAAqB;AACzF,OAAI,OACF,SAAM,KAAK,UAAU,SAAS;;AAGlC,SAAOA,QAAM,KAAK,IAAI;;AAIxB,KAAI,KAAK,YAAY,UAAa,KAAK,YAAY,QAAQ,KAAK,YAAY,GAC1E,QAAO,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,SAAS,MAAM,EAAE;CAIhG,MAAM,QAAQ,CAAC,KAAK,KAAK;AAEzB,KAAI,KAAK,MAAM,KACb,OAAM,KAAK,KAAK,KAAK,KAAe;AAGtC,KAAI,KAAK,kBAAkB,OACzB,OAAM,KAAK,YAAY,KAAK,gBAAgB;AAG9C,KAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,EACxC,OAAM,KAAK,WAAW,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;AAGpE,QAAO,MAAM,KAAK,IAAI;;;;;AAMxB,SAAS,WAAW,MAA0B;AAC5C,QAAO,KAAK,UAAU,MAAM,MAAM,EAAE;;;;;AAMtC,SAAS,UAAU,MAA0B;CAC3C,MAAM,QAAkB,EAAE;AAG1B,KAAI,KAAK,QAAQ;AACf,QAAM,KAAK,QAAQ,KAAK,OAAO;EAE/B,MAAM,UAAU,KAAK;AACrB,MAAI,SAAS,KACX,OAAM,KAAK,QAAQ,QAAQ,OAAO;AAGpC,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;AACnC,SAAO,MAAM,KAAK,KAAK;;AAIzB,KAAI,KAAK,YAAY,aAAa,KAAK,KAAK,EAAE;AAC5C,QAAM,KAAK,cAAc,KAAK,OAAO;AAErC,MAAI,KAAK,MAAM,YACb,OAAM,KAAK,gBAAgB,KAAK,KAAK,YAAY,GAAG;AAItD,MAAI,KAAK,MAAM,aAAa;GAE1B,MAAM,QADS,KAAK,KAAK,YACJ,cAAc,EAAE;GACrC,MAAM,WAAY,KAAK,KAAK,YAAyB,EAAE;AAEvD,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,MAAM,EAAE;IACnD,MAAM,OAAO;IACb,MAAM,QAAQ,SAAS,SAAS,KAAK;IACrC,IAAI,YAAY,SAAS,KAAK,QAAQ,KAAK,QAAQ;AACnD,iBAAa,QAAQ,cAAc;AAEnC,QAAI,KAAK,KACP,cAAa,YAAa,KAAK,KAAkB,KAAK,IAAI;AAE5D,QAAI,KAAK,YAAY,OACnB,cAAa,YAAY,KAAK;AAEhC,UAAM,KAAK,UAAU;;;AAIzB,SAAO,MAAM,KAAK,KAAK;;AAIzB,OAAM,KAAK,QAAQ,KAAK,OAAO;AAE/B,KAAI,KAAK,MAAM,KACb,OAAM,KAAK,QAAQ,KAAK,KAAK,OAAO;AAEtC,KAAI,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,SAAS,EACjF,OAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAGlD,KAAI,KAAK,kBAAkB,OACzB,OAAM,KAAK,YAAY,KAAK,gBAAgB;AAG9C,KAAI,KAAK,SACP,OAAM,KAAK,QAAQ,KAAK,WAAW;AAGrC,KAAI,KAAK,SAAS,OAChB,OAAM,KAAK,QAAQ,KAAK,OAAO;CAIjC,MAAM,WAAW,oBAAoB,KAAK,KAAK;AAC/C,KAAI,OAAO,KAAK,SAAS,CAAC,SAAS,GAAG;EACpC,MAAM,UAAU,OAAO,QAAQ,SAAS,CACrC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,KAAK,UAAU,EAAE,GAAG,CAC5C,KAAK,IAAI;AACZ,QAAM,KAAK,QAAQ,UAAU;;AAI/B,KAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,EACxC,OAAM,KAAK,WAAW,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;AAIpE,KAAI,KAAK,YAAY,UAAa,KAAK,YAAY,QAAQ,KAAK,YAAY,GAC1E,OAAM,KAAK,WAAW,KAAK,UAAU,KAAK,QAAQ,GAAG;AAGvD,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAS,YAAY,MAA0B;CAC7C,MAAM,QAAkB,EAAE;AAG1B,KAAI,KAAK,UAAU,OAAO,KAAK,YAAY,UAAU;AACnD,QAAM,KAAK,gBAAgB,KAAK,KAAK,QAAQ,YAAY,GAAG,GAAG;AAC/D,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,KAAK,UAAU,KAAK,SAAS,MAAM,EAAE,CAAC;AACjD,SAAO,MAAM,KAAK,KAAK;;AAIzB,KAAI,KAAK,YAAY,aAAa,KAAK,KAAK,EAAE;EAC5C,MAAM,aAAa,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI;AACjD,QAAM,KAAK,WAAW,aAAa;AACnC,QAAM,KAAK,WAAW,KAAK,OAAO;AAElC,MAAI,KAAK,MAAM,aAAa;AAC1B,SAAM,KAAK,GAAG;AACd,SAAM,KAAK,eAAe;AAC1B,SAAM,KAAK,KAAK,KAAK,KAAK,cAAc;;AAI1C,MAAI,KAAK,MAAM,aAAa;GAE1B,MAAM,QADS,KAAK,KAAK,YACJ,cAAc,EAAE;GACrC,MAAM,WAAY,KAAK,KAAK,YAAyB,EAAE;AAEvD,OAAI,OAAO,KAAK,MAAM,CAAC,SAAS,GAAG;AACjC,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,cAAc;AACzB,SAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,MAAM,EAAE;KACnD,MAAM,OAAO;KACb,MAAM,QAAQ,SAAS,SAAS,KAAK;KACrC,MAAM,UAAU,IAAI,KAAK,QAAQ,MAAM;KACvC,MAAM,WAAW,QAAQ,eAAe;KACxC,IAAI,OAAO,OAAO,KAAK,GAAG,UAAU,OAAO,GAAG;AAC9C,aAAQ,KAAK,eAAe;AAC5B,aAAQ,IAAI;AACZ,WAAM,KAAK,KAAK;AAEhB,SAAI,KAAK,KACP,OAAM,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC,WAAY,KAAK,KAAkB,KAAK,KAAK,GAAG;AAE9E,SAAI,KAAK,YAAY,OACnB,OAAM,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU;;;;AAM9D,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,cAAc,KAAK,OAAO;AAErC,SAAO,MAAM,KAAK,KAAK;;AAIzB,OAAM,KAAK,KAAK,KAAK;AACrB,OAAM,KAAK,GAAG;AAGd,KAAI,KAAK,MAAM,KACb,OAAM,KAAK,iBAAiB,KAAK,KAAK,OAAO;AAE/C,KAAI,KAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,SAAS,EACjF,OAAM,KAAK,iBAAiB,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG;AAI5D,KAAI,KAAK,kBAAkB,OACzB,OAAM,KAAK,iBAAiB,KAAK,gBAAgB;CAInD,MAAM,WAAW,oBAAoB,KAAK,KAAK;AAC/C,KAAI,OAAO,KAAK,SAAS,CAAC,SAAS,GAAG;AACpC,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,YAAY;AACvB,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,CACjD,OAAM,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC,GAAG,YAAY,MAAM,GAAG;;AAK3D,KAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;AAC3C,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,iBAAiB,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,GAAG;;AAI3E,KAAI,KAAK,YAAY,UAAa,KAAK,YAAY,QAAQ,KAAK,YAAY,IAAI;AAC9E,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,cAAc,KAAK,QAAQ,CAAC;YAC9B,KAAK,kBAAkB,UAAa,KAAK,gBAAgB,GAAG;AACrE,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,gDAAgD;;AAG7D,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAS,YAAY,OAAwB;AAC3C,KAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO,OAAO,MAAM;AACjF,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,KAAK,KAAK;AACjD,QAAO,KAAK,UAAU,MAAM;;AAG9B,SAAS,cAAc,SAA0B;AAC/C,KAAI,OAAO,YAAY,SAErB,QAAO,QACJ,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,OAAO,CAC1B,KAAK,KAAK;AAEf,QAAO,KAAK,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,OAAO"}